From bd1f94dd72f9bd64bec38ad9cc98c1cb167a53be Mon Sep 17 00:00:00 2001 From: OG T Date: Mon, 23 Mar 2026 23:13:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(worker):=20=E5=88=9D=E5=A7=8B=E5=8C=96=20Po?= =?UTF-8?q?stgreSQL=20=E9=80=A3=E7=B7=9A=E6=B1=A0=20-=20=E4=BF=AE=E5=BE=A9?= =?UTF-8?q?=20Incident=20DB=20=E6=8C=81=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 問題: - Signal Worker 沒有初始化 PostgreSQL,導致 incidents 表可能不存在 - Incident 只寫入 Redis,未持久化到 PostgreSQL - 審核後無法正確更新 DB 狀態 修復: - 在 Signal Worker 啟動時呼叫 init_db() 建立表 - 在關閉時呼叫 close_db() 釋放連線池 - 增加 PostgreSQL 初始化日誌 Co-Authored-By: Claude Opus 4.5 --- apps/api/src/workers/signal_worker.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/api/src/workers/signal_worker.py b/apps/api/src/workers/signal_worker.py index 22d6156b..f2d04b6b 100644 --- a/apps/api/src/workers/signal_worker.py +++ b/apps/api/src/workers/signal_worker.py @@ -326,17 +326,30 @@ async def _main() -> None: # Initialize settings first (loads env vars) from src.core.config import settings # noqa: F401 from src.core.redis_client import init_redis_pool, close_redis_pool, init_worker_redis_pool, close_worker_redis_pool + from src.db.base import init_db, close_db logger.info( "signal_worker_standalone_starting", environment=settings.ENVIRONMENT, redis_url=settings.REDIS_URL.split("@")[-1] if settings.REDIS_URL else "N/A", + database_url=settings.DATABASE_URL.split("@")[-1] if settings.DATABASE_URL else "N/A", ) # Initialize Redis (API pool + Worker 專屬長連線池) await init_redis_pool() await init_worker_redis_pool() # Worker 專屬,無超時限制 + # Initialize PostgreSQL (Episodic Memory) - 確保 incidents 表存在 + try: + await init_db() + logger.info("postgresql_initialized", status="ok") + except Exception as e: + logger.error( + "postgresql_init_failed", + error=str(e), + message="Episodic Memory (DB) will be unavailable - incidents won't persist", + ) + # Write health files for K8s probes await _write_health_files() @@ -361,6 +374,7 @@ async def _main() -> None: await worker.stop() await close_worker_redis_pool() # 關閉 Worker 專屬連線 await close_redis_pool() + await close_db() # 關閉 PostgreSQL 連線池 # Remove health files from pathlib import Path