--- type: Journal status: ACTIVE owner: DevOps date: 2026-03-06 last_update: 2026-03-06 --- # Session Log — Pipeline 502 Bad Gateway Fix ## Problem Der Gitea-Runner (VM 102, `10.0.0.23`) brach beim Docker-Push mit `502 Bad Gateway` ab: ``` ERROR: failed to push git.mo-code.at/.../ping-service:latest: failed to authorize: failed to fetch oauth token: unexpected status from POST request to https://git.mo-code.at/v2/token: 502 Bad Gateway ``` Der Build lief durch (alle Layers gebaut), aber der Push schlug nach ~70 Sekunden fehl. ## Root Cause Der Runner routete den Registry-Push über Pangolin (CT 100, `10.0.0.21`) → `git.mo-code.at` → Gitea (CT 101, `10.0.0.22`). Bei großen Image-Layern (70+ Sekunden Upload) brach Pangolin die Verbindung ab und antwortete mit 502 — sowohl beim Blob-Upload (PUT) als auch beim abschließenden OAuth-Token-Fetch für den Manifest-Push. **Zusätzlich:** `docker/build-push-action` generiert standardmäßig Attestation-Manifests (SLSA Provenance + SBOM), die weitere Token-Requests auslösen — jeder davon ein zusätzliches 502-Risiko bei Pangolin. ## Änderungen ### `.gitea/workflows/docker-publish.yaml` **1. Pangolin-Bypass via `/etc/hosts`** ```yaml - name: Registry intern auflösen (Pangolin-Bypass) run: echo "10.0.0.22 git.mo-code.at" | sudo tee -a /etc/hosts ``` Bewirkt: Der Runner löst `git.mo-code.at` direkt auf `10.0.0.22` (Gitea intern) auf. Push läuft nun intern 10.0.0.23 → 10.0.0.22, kein Pangolin-Timeout mehr möglich. Image-Tags bleiben `git.mo-code.at/...` — für externe Pulls weiterhin korrekt. **2. Attestation-Manifeste deaktiviert** ```yaml provenance: false sbom: false ``` Bewirkt: Keine zusätzlichen Manifest-Pushes, kein extra Token-Request am Ende des Builds. ## Netz-Topologie (zur Referenz) ``` Runner (VM 102, 10.0.0.23) ↓ /etc/hosts: git.mo-code.at → 10.0.0.22 Gitea (CT 101, 10.0.0.22:3000) ← direkter Push, kein Pangolin ↑ Pangolin (CT 100, 10.0.0.21) ← nur noch für externe Nutzer ↑ git.mo-code.at (Internet) ``` ## Gelernt - Pangolin-Tunnel ist für kurze REST-Calls geeignet, nicht für große Binär-Uploads (Docker Layers) - Self-hosted Runner sollten Registry-Endpunkte immer intern auflösen - `provenance: false` + `sbom: false` ist Best Practice für private/interne Registries