Releasepakete und Herkunftsnachweis¶
Gilt ab OPS-01.2. Produktionssysteme beziehen ausschließlich veröffentlichte Releases; es gibt kein git pull und keinen Build beliebiger Branches auf dem Server.
Bestandteile eines Releases¶
| Datei | Inhalt |
|---|---|
jf-manager-<version>.tar.gz |
ops/ (jfctl, Compose-Datei, systemd-Units), backend/ (nur committete Dateien, zusätzlich requirements.lock.txt), frontend/dist/ (gebaute Oberfläche) und die Nginx-Konfiguration, MANIFEST.json |
release-manifest.json |
Version, Commit, Erstellzeit, Python-Version, PostgreSQL-Hauptversion, Image-Referenzen mit Digest und SHA-256 des Pakets |
SHA256SUMS |
Prüfsummen von Paket und Manifest |
Docker-Installationen verwenden aus dem Paket nur ops/; Images werden über die im Manifest festgehaltenen Digests geladen und lokal mit der Version markiert. Native Installationen bauen aus dem Paket die Python-Umgebung.
Prüfung durch jfctl¶
SHA256SUMS, Manifest und Paket über HTTPS laden; Prüfsummen müssen stimmen, Manifest-Version und Paket-Hash zusammenpassen.- Herkunftsnachweis: Ist die
gh-CLI vorhanden, prüftjfctldie GitHub-Attestierung des Pakets (gh attestation verify).JF_VERIFY_ATTESTATION=requirederzwingt diese Prüfung,offschaltet sie ab (z. B. Offline-Installation aus einem lokalen Verzeichnis). Ohne Attestierung schützen Prüfsummen nur vor Übertragungsfehlern, nicht vor einem manipulierten Release. - Paketpfade werden vor dem Entpacken geprüft (keine absoluten Pfade, kein
..). - Erst nach erfolgreicher Prüfung wird das Release unter
/opt/jf-manager/releases/<version>abgelegt; der Wechsel von/opt/jf-manager/currenterfolgt atomar.
Lokal bauen¶
ops/release/build-release.sh --version 1.4.0 --out dist/release \
--backend-image ghcr.io/jugendfeuerwehr-manager/jf-manager/backend@sha256:… \
--frontend-image ghcr.io/jugendfeuerwehr-manager/jf-manager/frontend@sha256:…
--ref WORKTREE packt den Arbeitsstand für lokale Tests und ist für Veröffentlichungen nicht zulässig. Das Paket ist reproduzierbar (sortierte Einträge, feste Zeitstempel aus dem Commit, keine Benutzerkennungen).
Gepinnte Server¶
backend/requirements-server.txt enthält uWSGI und den optionalen MySQL-Treiber mit Prüfsumme. Beim Aktualisieren Version und Hash von PyPI übernehmen (https://pypi.org/pypi/<paket>/<version>/json) und Image sowie nativen Weg erneut prüfen.