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