# OpenSandbox 配置

> FastGPT OpenSandbox 与 Agent Sandbox Proxy 配置

Source: https://doc.fastgpt.cn/zh-CN/self-host/config/sandbox/opensandbox

> OpenSandbox 方案默认未做网络隔离。如有安全隔离要求，请自行补充网络隔离策略。

OpenSandbox 适合需要自托管 Agent/Skill 沙盒运行环境的场景。FastGPT 通过 OpenSandbox Server 创建沙盒，并通过 Agent Sandbox Proxy 为浏览器提供文件、终端和预览访问能力。

## Docker Compose 配置

最新版 Docker Compose 已经包含 OpenSandbox Server、Volume Manager、Agent Sandbox Proxy 和沙盒运行时镜像配置，无需再单独合并其他 YAML 文件。

[查看最新版 docker-compose.yml（PgVector，中国大陆镜像源）](/deploy/docker/main/cn/docker-compose.pg.yml)

其他向量数据库和全球镜像源版本见 [Docker Compose 部署](/zh-CN/self-host/deploy/docker)。

## 环境变量配置

Docker Compose YAML 文件中已包含默认值，下文说明各变量的含义。本文对应最新配置，旧版配置请对照对应版本的 YAML 文件。

### OpenSandbox 服务

根据实际部署环境检查 Compose 文件中的以下配置：

| 配置                            | 说明                                                                                          |
| ----------------------------- | ------------------------------------------------------------------------------------------- |
| `x-volume-manager-auth-token` | Volume Manager 的认证 Token，需要与 FastGPT 的 `AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_TOKEN` 一致。 |
| `[server].api_key`            | OpenSandbox Server API Key，需要与 FastGPT 的 `AGENT_SANDBOX_OPENSANDBOX_API_KEY` 一致。            |
| `[docker].host_ip`            | 沙盒端点对 Proxy 可访问的宿主机地址，通常使用宿主机内网 IP 或 `host.docker.internal`。                                |
| Docker socket 挂载              | Docker runtime 需要挂载宿主机 Docker socket，默认是 `/var/run/docker.sock`；OrbStack 等环境需替换为实际 socket。  |

如果服务器配置了 `HTTP_PROXY` / `HTTPS_PROXY`，建议给 OpenSandbox Server 和 Volume Manager 显式配置 `NO_PROXY` / `no_proxy`。至少包含 `localhost,127.0.0.1,127.0.0.0/8,fastgpt-app,fastgpt-opensandbox-server,fastgpt-volume-manager,fastgpt-agent-sandbox-proxy,host.docker.internal`，避免内部服务调用经过代理。

### Agent Sandbox Proxy 服务

| 变量                                 | 默认值                                      | 说明                                                                            |
| ---------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------- |
| `PORT`                             | `1006`                                   | Proxy 容器监听端口，默认映射到宿主机 `3006`。                                                 |
| `PREVIEW_PORT`                     | 与 `PORT` 相同                              | 自 4.16 起可单独指定 HTTP 预览监听端口；修改后需同步调整宿主机端口映射和 `AGENT_SANDBOX_PREVIEW_PROXY_URL`。 |
| `AGENT_SANDBOX_PROXY_SECRET`       | 无                                        | 与 FastGPT 主服务共用的密钥，至少 32 位。                                                   |
| `FASTGPT_APP_URL`                  | `http://localhost:3000`                  | Proxy 回源 FastGPT 主服务的内网地址；官方 Compose 模板设置为 `http://fastgpt-app:3000`。         |
| `FASTGPT_APP_REQUEST_TIMEOUT_SECS` | `10`                                     | Proxy 回源请求超时时间，单位秒；官方 Compose 模板设置为 `60`，沙盒冷启动较慢时可适当调大。                       |
| `RUST_LOG`                         | `info,fastgpt_agent_sandbox_proxy=debug` | Proxy 服务日志级别。                                                                 |

自 4.16 起默认使用同一个端口提供 WebSocket 和 HTTP 预览。如果网关不支持同端口转发，可设置 `PREVIEW_PORT` 为其他容器端口（例如 `1007`），并将 Compose 端口映射改为 `3007:1007`，同时把 `AGENT_SANDBOX_PREVIEW_PROXY_URL` 指向新的 3007 端口。

### fastgpt-app 服务

在 Compose 文件的 `x-agent-sandbox-config` 中配置以下变量，使 `fastgpt-app` 和 `fastgpt-pro` 共用 OpenSandbox 配置：

```dotenv
AGENT_SANDBOX_PROVIDER=opensandbox

# FastGPT 访问 OpenSandbox Server 的内网地址和密钥
AGENT_SANDBOX_OPENSANDBOX_BASEURL=http://fastgpt-opensandbox-server:8090
AGENT_SANDBOX_OPENSANDBOX_API_KEY=replace_with_opensandbox_api_key
AGENT_SANDBOX_OPENSANDBOX_RUNTIME=docker
AGENT_SANDBOX_OPENSANDBOX_IMAGE=registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-agent-sandbox:v0.4.0
AGENT_SANDBOX_OPENSANDBOX_USE_SERVER_PROXY=true

# Volume Manager 地址、Token 和持久卷名称前缀
AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_URL=http://fastgpt-volume-manager:3000
AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_TOKEN=replace_with_volume_manager_token
AGENT_SANDBOX_OPENSANDBOX_VOLUME_NAME_PREFIX=fastgpt-session

# Agent Sandbox Proxy 配置
AGENT_SANDBOX_PROXY_SECRET=replace_with_32_chars_random_secret
AGENT_SANDBOX_PROXY_URL=wss://sandbox-proxy.example.com
AGENT_SANDBOX_PREVIEW_PROXY_URL=https://sandbox-proxy.example.com

# 单个沙盒的资源限制
AGENT_SANDBOX_CPU_COUNT=1
AGENT_SANDBOX_MEMORY_MIB=2048
AGENT_SANDBOX_STORAGE_SIZE_GI=1
# Kubernetes 运行态超卖倍数（CPU / 内存独立）：requests = limits / 对应值（1 = 该维度不超卖）
AGENT_SANDBOX_CPU_OVERCOMMIT_FACTOR=1
AGENT_SANDBOX_MEMORY_OVERCOMMIT_FACTOR=1
```

### 运行态镜像与 CPU 架构

`AGENT_SANDBOX_OPENSANDBOX_IMAGE` 是 OpenSandbox 创建 Agent Sandbox 时使用的完整运行态镜像地址。普通 `fastgpt-agent-sandbox` 镜像以非 root 用户运行，适合默认场景；需要修改 `/etc/apt` 或安装 apt 依赖时，必须使用 `fastgpt-agent-sandbox-root` 镜像，并同时配置 `AGENT_SANDBOX_APT_MIRROR`。

官方镜像的同一 tag 同时包含 `amd64` 和 `arm64` 架构，两个架构使用相同的环境变量配置，Docker 会根据 OpenSandbox Server 所在宿主机的架构自动选择镜像：

| 用途     | 镜像                                                                            |
| ------ | ----------------------------------------------------------------------------- |
| 非 root | `registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-agent-sandbox:v0.4.0`      |
| root   | `registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-agent-sandbox-root:v0.4.0` |

全球镜像源将 `registry.cn-hangzhou.aliyuncs.com/fastgpt` 替换为 `ghcr.io/labring`。如果使用私有镜像仓库，请确保镜像 tag 保留 `amd64` 和 `arm64` manifest；如果仓库只提供单架构镜像，请将 `AGENT_SANDBOX_OPENSANDBOX_IMAGE` 配置为与 OpenSandbox Server 宿主机架构匹配的镜像地址。

`AGENT_SANDBOX_OPENSANDBOX_API_KEY` 必须与 `[server].api_key` 一致，`AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_TOKEN` 必须与 `x-volume-manager-auth-token` 一致，`AGENT_SANDBOX_PROXY_SECRET` 必须与 Agent Sandbox Proxy 中的同名变量一致。

`fastgpt-pro` 不提供 Sandbox Editor 和 WebSocket Proxy 链路，因此不要求 `AGENT_SANDBOX_PROXY_SECRET` 和 `AGENT_SANDBOX_PROXY_URL`，但必须配置 `AGENT_SANDBOX_PREVIEW_PROXY_URL`。

> 预览代理应部署在与 FastGPT 主站不同的 origin（协议、域名或端口至少一项不同）。Sandbox 中的 HTML
> 可能包含用户生成的脚本；如果预览地址与主站同源，脚本可能访问主站凭证或接口。

预览链接是短期只读 bearer capability。获得链接的人可以在链接有效期内通过修改 URL 路径读取同一 Sandbox Workspace 中的其他文件，请勿将链接分享给无权访问该 Workspace 的用户。

从旧版 Volume Manager 升级时，请将原 `VM_VOLUME_NAME_PREFIX` 的值配置到 `AGENT_SANDBOX_OPENSANDBOX_VOLUME_NAME_PREFIX`，避免历史持久卷无法按原名称清理。

## 更多配置

### 自定义依赖源

如果沙盒内需要安装 npm、Python 或 apt 依赖，可以在 `fastgpt-app` 和 `fastgpt-pro` 中配置依赖源：

```dotenv
AGENT_SANDBOX_NPM_REGISTRY=https://registry.npmmirror.com
AGENT_SANDBOX_PYPI_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
# Ubuntu amd64 示例；Ubuntu arm64 请按下方说明配置 ubuntu-ports
AGENT_SANDBOX_APT_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/ubuntu
```

`AGENT_SANDBOX_NPM_REGISTRY` 和 `AGENT_SANDBOX_PYPI_INDEX_URL` 适用于所有运行态镜像。`AGENT_SANDBOX_APT_MIRROR` 仅对 root 权限的 Agent 沙箱有效，并且必须配置为 apt 仓库根地址，不要填写到 `dists` 或具体版本目录。

apt 镜像地址不会根据运行态镜像架构自动切换。Ubuntu 需要按架构选择对应的仓库路径：

```dotenv
# Ubuntu amd64 / x86_64
AGENT_SANDBOX_APT_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/ubuntu

# Ubuntu arm64 / aarch64
AGENT_SANDBOX_APT_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports
```

清华镜像站的 [Ubuntu 镜像帮助](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/) 和 [Ubuntu Ports 镜像帮助](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/) 可用于确认其他 Ubuntu 版本的路径。使用其他镜像站时，同样选择该镜像站提供的 Ubuntu 普通仓库或 Ports 仓库路径。

配置后，FastGPT 会读取沙盒的 `/etc/os-release`，根据 Ubuntu 版本和 codename 生成并覆盖 `/etc/apt/sources.list.d/ubuntu.sources`，写入主仓库、updates、backports 和 security。修改配置前，已有 sources 文件会备份为 `.copy`；删除环境变量后，有备份的文件会恢复，没有备份的文件保持不变。初始化阶段不会执行 `apt-get update`。

### 资源与生命周期

超卖配置仅在 `AGENT_SANDBOX_PROVIDER=opensandbox`、`AGENT_SANDBOX_OPENSANDBOX_RUNTIME=kubernetes` 且 OpenSandbox Server 版本不低于 `v0.2.1` 时生效。CPU 和内存倍率必须为不小于 `1` 的有限数值；CPU requests 向下取整到毫核，最低为 `1m`，内存 requests 向下取整到 MiB，最低为 `1Mi`，limits 保持不变。

修改倍率后，已启动的沙盒保持原资源配置；后续创建的沙盒会自动使用当前倍率，包括删除或归档后重新创建的沙盒。连接或恢复已有沙盒不会重新应用倍率。

| 变量                                       | 默认值        | 说明                                                                                                       |
| ---------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------- |
| `AGENT_SANDBOX_CPU_COUNT`                | `1`        | 单个 Agent Sandbox 的 CPU 核数上限。                                                                             |
| `AGENT_SANDBOX_MEMORY_MIB`               | `2048`     | 单个 Agent Sandbox 的内存上限，单位 MiB。                                                                           |
| `AGENT_SANDBOX_STORAGE_SIZE_GI`          | `1`        | 沙盒存储容量，单位 Gi。                                                                                            |
| `AGENT_SANDBOX_CPU_OVERCOMMIT_FACTOR`    | `1`        | Kubernetes 运行态 CPU 超卖倍数：CPU requests = limits / 该值；大于 1 时创建 Burstable QoS Pod。仅 opensandbox provider 生效。 |
| `AGENT_SANDBOX_MEMORY_OVERCOMMIT_FACTOR` | `1`        | Kubernetes 运行态内存超卖倍数：内存 requests = limits / 该值；大于 1 时创建 Burstable QoS Pod。仅 opensandbox provider 生效。     |
| `AGENT_SANDBOX_WS_MAX_MESSAGE_BYTES`     | `67108864` | IDE Agent WebSocket 单消息大小上限。                                                                             |
| `AGENT_SANDBOX_WS_MAX_FRAME_BYTES`       | `16777216` | IDE Agent WebSocket 单帧大小上限。                                                                              |
| `AGENT_SANDBOX_SUSPEND_MINUTES`          | `60`       | 运行中的沙盒持续未活跃多少分钟后自动暂停。                                                                                    |
| `AGENT_SANDBOX_ARCHIVE_INACTIVE_DAYS`    | `7`        | 已暂停的沙盒持续未活跃多少天后自动归档。                                                                                     |

## 配置与连接排障

### 提示 Sandbox provider apiKey is required for opensandbox

检查 `AGENT_SANDBOX_OPENSANDBOX_API_KEY` 是否已配置，并确认它与 `opensandbox-config` 中的 `[server].api_key` 一致。

### 提示 AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_URL is required

检查 `AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_URL` 和 `AGENT_SANDBOX_OPENSANDBOX_VOLUME_MANAGER_TOKEN`，并确认 Volume Manager 服务正常运行。

### 提示 Invalid Agent Sandbox proxy environment variables: AGENT_SANDBOX_PROXY_SECRET, AGENT_SANDBOX_PROXY_URL, AGENT_SANDBOX_PREVIEW_PROXY_URL are required when AGENT_SANDBOX_PROVIDER is opensandbox

`fastgpt-app` 必须配置 `AGENT_SANDBOX_PROXY_SECRET`、`AGENT_SANDBOX_PROXY_URL` 和 `AGENT_SANDBOX_PREVIEW_PROXY_URL`；`fastgpt-pro` 必须配置 `AGENT_SANDBOX_PREVIEW_PROXY_URL`。

### 浏览器 WebSocket 连接失败

检查 Proxy 是否可从浏览器访问，并确认反向代理支持 WebSocket Upgrade。如果 FastGPT 使用 HTTPS，`AGENT_SANDBOX_PROXY_URL` 也应使用 `wss://`。

### Proxy 校验失败或返回 401

确认 FastGPT 主服务和 Agent Sandbox Proxy 中的 `AGENT_SANDBOX_PROXY_SECRET` 完全一致，且长度不少于 32 位。

### 沙盒创建成功，但文件树或终端连接失败

确认 `AGENT_SANDBOX_PROXY_URL` 是浏览器可访问的 `ws://` 或 `wss://` 地址，并检查宿主机 `3006` 端口或对应域名是否已开放。

### Proxy 无法连接沙盒 endpoint

检查 `opensandbox-config` 的 `[docker].host_ip`。沙盒 endpoint 中的 `localhost` 或 `127.0.0.1` 对 Proxy 容器不可达，通常应改为宿主机内网 IP 或 `host.docker.internal`。
