From d030a2b7b0e332c27e2325954d65258a3b14afba Mon Sep 17 00:00:00 2001 From: hyungi Date: Mon, 29 Jun 2026 13:03:43 +0900 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20fresh-DB/DR=20=EB=B6=80=ED=8C=85?= =?UTF-8?q?=20=E2=80=94=20postgres=20initdb.d=20=EB=A7=88=EC=9A=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빈 볼륨 첫 기동 시 postgres 가 migrations/*.sql 을 psql autocommit 으로 실행해 스키마는 만들되 schema_migrations 스탬프를 안 남김 → fastapi init_db 가 documents 존재로 'fresh' 오판해 baseline 로드를 건너뛰고 001 부터 재replay → CREATE TABLE users(IF NOT EXISTS 없음) 충돌 → DR/신규환경 부팅 크래시. fresh-boot 을 init_db 의 baseline + migration runner 단일 경로로 일원화. 기존 prod 볼륨은 비어있지 않아 init scripts 미발동 = 무영향. 관련 docs 정정. Co-Authored-By: Claude Opus 4.8 (1M context) --- docker-compose.yml | 8 +++++++- docs/architecture.md | 2 +- docs/storage_layout.md | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index d00f044..2e6e86b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,13 @@ services: image: pgvector/pgvector:pg16 volumes: - pgdata:/var/lib/postgresql/data - - ./migrations:/docker-entrypoint-initdb.d + # ★ 2026-06-29 fresh-DB/DR 부팅 fix: initdb.d 마운트 제거(기존 `./migrations:/docker-entrypoint-initdb.d`). + # 빈 볼륨 첫 기동 시 postgres 엔트리포인트가 migrations/*.sql(001~) 을 psql autocommit 으로 실행해 + # 스키마는 만들되 schema_migrations 스탬프는 안 남김(runner 만 생성) → fastapi init_db 가 documents + # 존재로 'fresh' 를 오판해 baseline(_load_baseline_if_fresh) 로드를 건너뛰고, 빈 schema_migrations + # 로 001 부터 재replay → `CREATE TABLE users`(IF NOT EXISTS 없음) 충돌 → 부팅 크래시(DR/신규환경). + # fresh-boot 은 init_db 의 baseline 적재 + migration runner 단일 경로로 일원화(설계 의도). 기존 prod + # 볼륨은 비어있지 않아 init scripts 가 애초에 미발동 → 무영향. environment: POSTGRES_DB: pkm POSTGRES_USER: pkm diff --git a/docs/architecture.md b/docs/architecture.md index 556f67f..d2e3e42 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1094,7 +1094,7 @@ services: image: pgvector/pgvector:pg16 volumes: - pgdata:/var/lib/postgresql/data - - ./migrations:/docker-entrypoint-initdb.d + # initdb.d 마운트 제거(2026-06-29): fresh-boot 은 fastapi init_db+baseline 단일 경로. environment: POSTGRES_DB: pkm POSTGRES_USER: pkm diff --git a/docs/storage_layout.md b/docs/storage_layout.md index 4e8f0ae..e904089 100644 --- a/docs/storage_layout.md +++ b/docs/storage_layout.md @@ -71,7 +71,7 @@ GPU 서버의 NFS mount (`/proc/mounts` 실측): | 컨테이너 | 마운트 | 모드 | 비고 | |---|---|---|---| -| postgres | `pgdata:/var/lib/postgresql/data` + `./migrations:/docker-entrypoint-initdb.d` | rw | DB 본체 named volume | +| postgres | `pgdata:/var/lib/postgresql/data` | rw | DB 본체 named volume (initdb.d 마운트는 2026-06-29 제거 — 아래 관찰) | | kordoc-service | `${NAS}/Document_Server:/documents` | **ro** | PDF/HWP parse | | ocr-service | `${NAS}/Document_Server:/documents` + `ocr_models:/root/.cache` | **ro** + rw | | | marker-service | `${NAS}/Document_Server:/documents` + `marker_models:/models` | **ro** + rw | PDF→markdown | @@ -84,7 +84,7 @@ GPU 서버의 NFS mount (`/proc/mounts` 실측): **관찰**: - worker 컨테이너 (kordoc/ocr/marker/stt) 는 모두 NAS **read-only** 마운트 → 원본 안전. - fastapi 만 NAS **rw** → 업로드/preview/extracted_images 쓰기 단일 책임. -- `./migrations` 이 postgres 의 `docker-entrypoint-initdb.d` 와 fastapi 의 `/app/migrations` 양쪽에 마운트. 단 실제 migration runner 는 fastapi `init_db()` 만 사용 (postgres init scripts 는 첫 생성 시만 실행 → 효과 X, 안전). +- `./migrations` 은 fastapi 의 `/app/migrations` 에만 마운트. migration runner 는 fastapi `init_db()` 단일 경로. (~2026-06-29: postgres `docker-entrypoint-initdb.d` 마운트 제거. 기존엔 "첫 생성 시만 실행 → 효과 X" 로 봤으나, 빈 볼륨 첫 기동 시 postgres 가 migrations/*.sql 을 실제 실행해 스키마는 만들되 schema_migrations 스탬프를 안 남겨 → init_db 의 baseline fresh 판정을 깨고 부팅 크래시 유발. fresh-DB/DR 부팅을 init_db+baseline 단일 경로로 일원화.) ## 정책 정리