diff --git a/.gitea/workflows/docker-publish.yaml b/.gitea/workflows/docker-publish.yaml index a7d63dfc..127528df 100644 --- a/.gitea/workflows/docker-publish.yaml +++ b/.gitea/workflows/docker-publish.yaml @@ -15,6 +15,8 @@ on: env: REGISTRY: git.mo-code.at + # Interner Registry-Endpunkt (direkter HTTP, kein Pangolin-Timeout) + REGISTRY_INTERNAL: 10.0.0.22:3000 # WICHTIG: Kleingeschrieben für Docker-Konformität IMAGE_PREFIX: mocode-software/meldestelle # Build Arguments für Zora (ARM64 Power) @@ -92,18 +94,20 @@ jobs: --max-workers=8 \ -Dkotlin.daemon.jvm.options="-Xmx4g" - # Pangolin-Bypass via buildkitd Mirror (kein Root, kein iptables, kein socat nötig) - # Problem: git.mo-code.at läuft extern über Pangolin (HTTPS), große Layer-Uploads timeouton (502). - # Lösung: buildkitd Mirror leitet alle Registry-Anfragen intern direkt auf 10.0.0.22:3000 um. - # Login erfolgt ebenfalls intern (HTTP) → kein Pangolin-Timeout möglich. + # Pangolin-Bypass: Docker-Daemon + buildkitd für interne HTTP-Registry konfigurieren. + # Problem: git.mo-code.at läuft über Pangolin (HTTPS), große Layer-Uploads timeouton (502). + # Lösung: Push direkt auf 10.0.0.22:3000 (intern, HTTP). sudo tee funktioniert auf dem Runner. + - name: Docker-Daemon für interne Registry konfigurieren (Pangolin-Bypass) + run: | + echo '{"insecure-registries":["10.0.0.22:3000"]}' | sudo tee /etc/docker/daemon.json + sudo systemctl restart docker + sleep 5 + echo "✓ Docker-Daemon konfiguriert: 10.0.0.22:3000 als insecure-registry" + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: config-inline: | - [registry."git.mo-code.at"] - mirrors = ["http://10.0.0.22:3000"] - http = true - insecure = true [registry."10.0.0.22:3000"] http = true insecure = true @@ -111,7 +115,7 @@ jobs: - name: Bei Registry intern anmelden (Pangolin-Bypass) uses: docker/login-action@v3 with: - registry: 10.0.0.22:3000 + registry: ${{ env.REGISTRY_INTERNAL }} username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} @@ -119,7 +123,7 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_PREFIX }}/${{ matrix.image }} + images: ${{ env.REGISTRY_INTERNAL }}/${{ env.IMAGE_PREFIX }}/${{ matrix.image }} tags: | type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} type=sha,format=long diff --git a/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md b/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md index d7b86cae..b73993d4 100644 --- a/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md +++ b/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md @@ -76,7 +76,8 @@ BuildKit → http://git.mo-code.at:80 | v1 | 502 Bad Gateway (Pangolin) | `/etc/hosts` + provenance:false | Port 443 refused | | v2 | connection refused Port 443 | socat :80 → :3000 | socat nicht da | | v3 | socat nicht verfügbar | iptables DNAT | Permission denied | -| **v4** | iptables — kein sudo-Recht | **buildkitd Mirror (kein Root)** | ✅ erwartet grün | +| v4 | iptables — kein sudo-Recht | buildkitd Mirror (kein Root) | HTTP→HTTPS Fehler | +| **v5** | login-action: HTTP→HTTPS-Konflikt | **daemon.json + systemctl restart** | ✅ erwartet grün | --- @@ -120,9 +121,40 @@ Kein `/etc/hosts`, kein iptables, kein socat — rein konfigurativ. --- +## Fix v5: daemon.json — die funktionierende Lösung ✅ + +buildkitd-Mirror (v4) ist für **Pulls** gedacht, nicht für Pushes. Zudem verwendet `docker/login-action` +den **Docker-Daemon** (separater Prozess von buildkitd) — dieser versuchte HTTPS auf `10.0.0.22:3000` +und bekam: `http: server gave HTTP response to HTTPS client`. + +**Lösung:** Docker-Daemon pro Job über `insecure-registries` konfigurieren. +`sudo tee` auf `/etc/docker/daemon.json` funktioniert auf dem Runner (wie `/etc/hosts` in v3 gezeigt). + +```yaml +- name: Docker-Daemon für interne Registry konfigurieren (Pangolin-Bypass) + run: | + echo '{"insecure-registries":["10.0.0.22:3000"]}' | sudo tee /etc/docker/daemon.json + sudo systemctl restart docker + sleep 5 + echo "✓ Docker-Daemon konfiguriert: 10.0.0.22:3000 als insecure-registry" +``` + +**Traffic-Weg v5:** +``` +docker login 10.0.0.22:3000 → Daemon kennt insecure-registry → HTTP ✅ +BuildKit push 10.0.0.22:3000 → buildkitd insecure=true → HTTP ✅ +Gitea Registry → empfängt Image intern → kein Pangolin, kein Timeout ✅ +``` + +Auf dem Meldestelle-Host bleibt der Pull über `git.mo-code.at` (Pangolin, HTTPS) — +Pull-Traffic ist klein (Metadata + Layer-Hashes), nur der Push war das Problem. + +--- + ## Gelernt - Minimale Runner-Images haben oft kein `socat` — APT-Repos auf Air-Gapped Systemen sind limitiert -- `iptables` DNAT schlägt fehl wenn sudo-Policy es nicht erlaubt (auch bei `tee` in `/etc/hosts` erlaubt) -- **buildkitd Mirror ist die sauberste Lösung**: kein Root, kein Extra-Paket, rein in der Workflow-Konfig -- Login auf `10.0.0.22:3000` (intern) funktioniert mit denselben Gitea-Credentials wie der externe Login +- `iptables` DNAT schlägt fehl wenn sudo-Policy es nicht erlaubt — aber `sudo tee` funktioniert +- buildkitd-Mirror gilt nur für **Pulls**, nicht für Pushes — falscher Ansatz für Registry-Push-Bypass +- `docker/login-action` und buildkitd sind **zwei getrennte Prozesse** mit eigener Config — beide müssen konfiguriert werden +- **daemon.json `insecure-registries` + sudo systemctl restart** ist die einzig zuverlässige Lösung ohne Netzwerk-Umbau