PraveenNellihela/opencode-sandbox

GitHub: PraveenNellihela/opencode-sandbox

一个跨平台的 Docker 沙箱工具,用于安全、隔离地运行 opencode AI 编程代理,保护宿主机环境并提供免费的 AI 模型访问。

Stars: 0 | Forks: 0

opencode-sandbox logo — isolated Docker sandbox for running opencode AI coding agent # opencode-sandbox [![许可证](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/PraveenNellihela/opencode-sandbox/actions) [![Docker](https://img.shields.io/badge/docker-%3E%3D20.10-blue?logo=docker)](https://docs.docker.com/get-docker/) [![平台](https://img.shields.io/badge/platform-linux%20|%20macOS%20|%20wsl2-lightgrey?logo=linux)](https://github.com/PraveenNellihela/opencode-sandbox) 隔离的、持久化的 Docker 沙箱,用于在任何 OS 上运行 [opencode](https://opencode.ai)。免费模型,无 token 限制,保护您的宿主机安全。 ## 为什么要对 opencode 使用沙箱? opencode 是一个强大且免费的 AI 编程代理 —— 但是赋予任何 AI CLI 权限 去访问您的整个文件系统是一个真正的安全风险。依赖项中的提示词注入、 您要求它审查的仓库中的恶意代码,或者简单的 bug, 都可能会暴露您的整个机器。付费的 AI 编程工具通常会限制您的 token 数量并设置使用时限。opencode-sandbox 解决了所有这些问题。 | 优势 | 这对您意味着什么 | |---------|----------------------| | **🔒 宿主机隔离** | AI 只能看到您当前的项目目录。SSH 密钥、浏览器数据、dotfiles 和其他仓库均被限制访问。 | | **🛡️ 默认非 root** | 以专用的 `dev` 用户身份运行,且没有 `sudo` 权限。即使是遭到破坏的代理也无法提权访问您的宿主机。 | | **💸 免费且强大的模型** | opencode 包含了免费模型(DeepSeek V4 Flash、Big Pickle 等),这些模型在日常编程中非常实用 —— 整个仓库都是使用它们构建的。无需按月订阅。 | | **⏱️ 无 token 限制** | 与 Claude Code 会过期的付费 token 不同,您可以按照自己的规则使用模型。只有在您选择高级提供商时才需要付费。 | | **📦 处处一致** | 相同的 Docker 镜像在 Linux、macOS 和 Windows (WSL2) 上的行为完全一致。告别“在我的机器上能跑”的问题。 | | **🔄 智能持久化** | Auth token、插件和配置通过 Docker 数据卷在重启后依然保留。系统软件包在每次会话中会干净地重置。 | | **⚙️ 可复现的工具链** | Node.js、Python、Go、CLI 工具 —— 在构建时预装,而不是临时通过 `apt-get` 安装。团队成员可以获得完全一致的开发环境。 | ## 快速开始 ``` # 1. 克隆并进入 repo git clone https://github.com/PraveenNellihela/opencode-sandbox.git cd opencode-sandbox # 2. 运行安装程序(检测 OS,构建 Docker image,复制 wrapper 到 ~/bin/) ./install.sh # 3. 使用 opencode,它在 Docker 内运行,bind-mounted 到当前目录 cd ~/code/my-project opencode ``` 安装程序会检测您的 OS 和 shell,将包装器复制到 `~/bin/`,并构建 Docker 镜像。您可能需要将 `~/bin` 添加到您的 PATH 中(如果是这样,安装程序会提示您)。 ### 自定义您的构建 向 `install.sh` 传递参数以预装工具链、代理、插件和 MCP 服务器: | 参数 | 描述 | |------|-------------| | `-R, --recommended` | 全功能启动(Node.js + Python + CLI 工具 + superpowers + 插件 + MCP + 代理) | | `-t, --toolchain LIST` | 以逗号分隔:`node,python,go,cli` | | `-p, --plugin LIST` | 以逗号分隔:`superpowers,pty,notify,websearch,mcp-tool-search` | | `-m, --mcp LIST` | 以逗号分隔:`filesystem,context7,brave-search,github` | | `-a, --agents` | 包含 6 个预构建的子代理(code-reviewer、security-analyst、debugger、documenter、tester、planner) | | `-i, --interactive` | 通过交互式提示进行选择 | 示例: ``` # 最小化(默认 — 与原始版本相同) ./install.sh # 包含所有 extras 的完全增强版 ./install.sh --recommended # 自定义:仅 Node.js + CLI tools + superpowers + agents ./install.sh -t node,cli -p superpowers -a # 交互模式 ./install.sh -i ``` ### --recommended 包含的内容 ``` Toolchains: Node.js + Python 3 + ripgrep + fd-find + jq + tmux Plugins: superpowers + opencode-pty + opencode-notify + opencode-websearch-cited MCP: filesystem + Context7 Agents: code-reviewer, security-analyst, debugger, documenter, tester, planner ``` ### 预构建子代理 当使用 `-a` 或 `--recommended` 时,6 个专业的子代理将被加载到 `~/.config/opencode/agents/` 中。您可以通过 `@name` 在对话中调用它们中的任何一个: | 代理 | 用途 | |---|---| | `@code-reviewer` | 代码质量、模式和最佳实践(只读) | | `@security-analyst` | 漏洞评估、依赖审计(只读) | | `@debugger` | 系统性的根因分析(完全访问权限) | | `@documenter` | 技术文档、API 文档(写入 + 只读 bash) | | `@tester` | 测试生成、覆盖率分析(完全访问权限) | | `@planner` | 实现计划、任务分解(只读) | ### 恢复默认设置 如果您想清除预置的配置并重新开始: ``` # 删除已存储的 volumes(设置、plugins、auth tokens) docker volume rm opencode-config opencode-data # 使用您选择的选项重新构建 ./install.sh --recommended ``` 否则,现有的数据卷数据在重新构建时会被保留(只有空的数据卷会被填充)。 ## 工作原理 - **隔离性:**容器只能看到当前的项目目录(通过 bind mount)。看不到您的主目录、其他仓库或宿主机进程。 - **持久性:**设置和 auth token 通过 Docker 数据卷在容器重启后依然保留。 - **安全性:**以非 root 用户身份运行,没有 sudo 权限。仅使用 Docker 网络。 ## 哪些会保留,哪些不会保留 **会保留的内容**(Docker 数据卷): - `~/.config/opencode` — 设置、插件 - `~/.local/share/opencode` — auth token、会话数据 **不会保留的内容**(容器退出时丢失): - 会话期间安装的 OS 级软件包 - 上述目录之外的任何更改 如果您需要某个软件包(例如插件的 Node.js),请将其添加到 `Dockerfile` 并重新构建。 ## 跨平台 ### Linux 安装 Docker Engine 后即可开箱即用。 ### macOS 请先安装 Docker Desktop:https://docs.docker.com/desktop/install/mac-install/ 同时支持 Apple Silicon 和 Intel 芯片。 ### Windows (WSL2) 1. 安装 WSL2:`wsl --install` 2. 安装带有 WSL2 后端的 Docker Desktop 3. 在 WSL 内部运行 `install.sh` ## Shell 支持 安装程序会检测您的 shell,并检查 `~/bin` 是否已经配置。如果没有,它会打印一条命令供您执行: | Shell | 配置文件 | 要添加的命令 | |-------|-------------|----------------| | bash | `~/.bashrc` | `echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc` | | zsh | `~/.zshrc` | `echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc` | | fish | `~/.config/fish/config.fish` | `fish_add_path ~/bin` | 运行命令后,重启您的 shell 或执行 `source ~/.bashrc`(或 `~/.zshrc`)。 卸载后如需移除配置: | Shell | 移除命令 | |-------|-------------------| | bash (Linux) | `sed -i '/export PATH="\$HOME\/bin:\$PATH"/d' ~/.bashrc` | | bash (macOS) | `sed -i '' '/export PATH="\$HOME\/bin:\$PATH"/d' ~/.bashrc` | | zsh (Linux) | `sed -i '/export PATH="\$HOME\/bin:\$PATH"/d' ~/.zshrc` | | zsh (macOS) | `sed -i '' '/export PATH="\$HOME\/bin:\$PATH"/d' ~/.zshrc` | | fish | `fish_remove_path ~/bin` | ## 添加依赖 可以通过两种方式添加系统软件包: ### 在构建时添加(推荐) 使用 `install.sh` 的参数来包含常用的工具链: ``` ./install.sh -t node,python,cli ``` 或者使用 `--recommended` 参数获取完整设置。 对于内置参数未涵盖的软件包,请在 `USER dev` 行之前将安装步骤添加到 `Dockerfile` 中: ``` RUN apt-get update && apt-get install -y --no-install-recommends \ your-package-here \ && rm -rf /var/lib/apt/lists/* ``` 然后重新构建: ``` $ docker build -t local:opencode . ``` 缓存的层使这一过程非常快。 ### 在容器内部添加(临时) 会话期间安装的软件包将在容器退出时丢失。这对于一次性的实验很有用,但不适合在生产环境中使用。 ## 安装插件 可以在构建时或运行时添加插件。 ### 在构建时安装 使用 `install.sh -p` 预先配置插件,以便它们在首次启动时即可使用: ``` ./install.sh -p superpowers,pty,notify,websearch ``` 这会将它们植入到随镜像附带的 `opencode.json` 中。可用插件: - `superpowers` — [obra/superpowers](https://github.com/obra/superpowers):代理技能框架 - `pty` — [opencode-pty](https://github.com/shekohex/opencode-pty):为交互式进程提供真正的 PTY 支持 - `notify` — [opencode-notify](https://github.com/opencode-notify):任务完成时的桌面通知 - `websearch` — [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited):带引用的网络搜索 - `mcp-tool-search` — [opencode-mcp-tool-search](https://github.com/francisco-m001/opencode-mcp-tool-search):减少 MCP 服务器带来的上下文冗余 ### 在容器内部安装(持久化) opencode 自行安装的插件会存放在 `~/.config/opencode`(一个持久化的数据卷)下,因此它们在容器重启后依然存在。要在容器运行后手动添加插件,请通过 opencode 的配置 UI 编辑 `opencode.json`,或直接在数据卷中进行编辑。 示例:[superpowers](https://github.com/obra/superpowers),在 opencode 内部使用以下命令安装: ``` Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.opencode/INSTALL.md ``` 要在容器运行后编辑生成的配置,请打开 TUI 并使用 opencode 的配置命令,或者直接在宿主机上编辑 `~/.config/opencode/opencode.json`(它存储在 Docker 数据卷中)。 ## 安全模型 - **非 root:**容器以 `dev` 用户身份运行,没有 sudo 权限。 - **最小访问权限:**通过 bind mount 只能看到当前的项目目录。 - **网络:**默认的桥接网络 —— 可以连接到互联网(用于 LLM API),但宿主机上的任何内容都不会被暴露。 如果您在某些情况下需要实时的 root 权限,这提示您应该将其添加到 Dockerfile 并重新构建,而不是授予提权权限。 ### 使用 Podman 代替 Docker 这些脚本支持将 Podman 作为 Docker 的替代方案。安装 Podman: - Linux:`sudo apt install podman` 或 `sudo dnf install podman` - macOS:`brew install podman` Podman 完全消除了对宿主机上 root 守护进程的担忧。详情请参阅 https://podman.io。 ## 卸载 ``` $ ./uninstall.sh ``` 这将移除: - `~/bin/opencode`(包装器脚本) - Docker 镜像(可选,会提示确认) - Docker 数据卷(可选,会提示确认 —— 未经确认不会删除) 它**不会**自动编辑您的 shell 配置。您需要手动移除 PATH 行。 ## 故障排除 **“Docker: command not found” / “Podman: command not found”** → 安装 Docker:https://docs.docker.com/get-docker/ → 或者安装 Podman:https://podman.io/getting-started/installation **“Cannot connect to the Docker daemon” / “Cannot connect to Podman socket”** → 启动 Docker Desktop 或执行:`sudo systemctl start docker` → 对于 Podman:`podman machine start` (macOS) 或检查系统服务 **安装后提示 “opencode: command not found”** → 重启您的 shell,或者执行:`source ~/.bashrc`(或 `~/.zshrc`) **“Image not found” 错误** → 包装器不再自动构建。在 opencode-sandbox 仓库中运行 `./install.sh` 来构建它。 → 如果您已经安装了包装器但删除了镜像:`cd path/to/opencode-sandbox && ./install.sh` **`~/bin` 权限被拒绝** → 检查所有权:`ls -la ~/bin` → 修复:`chown -R $(whoami) ~/bin` **macOS 终端:主题字体和颜色渲染不正确** → 与 VSCode 的集成终端或其他终端相比,内置的 macOS 终端应用程序可能会显示错误的颜色或字体。这是一个已知的 macOS 问题 —— 请参阅 [#4721](https://github.com/anomalyco/opencode/issues/4721)。升级到 macOS 26 可以解决此问题。或者,您也可以使用其他终端(例如 iTerm2、VSCode 终端或 Kitty)。 ## 测试 本项目包含使用 [bats-core](https://github.com/bats-core/bats-core) 进行单元测试的测试基础架构,并使用 GitHub Actions 进行 CI。 ### 前置条件 ``` # 安装 bats npm install -g bats # 安装 shellcheck(可选,用于 shell linting) sudo apt install shellcheck # Linux brew install shellcheck # macOS # 安装 hadolint(可选,用于 Dockerfile linting) brew install hadolint # macOS # 或者:docker run --rm -i hadolint/hadolint < Dockerfile ``` ### 运行测试 ``` # 运行所有测试 make test # 仅运行静态分析(shellcheck、hadolint、syntax checks) make test-lint # 仅运行单元测试(不需要 Docker) make test-unit # 仅运行 end-to-end 测试(需要 Docker) make test-e2e ``` ### CI 流水线 `.github/workflows/ci.yaml` 流水线会在每次推送和 PR 时运行: 1. **Lint** — ShellCheck、Hadolint、bash 语法、JSON 验证、frontmatter 验证 2. **单元测试** — 针对 `configure-opencode`、包装器和 install.sh 参数的 bats 测试 3. **Docker 构建矩阵** — 构建并验证包含所有 build-arg 组合的镜像 4. **E2E 测试** — 针对构建好的镜像进行完整的集成测试 ### Pre-commit Hook 要在本地启用 pre-commit hook: ``` pip install pre-commit # or: brew install pre-commit pre-commit install ``` 这会在每次提交时运行 ShellCheck 和 `shfmt`。Hook 在 `.pre-commit-config.yaml` 中配置。 ### 测试结构 ``` test/ helper.bash # Shared test helper functions test_configure.bats # configure-opencode.sh unit tests test_wrapper.bats # opencode wrapper behavior tests test_install_flags.bats # install.sh flag parsing tests test_e2e.bats # Docker build + run integration tests fixtures/ golden_minimal.json # Expected output for default build golden_recommended.json # Expected output for --recommended build ```