Backup and Recovery

Complete guide for backing up and recovering NazDocker Lab data and configuration.

💾 Backup Strategies

User Data Backup

# Backup all user data (both Alpine and Ubuntu)
tar -czf lab-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/

# Backup Alpine data only
tar -czf alpine-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/alpine/

# Backup Ubuntu data only
tar -czf ubuntu-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/ubuntu/

# Backup specific user (Alpine)
tar -czf alpine-user1-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/alpine/user1/

# Backup specific user (Ubuntu)
tar -czf ubuntu-user1-backup-$(date +%Y%m%d-%H%M%S).tar.gz data/ubuntu/user1/

# Backup with compression and exclusions
tar -czf lab-backup-$(date +%Y%m%d).tar.gz data/ --exclude='*.tmp' --exclude='*.log'

Configuration Backup

# Backup Docker configuration
docker-compose -f docker-compose.ubuntu.yml config > docker-compose-backup-$(date +%Y%m%d).yml

# Backup Dockerfile
cp Dockerfile.ubuntu Dockerfile.ubuntu.backup-$(date +%Y%m%d)

# Backup environment variables (without sensitive data)
cp .env.example .env.example.backup-$(date +%Y%m%d)

Complete System Backup

#!/bin/bash
# complete-backup.sh

BACKUP_DIR="backups/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "Creating backup in $BACKUP_DIR..."

# Backup user data
tar -czf "$BACKUP_DIR/user-data.tar.gz" data/

# Backup configuration
cp docker-compose.ubuntu.yml "$BACKUP_DIR/"
cp Dockerfile.ubuntu "$BACKUP_DIR/"
cp .env.example "$BACKUP_DIR/"

# Backup container state
docker-compose ps > "$BACKUP_DIR/container-status.txt"

echo "Backup completed: $BACKUP_DIR"

🔄 Restore Procedures

Restore User Data

# Restore all data (both Alpine and Ubuntu)
tar -xzf lab-backup-20231201-143022.tar.gz

# Restore Alpine data only
tar -xzf alpine-backup-20231201-143022.tar.gz

# Restore Ubuntu data only
tar -xzf ubuntu-backup-20231201-143022.tar.gz

# Restore specific user (Alpine)
tar -xzf alpine-user1-backup-20231201-143022.tar.gz

# Restore specific user (Ubuntu)
tar -xzf ubuntu-user1-backup-20231201-143022.tar.gz

# Verify restoration
ls -la data/alpine/
ls -la data/ubuntu/

Restore Configuration

# Restore Docker Compose configuration
cp docker-compose-backup-20231201.yml docker-compose.ubuntu.yml

# Restore Dockerfile
cp Dockerfile.ubuntu.backup-20231201 Dockerfile.ubuntu

# Rebuild container
docker-compose -f docker-compose.ubuntu.yml up -d --build

Complete System Restore

#!/bin/bash
# complete-restore.sh

BACKUP_DIR=$1
if [ -z "$BACKUP_DIR" ]; then
    echo "Usage: $0 <backup_directory>"
    exit 1
fi

echo "Restoring from $BACKUP_DIR..."

# Stop container
docker-compose -f docker-compose.ubuntu.yml down

# Restore user data
tar -xzf "$BACKUP_DIR/user-data.tar.gz"

# Restore configuration
cp "$BACKUP_DIR/docker-compose.ubuntu.yml" ./
cp "$BACKUP_DIR/Dockerfile.ubuntu" ./

# Start container
docker-compose -f docker-compose.ubuntu.yml up -d --build

echo "Restore completed"

🤖 Automated Backup Scripts

Automated Backup Script

#!/bin/bash
# automated-backup.sh

BACKUP_DIR="backups/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "Starting automated backup at $(date)..."

# Stop container to ensure data consistency
docker-compose -f docker-compose.ubuntu.yml stop

# Backup user data
tar -czf "$BACKUP_DIR/user-data.tar.gz" data/

# Backup configuration
cp docker-compose.ubuntu.yml "$BACKUP_DIR/"
cp Dockerfile.ubuntu "$BACKUP_DIR/"
cp start.sh "$BACKUP_DIR/"

# Start container
docker-compose -f docker-compose.ubuntu.yml start

echo "Automated backup completed: $BACKUP_DIR"

Alpine Backup Script

#!/bin/bash
# backup-alpine.sh

BACKUP_DIR="backups/$(date +%Y%m%d-%H%M%S)-alpine"
mkdir -p "$BACKUP_DIR"

echo "Creating Alpine backup in $BACKUP_DIR..."

# Backup user data
tar -czf "$BACKUP_DIR/user-data.tar.gz" data/

# Backup configuration
cp docker-compose.alpine.yml "$BACKUP_DIR/"
cp Dockerfile.alpine "$BACKUP_DIR/"
cp start.sh "$BACKUP_DIR/"

# Backup container state
docker-compose -f docker-compose.alpine.yml ps > "$BACKUP_DIR/container-status.txt"

echo "Alpine backup completed: $BACKUP_DIR"

📊 Backup Verification

Verify Backup Integrity

# Check backup file size
ls -lh lab-backup-*.tar.gz

# Verify backup contents
tar -tzf lab-backup-20231201.tar.gz | head -20

# Test backup extraction
tar -tzf lab-backup-20231201.tar.gz > /dev/null && echo "Backup is valid" || echo "Backup is corrupted"

Verify Restored Data

# Check user data integrity
ls -la data/
du -sh data/*

# Verify user accounts
docker-compose -f docker-compose.ubuntu.yml exec lab-environment-ubuntu bash -c "
cat /etc/passwd | grep -E ':(/bin/bash|/bin/sh)$'
"

# Check file permissions
docker-compose -f docker-compose.ubuntu.yml exec lab-environment-ubuntu bash -c "
ls -la /home/
"

🔄 Incremental Backup

Incremental Backup Script

#!/bin/bash
# incremental-backup.sh

LAST_BACKUP="backups/last-backup.txt"
CURRENT_TIME=$(date +%s)

# Create backup directory
BACKUP_DIR="backups/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"

# Check if this is the first backup
if [ ! -f "$LAST_BACKUP" ]; then
    echo "Creating full backup..."
    tar -czf "$BACKUP_DIR/full-backup.tar.gz" data/
    echo "$CURRENT_TIME" > "$LAST_BACKUP"
else
    echo "Creating incremental backup..."
    LAST_TIME=$(cat "$LAST_BACKUP")
    
    # Find files modified since last backup
    find data/ -newermt "@$LAST_TIME" -type f > "$BACKUP_DIR/changed-files.txt"
    
    # Create incremental backup
    tar -czf "$BACKUP_DIR/incremental-backup.tar.gz" -T "$BACKUP_DIR/changed-files.txt"
    
    echo "$CURRENT_TIME" > "$LAST_BACKUP"
fi

echo "Incremental backup completed: $BACKUP_DIR"

🗂️ Backup Organization

Backup Directory Structure

backups/
├── 20231201-143022/
│   ├── user-data.tar.gz          # All user data (Alpine + Ubuntu)
│   ├── alpine-data.tar.gz        # Alpine data only
│   ├── ubuntu-data.tar.gz        # Ubuntu data only
│   ├── docker-compose.ubuntu.yml
│   ├── docker-compose.alpine.yml
│   ├── Dockerfile.ubuntu
│   ├── Dockerfile.alpine
│   └── container-status.txt
├── 20231202-091500/
│   ├── user-data.tar.gz
│   ├── alpine-data.tar.gz
│   ├── ubuntu-data.tar.gz
│   ├── docker-compose.ubuntu.yml
│   ├── docker-compose.alpine.yml
│   ├── Dockerfile.ubuntu
│   ├── Dockerfile.alpine
│   └── container-status.txt
└── last-backup.txt

Backup Retention Policy

#!/bin/bash
# cleanup-old-backups.sh

# Keep backups for 30 days
find backups/ -type d -name "2023*" -mtime +30 -exec rm -rf {} \;

# Keep only last 10 backups
ls -t backups/ | tail -n +11 | xargs -I {} rm -rf backups/{}

echo "Old backups cleaned up"

🚨 Emergency Recovery

Emergency Backup

#!/bin/bash
# emergency-backup.sh

echo "Creating emergency backup..."

# Quick backup before emergency procedures
docker cp student-lab-ubuntu:/home ./emergency-backup-$(date +%Y%m%d-%H%M%S)

# Backup configuration
cp docker-compose.ubuntu.yml ./emergency-backup-$(date +%Y%m%d-%H%M%S)-config.yml

echo "Emergency backup completed"

Emergency Restore

#!/bin/bash
# emergency-restore.sh

BACKUP_DIR=$1
if [ -z "$BACKUP_DIR" ]; then
    echo "Usage: $0 <emergency_backup_directory>"
    exit 1
fi

echo "Emergency restore from $BACKUP_DIR..."

# Stop container
docker-compose -f docker-compose.ubuntu.yml down

# Restore data
cp -r "$BACKUP_DIR"/* data/

# Start container
docker-compose -f docker-compose.ubuntu.yml up -d

echo "Emergency restore completed"

🔍 Backup Monitoring

Backup Status Check

#!/bin/bash
# backup-status.sh

echo "=== Backup Status ==="
echo ""

echo "Recent backups:"
ls -la backups/ | tail -10
echo ""

echo "Backup sizes:"
du -sh backups/*
echo ""

echo "Last backup time:"
if [ -f "backups/last-backup.txt" ]; then
    date -d "@$(cat backups/last-backup.txt)"
else
    echo "No backup timestamp found"
fi
echo ""

echo "Available disk space:"
df -h .
echo ""