# RTGS 컨테이너 배포 (deploy/)

RTGS 3센터 A-A-A 풀스택을 컨테이너로 기동하는 산출물. **로컬 native 실행(`run-*.cmd`)과 별개**이며, Docker/podman 호스트(사내 **Coder** 워크스페이스 등)에서 사용한다.

> ⚠️ 이 산출물은 **Coder(podman)에서 빌드·검증**한다. 개발 로컬 PC는 가상화 차단으로 Docker가 없어 여기서 build/up 불가 — 파일 정합성만 로컬 검증됨.

## 구성
| 파일 | 역할 |
|---|---|
| `Dockerfile.backend` | 7개 서비스 공용 이미지(멀티스테이지 gradle 빌드). `SERVICE` env로 실행 서비스 선택 |
| `Dockerfile.frontend` + `nginx.conf` | 콘솔+DT 정적 빌드 → nginx 서빙 + API 리버스프록시(센터 라우팅) |
| `docker-compose.yml` | PostgreSQL(3DB) + Kafka + 순번기 + DC1/DC2/DC3 각 6서비스 + 프론트 |
| `init/init-3centers.sql` | rtgs_dc1/2/3 DB 생성(스키마·시드는 각 센터 LouisVuitton Flyway) |

포트 오프셋 없음(컨테이너 격리) — service name으로 구분. 센터 간 통신은 `CHANEL_URL=http://dcN-chanel:8091`, `KAFKA_BOOTSTRAP=kafka:9092`, `POSTGRES_HOST=postgres` 로 연결.

## 기동 (Coder에서)
```bash
# 저장소 clone (Gitea 토큰 인증) 후 프로젝트 루트에서:
docker compose -f deploy/docker-compose.yml up --build -d
docker compose -f deploy/docker-compose.yml ps      # 헬스 확인(전 서비스 healthy까지 1~2분)
```
- 접속: 콘솔 `http://<host>:8080/`, 단말(DT) `http://<host>:8080/dt.html`
- 검증(로컬에서 통과한 기준 동일):
  1. DT에서 이체 → RCVD → ACCC
  2. 콘솔 상단 "모니터링 센터" DC1/DC2/DC3 전환 → **📈 보고서 완전 동일**(거래·금액·대사·기관별)
  3. 정족수: `dc3-hermes` 중지해도 ACCC(2/3) — `docker compose stop dc3-hermes`
- 직접 확인용 호스트 포트: LV `8099/8199/8299`, Gucci `8095/8195/8295`

## Gitea push (Coder 내부)
```bash
git remote add origin https://gitea.bokdev.in/playground/rtgs.git   # 서버 프로젝트명은 "POC", 저장소는 rtgs
git push -u origin main    # 자격증명 프롬프트 시 Gitea 개인 액세스 토큰(repo read/write)
```
> 로컬 PC 셸에서는 gitea.bokdev.in 미도달(사내망) — **push/배포는 Coder 안에서**. (ACS도 동일)

## Coolify/Kubero 어댑테이션 (플랫폼 정책 확인 필요)
ACS는 "**단일 Node 컨테이너 + 플랫폼 관리형 PostgreSQL(자체 DB 컨테이너 금지)**" 정책이었다. RTGS는 Kafka + 다중 JVM + 3 DB라 그 틀과 다르므로 **인프라팀 확인 필수**:
- **Coolify가 docker-compose(다중 컨테이너) 리소스를 허용**하면 → 본 compose를 그대로 Public Repository + Compose로 등록.
- **관리형 PostgreSQL 강제** 시 → `postgres` 서비스 제거, 각 서비스 env를 플랫폼 제공 `DATABASE_URL`(또는 `POSTGRES_HOST/PORT/USER/PASSWORD`)로 교체. 단 3개 논리 DB(rtgs_dc1/2/3)가 필요하므로 관리형 인스턴스에 DB 3개 생성 권한 필요.
- **Kafka 미지원** 시 → 관리형 메시징 대체 또는 별도 배치 협의(저널 = 설계 핵심이라 제거 불가).
- 도메인: `https://rtgs.apps.bokdev.in`(포털 등록값) 또는 매뉴얼상 `*.apps.bokdev.in`.

## 주의 (ACS 시행착오 반영)
- 헬스체크용 `curl`을 런타임 이미지에 포함(미포함 시 Coolify healthcheck 실패).
- 저장소는 `playground` 조직(개인 네임스페이스 금지).
- Kafka 저널은 **단일 파티션**(전역순서) — `KAFKA_NUM_PARTITIONS=1` 유지.
- PostgreSQL `max_connections=300`(19서비스 커넥션). 관리형 DB면 동등 이상 확인.
