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} - ${HOME}/.claude.json:/home/agent/.claude.json:ro - CLAUDE_BIN_PLACEHOLDER:/usr/local/bin/claude:ro - ${HOME}/.ssh:/home/agent/.ssh:ro - ${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_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} depends_on: - forgejo - woodpecker 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} - ${HOME}/.claude.json:/home/agent/.claude.json:ro - CLAUDE_BIN_PLACEHOLDER:/usr/local/bin/claude:ro - ${HOME}/.ssh:/home/agent/.ssh:ro - ${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 depends_on: - forgejo - woodpecker 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 - ${HOME}/.claude:/home/agent/.claude - /usr/local/bin/claude:/usr/local/bin/claude:ro - ${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 - /usr/local/bin/claude:/usr/local/bin/claude:ro - ${HOME}/.claude.json:/root/.claude.json:ro - ${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" 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 ports: - "3000:3000" networks: - disinto-net volumes: disinto-logs: agent-data: project-repos: woodpecker-data: forgejo-data: networks: disinto-net: driver: bridge