概览
gomodel 二进制文件提供了一小组用于运维任务的命令行参数。参数同时支持单横线(-flag)和双横线(--flag)两种形式;
以下示例均使用长格式。
版本
打印构建版本后退出:健康探测
--health 会让二进制文件充当健康检查客户端:它加载与服务端相同的配置,请求本地 /health 端点,然后退出。
- 当端点返回 HTTP
200且响应为{"status":"ok"}时,以0退出。 - 其他情况(连接被拒绝、非
200状态码或任何其他 status 值)以非零状态退出。
127.0.0.1)为目标,但 PORT 和
BASE_PATH 取自配置,而不是硬编码为 8080 和 /health。可使用 --health-timeout 限制请求时长:
Docker HEALTHCHECK
由于探测功能内置于二进制文件中,容器镜像无需附带 curl 或 wget 即可上报健康状态,这对精简版 / distroless 运行时非常有用。
官方镜像已自动完成配置:
就绪探测
--ready 探测 /health/ready,该端点报告实例是否应接收流量。与存活检查不同,就绪检查会检查网关自身负责的依赖项:
- 存储为必需项。如果后端(SQLite/PostgreSQL/MongoDB)不可达,就绪检查报告
not_ready(HTTP503)。 - Redis 精确缓存(已配置时)属于性能优化。如果它不可达,就绪检查报告
degraded,但仍返回 HTTP200——网关依然可以处理请求。
- 当端点返回 HTTP
200(ready或degraded)时,以0退出。 - 在
not_ready(HTTP503)、连接被拒绝或出现意外 status 值时,以非零状态退出。
配置重新加载
--reload 可在不重启的情况下将配置变更应用到运行中的网关,与 nginx -s reload 的作用相同:
config.yaml,
命令会直接失败(非零退出,不发送信号),运行中的网关根本不会去读取它。成功时,网关会:
- 重新读取
.env文件。新增和修改的值会生效;从文件中删除的值会被取消设置。已导出到进程环境中的变量仍优先于文件, 与启动时完全一致——容器的环境变量不会被容器内的文件覆盖。 - 重新读取
config/config.yaml(或config.yaml)以及所有环境变量,然后基于结果重建自身。提供商、虚拟模型、 预算、速率限制、护栏、MCP 服务器、缓存、日志、管理设置——全部都会重新加载,因为重新加载执行的是与启动相同的流程, 而不是挑选出来的部分功能。
reload failed; keeping the running configuration 日志,并继续使用已正常工作的配置提供服务。
监听套接字在进程的整个生命周期内保持打开,并依次交给每一份配置使用,因此在重新加载期间到达的请求会等待被接受,而不会被拒绝。
进行中的请求享有与关闭时相同的 10 秒排空窗口,超出该时长的流式响应会被中断,因此在流式流量较大时执行重新加载并非毫无代价——
但不会有连接在套接字层面被丢弃。
最后这项保证取决于操作系统是否允许网关复制监听套接字,而所有能够接收重新加载信号的平台都支持这一点。
在无法复制套接字的情况下,下一份配置会重新绑定地址,切换期间的连接会被拒绝。
直接发送信号也能达到相同效果,进程管理器或没有 shell 的容器可以使用这种方式:
重新加载基于 POSIX 信号实现,在 Windows 上不可用。
pid 文件
网关在启动时将其进程 ID 写入PID_FILE / server.pid_file,并在关闭时将其删除。如果存在 ./data
目录(Docker 镜像和现有部署),默认值为 data/gomodel.pid;否则使用操作系统约定的用户数据目录——与
SQLite 数据库使用的解析规则相同。
当多个网关共享同一台主机时,请为每个实例指定独立的路径,因为 --reload 会向文件中记录的那个进程发送信号。
如果完全不想写入 pid 文件,请在 config.yaml 中设置 server.pid_file: ""——这会禁用 --reload,
但 kill -HUP 仍然有效。与其他所有设置一样,空的 PID_FILE 环境变量会被视为未设置,并保留默认值。
如果路径不可写,网关会记录一条警告并正常提供服务,只是不支持 --reload。
网关和 gomodel --reload 都基于相同的配置解析该路径,因此请在与网关相同的工作目录下(或使用相同的
PID_FILE)运行该命令:
重新加载不会改变的内容
PORT——套接字保持绑定,因此不会拒绝任何连接;更改端口需要重启。网关会记录一条同时列出两个端口的警告。PID_FILE——它指向的是已经在运行的进程。GOMODEL_DEMO_MODE——演示警告只在启动时配置一次。- 内存状态——虚拟模型的会话亲和性和实时日志缓冲区会重新开始,与重启后完全一样。请求和 Token 速率限制窗口 会在关闭时写出,并由下一代配置恢复。并发计量和预算/用量的行为与重启时相同(计量从空开始;预算和用量保存在数据库中)。
POST /admin/runtime/refresh)
是更轻量的选择。
存活检查(--health)适合作为 Docker HEALTHCHECK 的信号(崩溃时重启)。就绪检查(/health/ready)适合作为 Kubernetes
readinessProbe 的信号(控制流量)——可以直接指向该 HTTP 端点,也可以以 exec 探针方式运行
gomodel --ready。请让 --ready-timeout 大于服务端内部针对每个依赖项的探测超时(2s),这样后端响应缓慢时会干净地返回
not_ready,而不是客户端先超时。
插件工具
gomodel plugin 使用运行中二进制文件的工具链构建和检查共享对象插件(.so);请参阅插件。
plugin build 会强制设置 CGO_ENABLED=1,将 GOTOOLCHAIN 固定为主机的 Go
版本,在插件中写入一个 GoModelBuildInfo 变量,并拒绝使用不同 Go 版本构建的输出。加载插件需要启用 cgo 构建的
GoModel(make build-plugins 或 gomodel:<version>-plugins 镜像)。
gomodel --version 会打印插件必须匹配的 Go 和 pluginapi 版本。
加密已存储的 Secret
gomodel secrets reencrypt 会加密所有仍以明文存储的控制台托管 Secret(密钥),并将使用旧数据密钥加密的值迁移到当前活动的数据密钥。
它需要 GOMODEL_ENCRYPTION_KEY,仅打印计数,并且是幂等的。
从 LiteLLM 迁移
gomodel migrate litellm 会将 LiteLLM 代理的 config.yaml 转换为 GoModel 的
config.yaml、一个包含原本内联 Secret 的 .env 文件,以及一份迁移报告。不指定 --out 时不会写入任何文件。
当它拿到数据库 URL(--database-url、配置中的 database_url 或 DATABASE_URL)时,还会从 LiteLLM 数据库读取密钥、团队、用户和预算;
指定 --gomodel-url 时,会将它们导入到运行中的 GoModel。重复运行会让 GoModel 同步到最新状态。指向其他机器的 --gomodel-url 必须使用 https,
除非您传入 --allow-http。--skip-database 只转换配置。