version: '3' services: caddy: image: caddy:2-alpine # Lighter image container_name: caddy restart: always ports: - "80:80" - "443:443" volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile - ./caddy/data:/data - ./caddy/config:/config networks: - devops deploy: resources: limits: memory: 128M # Reduced from 256M gitea: image: gitea/gitea:latest container_name: gitea restart: always environment: - USER_UID=1000 - USER_GID=1000 - ROOT_URL=https://git.jaub.cloud volumes: - ./gitea:/data networks: - devops expose: - "3000" - "2221:22" deploy: resources: limits: memory: 384M # Reduced from 512M (requires Gitea optimizations) gitea-runner: image: registry.jaub.cloud/gitearunner container_name: gitea-runner restart: always cpu_shares: 2 depends_on: - gitea environment: - GITEA_INSTANCE_URL=https://git.jaub.cloud # Must match ROOT_URL from gitea service - GITEA_RUNNER_REGISTRATION_TOKEN=FWFN6jefHsXN8749nXOn9KRBpHm9eEpmmBzWvgTX - GITEA_RUNNER_LABELS=docker:docker://alpine:latest volumes: - ./runner/data:/data - /var/run/docker.sock:/var/run/docker.sock networks: - devops deploy: resources: limits: memory: 512M registry: image: registry:latest # Alpine variant container_name: registry restart: always volumes: - ./registry:/var/lib/registry networks: - devops expose: - "5000" deploy: resources: limits: memory: 128M # Reduced from 256M networks: devops: driver: bridge