Volume Backup Strategies
Comprehensive Backup Script:
#!/bin/bash
# Homelab backup script
BACKUP_BASE="/mnt/backups"
SOURCE_BASE="/mnt/swarm-data"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_BASE/swarm_backup_$DATE"
# Create backup directory
mkdir -p "$BACKUP_DIR"
# Application data backup
echo "Backing up application data..."
rsync -av --progress "$SOURCE_BASE/" "$BACKUP_DIR/swarm-data/"
# Docker configuration backup
echo "Backing up Docker configurations..."
cp -r /mnt/docker-configs/ "$BACKUP_DIR/docker-configs/"
# System configuration backup
echo "Backing up system configurations..."
cp /etc/fstab "$BACKUP_DIR/fstab"
cp /etc/hosts "$BACKUP_DIR/hosts"
# Docker swarm configuration
echo "Backing up Swarm configuration..."
docker node ls > "$BACKUP_DIR/swarm-nodes.txt"
docker service ls > "$BACKUP_DIR/swarm-services.txt"
docker stack ls > "$BACKUP_DIR/swarm-stacks.txt"
# Compress backup
echo "Compressing backup..."
tar -czf "$BACKUP_BASE/swarm_backup_$DATE.tar.gz" -C "$BACKUP_BASE" "swarm_backup_$DATE"
rm -rf "$BACKUP_DIR"
echo "Backup completed: $BACKUP_BASE/swarm_backup_$DATE.tar.gz"
Automated Backup with Cron:
# Add to crontab (daily at 2 AM)
0 2 * * * /home/doc/scripts/backup_swarm.sh >> /var/log/swarm_backup.log 2>&1
# Weekly cleanup (keep last 4 weeks)
0 3 * * 0 find /mnt/backups -name "swarm_backup_*.tar.gz" -mtime +28 -delete
Database Backup Automation
PostgreSQL Backup Script:
#!/bin/bash
# PostgreSQL backup script
BACKUP_DIR="/mnt/swarm-data/postgres/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Get PostgreSQL container ID
POSTGRES_CONTAINER=$(docker ps --filter "name=postgresql17_postgres" --format "{{.ID}}")
# Backup all databases
docker exec "$POSTGRES_CONTAINER" pg_dumpall -U admin > "$BACKUP_DIR/postgres_all_$DATE.sql"
# Individual database backups
for db in authentik paperless vikunja nextcloud; do
docker exec "$POSTGRES_CONTAINER" pg_dump -U admin "$db" > "$BACKUP_DIR/postgres_${db}_$DATE.sql"
done
# Compress old backups
find "$BACKUP_DIR" -name "*.sql" -mtime +7 -exec gzip {} \;
echo "PostgreSQL backup completed: $BACKUP_DIR"
MariaDB Backup Script:
#!/bin/bash
# MariaDB backup script
BACKUP_DIR="/mnt/swarm-data/mariadb/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Get MariaDB container ID
MARIADB_CONTAINER=$(docker ps --filter "name=mariadb_mariadb" --format "{{.ID}}")
# Backup BookStack database
docker exec "$MARIADB_CONTAINER" mysqldump -u root -p[SECRET] bookstackapp > "$BACKUP_DIR/bookstack_$DATE.sql"
# Compress old backups
find "$BACKUP_DIR" -name "*.sql" -mtime +7 -exec gzip {} \;
echo "MariaDB backup completed: $BACKUP_DIR"
Disaster Recovery Planning
Complete System Recovery Procedure:
- Prepare New Hardware:
# Install Ubuntu 24.04 LTS
# Install Docker Engine 28.4.0
# Configure user accounts and SSH access
- Restore Storage Structure:
# Mount storage device to /mnt
# Restore backup
cd /mnt
tar -xzf swarm_backup_YYYYMMDD_HHMMSS.tar.gz
cp -r swarm_backup_YYYYMMDD_HHMMSS/swarm-data /mnt/
cp -r swarm_backup_YYYYMMDD_HHMMSS/docker-configs /mnt/
- Initialize Docker Swarm:
# On manager node
docker swarm init --advertise-addr 10.0.4.11
# On worker nodes
docker swarm join --token [worker-token] 10.0.4.11:2377
- Create Networks:
docker network create --driver overlay --attachable homelab
- Deploy Stacks in Order:
# Infrastructure first
docker stack deploy -c /mnt/docker-configs/swarm/traefik/traefik-stack.yml traefik
docker stack deploy -c /mnt/docker-configs/swarm/database/master-db.yml postgresql17
docker stack deploy -c /mnt/docker-configs/swarm/database/mariab-service.yml mariadb
# Authentication
docker stack deploy -c /mnt/docker-configs/swarm/authentication/authentik-stack.yml auth
# Applications
docker stack deploy -c /mnt/docker-configs/swarm/applications/nextcloud-stack.yml nextcloud
docker stack deploy -c /mnt/docker-configs/swarm/applications/paperless-stack.yml paperless
# ... continue for all stacks
- Verify Recovery:
docker service ls
docker node ls
# Test application access
Recovery Time Objectives:
- Database Recovery: 30 minutes
- Application Recovery: 1-2 hours
- Complete System Recovery: 4-6 hours