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

๐Ÿ“ฆ chore: docker CI/CD ์ž‘์„ฑ #331

Merged
merged 7 commits into from
Mar 11, 2025
Merged
36 changes: 15 additions & 21 deletions .github/workflows/deploy_feed-crawler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,24 @@ jobs:
key: ${{ secrets.CLOUD_PUBLIC_INSTANCE_SSH_KEY }}
port: ${{ secrets.CLOUD_PUBLIC_INSTANCE_PORT }}
script: |
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh

cd /var/web05-Denamu
git pull origin main
cd /var/web05-Denamu/feed-crawler/

echo "DB_PORT=${{ secrets.FEED_CRAWLER_DB_PORT }}" > .env
echo "DB_HOST=${{ secrets.FEED_CRAWLER_DB_HOST }}" >> .env
echo "DB_NAME=${{ secrets.FEED_CRAWLER_DB_NAME }}" >> .env
echo "DB_USER=${{ secrets.FEED_CRAWLER_DB_USER }}" >> .env
echo "DB_PASS=${{ secrets.FEED_CRAWLER_DB_PASSWORD }}" >> .env
echo "TIME_INTERVAL=${{ vars.FEED_CRAWLER_TIME_INTERVAL }}" >> .env
echo "TEST_TIME_INTERVAL=${{ vars.FEED_CRAWLER_TEST_TIME_INTERVAL }}" >> .env
echo "REDIS_HOST=${{secrets.REDIS_HOST }}" >> .env
echo "REDIS_PORT=${{secrets.REDIS_PORT}}" >> .env
echo "REDIS_USERNAME=${{secrets.REDIS_USERNAME}}" >> .env
echo "REDIS_PASSWORD=${{secrets.REDIS_PASSWORD}}" >> .env
echo "AI_API_KEY=${{secrets.AI_API_KEY}}" >> .env
echo "AI_RATE_LIMIT_COUNT=${{ vars.AI_RATE_LIMIT_COUNT }}" >> .env
mkdir -p env
echo "DB_PORT=${{ secrets.FEED_CRAWLER_DB_PORT }}" > env/.env.prod
echo "DB_HOST=${{ secrets.FEED_CRAWLER_DB_HOST }}" >> env/.env.prod
echo "DB_NAME=${{ secrets.FEED_CRAWLER_DB_NAME }}" >> env/.env.prod
echo "DB_USER=${{ secrets.FEED_CRAWLER_DB_USER }}" >> env/.env.prod
echo "DB_PASS=${{ secrets.FEED_CRAWLER_DB_PASSWORD }}" >> env/.env.prod
echo "TIME_INTERVAL=${{ vars.FEED_CRAWLER_TIME_INTERVAL }}" >> env/.env.prod
echo "REDIS_HOST=${{secrets.REDIS_HOST }}" >> env/.env.prod
echo "REDIS_PORT=${{secrets.REDIS_PORT}}" >> env/.env.prod
echo "REDIS_USERNAME=${{secrets.REDIS_USERNAME}}" >> env/.env.prod
echo "REDIS_PASSWORD=${{secrets.REDIS_PASSWORD}}" >> env/.env.prod
echo "AI_API_KEY=${{secrets.AI_API_KEY}}" >> env/.env.prod
echo "AI_RATE_LIMIT_COUNT=${{ vars.AI_RATE_LIMIT_COUNT }}" >> env/.env.prod

npm ci
npm run build
cd /var/web05-Denamu

pm2 delete all
pm2 start ecosystem.config.js
docker-compose -f docker-compose/docker-compose.prod.yml up --build -d feed-crawler
docker image prune -f
40 changes: 17 additions & 23 deletions .github/workflows/deploy_server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,26 @@ jobs:
key: ${{ secrets.CLOUD_PUBLIC_INSTANCE_SSH_KEY }}
port: ${{ secrets.CLOUD_PUBLIC_INSTANCE_PORT }}
script: |
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh

cd /var/web05-Denamu
git pull origin main
cd /var/web05-Denamu/server

mkdir -p configs
echo "PORT=${{ secrets.PRODUCT_PORT }}" > configs/.env.db.production
echo "DB_TYPE=mysql" >> configs/.env.db.production
echo "DB_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}" >> configs/.env.db.production
echo "DB_HOST=${{ secrets.PRODUCT_DB_HOST }}" >> configs/.env.db.production
echo "DB_PORT=${{ secrets.PRODUCT_DB_PORT }}" >> configs/.env.db.production
echo "DB_USERNAME=${{ secrets.PRODUCT_DB_USERNAME }}" >> configs/.env.db.production
echo "DB_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}" >> configs/.env.db.production
echo "REDIS_HOST=${{secrets.REDIS_HOST }}" >> configs/.env.db.production
echo "REDIS_PORT=${{secrets.REDIS_PORT}}" >> configs/.env.db.production
echo "REDIS_USERNAME=${{secrets.REDIS_USERNAME}}" >> configs/.env.db.production
echo "REDIS_PASSWORD=${{secrets.REDIS_PASSWORD}}" >> configs/.env.db.production
echo "EMAIL_USER=${{secrets.EMAIL_USER}}" >> configs/.env.db.production
echo "EMAIL_PASSWORD=${{secrets.EMAIL_PASSWORD}}" >> configs/.env.db.production
echo "AI_API_KEY=${{secrets.AI_API_KEY}}" >> configs/.env.db.production
mkdir -p env
echo "PORT=${{ secrets.PRODUCT_PORT }}" > env/.env.prod
echo "DB_TYPE=mysql" >> env/.env.prod
echo "DB_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}" >> env/.env.prod
echo "DB_HOST=${{ secrets.PRODUCT_DB_HOST }}" >> env/.env.prod
echo "DB_PORT=${{ secrets.PRODUCT_DB_PORT }}" >> env/.env.prod
echo "DB_USERNAME=${{ secrets.PRODUCT_DB_USERNAME }}" >> env/.env.prod
echo "DB_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}" >> env/.env.prod
echo "REDIS_HOST=${{secrets.REDIS_HOST }}" >> env/.env.prod
echo "REDIS_PORT=${{secrets.REDIS_PORT}}" >> env/.env.prod
echo "REDIS_USERNAME=${{secrets.REDIS_USERNAME}}" >> env/.env.prod
echo "REDIS_PASSWORD=${{secrets.REDIS_PASSWORD}}" >> env/.env.prod
echo "EMAIL_USER=${{secrets.EMAIL_USER}}" >> env/.env.prod
echo "EMAIL_PASSWORD=${{secrets.EMAIL_PASSWORD}}" >> env/.env.prod
echo "AI_API_KEY=${{secrets.AI_API_KEY}}" >> env/.env.prod

npm ci
npm run build

cd /var/web05-Denamu
pm2 delete all
pm2 start ecosystem.config.js
docker-compose -f docker-compose/docker-compose.prod.yml up --build -d app
docker image prune -f
1 change: 0 additions & 1 deletion client/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ node_modules
dist
dist-ssr
*.local

!.env.local
!Dockerfile.local

Expand Down
6 changes: 4 additions & 2 deletions client/docker/Dockerfile.local
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ COPY ./client .

RUN npm ci

RUN npm run build
RUN npm run build:local

FROM nginx:1.18.0

Expand All @@ -18,6 +18,8 @@ COPY ../../static /var/web05-Denamu/static
COPY ../../nginx/scripts /etc/nginx/scripts
COPY ../../nginx/nginx.conf /etc/nginx/nginx.conf

RUN sh "/etc/nginx/scripts/generate_cert.sh"
RUN apt-get update && apt-get install dos2unix
RUN dos2unix /etc/nginx/scripts/generate_cert.sh
RUN bash "/etc/nginx/scripts/generate_cert.sh"

CMD ["nginx","-g","daemon off;"]
91 changes: 91 additions & 0 deletions docker-compose/docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: denamu-dev

include:
- docker-compose.infra.yml

services:
# NGINX ์„œ๋น„์Šค
nginx:
build:
context: ../nginx
dockerfile: Dockerfile.dev
ports:
- "80:80"
- "443:443"
networks:
- Denamu
depends_on:
- app
volumes:
- ../nginx/logs:/var/log/nginx
- ../nginx/nginx.conf:/etc/nginx/nginx.conf
- ../static:/var/web05-Denamu/static
develop:
watch:
- path: ../nginx/nginx.conf
action: restart
- path: ../nginx/scripts/generate_cert.sh
action: rebuild

# Client ์„œ๋น„์Šค
web:
build:
context: ../client
dockerfile: docker/Dockerfile.dev
ports:
- "5173:5173"
networks:
- Denamu
volumes:
- ../client:/var/web05-Denamu/client
- /var/web05-Denamu/client/node_modules
develop:
watch:
- path: ../client/package.json
action: rebuild

# WAS ์„œ๋น„์Šค
app:
build:
context: ../server
dockerfile: docker/Dockerfile.dev
ports:
- "8080:8080"
networks:
- Denamu
depends_on:
mysql-db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- ../server:/var/web05-Denamu/server
- /var/web05-Denamu/server/node_modules
environment:
NODE_ENV: "DEV"
develop:
watch:
- path: ../server/package.json
action: rebuild

# Feed Crawler ์„œ๋น„์Šค
feed-crawler:
build:
context: ../feed-crawler
dockerfile: docker/Dockerfile.dev
networks:
- Denamu
depends_on:
mysql-db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- ../feed-crawler:/var/web05-Denamu/feed-crawler
- /var/web05-Denamu/feed-crawler/node_modules
environment:
NODE_ENV: "DEV"
develop:
watch:
- path: ../feed-crawler/package.json
action: rebuild
65 changes: 65 additions & 0 deletions docker-compose/docker-compose.infra.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
services:
# DB ์„œ๋น„์Šค
mysql-db:
image: "mysql:8.0.39"
ports:
- "3306:3306"
volumes:
- denamu-mysql:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- Denamu
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
environment:
MYSQL_ROOT_HOST: localhost
MYSQL_ROOT_PASSWORD: "denamu-db"
MYSQL_DATABASE: "denamu"
MYSQL_USER: "denamu-db-user"
MYSQL_PASSWORD: "denamu-db-pw"
healthcheck:
test:
[
"CMD",
"mysqladmin",
"ping",
"-h",
"localhost",
"-u",
"root",
"-pdenamu-db",
]
interval: 10s
timeout: 5s
retries: 3

# Redis ์„œ๋น„์Šค
redis:
image: "redis:6.0.16-alpine"
ports:
- "6379:6379"
volumes:
- denamu-redis:/data
networks:
- Denamu
entrypoint:
[
"sh",
"-c",
"redis-server & sleep 5 && echo 'ACL SETUSER denamu-redis-user on >denamu-redis-pw allkeys allcommands' | redis-cli && tail -f /dev/null",
]
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3

volumes:
denamu-mysql:
denamu-redis:

networks:
Denamu:
driver: bridge
56 changes: 56 additions & 0 deletions docker-compose/docker-compose.local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: denamu-local-portfolio

include:
- docker-compose.infra.yml

services:
# NGINX + ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ
nginx:
build:
context: ../
dockerfile: client/docker/Dockerfile.local
ports:
- "80:80"
- "443:443"
networks:
- Denamu
depends_on:
- app
volumes:
- ../nginx/logs:/var/log/nginx

# WAS ์„œ๋น„์Šค
app:
build:
context: ../server
dockerfile: docker/Dockerfile.local
ports:
- "8080:8080"
networks:
- Denamu
depends_on:
mysql-db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- ../server/logs:/var/web05-Denamu/server/logs
environment:
NODE_ENV: "LOCAL"

# Feed Crawler ์„œ๋น„์Šค
feed-crawler:
build:
context: ../feed-crawler
dockerfile: docker/Dockerfile.local
networks:
- Denamu
depends_on:
mysql-db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- ../feed-crawler/logs:/var/web05-Denamu/feed-crawler/logs
environment:
NODE_ENV: "LOCAL"
Loading