Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
272 lines (259 loc) · 12.1 KB
/
Copy pathdocker-compose.yml
File metadata and controls
272 lines (259 loc) · 12.1 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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# edge 로컬 통합 스택 — 백엔드 API + Postgres.
#
# 목적: 백엔드 API 를 ECS Service Connect 토폴로지와 동일하게 로컬에서 재현해 테스트한다.
# (gateway 는 은퇴 — ADR-0032. 공개 엣지는 super-admin 공개화 시점 ALB 직결로 재도입.)
#
# 핵심 정합성:
# - 서비스 이름(tenant-console-api·super-admin-api·tenant-sync-api·publication-api)을
# ECS Service Connect 의 dns_name(= Terraform 모듈 name)과 '똑같이' 둔다
# → 서비스 간 호출 http://<name>:8080 이 로컬·ECS 에서 동일 동작.
# - 컨테이너 포트 8080, 빌드 컨텍스트 src/ (Dockerfile 규약과 동일).
# - Postgres 접속값(edge/edge/edge)·Flyway 는 docker-compose.schema.yml 과 일치.
# - DB 는 플레인별 2개: postgres(cloud, :55432) / postgres-onprem(온프렘, :55433,
# ADR-0011 물리 격리 재현). 로컬 시드는 cloud 쪽(seed-local-cloud — SSOT 밖)뿐이며,
# 온프렘 데이터는 동기화 경로(sync-agent→intake→screening-worker)가 실적재한다.
#
# 사용:
# docker compose up --build # 전체 기동(첫 실행은 gradle 빌드로 느림)
# docker compose up --build <service> # 특정 서비스만
# docker compose down [-v] # 정리(-v 는 DB 볼륨까지)
# scripts/up-all.sh # 백엔드(이 파일) + 콘솔 UI 2종까지 한 줄 기동 (ALPHA-516)
#
# 테스트(각 백엔드 host 포트 직접):
# curl localhost:18081/actuator/health # tenant-console-api
# curl localhost:18082/actuator/health # super-admin-api
# curl "localhost:18083/api/v1/sync/bundle?after=0" # tenant-sync-api (공통 응답 포맷 — 신규 없음은 result 생략, ADR-0042)
# curl "localhost:18085/internal/v1/bundles?after=0" # sync-agent — 무변형 릴레이(항상 200)
# docker exec edge-postgres-onprem psql -U edge -d edge_onprem -c 'TABLE sync_state' # intake 적재 확인
# curl localhost:18084/api/v1/explanations/069500 # publication-api (무헤더 — ADR-0053)
# open http://localhost:18090 # mock-broker — 가상 MTS 데모(홈·검색·종목상세 — AI 분석·시세·차트 실호출, 나머지 탭 목업)
# curl "localhost:18090/api/v1/explanations/069500" # mock-broker passthrough → publication-api (위젯 직접 호출 경로 — ADR-0053)
services:
postgres:
image: postgres:16
container_name: edge-postgres
environment:
POSTGRES_DB: edge
POSTGRES_USER: edge
POSTGRES_PASSWORD: edge
ports:
- "55432:5432" # host 55432 → schema 모듈 Flyway(gradle) 기본값과 일치
volumes:
- edge-postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U edge -d edge"]
interval: 5s
timeout: 5s
retries: 10
# SSOT 스키마(src/libs/schema)를 DB 에 적용하고 종료한다.
# 로컬 전용 시드(seed-local-cloud — SSOT 밖, CI·CD 미포함)를 함께 태운다.
flyway:
image: flyway/flyway:10.21.0
container_name: edge-flyway
depends_on:
postgres:
condition: service_healthy
volumes:
- ./src/libs/schema/migrations-cloud:/flyway/sql:ro
- ./src/libs/schema/seed-local-cloud:/flyway/seed:ro
command: >-
-url=jdbc:postgresql://postgres:5432/edge
-user=edge -password=edge
-connectRetries=10
-locations=filesystem:/flyway/sql,filesystem:/flyway/seed
migrate
# [edge-onprem] 검수 표면(Review Queue 목록·승인·반려) — 온프렘 PG 조회·전이.
tenant-console-api:
build:
context: ./src
dockerfile: apps/onprem/tenant-console-api/Dockerfile
container_name: edge-tenant-console-api
depends_on:
flyway-onprem:
condition: service_completed_successfully
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-onprem:5432/edge_onprem
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
ports:
- "18081:8080"
super-admin-api:
build:
context: ./src
dockerfile: apps/cloud/super-admin-api/Dockerfile
container_name: edge-super-admin-api
depends_on:
flyway:
condition: service_completed_successfully
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/edge
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
# 로컬 스택 전용 데모 운영자 비밀번호 — application.yaml 은 기본값을 커밋하지
# 않는다(공개 엣지 fail-closed). 로그인 화면(ALPHA-616)에서 operator@edge.local 과 짝.
ADMIN_BOOTSTRAP_OPERATOR_PASSWORD: demo-operator-1
# 로컬은 http 라 Secure 쿠키(기본 true)를 끈다 — 켜두면 브라우저가 세션
# 쿠키를 저장하지 않아 로그인이 조용히 풀린다.
SERVER_SERVLET_SESSION_COOKIE_SECURE: "false"
ports:
# 데모 자격증명이 실리는 서비스라 루프백만 바인딩 — 공유 네트워크에서
# 다른 호스트가 로그인 표면에 닿지 않게 한다.
- "127.0.0.1:18082:8080"
# [edge-onprem] 온프렘 PostgreSQL — 테넌트별 물리 격리(ADR-0011)를 컨테이너 분리로 재현.
# cloud postgres 와 절대 섞지 않는다. demo-onprem compose 추출(ALPHA-444/445)의 원형.
postgres-onprem:
image: postgres:16
container_name: edge-postgres-onprem
environment:
POSTGRES_DB: edge_onprem
POSTGRES_USER: edge
POSTGRES_PASSWORD: edge
ports:
- "55433:5432" # host 55433 → cloud(55432)와 구분
volumes:
- edge-postgres-onprem-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U edge -d edge_onprem"]
interval: 5s
timeout: 5s
retries: 10
# 온프렘 세트(migrations-onprem) 적용. 온프렘 데이터는 이제 동기화 경로가 실적재하므로
# 로컬 시드가 없다(구 seed-local-onprem 은 screening-worker 도입으로 제거 —
# ignoreMigrationPatterns 는 기존 로컬 볼륨의 히스토리에 남은 그 repeatable 항목 허용용).
# 주의: 구 시드를 적용했던 기존 볼륨은 낡은 게시 행이 grain 을 선점해 동기화 게시를 막는다
# — 이 전환에서 한 번은 `docker compose down -v` 로 볼륨을 리셋할 것.
flyway-onprem:
image: flyway/flyway:10.21.0
container_name: edge-flyway-onprem
depends_on:
postgres-onprem:
condition: service_healthy
volumes:
- ./src/libs/schema/migrations-onprem:/flyway/sql:ro
# 로컬 전용 시드(seed-local-onprem — SSOT 밖, CI·CD 미포함): 증권사 소유
# 종목 마스터(etf_instrument)가 "이미 있다"를 재현한다.
- ./src/libs/schema/seed-local-onprem:/flyway/seed:ro
command: >-
-url=jdbc:postgresql://postgres-onprem:5432/edge_onprem
-user=edge -password=edge
-connectRetries=10
-locations=filesystem:/flyway/sql,filesystem:/flyway/seed
-ignoreMigrationPatterns=repeatable:missing
migrate
# [edge-onprem] 증권사 백엔드가 호출하는 조회 표면(Published만) — 온프렘 PG 조회.
publication-api:
build:
context: ./src
dockerfile: apps/onprem/publication-api/Dockerfile
container_name: edge-publication-api
depends_on:
flyway-onprem:
condition: service_completed_successfully
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-onprem:5432/edge_onprem
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
# 상장 여부(404) 판별은 종목 마스터(etf_instrument)로 한다 — 구 PUBLICATION_KNOWN_TICKERS
# allowlist 은퇴. 로컬 유니버스는 flyway-onprem 이 태우는 seed-local-onprem 시드(38종,
# cloud 실측)가 공급하며 133690·비 ETF 미포함 — AI 탭 404(미지원 종목) 시나리오 보존.
ports:
- "18084:8080"
# [demo] 증권사 엣지 프록시 자리(mock-broker) + 가상 MTS 정적 서빙.
# 설명 조회(/api/v1/*)는 무변형 passthrough(로컬 엣지 스탠드인 — 박스에서는 CloudFront
# behavior 가 publication-api 직행, ADR-0053·ALPHA-992). 시세·차트는 /api/broker/*.
mock-broker:
build:
context: ./demo
dockerfile: mock-broker/Dockerfile
container_name: edge-mock-broker
depends_on:
- publication-api
environment:
PUBLICATION_API_URL: http://publication-api:8080
# 토스증권 Open API 키(실시간 시세) — 리포 루트 .env(gitignore)에서 주입, 미설정 시 폴백 스냅샷
TOSS_CLIENT_ID: ${TOSS_CLIENT_ID:-}
TOSS_CLIENT_SECRET: ${TOSS_CLIENT_SECRET:-}
ports:
- "18090:8080"
# Sync Agent 가 Pull 하는 Cloud 표면(ADR-0010) — tenant_delivery(outbox) DB 조회.
# gateway 를 타지 않는다(sync 전용 mTLS ALB — ADR-0034).
tenant-sync-api:
build:
context: ./src
dockerfile: apps/cloud/tenant-sync-api/Dockerfile
container_name: edge-tenant-sync-api
depends_on:
flyway:
condition: service_completed_successfully
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/edge
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
ports:
- "18083:8080"
# [edge-onprem] Sync Agent — DMZ 역할. Cloud pull + 체크섬 검증, DB 접근 없음(ADR-0036).
sync-agent:
build:
context: ./src
dockerfile: apps/onprem/sync-agent/Dockerfile
container_name: edge-sync-agent
depends_on:
- tenant-sync-api
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
TENANT_SYNC_API_URL: http://tenant-sync-api:8080
ports:
- "18085:8080"
# [edge-onprem] Intake — 내부망 역할. sync-agent 폴링 → Raw Event Store 멱등 적재.
# committed cursor(sync_state)의 권위 소유자(sync-protocol.md). 로컬은 5초 폴링(시연용).
intake:
build:
context: ./src
dockerfile: apps/onprem/intake/Dockerfile
container_name: edge-intake
depends_on:
flyway-onprem:
condition: service_completed_successfully
sync-agent:
condition: service_started
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-onprem:5432/edge_onprem
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
SYNC_AGENT_URL: http://sync-agent:8080
INTAKE_POLL_MS: "5000"
ports:
- "18086:8080"
# [edge-onprem] Screening Worker — 미점검 번들 파싱·상태 분기(state-machine.md).
# NEW=무조건 통과(AUTO_PUBLISHED)+자동 게시, INVALIDATION=즉시 비노출 (CORRECTION 은 폐지 — ADR-0044).
screening-worker:
build:
context: ./src
dockerfile: apps/onprem/screening-worker/Dockerfile
container_name: edge-screening-worker
depends_on:
flyway-onprem:
condition: service_completed_successfully
environment:
# 로컬은 default profile — 평문 로그(ALPHA-531). 배포 이미지의 ENV SPRING_PROFILES_ACTIVE=prod 를 무력화.
SPRING_PROFILES_ACTIVE: ""
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-onprem:5432/edge_onprem
SPRING_DATASOURCE_USERNAME: edge
SPRING_DATASOURCE_PASSWORD: edge
SCREENING_POLL_MS: "5000"
ports:
- "18087:8080"
volumes:
edge-postgres-data:
edge-postgres-onprem-data: