diff --git a/.github/workflows/cd-workflow.yml b/.github/workflows/cd-workflow.yml index f79fa9c..b37d332 100644 --- a/.github/workflows/cd-workflow.yml +++ b/.github/workflows/cd-workflow.yml @@ -68,13 +68,13 @@ jobs: --port 22 \ --cidr ${{ steps.ip.outputs.ipv4 }}/32 - - name: โœ‰๏ธ Send docker-compose.yml + - name: โœ‰๏ธ Send docker-compose.yml & deploy.sh uses: appleboy/scp-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_KEY }} - source: "./docker-compose.yml" + source: "./docker-compose.yml, ./deploy.sh" target: "/home/ec2-user/findyou/" - name: ๐Ÿš€ deploy to server @@ -89,16 +89,11 @@ jobs: echo "๐Ÿ—‚๏ธ Change Directory to EC2 Root" cd /home/ec2-user/findyou - echo "โœ‹๐ŸปStopping existing container and Cleaning up old images" - sudo docker compose down --rmi all + echo "๐Ÿ‘‰๐Ÿป Grant Permission to deploy.sh" + chmod +x ./deploy.sh - sudo docker ps -a - - echo "๐Ÿฅณ Pulling new image" - sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE }} - - echo "๐ŸŒฑ Starting new container" - sudo docker compose up -d + echo "โœ‹๐Ÿป Stopping Existing Container and Deploy New Container" + ./deploy.sh - name: โŒ Remove GitHub Actions IP run: | diff --git a/build.gradle b/build.gradle index b2141b6..c3e223c 100644 --- a/build.gradle +++ b/build.gradle @@ -78,6 +78,9 @@ dependencies { // Security implementation("org.springframework.boot:spring-boot-starter-security") testImplementation("org.springframework.security:spring-security-test") + + // Actuator + implementation 'org.springframework.boot:spring-boot-starter-actuator' } tasks.named('test') { diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..662502e --- /dev/null +++ b/deploy.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +IS_BLUE_RUNNING=$(docker ps | grep findyou_blue) +export NGINX_CONF="/etc/nginx/nginx.conf" + +# blue ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด green ์„ up +if [ -n "$IS_BLUE_RUNNING" ]; then + echo "### BLUE => GREEN ####" + + # ์ตœ์‹  ์ด๋ฏธ์ง€ ๊ฐ•์ œ ๊ฐ€์ ธ์˜ค๊ธฐ + echo ">>> ์ตœ์‹  green ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ" + docker compose pull findyou_green + + echo ">>> green ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (๊ธฐ์กด ์ด๋ฏธ์ง€ ๋ฌด์‹œ)" + docker compose up -d --force-recreate findyou_green + sleep 7 + + echo ">>> health check ์ง„ํ–‰..." + while true; do + RESPONSE=$(curl http://localhost:9002/actuator/health | grep UP) + if [ -n "$RESPONSE" ]; then + echo ">>> green health check ์„ฑ๊ณต! " + break; + fi + sleep 3 + done; + + echo ">>> Nginx ์„ค์ • ๋ณ€๊ฒฝ (green)" + sudo sed -i 's/set $ACTIVE_APP findyou_blue;/set $ACTIVE_APP findyou_green;/' $NGINX_CONF + sudo nginx -s reload + + echo ">>> blue ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ" + docker compose stop findyou_blue + +# green ์ด ์‹คํ–‰ ์ค‘์ด๋ฉด blue ๋ฅผ up +else + echo "### GREEN => BLUE ####" + + # ์ตœ์‹  ์ด๋ฏธ์ง€ ๊ฐ•์ œ ๊ฐ€์ ธ์˜ค๊ธฐ + echo ">>> ์ตœ์‹  blue ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ" + docker compose pull findyou_blue + + echo ">>> blue ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (๊ธฐ์กด ์ด๋ฏธ์ง€ ๋ฌด์‹œ)" + docker compose up -d --force-recreate findyou_blue + sleep 7 + + echo ">>> health check ์ง„ํ–‰..." + while true; do + RESPONSE=$(curl http://localhost:9001/actuator/health | grep UP) + if [ -n "$RESPONSE" ]; then + echo ">>> blue health check ์„ฑ๊ณต! " + break; + fi + sleep 3 + done; + + echo ">>> Nginx ์„ค์ • ๋ณ€๊ฒฝ (blue)" + sudo sed -i 's/set $ACTIVE_APP findyou_green;/set $ACTIVE_APP findyou_blue;/' $NGINX_CONF + sudo nginx -s reload + + echo ">>> green ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ" + docker compose stop findyou_green +fi + +echo ">>> ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค ์ •๋ฆฌ" +docker container prune -f + +echo ">>> ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋“ค ์ •๋ฆฌ" +docker image prune -a -f # ๋ชจ๋“  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ์‚ญ์ œ + + diff --git a/docker-compose.yml b/docker-compose.yml index b747a5e..f770cac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,5 @@ services: - findyou: + findyou_blue: image: ksg1227/findyou:latest env_file: - .env @@ -12,6 +12,27 @@ services: - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - SERVICE_KEY=${SERVICE_KEY} + - CACHE_ENDPOINT=${CACHE_ENDPOINT} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} + - TZ=Asia/Seoul + volumes: + - ${LOG_DIRECTORY}:/logs + + findyou_green: + image: ksg1227/findyou:latest + env_file: + - .env + ports: + - "9002:9001" + environment: + - DEV_DATASOURCE_URL=${DEV_DATASOURCE_URL} + - DEV_DATASOURCE_USERNAME=${DEV_DATASOURCE_USERNAME} + - DEV_DATASOURCE_PASSWORD=${DEV_DATASOURCE_PASSWORD} + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - SERVICE_KEY=${SERVICE_KEY} + - CACHE_ENDPOINT=${CACHE_ENDPOINT} + - JWT_SECRET_KEY=${JWT_SECRET_KEY} - TZ=Asia/Seoul volumes: - ${LOG_DIRECTORY}:/logs \ No newline at end of file diff --git a/src/main/java/com/kuit/findyou/global/config/SecurityConfig.java b/src/main/java/com/kuit/findyou/global/config/SecurityConfig.java index 0810b66..cd36293 100644 --- a/src/main/java/com/kuit/findyou/global/config/SecurityConfig.java +++ b/src/main/java/com/kuit/findyou/global/config/SecurityConfig.java @@ -30,7 +30,7 @@ public class SecurityConfig { private static final String[] PERMIT_URL = { LOGIN_ENDPOINT.getValue(), "api/v1/auth/signup", "/swagger-ui/**", "/api-docs", "/swagger-ui-custom.html", - "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html", "/swagger-ui/index.html" + "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html", "/swagger-ui/index.html", "/actuator/health" }; @Bean diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3eecf40..97fc1ab 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,6 +12,11 @@ spring: web: resources: add-mappings: false +management: + endpoints: + web: + exposure: + include: "health, info" --- # ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” DB spring: