186 lines
4.9 KiB
Markdown
186 lines
4.9 KiB
Markdown
|
|
# Disaster Recovery Guide
|
||
|
|
|
||
|
|
This document covers how to restore services from backups in the event of server failure.
|
||
|
|
|
||
|
|
## Understanding Hyper Backup's Storage Format
|
||
|
|
|
||
|
|
Hyper Backup does NOT create timestamped files like `backup-2025-12-09.tar.gz`. Instead, it uses a **deduplicated block storage format** (`.hbk` folder).
|
||
|
|
|
||
|
|
**What you'll see in B2:**
|
||
|
|
```
|
||
|
|
ovh-prod-01.hbk/
|
||
|
|
├── Config/ # Backup configuration
|
||
|
|
├── Control/ # Version metadata and timestamps
|
||
|
|
├── Guard/ # Integrity verification data
|
||
|
|
├── Pool/ # Deduplicated data blocks (shared across all versions)
|
||
|
|
└── *.db files # Index databases
|
||
|
|
```
|
||
|
|
|
||
|
|
**Why this design?**
|
||
|
|
- A 1.6GB backup that changes 50MB daily only stores ~50MB new data per version
|
||
|
|
- Much more storage-efficient than full timestamped copies
|
||
|
|
- All version history is embedded in the metadata
|
||
|
|
|
||
|
|
**To browse backup versions:**
|
||
|
|
1. Open Hyper Backup on Synology
|
||
|
|
2. Select the backup task
|
||
|
|
3. Click **"Version List"** button
|
||
|
|
4. Timeline shows all versions with timestamps - select one to browse/restore
|
||
|
|
|
||
|
|
**To restore without Synology access:**
|
||
|
|
- Download the entire `.hbk` folder from B2
|
||
|
|
- Use **Hyper Backup Explorer** (free Synology desktop tool for Windows/Mac/Linux)
|
||
|
|
- Browse and extract any version from the backup set
|
||
|
|
|
||
|
|
## Backup Locations
|
||
|
|
|
||
|
|
| Location | Path | Contents |
|
||
|
|
|----------|------|----------|
|
||
|
|
| OVH Server | `~/backups/current/latest.tar.gz` | Most recent backup (2 days retention) |
|
||
|
|
| Synology NAS | `/volume1/backups/ovh-prod-01/` | Pulled backups with Smart Recycle retention |
|
||
|
|
| Backblaze B2 | `ovh-prod-01-backups` bucket | Offsite mirror of Synology |
|
||
|
|
|
||
|
|
## Backup Contents
|
||
|
|
|
||
|
|
The `latest.tar.gz` contains:
|
||
|
|
```
|
||
|
|
backups/
|
||
|
|
├── SERVICE_NAME/
|
||
|
|
│ ├── docker-compose.yml # Service configuration
|
||
|
|
│ ├── .env # Environment variables (if present)
|
||
|
|
│ └── db_backup.sql # Database dump (MariaDB/PostgreSQL)
|
||
|
|
│ or db_backup/ # MongoDB dump directory
|
||
|
|
│ or pb_data.tar.gz # PocketBase data
|
||
|
|
```
|
||
|
|
|
||
|
|
## Recovery Procedures
|
||
|
|
|
||
|
|
### Scenario 1: Single Service Recovery
|
||
|
|
|
||
|
|
If one service is corrupted but the server is intact:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. SSH into server
|
||
|
|
ssh jared@15.204.247.153
|
||
|
|
|
||
|
|
# 2. Stop the affected service
|
||
|
|
cd ~/services/SERVICE_NAME
|
||
|
|
docker compose down
|
||
|
|
|
||
|
|
# 3. Extract backup
|
||
|
|
cd ~/backups/current
|
||
|
|
tar -xzf latest.tar.gz
|
||
|
|
|
||
|
|
# 4. Restore database (MariaDB example)
|
||
|
|
docker exec -i SERVICE_NAME-db mysql -u root -pPASSWORD DATABASE < backups/SERVICE_NAME/db_backup.sql
|
||
|
|
|
||
|
|
# 5. Restart service
|
||
|
|
cd ~/services/SERVICE_NAME
|
||
|
|
docker compose up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
### Scenario 2: Full Server Recovery
|
||
|
|
|
||
|
|
If the server is lost and you need to rebuild:
|
||
|
|
|
||
|
|
#### Step 1: Provision New Server
|
||
|
|
- OVHcloud VPS or equivalent
|
||
|
|
- Ubuntu 22.04 LTS recommended
|
||
|
|
- Install Docker and Docker Compose
|
||
|
|
|
||
|
|
#### Step 2: Restore Network Infrastructure
|
||
|
|
```bash
|
||
|
|
# Create Docker networks
|
||
|
|
docker network create --subnet=172.20.0.0/16 traefik
|
||
|
|
docker network create --subnet=172.21.0.0/16 internal
|
||
|
|
|
||
|
|
# Create services directory
|
||
|
|
mkdir -p ~/services
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Step 3: Get Backup from Synology or B2
|
||
|
|
|
||
|
|
**From Synology (if accessible):**
|
||
|
|
```bash
|
||
|
|
scp jared@192.168.86.31:/volume1/backups/ovh-prod-01/latest.tar.gz ~/
|
||
|
|
```
|
||
|
|
|
||
|
|
**From Backblaze B2:**
|
||
|
|
1. Open Synology Hyper Backup
|
||
|
|
2. Click the restore icon
|
||
|
|
3. Browse to desired backup version
|
||
|
|
4. Download/restore `latest.tar.gz`
|
||
|
|
|
||
|
|
Or use B2 CLI:
|
||
|
|
```bash
|
||
|
|
b2 authorize-account APPLICATION_KEY_ID APPLICATION_KEY
|
||
|
|
b2 download-file-by-name ovh-prod-01-backups latest.tar.gz ./latest.tar.gz
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Step 4: Restore Traefik First
|
||
|
|
```bash
|
||
|
|
# Extract backup
|
||
|
|
tar -xzf latest.tar.gz
|
||
|
|
|
||
|
|
# Copy Traefik config
|
||
|
|
cp -r backups/traefik ~/services/
|
||
|
|
|
||
|
|
# Start Traefik
|
||
|
|
cd ~/services/traefik
|
||
|
|
docker compose up -d
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Step 5: Restore Each Service
|
||
|
|
For each service directory in the backup:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Copy service files
|
||
|
|
cp -r backups/SERVICE_NAME ~/services/
|
||
|
|
|
||
|
|
# Start service (creates containers and volumes)
|
||
|
|
cd ~/services/SERVICE_NAME
|
||
|
|
docker compose up -d
|
||
|
|
|
||
|
|
# Restore database if applicable
|
||
|
|
# MariaDB:
|
||
|
|
docker exec -i CONTAINER_NAME mysql -u root -pPASSWORD DATABASE < db_backup.sql
|
||
|
|
|
||
|
|
# PostgreSQL:
|
||
|
|
docker exec -i CONTAINER_NAME psql -U USER DATABASE < db_backup.sql
|
||
|
|
|
||
|
|
# MongoDB:
|
||
|
|
docker exec -i CONTAINER_NAME mongorestore --archive < db_backup.archive
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Step 6: Verify Services
|
||
|
|
```bash
|
||
|
|
# Check all containers are running
|
||
|
|
docker ps
|
||
|
|
|
||
|
|
# Check Traefik dashboard for routing
|
||
|
|
# Verify each service responds on its domain
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Step 7: Update DNS
|
||
|
|
Point domains to new server IP if changed.
|
||
|
|
|
||
|
|
## Credentials Required for Recovery
|
||
|
|
|
||
|
|
All credentials stored in Bitwarden:
|
||
|
|
- **Server SSH**: Search "OVH" or "15.204.247.153"
|
||
|
|
- **Backblaze B2**: Search "Backblaze | ovh-prod-01-backups key"
|
||
|
|
- **Database passwords**: In each service's `.env` file (included in backup)
|
||
|
|
- **Traefik dashboard**: In `credentials.md` (this repo)
|
||
|
|
|
||
|
|
## Testing Recovery
|
||
|
|
|
||
|
|
Periodically test recovery by:
|
||
|
|
1. Spinning up a test VPS
|
||
|
|
2. Following the full server recovery procedure
|
||
|
|
3. Verifying services come up correctly
|
||
|
|
4. Destroying test VPS
|
||
|
|
|
||
|
|
## Contact
|
||
|
|
|
||
|
|
Server admin: Jared Swanson
|