Add unattended host recovery safeguards

This commit is contained in:
Mikei386 committed 2026-08-22 19:27:34 +02:00
1 parent 2eb99c643c
commit ce5bbc2e69
6 files changed
+112 -1

No files matched your search

+1
View File
@@ -74,6 +74,7 @@ Option „Bewegung reduzieren“ erhalten automatisch eine unbewegte Variante.
- [Zielarchitektur und Sicherheitsgrenzen](docs/ARCHITECTURE.md) - [Zielarchitektur und Sicherheitsgrenzen](docs/ARCHITECTURE.md)
- [Installation und Abnahme](docs/INSTALLATION.md) - [Installation und Abnahme](docs/INSTALLATION.md)
- [WireGuard-Heimseite](docs/WIREGUARD_HOME_PEER.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) - [Betrieb und Profilwechsel](docs/OPERATIONS.md)
- [Sicherheitsmodell](docs/SECURITY.md) - [Sicherheitsmodell](docs/SECURITY.md)
- [Disaster Recovery](docs/DISASTER_RECOVERY.md) - [Disaster Recovery](docs/DISASTER_RECOVERY.md)
+5
View File
@@ -18,6 +18,11 @@ SECONDARY_GPU_DEVICES=1
IMAGE_GPU_DEVICES=0 IMAGE_GPU_DEVICES=0
FLUX_MODEL_DIR=/data/models/FLUX.2-klein-4B 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 client. The home peer must route 10.77.0.2/32 back to this host.
WIREGUARD_ENABLE=true WIREGUARD_ENABLE=true
WG_INTERFACE=wg0 WG_INTERFACE=wg0
+64
View File
@@ -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.
+35 -1
View File
@@ -64,7 +64,40 @@ install_base_packages() {
apt-get update apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates curl git gnupg jq openssl wireguard-tools iptables \ 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 <<EOF
#!/bin/sh
[ "\${IFACE:-}" = "$WAKE_ON_LAN_INTERFACE" ] || exit 0
/usr/sbin/ethtool -s "$WAKE_ON_LAN_INTERFACE" wol g
EOF
chmod 0755 /etc/network/if-up.d/mike-ai-wol
ethtool -s "$WAKE_ON_LAN_INTERFACE" wol g
fi
} }
install_docker() { install_docker() {
@@ -393,6 +426,7 @@ PY
hostnamectl set-hostname "$AI_HOSTNAME" hostnamectl set-hostname "$AI_HOSTNAME"
install_base_packages install_base_packages
setup_remote_recovery
install_docker install_docker
install_nvidia install_nvidia
setup_wireguard setup_wireguard
+4
View File
@@ -0,0 +1,4 @@
[Manager]
RuntimeWatchdogSec=60s
RebootWatchdogSec=10min
KExecWatchdogSec=10min
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
[ "${IFACE:-}" = "enp7s0" ] || exit 0
/usr/sbin/ethtool -s enp7s0 wol g