Skip to content

Commit 2acee86

Browse files
committed
Merge branch 'main' of https://github.com/boostcampwm-2024/web05-Denamu into fix/prod-redis-init
2 parents 2d115a4 + ee9aa31 commit 2acee86

33 files changed

+476
-106
lines changed

.github/workflows/deploy_feed-crawler.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ jobs:
8181
echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}"
8282
echo "AI_API_KEY=${{ secrets.AI_API_KEY }}"
8383
echo "AI_RATE_LIMIT_COUNT=${{ vars.AI_RATE_LIMIT_COUNT }}"
84-
echo "RABBITMQ_USERNAME=${{ secrets.PRODUCT_RABBITMQ_USERNAME }}"
85-
echo "RABBITMQ_PASSWORD=${{ secrets.PRODUCT_RABBITMQ_PASSWORD }}"
84+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
85+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
8686
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
8787
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
8888
} | sudo tee "$ENV_FILE" >/dev/null
@@ -97,8 +97,8 @@ jobs:
9797
echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
9898
echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
9999
echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
100-
echo "RABBITMQ_USERNAME=${{ secrets.PRODUCT_RABBITMQ_USERNAME }}"
101-
echo "RABBITMQ_PASSWORD=${{ secrets.PRODUCT_RABBITMQ_PASSWORD }}"
100+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
101+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
102102
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
103103
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
104104
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"

.github/workflows/deploy_infra.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ jobs:
2929
echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
3030
echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
3131
echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
32-
echo "RABBITMQ_USERNAME=${{ secrets.PRODUCT_RABBITMQ_USERNAME }}"
33-
echo "RABBITMQ_PASSWORD=${{ secrets.PRODUCT_RABBITMQ_PASSWORD }}"
32+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
33+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
3434
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
3535
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
36-
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"
36+
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"
3737
} | sudo tee /var/prod_config/infra/.env.prod >/dev/null
3838
3939
sudo chmod +x docker-compose/redis-init.sh

.github/workflows/deploy_server.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ jobs:
9090
echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}"
9191
echo "GITHUB_CLIENT_ID=${{ secrets.GIT_CLIENT_ID }}"
9292
echo "GITHUB_CLIENT_SECRET=${{ secrets.GIT_CLIENT_SECRET }}"
93-
echo "RABBITMQ_USERNAME=${{ secrets.PRODUCT_RABBITMQ_USERNAME }}"
94-
echo "RABBITMQ_PASSWORD=${{ secrets.PRODUCT_RABBITMQ_PASSWORD }}"
93+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
94+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
9595
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
9696
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
9797
} | sudo tee "$ENV_FILE" >/dev/null
@@ -106,8 +106,8 @@ jobs:
106106
echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
107107
echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
108108
echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
109-
echo "RABBITMQ_USERNAME=${{ secrets.PRODUCT_RABBITMQ_USERNAME }}"
110-
echo "RABBITMQ_PASSWORD=${{ secrets.PRODUCT_RABBITMQ_PASSWORD }}"
109+
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
110+
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
111111
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
112112
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
113113
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"

.github/workflows/test_feed-crawler.yml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ on:
55
branches:
66
- main
77
paths:
8-
- 'feed-crawler/**'
9-
- '.github/workflows/test_feed-crawler.yml'
8+
- "feed-crawler/**"
9+
- ".github/workflows/test_feed-crawler.yml"
1010
workflow_dispatch:
1111

1212
jobs:
@@ -32,10 +32,17 @@ jobs:
3232
working-directory: ./feed-crawler
3333
run: npm ci
3434

35-
# 4. 통합 테스트 실행
36-
- name: Run Integration Test
35+
# 4. Unit 테스트 실행
36+
- name: Run Unit Test
3737
working-directory: ./feed-crawler
38-
run: npm run test
38+
run: npm run test:unit
39+
env:
40+
TEST_TIME_INTERVAL: ${{ vars.FEED_CRAWLER_TEST_TIME_INTERVAL }}
41+
42+
# 5. E2E 테스트 실행
43+
- name: Run E2E Test
44+
working-directory: ./feed-crawler
45+
run: npm run test:e2e
3946
env:
4047
TEST_TIME_INTERVAL: ${{ vars.FEED_CRAWLER_TEST_TIME_INTERVAL }}
4148

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# RabbitMQ가 실행 중인지 확인
5+
rabbitmq-diagnostics ping > /dev/null 2>&1 || exit 1
6+
7+
# definitions.json의 import 성공 여부 확인
8+
# ⚠️ 주의: 아래의 exchange 이름(email, crawling)은 definitions.json 파일의 exchanges 항목과 반드시 동기화되어야 합니다.
9+
# definitions.json에서 exchange를 추가/삭제할 경우, 이 스크립트도 반드시 함께 수정해야 합니다.
10+
rabbitmqctl list_exchanges name | grep -q "^email$" || exit 1
11+
rabbitmqctl list_exchanges name | grep -q "^crawling$" || exit 1
12+
13+
exit 0

docker-compose/definitions.json

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
{
2+
"exchanges": [
3+
{
4+
"name": "email",
5+
"vhost": "/",
6+
"type": "direct",
7+
"durable": true
8+
},
9+
{
10+
"name": "crawling",
11+
"vhost": "/",
12+
"type": "topic",
13+
"durable": true
14+
},
15+
{
16+
"name": "dead_letter",
17+
"vhost": "/",
18+
"type": "topic",
19+
"durable": true
20+
}
21+
],
22+
"queues": [
23+
{
24+
"name": "email_send",
25+
"vhost": "/",
26+
"durable": true,
27+
"arguments": {
28+
"x-dead-letter-exchange": "dead_letter",
29+
"x-dead-letter-routing-key": "email.dead_letter"
30+
}
31+
},
32+
{
33+
"name": "crawling_full",
34+
"vhost": "/",
35+
"durable": true,
36+
"arguments": {
37+
"x-dead-letter-exchange": "dead_letter",
38+
"x-dead-letter-routing-key": "crawling.full.dead_letter"
39+
}
40+
},
41+
{
42+
"name": "email_dead_letter",
43+
"vhost": "/",
44+
"durable": true
45+
},
46+
{
47+
"name": "crawling_full_dead_letter",
48+
"vhost": "/",
49+
"durable": true
50+
}
51+
],
52+
"bindings": [
53+
{
54+
"source": "email",
55+
"vhost": "/",
56+
"destination": "email_send",
57+
"destination_type": "queue",
58+
"routing_key": "email.send",
59+
"arguments": {}
60+
},
61+
{
62+
"source": "crawling",
63+
"vhost": "/",
64+
"destination": "crawling_full",
65+
"destination_type": "queue",
66+
"routing_key": "crawling.full",
67+
"arguments": {}
68+
},
69+
{
70+
"source": "dead_letter",
71+
"vhost": "/",
72+
"destination": "email_dead_letter",
73+
"destination_type": "queue",
74+
"routing_key": "email.dead_letter",
75+
"arguments": {}
76+
},
77+
{
78+
"source": "dead_letter",
79+
"vhost": "/",
80+
"destination": "crawling_full_dead_letter",
81+
"destination_type": "queue",
82+
"routing_key": "crawling.full.dead_letter",
83+
"arguments": {}
84+
}
85+
]
86+
}

docker-compose/docker-compose.infra.yml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ services:
6666
# RabbitMQ 서비스
6767
rabbitmq:
6868
image: rabbitmq:4.1-management
69+
user: "999:999"
6970
networks:
7071
- Denamu
7172
ports:
@@ -76,11 +77,15 @@ services:
7677
RABBITMQ_DEFAULT_PASS: "denamu-rabbitmq-password"
7778
volumes:
7879
- denamu-rabbitmq:/var/lib/rabbitmq
80+
- ./definitions.json:/etc/rabbitmq/definitions.json:ro
81+
- ./import-definitions.sh:/etc/rabbitmq/import-definitions.sh:ro
82+
- ./check-rabbitmq-ready.sh:/etc/rabbitmq/check-rabbitmq-ready.sh:ro
83+
entrypoint: ["/bin/sh", "/etc/rabbitmq/import-definitions.sh"]
7984
healthcheck:
80-
test: [ "CMD", "rabbitmq-diagnostics", "ping" ]
81-
interval: 30s
82-
timeout: 10s
83-
retries: 3
85+
test: [ "CMD", "/bin/sh", "/etc/rabbitmq/check-rabbitmq-ready.sh" ]
86+
interval: 10s
87+
timeout: 5s
88+
retries: 5
8489
start_period: 40s
8590
profiles:
8691
- was-dev

docker-compose/docker-compose.local.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ services:
3636
condition: service_healthy
3737
redis:
3838
condition: service_healthy
39+
rabbitmq:
40+
condition: service_healthy
3941
volumes:
4042
- ../server/logs:/var/web05-Denamu/server/logs
4143
environment:
@@ -55,6 +57,8 @@ services:
5557
condition: service_healthy
5658
redis:
5759
condition: service_healthy
60+
rabbitmq:
61+
condition: service_healthy
5862
volumes:
5963
- ../feed-crawler/logs:/var/web05-Denamu/feed-crawler/logs
6064
environment:

docker-compose/docker-compose.prod.infra.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,25 @@ services:
7878
# RabbitMQ 서비스
7979
rabbitmq:
8080
image: rabbitmq:4.1-management
81+
user: "999:999"
8182
networks:
8283
- Denamu
8384
ports:
8485
- "5672:5672"
8586
- "15672:15672"
8687
env_file:
8788
- /var/prod_config/infra/.env.prod
88-
environment:
89-
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USERNAME}
90-
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
9189
volumes:
9290
- denamu-rabbitmq:/var/lib/rabbitmq
91+
- ./definitions.json:/etc/rabbitmq/definitions.json:ro
92+
- ./import-definitions.sh:/etc/rabbitmq/import-definitions.sh:ro
93+
- ./check-rabbitmq-ready.sh:/etc/rabbitmq/check-rabbitmq-ready.sh:ro
94+
entrypoint: ["/bin/sh", "/etc/rabbitmq/import-definitions.sh"]
9395
healthcheck:
94-
test: ["CMD", "rabbitmq-diagnostics", "ping"]
95-
interval: 30s
96-
timeout: 10s
97-
retries: 3
96+
test: ["CMD", "/bin/sh", "/etc/rabbitmq/check-rabbitmq-ready.sh"]
97+
interval: 10s
98+
timeout: 5s
99+
retries: 5
98100
start_period: 40s
99101

100102
# Redis Metrics
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# RabbitMQ 서버를 백그라운드로 시작
5+
docker-entrypoint.sh rabbitmq-server &
6+
RABBITMQ_PID=$!
7+
8+
# RabbitMQ가 완전히 준비될 때까지 대기(1분 타임아웃)
9+
MAX_WAIT=20
10+
COUNT=0
11+
until rabbitmqctl list_users >/dev/null 2>&1; do
12+
COUNT=$((COUNT + 1))
13+
if [ $COUNT -ge $MAX_WAIT ]; then
14+
echo "RabbitMQ failed to start within 60 seconds" >&2
15+
exit 1
16+
fi
17+
sleep 3
18+
done
19+
20+
# definitions.json import
21+
if rabbitmqctl import_definitions /etc/rabbitmq/definitions.json; then
22+
echo "definitions.json imported successfully."
23+
else
24+
echo "Failed to import definitions.json" >&2
25+
exit 1
26+
fi
27+
28+
# 포그라운드로 RabbitMQ 프로세스 유지
29+
wait $RABBITMQ_PID

0 commit comments

Comments
 (0)