-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
131 lines (109 loc) · 5.19 KB
/
Copy pathdocker-compose.yml
File metadata and controls
131 lines (109 loc) · 5.19 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
services:
postgres:
# 로컬 개발과 Flyway smoke test에서 사용할 PostgreSQL 컨테이너입니다.
# 직접 설치한 PostgreSQL을 쓰는 경우에는 이 컨테이너를 띄우지 않아도 됩니다.
image: postgres:16-alpine
# docker exec, docker ps에서 찾기 쉽도록 컨테이너 이름을 고정합니다.
container_name: mamoki-postgres
# 개발 중 Docker가 재시작되어도 DB 컨테이너가 자동으로 다시 올라오게 합니다.
restart: unless-stopped
# 호스트 포트는 .env의 POSTGRES_PORT로 바꿀 수 있습니다.
# 기본 15432 — 호스트에 PostgreSQL이 이미 5432로 떠 있을 가능성을 회피.
ports:
- "${POSTGRES_PORT:-15432}:5432"
environment:
# Docker 컨테이너 내부에 생성할 DB 이름입니다.
# .env의 POSTGRES_DB=mom_med 값을 그대로 사용해 psql 접속 DB와 Flyway 적용 DB를 일치시킵니다.
POSTGRES_DB: ${POSTGRES_DB:-mom_med}
# Docker Compose는 POSTGRES_USER/POSTGRES_PASSWORD를 기준으로 DB 계정을 생성합니다.
# Spring Boot도 application.yml에서 같은 변수명을 우선 사용하므로 계정 혼선을 줄일 수 있습니다.
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set in .env}
TZ: Asia/Seoul
volumes:
# 컨테이너를 삭제하거나 다시 만들어도 DB 데이터가 유지되도록 named volume을 사용합니다.
- postgres_data:/var/lib/postgresql/data
healthcheck:
# PostgreSQL이 실제 연결을 받을 수 있는 상태인지 확인합니다.
test: ["CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\""]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
networks:
- mamoki-net
redis:
# Redis는 Slice 04의 rate limit, Slice 07의 분산 락, 이후 캐시 계층에서 공통으로 사용하는 인프라입니다.
# 지금 당장 Slice 01 비즈니스 로직이 Redis를 직접 쓰지는 않지만, Redisson 자동 설정이 있으므로
# 로컬에서 Spring Boot를 정상 기동하려면 PostgreSQL과 함께 Redis도 떠 있어야 합니다.
image: redis:7-alpine
container_name: mamoki-redis
restart: unless-stopped
ports:
- "${REDIS_PORT:-16379}:6379"
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
start_period: 5s
networks:
- mamoki-net
backend:
# Spring Boot 애플리케이션. Dockerfile multi-stage로 빌드.
# 어떤 환경에서도 동일하게 작동하도록 모든 외부 의존(DB·Redis·API 키)을 환경변수로 주입.
build:
context: .
dockerfile: Dockerfile
container_name: mamoki-backend
restart: unless-stopped
# 호스트의 8080 포트에 매핑 — 프론트엔드(.env의 EXPO_PUBLIC_API_BASE_URL)에서 접근.
ports:
- "${BACKEND_PORT:-8080}:8080"
# PostgreSQL과 Redis가 healthy 상태가 된 후에만 backend 컨테이너 시작.
# Flyway가 빈 DB에 마이그레이션 시도하다 connection refused로 죽는 걸 방지.
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
# docker 프로파일 활성화 → application-docker.yml 로드
SPRING_PROFILES_ACTIVE: docker
# 컨테이너 네트워크 내부 호스트명으로 DB/Redis 접속.
# (compose 서비스 이름이 자동으로 DNS 등록됨)
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB:-mom_med}
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-postgres}
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
SPRING_DATA_REDIS_URL: redis://redis:6379
# 외부 API 키 — .env에서 받음
EXTERNAL_MFDS_API_KEY: ${MFDS_API_KEY:-}
EXTERNAL_HIRA_API_KEY: ${HIRA_API_KEY:-}
EXTERNAL_KMA_API_KEY: ${KMA_API_KEY:-}
EXTERNAL_GEMINI_API_KEY: ${GEMINI_API_KEY:-}
# pgcrypto 마스터키
APP_ENCRYPTION_KEY: ${APP_ENCRYPTION_KEY:?APP_ENCRYPTION_KEY must be set in .env}
# DUR CSV ETL — 기본 비활성. CSV 폴더를 마운트한 환경에서만 켜기.
APP_ETL_DUR_ENABLED: ${APP_ETL_DUR_ENABLED:-false}
# JVM 옵션 (Dockerfile에 기본 IPv4 stack — 여기서 추가/override 가능)
JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS:--Djava.net.preferIPv4Stack=true}
TZ: Asia/Seoul
volumes:
# DUR CSV 폴더를 컨테이너로 read-only 마운트 (선택).
# 호스트의 DUR_DATA_DIR이 .env에 있으면 자동 마운트.
# 없으면 빈 디렉토리라 ETL은 자동 skip.
- ${DUR_DATA_DIR:-./dur-empty}:/data/dur:ro
networks:
- mamoki-net
volumes:
# PostgreSQL 데이터 파일을 보관하는 Docker named volume입니다.
postgres_data:
# Redis AOF/개발 캐시 데이터를 보존하는 Docker named volume입니다.
redis_data:
networks:
# 모든 서비스(postgres·redis·backend)가 한 네트워크 안에서 서비스 이름으로 통신.
mamoki-net:
driver: bridge