name: agent-zero-umbra-alba include: - path: ./dctf/compose.yaml secrets: github_agent_token: file: ${GITHUB_AGENT_TOKEN_FILE:-../.menv/github-agent-token} x-db: &db image: postgres:18-alpine restart: unless-stopped environment: POSTGRES_DB: misskey POSTGRES_USER: misskey POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 30 x-redis: &redis image: redis:7-alpine restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 30 x-agent: &agent image: nousresearch/hermes-agent:v2026.7.20 restart: unless-stopped command: - sh - -lc - >- if [ -s "$$NYANKOFACE_FORGEJO_TOKEN_FILE" ]; then export NYANKOFACE_MCP_TOKEN="$$(cat "$$NYANKOFACE_FORGEJO_TOKEN_FILE")"; echo "NyankoFace Forgejo token loaded for Forgejo and MCP"; else echo "NyankoFace Forgejo token is not provisioned; public fallback remains available" >&2; fi; exec /opt/hermes/bin/hermes gateway run environment: TZ: Asia/Tokyo API_SERVER_ENABLED: "true" API_SERVER_HOST: "0.0.0.0" API_SERVER_PORT: "8642" API_SERVER_KEY: ${HERMES_API_SERVER_KEY} GITHUB_TOKEN_FILE: /run/secrets/github_agent_token GITHUB_ISSUE_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: /opt/data/nyankoface-forgejo-token secrets: - github_agent_token services: litellm: build: context: ./litellm dockerfile: Dockerfile args: LITELLM_TAG: ${LITELLM_TAG:-v1.93.0} image: agent-zero-umbra-alba-litellm:${LITELLM_TAG:-v1.93.0} command: ["--config", "/app/config.yaml", "--port", "4000"] env_file: - path: ${LITELLM_PROVIDER_ENV_FILE:-.env.litellm} required: false environment: LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} ports: - "127.0.0.1:${LITELLM_HOST_PORT:-4002}:4000" volumes: - ./litellm/config.yaml:/app/config.yaml:ro healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')", ] interval: 10s timeout: 5s retries: 18 start_period: 20s restart: unless-stopped networks: [world-net, black-net, white-net] world-db: <<: *db volumes: ["./runtime/instances/world/db:/var/lib/postgresql"] networks: {world-net: {aliases: [db]}} world-redis: <<: *redis volumes: ["./runtime/instances/world/redis:/data"] networks: {world-net: {aliases: [redis]}} world-config: image: python:3.12-alpine restart: "no" depends_on: world-db: {condition: service_healthy} world-redis: {condition: service_healthy} environment: MISSKEY_URL: ${WORLD_PUBLIC_URL:-http://localhost:3310} POSTGRES_DB: misskey POSTGRES_USER: misskey POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} command: ["python", "/app/configure_misskey.py"] volumes: - ./bootstrap:/app:ro - ./.config:/template:ro - ./runtime/instances/world:/runtime networks: [world-net] world-misskey: image: misskey/misskey:2026.6.0 restart: unless-stopped depends_on: world-config: {condition: service_completed_successfully} world-db: {condition: service_healthy} world-redis: {condition: service_healthy} ports: ["127.0.0.1:3310:3000"] environment: MISSKEY_URL: ${WORLD_PUBLIC_URL:-http://localhost:3310} volumes: - ./runtime/instances/world/misskey-config:/misskey/.config:ro - ./runtime/instances/world/files:/misskey/files networks: [world-net] world-bootstrap: image: python:3.12-alpine restart: "no" depends_on: world-misskey: {condition: service_started} litellm: {condition: service_healthy} environment: MISSKEY_URL: http://world-misskey:3000 MISSKEY_PUBLIC_URL: ${WORLD_PUBLIC_URL:-http://localhost:3310} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} MISSKEY_ADMIN_USERNAME: admin LITELLM_API_BASE: ${LITELLM_API_BASE} LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} LITELLM_MODELS: ${LITELLM_MODELS:-glm-5.2,glm-4.7} FACTION: world AGENT_INDICES: "" GM_CTF_SEASON_ID: ${GM_CTF_SEASON_ID:-CTF-S1} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: ${NYANKOFACE_FORGEJO_TOKEN_FILE:-/opt/data/nyankoface-forgejo-token} NYANKOFACE_GITHUB_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_GITHUB_URL: ${NYANKOFACE_GITHUB_URL:-https://github.com/Sunwood-ai-labs/NyankoFace} NYANKOFACE_LOCAL_PATH: ${NYANKOFACE_LOCAL_PATH:-} NYANKOFACE_SSH_TARGET: ${NYANKOFACE_SSH_TARGET:-} command: ["python", "/app/bootstrap.py"] volumes: - ./bootstrap:/app:ro - ./seed:/seed:ro - ./assets/avatars:/avatars:ro - ./runtime/instances/world:/runtime networks: [world-net] black-db: <<: *db volumes: ["./runtime/instances/black/db:/var/lib/postgresql"] networks: {black-net: {aliases: [db]}} black-redis: <<: *redis volumes: ["./runtime/instances/black/redis:/data"] networks: {black-net: {aliases: [redis]}} black-config: image: python:3.12-alpine restart: "no" depends_on: black-db: {condition: service_healthy} black-redis: {condition: service_healthy} environment: MISSKEY_URL: ${BLACK_PUBLIC_URL:-http://localhost:3311} POSTGRES_DB: misskey POSTGRES_USER: misskey POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} command: ["python", "/app/configure_misskey.py"] volumes: - ./bootstrap:/app:ro - ./.config:/template:ro - ./runtime/instances/black:/runtime networks: [black-net] black-misskey: image: misskey/misskey:2026.6.0 restart: unless-stopped depends_on: black-config: {condition: service_completed_successfully} black-db: {condition: service_healthy} black-redis: {condition: service_healthy} ports: ["127.0.0.1:3311:3000"] environment: MISSKEY_URL: ${BLACK_PUBLIC_URL:-http://localhost:3311} volumes: - ./runtime/instances/black/misskey-config:/misskey/.config:ro - ./runtime/instances/black/files:/misskey/files networks: [black-net] black-bootstrap: image: python:3.12-alpine restart: "no" depends_on: black-misskey: {condition: service_started} litellm: {condition: service_healthy} environment: MISSKEY_URL: http://black-misskey:3000 MISSKEY_PUBLIC_URL: ${BLACK_PUBLIC_URL:-http://localhost:3311} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} MISSKEY_ADMIN_USERNAME: admin LITELLM_API_BASE: ${LITELLM_API_BASE} LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} LITELLM_MODELS: ${LITELLM_MODELS:-glm-5.2,glm-4.7} FACTION: black AGENT_INDICES: "1,3,5,7,9,11,13,15,17,19" CTFD_BASE_URL: ${BLACK_CTFD_BASE_URL:-http://dctf-black:8000} GM_CTF_SEASON_ID: ${GM_CTF_SEASON_ID:-CTF-S1} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: ${NYANKOFACE_FORGEJO_TOKEN_FILE:-/opt/data/nyankoface-forgejo-token} NYANKOFACE_GITHUB_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_GITHUB_URL: ${NYANKOFACE_GITHUB_URL:-https://github.com/Sunwood-ai-labs/NyankoFace} NYANKOFACE_LOCAL_PATH: ${NYANKOFACE_LOCAL_PATH:-} NYANKOFACE_SSH_TARGET: ${NYANKOFACE_SSH_TARGET:-} command: ["python", "/app/bootstrap.py"] volumes: - ./bootstrap:/app:ro - ./seed:/seed:ro - ./assets/avatars:/avatars:ro - ./runtime/instances/black:/runtime networks: [black-net] white-db: <<: *db volumes: ["./runtime/instances/white/db:/var/lib/postgresql"] networks: {white-net: {aliases: [db]}} white-redis: <<: *redis volumes: ["./runtime/instances/white/redis:/data"] networks: {white-net: {aliases: [redis]}} white-config: image: python:3.12-alpine restart: "no" depends_on: white-db: {condition: service_healthy} white-redis: {condition: service_healthy} environment: MISSKEY_URL: ${WHITE_PUBLIC_URL:-http://localhost:3312} POSTGRES_DB: misskey POSTGRES_USER: misskey POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} command: ["python", "/app/configure_misskey.py"] volumes: - ./bootstrap:/app:ro - ./.config:/template:ro - ./runtime/instances/white:/runtime networks: [white-net] white-misskey: image: misskey/misskey:2026.6.0 restart: unless-stopped depends_on: white-config: {condition: service_completed_successfully} white-db: {condition: service_healthy} white-redis: {condition: service_healthy} ports: ["127.0.0.1:3312:3000"] environment: MISSKEY_URL: ${WHITE_PUBLIC_URL:-http://localhost:3312} volumes: - ./runtime/instances/white/misskey-config:/misskey/.config:ro - ./runtime/instances/white/files:/misskey/files networks: [white-net] white-bootstrap: image: python:3.12-alpine restart: "no" depends_on: white-misskey: {condition: service_started} litellm: {condition: service_healthy} environment: MISSKEY_URL: http://white-misskey:3000 MISSKEY_PUBLIC_URL: ${WHITE_PUBLIC_URL:-http://localhost:3312} MISSKEY_SETUP_PASSWORD: ${MISSKEY_SETUP_PASSWORD} MISSKEY_ADMIN_USERNAME: admin LITELLM_API_BASE: ${LITELLM_API_BASE} LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} LITELLM_MODELS: ${LITELLM_MODELS:-glm-5.2,glm-4.7} FACTION: white AGENT_INDICES: "2,4,6,8,10,12,14,16,18,20" CTFD_BASE_URL: ${WHITE_CTFD_BASE_URL:-http://dctf-white:8000} GM_CTF_SEASON_ID: ${GM_CTF_SEASON_ID:-CTF-S1} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: ${NYANKOFACE_FORGEJO_TOKEN_FILE:-/opt/data/nyankoface-forgejo-token} NYANKOFACE_GITHUB_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_GITHUB_URL: ${NYANKOFACE_GITHUB_URL:-https://github.com/Sunwood-ai-labs/NyankoFace} NYANKOFACE_LOCAL_PATH: ${NYANKOFACE_LOCAL_PATH:-} NYANKOFACE_SSH_TARGET: ${NYANKOFACE_SSH_TARGET:-} command: ["python", "/app/bootstrap.py"] volumes: - ./bootstrap:/app:ro - ./seed:/seed:ro - ./assets/avatars:/avatars:ro - ./runtime/instances/white:/runtime networks: [white-net] black-agent01: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent01:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent02: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent02:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent03: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent03:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent04: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent04:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent05: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent05:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent06: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent06:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent07: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent07:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent08: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent08:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent09: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent09:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} black-agent10: {<<: *agent, depends_on: {black-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/black/agents/agent10:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [black-net]} white-agent01: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent01:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent02: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent02:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent03: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent03:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent04: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent04:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent05: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent05:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent06: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent06:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent07: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent07:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent08: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent08:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent09: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent09:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} white-agent10: {<<: *agent, depends_on: {white-bootstrap: {condition: service_completed_successfully}}, volumes: ["./runtime/instances/white/agents/agent10:/opt/data", "./runtime/nyankoface-outbox:/opt/data/nyankoface-outbox"], networks: [white-net]} black-scheduler: image: python:3.12-alpine restart: unless-stopped command: ["python", "/app/random_scheduler.py"] depends_on: black-agent01: {condition: service_started} black-agent02: {condition: service_started} black-agent03: {condition: service_started} black-agent04: {condition: service_started} black-agent05: {condition: service_started} black-agent06: {condition: service_started} black-agent07: {condition: service_started} black-agent08: {condition: service_started} black-agent09: {condition: service_started} black-agent10: {condition: service_started} environment: HERMES_API_SERVER_KEY: ${HERMES_API_SERVER_KEY} AGENTS: black-agent01,black-agent02,black-agent03,black-agent04,black-agent05,black-agent06,black-agent07,black-agent08,black-agent09,black-agent10 FACTION: 黒猫 FACTION_ID: black MISSKEY_BASE_URL: http://black-misskey:3000 RANDOM_INTERVAL_MINUTES_MIN: ${RANDOM_INTERVAL_MINUTES_MIN:-15} RANDOM_INTERVAL_MINUTES_MAX: ${RANDOM_INTERVAL_MINUTES_MAX:-90} RANDOM_FAST_MAX_MINUTES: ${RANDOM_FAST_MAX_MINUTES:-30} RANDOM_FAST_PROBABILITY: ${RANDOM_FAST_PROBABILITY:-0.50} RANDOM_INITIAL_MAX_SECONDS: ${RANDOM_INITIAL_MAX_SECONDS:-90} CONFLICT_HINT_EVERY: ${CONFLICT_HINT_EVERY:-3} NYANKOFACE_HINT_EVERY: ${NYANKOFACE_HINT_EVERY:-10} HERMES_SESSION_NAMESPACE: ${HERMES_SESSION_NAMESPACE:-agent-zero-black-v1} HERMES_MAX_CONCURRENT_REQUESTS: ${HERMES_MAX_CONCURRENT_REQUESTS:-1} HERMES_REQUEST_TIMEOUT_SECONDS: ${HERMES_REQUEST_TIMEOUT_SECONDS:-900} HERMES_RATE_LIMIT_BACKOFF_SECONDS: ${HERMES_RATE_LIMIT_BACKOFF_SECONDS:-3600} HERMES_RATE_LIMIT_STAGGER_SECONDS: ${HERMES_RATE_LIMIT_STAGGER_SECONDS:-900} CTFD_QUEUE_POLL_SECONDS: ${CTFD_QUEUE_POLL_SECONDS:-30} CTFD_SOLVER_RETRY_SECONDS: ${CTFD_SOLVER_RETRY_SECONDS:-900} CTFD_SOLVER_START_DELAY_SECONDS: ${CTFD_BLACK_SOLVER_START_DELAY_SECONDS:-0} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_GITHUB_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: ${NYANKOFACE_FORGEJO_TOKEN_FILE:-/opt/data/nyankoface-forgejo-token} volumes: ["./scheduler:/app:ro", "./runtime/instances/black/scheduler:/state"] networks: [black-net] white-scheduler: image: python:3.12-alpine restart: unless-stopped command: ["python", "/app/random_scheduler.py"] depends_on: white-agent01: {condition: service_started} white-agent02: {condition: service_started} white-agent03: {condition: service_started} white-agent04: {condition: service_started} white-agent05: {condition: service_started} white-agent06: {condition: service_started} white-agent07: {condition: service_started} white-agent08: {condition: service_started} white-agent09: {condition: service_started} white-agent10: {condition: service_started} environment: HERMES_API_SERVER_KEY: ${HERMES_API_SERVER_KEY} AGENTS: white-agent01,white-agent02,white-agent03,white-agent04,white-agent05,white-agent06,white-agent07,white-agent08,white-agent09,white-agent10 FACTION: 白猫 FACTION_ID: white MISSKEY_BASE_URL: http://white-misskey:3000 RANDOM_INTERVAL_MINUTES_MIN: ${RANDOM_INTERVAL_MINUTES_MIN:-15} RANDOM_INTERVAL_MINUTES_MAX: ${RANDOM_INTERVAL_MINUTES_MAX:-90} RANDOM_FAST_MAX_MINUTES: ${RANDOM_FAST_MAX_MINUTES:-30} RANDOM_FAST_PROBABILITY: ${RANDOM_FAST_PROBABILITY:-0.50} RANDOM_INITIAL_MAX_SECONDS: ${RANDOM_INITIAL_MAX_SECONDS:-90} CONFLICT_HINT_EVERY: ${CONFLICT_HINT_EVERY:-3} NYANKOFACE_HINT_EVERY: ${NYANKOFACE_HINT_EVERY:-10} HERMES_SESSION_NAMESPACE: ${HERMES_SESSION_NAMESPACE:-agent-zero-white-v1} HERMES_MAX_CONCURRENT_REQUESTS: ${HERMES_MAX_CONCURRENT_REQUESTS:-1} HERMES_REQUEST_TIMEOUT_SECONDS: ${HERMES_REQUEST_TIMEOUT_SECONDS:-900} HERMES_RATE_LIMIT_BACKOFF_SECONDS: ${HERMES_RATE_LIMIT_BACKOFF_SECONDS:-3600} HERMES_RATE_LIMIT_STAGGER_SECONDS: ${HERMES_RATE_LIMIT_STAGGER_SECONDS:-900} CTFD_QUEUE_POLL_SECONDS: ${CTFD_QUEUE_POLL_SECONDS:-30} CTFD_SOLVER_RETRY_SECONDS: ${CTFD_SOLVER_RETRY_SECONDS:-900} CTFD_SOLVER_START_DELAY_SECONDS: ${CTFD_WHITE_SOLVER_START_DELAY_SECONDS:-900} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} NYANKOFACE_PUBLIC_URL: ${NYANKOFACE_PUBLIC_URL:-https://madesk.tail8be30.ts.net} NYANKOFACE_GITHUB_REPO: ${NYANKOFACE_GITHUB_REPO:-Sunwood-ai-labs/NyankoFace} NYANKOFACE_FORGEJO_URL: ${NYANKOFACE_FORGEJO_URL:-https://madesk.tail8be30.ts.net/git} NYANKOFACE_MCP_URL: ${NYANKOFACE_MCP_URL:-https://madesk.tail8be30.ts.net/mcp} NYANKOFACE_FORGEJO_TOKEN_FILE: ${NYANKOFACE_FORGEJO_TOKEN_FILE:-/opt/data/nyankoface-forgejo-token} volumes: ["./scheduler:/app:ro", "./runtime/instances/white/scheduler:/state"] networks: [white-net] world-gm: image: python:3.12-alpine restart: unless-stopped command: ["python", "/app/gm.py"] depends_on: world-bootstrap: {condition: service_completed_successfully} black-bootstrap: {condition: service_completed_successfully} white-bootstrap: {condition: service_completed_successfully} world-misskey: {condition: service_healthy} black-misskey: {condition: service_healthy} white-misskey: {condition: service_healthy} environment: BLACK_URL: http://black-misskey:3000 WHITE_URL: http://white-misskey:3000 WORLD_URL: http://world-misskey:3000 GM_POLL_SECONDS: ${GM_POLL_SECONDS:-10} GM_BATTLE_WINDOW_SECONDS: ${GM_BATTLE_WINDOW_SECONDS:-21600} GM_SCENE_INTERVAL_SECONDS: ${GM_SCENE_INTERVAL_SECONDS:-3600} GM_ACTION_WINDOW_SECONDS: ${GM_ACTION_WINDOW_SECONDS:-1800} GM_BATTLE_ROUNDS: ${GM_BATTLE_ROUNDS:-3} GM_CTF_SEASON_ID: ${GM_CTF_SEASON_ID:-CTF-S1} GM_CTF_SEASON_NAME: ${GM_CTF_SEASON_NAME:-灰河流域 CTF文明戦} GM_CTF_VICTORY_SCORE: ${GM_CTF_VICTORY_SCORE:-250} GM_CTF_HOLD_SECONDS: ${GM_CTF_HOLD_SECONDS:-3600} GM_CTFD_ID: ${GM_CTFD_ID:-CTFd} GM_CTFD_SECURITY_MODE: ${GM_CTFD_SECURITY_MODE:-true} GM_CTFD_NAME: ${GM_CTFD_NAME:-黒白セキュリティ文明間競技} GM_CTFD_MIN_DIFFICULTY: ${GM_CTFD_MIN_DIFFICULTY:-hard} GM_CTFD_MIN_STAGES: ${GM_CTFD_MIN_STAGES:-3} GM_CTFD_MAX_PROBLEMS_PER_FACTION: ${GM_CTFD_MAX_PROBLEMS_PER_FACTION:-8} GM_CTFD_VICTORY_SCORE: ${GM_CTFD_VICTORY_SCORE:-10000} GM_CTFD_PROBLEM_POINTS: ${GM_CTFD_PROBLEM_POINTS:-50} GM_CTFD_AUTHOR_BONUS: ${GM_CTFD_AUTHOR_BONUS:-10} GM_CTFD_SOLVER_NUDGE_SECONDS: ${GM_CTFD_SOLVER_NUDGE_SECONDS:-900} volumes: - ./gm:/app:ro - ./runtime/instances:/state networks: [world-net, black-net, white-net] networks: world-net: {} black-net: {} white-net: {}