OmniRoute Fly.io 部署实战指南:fly.toml 配置、Secrets 管理与发布全流程 📅 发布时间:2026/9/15 15:39:26 👁 浏览次数: OmniRoute Fly.io 部署实战指南fly.toml 配置、Secrets 管理与发布全流程【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute导读本文档完整记录 OmniRoute 在 Fly.io 平台上的实际部署方法覆盖从首次部署、环境变量与持久化配置、后续发版更新到同步上游代码的全流程。读者读完可以掌握如何使用仓库内现成的fly.toml与Dockerfile一键发布、如何用flyctl secrets set安全注入密钥、如何确保 SQLite 数据库与运行时密钥真正落到 Fly Volume 持久卷以及 fork 仓库如何在不丢失自定义部署配置的前提下跟踪上游更新。本文基于当前仓库已实际验证通过的部署配置编写应用名为omniroute访问地址为https://omniroute.fly.dev/。1. 部署目标OmniRoute 的 Fly.io 部署方案可概括为以下几点维度选型平台Fly.io基于 Firecracker 微虚拟机的应用托管平台部署方式本地flyctlFly 官方 CLI直接发布运行方式直接使用仓库内现成的 Dockerfile 和 fly.toml无需额外编写构建脚本数据持久化Fly Volume 挂载到容器内/data目录访问地址https://omniroute.fly.dev/该方案面向两类场景把当前项目首次部署到 Fly.io后续代码更新后持续发布同时新项目也可照搬同一套流程复用。2. 仓库关键配置fly.toml 与 Dockerfile 解读2.1 fly.toml 核心片段当前仓库根目录的 fly.toml 已确认包含以下关键项指南原文摘录app omniroute primary_region sin [[mounts]] source data destination /data [processes] app node run-standalone.mjs [http_service] internal_port 20128 [env] TZ Asia/Shanghai HOST 0.0.0.0 HOSTNAME 0.0.0.0 BIND 0.0.0.0三点必须理解透彻app omniroute决定部署目标 Fly 应用所有flyctl命令都要与此名称保持一致destination /data决定 Fly Volume 在容器内的挂载目录本项目必须设置DATA_DIR/data否则数据库和密钥会写入容器临时目录容器重建即丢失。2.2 仓库真实 fly.toml 的完整细节实际仓库中的 fly.toml 比指南摘录更完整还包含以下值得了解的配置[deploy] # release_command node ./dbsetup.js # 默认注释无需启用 [[mounts]] source data destination /data auto_extend_size_threshold 80 # 使用率超过 80% 时自动扩容 auto_extend_size_increment 1GB # 每次自动扩容增量 auto_extend_size_limit 10GB # 自动扩容上限 [http_service] internal_port 20128 force_https true # 强制 HTTPS auto_stop_machines stop # 空闲可自动停机 auto_start_machines true # 有流量自动唤醒 min_machines_running 1 # 至少保留 1 台运行 processes [app] [[vm]] memory 1gb cpu_kind shared cpus 1其中 Volume 自动扩容auto_extend_size_*是 Fly.io 较新特性能让持久卷在接近写满时自动扩容到 10GB 上限避免数据卷写满导致服务异常force_https true保证所有请求走 TLSmin_machines_running 1配合自动停机/唤醒可在低成本下维持可用性。2.3 Dockerfile 中的运行契约部署时的进程入口由 fly.toml 的[processes]指定为node run-standalone.mjs对应源码为 scripts/dev/run-standalone.mjs它会先执行bootstrapEnv()完成启动前环境引导包括密钥落盘、SQLite 初始化再优先以server-ws.mjs作为入口启动服务。而 Dockerfile 里还有几处与 Fly 部署强相关的设计EXPOSE 20128与 fly.toml 的internal_port 20128一致这是服务监听端口CMD [node, dev/run-standalone.mjs]容器默认命令即指南中[processes]所指向的启动器ENTRYPOINT [/app/check-permissions.sh]启动前先校验挂载数据卷的所有权参见 scripts/check-permissions.shHEALTHCHECK ... CMD [node, healthcheck.mjs]容器健康检查探测轻量级/healthz端点实现见 scripts/dev/healthcheck.mjs避免重型的/api/monitoring/health含 SQLite 同步读与监控聚合在事件循环繁忙时误判容器不健康而重启唯一的副本以非 root 的node用户运行USER node运行时进程不持有 root 权限。2.4 DATA_DIR 为什么如此关键指南反复强调DATA_DIR/data是生死攸关的配置。从源码看数据目录解析逻辑集中在 src/lib/dataPaths.ts 的resolveDataDir()当进程环境变量DATA_DIR被设置时直接采用该路径/data即 Fly Volume 挂载点未设置时才回退到~/.omniroute等用户目录。若在 Fly 上忘记设置容器内数据会写到临时文件系统任何一次重建都会丢数据。3. 必备工具3.1 安装 Fly CLIWindows PowerShell 一键安装pwsh -Command iwr https://fly.io/install.ps1 -useb | iex如果安装脚本在当前环境失败如网络受限、PowerShell 执行策略限制也可以手动下载flyctl二进制并放入PATH。3.2 登录 Fly 账号flyctl auth login3.3 检查登录状态flyctl auth whoami flyctl versionwhoami应输出你的 Fly 账号邮箱version输出版本号两者正常说明 CLI 可用。4. 首次部署当前项目4.1 获取代码并进入目录git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute如果你使用自己的 fork替换为对应仓库地址即可。4.2 确认应用名打开仓库根目录的 fly.toml重点确认这一行app omniroute如果你准备部署到自己的新应用可改成全局唯一名称例如app omniroute-yourname注意两点控制台里查看的应用必须与fly.toml中app值一致如果之前用过其他名字例如oroute不要与omniroute混淆两者是不同应用。4.3 创建应用如果该应用尚不存在flyctl apps create omniroute若你已改名把omniroute替换成你的应用名。4.4 首次部署flyctl deployflyctl会读取fly.toml、按 Dockerfile 构建镜像、创建并调度机器首次构建耗时较长属正常现象。5. 必配参数本项目在 Fly.io 上至少需要配置以下环境参数否则核心功能无法正常运作。5.1 已实际验证使用的参数以下参数已经在当前omniroute应用上实际部署验证变量用途API_KEY_SECRETAPI Key 生成与校验使用DATA_DIR数据目录必须指向持久卷/dataJWT_SECRET登录态与 JWT 签名使用MACHINE_ID_SALT生成稳定机器标识NEXT_PUBLIC_BASE_URL调度器与前端回调等场景使用的公开地址STORAGE_ENCRYPTION_KEY加密存储敏感连接信息OMNIROUTE_WS_BRIDGE_SECRETWebSocket 桥接鉴权密钥生产环境必需5.2 关于INITIAL_PASSWORD当前项目部署时没有设置INITIAL_PASSWORD按需求未使用。如果不设置启动日志会提示默认后台密码是CHANGEME部署后应尽快在系统设置中修改登录密码。如果你希望首次部署时无人值守初始化后台密码也可以补充设置INITIAL_PASSWORD6. 推荐参数说明6.1 Secrets 中设置的变量建议放入 Fly Secretsflyctl secrets set的变量清单变量名是否推荐说明API_KEY_SECRET必需API Key 生成与校验使用JWT_SECRET必需登录态和 JWT 签名使用OMNIROUTE_WS_BRIDGE_SECRET生产必需WebSocket 桥接鉴权密钥STORAGE_ENCRYPTION_KEY强烈推荐加密存储敏感连接信息MACHINE_ID_SALT推荐生成稳定机器标识INITIAL_PASSWORD可选首次部署时直接指定后台初始密码OAuth/API 私密凭证按需各类外部平台鉴权配置6.2 当前项目推荐值变量名推荐值DATA_DIR/dataNEXT_PUBLIC_BASE_URLhttps://omniroute.fly.devDATA_DIR/data非常关键必须与 fly.toml 中 Fly Volume 挂载点destination /data严格一致NEXT_PUBLIC_BASE_URL用于调度器、前端回调等场景务必使用公网可访问的 HTTPS 域名。6.3 启用 OAuth 提供商时的回调地址配置如果你需要在 Fly.io 部署上启用基于 OAuth 的提供商例如 Antigravity、Gemini、Cursor 等必须确认两点将NEXT_PUBLIC_BASE_URL设置为公网 HTTPS 域名flyctl secrets set NEXT_PUBLIC_BASE_URLhttps://omniroute.fly.dev -a omniroute使用自定义域名时替换为对应域名例如https://omniroute.yourdomain.com。在提供商控制台配置回调地址所有 OAuth 提供商共用唯一的回调路径/callback不存在按提供商区分的独立回调路由NEXT_PUBLIC_BASE_URL/callback例如无论 Gemini、Antigravity、Cursor 还是 GitLab Duo都统一填写https://omniroute.fly.dev/callback如果NEXT_PUBLIC_BASE_URL与提供商侧注册的回调地址不一致OAuth 流程会在浏览器重定向环节失败。7. 一键设置参数下面这组命令会生成安全随机值并把当前项目需要的参数一次性写入 Fly Secrets适用于当前项目omniroute不包含INITIAL_PASSWORD$apiKeySecret [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $jwtSecret [Convert]::ToHexString((1..64 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $machineIdSalt [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $storageKey [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() $wsBridgeSecret [Convert]::ToHexString((1..32 | ForEach-Object { Get-Random -Minimum 0 -Maximum 256 })).ToLower() flyctl secrets set API_KEY_SECRET$apiKeySecret JWT_SECRET$jwtSecret MACHINE_ID_SALT$machineIdSalt STORAGE_ENCRYPTION_KEY$storageKey OMNIROUTE_WS_BRIDGE_SECRET$wsBridgeSecret DATA_DIR/data NEXT_PUBLIC_BASE_URLhttps://omniroute.fly.dev -a omniroute其中各随机值按用途区分长度JWT_SECRET生成 64 字节十六进制串其余为 32 字节。Linux / macOS 下也可用openssl生成随机值例如单独设置 WebSocket 桥接密钥flyctl secrets set OMNIROUTE_WS_BRIDGE_SECRET$(openssl rand -hex 32) -a omniroute注意OMNIROUTE_WS_BRIDGE_SECRET在生产环境为必需项缺失会导致 WebSocket 桥接握手失败。如果还要设置初始密码flyctl secrets set INITIAL_PASSWORD你的强密码 -a omniroute8. 查看当前参数flyctl secrets list -a omniroute如果 Fly 控制台的Secrets页面没有显示你期待的变量先检查两点看的是不是omniroute这个应用fly.toml 里的app值是否和控制台应用一致。flyctl secrets list只会显示变量名不回显明文值这是正常的安全行为。9. 后续更新发布9.1 常规发版代码有更新后发布步骤很简单git pull flyctl deploy如果只更新参数、不改代码flyctl secrets set KEYvalue -a omniroute设置 Secrets 后 Fly 会自动滚动更新机器无需手动重建。9.2 跟踪上游更新并保留 fork 的 fly.toml如果当前仓库是 fork并且你要同步上游仓库的更新推荐按下面的流程执行。先确认远程地址git remote -v应至少包含origin指向你自己的 forkupstream指向原仓库。如果没有upstream先添加git remote add upstream https://github.com/diegosouzapw/OmniRoute.git同步上游前先抓取最新提交和标签git fetch upstream --tags查看当前版本和上游标签git describe --tags --always git show --no-patch --oneline v3.4.7注指南中的v3.4.7是历史示例标签当前项目实际版本请以 package.json 中的version字段当前为3.8.51或最新发布标签为准实际使用时替换为:latest或当前版本标签。如果你想合并上游最新main并强制保留 fork 当前的fly.toml按下面流程执行git merge upstream/main git checkout HEAD~1 -- fly.toml git add -- fly.toml git commit -m chore(deploy): keep fork fly.toml git push origin main各步骤含义git merge upstream/main同步原仓库最新代码git checkout HEAD~1 -- fly.toml恢复合并前你 fork 自己的fly.toml如果上游没有改fly.toml这一步不会带来额外差异如果上游改了fly.toml这一步能确保 Fly 应用名、挂载卷、区域等 fork 自定义部署配置不被覆盖。如果你明确只想对齐某个发布标签也可以先确认标签是否已经包含在upstream/maingit merge-base --is-ancestor v3.4.7 upstream/main返回成功退出码 0表示upstream/main已经包含该版本直接合并upstream/main即可。9.3 同步上游后的标准发布顺序同步原仓库完成后推荐按下面顺序发布git fetch upstream --tagsgit merge upstream/main恢复 fork 的fly.tomlgit push origin mainflyctl deployflyctl status -a omnirouteflyctl logs --no-tail -a omniroute这就是当前项目升级发布时使用的实际流程。10. 发布后检查10.1 查看应用状态flyctl status -a omniroute10.2 查看启动日志flyctl logs --no-tail -a omniroute10.3 检查网站可访问try { (Invoke-WebRequest -Uri https://omniroute.fly.dev -MaximumRedirection 5 -UseBasicParsing).StatusCode } catch { if ($_.Exception.Response) { $_.Exception.Response.StatusCode.value__ } else { throw } }返回200说明站点已正常响应。11. 成功标志部署成功后启动日志里应看到类似内容[bootstrap] Secrets persisted to: /data/server.env [DB] SQLite database ready: /data/storage.sqlite这两个点非常关键/data/server.env说明运行时密钥落到了持久卷/data/storage.sqlite说明 SQLite 数据库写入持久卷。如果看到的是/app/data/...说明DATA_DIR没配对容器内 Dockerfile 默认值是/app/data见 Dockerfile 中ENV DATA_DIR/app/data需要立即修正为/data。这一判断与 src/lib/dataPaths.ts 的目录解析逻辑相印证只有DATA_DIR环境变量指向挂载点数据才会真正持久化。12. 常见问题12.1Secrets页面是空的通常有两种原因你还没执行flyctl secrets set你打开的是另一个应用例如oroute不是omniroute。12.2flyctl deploy报app not found先创建应用flyctl apps create omniroute12.3fly.toml解析失败重点检查注释里是否有乱码字符TOML 引号和缩进是否正确。12.4 数据没有持久化检查以下两点fly.toml 中是否存在destination /dataDATA_DIR是否设置为/data。两者缺一不可挂载点只决定 Volume 挂在哪DATA_DIR才决定应用把数据写向哪里。12.5 不设置INITIAL_PASSWORD是否能跑可以运行但会回退到默认密码CHANGEME。生产环境建议尽快在系统设置中修改后台密码。13. 新项目复用建议如果以后新项目照这份文档部署最少改这几项修改 fly.toml 里的app修改NEXT_PUBLIC_BASE_URL保持DATA_DIR/data重新生成API_KEY_SECRET、JWT_SECRET、MACHINE_ID_SALT、STORAGE_ENCRYPTION_KEY以及生产环境必需的OMNIROUTE_WS_BRIDGE_SECRET首次部署后检查日志是否写入/data。不要直接复用旧项目的密钥。14. 当前项目的最小发布清单当前项目后续最常用的命令flyctl auth whoami flyctl status -a omniroute flyctl secrets list -a omniroute flyctl deploy flyctl logs --no-tail -a omniroute如果只是正常发版核心就是flyctl deploy如果是新环境首次部署核心步骤是flyctl auth loginflyctl apps create omnirouteflyctl secrets set ... -a omnirouteflyctl deployflyctl logs --no-tail -a omniroute附文档索引与后续阅读本指南英文原文见 docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md俄语版即本文档docs/i18n/ru/docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md更多语言版本见 docs/i18n/README.md部署相关关键文件fly.toml、Dockerfile、scripts/dev/run-standalone.mjs、scripts/dev/healthcheck.mjs、scripts/check-permissions.sh数据目录与持久化实现src/lib/dataPaths.ts容器化与运行环境指南见 docs/ops/DOCKER_GUIDE.md、docs/ops/PROXY_GUIDE.md发布与质量门禁流程见 docs/ops/RELEASE_CHECKLIST.md。【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考