[Rust] cargo 사설 저장소 만들기
crates io의 아쉬운 점 중 하나는, private crate 기능을 제공하지 않는다는 것이다.
npm이 유료 플랜을 기반으로 private 패키지 기능을 제공하는 것과 대조적이다.
그래서 crates io에다가 체계적으로 크레이트를 쌓고 싶은데 비공개로 관리를 해야한다면, 직접 사설 서버를 구축해서 사용해야 한다.
하루빨리 github package에서 지원해주기를 소망한다...
crates 서버 구축하기
우선, 리눅스가 필요하다. 윈도우즈는 잘 지원이 되지 않는다.
내 경우에는 EC2 Ubuntu 20을 사용했다.
crates 레포지토리를 먼저 클론받는다.
git clone https://github.com/rust-lang/crates.io.git
꽤 크다.
백엔드와 프론트 소스가 다 섞여있다.
그리고 또 별도로 필요한 종속성들은 이렇다.
sudo apt-get gcc install pkg-config libssl-dev make
깔아주자.
백엔드 구축
먼저 디비로 Postgres를 깔아준다.
sudo apt-get install postgresql postgresql-contrib libpq-dev
sudo service postgresql start
됐으면 계정과 스키마를 추가해주고, 패스워드 깔고, 권한도 이어주자.
sudo -u postgres psql
create user myyrakle;
create database myyrakle;
ALTER USER myyrakle WITH PASSWORD '패스워드';
GRANT ALL PRIVILEGES ON DATABASE myyrakle TO myyrakle;

아마 기본 설정으로는 패스워드 접속이 안될 것이다.
설정파일에 들어가 암호화 방식을 md5로 바꿔준다.
sudo vim /etc/postgresql/14/main/pg_hba.conf

그리고 재시작해서 동작을 확인한다.

그다음엔 crates에서 쓰는 orm인 디젤을 깔아준다.
cargo install diesel_cli --no-default-features --features postgres --version ^1 --force
2버전에서 호환성이 깨져서 1 버전을 받아야 한다.
그다음엔 서버에서 db에 접근이 가능하도록 접근정보를 넣어줘야 한다.
환경변수 sample 파일 복사해서 databade_url과 test_database_url을 채워준다.
cp ./.env.sample ./.env
vim ./.env


postgres://myyrakle:[password]@[localhost]:[5432]/[database_name]
디젤을 돌려서 마이그레이션을 수행한다.
diesel migration run

그 다음엔 로컬인덱스란걸 초기화해준다.
./script/init-local-index.sh
이건 뭔지 잘 모르겠다.
그럼 이제 실행만 하면 된다.

백그라운드로 돌리고 싶다면 이렇게 넣어주자

프론트엔드 구축
프론트엔드는 nodejs와 npm, pnpm이 필요하다.
sudo apt-get install nodejs npm -y
sudo npm install -g pnpm

그리고 실행해주면 되는데
노드 버전이 낮으면 pnpm이 안돌기도 한다.
그럼 이렇게 올려준다.
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
종속성 받고

다시 실행해주면 된다.

그럼 이렇게 접속이 가능해질 것이다.


Github 로그인 연동
crates는 로그인 방식이 github 뿐이라서 인증을 사용하려면 연동을 따로 해줘야 한다.
깃헙 개발자세팅 -> Oauth로 가서, 앱 등록을 해준다.
이런식으로 넣어주면 된다.
그리고 만들어지는 클라이언트 ID와, 시크릿을 새로 만들어서
서버 env에 넣어준다.
그럼 이렇게 연동이 될 것이다.
사설 서버 사용하기
프로젝트나 전역 경로에 .cargo/config.toml 파일을 만들어서 url을 집어넣는다.
[registries]
my-registry = { index = "http://...:8080/git/index" }

그리고 땡겨쓸때는 이렇게 위에서 등록한 레지스트리명을 써주면 끝이다.

참조
https://doc.rust-lang.org/cargo/reference/registries.html
https://www.reddit.com/r/rust/comments/l0bcmz/whats_the_best_way_to_run_a_private_cargo_registry/
https://github.com/caeg-industries/crates.io-terraform
https://github.com/rust-lang/crates.io
https://github.com/rust-lang/crates.io/blob/master/docs/CONTRIBUTING.md