- 服务端可以托管前端构建产物(AGENTLAB_WEB_DIST):页面路由回退到 index.html,/api 下不存在的路径照旧是 JSON 404, 挡住路径穿越;index.html 不缓存,assets/ 带哈希的文件长缓存;没设时行为完全不变 - scripts/prod.sh:不用 Docker 的生产运行。按需构建前端,单进程、不热重载,默认只听本机,--host 开放到局域网并提示没有登录 - Dockerfile(多阶段构建,Linux 镜像):前端在构建机架构上构建,运行阶段用 python:3.12-slim,依赖装进独立的 venv, 以非 root 用户(uid 10001)运行,数据在 /data,带健康检查;.dockerignore 排除 .env、data/、各种库文件,镜像里实测没有密钥和数据库 - scripts/package-docker.sh:构建指定平台的镜像(默认按本机架构,可选 linux/amd64),打成 release/agentlab-<版本>-linux-<架构>.tar,里面有 image.tar、deploy.sh、agentlab.env、README.md、SHA256SUMS - deploy/deploy.sh:目标机上只依赖 Docker,离线可用。install / start / stop / restart / status / logs / upgrade / uninstall; 检查架构和配置,自动导入镜像,替换容器时保留旧容器以便回退,数据永远保留,日志轮转 - 修正 bubblewrap 的可用性判断:以前只看有没有装 bwrap,容器里和 Ubuntu 24.04 默认配置下装了却建不了命名空间, 每次执行代码都失败;现在真起一次试,不能用就退回下一个后端,并写明原因 - README 增加「生产部署」一节,部署细节见 deploy/README.md
AgentLab 离线部署说明
版本 AGENTLAB_VERSION · 架构 linux/AGENTLAB_ARCH
这个包在一台只装了 Docker Engine、不能联网的 Linux 机器上部署 AgentLab。 不需要 docker compose,不需要 Python、Node,也不需要联网。
包里有什么
| 文件 | 用途 |
|---|---|
image.tar |
Docker 镜像(docker save 导出),镜像名 agentlab:__AGENTLAB_VERSION__ |
deploy.sh |
一键部署脚本:安装、启动、停止、升级、卸载 |
agentlab.env |
配置:端口、监听地址、数据目录、模型 Key、代理、沙箱 |
README.md |
本说明 |
SHA256SUMS |
校验和。拷完先校验:sha256sum -c SHA256SUMS(改过 agentlab.env 之后它那一行会对不上,正常) |
前提条件
- Ubuntu 24.04(别的 64 位 Linux 发行版一般也行),已装好 Docker Engine 并在运行;
- 架构要一致:这个包是
linux/__AGENTLAB_ARCH__。在目标机上运行uname -m:aarch64对应 arm64(ARM 单板机要装 64 位系统),x86_64对应 amd64。不一致的镜像跑不起来, deploy.sh 会在导入前就报出来; - 磁盘:镜像导入后约 0.6~0.8 GB(看 Docker 用的存储方式),另留数据目录的空间;
- 当前用户能用 docker(在
docker组里),或者用sudo运行 deploy.sh。
三步部署
# 1. 解包
tar -xf agentlab-__AGENTLAB_VERSION__-linux-__AGENTLAB_ARCH__.tar
cd agentlab-__AGENTLAB_VERSION__-linux-__AGENTLAB_ARCH__
# 2. 按需修改配置(端口、监听地址、数据目录、模型 Key……每一项都有注释)
nano agentlab.env
# 3. 部署
./deploy.sh
deploy.sh 依次:检查 docker 和架构 → 导入镜像(docker load -i image.tar,本机已有就跳过)→
创建数据目录 → 启动容器(--restart unless-stopped,开机自动起来)→ 等健康检查通过 → 打印访问地址。
访问
浏览器打开 deploy.sh 最后打印的地址,默认 http://<这台机器的 IP>:8000。
端口改 HOST_PORT;只给本机用的话把 BIND_ADDR 改成 127.0.0.1。
第一次打开就能用:内置的演示模型不需要 API Key,编排链路能完整走一遍。接入真实模型有两种方式:
- 在
agentlab.env里填ANTHROPIC_API_KEY/OPENAI_API_KEY,第一次启动时自动导入成模型接入; - 或者启动后在界面「设置 → 模型接入」里配。
注意:环境变量只在第一次启动(库里还没有任何模型接入)时导入,之后要改 Key 请到界面里改。
数据和备份
所有数据都在 DATA_DIR(默认是包目录下的 data/):数据库 agentlab.db、执行断点 checkpoints.db、
工件、上传文件、沙箱工作区,以及加密密钥 .secret_key。要备份的就是这个目录,
丢了 .secret_key,存进去的 API Key 就解不开了。
deploy.sh 会把数据目录的属主改成容器里的用户(uid 10001),所以备份、删除要用 sudo。
停下来备份最稳妥(以默认的 ./data 为例,在包目录里执行):
./deploy.sh stop
sudo tar -czf ../agentlab-data-$(date +%Y%m%d).tar.gz data
./deploy.sh start
恢复:停掉容器,把备份解回 DATA_DIR,再 ./deploy.sh start。
升级
把新版本的离线包拷到机器上,解到一个新目录,然后:
cd agentlab-<新版本>-linux-__AGENTLAB_ARCH__
cp ../agentlab-<旧版本>-linux-__AGENTLAB_ARCH__/agentlab.env . # 沿用原来的配置
# 数据目录是相对路径(./data)的话,把 agentlab.env 里的 DATA_DIR 改成原来那个目录的绝对路径
./deploy.sh upgrade
upgrade 导入新镜像、用新镜像替换容器,数据目录不动。deploy.sh 会检查新配置指向的数据目录和
正在用的是不是同一个,不是就停下来提醒,不会让新版本悄悄从一个空库开始。
新容器没通过健康检查时,原来的容器会保留为 agentlab-previous,屏幕上会打印回退命令。
旧镜像也留着,确认新版本没问题后可以 docker rmi agentlab:<旧版本> 删掉。
查看状态和日志
./deploy.sh status # 容器状态、健康检查、数据目录、访问地址
./deploy.sh logs # 最后 200 行
./deploy.sh logs -f # 持续跟随,Ctrl-C 退出
./deploy.sh logs --tail 1000
日志由 docker 自动轮转(单个 10 MB、保留 3 个),不会塞满存储卡。
停止和卸载
./deploy.sh stop # 停止(开机也不会自动起来)
./deploy.sh start # 再启动
./deploy.sh restart # 重启
./deploy.sh uninstall # 删除容器,保留数据和镜像
./deploy.sh uninstall --purge-image # 连镜像一起删
卸载永远不删数据。确定不要了再手动删除数据目录(不可恢复):sudo rm -rf <数据目录>。
改了 agentlab.env 之后运行 ./deploy.sh install 让新配置生效(restart 不会重读配置)。
安全提示
- AgentLab 没有登录。 同一网络里打得开页面的人都能用它:跑工作流、花你配的模型额度、 读你接入的数据源、在沙箱里执行代码。只在信得过的网络里开。
- 用防火墙限制能访问端口的来源。注意 Docker 发布的端口会绕过 ufw 的默认规则,要么把
BIND_ADDR设成具体网卡的地址或127.0.0.1,要么在DOCKER-USER链里加规则。 - 需要多人使用时,把
BIND_ADDR改成127.0.0.1,前面另配一个带登录的反向代理。 - API Key 加密存在数据目录里,密钥也在数据目录里:数据目录的备份要和 Key 一样保管好。
代码沙箱
工作流里的代码节点、界面上的沙箱都在服务端执行代码。容器里能用哪种隔离,实测结果如下:
| 容器权限 | 实际使用的沙箱 | 隔离效果 |
|---|---|---|
默认(ENABLE_BWRAP=0) |
local:容器里的普通子进程 | 隔离边界只有容器本身。代码伤不到宿主机,但和 AgentLab 同一个容器、同一个用户,读得到数据目录里的数据库和加密密钥、读得到传进容器的 API Key、能联网 |
ENABLE_BWRAP=1 |
bubblewrap | 代码看不到数据目录、看不到别的进程,默认断网 |
默认权限下 bubblewrap 无法创建命名空间(Docker 默认的系统调用过滤不允许),AgentLab 会自动退回 local,
「设置 → 运行环境」里的「选择原因」会写明。只运行你信得过的工作流;完全不需要执行代码的话,
在 agentlab.env 里设 AGENTLAB_SANDBOX_BACKEND=off。
要用 bubblewrap:把 agentlab.env 里的 ENABLE_BWRAP 改成 1,运行 ./deploy.sh install。
deploy.sh 会给容器加 --security-opt seccomp=unconfined、--security-opt systempaths=unconfined、
--security-opt apparmor=unconfined。代价是整个容器少了系统调用过滤和对 /proc、/sys 部分路径的遮蔽,
内核暴露给容器的面变大(AgentLab 自己仍以非 root 运行)。这组权限在 Docker Desktop(arm64)上实测生效。
Ubuntu 24.04 默认还限制非特权 user namespace:开了之后「设置 → 运行环境」里仍显示 local 的话,
要在宿主机上执行 sudo sysctl kernel.apparmor_restrict_unprivileged_userns=0,这会放宽整台机器的限制,自行权衡。
microVM(独立内核)需要 /dev/kvm 和额外下载的运行时与镜像,离线包默认不支持。
常见问题
端口被占用。 deploy.sh 报「端口 8000 已被别的程序占用」,或 docker 报 port is already allocated /
address already in use:改 agentlab.env 里的 HOST_PORT,再 ./deploy.sh install。
看是谁占着:sudo ss -ltnp 'sport = :8000'。
没有权限。 报 permission denied while trying to connect to the Docker daemon socket:
用 sudo ./deploy.sh,或者 sudo usermod -aG docker $USER 后重新登录。
数据目录建不了:用 sudo,或者把 DATA_DIR 改到有写权限的位置。
架构不对。 报「架构不一致」或容器日志里有 exec format error:这个包是 linux/__AGENTLAB_ARCH__,
和 uname -m 对不上。在打包的机器上按目标机的架构重新打一份
(./scripts/package-docker.sh --platform linux/arm64 或 linux/amd64)。ARM 单板机要装 64 位系统。
健康检查不过。 deploy.sh 会打出容器最后 60 行日志,先看那里。常见原因:
- 数据目录写不进去(日志里有
Permission denied/unable to open database file):确认DATA_DIR没指到只读的位置,重新运行./deploy.sh install,它会修正属主; - 机器太慢,启动超过 3 分钟:
./deploy.sh status看看,变成healthy就是好了; agentlab.env里的值带了引号、或者注释写在了值后面:去掉。
sha256sum -c 报 image.tar FAILED。 包在拷贝中损坏了,重新拷一份。