Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
179 lines (164 loc) · 7.89 KB
/
Copy pathdocker-compose.yml
File metadata and controls
179 lines (164 loc) · 7.89 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
# 로컬 실행용 구성. `docker compose up` 한 번으로 앱 + MariaDB + Redis 가 뜬다.
#
# .env 가 없어도 뜨도록 로컬 전용 기본값을 여기 둔다. 실제 카카오 로그인·메일 발송·공공데이터
# 동기화·챗봇처럼 외부 키가 필요한 기능만 .env 로 덮어쓴다(.env.example 참고).
# 여기 있는 기본값은 운영에서 쓰면 안 된다. 운영은 이 파일을 쓰지 않는다.
#
# 전부: docker compose up --build
# DB·Redis 만: docker compose up mariadb redis (앱은 IDE / ./gradlew bootRun)
name: carecode
services:
mariadb:
image: mariadb:10.11
environment:
MARIADB_DATABASE: carecode
MARIADB_USER: carecode
MARIADB_PASSWORD: ${DB_PASSWORD:-carecode-local}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-carecode-root-local}
TZ: Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
# 운영(Linux MariaDB)과 같게. 테이블 이름 대소문자를 구분해야 대문자 매핑 불일치가 여기서 잡힌다.
- --lower-case-table-names=0
# 1GB 인스턴스에서 앱과 같이 사는 전제. 측정값은 유휴 113MB 였다.
- --innodb-buffer-pool-size=96M
- --performance-schema=OFF
- --max-connections=30
ports:
- "${DB_PORT:-3307}:3306"
volumes:
- mariadb-data:/var/lib/mysql
# 작은 인스턴스에 맞춘 값. 기본 설정은 버퍼 풀만 128MB 를 잡는다.
mem_limit: ${DB_MEMORY:-320m}
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 30
redis:
image: redis:7-alpine
mem_limit: ${REDIS_MEMORY:-64m}
# 리프레시 토큰·인증코드가 들어 있어 함부로 내보내면 로그아웃이 깨진다.
# 한도에 닿으면 새 쓰기를 거절하는 편이 낫다(noeviction 이 기본이지만 명시한다).
command: ["redis-server", "--maxmemory", "48mb", "--maxmemory-policy", "noeviction"]
ports:
- "${REDIS_PORT:-6380}:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
app:
build: .
depends_on:
mariadb:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "${APP_PORT:-8082}:8082"
env_file:
- path: .env
required: false
environment:
# dev 프로파일(Swagger 공개, 상세 로그)에 스키마만 운영과 같은 방식으로 만든다.
# dev 기본은 ddl-auto=update 라 마이그레이션이 틀려도 Hibernate 가 테이블을 만들어 버린다.
# 여기서는 Flyway 로 만들고 Hibernate 는 검증만 해서, 로컬에서도 마이그레이션 누락이 기동 실패로 드러난다.
SPRING_PROFILES_ACTIVE: dev
SPRING_FLYWAY_ENABLED: "true"
SPRING_JPA_HIBERNATE_DDL_AUTO: validate
DB_URL: jdbc:mariadb://mariadb:3306/carecode
DB_USERNAME: carecode
DB_PASSWORD: ${DB_PASSWORD:-carecode-local}
REDIS_HOST: redis
REDIS_PORT: "6379"
# 로컬 전용 값. 32자 이상이어야 기동된다.
JWT_SECRET: ${JWT_SECRET:-local-only-jwt-secret-do-not-use-in-production-0123456789}
JWT_REFRESH_TOKEN_STORE: redis
# 외부 연동. 비워 두거나 가짜 값이어도 기동은 된다 — 해당 기능만 동작하지 않는다.
KAKAO_CLIENT_ID: ${KAKAO_CLIENT_ID:-local-kakao-client-id}
KAKAO_CLIENT_SECRET: ${KAKAO_CLIENT_SECRET:-local-kakao-client-secret}
MAIL_USERNAME: ${MAIL_USERNAME:-local@example.com}
MAIL_PASSWORD: ${MAIL_PASSWORD:-local-mail-password}
PUBLIC_DATA_API_KEY: ${PUBLIC_DATA_API_KEY:-local-public-data-key}
EMAIL_VERIFICATION_BASE_URL: ${EMAIL_VERIFICATION_BASE_URL:-http://localhost:8082}
# 프런트에서 붙을 수 있게. 로컬에서는 쿠키를 http 로도 주고받아야 한다.
#
# 웹(3000번)에 더해 **앱의 WebView 출처**도 넣는다. 앱은 번들된 파일을 여는데 그때
# 페이지 출처가 안드로이드는 https://localhost, iOS 는 capacitor://localhost 가 된다.
# 이 값을 여기서 명시하면 CorsPolicy 의 기본값을 덮어쓰므로, 빠뜨리면 앱에서 나가는
# 모든 요청이 CORS 에서 막힌다 — 앱은 켜지는데 데이터만 안 나오는 상태가 된다.
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000,https://localhost,capacitor://localhost}
REFRESH_COOKIE_SECURE: ${REFRESH_COOKIE_SECURE:-false}
REFRESH_COOKIE_SAME_SITE: ${REFRESH_COOKIE_SAME_SITE:-Lax}
STORAGE_ROOT: /app/uploads
# 저장소 종류. local 이 기본이고, `STORAGE_TYPE=s3 docker compose --profile s3 up` 으로
# MinIO 를 함께 띄워 S3 경로를 그대로 써 볼 수 있다.
STORAGE_TYPE: ${STORAGE_TYPE:-local}
STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT:-http://minio:9000}
STORAGE_S3_BUCKET: ${STORAGE_S3_BUCKET:-carecode-uploads}
STORAGE_S3_ACCESS_KEY: ${MINIO_ROOT_USER:-carecode}
STORAGE_S3_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-carecode-local-dev}
# MinIO 는 버킷을 서브도메인으로 쓰려면 DNS 가 필요해서 켠다.
STORAGE_S3_PATH_STYLE: "true"
STORAGE_S3_REGION: ${STORAGE_S3_REGION:-ap-northeast-2}
# `SEED_SAMPLE_DATA=true docker compose up` 처럼 셸에서 넘긴 값이 컨테이너까지 가도록 명시한다.
SEED_SAMPLE_DATA: ${SEED_SAMPLE_DATA:-false}
# 업로드 악성코드 검사. `STORAGE_SCAN_ENABLED=true docker compose --profile scan up` 으로 clamav 와 함께 켠다.
STORAGE_SCAN_ENABLED: ${STORAGE_SCAN_ENABLED:-false}
CLAMD_HOST: ${CLAMD_HOST:-clamav}
volumes:
- uploads:/app/uploads
# 운영(1GB 인스턴스)과 같은 한도로 돌린다. 한도가 없으면 JVM 이 개발 PC 메모리를 기준으로
# 힙을 잡아(측정: 858MB) 운영에서만 OOM 으로 죽는 차이가 생긴다.
# 512m 에서도 뜨지만(측정 464MB) 여유가 없어 640m 로 둔다.
mem_limit: ${APP_MEMORY:-640m}
# 선택: S3 호환 오브젝트 스토리지. 로컬에서 S3 경로를 AWS 자격증명 없이 써 보기 위한 것이다.
#
# STORAGE_TYPE=s3 docker compose --profile s3 up
#
# 콘솔은 http://localhost:9001 (기본 계정 carecode / carecode-local-dev).
# 실측 메모리: 유휴 54MB, 100MB 업로드 후 66MB.
minio:
image: minio/minio:RELEASE.2024-08-29T01-40-52Z
profiles: ["s3"]
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-carecode}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-carecode-local-dev}
ports:
- "${MINIO_PORT:-9000}:9000"
- "${MINIO_CONSOLE_PORT:-9001}:9001"
volumes:
- minio-data:/data
mem_limit: ${MINIO_MEMORY:-256m}
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 3s
retries: 12
# 버킷을 한 번 만들어 주고 끝난다. 앱이 버킷을 만들지 않는 이유: 운영에서는 버킷 생성 권한을
# 주지 않는 편이 안전하고, 그러면 앱이 기동할 때마다 권한 오류를 만난다.
minio-init:
image: minio/minio:RELEASE.2024-08-29T01-40-52Z
profiles: ["s3"]
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 ${MINIO_ROOT_USER:-carecode} ${MINIO_ROOT_PASSWORD:-carecode-local-dev} &&
mc mb --ignore-existing local/${STORAGE_S3_BUCKET:-carecode-uploads} &&
echo '버킷 준비 완료'
"
# 선택: 업로드 악성코드 검사기. 시그니처 DB 를 받느라 첫 기동에 몇 분 걸리고 메모리를 1GB 넘게 쓴다.
clamav:
image: clamav/clamav:1.4
profiles: ["scan"]
ports:
- "${CLAMD_PORT:-3310}:3310"
volumes:
mariadb-data:
uploads:
minio-data: