自托管远程访问¶
本指南介绍如何运行你自己的账户服务(Account API Worker)、Signal 和 TURN 以实现远程访问。当你不希望 api.openbot.run 和 signal.openbot.run 承担你的账户和连接设置时,可以使用本指南。
我们的 Worker 不会为另一个 Signal 签发票据。票据授予对主机的访问权限,并由我们的密钥签名,因此为你的 Signal 签发的票据也会打开我们的 Signal。因此,自托管的 Signal 需要拥有自身密钥的自托管账户服务。参见 issue #1263。
变更内容¶
- 你服务上的账户与
openbot.run上的账户相互独立。每个人需要重新登录。 - 连接到主机的每个桌面端和手机端都必须使用相同的服务。
- 邀请是
openbot://join链接。从应用复制链接并自行发送。应用不会通过电子邮件发送邀请。 openbot.run/app上的浏览器客户端不适用于你的服务。- 托管服务器、OpenBot GitHub App、Slack、OpenBot Telegram 机器人和 iPhone Live Activity 中继保持关闭。每个都需要只有我们才有的机密信息。
- PRIVACY.md 中的其他网络连接不变。
你需要什么¶
- 一个已启用 Workers、D1 和 R2 的 Cloudflare 账户,并在 Cloudflare 上拥有一个域名。
- 一台带有 Docker Engine、Docker Compose 和静态公网 IPv4 地址的 Linux 服务器。有关端口和 DNS,请参阅 Signal 生产环境要求。
- 一个在 465 端口接受 TLS 的 SMTP 账户。登录时通过电子邮件发送一次性代码。
- 一份你运行的 OpenBot 发行版的克隆,以及 Bun。
在示例中,账户服务为 api.example.com,Signal 为 signal.example.com,TURN 为 turn.example.com。请使用你自己的名称。
1. 生成密钥¶
在仓库根目录运行此命令。它会输出票据密钥对:
bun -e 'const { generateKeyPairSync } = require("node:crypto"); const kid = "self-hosted-1"; const meta = { kid, alg: "ES256", use: "sig" }; const { privateKey, publicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" }); console.log(`REMOTE_TICKET_KEY_ID=${kid}`); console.log(`REMOTE_TICKET_PRIVATE_JWK=\x27${JSON.stringify({ ...privateKey.export({ format: "jwk" }), ...meta })}\x27`); console.log(`REMOTE_TICKET_PUBLIC_JWKS=\x27${JSON.stringify({ keys: [{ ...publicKey.export({ format: "jwk" }), ...meta }] })}\x27`);'
使用 openssl rand -base64 48 生成其他每个密钥:
| 密钥 | 位置 |
|---|---|
REMOTE_AUTH_WEBHOOK_SECRET |
Worker 和 Signal。两者使用相同的值。 |
SKILLS_ADMIN_TOKEN, SITE_REPORT_HASH_SECRET |
Worker |
REMOTE_SESSION_SECRET, TURN_SHARED_SECRET, REMOTE_METRICS_TOKEN |
Signal |
请对私有 JWK 密钥保密。有了它,任何人都能打开使用你的服务的每台主机。
2. 部署账户服务¶
- 安装依赖并登录 Cloudflare:
bun install --frozen-lockfile
cd apps/auth-api
bunx wrangler login
bunx wrangler d1 create openbot-auth
bunx wrangler r2 bucket create openbot-avatars
bunx wrangler r2 bucket create openbot-skills
bunx wrangler r2 bucket create openbot-sites
- 编辑
apps/auth-api/wrangler.jsonc的顶层内容。不要更改env部分。 routes:将所有条目替换为{ "pattern": "api.example.com", "custom_domain": true }。d1_databases:将database_id设置为d1 create输出的 ID。r2_buckets:如果你使用了其他名称,请设置存储桶名称。-
vars:EMAIL_SMTP_HOST,EMAIL_SMTP_PORT,EMAIL_SMTP_USERNAME,EMAIL_FROM:你的 SMTP 账户。REMOTE_TICKET_KEY_ID:步骤 1 中的密钥 ID。REMOTE_SIGNAL_URL:wss://signal.example.com/v1/signal。REMOTE_AUTH_WEBHOOK_URL:https://signal.example.com/internal/auth-events。HOSTED_SERVERS_ENABLED:"false"。
-
将 Worker 密钥放入
apps/auth-api/.env.self-hosted。Git 会忽略此文件名。
EMAIL_SMTP_PASSWORD=...
SKILLS_ADMIN_TOKEN=...
SITE_REPORT_HASH_SECRET=...
REMOTE_TICKET_PRIVATE_JWK='{"kty":"EC",...}'
REMOTE_TICKET_PUBLIC_JWKS='{"keys":[...]}'
REMOTE_AUTH_WEBHOOK_SECRET=...
- 部署。该脚本会放入密钥、应用 D1 迁移、构建并部署 Worker:
- 检查服务。每个命令都必须返回
200:
curl -fsS https://api.example.com/health/live
curl -fsS https://api.example.com/.well-known/jwks.json
3. 启动 Signal 和 TURN¶
- 将
remote/.env.example复制为remote/.env.self-hosted,并设置以下值: SIGNAL_DOMAIN,TURN_DOMAIN,TURN_PUBLIC_IP,ACME_EMAIL。CLOUDFLARE_DNS_API_TOKEN:一个对你的区域具有 DNS 编辑权限的令牌,用于证书。REMOTE_TICKET_JWKS_URL:https://api.example.com/.well-known/jwks.json。REMOTE_CONTROL_PLANE_URL:https://api.example.com。- 步骤 1 中的 Signal 密钥。
- 将
SLACK_SIGNING_SECRET、DISCORD_BOT_TOKEN、DISCORD_APPLICATION_ID和TELEGRAM_*的值留空。
如果反向代理已经使用了 443 端口,还要设置 反向代理说明 中的值。
- 启动服务并检查 Signal:
docker compose -f remote/compose.yaml --env-file remote/.env.self-hosted up -d --build
curl -fsS https://signal.example.com/health/ready
4. 启动应用¶
在每台用于托管或连接的计算机上执行以下步骤。
- 如果你之前登录过
openbot.run,请在应用中退出登录。否则应用会将旧的会话令牌发送到你的服务。 - 退出应用。然后使用这两个变量启动它。
OPENBOT_REMOTE_SIGNAL_URL必须与你的 Worker 的REMOTE_SIGNAL_URL相同。
macOS:
OPENBOT_AUTH_API_URL=https://api.example.com \
OPENBOT_REMOTE_SIGNAL_URL=wss://signal.example.com/v1/signal \
/Applications/OpenBot.app/Contents/MacOS/OpenBot
Linux:
OPENBOT_AUTH_API_URL=https://api.example.com \
OPENBOT_REMOTE_SIGNAL_URL=wss://signal.example.com/v1/signal \
./OpenBot-<version>-x86_64.AppImage
Windows (PowerShell):
$env:OPENBOT_AUTH_API_URL = "https://api.example.com"
$env:OPENBOT_REMOTE_SIGNAL_URL = "wss://signal.example.com/v1/signal"
& "$env:LOCALAPPDATA\Programs\OpenBot\OpenBot.exe"
这是默认安装文件夹。如果你在安装程序中选择了一个不同的文件夹,请使用该文件夹。
- 使用电子邮件地址登录。验证码来自你的 SMTP 账户。
- 要连接 iPhone,请扫描桌面应用中的连接二维码。手机随后会使用该桌面的
服务。手机上的电子邮件登录始终使用
openbot.run,因此无法 连接到自托管服务。
每次启动应用时都要设置这些变量。如果没有设置,应用会使用 openbot.run 并将你的会话令牌发送到那里。要恢复使用 openbot.run,请先退出登录。
如果 OPENBOT_REMOTE_SIGNAL_URL 不是 wss: URL、包含用户名或密码,或者在未设置 OPENBOT_AUTH_API_URL 的情况下被设置,应用将无法启动并显示错误。
更新¶
每次 OpenBot 更新后,拉取相同的发布版本,保留你对 wrangler.jsonc 的修改,并重新部署 Worker。部署会应用新的 D1 迁移。然后使用相同的 docker compose 命令重新构建 Signal。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 openbo/openbot