Zum Inhalt

Host neu aufbauen

Ungeprüft

Diese Anleitung ist noch nicht durchgespielt worden; Befehle, Bezeichnungen und erwartete Ausgaben können abweichen. Was noch zu prüfen ist, steht in todo/doku.md.

Nur, wenn der Host nicht mehr zu retten ist

Ein Neuaufbau ersetzt den Host vollständig; die Apps sind dabei Stunden nicht erreichbar, und was seit dem letzten Backup geändert wurde, ist verloren. Sprich ihn vorher in Signal ab.

Ziel

Ein Host, dessen VM verloren oder kaputt ist, läuft wieder mit allen Apps und den Daten aus dem letzten Backup.

Voraussetzungen

Gesichert werden nur die Apps auf werner. Auf containerhost gibt es kein Backup; dort kommen nach dem Neuaufbau nur die Container zurück, nicht ihre Daten (siehe containerhost).

Schritte

Die Reihenfolge ist fest, weil jeder Schritt auf den vorigen aufbaut:

  1. Backup-Stand prüfen: Danach richtet sich, was zurückkommt.
  2. Alte VM abschalten: damit nicht zwei Hosts unter demselben Namen laufen.
  3. VM, Grundeinrichtung und WireGuard: syslet braucht ein laufendes Betriebssystem mit Podman (Statische Konfiguration), und ohne Tunnel erreicht werner den rest-server nicht (Netzwerk).
  4. SOPS-Schlüssel: Der neue Host hat einen neuen SSH-Schlüssel und kann die Secrets sonst nicht entschlüsseln (Secrets im Repo).
  5. Ausrollen: legt Container und leere Volumes an (Infrastructure as Code).
  6. Interne Netzwerke in firewalld: sonst erreichen die Container einander nicht (Netzwerk).
  7. Restore je App: Das Repo enthält keine Daten (Was Infrastructure as Code nicht leistet).
  8. Backup wieder einschalten: erst jetzt, damit kein Snapshot mit leeren Apps entsteht (Backup).
  9. Was von Hand verwaltet wird: steht nicht im Repo und fällt keinem plan auf (Was wird wo verwaltet).
  10. Committen und pushen (Git-Workflow).

1. Backup-Stand prüfen

Nur für werner. Liste die Snapshots von containerhost aus auf, wie in Alte Snapshots von Hand aufräumen, Schritt 2 und 3:

Bash
restic snapshots --host werner.garage-lab.de --compact --latest 3

Erwartet: die letzten Snapshots, der jüngste aus der vergangenen Nacht. Notiere seine ID; aus ihm holst du in Schritt 7 die Daten zurück.

2. Alte VM abschalten

Schalte die alte VM in der Web-Oberfläche der Plattform aus, falls sie noch läuft, aber lösch sie noch nicht. Solange sie da ist, kommst du notfalls über die Konsole der Plattform noch an Dateien heran.

3. VM neu aufsetzen

Führe Neuen Host aufsetzen aus, Schritte 1 bis 8, mit dem bisherigen Namen des Hosts. Dabei weicht ab:

  • Schritt 2: Hat die VM neue IP-Adressen, ändere nur die Adressen unter ipam: in der Zonendatei; alle Einträge, die darauf zeigen, ziehen mit. Für containerhost bitte in Signal darum, die Adresse auf dem Gateway zu ändern.
  • Schritt 3: Lösch vorher den alten Schlüssel des Hosts aus deiner known_hosts, sonst verweigert SSH die Verbindung:

    Bash
    ssh-keygen -R <fqdn>
    

    Die Schlüssel der Admins kopierst du beim Neuaufbau von werner aus containerhost (vm-containerhost.garage-lab.net) und umgekehrt. - Schritt 6: Auf werner schaltest du system-backup.timer noch nicht ein, sondern erst in Schritt 8 dieser Anleitung, wenn die Daten zurück sind. Auf containerhost muss das NAS die Freigabe für die neue VM erlauben, bevor du mnt-backup.mount einschaltest; frag in Signal nach, falls sich die Adresse geändert hat (siehe NAS). - Schritt 8: Die Tunnel-Adresse bleibt dieselbe; das Gateway braucht nur den neuen öffentlichen Schlüssel.

4. Neuen Schlüssel des Hosts für SOPS eintragen

Bash
ssh <fqdn> cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age

Ersetze in syslet/.sops.yaml den Wert hinter &server_<host> durch diese Zeile und verschlüssele die Secrets des Hosts neu:

Bash
1
2
3
cd syslet
sops updatekeys -y <host>/creds-*.enc.yaml
git status --short

Erwartet: git status zeigt syslet/.sops.yaml und alle creds-*.enc.yaml des Hosts als geändert.

5. Container ausrollen

Bash
cd <host>
cue cmd plan

Erwartet: alle Container, Volumes, Netzwerke und Secrets des Hosts als neu, keine Meldung decryption failed.

Bash
cue cmd apply

Erwartet: dieselbe Ausgabe und die Frage Continue? (yes/no); tippe yes. Das erste apply lädt alle Images herunter und kann lange dauern.

Die Apps laufen danach, aber mit leeren Daten. Lass sie nicht benutzen, bis Schritt 7 durch ist.

6. Interne Netzwerke in firewalld eintragen

Nur für werner. Führe Interne Podman-Netzwerke reparieren aus, damit die Container untereinander sprechen dürfen. Trag außerdem die Subnetze des Netzwerks caddy ein, wie in WireGuard-Tunnel einrichten, Schritt 4.

7. Daten jeder App zurückholen

Nur für werner. Führe für jede App mit backup:-Block App aus dem Backup wiederherstellen aus, mit dem Snapshot aus Schritt 1. Welche Apps das sind, zeigt:

Bash
grep -l "^\s*backup:" syslet/werner/stack-*.cue

Erwartet: die Stack-Dateien der Apps mit Backup, eine je Zeile.

8. Backup wieder einschalten

Nur für werner.

Bash
ssh werner.garage-lab.de systemctl enable --now system-backup.timer
ssh werner.garage-lab.de systemctl start system-backup.service

Erwartet: Der zweite Befehl kehrt nach einigen Minuten ohne Ausgabe zurück, und healthchecks.io meldet den Check als up.

9. Was von Hand verwaltet wird, prüfen

Geh durch Was wird wo verwaltet und prüf alles, was zum Host gehört und nicht aus dem Repo kommt, vor allem:

  • die Firewall bei Netcup (für werner)
  • den Peer auf dem Gateway (Schritt 3)
  • den DNS-Eintrag (Schritt 3)
  • auf containerhost die Einstellungen von Backrest, die nicht im Repo stehen und nicht gesichert sind (siehe Backup)

10. Committen und pushen

Bash
1
2
3
4
cd ../..
git add desec syslet/.sops.yaml syslet/<host>
git commit -m "rebuild host <host>"
git push

Erwartet: am Ende von git push eine Zeile main -> main. Erst jetzt löschst du die alte VM in der Web-Oberfläche der Plattform.

Prüfen

  • cue cmd plan in syslet/<host> zeigt No changes detected. All units are up to date.
  • Jede App ist unter ihrem Namen erreichbar, und die Anmeldung über Authentik klappt.
  • Im Monitoring tauchen der Host und seine Container wieder auf.

Wenn etwas schiefgeht