# WorkBuddy Manager —— Docker Compose 部署 # # 用法: # 1) 按需修改下面的环境变量(至少确认上游地址与路径) # 2) docker compose up -d --build # 3) 浏览器打开 http://<服务器IP>:7864 # 首次启动若未设 WB_ADMIN_PASSWORD,会随机生成密码并打印到容器日志: # docker compose logs workbuddy-manager | grep -A2 密码 # # 与宿主机安装(deploy/install.sh + systemd)的区别,见 Dockerfile 顶部说明。 # 简述:容器版**不支持在界面上更新上游**(那需要挂 docker.sock,等于把宿主 root # 交给容器);上游请用它自己的 compose 单独升级。 services: workbuddy-manager: build: . image: workbuddy-manager:latest container_name: workbuddy-manager # 这个 restart 策略是容器版「一键更新」能生效的前提: # 更新完成后容器内的进程会退出,靠它用新代码重新拉起。 restart: unless-stopped environment: TZ: Asia/Shanghai # 首启管理员密码;不设则随机生成并打印到日志(推荐首启后立即改) # WB_ADMIN_PASSWORD: "改成你的强密码" # 上游地址:若上游与本品在同一 compose 网络,用服务名;否则填宿主机地址 # - 同网络(推荐):http://workbuddy2api:7863 # - 用宿主机 Docker 网关:http://host.docker.internal:7863 WB2API_BASE: http://host.docker.internal:7863 # 反向代理在后面时,真实 IP 取自它覆盖写入的 X-Real-IP WB_TRUST_PROXY: "1" # 生产环境不暴露 /docs 与 /openapi.json WB_ENABLE_DOCS: "0" ports: # **只监听本机**:管理端必须藏在反向代理之后。 # 若确需直接从别的机器访问,改成 "7864:7864",但请先确保有 HTTPS 与访问控制—— # 管理端持有全部账号凭据,直接暴露到公网是被打穿的常见原因。 - "127.0.0.1:7864:7864" volumes: # 数据库、日志、更新状态、上游版本固定标记都在这里。 # 必须持久化,否则重建容器会丢失统计与审计记录。 - ./data:/app/data # 上游**整个仓库目录**。一次挂载覆盖下面三件事(分开挂子路径会互相重叠, # 反而让权限语义变模糊): # · 读/写上游 config.json —— 管理端「设置」页保存的目标 # · 读/写 auths/ —— 扫码添加账号会落盘 workbuddy-.json(见 # tencent.write_auth_file),所以**不能只读** # · 读上游 docker-compose.yml 做端口收敛;「更新上游」时在容器内 # git fetch/pull 并重建上游容器 # # **权限提示(与上游 issue #108 同款问题)**:bind mount 的目录属主由宿主机 # 决定,镜像内的 chown 不起作用。若管理端显示「0 个账号」而 auths 里明明有 # 文件,或添加账号报权限错误,通常是跨 uid 读写不到——宿主机执行一次: # chown -R 10001:10001 ../workbuddy2api/auths # (10001 是上游容器内进程的 uid,管理端也用同一 uid,见 Dockerfile) # # 若你**不想**让管理端碰上游仓库(例如上游由别人维护),改成只挂 config.json # 与 auths/ 两条子路径即可:此时「更新上游」会不可用,界面会如实提示。 - ../workbuddy2api:/opt/workbuddy2api # docker 控制套接字:挂上后容器内的管理端可以像宿主部署那样操作上游容器 # (保存设置后自动重载 / 读上游日志 / 一键更新上游)。 # # **安全性说明(值得读)**:挂 docker.sock 等于把宿主 root 权限交给本容器。 # 但这**不是新增的风险等级**——宿主部署时本服务本来就是 root 运行 # (systemd 单元无 User=、安装脚本要求 root),而 root 进程本来就能 # `docker run -v /:/host` 拿到宿主文件系统。两者权限等价。 # # 若你的要求是最小权限,把下面这行注释掉即可:此时依赖 docker 的功能会 # 自动降级为「请到宿主机执行 docker compose ...」,界面如实提示,不会 # 静默失败。 - /var/run/docker.sock:/var/run/docker.sock extra_hosts: # 让容器能通过 host.docker.internal 访问宿主机上的上游 - "host.docker.internal:host-gateway" healthcheck: test: ["CMD", "curl", "-fsS", "http://127.0.0.1:7864/api/healthz"] interval: 30s timeout: 5s retries: 3 start_period: 10s