# 一条命令起服务: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: