services: caddy: image: caddy:2-alpine restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" volumes: - ./data/caddy/data:/data - ./data/caddy/config:/config entrypoint: ["sh", "-c"] command: - | echo '${DOMAIN} { handle /v2/* { reverse_proxy registry:5000 } handle { reverse_proxy auth:5000 } }' | caddy run --adapter caddyfile --config - depends_on: - registry - auth networks: - registry_net registry: image: registry:2 restart: unless-stopped environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Docker Registry REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_STORAGE_DELETE_ENABLED: "true" # Blob-Cache deaktivieren: Die Garbage Collection laeuft als separater # Prozess auf dem gemounteten Speicher. Mit aktivem In-Memory-Cache wuerde # die laufende Registry geloeschte Blobs faelschlich fuer vorhanden halten # und beim erneuten Pull keine Layer-Verknuepfung anlegen (Image fehlt dann # im Katalog / "manifest unknown"). Ohne Cache ist die Live-GC sicher. REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR: "" volumes: - ./data/registry:/var/lib/registry - ./data/htpasswd:/auth:ro networks: - registry_net auth: build: ./auth-app restart: unless-stopped environment: ADMIN_USER: ${ADMIN_USER} ADMIN_PASSWORD: ${ADMIN_PASSWORD} SECRET_KEY: ${SECRET_KEY} DB_PATH: /data/users.db HTPASSWD_PATH: /auth/htpasswd GC_CONFIG: /app/registry-gc-config.yml volumes: - ./data/auth:/data - ./data/htpasswd:/auth # Registry-Speicher fuer die Garbage Collection (gleicher Pfad wie im registry-Container) - ./data/registry:/var/lib/registry networks: - registry_net networks: registry_net: