-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
191 lines (169 loc) · 6.66 KB
/
Copy pathdocker-compose.yml
File metadata and controls
191 lines (169 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
version: '3.8'
services:
# 1. Spring Boot App
app:
image: ${DOCKER_USERNAME}/where-you-ad-backend:latest
container_name: where-you-ad-backend
ports:
- "8080:8080" # Public EC2가 이 포트로 트래픽을 보냄
environment:
# ============================================================
# [추가] 앱 컨테이너 타임존
# 기존에는 mysqldb 서비스(82행)에만 TZ 가 지정되어 있어
# app 컨테이너 JVM 이 UTC 로 동작 중이었음
# Dockerfile 에도 ENV TZ 를 넣지만, 여기서 명시해두면
# 이미지 재빌드 없이 환경별로 덮어쓸 수 있음
# ============================================================
TZ: Asia/Seoul
# .env 파일의 변수명을 그대로 매핑
# 왼쪽: 스프링부트가 아는 이름 / 오른쪽: .env
SPRING_DATASOURCE_URL: ${DB_URL}
SPRING_DATASOURCE_USERNAME: ${DB_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
# Redis
SPRING_DATA_REDIS_HOST: ${REDIS_HOST}
SPRING_DATA_REDIS_PORT: ${REDIS_PORT}
# 기타 설정 (.env 그대로 통과)
MAIL_USERNAME: ${MAIL_USERNAME}
MAIL_PASSWORD: ${MAIL_PASSWORD}
NAVER_CLIENT_ID: ${NAVER_CLIENT_ID}
NAVER_CLIENT_SECRET: ${NAVER_CLIENT_SECRET}
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID}
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET}
JWT_SECRET: ${JWT_SECRET}
OAUTH2_REDIRECT_URL: ${OAUTH2_REDIRECT_URL}
BASE_URL: ${BASE_URL}
FRONTEND_URL: ${FRONTEND_URL}
SMS_API_KEY: ${SMS_API_KEY}
SMS_SECRET_KEY: ${SMS_SECRET_KEY}
SMS_SENDER_NUMBER: ${SMS_SENDER_NUMBER}
AWS_ACCESS_KEY: ${AWS_ACCESS_KEY}
AWS_SECRET_KEY: ${AWS_SECRET_KEY}
OPENAI_API_KEY: ${OPENAI_API_KEY}
AES_SECRET: ${AES_SECRET}
# Meta Marketing API
META_APP_ID: ${META_APP_ID}
META_APP_SECRET: ${META_APP_SECRET}
META_REDIRECT_URI: ${META_REDIRECT_URI}
META_FRONTEND_CALLBACK_URL: ${META_FRONTEND_CALLBACK_URL}
#Google Ads
GOOGLE_ADS_CLIENT_ID: ${GOOGLE_ADS_CLIENT_ID}
GOOGLE_ADS_CLIENT_SECRET: ${GOOGLE_ADS_CLIENT_SECRET}
GOOGLE_ADS_OAUTH2_REDIRECT_URL: ${GOOGLE_ADS_OAUTH2_REDIRECT_URL}
GOOGLE_ADS_DEVELOPER_TOKEN: ${GOOGLE_ADS_DEVELOPER_TOKEN}
GOOGLE_ADS_FRONTEND_CALLBACK_URL: ${GOOGLE_ADS_FRONTEND_CALLBACK_URL}
COOKIE_SECURE: ${COOKIE_SECURE}
COOKIE_DOMAIN: ${COOKIE_DOMAIN}
COOKIE_SAME_SITE: ${COOKIE_SAME_SITE}
# Kafka
KAFKA_BOOTSTRAP_SERVERS: ${KAFKA_BOOTSTRAP_SERVERS}
# 모니터링 (Actuator Basic Auth - monitoring/prometheus.dev.yml 의 basic_auth 값과 일치해야 함)
ACTUATOR_METRICS_USERNAME: ${ACTUATOR_METRICS_USERNAME}
ACTUATOR_METRICS_PASSWORD: ${ACTUATOR_METRICS_PASSWORD}
# Web Push (VAPID)
VAPID_PUBLIC_KEY: ${VAPID_PUBLIC_KEY}
VAPID_PRIVATE_KEY: ${VAPID_PRIVATE_KEY}
VAPID_SUBJECT: ${VAPID_SUBJECT}
depends_on:
- mysqldb
- redis
- kafka
networks:
- where-you-ad-network
restart: always
# 2. MySQL
mysqldb:
image: mysql:8.0
container_name: where-you-ad-db
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: whereyouad
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
TZ: Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql/data:/var/lib/mysql
networks:
- where-you-ad-network
restart: always
ports:
- "3306:3306"
# 3. Redis
redis:
image: redis:latest
container_name: where-you-ad-redis
networks:
- where-you-ad-network
restart: always
ports:
- "6379:6379"
# 4. Kafka
kafka:
image: apache/kafka:3.7.0
container_name: where-you-ad-kafka
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
# INTERNAL(도커 내부용 29092), EXTERNAL(외부 접속용 9092)
KAFKA_LISTENERS: INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://${KAFKA_HOST_IP}:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
# 로컬 개발용 단일 노드 설정
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
networks:
- where-you-ad-network
# 5. Prometheus
prometheus:
image: prom/prometheus:latest # 가장 최신 정보 가져옴
container_name: where-you-ad-prometheus
ports:
- "127.0.0.1:9090:9090" # Prometheus 자체는 인증이 없어서 외부 공개 금지 - SSH 터널/VPN으로만 접근
volumes:
# app 컨테이너를 서비스명(app:8080)으로 스크레이핑하는 dev용 설정
# (배포 서버에 monitoring/prometheus.dev.yml 이 미리 존재해야 함 - .gitignore 대상, prometheus.dev.yml.example 참고)
- ./monitoring/prometheus.dev.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus # 컨테이너 재생성(down/recreate)해도 리팩토링 전후 지표가 남도록 영속화
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=90d' # 리팩토링 전후 비교를 위해 기본 15일보다 넉넉하게
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
networks:
- where-you-ad-network # app 컨테이너를 이름으로 찾으려면 같은 네트워크에 있어야 함
restart: always
# 6. Grafana
grafana:
image: grafana/grafana:latest
container_name: where-you-ad-grafana
ports:
- "127.0.0.1:3000:3000" # 외부 공개 대신 SSH 터널/VPN으로만 접근 (직접 공개하려면 "3000:3000"로 변경 + 보안그룹 IP 제한 필수)
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
volumes:
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning
- ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards
networks:
- where-you-ad-network
depends_on:
- prometheus
restart: always
volumes:
prometheus-data:
driver: local
networks:
where-you-ad-network:
driver: bridge