跳转至

自托管远程访问

本指南介绍如何运行你自己的账户服务(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. 部署账户服务

  1. 安装依赖并登录 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
  1. 编辑 apps/auth-api/wrangler.jsonc 的顶层内容。不要更改 env 部分。
  2. routes:将所有条目替换为 { "pattern": "api.example.com", "custom_domain": true }。
  3. d1_databases:将 database_id 设置为 d1 create 输出的 ID。
  4. r2_buckets:如果你使用了其他名称,请设置存储桶名称。
  5. 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"。
  6. 将 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=...
  1. 部署。该脚本会放入密钥、应用 D1 迁移、构建并部署 Worker:
bunx dotenvx run -f .env.self-hosted -- bun ../../scripts/deploy-auth-api.ts
  1. 检查服务。每个命令都必须返回 200:
curl -fsS https://api.example.com/health/live
curl -fsS https://api.example.com/.well-known/jwks.json

3. 启动 Signal 和 TURN

  1. 将 remote/.env.example 复制为 remote/.env.self-hosted,并设置以下值:
  2. SIGNAL_DOMAIN, TURN_DOMAIN, TURN_PUBLIC_IP, ACME_EMAIL。
  3. CLOUDFLARE_DNS_API_TOKEN:一个对你的区域具有 DNS 编辑权限的令牌,用于证书。
  4. REMOTE_TICKET_JWKS_URL:https://api.example.com/.well-known/jwks.json。
  5. REMOTE_CONTROL_PLANE_URL:https://api.example.com。
  6. 步骤 1 中的 Signal 密钥。
  7. 将 SLACK_SIGNING_SECRET、DISCORD_BOT_TOKEN、DISCORD_APPLICATION_ID 和 TELEGRAM_* 的值留空。

如果反向代理已经使用了 443 端口,还要设置 反向代理说明 中的值。

  1. 启动服务并检查 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. 启动应用

在每台用于托管或连接的计算机上执行以下步骤。

  1. 如果你之前登录过 openbot.run,请在应用中退出登录。否则应用会将旧的会话令牌发送到你的服务。
  2. 退出应用。然后使用这两个变量启动它。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"

这是默认安装文件夹。如果你在安装程序中选择了一个不同的文件夹,请使用该文件夹。

  1. 使用电子邮件地址登录。验证码来自你的 SMTP 账户。
  2. 要连接 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