9.5 KiB
9.5 KiB
配置与密钥管理(中文)
1. 目标
PolyWeather 的环境变量很多,但不是所有变量都属于同一层级。
当前推荐做法是把配置拆成三类:
-
可复现基础配置
放在:.env.example -
敏感密钥模板
放在:.env.secrets.example -
平台侧真实密钥
放在:- VPS / Docker
.env - Vercel Environment Variables
- GitHub Secrets(如需要)
- VPS / Docker
2. 为什么要拆
如果把所有变量都平铺在一个 .env 里,会有三个问题:
- 新环境很难知道“最小启动到底需要哪些变量”
- 敏感密钥和普通开关混在一起,容易误泄露
- 调优参数太多时,团队很难区分“必须填”和“保持默认即可”
所以正确做法不是“减少变量数量”,而是:
- 保留变量能力
- 按职责分层
- 给出最小启动路径
3. 文件职责
3.1 根 .env.example
文件:
用途:
- 后端 / Bot / Docker 的可复现配置模板
- 只放变量名、默认值、开关与非敏感示例
3.2 根 .env.secrets.example
文件:
用途:
- 只列敏感项
- 帮助运维明确哪些值必须从密钥系统注入
3.3 前端 .env.example
文件:
用途:
- 前端本地开发与 Vercel 环境变量模板
4. 配置分级
4.1 L1:最小启动必需项
这是“服务能跑起来”的最小集合。
后端 / Bot:
TELEGRAM_BOT_TOKENTELEGRAM_CHAT_IDPOLYWEATHER_RUNTIME_DATA_DIRPOLYWEATHER_DB_PATHPOLYWEATHER_STATE_STORAGE_MODE
前端:
POLYWEATHER_API_BASE_URLPOLYWEATHER_OPS_ADMIN_EMAILS(如果启用/ops页面级管理员守卫)
如果启用登录:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY
4.2 L2:功能开关
这些变量一般不敏感,但会决定功能是否启用。
例如:
POLYWEATHER_AUTH_ENABLEDPOLYWEATHER_AUTH_REQUIREDPOLYWEATHER_AUTH_REQUIRE_SUBSCRIPTIONPOLYWEATHER_OPS_ADMIN_EMAILSPOLYWEATHER_STATE_STORAGE_MODEPOLYWEATHER_PAYMENT_ENABLEDPOLYMARKET_MARKET_SCAN_ENABLEDPOLYGON_WALLET_WATCH_ENABLEDTELEGRAM_ALERT_PUSH_ENABLEDTELEGRAM_MARKET_FOCUS_DIGEST_ENABLEDPOLYMARKET_WALLET_ACTIVITY_ENABLED(已退役,建议保持false)
4.3 L3:运行调优项
这些一般不需要在第一天就改。
例如:
- 各类
*_TTL_SEC - 各类
*_TIMEOUT_SEC - 各类
*_COOLDOWN_SEC - 各类
*_INTERVAL_SEC TELEGRAM_ALERT_MIN_TRIGGER_COUNTTELEGRAM_ALERT_MIN_SEVERITYTELEGRAM_ALERT_MISPRICING_ONLYTELEGRAM_ALERT_MISPRICING_INTERVAL_SECTELEGRAM_ALERT_MISPRICING_MAX_YES_BUYTELEGRAM_MARKET_FOCUS_DIGEST_HOURSTELEGRAM_MARKET_FOCUS_DIGEST_TOP_NTELEGRAM_MARKET_FOCUS_DIGEST_GRACE_MINUTESPOLYWEATHER_PAYMENT_RPC_URLSTAF_CACHE_TTL_SEC
策略:
- 先用默认值
- 出现性能或运维问题时再调
4.4 L4:敏感项
这些变量不应写进公开文档截图,也不应提交到仓库。
例如:
TELEGRAM_BOT_TOKENSUPABASE_SERVICE_ROLE_KEYPOLYWEATHER_BACKEND_ENTITLEMENT_TOKENPOLYWEATHER_DASHBOARD_ACCESS_TOKENMETEOBLUE_API_KEYNEXT_PUBLIC_WALLETCONNECT_PROJECT_IDPOLYMARKET_SECRET_KEY
5. 推荐部署矩阵
5.1 VPS / Docker(后端 + Bot)
建议放这些:
- 根
.env的后端项 - 所有 secrets
- Bot / 支付 / watcher 配置
5.2 Vercel(前端)
建议只放前端真正需要的变量:
POLYWEATHER_API_BASE_URLNEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYPOLYWEATHER_AUTH_ENABLEDPOLYWEATHER_AUTH_REQUIREDPOLYWEATHER_OPS_ADMIN_EMAILSPOLYWEATHER_DASHBOARD_ACCESS_TOKENPOLYWEATHER_BACKEND_ENTITLEMENT_TOKENNEXT_PUBLIC_WALLETCONNECT_PROJECT_IDNEXT_PUBLIC_WALLETCONNECT_POLYGON_RPC_URL
说明:
/ops现在是前后端双层限制:- 前端页面入口读取
POLYWEATHER_OPS_ADMIN_EMAILS - 后端写接口同样读取
POLYWEATHER_OPS_ADMIN_EMAILS
- 前端页面入口读取
- 因此,Vercel 和 VPS / Docker 两侧都应配置相同的管理员邮箱白名单。
不要把后端专用密钥全搬进 Vercel。
5.3 GitHub Actions
当前 CI 不需要大规模 secrets。
如果未来要做自动部署,再考虑:
VERCEL_TOKENVERCEL_ORG_IDVERCEL_PROJECT_ID
6. 最小部署示例
6.1 前端最小变量
POLYWEATHER_API_BASE_URL=https://your-backend.example.com
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
POLYWEATHER_AUTH_ENABLED=true
POLYWEATHER_AUTH_REQUIRED=true
6.2 后端最小变量
TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...
POLYWEATHER_RUNTIME_DATA_DIR=/var/lib/polyweather
POLYWEATHER_DB_PATH=/var/lib/polyweather/polyweather.db
POLYWEATHER_STATE_STORAGE_MODE=sqlite
UID=1000
GID=1000
POLYWEATHER_AUTH_ENABLED=true
POLYWEATHER_AUTH_REQUIRED=false
POLYWEATHER_OPS_ADMIN_EMAILS=yhrsc30@gmail.com
TAF_CACHE_TTL_SEC=900
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=...
SUPABASE_SERVICE_ROLE_KEY=...
POLYWEATHER_BACKEND_ENTITLEMENT_TOKEN=...
TELEGRAM_ALERT_PUSH_ENABLED=true
TELEGRAM_ALERT_PUSH_INTERVAL_SEC=300
TELEGRAM_ALERT_PUSH_COOLDOWN_SEC=1800
TELEGRAM_ALERT_MIN_TRIGGER_COUNT=2
TELEGRAM_ALERT_MIN_SEVERITY=medium
TELEGRAM_ALERT_MISPRICING_ONLY=true
TELEGRAM_ALERT_MISPRICING_INTERVAL_SEC=7200
TELEGRAM_ALERT_MISPRICING_MAX_YES_BUY=0.10
TELEGRAM_MARKET_FOCUS_DIGEST_ENABLED=true
TELEGRAM_MARKET_FOCUS_DIGEST_HOURS=11,18
TELEGRAM_MARKET_FOCUS_DIGEST_TOP_N=5
TELEGRAM_MARKET_FOCUS_DIGEST_GRACE_MINUTES=180
POLYMARKET_WALLET_ACTIVITY_ENABLED=false
说明:
UID/GID主要给 Linux Docker 主机用,避免容器把运行文件写成 root 所有。- Windows / macOS 一般可以直接保留默认值。
POLYWEATHER_RUNTIME_DATA_DIR建议放在仓库外,例如/var/lib/polyweather。docker-compose.yml会把这个目录同时挂载到容器内的/var/lib/polyweather和/app/data,兼容现有缓存与 SQLite 路径。POLYWEATHER_STATE_STORAGE_MODE当前线上推荐直接使用sqlite。POLYWEATHER_PAYMENT_RPC_URLS支持逗号分隔多个 RPC;如果暂时只用单 RPC,也可以继续只配POLYWEATHER_PAYMENT_RPC_URL。- 机器人市场监控当前分成两类消息:
关键提醒与关注清单。 TELEGRAM_MARKET_FOCUS_DIGEST_HOURS直接按服务器本地时间解释,不再单独配置时区。POLYMARKET_WALLET_ACTIVITY_ENABLED已退役,保留为false即可,不建议再启用钱包异动监听。
6.3 机器人市场监控建议配置
这套配置用于替代旧的钱包异动监听,围绕市场本身做两类推送:
关键提醒:实时错价/触发条件满足时发送关注清单:按亚洲时区定时推送当日重点市场摘要
推荐值:
TELEGRAM_ALERT_PUSH_ENABLED=true
TELEGRAM_ALERT_PUSH_INTERVAL_SEC=300
TELEGRAM_ALERT_PUSH_COOLDOWN_SEC=1800
TELEGRAM_ALERT_MIN_TRIGGER_COUNT=2
TELEGRAM_ALERT_MIN_SEVERITY=medium
TELEGRAM_ALERT_MISPRICING_ONLY=true
TELEGRAM_ALERT_MISPRICING_INTERVAL_SEC=7200
TELEGRAM_ALERT_MISPRICING_MAX_YES_BUY=0.10
TELEGRAM_MARKET_FOCUS_DIGEST_ENABLED=true
TELEGRAM_MARKET_FOCUS_DIGEST_HOURS=11,18
TELEGRAM_MARKET_FOCUS_DIGEST_TOP_N=5
TELEGRAM_MARKET_FOCUS_DIGEST_GRACE_MINUTES=180
POLYMARKET_WALLET_ACTIVITY_ENABLED=false
说明:
TELEGRAM_ALERT_MISPRICING_ONLY=true表示关键提醒优先围绕错价/市场触发,不把机器人做成泛通知器。TELEGRAM_MARKET_FOCUS_DIGEST_HOURS=11,18按服务器本地时间解释,通常可以对应白天与傍晚两个摘要窗口。TELEGRAM_MARKET_FOCUS_DIGEST_TOP_N=5建议先保持较小,避免机器人一次推太多城市。TELEGRAM_MARKET_FOCUS_DIGEST_GRACE_MINUTES=180用于容忍进程重启/部署后的补发窗口。POLYMARKET_WALLET_ACTIVITY_ENABLED=false表示停用旧的钱包异动监听,统一收敛到市场监控。
7. 当前建议的运维规则
7.1 仓库中允许存在
.env.example.env.secrets.examplefrontend/.env.example
7.2 仓库中不应提交
.env.env.local- 任何带真实 token / key 的配置文件
7.3 截图与共享规则
以下值一旦出现在截图或聊天里,建议视为泄露并轮换:
SUPABASE_SERVICE_ROLE_KEYPOLYWEATHER_BACKEND_ENTITLEMENT_TOKENTELEGRAM_BOT_TOKEN- 第三方私有 API Key
8. 如何收口配置复杂度
如果你觉得变量仍然太多,正确的做法不是一刀删掉,而是:
- 把“功能开关”和“调优参数”分开看
- 保持
.env.example中:- 最小启动项
- 常用功能开关
- 默认调优值
- 让不常改的高阶参数继续留默认
也就是说:
- 使用者只需要先关心 10-20 个关键变量
- 其余变量保持默认即可
9. 当前已经完成的配置治理
- 根
.env.example收口 .env.secrets.example新增- 前端
.env.example收口 - 运行时配置校验脚本新增
/ops管理员白名单与前后端职责边界已明确- 支付运行态与多 RPC 配置支持
- 运行态 SQLite 迁移配置支持
10. 配置校验命令
在不启动服务的情况下,你可以直接检查配置:
python scripts/validate_runtime_env.py --component web
python scripts/validate_runtime_env.py --component bot