server-ovh-prod-01-main/docs/backup-setup-progress.md

3.4 KiB

Backup System Setup Progress

Status: Complete (as of 2025-12-09)

Completed Steps

1. Backblaze B2 Setup

  • Account created
  • Bucket: ovh-prod-01-backups (private, server-side encryption enabled)
  • Application key: synology-hyper-backup (stored in Bitwarden as "Backblaze | ovh-prod-01-backups key")
  • Client-side encryption: Not needed (server-side encryption sufficient for this use case)

2. Server-Side Backup Script

  • Location: ~/services/backup.sh on OVH server (15.204.247.153)
  • Auto-discovers services in ~/services/*/docker-compose.yml
  • Supports: MariaDB, PostgreSQL, MongoDB, PocketBase
  • Output: ~/backups/current/latest.tar.gz
  • Cron: 0 7 * * * (2 AM EST = 7 AM UTC)
  • Tested successfully - created 792MB backup

3. Synology SSH Key Setup

  • Key generated: /var/services/homes/jared/.ssh/id_ed25519_ovh_backup
  • Public key added to OVH server's ~/.ssh/authorized_keys
  • Connection tested successfully

4. Synology Pull Script

  • Directory created: /volume1/backups/ovh-prod-01/
  • Script created: /volume1/backups/ovh-prod-01/pull-backup.sh
  • SSH key: /var/services/homes/jared/.ssh/id_ed25519_ovh_backup

5. Synology Pull Task Scheduled

  • Configured via Synology Task Scheduler
  • Schedule: 3 AM EST (8 AM UTC)
  • Runs as root to avoid permission issues

6. Hyper Backup to Backblaze B2

  • Task name: "OVH Server Backup"
  • Source: /volume1/backups/ovh-prod-01/
  • Destination: ovh-prod-01-backups bucket on Backblaze B2
  • Schedule: 4 AM EST daily (after Synology pull completes)
  • Integrity check: Weekly on Saturday
  • Rotation: Smart Recycle (256 max versions)
  • Settings: Compression enabled, transfer encryption enabled

7. Test Full Chain

  • Initial backup completed successfully on 2025-12-09

8. Disaster Recovery Documentation

  • Created docs/disaster-recovery.md
  • Covers single service recovery and full server rebuild
  • Documents backup locations and credential sources

9. Update Service Deployment Docs

  • Added step 6 to deployment pattern in CLAUDE.md
  • Added disaster-recovery.md link to specialized documentation

Architecture Summary

OVH Server (2 AM EST)     Synology (3 AM EST)      Backblaze B2
─────────────────────     ──────────────────       ────────────
~/services/backup.sh  →   rsync pull           →   Hyper Backup
       ↓                        ↓                       ↓
~/backups/current/        /volume1/backups/      ovh-prod-01-backups
  latest.tar.gz           ovh-prod-01/              bucket

Retention Policy

  • Server: 2 days (staging only)
  • Synology/Backblaze: Smart Recycle (hourly for 24h, daily for ~1 month, weekly beyond)
  • Max versions: 256

Gotchas & Lessons Learned

Hyper Backup Folder Visibility

  • Issue: Newly created folders don't appear in Hyper Backup's folder picker
  • Solution: Close the entire Hyper Backup wizard and restart it; the folder list refreshes on wizard launch

Synology Permissions

  • Issue: Pull script had permission problems when run as regular user
  • Solution: Run the scheduled task as root in Task Scheduler

B2 Encryption

  • Decision: Server-side encryption only (no client-side)
  • Rationale: SSE is sufficient for server backups; client-side adds key management complexity with minimal benefit for this use case