这页默认你已经不是“先试试看”,而是准备把服务长期跑起来。
如果你只是想先验证镜像能不能跑,用 快速开始 即可;
这页更关心长期运行、持久化和上线口径。
这份基线示例的目标不是“最短”,而是让你一开始就带上持久化和 readiness。
如果你还需要 Account Pool 写能力,再补 UPSTREAM_ACCOUNTS_ENCRYPTION_SECRET。
| 变量 | 作用 | 什么时候必须配 |
|---|---|---|
HTTP_BIND |
服务监听地址 | 容器部署或网关拓扑不同的时候 |
DATABASE_PATH |
SQLite 主库路径 | 想把数据库放在持久化卷时 |
PUBLIC_ORIGIN |
对外公开入口基址,用于社交预览等绝对 URL | 有稳定域名、要给 README / 分享卡片正确出图时 |
OPENAI_UPSTREAM_BASE_URL |
OpenAI 兼容上游地址 | 不是转发到默认 OpenAI 上游时 |
OPENAI_PROXY_ENCRYPTED_SESSION_OWNER_ROUTING_ENABLED |
加密对话路由绑定首次初始化默认值 | 想让新库第一次启动时默认打开该开关时 |
UPSTREAM_ACCOUNTS_ENCRYPTION_SECRET |
Account Pool 写入与 OAuth 绑定密钥 | 需要账号池写能力时 |
RETENTION_ENABLED / ARCHIVE_DIR |
后台归档与离线目录 | 想长期运行并控制主库体积时 |
HTTP_BIND=0.0.0.0:8080,但对外流量仍然应该由 Traefik、Nginx 或其他反向代理承接。X-Forwarded-* 这类头只应该由受信任网关产生;不要把应用端口直接开放到公网后再指望这些头有安全意义。PUBLIC_ORIGIN,不要只依赖代理头让爬虫猜协议和域名。应用会为 PWA 更新链路返回以下缓存策略:
index.html、site.webmanifest、sw.js、version.json 使用 no-cache, max-age=0, must-revalidate,以便浏览器和 service worker 重新校验。public, max-age=31536000, immutable。图标更新会生成新 URL,网关或 CDN 必须保留哈希文件,不能把新 URL 改写回旧稳定文件名。Android Chrome/WebAPK 和支持 manifest 图标更新的 Chromium Desktop 会沿用稳定安装身份发现新图标;已有 iOS/iPadOS Web Clip 无法被网站强制替换其已保存图标。
应用的 GET /health 表示 readiness,而不是“进程活着”:
200 ok503 starting典型 healthcheck 口径:
如果你的网关或编排系统会在服务还没 ready 时就导流,问题通常不会表现成“完全打不开”,而是表现成间歇性失败、启动窗口大量错误或首批请求异常。
DATABASE_PATH 决定主库位置,建议直接挂载到持久化卷。ARCHIVE_DIR 与 PROXY_RAW_DIR 使用相对路径时,会锚定到 DATABASE_PATH 同级目录。UPSTREAM_ACCOUNTS_ENCRYPTION_SECRET 就必须存在。/api/pool/upstream-accounts/oauth/callback,反向代理要正确透传实际请求的 Origin/Host。failed to contact oauth codex upstream,优先排查出网连通性,而不是先怀疑前端页面。curl http://127.0.0.1:8080/health 已经返回 200 okUPSTREAM_ACCOUNTS_ENCRYPTION_SECRET 已配置