Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

로컬에서 도커 환경 구성을 위한 셋업 진행 #5

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
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
8 changes: 4 additions & 4 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Docker Image CD

on:
push:
branches: [ 'dev' ]
branches: ['dev']

jobs:
build:
Expand Down Expand Up @@ -34,10 +34,10 @@ jobs:

- name: Check file changes
run: |

CLIENT_FILE_CHANGED=$(git diff --quiet ${{ github.event.before }} HEAD client && echo 'false' || echo 'true')
SERVER_FILE_CHANGED=$(git diff --quiet ${{ github.event.before }} HEAD server && echo 'false' || echo 'true')

if [ "$CLIENT_FILE_CHANGED" == 'false' ] && [ "$SERVER_FILE_CHANGED" == 'false' ]; then
echo "CLIENT_FILE_CHANGED=true" > $GITHUB_ENV
echo "SERVER_FILE_CHANGED=true" >> $GITHUB_ENV
Expand All @@ -53,7 +53,7 @@ jobs:
docker build -f server/Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/inear-server:${{ github.sha }} ./
docker tag ${{ secrets.DOCKER_USERNAME }}/inear-server:${{ github.sha }} ${{ secrets.DOCKER_USERNAME }}/inear-server:latest
fi

# 서버 이미지 푸시 (Docker Hub 또는 다른 레지스트리)
- name: Push server image to Docker Hub
run: |
Expand Down
114 changes: 114 additions & 0 deletions .github/workflows/scripts/backend-deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#!/bin/bash

# healthy 상태 대기
waiting() {
while true; do
health_status_server=$(docker inspect --format '{{.State.Health.Status}}' server-$1)

if [ "$health_status_server" != "starting" ]; then
echo "$health_status_server"
return 0
fi

sleep 5
done
}

# nginx 설정 업데이트 및 리로드 함수
update_and_reload_nginx() {
local target=$1
NGINX_CONFIG="nginx/conf.d/default.conf"

BACK_END_BLUE="server-blue:3000"
BACK_END_GREEN="server-green:3000"
echo "Updating nginx configuration for $target environment..."

# 파일 업데이트
echo $target
# 리눅스 방식
# if [ "$target" == "green" ]; then
# docker exec nginx sh -c "sed -i 's|server server-.*;|server $BACK_END_GREEN;|g' /etc/nginx/conf.d/default.conf"
# else
# docker exec nginx sh -c "sed -i 's|server server-.*;|server $BACK_END_BLUE;|g' /etc/nginx/conf.d/default.conf"
# fi

if [ "$target" == "green" ]; then
# MacOS 방식
sed -i '' "s|server server-.*;|server $BACK_END_GREEN;|g" "$NGINX_CONFIG"
else
sed -i '' "s|server server-.*;|server $BACK_END_BLUE;|g" "$NGINX_CONFIG"
fi

# nginx 컨테이너 재시작
echo "Restarting nginx to apply new configuration..."
docker exec nginx nginx -s reload

# 설정이 제대로 적용되었는지 확인
sleep 2
docker exec nginx nginx -t
}

# Blue에서 Green으로 전환
switch_to_green() {
echo "Deploying Green environment..."

cd ../../../

# Green 환경 시작
docker compose -f docker-compose-green.yml up -d

health_status_server=$(waiting "green")
echo $health_status_server
if [ "$health_status_server" == "healthy" ]; then
echo "Green server is healthy. Stopping and removing..."
# nginx 설정 업데이트 및 리로드
update_and_reload_nginx "green"

echo "Stopping Blue server..."
if docker ps -q --filter name=server-blue > /dev/null; then
docker stop server-blue
docker rm server-blue
fi
else
echo "Green server is not Healthy"
docker stop server-green
docker rm server-green
fi
}
# Green에서 Blue로 전환
switch_to_blue() {
echo "Deploying Blue environment..."

cd ../../../

# Blue 환경 시작
docker compose -f docker-compose-blue.yml up -d

health_status_server=$(waiting "blue")
echo $health_status_server
if [ "$health_status_server" == "healthy" ]; then
echo "Blue server is healthy. Stopping and removing..."

# nginx 설정 업데이트 및 리로드
update_and_reload_nginx "blue"

echo "Stopping Green server..."
if docker ps -q --filter name=server-green > /dev/null; then
docker stop server-green
docker rm server-green
fi
else
echo "Blue server is not Healthy"
docker stop server-blue
docker rm server-blue
fi
}

# 현재 실행 중인 환경 확인 및 전환
if [ -n "$(docker ps -q --filter name=blue)" ]; then
switch_to_green
echo "switch_to_green 실행"
else
switch_to_blue
echo "switch_to_blue 실행"
fi
91 changes: 0 additions & 91 deletions .github/workflows/scripts/deploy.sh

This file was deleted.

58 changes: 58 additions & 0 deletions .github/workflows/scripts/frontend-deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/bash

NGINX_CONFIG="nginx/conf.d/default.conf"

# nginx 설정 업데이트 및 리로드 함수
update_and_reload_nginx() {
local target=$1

echo "Updating nginx configuration for $target environment..."

# 파일 업데이트
echo $target
if [ "$target" == "green" ]; then
rm -rf nginx/html/dist-green
cp -r nginx/html/dist nginx/html/dist-green
sed -i "s|root /usr/share/nginx/html.*;|root /usr/share/nginx/html/dist-green;|g" $NGINX_CONFIG
else
rm -rf nginx/html/dist-blue
cp -r nginx/html/dist nginx/html/dist-blue
sed -i "s|root /usr/share/nginx/html.*;|root /usr/share/nginx/html/dist-blue;|g" $NGINX_CONFIG
fi

# nginx 컨테이너 재시작
echo "Restarting nginx to apply new configuration..."
docker exec nginx nginx -s reload

# 설정이 제대로 적용되었는지 확인
sleep 2
docker exec nginx nginx -t
}

# Blue에서 Green으로 전환
switch_to_green() {
echo "Deploying Green environment..."

cd ../../../
# nginx 설정 업데이트 및 리로드
update_and_reload_nginx "green"

}
# Green에서 Blue로 전환
switch_to_blue() {
echo "Deploying Blue environment..."

cd ../../../

# nginx 설정 업데이트 및 리로드
update_and_reload_nginx "blue"
}

# 현재 실행 중인 환경 확인 및 전환
if [ -n "$(cat $NGINX_CONFIG | grep html/dist-blue)" ]; then
switch_to_green
echo "switch_to_green 실행"
else
switch_to_blue
echo "switch_to_blue 실행"
fi
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

env
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 env 디렉토리는 로컬에서도 사용되는 건가요~?


# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

Expand Down
21 changes: 21 additions & 0 deletions docker-compose-blue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
networks:
webapp:
external: true

services:
server-blue:
image: "inear-server:latest"
container_name: server-blue
env_file:
- ./env/server.env
environment:
- NODE_ENV=development
- TZ=Asia/Seoul
networks:
- webapp
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://server-blue:3000/api/health || exit 1"]
interval: 7s
timeout: 10s
retries: 5
21 changes: 21 additions & 0 deletions docker-compose-green.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
networks:
webapp:
external: true

services:
server-green:
image: "inear-server:latest"
container_name: server-green
env_file:
- ./env/server.env
environment:
- NODE_ENV=development
- TZ=Asia/Seoul
networks:
- webapp
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://server-green:3000/api/health || exit 1"]
interval: 7s
timeout: 10s
retries: 5
17 changes: 17 additions & 0 deletions docker-compose-nginx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
networks:
webapp:
name: webapp

services:
nginx:
image: "inear-nginx:latest"
container_name: nginx
env_file:
- ./env/client.env
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
ports:
- '80:80'
networks:
- webapp
restart: unless-stopped
Loading