Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0fed6a6a0b |
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
nextcloud:
|
||||
image: nextcloud:33.0.5-apache@sha256:162b8b49def7f50d8862bf55677f86cf5649ccf7b7dfad8e244160b65ed6101a
|
||||
image: nextcloud:33.0.4-apache@sha256:caa40b8beaf0057ac213d8dfc515c36ce64f7a8f0825b6a287e6f7cf2f4a095d
|
||||
container_name: nextcloud
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
|
||||
@@ -7,7 +7,8 @@ Audit-Snapshots wurden aus der Arbeitskopie entfernt; Detailhistorie liegt in Gi
|
||||
|
||||
| Prioritaet | Punkt | Naechster Schritt |
|
||||
|---|---|---|
|
||||
| P1 | DR-Workstation Bare-Metal-Kit: WSL2 + Borg-Client installieren | Hetzner-DR-SSH-Key ist 2026-06-03 erledigt und offline gesichert. Verbleibend: WSL2 auf dem Gaming-PC einrichten (`wsl --install -d Ubuntu`), `sudo apt install borgbackup` und ein erster Smoke `borg list ssh://u565255@u565255.your-storagebox.de/./hetzner_borg_appdata_critical` mit dem offline gesicherten Key + Passphrase. Bestandteile dokumentiert in `docs/EXTERNAL_DEPENDENCIES.md` Abschnitt "DR-Workstation Bare-Metal-Kit" |
|
||||
| P1 | DR-Workstation Bare-Metal-Kit auf Gaming-PC einrichten | WSL2 installieren, `borgbackup` apt-installieren, SSH-Key fuer Hetzner Storage Box generieren und auf der Box autorisieren, `borg list <hetzner-repo>` als Test laufen lassen. Bestandteile dokumentiert in `docs/EXTERNAL_DEPENDENCIES.md` Abschnitt "DR-Workstation Bare-Metal-Kit" |
|
||||
| P1 | Nextcloud-Restore-Test scharf laufen lassen | Skript `ops/restore-tests/nextcloud-restore-test.sh` existiert bereits. Einmal ausfuehren, Report unter `/mnt/user/backups/restore-reports/nextcloud-...md` ablegen. Schliesst die letzte Tier-2-Restore-Luecke |
|
||||
| P2 | Family-Onboarding praktisch starten | Fokus: Vaultwarden als Passwortbasis, Immich-Mobile-Backup auf jedem Handy, Mealie mit erstem Rezept/Einkaufsliste; Ablauf steht in `docs/FAMILY_ONBOARDING.md` |
|
||||
|
||||
## Restore-Audit Backlog (Stand 2026-06-03)
|
||||
@@ -16,7 +17,7 @@ Ergebnis des Restore-Skills-Audits (Session 2026-06-02/03). Die kritischen Bugfi
|
||||
|
||||
| Prioritaet | Punkt | Status | Naechster Schritt |
|
||||
|---|---|---|---|
|
||||
| P1 | Nextcloud-Restore-Test | **erledigt 2026-06-03** | Borg-Extract + pg_restore (126 Tabellen) + HTTP 200 + `occ status maintenance:false`. Quelle: `hetzner_borg_appdata_critical`, Archiv `Taegliche-Sicherung-2026-06-03T04:30:41.432`. Zwei Skript-Bugs im Zuge des Laufs gefixt (`check_data_directory_permissions: false` patchen, `.ncdata`-Marker anlegen). Report `/mnt/user/backups/restore-reports/nextcloud-2026-06-03.md`. |
|
||||
| P1 | Nextcloud-Restore-Test | offen | Test nach Paperless-Muster, zusaetzlich `occ maintenance:mode`-Choreographie und `oc_admin`-Rolle. Hoechster Lerngewinn unter den fehlenden Tier-2-Tests |
|
||||
| P1 | Shared PostgreSQL 18 Cluster Restore Drill | **erledigt 2026-06-03** | Globals + 5 DBs (paperless 72t, mailarchiver 1t, authelia 25t, nextcloud 126t, mealie 66t), `data_checksums=on`, Report `/mnt/user/backups/restore-reports/shared-pg-cluster-2026-06-03.md` |
|
||||
| P1 | Komodo-Mongo-Daten-Restore | **erledigt 2026-06-03** | 86904 Dokumente erfolgreich restored, Report `/mnt/user/backups/restore-reports/komodo-mongo-restore-2026-06-03.md`. Nebenbefund: Dump von Mongo 8.0.23, Test auf 7.0.32 — Cross-Version-Warning, fuer Lesetest harmlos |
|
||||
| P2 | Mailarchiver-Restore-Test | **erledigt 2026-06-03** | Data-Protection-Keys + 645M pg_restore + HTTP 200. Report `/mnt/user/backups/restore-reports/mailarchiver-2026-06-03.md` |
|
||||
@@ -40,8 +41,6 @@ Ergebnis des Restore-Skills-Audits (Session 2026-06-02/03). Die kritischen Bugfi
|
||||
|
||||
## Zuletzt geschlossen
|
||||
|
||||
- Nextcloud-Restore-Test 2026-06-03 erfolgreich (Tier-2 damit komplett belegt). Drei Laeufe noetig: Lauf 1 schlug an `chmod()` der data-Dir auf shfs fehl (`OC_Util.php:486`), Lauf 2 an fehlender `.ncdata`-Marker-Datei, Lauf 3 sauber durch. Beide Bug-Fixes ins Skript `ops/restore-tests/nextcloud-restore-test.sh` integriert. Endresultat: HTTP 200 auf `/status.php`, `occ status` ok, 126 Tabellen in der DB. Source: `hetzner_borg_appdata_critical`, Archiv `Taegliche-Sicherung-2026-06-03T04:30:41.432`. Report unter `/mnt/user/backups/restore-reports/nextcloud-2026-06-03.md`.
|
||||
- Hetzner Storage Box DR-SSH-Key `dr-hetzner-2026-06-03` (ed25519, Passphrase-frei) angelegt: Pubkey via `install-ssh-key` auf der Storage Box autorisiert, passwortloser Login erfolgreich (Borg-Repos `backup`, `backup2`, `hetzner_borg_appdata`, `hetzner_borg_appdata_critical` sichtbar), Private-Key offline neben KOMODO_*-Notiz und GitHub-Deploy-Key abgelegt, Arbeitsplatz-Kopie geloescht. Damit ist Bare-Metal-Borg-Zugang von der DR-Workstation moeglich, sobald WSL2+Borg installiert sind.
|
||||
- Fix Common Problems Plugin (FCP) 2026-06-03 deinstalliert. Befund: drei `grep -R ... /usr/local/emhttp`-Prozesse aus einem FCP-Daily-Scan hingen seit ~7 Tagen in einem Symlink-Loop (`/usr/local/emhttp/mnt -> /mnt`, gesamte Array). 3 Cores dauerhaft 100 %, IOWAIT bis 55 %, USB-Flash unter Dauer-IO. Plugin via `plugin remove` entfernt, Cron + /tmp-Reste sauber, Load von 14.6 auf 1.08 gefallen. FCP wird bewusst nicht wieder installiert (Begruendung siehe `HOMELAB_ARCHITECTURE_MASTER_V2.md` Sektion 13). Bekannte Risiken decken Scrutiny, Monitoring, Posture-Check und Critical-Events-Watcher bereits ab.
|
||||
- GitHub-Mirror Read-Only Deploy-Key `DR Read-Only 2026-06-03` (ed25519, Passphrase-frei) angelegt: GitHub Repo Settings -> Deploy Keys ohne Write-Access, Smoke `git ls-remote` erfolgreich (HEAD `d947c7f` = master), Private-Key offline neben der KOMODO_*-Notiz abgelegt, Arbeitsplatz-Kopie nach USB-Transfer geloescht. Damit ist der DR-Read-Pfad zum privaten Mirror ohne Operator-Browser-Login moeglich.
|
||||
- KOMODO_*-Notiz offline gesichert (Operator-Bestaetigung 2026-06-03). Quelle bleibt host-seitige `.env` unter `/mnt/user/services/stacks/komodo/.env` bzw. die Drift-Recovery-Kopie unter `/mnt/user/appdata/secrets/_komodo_stack_env_recovery_2026-05-04.env`. Damit ist der Bare-Metal-Komodo-Bootstrap ohne Vaultwarden moeglich. Eintrag in `docs/EXTERNAL_DEPENDENCIES.md` Reviews und Pflichtbestandteil im DR-Workstation-Kit nachgezogen.
|
||||
|
||||
@@ -481,7 +481,7 @@ Direkt nach dem Drill und nach Operator-Antworten auf vier offene Fragen wurden
|
||||
| P4-8 | DR.md Phase 4 Stufe 3 "Wichtige Stolperfallen": Stack-ENV-Wiederherstellung per `mongorestore` oder manuell |
|
||||
| P5-1 | LOW, nicht angepasst |
|
||||
| P5-2 | DR.md Phase 5.3 um `docker logs`-Verifikation der App-zu-DB-Verbindung erweitert |
|
||||
| X-1 | **erledigt 2026-06-03**: Nextcloud-Restore-Test scharf gelaufen, drei Iterationen (zwei Skript-Bugs gefixt), Endresultat SUCCESS mit HTTP 200, occ status ok, 126 DB-Tabellen. Damit ist Tier-2 vollstaendig belegt. |
|
||||
| X-1 | Nextcloud-Restore-Test als P1 in Audit-Restliste |
|
||||
|
||||
Nicht angefasst: P1-2 (kein Doku-Fix moeglich), P4-4 (im echten Restore-Pfad ohnehin abgedeckt), P4-5 und P5-1 (LOW). Die offenen Operator-Aufgaben (KOMODO_*-Notiz, Read-PAT, DR-Workstation, Nextcloud-Restore) stehen jetzt in `docs/AUDIT_2026-05-25_TODO.md` als P1.
|
||||
|
||||
|
||||
@@ -1,218 +0,0 @@
|
||||
# DR-Workstation Setup-Runbook
|
||||
|
||||
Stand: 2026-06-03
|
||||
|
||||
Konkrete Schritte, um den Operator-Gaming-PC als DR-Workstation einzurichten. Der Endzustand ist in `docs/EXTERNAL_DEPENDENCIES.md` Abschnitt "DR-Workstation Bare-Metal-Kit" beschrieben; dieses Dokument ist der Weg dahin.
|
||||
|
||||
Vorbedingung: Repo-Clone unter `G:\Gitea_Clone\homelab-infra`, Hetzner-DR-SSH-Key und GitHub-Deploy-Key liegen offline auf USB.
|
||||
|
||||
Aufwand: einmalig ~30-60 Min interaktiv.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 1 - WSL2 + Ubuntu installieren (~15 Min)
|
||||
|
||||
PowerShell als **Administrator** oeffnen:
|
||||
|
||||
```powershell
|
||||
wsl --install -d Ubuntu
|
||||
```
|
||||
|
||||
- Bei "Virtualization nicht aktiviert"-Fehler: BIOS rein, Intel VT-x / AMD-V einschalten, neu starten, Befehl wiederholen.
|
||||
- Nach Install: Ubuntu startet automatisch und fragt nach Username + Passwort. Username egal (z. B. `dr`), Passwort merken (wird fuer `sudo` gebraucht).
|
||||
- Reboot kann noetig sein - PowerShell sagt es.
|
||||
|
||||
Verifikation in Ubuntu (oeffnet sich automatisch):
|
||||
|
||||
```bash
|
||||
lsb_release -a
|
||||
uname -r
|
||||
```
|
||||
|
||||
Erwartet: `Ubuntu 24.04 LTS`, Kernel beginnt mit `5.x` oder `6.x` und enthaelt `microsoft-standard-WSL2`.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 2 - Borg-Client installieren (~3 Min)
|
||||
|
||||
In der Ubuntu-Shell:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y borgbackup openssh-client
|
||||
borg --version
|
||||
```
|
||||
|
||||
Erwartet: `borg 1.2.x` oder `1.4.x`. Beides reicht fuer das produktive Borg-Repo auf Hetzner.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 3 - Hetzner-DR-SSH-Key in WSL ablegen (~5 Min)
|
||||
|
||||
Wichtig: der Private-Key liegt offline auf USB. Fuer die Workstation-Routine wird er auf das WSL-Filesystem kopiert - **das ist die Arbeitskopie**, nicht die Offline-Sicherung. Wenn die WSL kaputtgeht, kommt der Key zurueck vom USB; das Offline-Original bleibt unangetastet.
|
||||
|
||||
USB einstecken. In WSL kopieren (Pfad anpassen je nach Laufwerksbuchstabe):
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.ssh
|
||||
cp /mnt/<USB-Buchstabe>/dr-hetzner-2026-06-03/dr-hetzner ~/.ssh/dr-hetzner
|
||||
chmod 600 ~/.ssh/dr-hetzner
|
||||
```
|
||||
|
||||
`<USB-Buchstabe>` ist meistens `e`, `f` oder `g` - Windows-Laufwerke werden in WSL unter `/mnt/<buchstabe>` gemountet.
|
||||
|
||||
Smoke-Test:
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/dr-hetzner -o IdentitiesOnly=yes -p 23 \
|
||||
u565255@u565255.your-storagebox.de "ls"
|
||||
```
|
||||
|
||||
Erwartet: vier Verzeichnisse (`backup`, `backup2`, `hetzner_borg_appdata`, `hetzner_borg_appdata_critical`), exit 0, kein Passwort-Prompt.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 4 - Borg-Passphrase eingeben und `borg list` testen (~5 Min)
|
||||
|
||||
Borg verlangt die Passphrase beim ersten Repo-Zugriff. Die liegt offline gesichert (Operator-Bestaetigung 2026-05-26).
|
||||
|
||||
Einmaliger Smoke gegen das wichtige Repo:
|
||||
|
||||
```bash
|
||||
export BORG_RSH="ssh -i ~/.ssh/dr-hetzner -o IdentitiesOnly=yes -p 23"
|
||||
borg list ssh://u565255@u565255.your-storagebox.de/./hetzner_borg_appdata_critical
|
||||
```
|
||||
|
||||
Borg fragt nach der Passphrase. Eingeben (sie wird nicht angezeigt, das ist normal).
|
||||
|
||||
Erwartet: Liste mit Archiv-Namen, jeder im Stil `Taegliche-Sicherung-YYYY-MM-DDTHH:MM:SS.xxx`. Wenn ja: Borg-Schicht funktioniert.
|
||||
|
||||
**Wert wird nirgendwo gespeichert.** `BORG_PASSPHRASE`-Env-Variable wird **nicht** dauerhaft gesetzt; Passphrase wird im Notfall immer interaktiv eingegeben.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 5 - GitHub-Deploy-Key in WSL ablegen (~3 Min)
|
||||
|
||||
Gleiches Muster wie Hetzner-Key:
|
||||
|
||||
```bash
|
||||
cp /mnt/<USB-Buchstabe>/dr-readonly-2026-06-03/dr-readonly ~/.ssh/dr-readonly
|
||||
chmod 600 ~/.ssh/dr-readonly
|
||||
```
|
||||
|
||||
Smoke-Test gegen den privaten GitHub-Mirror:
|
||||
|
||||
```bash
|
||||
GIT_SSH_COMMAND="ssh -i ~/.ssh/dr-readonly -o IdentitiesOnly=yes" \
|
||||
git ls-remote git@github.com:michaelkaleschke-spec/homelab-infra.git | head -3
|
||||
```
|
||||
|
||||
Erwartet: HEAD und mindestens ein `refs/heads/master`-Eintrag.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 6 - Quartals-Smoke als Skript ablegen (~5 Min)
|
||||
|
||||
Damit der "ich pruefe das vierteljaehrlich"-Schritt zur Routine wird, ein kleines Skript ins WSL-Home:
|
||||
|
||||
```bash
|
||||
cat > ~/dr-smoke.sh <<'EOF'
|
||||
#!/bin/bash
|
||||
# DR-Workstation Quartals-Smoke
|
||||
# Pruefen: GitHub-Read, Hetzner-SSH, Borg-Repo-Erreichbarkeit
|
||||
# Passphrase wird interaktiv abgefragt - Skript speichert keinen Wert.
|
||||
set -e
|
||||
echo "=== GitHub Deploy-Key ==="
|
||||
GIT_SSH_COMMAND="ssh -i ~/.ssh/dr-readonly -o IdentitiesOnly=yes" \
|
||||
git ls-remote git@github.com:michaelkaleschke-spec/homelab-infra.git \
|
||||
| head -1
|
||||
echo
|
||||
echo "=== Hetzner SSH-Login ==="
|
||||
ssh -i ~/.ssh/dr-hetzner -o IdentitiesOnly=yes -p 23 \
|
||||
u565255@u565255.your-storagebox.de "ls" | head -5
|
||||
echo
|
||||
echo "=== Borg-Repo (Passphrase wird abgefragt) ==="
|
||||
export BORG_RSH="ssh -i ~/.ssh/dr-hetzner -o IdentitiesOnly=yes -p 23"
|
||||
borg info ssh://u565255@u565255.your-storagebox.de/./hetzner_borg_appdata_critical | head -10
|
||||
echo
|
||||
echo "DR-Smoke OK ($(date '+%F %T'))"
|
||||
EOF
|
||||
chmod +x ~/dr-smoke.sh
|
||||
```
|
||||
|
||||
Aufrufen mit:
|
||||
|
||||
```bash
|
||||
bash ~/dr-smoke.sh
|
||||
```
|
||||
|
||||
Termin im Kalender: einmal pro Quartal, ~5 Min Aufwand.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 7 - Eintrag in EXTERNAL_DEPENDENCIES Review nachziehen
|
||||
|
||||
Nach erfolgreicher Einrichtung im Repo dokumentieren. In `docs/EXTERNAL_DEPENDENCIES.md` unter "Review":
|
||||
|
||||
```
|
||||
| 2026-06-XX | DR-Workstation produktiv: WSL2 Ubuntu auf Gaming-PC, borgbackup installiert, Hetzner-DR-Key und GitHub-Deploy-Key in ~/.ssh, Quartals-Smoke-Skript ~/dr-smoke.sh. Bare-Metal-DR-Pillars sind damit alle vier produktionsreif. | Quartalsweise Smoke laufen lassen |
|
||||
```
|
||||
|
||||
Audit-Restliste analog: in `docs/AUDIT_2026-05-25_TODO.md` den P1 "DR-Workstation Bare-Metal-Kit: WSL2 + Borg-Client installieren" auf erledigt setzen und unter "Zuletzt geschlossen" einen Eintrag mit Smoke-Ergebnis machen.
|
||||
|
||||
Wenn ich (Claude) am Tag der Einrichtung mit SSH-Zugang dabei bin, ziehe ich das nach. Sonst per `git add docs/EXTERNAL_DEPENDENCIES.md docs/AUDIT_2026-05-25_TODO.md && git commit && git push`.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### `wsl --install` schlaegt fehl mit "WSL 2 requires an update"
|
||||
|
||||
```powershell
|
||||
wsl --update
|
||||
wsl --shutdown
|
||||
wsl --install -d Ubuntu
|
||||
```
|
||||
|
||||
### Hetzner-SSH fragt nach Passwort statt Key-Login zu akzeptieren
|
||||
|
||||
Permissions des Keys pruefen:
|
||||
|
||||
```bash
|
||||
ls -la ~/.ssh/dr-hetzner
|
||||
```
|
||||
|
||||
Muss `-rw-------` (also `600`) sein. Wenn anders:
|
||||
|
||||
```bash
|
||||
chmod 600 ~/.ssh/dr-hetzner
|
||||
```
|
||||
|
||||
Bei weiterhin Passwort-Prompt: Pubkey-Inhalt gegen das authorized_keys-Format der Storage Box pruefen (sollte `ssh-ed25519 AAAA...` ohne Leerzeilen sein).
|
||||
|
||||
### `borg list` haengt oder schlaegt mit "Connection refused" fehl
|
||||
|
||||
Port 23 explizit pruefen:
|
||||
|
||||
```bash
|
||||
nc -vz u565255.your-storagebox.de 23
|
||||
```
|
||||
|
||||
Wenn das fehlschlaegt: Hetzner-Status-Page pruefen, sonst SSH-Verbindung an sich blockiert (Firewall, ISP).
|
||||
|
||||
### GitHub-Pull fragt nach Username/Passwort
|
||||
|
||||
Stelle sicher dass die URL `git@github.com:...` ist (SSH), nicht `https://github.com/...`. Bei HTTPS wuerde GitHub Username/PAT verlangen, was wir bewusst nicht eingerichtet haben.
|
||||
|
||||
---
|
||||
|
||||
## Was nach diesem Runbook gilt
|
||||
|
||||
Mit allen Schritten erledigt ist der vierte Bare-Metal-DR-Pillar zu (siehe `docs/EXTERNAL_DEPENDENCIES.md`). Der DR-Workstation-Status ist dann:
|
||||
|
||||
- WSL2 Ubuntu installiert
|
||||
- borgbackup einsatzbereit
|
||||
- SSH-Keys (Hetzner, GitHub) in `~/.ssh/`
|
||||
- Quartals-Smoke-Skript laeuft
|
||||
|
||||
Damit ist im Bare-Metal-Fall der Pfad "Unraid tot -> Gaming-PC nimmt die DR-Arbeit auf" tatsaechlich gangbar, nicht nur in Doku theoretisch.
|
||||
@@ -51,7 +51,7 @@ Der Operator-Gaming-PC ist im Bare-Metal-Fall die einzige Stelle, von der aus Re
|
||||
| Repo-Clone `G:\Gitea_Clone\homelab-infra` (master, gefetcht) | Recovery-Anker fuer `ops/komodo/docker-compose.yml`, Restore-Skripte | `git -C G:\Gitea_Clone\homelab-infra log --oneline -1` plausibel aktuell |
|
||||
| Read-Zugang zum privaten GitHub-Mirror | Fallback, falls lokaler Clone defekt | SSH-Deploy-Key `dr-readonly-2026-06-03` (ed25519, Passphrase-frei) offline im DR-Kit, ein Test-Clone pro Quartal mit `GIT_SSH_COMMAND="ssh -i <pfad-zum-key> -o IdentitiesOnly=yes" git ls-remote git@github.com:michaelkaleschke-spec/homelab-infra.git` |
|
||||
| WSL2 mit Borg-Client (`apt install borgbackup`) | Borg-Extract von Hetzner Storage Box ohne laufenden Unraid-Host | `borg --version` antwortet; ein `borg list` gegen Hetzner-Repo laeuft |
|
||||
| SSH-Key fuer Hetzner Storage Box | Login auf `u565255.your-storagebox.de:23` | **Status 2026-06-03: ed25519-DR-Key `dr-hetzner-2026-06-03` offline gesichert.** Pubkey via `install-ssh-key` auf der Storage Box autorisiert, passwortloser Login erfolgreich, `ls` zeigt vier Borg-Repos (`backup`, `backup2`, `hetzner_borg_appdata`, `hetzner_borg_appdata_critical`). Private Key liegt offline neben KOMODO_*-Notiz und GitHub-Deploy-Key |
|
||||
| SSH-Key fuer Hetzner Storage Box | Login auf `u565255.your-storagebox.de:23` | Key ist auf der Storage Box in `authorized_keys` aktiv, getestet `ssh -p23 u565255@...` |
|
||||
| Offline-Kopie Borg-Passphrase | Entschluesselung des Borg-Repos | Operator-Bestaetigung 2026-05-26; bei Reviews nur Auffindbarkeit pruefen |
|
||||
| Offline-Kopie KOMODO_* Stack-ENV | Komodo-Bootstrap ohne Vaultwarden | **Status 2026-06-03: offline gesichert (Operator-Bestaetigung)** |
|
||||
| Vaultwarden Master-Passwort offline | Zugriff auf Vaultwarden-Export im DR | Operator-Wissen, ggf. analog gesichert |
|
||||
@@ -106,4 +106,3 @@ Operative Regel: Die DR-Workstation wird nicht als Test-/Spiel-PC betrachtet. WS
|
||||
| 2026-06-03 | DR-Tabletop ergibt drei offene Bootstrap-Bloecke: KOMODO_*-Notiz nicht offline, GitHub-Mirror-Read-PAT/Deploy-Key nicht angelegt, DR-Workstation nicht als DR-Kit konfiguriert. Details in `docs/DR_DRILL_2026-06-03.md` und Folge-Tasks in `docs/AUDIT_2026-05-25_TODO.md`. | KOMODO_*-Notiz erzeugen, Read-PAT erzeugen, WSL2+Borg auf Gaming-PC einrichten |
|
||||
| 2026-06-03 | KOMODO_*-Notiz offline gesichert (Operator-Bestaetigung im DR-Tabletop-Followup). Quelle bleibt host-seitige `.env` (`/mnt/user/services/stacks/komodo/.env`) bzw. Drift-Recovery-Kopie vom 2026-05-04. Bare-Metal-Komodo-Bootstrap ist damit ohne Vaultwarden moeglich. | Restliche P1-Operator-Aufgaben: GitHub-Read-PAT, DR-Workstation-Setup, Nextcloud-Restore-Test |
|
||||
| 2026-06-03 | GitHub-Mirror Read-Only Deploy-Key `DR Read-Only 2026-06-03` (ed25519, Passphrase-frei) erzeugt, in GitHub Repo Settings ohne Write-Access hinterlegt, Smoke `git ls-remote` erfolgreich (`d947c7f` matched master HEAD), Private-Key offline neben KOMODO_*-Notiz abgelegt, Arbeitsplatz-Kopie geloescht. | Restliche P1-Operator-Aufgaben: DR-Workstation-Setup, Nextcloud-Restore-Test |
|
||||
| 2026-06-03 | Hetzner Storage Box DR-SSH-Key `dr-hetzner-2026-06-03` (ed25519, Passphrase-frei) erzeugt, via `install-ssh-key` auf Storage Box `u565255.your-storagebox.de:23` autorisiert, passwortloser Login erfolgreich (Borg-Repos sichtbar), Private-Key offline neben KOMODO_*-Notiz und GitHub-Deploy-Key abgelegt, Arbeitsplatz-Kopie geloescht. Bare-Metal-Borg-Restore von der DR-Workstation ist damit moeglich, sobald WSL2 + Borg-Client installiert sind. | Restliche P1-Operator-Aufgaben: WSL2 + Borg-Client auf DR-Workstation installieren, Nextcloud-Restore-Test |
|
||||
|
||||
@@ -34,7 +34,6 @@ Details gilt immer die betroffene Compose-Datei oder das jeweilige Runbook.
|
||||
| `docs/SECRETS_MAP.md` | Secret-Namen und Pfade ohne Werte |
|
||||
| `docs/GITOPS_DRIFT_RUNBOOK.md` | Git/Gitea/Komodo/Docker/Host-Drift |
|
||||
| `docs/AUDIT_2026-05-25_TODO.md` | aktuelle Restliste |
|
||||
| `docs/DR_WORKSTATION_SETUP.md` | Schritt-fuer-Schritt-Runbook fuer den DR-Gaming-PC (WSL2 + Borg-Client + SSH-Keys) |
|
||||
|
||||
## Wichtige Skripte
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ Stand 2026-06-03. Pro Dienst auf einen Blick: Wurde der Restore schon einmal rea
|
||||
| PostgreSQL 18 Cluster | 1 | 2026-06-03 | globals + 5 per-DB dumps, 290 Tabellen gesamt | quartalsweise |
|
||||
| Redis 8 | 1 | - | noch kein Test | - |
|
||||
| Komodo Mongo Daten | 1 | 2026-06-03 | mongorestore --archive --gzip, 86904 docs | quartalsweise |
|
||||
| Nextcloud | 2 | 2026-06-03 | File + Dump + Container + HTTP 200 + occ status + Table-Count (126) | quartalsweise |
|
||||
| Nextcloud | 2 | - | noch kein Test | **hoechste Prio** (occ-Choreographie) |
|
||||
| Mealie | 2 | 2026-06-03 | File + Dump + Container + HTTP + Recipe-Count (3) | quartalsweise |
|
||||
| Mail-Archiver | 2 | 2026-06-03 | Keys + 645M Dump + Container + HTTP 200 | quartalsweise |
|
||||
| Glance | 2 | - | rebuildbar, kein Test noetig | - |
|
||||
@@ -156,7 +156,8 @@ Stand 2026-06-03. Pro Dienst auf einen Blick: Wurde der Restore schon einmal rea
|
||||
|
||||
## Naechste Restore-Test-Kandidaten (priorisiert)
|
||||
|
||||
1. **Shared PostgreSQL 18 Cluster** - globals + per-DB-Dumps, Bootstrap-Konflikt `mailarchiver`
|
||||
1. **Nextcloud** - hoechste Prio wegen `occ maintenance:mode`-Choreographie und `oc_admin`-Rolle
|
||||
2. **Shared PostgreSQL 18 Cluster** - globals + per-DB-Dumps, Bootstrap-Konflikt `mailarchiver`
|
||||
3. **Komodo Mongo Daten** - echtes `mongorestore` aus `komodo-mongo.archive.gz` (Quelle fuer `KOMODO_*`-Stack-ENVs im DR)
|
||||
4. **Mailarchiver** - Tier 2, shared Postgres + Authelia ForwardAuth
|
||||
5. **Mealie** - Tier 2, eigene Postgres
|
||||
|
||||
@@ -127,14 +127,6 @@ cp "$DUMP_HOST_PATH" "$RESTORE_ROOT/dumps/latest/nextcloud.dump"
|
||||
# Im Restore-Lab ist das /mnt/user/backups/restore-lab/nextcloud/data.
|
||||
mkdir -p "$RESTORE_ROOT/data"
|
||||
|
||||
# Nextcloud prueft auf einen Marker `.ncdata` mit dem festen Inhalt
|
||||
# "# Nextcloud data directory" und blockt sonst mit "Your data directory
|
||||
# is invalid" (HTTP 503). Produktiv liegt der Marker unter
|
||||
# /mnt/user/documents/nextcloud-data/.ncdata; der Smoke mountet diesen
|
||||
# Pfad bewusst nicht, also legen wir den Marker hier an. Das ist die
|
||||
# in der Nextcloud-Doku vorgesehene Form.
|
||||
echo "# Nextcloud data directory" > "$RESTORE_ROOT/data/.ncdata"
|
||||
|
||||
# Unraid (FUSE/shfs) ignoriert chown auf User-Shares. Stattdessen setzen
|
||||
# wir die Dateien auf world-writable, damit der Nextcloud-Entrypoint
|
||||
# (der als root startet und intern auf www-data wechselt) die Dateien
|
||||
@@ -163,30 +155,16 @@ if [ -f "$CONFIG_PHP" ]; then
|
||||
# Wir ersetzen nur den Host-Wert innerhalb des redis-Blocks.
|
||||
sed -i "s|'host' => 'nextcloud-redis'|'host' => 'restoretest-nextcloud-redis'|g" "$CONFIG_PHP"
|
||||
|
||||
# Zwei Patches in der config.php, beides per PHP-Code-Injection am Ende:
|
||||
#
|
||||
# 1. trusted_domains: 127.0.0.1 hinzufuegen, damit der Smoke-Endpunkt
|
||||
# akzeptiert wird. Nextcloud prueft trusted_domains und blockt sonst
|
||||
# mit "Access through untrusted domain" (503).
|
||||
#
|
||||
# 2. check_data_directory_permissions: false. Hintergrund: Nextcloud
|
||||
# (OC_Util::checkDataDirectoryPermissions) prueft beim HTTP-Request, ob
|
||||
# die data-Dir-Permissions in der letzten Stelle 0 sind. Falls nicht,
|
||||
# versucht es als www-data ein chmod(0770). Auf Unraid (shfs/FUSE)
|
||||
# lehnt das Filesystem chmod von Non-Root ab, also kann der Container
|
||||
# das nie korrigieren -> Nextcloud meldet "data directory readable by
|
||||
# other people" -> HTTP 503. Im isolierten Smoke-Kontext (Wegwerf-
|
||||
# Daten, kein Public, kein Traefik) ist das Aushebeln dieses Checks
|
||||
# sauber dokumentiert vorgesehen. Produktiv bleibt der Check an.
|
||||
# trusted_domains: 127.0.0.1 hinzufuegen, damit der Smoke-Endpunkt akzeptiert wird.
|
||||
# Nextcloud prueft trusted_domains und blockt sonst mit "Access through untrusted domain" (503).
|
||||
# Wir fuegen per PHP-Code-Injection am Ende der config eine zweite trusted_domain hinzu.
|
||||
# Das ist robuster als den Array-Block per sed zu finden.
|
||||
php -r "
|
||||
\$f = '$CONFIG_PHP';
|
||||
\$c = file_get_contents(\$f);
|
||||
if (strpos(\$c, \"'127.0.0.1'\") === false || strpos(\$c, 'check_data_directory_permissions') === false) {
|
||||
if (strpos(\$c, \"'127.0.0.1'\") === false) {
|
||||
include \$f;
|
||||
if (!in_array('127.0.0.1', \$CONFIG['trusted_domains'])) {
|
||||
\$CONFIG['trusted_domains'][] = '127.0.0.1';
|
||||
}
|
||||
\$CONFIG['check_data_directory_permissions'] = false;
|
||||
\$CONFIG['trusted_domains'][] = '127.0.0.1';
|
||||
\$out = '<?php' . PHP_EOL . '\$CONFIG = ' . var_export(\$CONFIG, true) . ';' . PHP_EOL;
|
||||
file_put_contents(\$f, \$out);
|
||||
}
|
||||
@@ -195,9 +173,6 @@ if [ -f "$CONFIG_PHP" ]; then
|
||||
if ! grep -q "127.0.0.1" "$CONFIG_PHP"; then
|
||||
sed -i "/'trusted_domains'/,/^ )/s|^ )| 99 => '127.0.0.1',\n )|" "$CONFIG_PHP" || true
|
||||
fi
|
||||
if ! grep -q "check_data_directory_permissions" "$CONFIG_PHP"; then
|
||||
sed -i "s|^);| 'check_data_directory_permissions' => false,\n);|" "$CONFIG_PHP" || true
|
||||
fi
|
||||
}
|
||||
|
||||
config_patched="ok"
|
||||
|
||||
Reference in New Issue
Block a user