name: wizard services: wizard_website: build: ./wizard_website restart: unless-stopped networks: - wizard_website wizard_server: build: ./wizard_server restart: unless-stopped environment: AI_SHARED_SECRET: ${AI_SHARED_SECRET:?set AI_SHARED_SECRET in .env} ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-} LOG_LEVEL: ${LOG_LEVEL:-INFO} networks: - wizard_api - wizard_internal wizard_ai: build: context: ./wizard_ai # The AI uses the game logic package of the server (requires docker compose >= 2.17). additional_contexts: game_logic: ./wizard_server/game_logic restart: unless-stopped environment: SERVER_URL: ws://wizard_server:8083/internal/ai AI_SHARED_SECRET: ${AI_SHARED_SECRET:?set AI_SHARED_SECRET in .env} AGENT: ${AI_AGENT:-model} MODEL_PATH: /srv/models/latest LOG_LEVEL: ${LOG_LEVEL:-INFO} volumes: # Trained checkpoints; replace without rebuilding the image. - ./wizard_ai/models:/srv/models:ro depends_on: - wizard_server networks: - wizard_internal networks: # Shared with the existing Caddy reverse proxy. wizard_website: external: true wizard_api: external: true # Only the game server and the AI player; no route to the outside. wizard_internal: name: wizard_internal internal: true