diff --git a/scripts/package_golden_image.sh b/scripts/package_golden_image.sh new file mode 100755 index 0000000..07e5a50 --- /dev/null +++ b/scripts/package_golden_image.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# Baut das Golden Image aus einer bereits fertig installierten +# Referenz-VM (siehe ADR-0024-Nachtrag "Referenz-VM statt debootstrap") - +# laeuft DIREKT AUF der Referenz-VM (als root), anders als +# build_golden_image.sh, das auf einem separaten Build-Host ein +# Basissystem von Grund auf neu baut. Bereinigt zuerst alle maschinen-/ +# betriebsspezifischen Spuren, packt danach den verbleibenden Dateibaum +# in genau dem Format, das image_deploy_extract_image() +# (scripts/lib/image_deploy.sh, Phase 1) erwartet - tar/zstd, keine +# Blockgeraete-Kopie. +# +# WICHTIG: entfernt als Teil der Bereinigung auch den bisherigen +# Betriebs-/Testzugang zu dieser Maschine (Testkonto, SSH-Autorisierung, +# Root-Passwort) - das ist beabsichtigt (jede damit ausgerollte +# Kundeninstallation wuerde sonst dieselben, bekannten Zugangsdaten +# tragen), nicht versehentlich. Das Ergebnis-Archiv muss ueber dieselbe, +# bereits authentifizierte Verbindung abgeholt werden, mit der dieses +# Skript gestartet wurde (z.B. per SSH-ControlMaster) - eine NEUE +# Verbindung nach dem Lauf funktioniert nicht mehr. Ein Proxmox-Snapshot +# von VOR diesem Lauf ist die vorgesehene Rueckfallebene fuer kuenftige +# Wartung/Versions-Upgrades der Referenz-VM (siehe Plan). + +OUTPUT_FILE="${1:-/root/golden-image.tar.zst}" + +if [[ "${EUID}" -ne 0 ]]; then + echo "Fehler: muss als root laufen." >&2 + exit 1 +fi + +echo "==> Entferne Betriebs-/Testzugang (nicht Teil des Kundenimages)" +if id tuxflotte >/dev/null 2>&1; then + userdel -r tuxflotte 2>/dev/null || userdel tuxflotte 2>/dev/null || true +fi +mkdir -p /root/.ssh +: > /root/.ssh/authorized_keys +passwd -l root >/dev/null + +echo "==> Entferne maschinenspezifische Identität" +rm -f /etc/ssh/ssh_host_* +: > /etc/machine-id +# Manche Distributionen legen /var/lib/dbus/machine-id als echte Kopie an +# statt als Symlink auf /etc/machine-id (siehe ADR-0024-Fund, 29.08.2026) - +# beide Fälle abdecken, ein Symlink zeigt ohnehin automatisch auf die +# gerade geleerte Datei. +if [[ -e /var/lib/dbus/machine-id && ! -L /var/lib/dbus/machine-id ]]; then + : > /var/lib/dbus/machine-id +fi + +echo "==> Entferne Netzwerk-Zugangsdaten der Referenz-VM" +rm -f /etc/NetworkManager/system-connections/* + +echo "==> Bereinige Caches/Logs/temporäre Dateien" +apt-get clean +rm -rf /var/lib/apt/lists/* +find /var/log -type f -exec truncate -s0 {} \; +rm -rf /tmp/* /var/tmp/* +rm -f /root/.bash_history +rm -f /home/*/.bash_history 2>/dev/null || true + +# Paketauswahl eindampfen (Browser, Office-Pakete o.Ä.) bewusst NICHT im +# ersten Lauf - siehe Plan ("erster Durchlauf zeigt, wie groß das Archiv +# real wird, dann gezielt nachschärfen"). Blindes Purgen ohne die +# tatsächliche Paketliste gesehen zu haben, riskiert eher kaputte +# Abhängigkeiten als sinnvolle Einsparung. Nach diesem Lauf: +# `dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head -30` +# auf der Referenz-VM zeigt die groessten Kandidaten fuer einen gezielten +# zweiten Durchlauf. + +echo "==> Packe nach ${OUTPUT_FILE}" +tar --numeric-owner --xattrs \ + --exclude=/proc --exclude=/sys --exclude=/dev \ + --exclude=/run --exclude=/tmp --exclude=/var/tmp \ + --exclude="${OUTPUT_FILE}" \ + -C / -cf - . | zstd -f -T0 -19 -o "${OUTPUT_FILE}" + +echo "==> Fertig: ${OUTPUT_FILE} ($(du -h "${OUTPUT_FILE}" | cut -f1))" +echo "==> Root-Zugang zu dieser Maschine ist jetzt gesperrt (Testkonto entfernt, SSH-Autorisierung geleert, Root-Passwort gesperrt) - Proxmox-Snapshot ist die Rueckfallebene fuer kuenftige Laeufe."