Deployments(배포/배치) : 개발된 소프트웨어나 서비스, 혹은 자원을 실제 사용 가능한 상태로 환경에 배치하는 것을 뜻
==> 우리가 할 건 깃허브에 폴더 올리기 + 빌드/디플로이 실패 로그를 보며 소스를 수정하고 다시 깃헙에 푸시하기
지금 난 client 와 server 를 각각 관리하고 있다.
깃허브에는 이 server 폴더만 올리면 된다.
이 레포지토리를 만들었다.
혹시 몰라 private 로 해주었다.
그러면 Git 의 기본 명령어를 활용하여 폴더를 올려준다.
개인적으로 난 이렇게 했지만 상황에 따라 다르게 해준다.
# 1. 연결되어 있는 원격 저장소 확인
git remote -v
# 2. 기존 연결 지우기 (옵션: 새로 연결하고 싶을 때만)
# -v는 붙이지 않습니다.
git remote remove origin
# 3. 새로운 원격 저장소 연결
git remote add origin [저장소-주소]
# 4. 상태 확인 및 초기화 (필요한 경우에만)
git status
# 만약 아예 새로 시작하고 싶다면 git init (주의: 기존 기록 다 날아감)
# 5. 변경사항 스테이징 및 커밋
git add .
git commit -m "buddi server"
# 6. 브랜치 이름 확인
git branch -M main
# 7. 푸시
# 처음 푸시할 때는 -u를 써주면 다음부터는 git push만 해도 됩니다.
git push -u origin main
# 기타 (로컬 파일로 덮어 씌우기)
git push -f origin main
이렇게 해주면 깃헙에 잘 올라간 것을 볼 수 있다.
그리고 이제 railway 에서 자동으로 빌드해준다. 아래와 같이 실패한 것이 좀 많다.
동일 내용을 깃헙에서도 확인이 가능하다. 총 14번의 배포 시도가 있었다.
가장 헤맸던 것이 dist/src/main.js 를 찾을 수 없다. 는 메시지였다. 여기서 몇시간은 잡아먹었다.
변경사항을 천천히 정리해보겠다.
일단, 빌드 상황에서 아래와 같은 에러가 뜨길래 compilerOptions 를 바꿔줘야 하나 싶어서 초반에 여러 수정을 했었다.
(이는 로컬에도 개발했을 때 종종 뜨던 에러라 알기가 쉬웠다.)
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
그래서 commonjs 에서 esnext 로 바꿔주었다.
근데 또 떴다... 흠
다시 esnest 에서 NodeNest 로 변경해주었는데, 빌드까진 문제 없이 잘 돌아갔다.
배포를 하는 도중 계속 dist/main.js 가 뜨길래, 경로를 확인하니
npm run build
ls -R dist
main.js 가 dist 경로가 아닌 src 밑에 있었기에 수정해주었는데 또 똑같은 에러가 떴다.
그래서 상대경로가 아닌 절대결로 바꿔보기도 하고 dockfile을 추가하여 빌드해보기도 했지만, 전혀 해결할 수 없었다.
# DockerFile
# 1. 노드 버전 설정
FROM node:22.22.1-slim
# 2. 작업 디렉토리
WORKDIR /app
# 3. 의존성 설치 (캐싱 활용)
COPY package*.json ./
RUN npm install
# 4. 소스 복사 및 빌드
COPY . .
RUN npm run build
# 5. [핵심] 파일 위치를 확인하고 실행
# dist/src/main.js 에 있으면 그걸 실행하고, 없으면 dist/main.js를 실행합니다.
CMD if [ -f "dist/src/main.js" ]; then node dist/src/main.js; else node dist/main.js; fi
그래서, 개발환경과 다른 모듈을 재설정했다는 것이 문제가 아니었을까? 하는 생각에
다시 초기상태로 복구해주었고,
expo 가 서버에선 필요가 없어 제거했고, exclude 에 dist 를 넣어 주었다.
그랬더니 문제없이 잘 돌아갔고, supabseUrl 을 못 찾겠다는 메시지가 나와서 railway 환경변수에 .env 파일에 있던 변수들을 모두 직접 넣어주었다.
아래와 같이 Online 으로 잘 뜨면 된 것이다.
Settings 에 가서 도메인을 복사해준다.
클라이언트에선 axios url 을 다음과 같이 바꾸어주었다. (android에서만 쓸거라서 해당 부분만 변경)
2. 검색하다보면 Table 생성을 많이 테스트하던데 이미 프로젝트에서 각 모듈의 엔티티를 작성했고, TypeOrm 의 역할로 자동으로 생성될 것이니 생략한다.
3. DB URL 을 찾아준다. 이거 찾느라 좀 시간이 걸렸다.
상단바에 Connect 클릭, ORMs 클릭한다.
# Connect to Supabase via connection pooling
DATABASE_URL="postgresql://postgres.***:[YOUR-PASSWORD]@aws-1-ap-southeast-2.pooler.supabase.com:6543/postgres?pgbouncer=true"
이러한 형태로 나와있을 것이다. 여기서 PASSWORD 는 Supabase 의 비밀번호다.
4. 이제 프로젝트에 연결해준다. .env 파일로 가자
... 기존 ...
...
DATABASE_URL=postgresql://postgres.sm ...