version: "3.8" services: agents: build: context: . dockerfile: docker/agents/Dockerfile image: disinto/agents:latest container_name: disinto-agents restart: unless-stopped security_opt: - apparmor=unconfined volumes: - agent-data:/home/agent/data - project-repos:/home/agent/repos - ${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared}:${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared} - ${CLAUDE_CONFIG_FILE:-${HOME}/.claude.json}:/home/agent/.claude.json:ro - ${CLAUDE_BIN_DIR}:/usr/local/bin/claude:ro - ${AGENT_SSH_DIR:-${HOME}/.ssh}:/home/agent/.ssh:ro - ${SOPS_AGE_DIR:-${HOME}/.config/sops/age}:/home/agent/.config/sops/age:ro - woodpecker-data:/woodpecker-data:ro environment: - FORGE_URL=http://forgejo:3000 - FORGE_REPO=${FORGE_REPO:-disinto-admin/disinto} - FORGE_TOKEN=${FORGE_TOKEN:-} - FORGE_REVIEW_TOKEN=${FORGE_REVIEW_TOKEN:-} - FORGE_PLANNER_TOKEN=${FORGE_PLANNER_TOKEN:-} - FORGE_GARDENER_TOKEN=${FORGE_GARDENER_TOKEN:-} - FORGE_VAULT_TOKEN=${FORGE_VAULT_TOKEN:-} - FORGE_SUPERVISOR_TOKEN=${FORGE_SUPERVISOR_TOKEN:-} - FORGE_PREDICTOR_TOKEN=${FORGE_PREDICTOR_TOKEN:-} - FORGE_ARCHITECT_TOKEN=${FORGE_ARCHITECT_TOKEN:-} - FORGE_FILER_TOKEN=${FORGE_FILER_TOKEN:-} - FORGE_BOT_USERNAMES=${FORGE_BOT_USERNAMES:-} - WOODPECKER_TOKEN=${WOODPECKER_TOKEN:-} - CLAUDE_TIMEOUT=${CLAUDE_TIMEOUT:-7200} - CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-1} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - FORGE_PASS=${FORGE_PASS:-} - FORGE_ADMIN_PASS=${FORGE_ADMIN_PASS:-} - FACTORY_REPO=${FORGE_REPO:-disinto-admin/disinto} - DISINTO_CONTAINER=1 - PROJECT_NAME=${PROJECT_NAME:-project} - PROJECT_REPO_ROOT=/home/agent/repos/${PROJECT_NAME:-project} - WOODPECKER_DATA_DIR=/woodpecker-data - WOODPECKER_REPO_ID=${WOODPECKER_REPO_ID:-} - CLAUDE_CONFIG_DIR=${CLAUDE_CONFIG_DIR:-/var/lib/disinto/claude-shared/config} - POLL_INTERVAL=${POLL_INTERVAL:-300} - GARDENER_INTERVAL=${GARDENER_INTERVAL:-21600} - ARCHITECT_INTERVAL=${ARCHITECT_INTERVAL:-21600} - PLANNER_INTERVAL=${PLANNER_INTERVAL:-43200} healthcheck: test: ["CMD", "pgrep", "-f", "entrypoint.sh"] interval: 60s timeout: 5s retries: 3 start_period: 30s depends_on: forgejo: condition: service_healthy woodpecker: condition: service_started networks: - disinto-net agents-llama: build: context: . dockerfile: docker/agents/Dockerfile image: disinto/agents-llama:latest container_name: disinto-agents-llama restart: unless-stopped security_opt: - apparmor=unconfined volumes: - agent-data:/home/agent/data - project-repos:/home/agent/repos - ${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared}:${CLAUDE_SHARED_DIR:-/var/lib/disinto/claude-shared} - ${CLAUDE_CONFIG_FILE:-${HOME}/.claude.json}:/home/agent/.claude.json:ro - ${CLAUDE_BIN_DIR}:/usr/local/bin/claude:ro - ${AGENT_SSH_DIR:-${HOME}/.ssh}:/home/agent/.ssh:ro - ${SOPS_AGE_DIR:-${HOME}/.config/sops/age}:/home/agent/.config/sops/age:ro - woodpecker-data:/woodpecker-data:ro environment: - FORGE_URL=http://forgejo:3000 - FORGE_REPO=${FORGE_REPO:-disinto-admin/disinto} - FORGE_TOKEN=${FORGE_TOKEN_LLAMA:-} - FORGE_PASS=${FORGE_PASS_LLAMA:-} - FORGE_SUPERVISOR_TOKEN=${FORGE_SUPERVISOR_TOKEN:-} - FORGE_PREDICTOR_TOKEN=${FORGE_PREDICTOR_TOKEN:-} - FORGE_ARCHITECT_TOKEN=${FORGE_ARCHITECT_TOKEN:-} - FORGE_VAULT_TOKEN=${FORGE_VAULT_TOKEN:-} - FORGE_PLANNER_TOKEN=${FORGE_PLANNER_TOKEN:-} - FORGE_BOT_USERNAMES=${FORGE_BOT_USERNAMES:-} - WOODPECKER_TOKEN=${WOODPECKER_TOKEN:-} - CLAUDE_TIMEOUT=${CLAUDE_TIMEOUT:-7200} - CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-1} - CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=60 - CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - ANTHROPIC_BASE_URL=${ANTHROPIC_BASE_URL:-} - FORGE_ADMIN_PASS=${FORGE_ADMIN_PASS:-} - DISINTO_CONTAINER=1 - PROJECT_TOML=projects/disinto.toml - PROJECT_NAME=${PROJECT_NAME:-project} - PROJECT_REPO_ROOT=/home/agent/repos/${PROJECT_NAME:-project} - WOODPECKER_DATA_DIR=/woodpecker-data - WOODPECKER_REPO_ID=${WOODPECKER_REPO_ID:-} - CLAUDE_CONFIG_DIR=${CLAUDE_CONFIG_DIR:-/var/lib/disinto/claude-shared/config} - POLL_INTERVAL=${POLL_INTERVAL:-300} - AGENT_ROLES=dev healthcheck: test: ["CMD", "pgrep", "-f", "entrypoint.sh"] interval: 60s timeout: 5s retries: 3 start_period: 30s depends_on: forgejo: condition: service_healthy woodpecker: condition: service_started networks: - disinto-net reproduce: build: context: . dockerfile: docker/reproduce/Dockerfile image: disinto-reproduce:latest network_mode: host profiles: ["reproduce"] volumes: - /var/run/docker.sock:/var/run/docker.sock - agent-data:/home/agent/data - project-repos:/home/agent/repos - ${CLAUDE_DIR:-${HOME}/.claude}:/home/agent/.claude - ${CLAUDE_BIN_DIR:-/usr/local/bin/claude}:/usr/local/bin/claude:ro - ${AGENT_SSH_DIR:-${HOME}/.ssh}:/home/agent/.ssh:ro env_file: - .env edge: build: context: docker/edge dockerfile: Dockerfile image: disinto/edge:latest container_name: disinto-edge security_opt: - apparmor=unconfined volumes: - /var/run/docker.sock:/var/run/docker.sock - ${CLAUDE_BIN_DIR:-/usr/local/bin/claude}:/usr/local/bin/claude:ro - ${CLAUDE_CONFIG_FILE:-${HOME}/.claude.json}:/root/.claude.json:ro - ${CLAUDE_DIR:-${HOME}/.claude}:/root/.claude:ro - disinto-logs:/opt/disinto-logs environment: - FORGE_SUPERVISOR_TOKEN=${FORGE_SUPERVISOR_TOKEN:-} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - CLAUDE_MODEL=claude-sonnet-4-6 - FORGE_TOKEN=${FORGE_TOKEN:-} - FORGE_URL=http://forgejo:3000 - FORGE_REPO=disinto-admin/disinto - FORGE_OPS_REPO=disinto-admin/disinto-ops - PRIMARY_BRANCH=main - DISINTO_CONTAINER=1 - FORGE_ADMIN_USERS=disinto-admin,vault-bot,admin ports: - "80:80" - "443:443" healthcheck: test: ["CMD", "curl", "-fsS", "http://localhost:2019/config/"] interval: 30s timeout: 5s retries: 3 start_period: 15s depends_on: - forgejo networks: - disinto-net forgejo: image: codeberg.org/forgejo/forgejo:11.0 container_name: disinto-forgejo restart: unless-stopped security_opt: - apparmor=unconfined volumes: - forgejo-data:/data environment: - FORGEJO__database__DB_TYPE=sqlite3 - FORGEJO__server__ROOT_URL=http://forgejo:3000/ - FORGEJO__server__HTTP_PORT=3000 - FORGEJO__security__INSTALL_LOCK=true - FORGEJO__service__DISABLE_REGISTRATION=true - FORGEJO__webhook__ALLOWED_HOST_LIST=private healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:3000/api/v1/version"] interval: 5s timeout: 3s retries: 30 start_period: 30s ports: - "3000:3000" networks: - disinto-net volumes: disinto-logs: agent-data: project-repos: woodpecker-data: forgejo-data: networks: disinto-net: driver: bridge