version: '3.8' services: # Runner 1: Heavy workloads (Java/Python) gitea-runner-heavy: image: gitea/act_runner:latest container_name: labfusion-runner-heavy environment: - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL:-http://localhost:3000} - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN} - GITEA_RUNNER_NAME=labfusion-runner-heavy - GITEA_RUNNER_LABELS=ubuntu-latest,self-hosted,heavy,java,python volumes: - /var/run/docker.sock:/var/run/docker.sock - runner-data-heavy:/data - shared-cache:/cache restart: unless-stopped deploy: resources: limits: cpus: '4.0' memory: 8G reservations: cpus: '2.0' memory: 4G networks: - gitea-runners healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Runner 2: Light workloads (Node.js/Frontend) gitea-runner-light: image: gitea/act_runner:latest container_name: labfusion-runner-light environment: - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL:-http://localhost:3000} - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN} - GITEA_RUNNER_NAME=labfusion-runner-light - GITEA_RUNNER_LABELS=ubuntu-latest,self-hosted,light,nodejs,frontend volumes: - /var/run/docker.sock:/var/run/docker.sock - runner-data-light:/data - shared-cache:/cache restart: unless-stopped deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G networks: - gitea-runners healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Runner 3: Integration/Docker workloads gitea-runner-docker: image: gitea/act_runner:latest container_name: labfusion-runner-docker environment: - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL:-http://localhost:3000} - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN} - GITEA_RUNNER_NAME=labfusion-runner-docker - GITEA_RUNNER_LABELS=ubuntu-latest,self-hosted,docker,integration volumes: - /var/run/docker.sock:/var/run/docker.sock - runner-data-docker:/data - shared-cache:/cache restart: unless-stopped deploy: resources: limits: cpus: '6.0' memory: 12G reservations: cpus: '3.0' memory: 6G networks: - gitea-runners healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Optional: Runner for specific tasks (e.g., security scans) gitea-runner-security: image: gitea/act_runner:latest container_name: labfusion-runner-security environment: - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL:-http://localhost:3000} - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_TOKEN} - GITEA_RUNNER_NAME=labfusion-runner-security - GITEA_RUNNER_LABELS=ubuntu-latest,self-hosted,security,scan volumes: - /var/run/docker.sock:/var/run/docker.sock - runner-data-security:/data - shared-cache:/cache restart: unless-stopped deploy: resources: limits: cpus: '2.0' memory: 4G reservations: cpus: '1.0' memory: 2G networks: - gitea-runners healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: runner-data-heavy: driver: local runner-data-light: driver: local runner-data-docker: driver: local runner-data-security: driver: local shared-cache: driver: local networks: gitea-runners: driver: bridge