dorfteich/docs/vs-nfd/95-mirror-protokoll.md
Claude Fable 5 2f7ba65eef
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 6m11s
CI / Build container images (pull_request) Successful in 1m24s
CI / Import/export fidelity gate (pull_request) Successful in 57s
CI / Import/export fidelity gate (push) Blocked by required conditions
CI / Auth e2e pack (pull_request) Successful in 8m49s
CD / Build and push images (push) Successful in 20s
CD / Deploy to Test (push) Successful in 13s
CD / Smoke tests against Test (push) Successful in 1m25s
CD / Promote to Int (push) Successful in 12s
CI / Lint, typecheck, test (push) Successful in 6m24s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Has been cancelled
#218: mirror procedure into an internal registry
Airgapped sites pull from their own registry (ADR 0024). The image list
is GENERATED (deploy/scripts/list-images.sh resolves the compose file
incl. the caddy profile) so a mirror can never silently miss a service;
third-party images gain a configurable ${REGISTRY_PREFIX:-} in the
compose file (digest pins unchanged - Docker verifies the same sha256
regardless of which registry serves it), own images keep IMAGE_PREFIX;
no image reference is ever edited per site.

Step-by-step procedure in deploy/stages.md 5b: generate list, copy
digest-preservingly (docker buildx imagetools create; plain
pull/tag/push as the documented fallback - the digest comparison closes
the loop either way), verify the digest in the mirror against the pin,
point the deployment via REGISTRY_PREFIX/IMAGE_PREFIX.

Executed once end-to-end and recorded as assessor-facing evidence
(docs/vs-nfd/95-mirror-protokoll.md): all four third-party images
mirrored digest-identically into a local registry:2, plus
dorfteich-api:v0.12.0 (sha256:576f1646... identical on both sides; the
imagetools stall against the Gitea registry is recorded with its
workaround). Operations manual's airgap section now lists the mirror
part as available.

Refs #218.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AUtYMxwTCMHG9mVHnwbFg8
2026-07-31 14:33:04 +02:00

56 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Mirror-Protokoll — Spiegelung in eine interne Registry (Issue #218)
Nachweis der einmaligen End-to-End-Ausführung des Mirror-Verfahrens aus
`deploy/stages.md` §5b (ADR 0024). Prüfer-taugliche Belegstufe: **live
verifiziert** — jede Zeile unten ist die tatsächliche Ausgabe des
Verifikationsschritts, nicht eine Erwartung.
- **Datum:** 2026-07-31
- **Umgebung:** Dritt-Images: macOS-Arbeitsplatz (OrbStack-Docker) mit
Ziel-Registry `registry:2` auf `localhost:5001`; eigenes Image: Host
ONE mit Ziel-Registry `registry:2` auf `127.0.0.1:5002`
stellvertretend für die interne Registry der Behörde; das Verfahren
ist registry-agnostisch.
- **Quelle der Image-Liste:** `deploy/scripts/list-images.sh` mit
`TAG=v0.12.0` (der aktuelle Prod-Stand), generiert aus
`deploy/compose/docker-compose.yml` inkl. caddy-Profil.
- **Kopierwerkzeug:** Dritt-Images per `docker buildx imagetools
create` (kopiert Manifeste registry-zu-registry ohne Re-Encoding —
digest-erhaltend). Eigenes Image per `docker pull` + `tag` + `push`;
der Digest-Vergleich schließt die Schleife (Beobachtung 31.07.:
`imagetools create` stallte vom Arbeitsplatz gegen die Gitea-Registry,
während die Registry-API sofort antwortete — der pull/push-Weg ist der
robuste Ausweich, solange der Digest verifiziert wird).
## Ergebnis je Image
Verifikation jeweils per `docker buildx imagetools inspect
localhost:5001/mirror/<name>` — der Digest im Spiegel muss dem Pin aus
der Compose-Datei gleichen.
| Image | Gepinnter Digest (Compose) | Digest im Spiegel | Ergebnis |
| ----------------------- | ------------------------------------------------------------------------- | ----------------- | -------- |
| `caddy:2.10-alpine` | `sha256:4c6e91c6ed0e2fa03efd5b44747b625fec79bc9cd06ac5235a779726618e530d` | identisch | OK |
| `postgres:17.5-alpine` | `sha256:6567bca8d7bc8c82c5922425a0baee57be8402df92bae5eacad5f01ae9544daa` | identisch | OK |
| `pandoc/core:3.6` | `sha256:5b8a29d9b70d5d8ca766e5d1dcfc41916b23ab79276a80527be70516110f4c1e` | identisch | OK |
| `gotenberg/gotenberg:8` | `sha256:67097317623a503ba2a6a7e9ae8db6929a1f7e1bbd88077bacf2d325fbdab923` | identisch | OK |
| `dorfteich-api:v0.12.0` | `sha256:576f16467563871a9655059fc9cdcce49e3951b54a8697065081a9a6832d2294` | identisch | OK |
(Die drei übrigen eigenen Images `web`/`collab`/`backup` folgen exakt
demselben Kommando mit anderem Namen; das Verfahren ist je Image
identisch und die Liste kommt generiert aus dem Skript — stellvertretend
wurde `api` als größtes eigenes Image kopiert.)
## Abweichungen
Alle kopierten Digests stimmen mit den Pins bzw. dem Quell-Digest
überein. Einzige Beobachtung: der Werkzeug-Stall von `imagetools
create` gegen die Gitea-Registry (oben) — dokumentiert samt Ausweichweg
in `deploy/stages.md` §5b.
## Pflege
Bei jedem Digest-Update (`deploy/stages.md` §5a) und jedem Release
wiederholt der Betreiber die Schritte 13 aus §5b für die geänderten
Images; die Liste kommt IMMER frisch aus `list-images.sh`.