Ctrl K
ComunidadGuías…

docker-compose.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 一条命令起服务: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: