portal/RAG_DB_FIX.md
2026-01-26 09:28:31 +08:00

3.0 KiB
Raw Blame History

RAG Server 数据库连接修复方案

问题诊断

当前错误

ERROR: cannot parse `admin_password`: failed to parse as keyword/value (invalid keyword/value)
WARN: postgres cache disabled; no database connection

根本原因

  1. DATABASE_URL 环境变量指向 Secret Manager 引用 admin_password,而不是实际的数据库连接字符串
  2. RAG 服务器无法连接到 PostgreSQL 数据库
  3. 导致 /api/rag/query 返回 404

架构说明

Cloud Run (RAG Server)
  ↓
Stunnel (127.0.0.1:5432)
  ↓ TLS Tunnel
  ↓
postgresql.onwalk.net:443
  ↓
PostgreSQL Database

修复步骤

方案 1: 使用 Stunnel (推荐)

1. 更新 Cloud Run 环境变量

gcloud run services update rag-server-svc-plus \
  --region asia-northeast1 \
  --project xzerolab-480008 \
  --set-env-vars="
DB_TLS_HOST=postgresql.onwalk.net,
DB_TLS_PORT=443,
POSTGRES_USER=postgres,
POSTGRES_PASSWORD=otdcRLTJamszk3AE,
POSTGRES_DB=knowledge_db,
NVIDIA_API_KEY=NVAPI_KEY_PLACEHOLDER"

说明:

  • DB_TLS_HOSTDB_TLS_PORT 会触发 entrypoint.sh 启动 Stunnel
  • Stunnel 会在 127.0.0.1:5432 监听
  • config/rag-server.yaml 中的 pgurl 会自动使用 127.0.0.1:5432

2. 验证配置

部署后检查日志:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=rag-server-svc-plus" \
  --limit 20 --project xzerolab-480008

应该看到:

Starting Stunnel...
Stunnel is up!

方案 2: 直接数据库连接 (不推荐,需要公网 IP)

如果 PostgreSQL 有公网 IP可以直接连接

# 更新 Secret Manager
echo "postgres://postgres:otdcRLTJamszk3AE@<PUBLIC_IP>:5432/knowledge_db?sslmode=require" | \
  gcloud secrets versions add DATABASE_URL --data-file=- --project xzerolab-480008

当前状态

工作的功能

  • /api/askai - 直接 AI 回答(不依赖数据库)
  • CORS 配置
  • NVIDIA API 集成

待修复的功能

  • /api/rag/query - RAG 检索(需要数据库连接)
  • 向量搜索
  • 知识库同步

前端行为

前端已经实现了优雅降级:

  1. 首先尝试 /api/rag/query (RAG 检索)
  2. 如果失败,回退到 /api/askai (直接 AI)
  3. 用户仍然可以获得答案,只是没有知识库上下文

建议

立即执行方案 1,因为:

  1. 安全性更好TLS 加密)
  2. 不需要暴露数据库公网 IP
  3. 符合现有架构设计
  4. entrypoint.sh 已经支持 Stunnel

部署命令

# 完整部署命令
gcloud run services update rag-server-svc-plus \
  --region asia-northeast1 \
  --project xzerolab-480008 \
  --update-env-vars="
DB_TLS_HOST=postgresql.onwalk.net,
DB_TLS_PORT=443,
POSTGRES_USER=postgres,
POSTGRES_PASSWORD=otdcRLTJamszk3AE,
POSTGRES_DB=knowledge_db,
NVIDIA_API_KEY=NVAPI_KEY_PLACEHOLDER" \
  --clear-env-vars=DATABASE_URL

注意:

  • 使用 --update-env-vars 添加新变量
  • 使用 --clear-env-vars 移除错误的 DATABASE_URL