# NUC Backup Strategy **Date:** 2026-02-01 17:30 **Context:** 3-layer backup strategy for NUC disaster recovery --- ## Layer 1: Daily Automated Backup (Kopia → MinIO) **What:** All Docker volumes + Coolify configs **Where:** NUC MinIO (local) + optionally offsite **Recovery time:** ~15 min ### Configure Kopia ```bash # Connect to Kopia container ssh nuc "docker exec -it kopia /bin/sh" # Add Docker volumes path kopia policy set /var/lib/docker/volumes --add-include "*.sql" --add-include "*.db" kopia snapshot create /var/lib/docker/volumes # Add Coolify data kopia snapshot create /data/coolify # Set daily schedule kopia policy set --global --snapshot-interval 24h ``` ### Critical paths to backup | Path | Contents | |------|----------| | `/data/coolify/` | Coolify configs, SSH keys, DB | | `/var/lib/docker/volumes/` | All service data | | `/opt/homepage/config/` | Homepage dashboard config | ### Manual backup command ```bash ssh nuc "docker exec kopia kopia snapshot create /var/lib/docker/volumes /data/coolify" ``` ### Verify backups ```bash ssh nuc "docker exec kopia kopia snapshot list --all" ``` --- ## Layer 2: Clonezilla Full Disk Image **What:** Complete disk clone (OS + everything) **Where:** External USB drive **Recovery time:** ~30 min **When:** Monthly or before hardware changes ### Create image 1. Boot NUC from Clonezilla USB 2. Select: `device-image` → `savedisk` 3. Choose external USB as destination 4. Select NUC internal disk as source 5. Use options: `-z1p` (parallel compression), `-fsck-src-part` (check filesystem) ### Recommended naming ``` nuc-full-YYYY-MM-DD.img ``` ### Storage requirements | NUC disk used | Compressed image | |---------------|------------------| | 50GB | ~20GB | | 100GB | ~40GB | | 250GB | ~80GB | --- ## Layer 3: Coolify Services Export **What:** List of all services + configs for manual rebuild **Where:** This repo + offsite **Recovery time:** 1-2 hours (fresh install) ### Export current services ```bash # Get all services with their configs ssh nuc "docker exec coolify php artisan tinker --execute=\" use App\Models\Service; Service::all()->map(fn(\\\$s) => [ 'name' => \\\$s->name, 'uuid' => \\\$s->uuid, 'type' => \\\$s->service_type, 'compose' => \\\$s->docker_compose_raw ])->toJson(JSON_PRETTY_PRINT); \"" ``` ### Current NUC Services (as of 2026-02-01) | Service | Port | Coolify UUID | |---------|------|--------------| | Homepage | 3000 | eo0g84scsss4osk0skk040ck | | Coolify | 8000 | (system) | | Gitea | 3030 | ho0cwgcwos88cwc48g84c0g8 | | Outline | 3080 | pccg80wks4c084008owokkkg | | n8n | 5678 | uk0o04o0g84s4sc80kkoooc0 | | Vaultwarden | 8222 | h40w0ss4kgs0c8cgc0sc8k48 | | Ntfy | 8333 | xgkkg8gkgg048g8gkc8ck4os | | MinIO | 9000/9001 | dg4wkgg8skcssww0040sgk80 | | Authentik | 9090 | e8owcw0s4wcswc4w4css0sws | | FileBrowser | 8085 | o4swwwsowwg88coo0ws4cg48 | | CloudBeaver | 8087 | joo4g4k0w08k8kcosgsgswc0 | | Uptime Kuma | 3001 | s4ko04w88k048sw8o4swsoww | | Dozzle | 9999 | vgko8w4kkkc8k0g4sggs4ks8 | | Tailscale | - | posgwooww0s0c0okssooc4gw | ### Databases | Database | Port | UUID | |----------|------|------| | LiquidGym MySQL | 3306 | hgwcgs4oswwc8scg080scoo4 | | LiquidGym Postgres | 5433 | x4kk8g4k8w4g0cw480w84g4g | | Knosia Postgres | 5442 | ik80skko0008w4000c4w40os | --- ## Recovery Priority If total failure, restore in this order: 1. **Coolify** (manages everything else) 2. **Databases** (apps depend on them) 3. **Authentication** (Authentik, Vaultwarden) 4. **Core services** (Gitea, n8n, Outline) 5. **Monitoring** (Uptime Kuma, Dozzle) --- ## Offsite Backup (Optional) For offsite, sync Kopia repository to cloud: ```bash # Sync to Backblaze B2 (example) kopia repository sync-to b2 --bucket=nuc-backup --key-id=XXX --key=YYY ``` Or rsync the Clonezilla image to another location. --- ## Related - Hard Disk Change Guide: `2026-02-01_17-30_nuc-hard-disk-change.md` - LiquidGym Migration: `2026-02-01_16-45_liquidgym-mysql-migration.md`