Files
diary-news/.env.example
xiaji a81b373b8b chore(tz): 时区统一为 Asia/Shanghai
仓库里有两处时区声明写成 Asia/Hong_Kong,虽然跟 Shanghai
都是 UTC+8 在 C 库时区行为上一致(无夏令时),但:
- VPS 物理位置虽然在香港,本机 /etc/localtime 已指向 Shanghai
- 配置文件/默认值/示例 env 写成 Shanghai 更准确反映项目
  实际部署位置
- /etc/timezone 文件本机之前是 Etc/UTC 跟 timedatectl 不一致
  (本次单独在服务器上同步,不入 commit — 是运维状态)

改动:
- .env.example: TZ Asia/Hong_Kong -> Asia/Shanghai
- backend/app/config.py: settings.tz 默认值 Asia/Hong_Kong
  -> Asia/Shanghai(只有日志打了一下,不影响实际行为)

不影响:
- 生产 .env 文件没动(里面有 JWT_SECRET 等真实值,不该入库;
  新机器按 .env.example 复制出来就是 Shanghai)
- docker-compose.yml 不动 — api/worker service 用 env_file: .env
  模式,TZ 已经自动注入容器(验证过 TZ=Asia/Hong_Kong 在容器内可见)
- 应用代码所有 datetime.now() 都是 naive datetime,实际行为
  不变(数据库存的是 UTC 绝对时刻,PG TIMESTAMPTZ 转换正确)
- 文档/README 不动 — line 4 写"香港 VPS"是物理位置描述,
  时区是上海,两者并存(都是 UTC+8)不矛盾
2026-06-14 21:12:36 +08:00

102 lines
3.3 KiB
Plaintext
Raw Blame History

# ===== 通用 =====
TZ=Asia/Shanghai
LOG_LEVEL=INFO
# ===== 数据库 =====
POSTGRES_USER=news
POSTGRES_PASSWORD=change_me_strong_password
POSTGRES_DB=news
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
# ===== Redis =====
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=change_me_redis_password
REDIS_DB=0
# ===== JWT =====
# openssl rand -hex 64 生成
JWT_SECRET=change_me_to_a_64byte_random_hex
JWT_ALGORITHM=HS256
ACCESS_TOKEN_TTL_MIN=60
REFRESH_TOKEN_TTL_DAY=14
# ===== 腾讯云 TMT 翻译 =====
# https://console.cloud.tencent.com/cam/capi 申请
TENCENTCLOUD_SECRET_ID=your_tencent_secret_id
TENCENTCLOUD_SECRET_KEY=your_tencent_secret_key
TENCENTCLOUD_REGION=ap-hongkong
TENCENT_TMT_ENDPOINT=tmt.tencentcloudapi.com
# 字符配额(月度,5000000 = 500 万)
TENCENT_TMT_QUOTA_MONTH=5000000
# 缓冲比例(0.05 = 95% 触发后切本地)
TENCENT_TMT_QUOTA_BUFFER=0.05
# 单次请求最大字符
TENCENT_TMT_MAX_CHARS_PER_REQ=4500
# ===== 星火 Spark(优先翻译;Lite 免费)=====
# 留空 = 不启用星火(直接走腾讯 TMT)
# 控制台 https://console.xfyun.cn/ → 应用 → Spark Lite → "HTTP 服务接口认证信息" → APIPassword
SPARK_API_PASSWORD=your_spark_api_password
SPARK_BASE_URL=https://spark-api-open.xf-yun.com/v1
# 模型:lite(默认,免费) / generalv3 / generalv3.5 / 4.0Ultra
SPARK_MODEL=lite
# 单次调用间隔(秒),避免被限速
SPARK_INTERVAL_SEC=1.0
# ===== 智谱 GLM(第二序位翻译;glm-4-flash 免费)=====
# 留空 = 不启用智谱(spark 不可用时直接走 tencent)
# 控制台 https://open.bigmodel.cn/ → API Keys → 新建
ZHIPU_API_KEY=your_zhipu_api_key
ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4
# 模型:glm-4-flash(默认,免费) / glm-4-air / glm-4-airx / glm-4 / glm-4-plus / glm-4.5 / glm-4.6
ZHIPU_MODEL=glm-4-flash
ZHIPU_INTERVAL_SEC=1.0
# ===== 本地翻译(降级) =====
# 不启用就留空:不会用本地模<E59CB0>?LOCAL_TRANSLATE_ENABLED=false
LOCAL_TRANSLATE_MODEL=nllb-200-distilled-600M
LOCAL_TRANSLATE_DEVICE=cpu
# ===== 腾讯 MaaS 翻译(备用通道,OpenAI 兼容协议)=====
# 申请:https://console.cloud.tencent.com/maas 或 hivoice 控制台
# 留空 api_key = 不启用(只在 TMT 配额耗尽/TMT 失败时启用)
# 端点固定为 https://maas-api.hivoice.cn/v1(腾讯 MaaS 翻译服务)
# 模型:u2(翻译专用,支持多语种)
TENCENT_MAAS_API_KEY=
TENCENT_MAAS_BASE_URL=https://maas-api.hivoice.cn/v1
TENCENT_MAAS_MODEL=u2
# 单次调用间隔(秒),避免被 MaaS 限流
TENCENT_MAAS_INTERVAL_SEC=1.0
# ===== 抓取 =====
# 全局 QPS 上限
FETCH_GLOBAL_QPS=4
# 单源超时(秒)
FETCH_TIMEOUT=20
# 单源失败连续次数后暂停
FETCH_FAIL_PAUSE_THRESHOLD=3
# 单源 fetch 最大重试次数
FETCH_MAX_RETRIES=2
# ===== API Push 短新闻 ingest 限速 =====
# 每个 ingest token 每秒最多推几篇(滑动窗口)。2 = 一秒最多 2 篇
INGEST_RATE_PER_SEC=2
# ===== Caddy / 域名 =====
# 留空走 IP 自签证书;有域名走自动 HTTPS
DOMAIN=
# 邮箱(Let's Encrypt 用)
ACME_EMAIL=you@example.com
# ===== Agnes LLM(翻译后智能增强)=====
# 留空 = 不启用 LLM 增强(只走翻译)
# Agnes 控制台申请:https://platform.agnes-ai.com/
AGNES_API_KEY=your_agnes_api_key
AGNES_BASE_URL=https://apihub.agnes-ai.com/v1
AGNES_CHAT_MODEL=agnes-2.0-flash
AGNES_IMAGE_MODEL=agnes-image-2.1-flash
# LLM 调用间隔(秒,避免被限流;chat + image 各 1 个串行)
LLM_INTERVAL_SEC=2.0