services: dashboard: build: context: . image: contribai:local command: - --config - /home/contribai/config.yaml - web-server - --host - 0.0.0.0 - --port - "8787" ports: - "127.0.0.1:8787:8787" volumes: - contribai-data:/home/contribai/.contribai - ./config.yaml:/home/contribai/config.yaml:ro environment: GITHUB_TOKEN: ${GITHUB_TOKEN:-} GEMINI_API_KEY: ${GEMINI_API_KEY:-} # The server itself fails closed when this is empty on a non-loopback bind. CONTRIBAI_WEB_API_KEY: ${CONTRIBAI_WEB_API_KEY:-} GITHUB_WEBHOOK_SECRET: ${GITHUB_WEBHOOK_SECRET:-} read_only: true tmpfs: - /tmp:size=128m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL restart: unless-stopped healthcheck: test: ["CMD", "curl", "--fail", "--silent", "http://127.0.0.1:8787/api/health"] interval: 30s timeout: 5s retries: 3 scheduler: build: context: . image: contribai:local command: ["--config", "/home/contribai/config.yaml", "schedule"] profiles: ["scheduler"] volumes: - contribai-data:/home/contribai/.contribai - ./config.yaml:/home/contribai/config.yaml:ro environment: GITHUB_TOKEN: ${GITHUB_TOKEN:-} GEMINI_API_KEY: ${GEMINI_API_KEY:-} read_only: true tmpfs: - /tmp:size=128m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL runner: build: context: . image: contribai:local profiles: ["cli"] volumes: - contribai-data:/home/contribai/.contribai - ./config.yaml:/home/contribai/config.yaml:ro environment: GITHUB_TOKEN: ${GITHUB_TOKEN:-} GEMINI_API_KEY: ${GEMINI_API_KEY:-} read_only: true tmpfs: - /tmp:size=128m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL volumes: contribai-data: