# AtomCode Daemon docker-compose 部署方案
#
# 适用于 NAS / 服务器常驻运行:配合手机端 GitCode App(/app)随时修改代码与调试,
# 或通过 daemon 的 HTTP API(/chat SSE、/projects、/sessions 等)远程调用。
#
# 快速开始:
#   1. 准备配置与数据目录(daemon 以 root 运行,配置目录为 /root/.atomcode):
#        mkdir -p docker/data docker/projects
#        cp docker/config-example.toml docker/config.toml   # 填入 provider / api_key
#   2. 构建并启动:
#        docker compose -f docker/docker-compose.yml up -d
#   3. 验证:
#        curl http://localhost:13456/health
#
# 说明:
#   - 首次使用需先执行 ./scripts/release.sh 生成 Linux 二进制到 dist/,再执行 build;
#   - 若使用已推送的预构建镜像,可把下方 build 段替换为 image 段(见注释);
#   - NAS 上多架构(如 arm64)可使用 build-multiarch.sh 构建并推送镜像后改用 image 方式。
#
# ⚠️ 安全警告:
#   daemon 暴露了聊天、文件编辑、工具执行等敏感端点,且本镜像默认无鉴权。
#   端口默认仅绑定 127.0.0.1(本机访问);如需从局域网/公网访问,请通过
#   BIND_ADDR 显式放开,并务必在前方部署反向代理 + TLS + token 鉴权。
#   例如: BIND_ADDR=0.0.0.0 docker compose -f docker/docker-compose.yml up -d

services:
  atomcode-daemon:
    container_name: atomcode-daemon

    # 方式一:本地构建(推荐,需先 ./scripts/release.sh 生成 dist/ 下的 Linux 二进制)
    build:
      context: ..
      dockerfile: docker/Dockerfile-Daemon
    # 方式二:使用预构建镜像(构建并推送到镜像仓库后启用,替换上面的 build 段)
    # image: swr.cn-north-4.myhuaweicloud.com/gitcode-be/atomcode-daemon:latest

    # 容器内默认绑定 127.0.0.1,必须显式指定 --host 0.0.0.0 才能在容器外访问;
    # 宿主侧的对外暴露则由 ports 的 BIND_ADDR 控制(默认仅本机,见上方安全警告)
    command: ["--host", "0.0.0.0", "--port", "13456"]

    ports:
      # 默认仅本机可访问;局域网/NAS 场景用 BIND_ADDR 放开,例如:
      #   BIND_ADDR=0.0.0.0 docker compose -f docker/docker-compose.yml up -d
      - "${BIND_ADDR:-127.0.0.1}:13456:13456"

    volumes:
      # 持久化全部运行数据(会话、日志、认证、插件等)
      - ./data:/root/.atomcode
      # 配置单独只读挂载,避免容器意外改写;宿主文件必须预先存在
      - ./config.toml:/root/.atomcode/config.toml:ro
      # 待编辑的项目代码
      - ./projects:/workspace

    environment:
      # 模型 API Key 按需传入,或在 config.toml 的 provider 中配置
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
      - OPENAI_API_KEY=${OPENAI_API_KEY:-}
      - TZ=${TZ:-Asia/Shanghai}
      # 仅在可信网络内启用 bash / 写文件等敏感 daemon 工具
      # - ATOMCODE_DAEMON_ENABLE_DANGEROUS_TOOLS=1

    # NAS 常驻:崩溃/重启后自动拉起
    restart: unless-stopped

    security_opt:
      - no-new-privileges:true

    # NAS 可按设备能力启用资源限制
    # deploy:
    #   resources:
    #     limits:
    #       memory: 2G

    # 健康检查(镜像基于 debian slim,无 curl/wget,使用 bash /dev/tcp 探活)
    healthcheck:
      test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/13456 && printf 'GET /health HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && head -n1 <&3 | grep -q 200"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s