-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
123 lines (110 loc) · 5.23 KB
/
Copy pathdocker-compose.yml
File metadata and controls
123 lines (110 loc) · 5.23 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
# 로컬 실행용 구성. `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}
# 프런트(CareCode_FE, 3000번)에서 붙을 수 있게. 로컬에서는 쿠키를 http 로도 주고받아야 한다.
CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000}
REFRESH_COOKIE_SECURE: ${REFRESH_COOKIE_SECURE:-false}
REFRESH_COOKIE_SAME_SITE: ${REFRESH_COOKIE_SAME_SITE:-Lax}
STORAGE_ROOT: /app/uploads
# `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}
# 선택: 업로드 악성코드 검사기. 시그니처 DB 를 받느라 첫 기동에 몇 분 걸리고 메모리를 1GB 넘게 쓴다.
clamav:
image: clamav/clamav:1.4
profiles: ["scan"]
ports:
- "${CLAMD_PORT:-3310}:3310"
volumes:
mariadb-data:
uploads: