From 94453ccdaef387c1fe6bdba3d112a40c205aaa23 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Tue, 26 May 2026 15:23:17 +0900 Subject: [PATCH] =?UTF-8?q?refactor(env):=20PostgreSQL=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9D=84=20PG=5FDB=5F*=20=EB=B3=80=EC=88=98=EB=A1=9C?= =?UTF-8?q?=20=ED=86=B5=EC=9D=BC(DB=5F*=20=EB=A0=88=EA=B1=B0=EC=8B=9C=20?= =?UTF-8?q?=ED=98=B8=ED=99=98=20=EC=9C=A0=EC=A7=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- README.md | 8 +++++--- db/schema.sql | 2 +- flask_app.py | 22 +++++++++++++++------- server.js | 23 ++++++++++++++++++----- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c170d7a..796bdcc 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,11 @@ python3 -m http.server 8000 ### 1) DB 테이블 생성(서버에서 1회) ```bash -psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f db/schema.sql +psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U "$PG_DB_USER" -d "$PG_DB_NAME" -f db/schema.sql ``` +`.env`의 PostgreSQL 변수는 **`PG_DB_HOST`**, **`PG_DB_PORT`**, **`PG_DB_NAME`**, **`PG_DB_USER`**, **`PG_DB_PASSWORD`** 입니다. (선택: `PG_DB_SSLMODE`, `PG_DB_CONNECT_TIMEOUT`). 배포 마이그레이션 동안 레거시 `DB_*` 이름도 같은 값으로 한동안 읽힐 수 있습니다. + ### 2) 실행 방법 A: (로컬/간단) venv로 실행 ```bash @@ -95,8 +97,8 @@ RestartSec=3 EnvironmentFile=/path/to/home/.env # (선택) DB 연결 옵션(문제 발생 시 조정) -Environment=DB_SSLMODE=prefer -Environment=DB_CONNECT_TIMEOUT=5 +Environment=PG_DB_SSLMODE=prefer +Environment=PG_DB_CONNECT_TIMEOUT=5 [Install] WantedBy=multi-user.target diff --git a/db/schema.sql b/db/schema.sql index 22c9546..ef2b933 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -1,5 +1,5 @@ -- NCUE user table for admin gating / auditing --- Run: psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -f db/schema.sql +-- Run: psql -h "$PG_DB_HOST" -p "$PG_DB_PORT" -U "$PG_DB_USER" -d "$PG_DB_NAME" -f db/schema.sql DO $$ BEGIN diff --git a/flask_app.py b/flask_app.py index 1fb6558..4fc09f8 100644 --- a/flask_app.py +++ b/flask_app.py @@ -56,13 +56,21 @@ def email_from_id_token_payload(payload: dict) -> Optional[str]: PORT = int(env("PORT", "8023") or "8023") -DB_HOST = env("DB_HOST", "").strip() -DB_PORT = int(env("DB_PORT", "5432") or "5432") -DB_NAME = env("DB_NAME", "").strip() -DB_USER = env("DB_USER", "").strip() -DB_PASSWORD = env("DB_PASSWORD", "").strip() -DB_SSLMODE = env("DB_SSLMODE", "prefer").strip() or "prefer" -DB_CONNECT_TIMEOUT = int(env("DB_CONNECT_TIMEOUT", "5") or "5") +def _env_pg(name_primary: str, name_legacy: str, default: str = "") -> str: + """Read PG_DB_* ; fall back to legacy DB_* for one-off migrations.""" + v = env(name_primary, "").strip() + if v: + return v + return str(env(name_legacy, default) or "").strip() + + +DB_HOST = _env_pg("PG_DB_HOST", "DB_HOST").strip() +DB_PORT = int(_env_pg("PG_DB_PORT", "DB_PORT", "5432") or "5432") +DB_NAME = _env_pg("PG_DB_NAME", "DB_NAME").strip() +DB_USER = _env_pg("PG_DB_USER", "DB_USER").strip() +DB_PASSWORD = _env_pg("PG_DB_PASSWORD", "DB_PASSWORD").strip() +DB_SSLMODE = _env_pg("PG_DB_SSLMODE", "DB_SSLMODE", "prefer").strip() or "prefer" +DB_CONNECT_TIMEOUT = int(_env_pg("PG_DB_CONNECT_TIMEOUT", "DB_CONNECT_TIMEOUT", "5") or "5") TABLE = safe_ident(env("TABLE", "ncue_user") or "ncue_user") CONFIG_TABLE = "ncue_app_config" diff --git a/server.js b/server.js index 2546cd6..714b2fa 100644 --- a/server.js +++ b/server.js @@ -36,6 +36,13 @@ function parseEmailCsv(s) { return parseCsv(s).map((x) => x.toLowerCase()); } +/** Prefer PG_DB_* env ; fall back to legacy DB_* for migrations. */ +function pgEnv(primary, legacy, fallback = "") { + const v = String(env(primary, "")).trim(); + if (v) return v; + return String(env(legacy, fallback)).trim(); +} + /** Prefer `email`; also Auth0-style namespaced claims ending with `/email`. */ function emailFromIdTokenPayload(payload) { const e = payload?.email; @@ -50,12 +57,18 @@ function emailFromIdTokenPayload(payload) { return null; } +function mustPg(primary, legacy) { + const v = pgEnv(primary, legacy); + if (!v) throw new Error(`Missing env: ${primary}${legacy ? ` or ${legacy}` : ""}`); + return v; +} + const PORT = Number(env("PORT", "8000")) || 8000; -const DB_HOST = must("DB_HOST"); -const DB_PORT = Number(env("DB_PORT", "5432")) || 5432; -const DB_NAME = must("DB_NAME"); -const DB_USER = must("DB_USER"); -const DB_PASSWORD = must("DB_PASSWORD"); +const DB_HOST = mustPg("PG_DB_HOST", "DB_HOST"); +const DB_PORT = Number(pgEnv("PG_DB_PORT", "DB_PORT", "5432")) || 5432; +const DB_NAME = mustPg("PG_DB_NAME", "DB_NAME"); +const DB_USER = mustPg("PG_DB_USER", "DB_USER"); +const DB_PASSWORD = mustPg("PG_DB_PASSWORD", "DB_PASSWORD"); const TABLE = safeIdent(env("TABLE", "ncue_user") || "ncue_user"); const CONFIG_TABLE = "ncue_app_config"; const CONFIG_TOKEN = env("CONFIG_TOKEN", "").trim();