Skip to content

Commit 377cb3a

Browse files
authored
Merge pull request #75 from gsainfoteam/qa
Deploy prod-v1.0.0
2 parents d151343 + b0d0807 commit 377cb3a

File tree

157 files changed

+7432
-1248
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+7432
-1248
lines changed

.github/workflows/deploy.yml

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -63,31 +63,56 @@ jobs:
6363
if [[ ${{ github.ref_name }} == dev-* ]]; then
6464
echo "ENVIRONMENT=dev" >> $GITHUB_ENV
6565
echo "COMPOSE_FILE=docker-compose-dev.yml" >> $GITHUB_ENV
66-
echo "SERVER_HOST=${{ secrets.DEV_SERVER_HOST }}" >> $GITHUB_ENV
67-
echo "SERVER_USER=${{ secrets.DEV_SERVER_USER }}" >> $GITHUB_ENV
68-
echo "DEPLOY_PATH=${{ secrets.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
66+
echo "NGINX_FILE=nginx-dev.conf" >> $GITHUB_ENV
67+
echo "SERVER_HOST=${{ vars.DEV_SERVER_HOST }}" >> $GITHUB_ENV
68+
echo "SERVER_USER=${{ vars.DEV_SERVER_USER }}" >> $GITHUB_ENV
69+
echo "DEPLOY_PATH=${{ vars.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
6970
else
7071
echo "ENVIRONMENT=prod" >> $GITHUB_ENV
7172
echo "COMPOSE_FILE=docker-compose-prod.yml" >> $GITHUB_ENV
72-
echo "SERVER_HOST=${{ secrets.PROD_SERVER_HOST }}" >> $GITHUB_ENV
73-
echo "SERVER_USER=${{ secrets.PROD_SERVER_USER }}" >> $GITHUB_ENV
74-
echo "DEPLOY_PATH=${{ secrets.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
73+
echo "NGINX_FILE=nginx-prod.conf" >> $GITHUB_ENV
74+
echo "SERVER_HOST=${{ vars.PROD_SERVER_HOST }}" >> $GITHUB_ENV
75+
echo "SERVER_USER=${{ vars.PROD_SERVER_USER }}" >> $GITHUB_ENV
76+
echo "DEPLOY_PATH=${{ vars.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
7577
fi
7678
77-
- name: Setup SSH key
78-
run: |
79-
mkdir -p ~/.ssh
80-
if [[ ${{ github.ref_name }} == dev-* ]]; then
81-
echo "${{ secrets.DEV_SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
82-
else
83-
echo "${{ secrets.PROD_SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
84-
fi
85-
chmod 600 ~/.ssh/id_rsa
86-
ssh-keyscan -H $SERVER_HOST >> ~/.ssh/known_hosts
87-
8879
- name: Copy docker-compose file to server
89-
run: |
90-
scp -i ~/.ssh/id_rsa deploy/$COMPOSE_FILE $SERVER_USER@$SERVER_HOST:$DEPLOY_PATH/docker-compose.yml
80+
uses: appleboy/[email protected]
81+
with:
82+
host: ${{ env.SERVER_HOST }}
83+
username: ${{ env.SERVER_USER }}
84+
key: ${{ startsWith(github.ref_name, 'dev-') && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
85+
source: "deploy/${{ env.COMPOSE_FILE }}"
86+
target: ${{ env.DEPLOY_PATH }}
87+
88+
- name: Copy nginx.conf file to server
89+
uses: appleboy/[email protected]
90+
with:
91+
host: ${{ env.SERVER_HOST }}
92+
username: ${{ env.SERVER_USER }}
93+
key: ${{ startsWith(github.ref_name, 'dev-') && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
94+
source: "deploy/${{ env.NGINX_FILE }}"
95+
target: ${{ env.DEPLOY_PATH }}
96+
97+
- name: Rename docker-compose file on server
98+
uses: appleboy/[email protected]
99+
with:
100+
host: ${{ env.SERVER_HOST }}
101+
username: ${{ env.SERVER_USER }}
102+
key: ${{ startsWith(github.ref_name, 'dev-') && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
103+
script: |
104+
cd ${{ env.DEPLOY_PATH }}
105+
mv deploy/${{ env.COMPOSE_FILE }} ./docker-compose.yml
106+
107+
- name: Rename nginx.conf file on server
108+
uses: appleboy/[email protected]
109+
with:
110+
host: ${{ env.SERVER_HOST }}
111+
username: ${{ env.SERVER_USER }}
112+
key: ${{ startsWith(github.ref_name, 'dev-') && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
113+
script: |
114+
cd ${{ env.DEPLOY_PATH }}
115+
mv deploy/${{ env.NGINX_FILE }} ./nginx.conf
91116
92117
- name: Output server status
93118
id: server-info
@@ -103,14 +128,14 @@ jobs:
103128
run: |
104129
if [[ ${{ github.ref_name }} == dev-* ]]; then
105130
echo "ENVIRONMENT=dev" >> $GITHUB_ENV
106-
echo "SERVER_HOST=${{ secrets.DEV_SERVER_HOST }}" >> $GITHUB_ENV
107-
echo "SERVER_USER=${{ secrets.DEV_SERVER_USER }}" >> $GITHUB_ENV
108-
echo "DEPLOY_PATH=${{ secrets.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
131+
echo "SERVER_HOST=${{ vars.DEV_SERVER_HOST }}" >> $GITHUB_ENV
132+
echo "SERVER_USER=${{ vars.DEV_SERVER_USER }}" >> $GITHUB_ENV
133+
echo "DEPLOY_PATH=${{ vars.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
109134
else
110135
echo "ENVIRONMENT=prod" >> $GITHUB_ENV
111-
echo "SERVER_HOST=${{ secrets.PROD_SERVER_HOST }}" >> $GITHUB_ENV
112-
echo "SERVER_USER=${{ secrets.PROD_SERVER_USER }}" >> $GITHUB_ENV
113-
echo "DEPLOY_PATH=${{ secrets.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
136+
echo "SERVER_HOST=${{ vars.PROD_SERVER_HOST }}" >> $GITHUB_ENV
137+
echo "SERVER_USER=${{ vars.PROD_SERVER_USER }}" >> $GITHUB_ENV
138+
echo "DEPLOY_PATH=${{ vars.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
114139
fi
115140
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
116141
echo "IMAGE_URI=${{ needs.build-and-push.outputs.image-uri }}" >> $GITHUB_ENV
@@ -126,45 +151,32 @@ jobs:
126151
id: login-ecr
127152
uses: aws-actions/amazon-ecr-login@v2
128153

129-
- name: Setup SSH key
130-
run: |
131-
mkdir -p ~/.ssh
132-
if [[ ${{ github.ref_name }} == dev-* ]]; then
133-
echo "${{ secrets.DEV_SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
134-
else
135-
echo "${{ secrets.PROD_SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
136-
fi
137-
chmod 600 ~/.ssh/id_rsa
138-
ssh-keyscan -H $SERVER_HOST >> ~/.ssh/known_hosts
139-
140154
- name: Deploy to server
141-
run: |
142-
ssh -i ~/.ssh/id_rsa $SERVER_USER@$SERVER_HOST << 'EOF'
155+
uses: appleboy/[email protected]
156+
with:
157+
host: ${{ env.SERVER_HOST }}
158+
username: ${{ env.SERVER_USER }}
159+
key: ${{ startsWith(github.ref_name, 'dev-') && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
160+
script: |
143161
cd ${{ env.DEPLOY_PATH }}
144162
145163
# AWS CLI 설정 (서버에 AWS CLI가 설치되어 있다고 가정)
146-
aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }}
164+
aws ecr get-login-password --region ${{ env.AWS_REGION }} | sudo docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }}
147165
148166
# 새 이미지 pull (서비스 실행 중에 미리 받아두기)
149-
docker pull ${{ env.IMAGE_URI }}
167+
sudo docker pull ${{ env.IMAGE_URI }}
150168
151169
# 현재 latest 이미지를 previous로 백업
152-
docker tag potg-backend:latest potg-backend:previous || true
170+
sudo docker tag potg-backend:latest potg-backend:previous || true
153171
154172
# potg-backend 서비스만 중지 (다운타임 시작)
155-
docker-compose stop potg-backend
173+
sudo docker compose stop potg-backend
156174
157175
# 기존 latest 이미지 삭제
158-
docker rmi potg-backend:latest || true
176+
sudo docker rmi potg-backend:latest || true
159177
160178
# 새 이미지를 latest로 태그 (로컬 이름으로)
161-
docker tag ${{ env.IMAGE_URI }} potg-backend:latest
179+
sudo docker tag ${{ env.IMAGE_URI }} potg-backend:latest
162180
163181
# potg-backend 서비스만 시작 (다운타임 종료)
164-
docker-compose up -d potg-backend
165-
EOF
166-
167-
- name: Cleanup SSH key
168-
if: always()
169-
run: |
170-
rm -f ~/.ssh/id_rsa
182+
sudo docker compose up -d potg-backend

.github/workflows/rollback.yml

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,13 @@ jobs:
2727
- name: Set environment variables
2828
run: |
2929
if [[ "${{ github.event.inputs.environment }}" == "dev" ]]; then
30-
echo "SERVER_HOST=${{ secrets.DEV_SERVER_HOST }}" >> $GITHUB_ENV
31-
echo "SERVER_USER=${{ secrets.DEV_SERVER_USER }}" >> $GITHUB_ENV
32-
echo "SERVER_SSH_KEY=${{ secrets.DEV_SERVER_SSH_KEY }}" >> $GITHUB_ENV
33-
echo "DEPLOY_PATH=${{ secrets.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
30+
echo "SERVER_HOST=${{ vars.DEV_SERVER_HOST }}" >> $GITHUB_ENV
31+
echo "SERVER_USER=${{ vars.DEV_SERVER_USER }}" >> $GITHUB_ENV
32+
echo "DEPLOY_PATH=${{ vars.DEV_DEPLOY_PATH }}" >> $GITHUB_ENV
3433
else
35-
echo "SERVER_HOST=${{ secrets.PROD_SERVER_HOST }}" >> $GITHUB_ENV
36-
echo "SERVER_USER=${{ secrets.PROD_SERVER_USER }}" >> $GITHUB_ENV
37-
echo "SERVER_SSH_KEY=${{ secrets.PROD_SERVER_SSH_KEY }}" >> $GITHUB_ENV
38-
echo "DEPLOY_PATH=${{ secrets.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
34+
echo "SERVER_HOST=${{ vars.PROD_SERVER_HOST }}" >> $GITHUB_ENV
35+
echo "SERVER_USER=${{ vars.PROD_SERVER_USER }}" >> $GITHUB_ENV
36+
echo "DEPLOY_PATH=${{ vars.PROD_DEPLOY_PATH }}" >> $GITHUB_ENV
3937
fi
4038
echo "ROLLBACK_TAG=${{ github.event.inputs.rollback_tag }}" >> $GITHUB_ENV
4139
@@ -52,12 +50,6 @@ jobs:
5250
id: login-ecr
5351
uses: aws-actions/amazon-ecr-login@v2
5452

55-
- name: Setup SSH key
56-
run: |
57-
mkdir -p ~/.ssh
58-
echo "$SERVER_SSH_KEY" > ~/.ssh/id_rsa
59-
chmod 600 ~/.ssh/id_rsa
60-
ssh-keyscan -H $SERVER_HOST >> ~/.ssh/known_hosts
6153

6254
- name: Validate rollback tag format
6355
if: github.event.inputs.rollback_tag != ''
@@ -75,15 +67,19 @@ jobs:
7567
7668
- name: Rollback to previous version (no tag specified)
7769
if: github.event.inputs.rollback_tag == ''
78-
run: |
79-
ssh -i ~/.ssh/id_rsa $SERVER_USER@$SERVER_HOST << 'EOF'
70+
uses: appleboy/[email protected]
71+
with:
72+
host: ${{ env.SERVER_HOST }}
73+
username: ${{ env.SERVER_USER }}
74+
key: ${{ github.event.inputs.environment == 'dev' && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
75+
script: |
8076
cd ${{ env.DEPLOY_PATH }}
8177
8278
echo "Rolling back to previous version..."
8379
8480
# 현재 실행 중인 이미지 정보 로깅
8581
echo "Current image info:"
86-
docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
82+
sudo docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
8783
8884
# previous 이미지 존재 확인
8985
if ! docker images potg-backend:previous --format "{{.Repository}}" | grep -q potg-backend; then
@@ -92,71 +88,69 @@ jobs:
9288
fi
9389
9490
# potg-backend 서비스 중지
95-
docker-compose stop potg-backend
91+
sudo docker compose stop potg-backend
9692
9793
# 현재 latest 이미지 삭제
98-
docker rmi potg-backend:latest || true
94+
sudo docker rmi potg-backend:latest || true
9995
10096
# previous 이미지를 latest로 태그
101-
docker tag potg-backend:previous potg-backend:latest
97+
sudo docker tag potg-backend:previous potg-backend:latest
10298
10399
# 서비스 재시작
104-
docker-compose up -d potg-backend
100+
sudo docker compose up -d potg-backend
105101
106102
echo "Rollback completed successfully!"
107103
108104
# 롤백 후 이미지 정보 로깅
109105
echo "After rollback image info:"
110-
docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
111-
EOF
106+
sudo docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
112107
113108
- name: Rollback to specific version (tag specified)
114109
if: github.event.inputs.rollback_tag != ''
115-
run: |
116-
ssh -i ~/.ssh/id_rsa $SERVER_USER@$SERVER_HOST << 'EOF'
110+
uses: appleboy/[email protected]
111+
with:
112+
host: ${{ env.SERVER_HOST }}
113+
username: ${{ env.SERVER_USER }}
114+
key: ${{ github.event.inputs.environment == 'dev' && secrets.DEV_SERVER_SSH_KEY || secrets.PROD_SERVER_SSH_KEY }}
115+
script: |
117116
cd ${{ env.DEPLOY_PATH }}
118117
119118
echo "Rolling back to specific version: ${{ env.ROLLBACK_TAG }}"
120119
121120
# AWS CLI 설정
122-
aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }}
121+
aws ecr get-login-password --region ${{ env.AWS_REGION }} | sudo docker login --username AWS --password-stdin ${{ steps.login-ecr.outputs.registry }}
123122
124123
# 현재 실행 중인 이미지 정보 로깅
125124
echo "Current image info:"
126-
docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
125+
sudo docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
127126
128127
# potg-backend 서비스 중지
129-
docker-compose stop potg-backend
128+
sudo docker compose stop potg-backend
130129
131130
# 현재 latest를 previous로 백업
132-
docker tag potg-backend:latest potg-backend:previous || true
131+
sudo docker tag potg-backend:latest potg-backend:previous || true
133132
134133
# 현재 latest 이미지 삭제
135-
docker rmi potg-backend:latest || true
134+
sudo docker rmi potg-backend:latest || true
136135
137136
# 지정된 태그 이미지 pull
138-
if ! docker pull ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ env.ROLLBACK_TAG }}; then
137+
if ! sudo docker pull ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ env.ROLLBACK_TAG }}; then
139138
echo "Error: Failed to pull image with tag ${{ env.ROLLBACK_TAG }}"
140139
# 백업에서 복원
141-
docker tag potg-backend:previous potg-backend:latest
142-
docker-compose up -d potg-backend
140+
sudo docker tag potg-backend:previous potg-backend:latest
141+
sudo docker compose up -d potg-backend
143142
exit 1
144143
fi
145144
146145
# 새 이미지를 latest로 태그
147-
docker tag ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ env.ROLLBACK_TAG }} potg-backend:latest
146+
sudo docker tag ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ env.ROLLBACK_TAG }} potg-backend:latest
148147
149148
# 서비스 재시작
150-
docker-compose up -d potg-backend
149+
sudo docker compose up -d potg-backend
151150
152151
echo "Rollback to ${{ env.ROLLBACK_TAG }} completed successfully!"
153152
154153
# 롤백 후 이미지 정보 로깅
155154
echo "After rollback image info:"
156-
docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
157-
EOF
155+
sudo docker images potg-backend:latest --format "table {{.Repository}}:{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}"
158156
159-
- name: Cleanup SSH key
160-
if: always()
161-
run: |
162-
rm -f ~/.ssh/id_rsa

.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bun 1.2.22

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ RUN npm run build
1212

1313
FROM node:20-alpine AS production
1414

15+
RUN apk add --no-cache tzdata
16+
1517
WORKDIR /app
1618

1719
RUN addgroup -g 1001 -S nodejs

0 commit comments

Comments
 (0)