# Piano di Disaster Recovery — Flotta Autonoma **Versione:** 2.0 — riscritta e verificata contro lo stato reale **Data:** 2026-07-29 **Autore:** Adrian **Sostituisce:** v1.0 (2026-03-06), superata (path pre-migrazione, servizi morti citati come attivi) --- ## Scope — perché questo documento si è ristretto La v1.0 proteggeva "tutto il sistema Adrian+Elon+vault". Con l'architettura AgentBricks (vedi [[project_alleggerimento_elon]]), gran parte di quel bisogno è sparito da solo: `archivio/` (il second brain) vive su Dropbox+git, già replicato su più macchine — se la Nave muore, l'archivio esiste comunque altrove, niente di speciale da fare per recuperarlo. Quello che questo documento protegge davvero: **hardware fisico, servizi Docker, tunnel di rete, VPS** — cose che esistono in un unico posto. --- ## Scenario: La Nave (MiniPC) è morta o inaccessibile ### Hardware (verificato 29/07/2026) - **MiniPC:** GMKtec G3 NucBoxG3 - **OS:** Linux Mint 22.2 (Zara) — base Ubuntu Noble - **Disco OS:** NVMe (`/dev/nvme0n1p2`) → `/` (UUID `bf2d3b83-c201-4cdf-9670-664cba080fce`) - **SSD dati:** 1TB ext4 (`/dev/sda1`) → `/mnt/ssd` (UUID `3b511949-3a77-4b69-a719-410f3ee10d6d`) - **HDD backup:** 5TB ext4 (`/dev/sdb2`) → `/mnt/backup-hdd` (UUID `23ade3f1-137e-421d-80c1-d1b7ba8b9f31`) ### Cosa è salvato e dove Dettaglio completo, sempre aggiornato: `config.md`, sezione BACKUP. Riassunto: | Dato | Dove | Quando | |------|------|--------| | `/mnt/ssd` completo | `/mnt/backup-hdd/flotta-backup` (Restic) | 03:00 | | `/mnt/ssd` completo | pCloud `Flotta-Mirror/ssd` (rclone) | 01:15 | | Config VPS (Caddy, WG, SSH) | `gemello-nave/config-backups/avamposto_snapshots/` | 02:45 | | `archivio/` (second brain) | Dropbox + git, già replicato — nessun'azione extra | continuo | **Password Restic e ogni altra credenziale:** solo in `credentials.md`, mai qui. --- ## Recovery — Caso 1: solo disco OS rotto (SSD e HDD intatti) ```bash # 1. Installa Linux Mint 22.2 su nuovo disco NVMe # 2. Monta SSD e HDD sudo mkdir -p /mnt/ssd /mnt/backup-hdd sudo mount /dev/sda1 /mnt/ssd sudo mount /dev/sdb2 /mnt/backup-hdd # 3. Installa dipendenze sudo apt install -y docker.io docker-compose-v2 restic rclone wireguard # 4. Ripristina fstab (UUID sopra) sudo nano /etc/fstab # 5. Ripristina chiave SSH (da backup Restic/pCloud, path in fstab) chmod 600 ~/.ssh/id_ed25519 # 6. Avvia i container Docker (verificati attivi 29/07/2026: 7 totali) cd /mnt/ssd/config/guacamole && docker compose up -d # guacamole + postgres + guacd cd /mnt/ssd/config/jellyfin && docker compose up -d cd /mnt/ssd/config/webdav && docker compose up -d cd /mnt/ssd/config/portainer && docker compose up -d cd /mnt/ssd/config/navidrome && docker compose up -d # 7. Ripristina WireGuard sudo cp /etc/wireguard/wg0.conf /etc/wireguard/ sudo systemctl enable --now wg-quick@wg0 # 8. Verifica tunnel ping 10.0.0.1 # 9. Riavvia vault-mcp (systemd, non in Docker) sudo systemctl enable --now vault-mcp # 10. Ripristina crontab (vedi sezione sotto) crontab ``` --- ## Recovery — Caso 2: SSD dati rotto (OS e HDD intatti) ```bash sudo mkfs.ext4 /dev/sda1 sudo mount /dev/sda1 /mnt/ssd # Ripristina da Restic (password in credentials.md) export RESTIC_PASSWORD="" restic -r /mnt/backup-hdd/flotta-backup restore latest --target /mnt/ssd ls /mnt/ssd/{config,data} # Poi segui i passi 6-10 del Caso 1 ``` --- ## Recovery — Caso 3: tutto perso (OS + SSD + HDD) ```bash sudo apt install -y rclone rclone config # remote: pcloud_backup, tipo: pcloud mkdir -p /mnt/ssd rclone sync pcloud_backup:Flotta-Mirror/ssd /mnt/ssd --progress # NOTA: pCloud può avere fino a 24h di ritardo rispetto a Restic # Poi segui i passi 6-10 del Caso 1 ``` --- ## Recovery — VPS Avamposto (Caddy / WireGuard) ```bash # 1. Crea nuovo VPS Hetzner (Ubuntu 22.04+) # 2. SSH, crea utente mauro adduser mauro && usermod -aG sudo mauro # 3. Ripristina config dall'ultimo snapshot avamposto # gemello-nave/config-backups/avamposto_snapshots/ (Caddyfile, wg0.conf, sshd_config, fail2ban, ufw) # 4. Caddy apt install -y docker.io docker-compose-v2 cd /opt/caddy && docker compose up -d # 5. WireGuard apt install -y wireguard cp wg0.conf /etc/wireguard/ systemctl enable --now wg-quick@wg0 # 6. DNS su Porkbun: privcloud.dev e *.privcloud.dev → nuovo IP # 7. Aggiorna endpoint su Nave # /etc/wireguard/wg0.conf: endpoint = :51820 sudo systemctl restart wg-quick@wg0 ``` --- ## Crontab da ripristinare (utente mauro) — verificato 11/09/2026 sera (crontab -l, completo) ```cron 45 2 * * * cd /mnt/ssd/data/Dropbox/adrian/gemello-nave/config-backups && /usr/bin/env python3 backup_avamposto.py >> /mnt/ssd/data/Dropbox/adrian/gemello-nave/config-backups/avamposto_snapshot.log 2>&1 15 1 * * * cd /mnt/ssd/data/Dropbox/adrian/gemello-nave && /usr/bin/env bash pcloud_backup.sh >/dev/null 2>&1 45 5 * * * cd /mnt/ssd/data/Dropbox/adrian/gemello-nave/logbook && /usr/bin/env python3 collect_logs.py >> reports/cron.log 2>&1 */30 * * * * cd /mnt/ssd/data/Dropbox/adrian/PYTHON/gate-ufficio/nave && /mnt/ssd/data/Dropbox/adrian/scripts/schedulazioni_venv/bin/python3 check_job_health.py >> logs/cron.log 2>&1 0 3 * * * cd /mnt/ssd/data/Dropbox/adrian/gemello-nave && /usr/bin/env bash backup_completo.sh 0 6 * * 0 cd /mnt/ssd/data/Dropbox/adrian/gemello-nave/flotta-diagnostics && RESTIC_PASSWORD_FILE=/mnt/ssd/data/Dropbox/adrian/gemello-nave/secrets/restic_password /usr/bin/env python3 sentinel.py >> /mnt/ssd/data/Dropbox/adrian/gemello-nave/logbook/reports/sentinel.log 2>&1 */5 * * * * /usr/bin/env bash /mnt/ssd/data/Dropbox/adrian/gemello-nave/wg_monitor.sh */5 * * * * cd /mnt/ssd/config/guacamole && docker compose up -d guacd >/dev/null 2>&1 0 */4 * * * cd /mnt/ssd/data/Dropbox/adrian && /usr/bin/env rclone sync archivio/ "gdrive_secondbrain:SecondBrain" -L --exclude "_raw/**" --exclude "_secrets/**" --exclude ".obsidian/**" >> gemello-nave/logbook/reports/secondbrain_sync.log 2>&1 */5 * * * * bash /mnt/ssd/data/Dropbox/adrian/gemello-nave/guacamole_watchdog.sh 58 5 * * * cd /mnt/ssd/data/Dropbox/adrian && /usr/bin/env python3 gemello-nave/monitor-consumo-istanze/report.py >> gemello-nave/monitor-consumo-istanze/cron.log 2>&1 55 5 * * * cd /mnt/ssd/data/Dropbox/adrian && /usr/bin/env python3 scripts/archivio-raw-conversazioni/archive_raw.py >> scripts/archivio-raw-conversazioni/cron.log 2>&1 */2 * * * * /usr/bin/env python3 /mnt/ssd/data/Dropbox/adrian/gemello-nave/trigger/watch.py --once >> /mnt/ssd/data/Dropbox/adrian/gemello-nave/trigger/watch.log 2>&1 ``` **Nota (11/09 sera)**: `wg_monitor.sh` risultava `*/5 * * * *` (ogni 5 min) al momento di questo refresh, diverso da `0 * * * *` (ogni ora) annotato nel refresh precedente della stessa giornata — discrepanza notata ma non investigata (nessuna delle mie modifiche di oggi ha toccato la frequenza di questo job, solo il path), possibile intervento esterno nel frattempo. Verificare con Mauro se serve chiarezza su quale frequenza sia quella voluta. --- ## Credenziali essenziali Tutte le password/chiavi vere sono in `credentials.md`. Riferimenti non-segreti: dominio registrar Porkbun (account Mauro), pCloud (account Mauro). --- ## Priorità di ripristino 1. **WireGuard tunnel** — senza questo nulla è raggiungibile dall'esterno 2. **Caddy VPS** — reverse proxy per tutti i domini 3. **Guacamole** — accesso remoto desktop (usato quotidianamente) 4. **vault-mcp** — se Elon/vault.db sono ancora in uso (in dismissione graduale, vedi [[project_alleggerimento_elon]]) 5. **Jellyfin / Navidrome** — media server 6. **WebDAV / Portainer** — strumenti operativi *(Rimosso da v1.0: Albert — dismesso 2026-03-29, non più da ripristinare.)* --- ## Contatti e risorse - **Repo git Adrian:** `/mnt/ssd/data/Dropbox/adrian/` (branch master) — `archivio/` incluso, già replicato via Dropbox+git indipendentemente da questo piano - **Snapshot avamposto:** `gemello-nave/config-backups/avamposto_snapshots/` - **Credenziali:** `archivio/_secrets/credentials.md` *(Rimosso da v1.0: riferimento a Supabase — smantellato, mai più da nominare.)*