refactor(api): TOML 配置 SSOT、统一错误契约、Auth/事务加固与可观测性 (#33)

配置 SSOT(TOML + .env)
统一错误契约
Auth 与事务边界
Redis / Celery 可靠性:业务 Redis(DB/0)与 Celery broker/backend(DB/1)显式拆分;连接池、sync client
可观测性(OpenTelemetry + LGTM)
This commit is contained in:
Sully
2026-05-22 13:44:50 +08:00
committed by GitHub
parent f09ae248f9
commit 53e0065e3e
298 changed files with 15247 additions and 4344 deletions

View File

@@ -1,187 +1,31 @@
# =============================================================================
# Life Echo API — staging(预发)
#
# 基于 .env.production 生成staging 发布时 workflow 会上传并复制为运行时 .env。
# 不要把生产密钥误填进本文件(当前与 production 共用同一套三方密钥)。
# =============================================================================
# Life Echo API — staging secrets运行时 .env
# 非密钥项见 config/staging.toml
# =============================================================================
# Docker Compose宿主机独立 Caddy 反代到本 API
# =============================================================================
LIFE_ECHO_API_HOST_BIND=0.0.0.0
LIFE_ECHO_API_HOST_PORT=8000
POSTGRES_HOST_PORT=15432
# =============================================================================
# Loggingloguru sink 最低级别TRACE / DEBUG / INFO / WARNING / ERROR / CRITICAL
# =============================================================================
LOG_LEVEL=INFO
# Agent 单行 INFO 摘要;与 LOG_LEVEL 独立
# LOG_AGENT_VERBOSE=0
# DEBUG 下预览上限(默认 40960=全文
# AGENT_LOG_MAX_CHARS=4096
# DEBUG 下 *.promptpreview | hash_only
# AGENT_LOG_PROMPT_MODE=preview
# AGENT_LOG_PROMPT_DEDUP=0
# DEBUG 下访谈/资料:省略 SystemMessage 正文(仅 total_len+sha120/false=打出全文
# AGENT_LOG_OMIT_SYSTEM_MESSAGE_BODY=1
# DEBUG 下超长单段 *.prompt先跳过前 N 字符再预览
# AGENT_LOG_JSON_PROMPT_PREFIX_CHARS=0
# AGENT_LOG_JSON_PROMPT_PREFIX_ONLY_IF_LEN_GT=4000
# 第三方 stdlib logging空=自动)
# CELERY_LOG_LEVEL=
# HTTPX_LOG_LEVEL=
# =============================================================================
# OpenTelemetry预发compose 接入 LGTM 后设 OTEL_ENABLED=true见 docs/observability.md
# API/Celery 容器内 endpoint 用服务名Grafana 宿主机端口见 observability compose默认 48300 等)
# =============================================================================
OTEL_ENABLED=false
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
OTEL_EXPORTER_OTLP_INSECURE=true
OTEL_SERVICE_NAME=life-echo-api
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1
# OTEL_METRIC_EXPORT_INTERVAL_MS=10000
# =============================================================================
# LLM / DeepSeek
# =============================================================================
DEEPSEEK_API_KEY=sk-09f17fb61c5a4299a3afc2a01de7af75
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-v4-flash
# =============================================================================
# Memory 向量(智谱 BigModel 国内 embedding-3与 DeepSeek/OpenAI 用途分离)
# =============================================================================
ZHIPU_API_KEY=524eda18eb3848e881eefe4c7ef17ec2.xBmGUabYDEa44m3M
EMBEDDING_MODEL=embedding-3
# Chat 访谈
CHAT_ERA_CONTEXT_ENABLED=true
CHAT_INTERVIEW_PERSONA=warm_listener
CHAT_INTERVIEW_TEMPERATURE=0.65
CHAT_MEMORY_TOP_K=4
CHAT_MEMORY_EVIDENCE_MAX_CHARS=1400
CHAT_REPLY_PLANNER_LLM_ENABLED=true
# Memoir叙事前口述归一
MEMOIR_ORAL_NORMALIZE_ENABLED=true
MEMOIR_ORAL_NORMALIZE_MODE=llm
MEMOIR_ORAL_NORMALIZE_LLM_MAX_TOKENS=512
MEMOIR_ORAL_NORMALIZE_LLM_MAX_INPUT_CHARS=8000
# =============================================================================
# Database
# =============================================================================
APP_ENV=staging
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
# =============================================================================
# Redis
# =============================================================================
# Redis业务 DB/0Celery 自动 DB/1compose redis 使用 REDIS_PASSWORD 作为 requirepass
REDIS_URL=redis://redis:6379/0
REDIS_SESSION_TTL=86400
REDIS_PASSWORD=replace_with_strong_redis_password
# CELERY_REDIS_URL=redis://:replace_with_strong_redis_password@redis:6379/1
FLOWER_USER=admin
FLOWER_PASSWORD=replace_with_strong_flower_password
# =============================================================================
# Memory compaction
# =============================================================================
MEMORY_COMPACTION_ENABLED=true
# =============================================================================
# Auth
# =============================================================================
SECRET_KEY=cf47555c7ecbe5ddb7fd2113c59e08a8bcb110810c42f7c644e06a5acc898608
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=120
APP_ENV=staging
MOCK_SMS_LOGIN_ENABLED=1
# =============================================================================
# Tencent Cloud — 短信
# =============================================================================
TENCENT_SMS_SECRET_ID=AKIDa2ILCwUr56uVt31oU0JOHxPfGhvvkLiq
TENCENT_SMS_SECRET_KEY=xiFbjlZ9XheS2NWYLvHRPAh2A5nGYcR2
TENCENT_SMS_SDK_APP_ID=1401010099
TENCENT_SMS_SIGN_NAME=上海华嘎科技有限公司
TENCENT_SMS_TEMPLATE_ID=2592163
TENCENT_SMS_TEMPLATE_PARAM_COUNT=1
DEEPSEEK_API_KEY=sk-09f17fb61c5a4299a3afc2a01de7af75
ZHIPU_API_KEY=524eda18eb3848e881eefe4c7ef17ec2.xBmGUabYDEa44m3M
# =============================================================================
# ASR Providerwhisper | tencent
# =============================================================================
ASR_PROVIDER=tencent
# =============================================================================
# Whisper ASRASR_PROVIDER=whisper 时使用)
# =============================================================================
ASR_MODEL_SIZE=small
ASR_DEVICE=cpu
ASR_COMPUTE_TYPE=int8
# =============================================================================
# Tencent Cloud — 一句话 ASR + TTS
# =============================================================================
TENCENT_SECRET_ID=AKIDa2ILCwUr56uVt31oU0JOHxPfGhvvkLiq
TENCENT_SECRET_KEY=xiFbjlZ9XheS2NWYLvHRPAh2A5nGYcR2
# =============================================================================
# TTS
# =============================================================================
ENABLE_TTS=true
TTS_PROVIDER=tencent
TTS_VOICE_TYPE=501004
TTS_CODEC=mp3
# =============================================================================
# WeChat Pay
# =============================================================================
WECHAT_PAY_APP_ID=wx1df508452e06cfb8
WECHAT_PAY_MCH_ID=1662979099
WECHAT_PAY_API_V3_KEY=xjvGSJLGJAJfjgskfjslafjsajsdjals
WECHAT_PAY_PRIVATE_KEY_PATH=certs/apiclient_key.pem
WECHAT_PAY_CERT_SERIAL_NO=1AA82328AC1456C6F115B014606F22CD621D2032
WECHAT_PAY_NOTIFY_URL=https://lifecho.worldsplats.com/api/payment/notify/wechat
# =============================================================================
# Alipay未接入时保持空字符串
# =============================================================================
ALIPAY_APP_ID=
ALIPAY_PRIVATE_KEY=
ALIPAY_PUBLIC_KEY=
ALIPAY_NOTIFY_URL=https://lifecho.worldsplats.com/api/payment/notify/alipay
# =============================================================================
# Misc
# =============================================================================
ENABLE_TEST_SUBSCRIPTION=1
# =============================================================================
# Memoir image generation
# =============================================================================
MEMOIR_IMAGE_ENABLED=true
MEMOIR_IMAGE_POLL_INTERVAL=3
MEMOIR_IMAGE_MAX_ATTEMPTS=20
MEMOIR_IMAGE_PROVIDER=liblib
MEMOIR_IMAGE_STYLE_DEFAULT=watercolor
MEMOIR_IMAGE_SIZE_DEFAULT=1280x720
MEMOIR_MIN_INLINE_IMAGES_FOR_CHAPTER_COVER=1
STORY_IMAGE_MIN_BODY_CHARS=800
MEMOIR_NARRATIVE_FALLBACK_BODY_RATIO=0.5
MEMOIR_NARRATIVE_FALLBACK_MIN_CHARS=20
# =============================================================================
# Liblib image provider
# =============================================================================
LIBLIB_ACCESS_KEY=zrDp6quCOKlLwcewOEfrog
LIBLIB_SECRET_KEY=iTVHo5Nf3KA-xpC1Mja80bC93u6chJem
LIBLIB_BASE_URL=https://openapi.liblibai.cloud
LIBLIB_TEMPLATE_UUID=5d7e67009b344550bc1aa6ccbfa1d7f4
# =============================================================================
# Tencent Cloud — COS回忆录图片存储
# =============================================================================
TENCENT_COS_SECRET_ID=AKIDa2ILCwUr56uVt31oU0JOHxPfGhvvkLiq
TENCENT_COS_SECRET_KEY=xiFbjlZ9XheS2NWYLvHRPAh2A5nGYcR2
TENCENT_COS_REGION=ap-shanghai
TENCENT_COS_BUCKET=life-echo-dev-1319381411
TENCENT_COS_BASE_URL=https://life-echo-dev-1319381411.cos.ap-shanghai.myqcloud.com
INTERNAL_EVAL_API_KEY=