跳转到内容

配置

OpenBot 可以运行多个实例。一个实例就是一个正在运行的 OpenBot 服务器进程。同一个部署的所有实例使用同一个数据库。 本页列出每个实例在启动时读取的少数几个值。它也说明其他所有设置存放在哪里。


规则

设置分为两种:

  • 实例设置属于一个实例。没有其他实例需要同样的值。它们来自环境变量或 /run/secrets 中的文件。
  • 共享设置在每个实例上都必须相同。它们存放在 PostgreSQL 中。你通过 API 修改它们,每个实例都会立刻使用修改后的值。

只有一个例外:OPENBOT_SECRET_KEYS。每个实例都需要同样的密钥。但这些密钥用来加密数据库中的机密,所以它们不能存放在数据库中。每个实例从自己的环境中读取它们。

如果某个必需的值缺失或有误,OpenBot 不会启动。它会在日志中写一条配置错误。


实例设置

这是服务器读取的环境变量的完整列表。

变量 必需 默认值 含义
OPENBOT_HOST 否 127.0.0.1 服务器监听的网络地址。
OPENBOT_PORT 否 3000 服务器监听的端口。
OPENBOT_DATABASE_URL 是 一个 PostgreSQL 连接 URL。
OPENBOT_SECRET_KEYS 是 用来加密数据库中机密的密钥。见下文。
OPENBOT_TLS_CERT 否 PEM 证书文件的路径。
OPENBOT_TLS_KEY 否 该证书对应的 PEM 私钥文件的路径。

Docker 镜像设置了 OPENBOT_HOST=0.0.0.0 和 OPENBOT_PORT=3000,这样服务器可以接收来自容器外部的流量。

数据库

OPENBOT_DATABASE_URL 的形式是:postgres://openbot:secret@db.example.com:5432/openbot。 服务器、迁移程序和设置程序都会读取它。

服务器启动时,会检查所有表是否都存在。如果不存在,它就会停止。请先运行迁移程序。参见部署。

TLS

同时设置 OPENBOT_TLS_CERT 和 OPENBOT_TLS_KEY,OpenBot 就会自己提供 HTTPS。两个都不设置,则提供普通 HTTP。 如果只设置其中一个,OpenBot 不会启动。

在生产环境中,通常由反向代理处理 HTTPS。这时两个值都留空。参见部署。


机密密钥

OpenBot 在数据库中保存一些机密。它用 OPENBOT_SECRET_KEYS 中的密钥加密它们。这些机密是:

  • App 连接的私密数据,比如 App 凭据、私密设置和登录状态;
  • 模型提供方的 API 密钥;
  • SSO 连接的客户端密钥;
  • 平台的登录密钥,它用来签名登录 cookie;
  • 平台 OpenID Connect 提供方的客户端密钥。

OPENBOT_SECRET_KEYS 是一个用逗号分隔的密钥列表:

Terminal window
OPENBOT_SECRET_KEYS=k2:<64 hexadecimal characters>,k1:<64 hexadecimal characters>
  • 每一项的形式是 <id>:<key>。
  • 密钥正好是 64 个十六进制字符(32 字节)。
  • ID 是 1 到 32 个字符。可以使用小写字母、数字、_ 和 -。
  • 第一个密钥用来加密新的机密。
  • 列表中的每一个密钥都可以解密。OpenBot 在每个机密旁边保存密钥 ID,所以它知道该用哪个密钥。

生成一个密钥(只需一次):

Terminal window
echo "k1:$(openssl rand -hex 32)"

给每个实例同样的列表。 把密钥和数据库备份放在一起保管。如果你丢失了密钥,OpenBot 就无法读取数据库中的机密。

更换密钥

你可以添加新密钥,而不会丢失旧的机密:

  1. 生成一个新密钥,比如 k2。
  2. 把它放在列表的第一位,旧密钥放在它后面:k2:<new>,k1:<old>。
  3. 把新列表交给每个实例,然后重新启动它们。

OpenBot 现在用 k2 封存新的机密。k1 封存的机密仍然可以打开。 只要数据库中还有旧密钥封存的机密,就要把旧密钥留在列表中。


以文件形式提供机密

当某个环境变量没有设置时,OpenBot 会改为读取文件 /run/secrets/<NAME>。比如,它从 /run/secrets/OPENBOT_SECRET_KEYS 读取 OPENBOT_SECRET_KEYS。Docker 和 Compose 会把机密放在这个文件夹中。

  • 环境变量总是优先,即使文件存在也是如此。
  • OpenBot 会去掉文件开头和结尾的空格与换行。
  • 空文件视为未设置。缺少文件或文件夹也视为未设置。

这对本页的每个变量都有效。它对机密最有用,因为环境变量会显示在 docker inspect 中,而文件不会。


首次设置

新数据库中没有共享设置。在大家使用 OpenBot 之前,你要运行一次设置程序。它会写入第一份平台设置和第一批平台管理员。

在此之前,服务器可以启动,但除 /health 之外的每个路由都会返回 503,响应体如下:

{ "_tag": "SetupRequired" }

日志也会提示你运行设置。所有参数参见 Platform,命令参见部署。


其他所有设置存放在哪里

其他所有设置都是保存在数据库中的共享设置。大部分设置在两份文档中:

  • 平台设置,位于 /v1/platform/settings。只有平台管理员能修改。参见 Platform。
  • 组织设置,位于 /v1/organization/settings。每个组织都有自己的一份。参见组织。

旧版本的 OpenBot 会读取更多环境变量。OpenBot 现在忽略它们。下表显示每个值的去处:

旧变量 新位置
OPENBOT_PUBLIC_ORIGIN 平台设置中的 publicOrigin。设置程序用 --public-origin 写入它。
OPENBOT_OIDC_ISSUER 平台设置中的 identityProvider.issuer。设置程序用 --oidc-issuer 写入它。
OPENBOT_OIDC_CLIENT_ID 平台设置中的 identityProvider.clientId。设置程序用 --oidc-client-id 写入它。
OPENBOT_OIDC_CLIENT_SECRET 平台设置中的 identityProvider.clientSecret,已加密。设置程序用 --oidc-client-secret 写入它。
BETTER_AUTH_SECRET 登录密钥。设置程序随机生成一个,并加密保存。你永远不需要设置它。
OPENBOT_APP_ENCRYPTION_KEY OPENBOT_SECRET_KEYS。
OPENBOT_OWNER_EMAILS 平台管理员。设置程序用 --admin-email 添加他们。用 /v1/platform/admins 修改。
OPENBOT_ALLOWED_EMAIL_DOMAINS 每个组织的已验证域名,配合其设置中的 joinByDomain。参见 SSO。
OPENBOT_MODEL_ENDPOINT 组织或平台的模型提供方。参见 Model。
OPENBOT_MODEL_API_KEY 模型提供方,已加密。
OPENBOT_MODEL_ID 由模型提供方关联的模型,以及每个 Agent 的 model。
OPENBOT_DEV_MODE 由开发入口决定。参见开发。

有些值以前是代码中的选项。现在它们也成了设置:

旧选项 新位置
appRestrictions 平台设置中的 appRestrictions。
appReadRules 组织设置中的 appReadRules。
agents.helperModel 组织设置中的 rulesModel 和 agentMemoryModel。
agents.requestTimeout 组织设置中的 requestTimeoutMs。
agents.memory 组织设置中的 agentMemory。
sessions.memory.defaults 组织设置中的 memory。
allowedEmailDomains、defaultRoles(API) 已验证域名,以及组织设置中的 defaultRoles。

修改如何到达每个实例

每个实例都把设置保存在缓存中,缓存是内存中一份短期的副本。修改的过程如下:

  1. API 把新设置写入数据库。
  2. 它在 openbot_settings 频道上发送一条 PostgreSQL NOTIFY 消息。
  3. 每个实例都监听这个频道。它会立刻读取新设置。

每个缓存条目也会在 30 秒后过期。所以,错过消息的实例也会很快得到修改。

修改 publicOrigin、平台身份提供方或登录密钥,会改变登录的工作方式。这时每个实例会在同一个进程中启动一个新的应用。新应用先开始接收请求,然后旧应用停止。不会丢失任何请求。


生产环境 Compose

Compose 文件 deploy/docker/compose.production.yaml 读取下面这些变量。只有前三个会传给 OpenBot。

变量 必需 默认值 含义
POSTGRES_PASSWORD 是 PostgreSQL 用户 openbot 的密码。请使用 URL 安全的字符。
OPENBOT_DATABASE_URL 是 模板会根据 POSTGRES_PASSWORD 填写它。
OPENBOT_SECRET_KEYS 是 机密密钥。参见机密密钥。
OPENBOT_RELEASE 是 要运行的镜像标签。
OPENBOT_PUBLISHED_PORT 否 8080 反向代理在 127.0.0.1 上找到 OpenBot 的端口。
PROTOCOL_TEST_PUBLIC_ORIGIN 是 协议测试服务的公开 HTTPS 源。
PROTOCOL_TEST_ALLOWED_ORIGINS 否 PROTOCOL_TEST_PUBLIC_ORIGIN 协议测试服务接受的浏览器源。

Compose 文件把 OPENBOT_DATABASE_URL 和 OPENBOT_SECRET_KEYS 以 /run/secrets 中文件的形式交给 OpenBot。openbot 服务没有其他环境变量。参见部署。 完整的模板在 deploy/docker/production.env.example 中。


开发

devenv shell -- pnpm dev:setup 会根据 .env.development.example 生成文件 .env.development。它会在 OPENBOT_SECRET_KEYS 中填入一个名为 dev 的新随机密钥。

变量 默认值 含义
OPENBOT_SECRET_KEYS dev:<random key>。由 dev:setup 填写。
OPENBOT_DEV_HTTPS_PORT 8443 本地 OpenBot 的 HTTPS 端口。
OPENBOT_DEV_DATABASE_PORT 5433 开发用 PostgreSQL 的本地端口。
OPENBOT_DEV_DATABASE_NAME openbot 开发数据库的名称。

然后 devenv 会为你设置这些值:

变量 值
OPENBOT_DEV_PUBLIC_ORIGIN https://localhost:8443
OPENBOT_HOST 127.0.0.1
OPENBOT_PORT OPENBOT_DEV_HTTPS_PORT 的值
OPENBOT_DATABASE_URL postgres://openbot_dev:openbot_dev@127.0.0.1:5433/openbot
OPENBOT_TLS_CERT .devenv/dev/cert.pem,由 mkcert 生成
OPENBOT_TLS_KEY .devenv/dev/key.pem,由 mkcert 生成

只有开发入口会读取 OPENBOT_DEV_PUBLIC_ORIGIN。它不需要设置步骤。每次启动时,它会自己为这个源写入平台设置。它会把本地账号 developer@localhost.test 设为平台管理员,并打开本地测试登录。参见身份验证。

生产程序永远不会使用本地测试账号。没有任何开关可以打开它。

要使用另一个数据库,请在 .env.development 中设置 OPENBOT_DATABASE_URL。参见参与贡献。


示例

这是一个实例的完整生产环境文件:

Terminal window
OPENBOT_DATABASE_URL=postgres://openbot:secret@db.example.com:5432/openbot
OPENBOT_SECRET_KEYS=k1:<output of openssl rand -hex 32>

其他所有设置都来自设置程序和 API。