Disaster Recovery & Restore Runbook
Target: Cloudflare R2 bucket (
cortex-backups)
Endpoint:32f98e32368b62781593f92a61020532.r2.cloudflarestorage.com
Backup Matrix & Architecture: Seedocs/backup.md
Phase 1: Bare-Metal Host Setup
If the host fails or you migrate to new hardware:
- Install Base OS & Docker: Install Ubuntu Server (or Debian), Docker Engine, and the Docker Compose plugin.
- Clone the Cortex Repository:
- Recreate Stack Secrets (
.envfiles): Retrieve stack environment variables and API keys from your password manager (Bitwarden / 1Password) and place.envfiles in each service directory.
Phase 2: Connect Kopia to Cloudflare R2
- Start Kopia:
- Connect to Existing R2 Repository:
Open the Kopia Web UI at
http://<server-ip>:51515(or execute via CLI): Enter your Kopia Master Passphrase when prompted. - Verify Snapshots:
Phase 3: Service-by-Service Restoration
1. Immich (Photos & Database)
- Restore Immich database dump and photo library from Kopia:
- Start the Immich Postgres container:
- Import the latest
.sql.gzdump: - Start the rest of the Immich stack:
2. Paperless-ngx (Documents & Database)
- Restore Paperless volume data and database dumps:
- Copy files to target volume mounts:
- Restore Postgres DB dump into
paperless-db: - Restart Paperless stack:
3. AdventureLog (Trips, Media & Database)
- Restore AdventureLog volume data and dumps from Kopia:
- Copy media files to target container volume:
- Restore Postgres DB dump into
adventurelog-db: - Restart AdventureLog stack:
4. Configuration Directories (Bind Mounts)
For bind-mounted configuration directories, restore snapshots directly to their folders on the host:
# Home Assistant
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/homeassistant/config
# Authelia
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/authelia/config
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/authelia/secrets
# Jellyfin
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/jellyfin/config
# Seerr
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/seerr/config
# Yamtrack
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/yamtrack/db
# Glance
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/glance/config
# Pi-hole
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/pihole/etc-pihole
docker exec kopia kopia restore <snapshot-id> /home/tforkan/docker/pihole/etc-dnsmasq.d
Start the restored stacks:
5. Named Docker Volumes (Homebox & Uptime Kuma)
# 1. Create target volumes if they don't exist
docker volume create homebox_homebox-data
docker volume create uptime-kuma_uptime-kuma
# 2. Restore Kopia snapshots directly into volume paths
docker exec kopia kopia restore <snapshot-id-homebox> /data/homebox_data
docker exec kopia kopia restore <snapshot-id-kuma> /data/uptime_kuma_data
# 3. Start containers
cd /home/tforkan/docker/homebox && docker compose up -d
cd /home/tforkan/docker/uptime-kuma && docker compose up -d