version: '3.8' services: # Runner 1: Heavy workloads (Java/Python) gitea-runner-heavy: image: docker.io/gitea/act_runner:nightly environment: CONFIG_FILE: /config.yaml GITEA_INSTANCE_URL: ${GITEA_INSTANCE_URL} GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN} GITEA_RUNNER_NAME: labfusion-runner-heavy GITEA_RUNNER_LABELS: ubuntu-latest,self-hosted,heavy,java,python env_file: - .env.runners volumes: - ./config_heavy.yaml:/config.yaml - ./data:/data - /var/run/docker.sock:/var/run/docker.sock 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: docker.io/gitea/act_runner:nightly environment: CONFIG_FILE: /config.yaml GITEA_INSTANCE_URL: ${GITEA_INSTANCE_URL} GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN} GITEA_RUNNER_NAME: labfusion-runner-light GITEA_RUNNER_LABELS: ubuntu-latest,self-hosted,light,nodejs,frontend env_file: - .env.runners volumes: - ./config_light.yaml:/config.yaml - ./data_light:/data - /var/run/docker.sock:/var/run/docker.sock 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: docker.io/gitea/act_runner:nightly environment: CONFIG_FILE: /config.yaml GITEA_INSTANCE_URL: ${GITEA_INSTANCE_URL} GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN} GITEA_RUNNER_NAME: labfusion-runner-docker GITEA_RUNNER_LABELS: ubuntu-latest,self-hosted,docker,integration env_file: - .env.runners volumes: - ./config_docker.yaml:/config.yaml - ./data_docker:/data - /var/run/docker.sock:/var/run/docker.sock 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: docker.io/gitea/act_runner:nightly environment: CONFIG_FILE: /config.yaml GITEA_INSTANCE_URL: ${GITEA_INSTANCE_URL} GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN} GITEA_RUNNER_NAME: labfusion-runner-security GITEA_RUNNER_LABELS: ubuntu-latest,self-hosted,security,scan env_file: - .env.runners volumes: - ./config_security.yaml:/config.yaml - ./data_security:/data - /var/run/docker.sock:/var/run/docker.sock 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