docker-compose.yml
Rama main · réplica de lectura del repositorio original.
# 一条命令起服务:bash deploy.sh
# 想手动来:cp deploy/env.example .env && docker compose up -d --build
#
# 只有一个卷。所有会被写的东西——config.json、账号、会话、成果文件、技能、备份——
# 都在 OPENWORKBUDDY_HOME 底下,也就是宿主机的 ./openworkbuddy-data。
# 容器随便删随便重建,删了 openworkbuddy-data 才是真丢数据。
#
# 以前这里按文件挂了五个 bind mount(config.json、experts.json……)。那样有个坑:
# 宿主机上那个文件还不存在时,Docker 会给你建一个同名的**目录**,然后应用报一个
# 看不懂的错。一个卷就没这回事。
name: openworkbuddy
services:
app:
build: .
image: ${OPENWORKBUDDY_IMAGE:-openworkbuddy:latest}
container_name: openworkbuddy
restart: unless-stopped
environment:
HOST: 0.0.0.0
PORT: 3800
OPENWORKBUDDY_HOME: /data
TZ: ${TZ:-Asia/Shanghai}
# 前面挂了几层反代。0 = 没挂(默认),登录/注册限流按 socket 地址算。
# 挂了却不填:全公司共用代理那一个 IP,注册 5 次、登录错 30 次就把所有人一起锁在门外。
# 填了却没挂:等于把限流闸拆给外网(伪造一行头就是一个新 IP)——所以只在真有反代时填。
# deploy.sh --domain 起 caddy 时会自动填 1。
OPENWORKBUDDY_TRUST_PROXY: ${OPENWORKBUDDY_TRUST_PROXY:-0}
# 系统沙箱要建挂载命名空间,Docker 默认不给。三行缺一样都立不起来(在真容器里逐项试过)。
# 进沙箱之前 bubblewrap 把能力全部丢掉,agent 的命令拿不到 SYS_ADMIN;这几项放开的是服务进程这一层。
# 删掉这几行服务照常起,但多人共用时成员的命令一律拒绝执行(宁可不跑,不把 Key 交出去)。
cap_add:
- SYS_ADMIN
security_opt:
- seccomp=unconfined
- apparmor=unconfined
volumes:
- ${OPENWORKBUDDY_DATA:-./openworkbuddy-data}:/data
ports:
# 默认只绑回环:外面进不来,得走下面的 caddy 或者你自己的 nginx。
# 真要直接对公网开,改 .env 里的 OPENWORKBUDDY_BIND=0.0.0.0——改之前先读 deploy/README.md 安全那节,
# 这个 agent 手里有 shell。
- "${OPENWORKBUDDY_BIND:-127.0.0.1}:${OPENWORKBUDDY_PORT:-3800}:3800"
# 自动 HTTPS。只在 .env 里填了 OPENWORKBUDDY_DOMAIN 时才起(deploy.sh --domain 会自动带上)。
# 手动 --profile https 却没填 OPENWORKBUDDY_DOMAIN 的话,caddy 会因为站点名是空的起不来——
# 先填域名再开这个 profile。
# 证书 caddy 自己去 Let's Encrypt 申请、自己续,不用管。
caddy:
profiles: ["https"]
image: caddy:2-alpine
container_name: openworkbuddy-caddy
restart: unless-stopped
environment:
# 这里不能写 ${OPENWORKBUDDY_DOMAIN:?...}——compose 会把整个文件的变量都插值一遍,
# 哪怕 caddy 压根不在当前 profile 里,于是 docker compose build 都会被它拦下来。
OPENWORKBUDDY_DOMAIN: ${OPENWORKBUDDY_DOMAIN:-}
ports:
- "80:80"
- "443:443"
volumes:
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
app:
condition: service_healthy
volumes:
caddy_data:
caddy_config: