feat: package_golden_image.sh - Golden Image aus einer echten Referenz-VM ziehen

Ersetzt debootstrap als Hauptweg (siehe ADR-0024-Nachtrag): laeuft direkt
auf einer fertig installierten Referenz-VM (Proxmox), bereinigt
maschinen-/betriebsspezifische Spuren (Testkonto, SSH-Autorisierung,
Root-Passwort, machine-id, SSH-Hostkeys, NetworkManager-Profile,
Caches/Logs) und packt den Dateibaum im selben tar/zstd-Format, das
image_deploy_extract_image() (Phase 1) bereits erwartet.

build_golden_image.sh (debootstrap) bleibt als dokumentierter Fallback
erhalten.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Thomas Stallinger 2026-08-31 09:31:03 +02:00
parent 72d7a4b27d
commit cb182a058f

79
scripts/package_golden_image.sh Executable file
View File

@ -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."