自托管服务器¶
自托管服务器是在您自己的无屏幕计算机(VPS、家用服务器或云 VM)上运行的 Linux OpenBot 构建。它是您账户中的普通远程主机。您可以通过桌面应用、iPhone 应用或 openbot.run/app 使用它,就像使用托管服务器一样。您从终端安装和控制它。
若要在容器中运行,请参阅 Docker。
安装¶
在带有 systemd 的 Ubuntu 24.04 或 26.04(x86_64 或 arm64)上:
curl -fsSL https://raw.githubusercontent.com/nightly-labs/openbot/main/scripts/install-server.sh | sudo bash
sudo openbot login
openbot login 会询问您的电子邮件以及 OpenBot 发送到该邮箱的验证码。登录后,服务器会显示在该账户的服务器列表中。其名称为“OpenBot”;您可以使用 sudo openbot login --name <name> 或 sudo openbot name <name> 来指定其他名称。名称长度为 6 到 32 个字符。然后,像在托管服务器上一样,从应用连接提供商(参见提供商)。
使用服务器领取码登录¶
为他人设置服务器的操作员无需验证码即可将其登录。操作员为所有者的电子邮件创建一个一次性领取码,服务器随后兑换该领取码。所有者无需执行任何操作:当他们使用该电子邮件登录 OpenBot 时,服务器就在他们的服务器列表中。
printf '{"email":"%s"}' owner@example.com |
curl --fail -sS -X POST https://api.openbot.run/v2/admin/server-claims \
-H @server-claims.header -H 'content-type: application/json' --data-binary @- |
sed -n 's/.*"claim":"\([A-Za-z0-9_-]*\)".*/\1/p' |
sudo openbot login --claim --name <name>
server-claims.header 包含一行 Authorization: Bearer <token>,这样令牌就不会出现在进程参数中。出于同样的原因,openbot login --claim 从标准输入读取领取码,或在终端中无回显地询问。
POST /v2/admin/server-claims需要账户服务的SERVER_CLAIMS_ADMIN_TOKEN。当该电子邮件不存在账户时,它创建该账户,并返回{"claim", "expiresAt"}。- 领取码只能使用一次,有效期 15 分钟。账户服务只保存其哈希值。
- 服务器将其发送到
POST /v2/server-claims/redeem,并获得所有者的一次会话。此后所有者就是该服务器的唯一所有者。操作员不需要所有者的电子邮件或密码。 - 已使用或已过期的领取码会返回
server_claim_invalid。如果服务器未收到响应,请创建新的领取码。
任何拥有管理员令牌的人都可以为任意电子邮件获取会话,包括现有账户。令牌只能保存在操作员的计算机上。所有者可以在其账户会话中看到每个已领取的服务器会话,并在那里撤销。
安装选项位于 sudo bash -s -- 之后:
| 选项 | 默认值 | 用途 |
|---|---|---|
--user <name> |
已安装的用户,否则为 openbot |
运行 OpenBot 及其代理的用户。如果该用户不存在,安装过程会创建它,其主目录位于 /var/lib/<name>。 |
--auth-api-url <origin> |
已安装的地址,否则为构建中的 URL | 另一个账户服务器,例如 test Worker 或自托管账户服务。 |
--display-size <W>x<H> |
已安装的设置,否则为 1280x800 |
Computer Use 读取的虚拟显示大小(参见显示大小)。 |
再次运行安装脚本可重新安装或升级。数据保留在服务用户的主目录中。重新安装会保留用户和账户服务器,因为登录信息属于它们,并且会拒绝另一个 --user。未使用 --display-size 的重新安装会保留显示大小。安装程序会拒绝低于已安装版本的旧版本,因为旧版 OpenBot 无法打开新版 OpenBot 迁移过的数据库。如果计算机本身是托管服务器,它也会拒绝安装。
命令¶
| 命令 | 用途 |
|---|---|
openbot status |
显示版本、账户、服务器状态、内存和暂存更新。 |
openbot login [<email>] [--name <name>] |
使用电子邮件验证码登录。 |
openbot login --claim [--name <name>] |
使用操作员的一次性领取码登录(参见使用服务器领取码登录)。 |
openbot mobile-connect |
为手机应用显示 Mobile Connect 二维码(参见手机应用)。 |
openbot logout |
退出登录。在下次登录之前,服务器不可用。 |
openbot name <name> |
更改服务器名称。 |
openbot logs [-f] |
显示 openbot.service 的日志。 |
sudo openbot start\|stop\|restart |
控制 openbot.service。 |
sudo openbot update |
立即下载、检查并安装最新版本。 |
sudo openbot uninstall |
退出登录并移除 OpenBot。数据保留(参见移除)。 |
openbot version |
显示已安装的版本。 |
使用 sudo 或以服务用户身份运行账户命令。其他用户无法打开控制套接字。
内存¶
自托管服务器使用与托管服务器相同的内存保护机制(参见内存)。当可用内存不足时,新的回合会在队列中等待,并在内存可用时重新开始。来自人的消息会优先启动。浏览器不会打开新标签页,并会更快地卸载空闲页面。同一时间运行的回合数量是固定的:内存不超过 5 GiB 时为 2,不超过 10 GiB 时为 8,更高时为 16。
内存上限取机器内存与 openbot.service 的限制(MemoryMax=90%)两者中的较小值。若要为 OpenBot 分配更少内存,可使用 sudo systemctl edit openbot.service 调低限制,例如 MemoryMax=2G,然后重启服务。回合上限和低内存级别随后会使用新的上限。openbot status 显示上限、可用内存、级别(ok、low 或 critical)以及回合上限:
该保护机制读取 cgroup v2。在 cgroup v1 系统上,它使用机器内存,并且日志中有一条警告。
代理进程以 nice 10 和 OOM 值 500 运行,包括代理分离出的任务。在 critical 级别下,OpenBot 会先停止残留的代理进程。代理的 Node 程序会在 os.cpus() 中看到单元的 CPU 限制。参见代理进程。
显示大小¶
自托管服务器为代理提供虚拟显示(Xvfb),computer use 读取该显示。默认大小为 1280x800。Docker 容器使用相同的设置和相同的默认值。托管服务器为代理提供其船载桌面,此设置不会更改该桌面。
显示大小不会改变 OpenBot 浏览器(openbot_browser)。其页面有自己的大小,在没有面板显示它们时为 1200x800,并且其点击会作用于页面元素。
若要使用其他大小,请在安装时使用 --display-size 1920x1080 指定,或在 /opt/OpenBot/hosted/openbot.env 中写入以下行,然后运行 sudo openbot restart:
该值为 WIDTHxHEIGHT 形式的数字,范围从 640x480 到 2576x2576。安装程序会拒绝无效的值。启动时,无效值会在 openbot logs 中写入此警告,服务器将以 1280x800 启动:
使用哪种大小¶
除非代理使用的应用需要更多空间,否则请保持 1280x800。在 1280x800 下,computer use 点击更准确,截图消耗更少的 token。只有能完整读取 1920x1080 图像的模型才使用 1920x1080(请参阅 截图与点击)。
一次点击测试比较了这两种大小。一个模型在几乎占满显示的 xmessage 窗口中点击一个 26x17 px 的按钮,分别基于全屏截图和窗口截图各点击一次。这些模型是带图像输入的免费 OpenCode 模型(OpenCode 1.18.30、Docker 镜像 0.42.0、arm64):
| 模型 | 1920x1080,全屏 | 1920x1080,窗口 | 1280x800,全屏 | 1280x800,窗口 |
|---|---|---|---|---|
| MiMo v2.6 Flash | 命中 | 未命中 | 命中 | 命中 |
| DeepSeek v4.1 Flash | 未命中 | 未命中 | 命中 | 命中 |
| GLM 5.3 Flash | 命中 | 未命中 | 命中 | 未测试(429) |
| LongCat 2.5 Preview | 未命中 | 未命中 | 命中 | 命中 |
| Muse Spark 1.3 | 未命中 | 未命中 | 未命中 | 命中 |
| Nemotron 3.5 Super VL | 未命中 | 未命中 | 命中 | 命中 |
| Space Bunny | 命中 | 命中 | 命中 | 命中 |
| 命中 | 7 中 3 | 7 中 1 | 7 中 6 | 6 中 6 |
Claude 和 Codex 模型未参与测试。
在 Claude 上,一张图像消耗 ⌈width / 28⌉ × ⌈height / 28⌉ 个视觉 token。1920x1080 的全屏截图所消耗的 token 约为 1280x800 截图的 2 倍:
| 显示大小 | 单张全屏截图的视觉 token |
|---|---|
| 1280x720 | 1196 |
| 1280x800 | 1334 |
| 1366x768 | 1372 |
| 1920x1080 | 2691 |
| 2560x1440 | 4784 |
截图与点击¶
computer use 驱动程序(cua-driver,cua-driver-rs-v0.34.0)在 Linux 上有两种截图:
- 单窗口(
get_window_state)。驱动会将图像缩小到 1.15 兆像素或更小,长边为 1568 px 或更短,并将每次点击的 x 和 y 转换回屏幕像素。1260x780 的窗口会以其完整大小到达模型。1900x1060 的窗口会以 1435x801 到达模型。此时小控件更难被点中,而且有些模型会以屏幕像素发送 x 和 y,导致点击落在控件之外。超出显示边缘的窗口不会产生截图。 - 全屏(
get_desktop_state)。驱动会以完整大小发送图像,并将点击的 x 和 y 视为屏幕像素。只有当模型以完整大小读取图像时,点击才能正确落位。
模型从 1920x1080 的全屏截图中读取到的是什么:
| 提供商 | 图像 |
|---|---|
| Claude 4.7 及更高版本、所有 Claude 5 模型 | 完整大小,长边最长 2576 px,最多 4784 个视觉 token(Vision) |
| Codex | 完整大小:限制为 2048 px 和 2500 个 32x32 px 的瓦片,而 1920x1080 为 2040 个瓦片 |
| Grok、Gemini、OpenCode、Cursor、Cline、Pi | 未知 |
任何 Claude 或 Codex 模型都不会缩小 1280x800 的截图。
手机应用¶
手机应用没有电子邮件登录。它通过 Mobile Connect 代码登录。服务器没有显示代码的屏幕,因此 openbot mobile-connect 会在终端中显示它:
- 使用
openbot login登录服务器。 - 运行
openbot mobile-connect。在容器中,运行docker exec -it <container> openbot mobile-connect。 - 在手机应用中选择 扫描二维码,然后扫描终端中的代码。
该代码让手机登录到服务器的账户。它只对一次登录有效,两分钟后过期。随后手机会显示该账户的所有服务器,并首先打开此服务器。与桌面应用一样,手机通过账户服务器和 Signal 连接。服务器不发布任何端口。
如果手机应用已通过桌面应用连接到同一账户,则该服务器已在服务器列表中。在桌面应用的 设置 > Mobile Connect 中,将手机从账户中移除。
卸载¶
sudo openbot uninstall 会先注销,然后移除服务、单元、AppArmor 配置文件、openbot 命令以及 /opt/OpenBot 中的服务器文件。它会保留服务用户的主目录和 /srv/openbot-hosted 中的密钥环。密钥环保存着该主目录中加密数据的密钥,因此请将两者一起保留或一起删除。使用相同 --user 的安装会再次使用它们。若要同时删除数据:
服务器仍会留在该账户的服务器列表中,处于离线状态。请在列表中移除它。
工作原理¶
install-server.sh 只下载发布版本。它读取最新 GitHub 发布版本中的 latest-linux.yml(在 arm64 上为 latest-linux-arm64.yml),检查 AppImage 的 SHA-512,解包并运行该发布版本中的 resources/hosting/openbot-server-setup。因此,安装步骤始终与它们所安装的构建版本相匹配。在此功能之前的发布版本没有 setup 文件,安装会停止并显示一条消息。
openbot-server-setup 使用托管服务器的安装步骤(openbot-hosted-update):安装 packages.txt 中的软件包,将发布版本复制到 /opt/OpenBot/app,并安装脚本、AppArmor 配置文件和单元。它将 self 写入 /opt/OpenBot/hosted/mode,并链接 /usr/local/bin/openbot。
当 mode 设置为 self 时,openbot-hosted-server 不会等待 claim(认领)或 boat 桌面。它会像在托管服务器上一样,启动一个带有已解锁密钥环的 D-Bus 会话,并在 Xvfb 下以 OPENBOT_SERVER=1 运行 OpenBot。随后,Main(src/main/server-mode.ts)会打开控制套接字 /run/openbot/control.sock,并在每次登录后发布主机。
该服务器有两个 Xvfb 显示,分别位于两个共享同一授权文件的嵌套 xvfb-run 命令中。外层命令启动代理显示,尺寸为显示尺寸,脚本将其命名为 OPENBOT_AGENT_DISPLAY。内层命令启动 OpenBot 用于显示其窗口的显示,尺寸为 1280x800。Main 将该显示提供给 Computer Use、远程桌面以及代理进程,因此代理的截图和远程桌面不会显示 OpenBot 窗口。参见 Computer Use 和远程桌面。
更新机制与托管服务器上相同(参见 Updates):定时器会暂存新版本,它会在下次启动时,或当所有者、管理员或受许可成员在 Server Settings > Updates 中安装它时开始运行。sudo openbot update 会暂存、停止服务、应用更新并重新启动服务。当某个步骤失败或收到信号而停止时,该命令会完成被中断的复制、启动服务,并以错误码退出。
控制套接字¶
openbot 命令通过 Unix 套接字上的 HTTP 与 main 通信,使用表单主体和 key=value 文本应答,因此它只需要 curl。路由包括 GET /v1/status、POST /v1/login/start、POST /v1/login/verify、POST /v1/login/claim、POST /v1/name、POST /v1/mobile-connect 和 POST /v1/logout。
威胁模型:
- systemd 以模式 0700 为服务用户创建
/run/openbot,main 将套接字设为 0600。当目录属于其他用户或允许其他用户进入时,main 会拒绝监听。它绝不会删除套接字路径上非套接字的文件。 - 只有服务用户和 root 可以连接。代理以服务用户身份运行,并且已经能够完全访问其文件、密钥环和 OpenBot 数据库,因此该套接字不会给它们带来任何新的权限。
- 该套接字只应答一组固定的请求。它绝不会回传会话令牌、登录码或 claim(认领),且某个值无法在应答中新增一行。请求主体最多为 4 KiB。
- 服务器模式仅在设置了
OPENBOT_SERVER=1的打包 Linux 构建中启动,绝不会在托管服务器上启动,后者使用其 claim 进行登录。
尚未确认¶
- 完整安装仅在测试中运行于 Ubuntu 24.04。在 Debian 12 和 Debian 13 上,只测试了软件包步骤(
apt-get --dry-run)。Debian 12 对某些库的命名不带t64后缀,安装过程使用这些名称。 - Ubuntu 26.04:版本 0.48.1 在 Docker 镜像中的 Ubuntu 26.04.1 arm64 上进行了测试,使用
BASE=ubuntu:26.04以及不含libminiupnpc17的软件包列表(0.48.1 的列表会中止该构建)。服务器在启用 Electron 沙箱的情况下启动,openbot status正常应答,并以退出码 0 停止。带 systemd 的安装和原生 x86_64 运行未经过测试。 - Ubuntu 26.04 上的远程桌面:运行时构建使用
ldd检查 x86_64 运行时能在其中找到其所有库(参见 Linux 运行时)。在模拟环境下的 x86_64 Docker 镜像中,Sunshine 和 Moonlight Web 成功启动。Ubuntu 26.04 上的流式远程桌面会话未经过测试。 - 在首个包含安装文件的版本发布之前,完整安装未曾在 Linux 计算机上运行。它需要发布构建。
- 显示尺寸:显示尺寸、警告以及使用无效值启动的情况已在 Docker 镜像中测试。带
--display-size的安装未运行过。点击测试只在 arm64 上运行,使用一个xmessage按钮,每种模型、尺寸和截图各运行一次。Claude 和 Codex 未包含在内。超出显示边缘的窗口仅用xmessage测试过。窗口截图限制来自 cua-driver 源码(platform-linux/src/tools/impl_.rs中的get_window_state和get_desktop_state),Claude 的限制来自 Claude 文档。Codex 的限制来自codex-rs/utils/image,并且未再次检查。目前尚不清楚 Claude Code 或 Codex 在发送给模型之前是否会缩小截图。 - 两个显示在 Ubuntu 24.04 容器中使用 OpenBot 的替身进行了测试:OpenBot 获得 1280x800,代理显示获得显示尺寸,没有授权文件的进程无法打开代理显示。代理显示上的 Computer Use 和远程桌面未在服务器上测试。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 openbo/openbot