Cagebox奥多奥——克劳德代码沙盒
Docker沙盒,用于使用Odoo开发工具自主运行Claude代码。具有转发代理白名单、git推送保护和自动插件/MCP设置的网络隔离容器。
先决条件
- Docker with Compose(macOS/Windows上的Docker桌面,或Linux上的Docker引擎+Compose插件)
建筑
内部Docker网络上的三项服务(无直接互联网接入):
- 克劳德沙盒 --Ubuntu 24.04,包含Python 3.12、Node.js 20、Claude Code和Odoo依赖项
- 数据库 --PostgreSQL 16
- 鱿鱼代理 --转发HTTP代理桥接内部和外部网络,将特定域列入白名单
安全模型
五层保护:
- 容器隔离 --Claude在一个锁定的Ubuntu容器中运行,该容器具有受限的sudo(仅限软件包安装),并且除了已挂载的卷外,没有主机访问权限
- 网络代理 -所有通过Squid的出站流量路线,只允许白名单域(PyPI,npm,Anthropic API,GitHub)。GitHub REST API(
api.github.com)被阻止,阻止程序化写入操作。无法从沙箱直接访问互联网 - Git包装器 —
git push,git remote add/set-url/remove/rename,git send-email,git request-pull,git notes push,以及git lfs push在两个级别上被阻塞:一个shell包装器替换/usr/bin/git以及一个预推钩作为备用。两者都是root拥有且只读的——容器用户无法修改它们 - 权限拒绝列表 --Claude Code的settings.json在应用程序级别阻止推送和远程修改命令到达git包装器之前
- 凭证范围 --专为与只读GitHub令牌一起使用而设计。使用细粒度的只读令牌,无论容器内发生什么,GitHub都会拒绝写操作
已知限制: 带有可写令牌(例如带有 repo 一个足够确定的代理理论上可以在原始HTTPS级别实现git推送协议,绕过所有容器级别的保护。Squid无法检查HTTPS隧道内的路径,因此无法区分推送和获取。只读的GitHub令牌完全消除了这个向量——GitHub拒绝在服务器端写入。强烈建议使用细粒度只读令牌。快速启动
git clone && cd cagebox-odoo
cp .env.example .env
# Edit .env — see Authentication and GitHub Token below
cp docker-compose.override.example.yml docker-compose.override.yml
# Edit override — mount your Odoo source and addons directories
docker compose build
docker compose up -d认证
在沙箱中验证Claude Code的两个选项:
选项A:OAuth登录(建议Pro/Max订阅者使用)
离开 ANTHROPIC_API_KEY 空白 .env 并启动容器。然后运行:
docker exec -it -u claude claude-sandbox claude login遵循基于浏览器的OAuth流程。令牌存储在 ~/.claude/ 容器内部,通过 claude-config 卷——您只需要验证一次。
选项B:API密钥
集 ANTHROPIC_API_KEY 在 .env 钥匙来自 console.anthropic.com。这是按令牌付费,与任何Pro/Max订阅分开。
GitHub代币
要访问沙盒内的私有存储库,请设置 GITHUB_TOKEN 在 .env.
推荐:细粒度只读令牌
在以下位置创建细粒度令牌 :
- 将“存储库访问”设置为“仅选择存储库”,然后选择所需的存储库
- 在“存储库权限”下,设置 目录 到 只读
- 将其他内容保留在“禁止访问”
使用只读令牌,即使绕过了所有沙盒保护,也无法将代码推送到GitHub。这是最有力的保证。
替代方案:经典代币
在以下位置创建经典代币 随着 repo 范围。这将授予对所有存储库的读写访问权限。沙箱块通过git包装器、预推挂钩、权限拒绝列表和API阻止进行推送,但使用可写令牌,确定的代理理论上可以通过直接通过HTTPS实现git-pack协议来绕过所有容器级保护 github.com.Squid无法检查HTTPS隧道内的路径,因此无法在网络级别区分推送和取送。只读令牌通过让GitHub拒绝服务器端的写入,完全消除了这个向量。
入口点会自动重写所有GitHub URL(HTTPS、SSH、HTTPS等), git@)要使用令牌身份验证,因此 git fetch, git pull,以及 git clone 透明地工作。
监控
- 连接到终端:
docker exec -it -u claude claude-sandbox tmux attach -t main--连接到沙盒shell。通过运行以下命令启动Claude代码claude --dangerously-skip-permissions.按Ctrl-B D在不终止会话的情况下分离。 - 日志:
docker compose logs -f claude-sandbox
插件和MCP服务器
插件和MCP服务器在首次启动时通过单个安装脚本安装。复制 scripts/setup-tools.sh.example 到 scripts/setup-tools.sh,对其进行自定义,然后将其安装到 docker-compose.override.yml:
cp scripts/setup-tools.sh.example scripts/setup-tools.sh
chmod +x scripts/setup-tools.sh
# Edit setup-tools.sh — uncomment or add plugin and MCP commands, e.g.:
# claude plugin marketplace add your-org/your-plugins
# claude plugin install your-plugin@your-marketplace
# claude mcp add my-server -- npx -y @some/mcp-server然后取消注释 setup-tools.sh 安装在 docker-compose.override.yml插件和MCP服务器在重启过程中都会通过 claude-config 卷,仅在首次启动时安装。
定制
将域添加到代理白名单
编辑 config/squid.conf 并添加条目:
acl whitelist dstdomain example.com然后重新启动代理: docker compose restart squid-proxy
安装项目目录
编辑 docker-compose.override.yml:
services:
claude-sandbox:
volumes:
- ~/projects/odoo:/workspace/odoo
- ~/projects/my-addons:/workspace/my-addons
# - ~/projects/enterprise:/workspace/enterprise自定义Odoo配置
挂载您自己的配置文件以跳过自动生成的配置文件:
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf测试
启动沙盒后,从主机运行集成测试套件:
./scripts/test-sandbox.sh这将验证容器健康状况、git重写、推送阻止、网络过滤、数据库连接、Odoo导入、挂载权限和插件/MCP安装。
构建
docker compose build
docker compose up -d重建
docker compose build claude-sandbox
docker compose down
docker compose up -d保留所有卷(数据库、pip缓存、claude配置、插件)。
核攻击与重建
docker compose build claude-sandbox
docker compose down -v
docker compose up -d这 -v 标志会删除所有卷(pip缓存、claude配置、数据库)。使用 docker compose down 没有 -v 为了保护它们。
