From ce5bbc2e69a6c8468926d382d4b34618e3a63507 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Sat, 22 Aug 2026 19:27:34 +0200 Subject: [PATCH] Add unattended host recovery safeguards --- README.md | 1 + config/install.env.example | 5 ++ docs/REMOTE_SITE_CHECKLIST.md | 64 ++++++++++++++++++++++++++ install.sh | 36 ++++++++++++++- platform/host/90-mike-ai-watchdog.conf | 4 ++ platform/host/mike-ai-wol | 3 ++ 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 docs/REMOTE_SITE_CHECKLIST.md create mode 100644 platform/host/90-mike-ai-watchdog.conf create mode 100644 platform/host/mike-ai-wol diff --git a/README.md b/README.md index bc3c049..e01d6df 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Option „Bewegung reduzieren“ erhalten automatisch eine unbewegte Variante. - [Zielarchitektur und Sicherheitsgrenzen](docs/ARCHITECTURE.md) - [Installation und Abnahme](docs/INSTALLATION.md) - [WireGuard-Heimseite](docs/WIREGUARD_HOME_PEER.md) +- [Checkliste für den unbeaufsichtigten Standort](docs/REMOTE_SITE_CHECKLIST.md) - [Betrieb und Profilwechsel](docs/OPERATIONS.md) - [Sicherheitsmodell](docs/SECURITY.md) - [Disaster Recovery](docs/DISASTER_RECOVERY.md) diff --git a/config/install.env.example b/config/install.env.example index 4e00f4f..d61740a 100644 --- a/config/install.env.example +++ b/config/install.env.example @@ -18,6 +18,11 @@ SECONDARY_GPU_DEVICES=1 IMAGE_GPU_DEVICES=0 FLUX_MODEL_DIR=/data/models/FLUX.2-klein-4B +# Headless remote recovery. The ASUS UEFI settings documented in +# docs/REMOTE_SITE_CHECKLIST.md are additionally required. +ENABLE_HARDWARE_WATCHDOG=true +WAKE_ON_LAN_INTERFACE=enp7s0 + # WireGuard client. The home peer must route 10.77.0.2/32 back to this host. WIREGUARD_ENABLE=true WG_INTERFACE=wg0 diff --git a/docs/REMOTE_SITE_CHECKLIST.md b/docs/REMOTE_SITE_CHECKLIST.md new file mode 100644 index 0000000..8df8b91 --- /dev/null +++ b/docs/REMOTE_SITE_CHECKLIST.md @@ -0,0 +1,64 @@ +# Checkliste für einen unbeaufsichtigten Standort + +Athena wird ohne lokales KVM betrieben. Vor dem Transport müssen Betriebssystem, +UEFI und Heimtunnel gemeinsam geprüft werden. Keine einzelne Maßnahme ersetzt die +anderen. + +## UEFI des ASUS PRIME B550-PLUS + +Im UEFI mit `F7` in den Advanced Mode wechseln und unter +`Advanced > APM Configuration` setzen: + +- `Restore AC Power Loss`: **Power On** +- `Power On By PCI-E`: **Enabled** +- `ErP Ready`: **Disabled** (sonst kann Wake-on-LAN abgeschaltet werden) + +Empfohlen ist zusätzlich ein kontrollierbarer Zwischenstecker. Nach einem +erzwungenen Aus- und Wiedereinschalten der Netzspannung startet Athena durch +`Restore AC Power Loss = Power On` selbständig. Der Zwischenstecker darf nicht +für normale Neustarts verwendet werden. + +## Debian + +Der Installer aktiviert standardmäßig den vorhandenen SP5100-Hardware-Watchdog +mit 60 Sekunden und konfiguriert Wake-on-LAN für das in +`WAKE_ON_LAN_INTERFACE` genannte Interface. SSH und Docker müssen aktiviert sein. + +Vor dem Transport prüfen: + +```bash +systemctl is-enabled ssh docker wg-quick@wg0 +systemctl is-active ssh docker wg-quick@wg0 +ethtool enp7s0 | grep Wake-on +systemctl show -p RuntimeWatchdogUSec +wg show +``` + +Erwartet werden `enabled`, `active`, `Wake-on: g`, ein Watchdog-Wert von einer +Minute sowie ein aktueller WireGuard-Handshake. + +## Netzwerk und VPN + +- Der physische Anschluss bezieht seine Adresse per DHCP; im Standortnetz muss + dafür eine Freigabe bzw. Registrierung existieren. +- Der WireGuard-Tunnel muss **vor dem Transport** erfolgreich aufgebaut und von + zuhause erreichbar getestet sein. +- Für WireGuard braucht Athena keine eingehende Portfreigabe am Standort: Der + Host baut den Tunnel mit `PersistentKeepalive = 25` nach Hause auf. +- Wake-on-LAN funktioniert über Stadtgrenzen nur, wenn ein Gerät im Standortnetz + das Magic Packet senden darf. Der robuste Notweg ist deshalb der steuerbare + Zwischenstecker plus `Restore AC Power Loss = Power On`. +- SSH über das Standortnetz erst dann einschränken, wenn der VPN-Notweg nach einem + echten Neustart nachweislich funktioniert. + +## Pflichtproben vor Abfahrt + +1. Normaler Neustart: VPN, SSH, Docker, Open WebUI und Medium-Profil kommen zurück. +2. Rechner sauber herunterfahren und per Wake-on-LAN einschalten. +3. Netzspannung bei laufendem Rechner trennen, 30 Sekunden warten, wieder + einschalten: Athena bootet automatisch vollständig hoch. +4. WireGuard aus- und wieder einschalten und Fail-closed-Routing prüfen. +5. Von zuhause aus ausschließlich über die spätere VPN-Adresse zugreifen. + +Ohne erfolgreich getesteten WireGuard-Tunnel und die UEFI-Stromoptionen gilt der +Host nicht als bereit für einen unbeaufsichtigten Standort. diff --git a/install.sh b/install.sh index 109891a..e99396f 100755 --- a/install.sh +++ b/install.sh @@ -64,7 +64,40 @@ install_base_packages() { apt-get update DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ca-certificates curl git gnupg jq openssl wireguard-tools iptables \ - iproute2 pciutils rsync unattended-upgrades + iproute2 pciutils rsync unattended-upgrades ethtool +} + +setup_remote_recovery() { + log "Remote-Recovery (Hardware-Watchdog und Wake-on-LAN) konfigurieren" + + if [[ ${ENABLE_HARDWARE_WATCHDOG:-true} == true ]]; then + [[ -e /dev/watchdog0 || -e /dev/watchdog ]] || \ + die "Hardware-Watchdog angefordert, aber kein Watchdog-Gerät vorhanden." + install -d -m 0755 /etc/systemd/system.conf.d + cat >/etc/systemd/system.conf.d/90-mike-ai-watchdog.conf <<'EOF' +[Manager] +# PID 1 feeds the hardware watchdog. If the kernel or userspace freezes long +# enough that it cannot be fed, the firmware resets the machine. +RuntimeWatchdogSec=60s +RebootWatchdogSec=10min +KExecWatchdogSec=10min +EOF + systemctl daemon-reexec + fi + + if [[ -n ${WAKE_ON_LAN_INTERFACE:-} ]]; then + ip link show "$WAKE_ON_LAN_INTERFACE" >/dev/null 2>&1 || \ + die "Wake-on-LAN-Interface existiert nicht: $WAKE_ON_LAN_INTERFACE" + ethtool "$WAKE_ON_LAN_INTERFACE" | grep -q 'Supports Wake-on:.*g' || \ + die "Das Interface unterstützt kein Wake-on-LAN per Magic Packet." + cat >/etc/network/if-up.d/mike-ai-wol <