Skip to content

Commit 267757b

Browse files
authored
Merge pull request #487 from boostcampwm-2024/feat/create-email-worker
✨Feat: Email Worker 애플리케이션 구현 및 Nest WAS로부터 Email 전송 로직 추출/삭제
2 parents af5c77c + 90843c9 commit 267757b

38 files changed

+8939
-109
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Email-Worker Deployment
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
paths: [ "email-worker/**" ]
7+
workflow_dispatch:
8+
9+
permissions:
10+
contents: read
11+
packages: write
12+
13+
env:
14+
IMAGE_NAME: ghcr.io/boostcampwm-2024/web05-denamu/email-worker
15+
IMAGE_TAG: sha-${{ github.sha }}
16+
SERVICE: email-worker
17+
ENV_DIR: /var/prod_config/email-worker
18+
ENV_FILE: /var/prod_config/email-worker/.env.prod
19+
COMPOSE_FILE: docker-compose/docker-compose.prod.yml
20+
STOP_GRACE_PERIOD: 30
21+
22+
jobs:
23+
build-and-push:
24+
runs-on: ubuntu-latest
25+
steps:
26+
- uses: actions/checkout@v4
27+
28+
- name: QEMU 멀티 아키텍쳐 에뮬레이터
29+
uses: docker/setup-qemu-action@v3
30+
31+
- name: Buildx 멀티 아키텍쳐 빌더
32+
uses: docker/setup-buildx-action@v3
33+
34+
- name: GHCR 로그인
35+
uses: docker/login-action@v3
36+
with:
37+
registry: ghcr.io
38+
username: ${{ github.actor }}
39+
password: ${{ secrets.GHCR_GITHUB_TOKEN }}
40+
41+
- name: Docker 이미지 Build 및 Push
42+
uses: docker/build-push-action@v6
43+
with:
44+
context: ./email-worker
45+
file: ./email-worker/docker/Dockerfile.prod
46+
push: true
47+
platforms: linux/amd64,linux/arm64
48+
tags: |
49+
${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
50+
${{ env.IMAGE_NAME }}:latest
51+
cache-from: type=gha
52+
cache-to: type=gha,mode=max
53+
54+
deploy:
55+
runs-on: [ self-hosted, prod ]
56+
needs: build-and-push # Build 및 Push가 끝나면 시작
57+
steps:
58+
- name: 코드 체크아웃
59+
uses: actions/checkout@v4
60+
61+
- name: GHCR 로그인 (prod)
62+
uses: docker/login-action@v3
63+
with:
64+
registry: ghcr.io
65+
username: ${{ github.actor }}
66+
password: ${{ secrets.GHCR_GITHUB_TOKEN }}
67+
68+
- name: 환경변수 최신화
69+
run: |
70+
sudo mkdir -p "$ENV_DIR"
71+
sudo install -m 600 /dev/null "$ENV_FILE"
72+
{
73+
echo "EMAIL_USER=${{ secrets.EMAIL_USER }}"
74+
echo "EMAIL_PASSWORD=${{ secrets.EMAIL_PASSWORD }}"
75+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
76+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
77+
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
78+
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
79+
} | sudo tee "$ENV_FILE" >/dev/null
80+
81+
# 인프라용 환경변수 파일 생성 (Redis, MySQL 등)
82+
sudo mkdir -p /var/prod_config/infra
83+
sudo install -m 600 /dev/null /var/prod_config/infra/.env.prod
84+
{
85+
echo "REDIS_USER=${{ secrets.REDIS_USERNAME }}"
86+
echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}"
87+
echo "MYSQL_ROOT_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
88+
echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
89+
echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
90+
echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
91+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
92+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
93+
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
94+
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
95+
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"
96+
} | sudo tee /var/prod_config/infra/.env.prod >/dev/null
97+
98+
- name: Docker 이미지 Pull
99+
run: |
100+
docker pull "${IMAGE_NAME}:${IMAGE_TAG}" || true
101+
docker pull "${IMAGE_NAME}:latest" || true
102+
docker compose -f "$COMPOSE_FILE" pull "$SERVICE"
103+
104+
- name: Graceful Shutdown & 서비스 재시작
105+
run: |
106+
docker compose -f "$COMPOSE_FILE" stop -t $STOP_GRACE_PERIOD "$SERVICE" || true
107+
docker compose -f "$COMPOSE_FILE" up -d --no-deps --force-recreate "$SERVICE"
108+
docker image prune -f || true

docker-compose/check-rabbitmq-ready.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#!/bin/sh
2-
set -e
32

43
# RabbitMQ가 실행 중인지 확인
54
rabbitmq-diagnostics ping > /dev/null 2>&1 || exit 1

docker-compose/docker-compose.dev.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,32 @@ services:
110110
action: rebuild
111111
profiles:
112112
- default
113+
114+
# Email Worker 서비스
115+
email-worker:
116+
build:
117+
context: ../email-worker
118+
dockerfile: docker/Dockerfile.dev
119+
image: denamu-dev-email-worker:latest
120+
networks:
121+
- Denamu
122+
depends_on:
123+
mysql-db:
124+
condition: service_healthy
125+
redis:
126+
condition: service_healthy
127+
rabbitmq:
128+
condition: service_healthy
129+
volumes:
130+
- ../email-worker:/var/web05-Denamu/email-worker
131+
- /var/web05-Denamu/email-worker/node_modules
132+
environment:
133+
NODE_ENV: "DEV"
134+
TZ: "Asia/Seoul"
135+
stop_grace_period: 30s
136+
develop:
137+
watch:
138+
- path: ../email-worker/package.json
139+
action: rebuild
140+
profiles:
141+
- was-dev

docker-compose/docker-compose.local.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,25 @@ services:
6464
environment:
6565
NODE_ENV: "LOCAL"
6666
TZ: "Asia/Seoul"
67+
68+
# Email Worker 서비스
69+
email-worker:
70+
build:
71+
context: ../email-worker
72+
dockerfile: docker/Dockerfile.local
73+
image: denamu-local-portfolio-email-worker:latest
74+
networks:
75+
- Denamu
76+
depends_on:
77+
mysql-db:
78+
condition: service_healthy
79+
redis:
80+
condition: service_healthy
81+
rabbitmq:
82+
condition: service_healthy
83+
volumes:
84+
- ../feed-crawler/logs:/var/web05-Denamu/email-worker/logs
85+
environment:
86+
NODE_ENV: "LOCAL"
87+
TZ: "Asia/Seoul"
88+
stop_grace_period: 30s

docker-compose/docker-compose.prod.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,25 @@ services:
4646
environment:
4747
NODE_ENV: "PROD"
4848
TZ: "Asia/Seoul"
49+
50+
51+
# Email Worker 서비스
52+
email-worker:
53+
image: ghcr.io/boostcampwm-2024/web05-denamu/email-worker:latest
54+
env_file:
55+
- /var/prod_config/email-worker/.env.prod
56+
networks:
57+
- Denamu
58+
depends_on:
59+
mysql-db:
60+
condition: service_healthy
61+
redis:
62+
condition: service_healthy
63+
rabbitmq:
64+
condition: service_healthy
65+
volumes:
66+
- /var/prod_data/email-worker/logs:/app/logs
67+
environment:
68+
NODE_ENV: "PROD"
69+
TZ: "Asia/Seoul"
70+
stop_grace_period: 30s

docker-compose/import-definitions.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#!/bin/sh
2-
set -e
32

43
# RabbitMQ 서버를 백그라운드로 시작
54
docker-entrypoint.sh rabbitmq-server &

email-worker/.dockerignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
dist
2+
node_modules
3+
.git
4+
logs
5+
test/coverage

email-worker/.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/node_modules
2+
.env.*
3+
!.env.local
4+
/dist
5+
/logs
6+
/test/coverage
7+
.env

email-worker/.prettierrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"singleQuote": true,
3+
"trailingComma": "all",
4+
"endOfLine": "lf"
5+
}

email-worker/docker/Dockerfile.dev

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM node:22-alpine AS builder
2+
3+
WORKDIR /var/web05-Denamu/email-worker
4+
5+
COPY ../package*.json ./
6+
7+
RUN npm ci
8+
9+
FROM node:22-alpine
10+
11+
WORKDIR /var/web05-Denamu/email-worker
12+
13+
COPY .. .
14+
15+
COPY --from=builder /var/web05-Denamu/email-worker/node_modules ./node_modules
16+
17+
RUN touch /var/log/email-worker.log
18+
19+
CMD ["sh", "-c", "npm run start:dev && tail -f /var/log/email-worker.log"]

0 commit comments

Comments
 (0)