
配置 OpenMuse 浏览器 Worker持久化 Chromium 会话与 Docker 部署详解【免费下载链接】openmuseA personal agent with a browser, terminal, files, and work that keeps going built with CopilotKit and AG-UI.项目地址: https://gitcode.com/gh_mirrors/op/openmuseOpenMuse 是一个自带浏览器、终端和文件系统的个人 AI 智能体Agent由 CopilotKit 与 AG-UI 构建。它的浏览器 Worker 是一个独立的 Node Playwright 服务让 Agent 拥有可持久化的 Chromium 会话登录状态、下载的文件在重启后依然保留。本文带你用 Docker 完成一次安全的浏览器 Worker 部署并理解会话持久化背后的机制。浏览器 Worker 是什么OpenMuse 把浏览器能力拆成独立进程而不是塞进 API 服务器组件位置职责API 服务器apps/server/应用认证、用户归属、任务调度浏览器 Workerapps/worker/托管 Chromium执行导航、截图、点击、读取页面两者之间只靠一个**令牌Token**通信服务器把WORKER_TOKEN放在请求头里Worker 用 SHA-256 哈希做恒定时间比较来鉴权见 apps/worker/src/server.ts。令牌只存在于服务器端永远不会发给浏览器或手机客户端。上图右侧的接管控制台展示的就是 Worker 里那个持久化 Chromium 会话的实时画面——你随时可以抢过方向盘亲自操作。持久化 Chromium 会话登录状态为什么不会丢每个会话一个独立 Profile 目录Worker 为每个会话分配一个固定的 UUID由服务器在调用 Worker 之前生成并用chromium.launchPersistentContext把 Chromium 的完整用户资料放在该 UUID 对应的目录里apps/worker/src/browser.ts数据目录/ ├── uuid/ │ ├── profile/ # Chromium 用户资料localStorage、缓存等 │ ├── storage.json # 关闭会话时导出的 Cookie 状态 │ ├── session.json # 会话元数据标题、URL、状态 │ ├── downloads/ # 已接受的 PDF 文件 │ └── download-outcomes/ # 被拒绝/中断的下载记录再次打开同一个 UUID 时Worker 会重新加载这份 Profile 并把 Cookie 注入新上下文browser.ts——这就是持久化会话的核心关闭会话、甚至重启容器登录都不会掉。关闭与重启时各保留什么优雅关闭先把storageStateCookie写入storage.json再把状态置为closedbrowser.ts进程重启启动时扫描数据目录从每个session.json恢复会话元数据下载失败记录也一并恢复browser.ts首次导航失败会自动清理这次没用的空 Profile避免占位而已存在的 Profile 不受影响。 注意删除 Docker 卷volume等于删除所有保存的登录与下载。该卷包含敏感浏览器状态应按与文档存储相同的级别控制访问权限。下载的文件也会留下来页面里下载的文件只有PDF会被持久保存最多 20 个、单个 10 MiB见 apps/worker/src/downloads.ts。Worker 会校验%PDF-文件头和真实字节数后才发布元数据超限的传输会被取消最新的 100 条被拒下载记录可跨重启保留——即使一个 PDF 都没成功应用端也能看到哪些文件被拒了。Docker 一键部署最快配置方法第 1 步准备仓库与令牌git clone https://gitcode.com/gh_mirrors/op/openmuse cd openmuse生成一个至少 32 字符的随机令牌写入服务器.env服务器与运行 Compose 的环境必须使用同一个令牌export WORKER_TOKEN$(openssl rand -hex 32)第 2 步Compose 启动 Workerdocker compose -f infra/compose.yaml up --build -d然后在服务器.env中指向它BROWSER_WORKER_URLhttp://127.0.0.1:8790镜像基于官方 Playwright 基础镜像构建Playwright 与 Chromium 版本天然匹配构建只使用 worker 自带的 npm lockfileapps/worker/Dockerfile。第 3 步了解内置的安全加固infra/compose.yaml 里已经做了一组生产级加固无需额外配置加固项配置作用回环端口127.0.0.1:8790:8790Worker 只监听本机不暴露到局域网数据卷browser-profiles:/dataChromium Profile 持久化到命名卷只读根文件系统read_only: true容器镜像层不可写内存上限mem_limit: 2g防止 Chromium 吃光宿主内存进程数上限pids_limit: 256抑制 fork 炸弹临时文件系统tmpfs /tmp 256MiB限制下载中转的缓冲空间权限剥离cap_drop: ALLno-new-privileges最小权限运行pwuser用户健康检查GET /health每 15 秒探测一次进程健康如果以后把 API 也容器化进同一 Compose 网络把地址换成http://browser-worker:8790即可。网络边界浏览器只能访问公网这是 Worker 最值得称道的设计apps/worker/src/proxy.ts apps/worker/src/network.ts白名单校验只允许 80/443 端口的公共 HTTP(S) 地址私有网段、回环、多播等一律拒绝出口代理Chromium 的所有请求都经过一个本机回环代理代理对每个目标做 DNS 解析并直连已验证的 IP防止第二次 DNS 解析把套接字重绑到内网地址DNS 重绑定攻击协议封堵禁用 QUIC 与非代理 WebRTC UDPHTTPS 隧道仅放行 443。这套策略是应用层执行的出口管控不是内核防火墙。需要多租户部署时可参考 Playwright 官方的容器加固指南进一步收紧。关键配额与限制一览 限制数值同时活跃会话3 个已保存 Profile20 个空闲关闭30 分钟导航超时20 秒API 请求体64 KiB每会话 PDF 下载20 个单个 ≤ 10 MiB页面读取文本上限100,000 字符常见错误码SESSION_LIMIT409会话已满、BLOCKED_URL400目标被网络边界拦截、NAVIGATION_FAILED502、DOWNLOAD_TOO_LARGE413。完整列表见 apps/worker/README.md。本地开发模式不用 Dockerpnpm install --frozen-lockfile pnpm --dir apps/worker exec playwright install chromium pnpm dev:browser本地 Worker 默认绑定127.0.0.1:8790Profile 存放在.openmuse/browser-profiles可用WORKER_DATA_DIR指定其他目录。验证部署是否成功依次执行三条检查即可确认 Worker 完全可用# 1. 进程健康检查 curl http://127.0.0.1:8790/health # 期望 {status:ok} # 2. 仓库级浏览器 API 测试不启动 Chromium pnpm exec tsx --test tests/browser.test.ts # 3. 真实 Chromium 全链路测试一次性容器自动清理 node apps/worker/tests/run-docker.mjs第三条测试会覆盖鉴权、公网导航、截图尺寸、控制台输入、重定向拦截、真实 PDF 下载以及重启后的 Profile 与 localStorage 持久化——正是本文主题的直接验证。小结浏览器 Worker 是独立的 Playwright 服务靠 32 字符令牌与服务器通信每个会话拥有固定 UUID 的 Chromium Profile登录状态跨重启保留docker compose -f infra/compose.yaml up --build -d即可部署加固开箱即用网络出口被代理严格限制为公网 HTTP(S)是个人智能体里少见的边界设计。更多边界与验证细节可阅读 apps/worker/README.md 与 docs/VERIFICATION.md。【免费下载链接】openmuseA personal agent with a browser, terminal, files, and work that keeps going built with CopilotKit and AG-UI.项目地址: https://gitcode.com/gh_mirrors/op/openmuse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考