Repository navigation
Expand file tree
/
Copy pathcompose.prod.yml
More file actions
93 lines (90 loc) · 3.79 KB
/
Copy pathcompose.prod.yml
File metadata and controls
93 lines (90 loc) · 3.79 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
# 배포용 override (prod·staging 공통, PROFILE 로 갈린다).
# docker compose -f compose.yml -f compose.prod.yml up -d --remove-orphans
services:
db:
container_name: csereal_db_container
volumes:
# 상대경로여야 한다. prod 는 waffle, staging 은 ubuntu 라 홈이 다르고,
# 절대경로를 두면 한쪽에 없는 경로가 만들어져 빈 DB 가 뜬다.
- ${DB_DATA_DIR:-../database/db}:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 30
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"
restart: always
search:
container_name: csereal_search
image: "csereal-search:${SEARCH_TAG:?ops/host-deploy.sh 가 .env 에 써 넣는다}"
# 앱이 기동할 때마다 전체 재색인.
healthcheck:
retries: 30
start_period: 90s
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"
restart: always
backend:
container_name: csereal_server
# 커밋 해시 태그. 롤백은 .env 의 IMAGE_TAG 를 옛 값으로 바꾸고 up -d 하면 된다.
image: "csereal-server:${IMAGE_TAG:?ops/host-deploy.sh 가 .env 에 써 넣는다}"
volumes:
- ./cse-files:/app/cse-files
- ./files:/app/files
- ./logs:/app/logs
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"
environment:
SPRING_PROFILES_ACTIVE: ${PROFILE}
SPRING_ELASTICSEARCH_URIS: http://search:9200
# 같은 프로젝트라 서비스 이름으로 붙는다.
SPRING_DATASOURCE_URL: "jdbc:mysql://db:3306/${MYSQL_DATABASE}?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true"
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET}
URL: ${URL}
# restart: always 는 프로세스가 종료될 때만 듣는다. JVM 이 살아 있으면서 응답만
# 안 하는 경우는 이 헬스체크와 아래 autoheal 이 잡는다.
# ⚠️ start_period 를 줄이지 말 것 — Docker 는 이 기간의 실패를 세지 않는다.
# 짧으면 Flyway 마이그레이션 중에 재시작이 걸려 crash loop 가 된다.
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8080/api/helloworld"]
interval: 30s
timeout: 5s
retries: 3
start_period: 180s
# autoheal 이 이 라벨을 보고 재시작한다. Docker 는 표시만 하고 재시작해 주지 않는다.
labels:
autoheal: "true"
restart: always
autoheal:
image: willfarrell/autoheal:1.2.0
container_name: csereal_autoheal
environment:
AUTOHEAL_CONTAINER_LABEL: autoheal
AUTOHEAL_INTERVAL: 30
# 자기가 막 떴을 때 성급히 손대지 않게. 컨테이너별 유예는 start_period 가 맡는다.
AUTOHEAL_START_PERIOD: 60
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"