Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 12 additions & 78 deletions .github/workflows/kok-prod-CD.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,90 +17,24 @@ jobs:
echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_ENV

- name: Create SSH key file
run: echo "${{ secrets.NCP_KEY }}" > /tmp/NCP_KEY.pem
run: echo "${{ secrets.AWS_KEY }}" > /tmp/AWS_KEY.pem

- name: Set permissions for SSH key file
run: chmod 600 /tmp/NCP_KEY.pem
run: chmod 600 /tmp/AWS_KEY.pem

- name: Upload Compose files & nginx.conf to NCP
- name: Upload Compose files & deploy.sh to AWS
run: |
scp -i /tmp/NCP_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-blue.yml ${{ secrets.NCP_USER }}@${{ secrets.NCP_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/NCP_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-green.yml ${{ secrets.NCP_USER }}@${{ secrets.NCP_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/NCP_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-env.yml ${{ secrets.NCP_USER }}@${{ secrets.NCP_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/NCP_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-nginx.yml ${{ secrets.NCP_USER }}@${{ secrets.NCP_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/AWS_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-blue.yml ${{ secrets.AWS_USER }}@${{ secrets.AWS_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/AWS_KEY.pem -o StrictHostKeyChecking=no infra/docker-compose-green.yml ${{ secrets.AWS_USER }}@${{ secrets.AWS_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}
scp -i /tmp/AWS_KEY.pem -o StrictHostKeyChecking=no infra/deploy.sh ${{ secrets.AWS_USER }}@${{ secrets.AWS_PROD_HOST }}:${{ secrets.COMPOSE_FILE_PATH }}

- name: Deploy to NCP (Blue-Green Auto + DB/Redis Check)
- name: Deploy to AWS via deploy.sh
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.NCP_PROD_HOST }}
username: ${{ secrets.NCP_USER }}
key: ${{ secrets.NCP_KEY }}
host: ${{ secrets.AWS_PROD_HOST }}
username: ${{ secrets.AWS_USER }}
key: ${{ secrets.AWS_KEY }}
script: |
cd ${{ secrets.COMPOSE_FILE_PATH }}

# .env์— ์ตœ์‹  ํƒœ๊ทธ ๊ธฐ๋ก
sed -i '/^KOK_PROD_TAG=/d' .env || true
echo "KOK_PROD_TAG=${{ env.LATEST_TAG }}" >> .env

echo "๐Ÿ” nginx ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ..."
if ! docker compose -f docker-compose-nginx.yml ps | grep -q "Up"; then
echo "๐Ÿš€ nginx ์‹œ์ž‘"
docker compose -f docker-compose-nginx.yml up -d
else
echo "โœ… nginx ์ด๋ฏธ ์‹คํ–‰ ์ค‘"
fi


echo "๐Ÿ” ENV ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ..."
if ! docker compose -f docker-compose-env.yml ps | grep -q "Up"; then
echo "๐Ÿš€ ENV ์‹œ์ž‘"
docker compose -f docker-compose-env.yml up -d
else
echo "โœ… ENV ์ด๋ฏธ ์‹คํ–‰ ์ค‘"
fi

# ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ Blue/Green ํ™•์ธ
CURRENT_ENV=$(grep -o 'proxy_pass http://kok-[a-z]\+' nginx.conf | awk -F/ '{print $3}')
echo "ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ: $CURRENT_ENV"

if [[ "$CURRENT_ENV" == "kok-blue" ]]; then
NEW_ENV="kok-green"
OLD_ENV="kok-blue"
COMPOSE_FILE="docker-compose-green.yml"
NEW_PORT=8082
else
NEW_ENV="kok-blue"
OLD_ENV="kok-green"
COMPOSE_FILE="docker-compose-blue.yml"
NEW_PORT=8081
fi

echo "์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌ: $NEW_ENV"

# ์ƒˆ ํ™˜๊ฒฝ ๋ฐฐํฌ
docker compose -f $COMPOSE_FILE pull
docker compose -f $COMPOSE_FILE up -d

echo "๐Ÿฉบ Health Check (60์ดˆ ๋Œ€๊ธฐ)"
sleep 60
HEALTH=$(curl -s https://prod-api.kokokok.com/v1/api/health)
echo "Health Check ๊ฒฐ๊ณผ: $HEALTH"
CODE=$(echo "$HEALTH" | jq -r '.code')
DATA=$(echo "$HEALTH" | jq -r '.data')

if [[ "$CODE" != "200" || "$DATA" != "OK" ]]; then
echo "โŒ Health Check ์‹คํŒจ (code: $CODE, data: $DATA), ๋กค๋ฐฑ!"
docker compose -f $COMPOSE_FILE stop $NEW_ENV
docker compose -f $COMPOSE_FILE rm -f $NEW_ENV
exit 1
fi

echo "โš™๏ธ nginx.conf ํŠธ๋ž˜ํ”ฝ์„ $NEW_ENV๋กœ ๋ณ€๊ฒฝ"
sed -i "s|proxy_pass http://$OLD_ENV:8080;|proxy_pass http://$NEW_ENV:8080;|" nginx.conf

echo "๐Ÿ”„ Nginx ์„ค์ • reload"
docker restart kok-nginx

echo "๐Ÿงน ์ด์ „ ํ™˜๊ฒฝ($OLD_ENV) ์ •๋ฆฌ"
docker compose -f docker-compose-${OLD_ENV#kok-}.yml stop $OLD_ENV
docker compose -f docker-compose-${OLD_ENV#kok-}.yml rm -f $OLD_ENV
chmod +x deploy.sh
./deploy.sh "${{ env.LATEST_TAG }}"
57 changes: 57 additions & 0 deletions infra/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/bin/bash

LATEST_TAG=$1

# .env ์ตœ์‹  ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ
sed -i '/^KOK_PROD_TAG=/d' .env || true
echo "KOK_PROD_TAG=$LATEST_TAG" >> .env

# ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ Blue/Green ํ™•์ธ
CURRENT_PORT=$(grep -o 'localhost:[0-9]\+' /etc/nginx/conf.d/service-url.inc | awk -F: '{print $2}')

if [ "$CURRENT_PORT" == "8081" ]; then
CURRENT_ENV="kok-blue"
NEW_ENV="kok-green"
NEW_PORT=8082
COMPOSE_FILE="docker-compose-green.yml"
NEW_SERVICE_URL_PATH="/etc/nginx/conf.d/service-url-green.inc"
elif [ "$CURRENT_PORT" == "8082" ]; then
CURRENT_ENV="kok-green"
NEW_ENV="kok-blue"
NEW_PORT=8081
COMPOSE_FILE="docker-compose-blue.yml"
NEW_SERVICE_URL_PATH="/etc/nginx/conf.d/service-url-blue.inc"
else
echo "โŒ ํ˜„์žฌ service-url.inc์— ์•Œ ์ˆ˜ ์—†๋Š” ํฌํŠธ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค: $CURRENT_PORT"
exit 1
fi

echo "ํ˜„์žฌ ํ™˜๊ฒฝ: $CURRENT_ENV โ†’ ์ƒˆ ํ™˜๊ฒฝ: $NEW_ENV"

# ์ƒˆ ํ™˜๊ฒฝ ๋ฐฐํฌ
docker compose -f $COMPOSE_FILE pull
docker compose -f $COMPOSE_FILE up -d

echo "๐Ÿฉบ Health Check (60์ดˆ ๋Œ€๊ธฐ)"
sleep 60
HEALTH=$(curl -s https://prod-api.kokokok.com/v1/api/health)
echo "Health Check ๊ฒฐ๊ณผ: $HEALTH"
CODE=$(echo "$HEALTH" | jq -r '.code')
DATA=$(echo "$HEALTH" | jq -r '.data')

if [[ "$CODE" != "200" || "$DATA" != "OK" ]]; then
echo "โŒ Health Check ์‹คํŒจ (code: $CODE, data: $DATA), ๋กค๋ฐฑ!"
docker compose -f $COMPOSE_FILE stop $NEW_ENV
docker compose -f $COMPOSE_FILE rm -f $NEW_ENV
exit 1
fi

echo "โš™๏ธ service-url.inc ๊ต์ฒด: $NEW_SERVICE_URL_PATH โ†’ /etc/nginx/conf.d/service-url.inc"
sudo cp $NEW_SERVICE_URL_PATH /etc/nginx/conf.d/service-url.inc

echo "๐Ÿ”„ Nginx ์„ค์ • reload"
sudo nginx -t && sudo systemctl reload nginx

echo "๐Ÿงน ์ด์ „ ํ™˜๊ฒฝ($CURRENT_ENV) ์ •๋ฆฌ"
docker compose -f docker-compose-${CURRENT_ENV#kok-}.yml stop $CURRENT_ENV
docker compose -f docker-compose-${CURRENT_ENV#kok-}.yml rm -f $CURRENT_ENV
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
@RequiredArgsConstructor
public class RandomProfileService implements CreateRandomProfileUseCase {

@Value("${ncp.object-storage-url}")
@Value("${aws.object-storage-url}")
private String objectStorageUrl;

private static final List<String> ADJECTIVES = List.of(
Expand Down
2 changes: 1 addition & 1 deletion kok-api/src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ station:
start-idx: 1
end-idx: 1000

ncp:
aws:
object-storage-url: ${OBJECT_STORAGE_URL}
google:
places:
Expand Down
5 changes: 3 additions & 2 deletions kok-api/src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ springdoc:
default-consumes-media-type: application/json;charset=UTF-8
default-produces-media-type: application/json;charset=UTF-8
swagger-ui:
enabled: true
enabled: false
path: /swagger

# open-api: http://data.seoul.go.kr/dataList/OA-21232/S/1/datasetView.do
station:
base-url: http://openapi.seoul.go.kr:8088
Expand All @@ -55,7 +56,7 @@ station:
start-idx: 1
end-idx: 1000

ncp:
aws:
object-storage-url: ${OBJECT_STORAGE_URL}
google:
places:
Expand Down
Loading