refactor(env): PostgreSQL 설정을 PG_DB_* 변수로 통일(DB_* 레거시 호환 유지)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -33,9 +33,11 @@ python3 -m http.server 8000
|
|||||||
### 1) DB 테이블 생성(서버에서 1회)
|
### 1) DB 테이블 생성(서버에서 1회)
|
||||||
|
|
||||||
```bash
|
```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로 실행
|
### 2) 실행 방법 A: (로컬/간단) venv로 실행
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -95,8 +97,8 @@ RestartSec=3
|
|||||||
EnvironmentFile=/path/to/home/.env
|
EnvironmentFile=/path/to/home/.env
|
||||||
|
|
||||||
# (선택) DB 연결 옵션(문제 발생 시 조정)
|
# (선택) DB 연결 옵션(문제 발생 시 조정)
|
||||||
Environment=DB_SSLMODE=prefer
|
Environment=PG_DB_SSLMODE=prefer
|
||||||
Environment=DB_CONNECT_TIMEOUT=5
|
Environment=PG_DB_CONNECT_TIMEOUT=5
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
-- NCUE user table for admin gating / auditing
|
-- 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 $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|||||||
22
flask_app.py
22
flask_app.py
@@ -56,13 +56,21 @@ def email_from_id_token_payload(payload: dict) -> Optional[str]:
|
|||||||
|
|
||||||
PORT = int(env("PORT", "8023") or "8023")
|
PORT = int(env("PORT", "8023") or "8023")
|
||||||
|
|
||||||
DB_HOST = env("DB_HOST", "").strip()
|
def _env_pg(name_primary: str, name_legacy: str, default: str = "") -> str:
|
||||||
DB_PORT = int(env("DB_PORT", "5432") or "5432")
|
"""Read PG_DB_* ; fall back to legacy DB_* for one-off migrations."""
|
||||||
DB_NAME = env("DB_NAME", "").strip()
|
v = env(name_primary, "").strip()
|
||||||
DB_USER = env("DB_USER", "").strip()
|
if v:
|
||||||
DB_PASSWORD = env("DB_PASSWORD", "").strip()
|
return v
|
||||||
DB_SSLMODE = env("DB_SSLMODE", "prefer").strip() or "prefer"
|
return str(env(name_legacy, default) or "").strip()
|
||||||
DB_CONNECT_TIMEOUT = int(env("DB_CONNECT_TIMEOUT", "5") or "5")
|
|
||||||
|
|
||||||
|
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")
|
TABLE = safe_ident(env("TABLE", "ncue_user") or "ncue_user")
|
||||||
CONFIG_TABLE = "ncue_app_config"
|
CONFIG_TABLE = "ncue_app_config"
|
||||||
|
|||||||
23
server.js
23
server.js
@@ -36,6 +36,13 @@ function parseEmailCsv(s) {
|
|||||||
return parseCsv(s).map((x) => x.toLowerCase());
|
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`. */
|
/** Prefer `email`; also Auth0-style namespaced claims ending with `/email`. */
|
||||||
function emailFromIdTokenPayload(payload) {
|
function emailFromIdTokenPayload(payload) {
|
||||||
const e = payload?.email;
|
const e = payload?.email;
|
||||||
@@ -50,12 +57,18 @@ function emailFromIdTokenPayload(payload) {
|
|||||||
return null;
|
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 PORT = Number(env("PORT", "8000")) || 8000;
|
||||||
const DB_HOST = must("DB_HOST");
|
const DB_HOST = mustPg("PG_DB_HOST", "DB_HOST");
|
||||||
const DB_PORT = Number(env("DB_PORT", "5432")) || 5432;
|
const DB_PORT = Number(pgEnv("PG_DB_PORT", "DB_PORT", "5432")) || 5432;
|
||||||
const DB_NAME = must("DB_NAME");
|
const DB_NAME = mustPg("PG_DB_NAME", "DB_NAME");
|
||||||
const DB_USER = must("DB_USER");
|
const DB_USER = mustPg("PG_DB_USER", "DB_USER");
|
||||||
const DB_PASSWORD = must("DB_PASSWORD");
|
const DB_PASSWORD = mustPg("PG_DB_PASSWORD", "DB_PASSWORD");
|
||||||
const TABLE = safeIdent(env("TABLE", "ncue_user") || "ncue_user");
|
const TABLE = safeIdent(env("TABLE", "ncue_user") || "ncue_user");
|
||||||
const CONFIG_TABLE = "ncue_app_config";
|
const CONFIG_TABLE = "ncue_app_config";
|
||||||
const CONFIG_TOKEN = env("CONFIG_TOKEN", "").trim();
|
const CONFIG_TOKEN = env("CONFIG_TOKEN", "").trim();
|
||||||
|
|||||||
Reference in New Issue
Block a user