Backup & Restore¶
Comprehensive backup and disaster recovery procedures for Mailborder.
Backup Types¶
Full System Backup¶
Complete backup of everything:
Includes: - All configuration files - Database (structure and data) - Custom rules and policies - SSL certificates - User data and settings - Quarantine contents - Logs (optional)
Output location:
Configuration-Only Backup¶
Backup configuration files:
Includes: - /etc/mailborder/ - /etc/postfix/ - /etc/rspamd/ - /etc/clamav/ - /etc/nginx/sites-available/mailborder - /etc/php/8.2/fpm/pool.d/mailborder.conf - SystemD unit files
Use case: Quick backup before configuration changes.
Database-Only Backup¶
Backup database:
Manual database backup:
Backup specific tables:
sudo mysqldump mailborder mb_users mb_auth_passkeys mb_auth_totp | \
gzip > /var/backups/mailborder/users-$(date +%Y%m%d).sql.gz
Incremental Backup¶
Backup only changes since last full backup:
Requires previous full backup reference.
Automated Backups¶
Schedule Daily Backups¶
Configure backup schedule:
sudo mb-config set backup.enabled true
sudo mb-config set backup.schedule "daily 02:00"
sudo mb-config set backup.retention_days 30
sudo mb-config set backup.destination /var/backups/mailborder/
Verify schedule:
Backup to Remote Location¶
Configure remote backup:
sudo mb-config set backup.remote_enabled true
sudo mb-config set backup.remote_host backup.example.com
sudo mb-config set backup.remote_user backup
sudo mb-config set backup.remote_path /backups/mailborder/
Setup SSH key authentication:
sudo ssh-keygen -t ed25519 -f /root/.ssh/mailborder_backup
sudo ssh-copy-id -i /root/.ssh/mailborder_backup.pub backup@backup.example.com
Test remote backup:
Cloud Backup¶
Backup to S3-compatible storage:
# Install s3cmd
sudo apt install s3cmd
# Configure
sudo s3cmd --configure
# Backup to S3
sudo mb-backup --full --output /tmp/backup.tar.gz
sudo s3cmd put /tmp/backup.tar.gz s3://mailborder-backups/
sudo rm /tmp/backup.tar.gz
Automate with script:
sudo tee /usr/local/bin/mb-backup-s3.sh << 'EOF'
#!/bin/bash
BACKUP_FILE="/tmp/mailborder-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
mb-backup --full --output "$BACKUP_FILE"
s3cmd put "$BACKUP_FILE" s3://mailborder-backups/
rm "$BACKUP_FILE"
EOF
sudo chmod +x /usr/local/bin/mb-backup-s3.sh
Add to cron:
Backup Verification¶
Test Backup Integrity¶
Verify backup file:
Manual verification:
# Test archive integrity
tar tzf /var/backups/mailborder/full-backup-20251112.tar.gz > /dev/null
echo $? # Should return 0
# List contents
tar tzf /var/backups/mailborder/full-backup-20251112.tar.gz | head -n 20
Test Restore Procedure¶
Test restore to temporary location:
sudo mkdir /tmp/restore-test
sudo tar xzf /var/backups/mailborder/full-backup-20251112.tar.gz -C /tmp/restore-test
ls -la /tmp/restore-test
sudo rm -rf /tmp/restore-test
Verify database backup:
# Test restore to temporary database
gunzip < /var/backups/mailborder/db-20251112.sql.gz | sudo mysql -e "CREATE DATABASE mailborder_test"
gunzip < /var/backups/mailborder/db-20251112.sql.gz | sudo mysql mailborder_test
sudo mysql mailborder_test -e "SELECT COUNT(*) FROM mb_users"
sudo mysql -e "DROP DATABASE mailborder_test"
Restore Procedures¶
Full System Restore¶
Complete system restoration:
Step 1: Stop services
Step 2: Restore backup
Step 3: Verify configuration
Step 4: Start services
Step 5: Verify functionality
Configuration Restore¶
Restore configuration only:
sudo mb-restore --config --from /var/backups/mailborder/config-20251112.tar.gz
sudo systemctl daemon-reload
sudo mb-services restart
Database Restore¶
Restore database:
Step 1: Backup current database (safety)
Step 2: Stop services
Step 3: Restore database
Alternative: Drop and recreate
sudo mysql -e "DROP DATABASE mailborder"
sudo mysql -e "CREATE DATABASE mailborder"
gunzip < /var/backups/mailborder/db-20251112.sql.gz | sudo mysql mailborder
Step 4: Verify
Step 5: Start services
Selective Restore¶
Restore specific files:
# Extract specific file from backup
sudo tar xzf /var/backups/mailborder/full-backup-20251112.tar.gz \
-C / etc/mailborder/mailborder.conf
# Restart affected service
sudo systemctl restart mb-rpcd
Restore specific database table:
# Extract table from backup
gunzip < /var/backups/mailborder/db-20251112.sql.gz | \
sed -n '/CREATE TABLE `mb_users`/,/UNLOCK TABLES/p' | \
sudo mysql mailborder
Disaster Recovery¶
Complete System Loss¶
Rebuild from scratch:
Step 1: Install Mailborder package
Step 2: Stop services
Step 3: Restore from backup
Step 4: Reconfigure network settings (if changed)
Step 5: Start services
Step 6: Verify everything
Step 7: Test email flow
Partial System Failure¶
Database corruption:
# Restore database only
sudo systemctl stop mb-rpcd mb-filter
sudo mysql -e "DROP DATABASE mailborder"
sudo mysql -e "CREATE DATABASE mailborder"
gunzip < /var/backups/mailborder/db-latest.sql.gz | sudo mysql mailborder
sudo systemctl start mb-rpcd mb-filter
Configuration corruption:
# Restore configuration only
sudo mb-restore --config --from /var/backups/mailborder/config-latest.tar.gz
sudo systemctl daemon-reload
sudo mb-services restart
Point-in-Time Recovery¶
Restore to specific date/time:
Step 1: Identify backup
Step 2: Restore selected backup
Step 3: Apply transaction logs (if available)
# Restore binary logs from MySQL
sudo mysqlbinlog /var/log/mysql/mysql-bin.000001 | sudo mysql mailborder
Backup Best Practices¶
Recommendations¶
3-2-1 Rule: - 3 copies of data - 2 different storage types - 1 off-site backup
Frequency: - Full backup: Daily during low-traffic hours - Database backup: Every 6 hours - Configuration backup: Before any changes - Off-site backup: Daily
Retention: - Daily backups: 30 days - Weekly backups: 3 months - Monthly backups: 1 year - Yearly backups: 3-7 years (compliance)
Verification: - Test restore monthly - Verify backup integrity weekly - Document restore procedures - Practice disaster recovery quarterly
Security Considerations¶
Encrypt backups:
# Encrypt backup with GPG
sudo mb-backup --full --output /tmp/backup.tar.gz
gpg --encrypt --recipient admin@example.com /tmp/backup.tar.gz
mv /tmp/backup.tar.gz.gpg /var/backups/mailborder/
rm /tmp/backup.tar.gz
Decrypt and restore:
gpg --decrypt /var/backups/mailborder/backup.tar.gz.gpg > /tmp/backup.tar.gz
sudo mb-restore --full --from /tmp/backup.tar.gz
rm /tmp/backup.tar.gz
Secure backup storage:
# Set proper permissions
sudo chmod 600 /var/backups/mailborder/*.tar.gz
sudo chown root:root /var/backups/mailborder/*.tar.gz
# Encrypt backup directory
sudo apt install ecryptfs-utils
sudo mount -t ecryptfs /var/backups/mailborder /var/backups/mailborder
Backup Monitoring¶
Check Backup Status¶
View backup history:
Output:
Backup History:
2025-11-12 02:00 - Full backup successful (2.3 GB)
2025-11-11 02:00 - Full backup successful (2.2 GB)
2025-11-10 02:00 - Full backup successful (2.1 GB)
2025-11-09 02:00 - Full backup failed (disk space)
Check backup size trends:
Backup Alerts¶
Configure backup notifications:
sudo mb-config set backup.notify_on_success false
sudo mb-config set backup.notify_on_failure true
sudo mb-config set backup.notification_email admin@example.com
Manual test notification:
Backup Cleanup¶
Manual Cleanup¶
Remove old backups:
# Remove backups older than 30 days
sudo find /var/backups/mailborder/ -name "*.tar.gz" -mtime +30 -delete
Keep only last N backups:
# Keep last 10 backups
cd /var/backups/mailborder/
sudo ls -t full-backup-*.tar.gz | tail -n +11 | xargs rm -f
Automated Cleanup¶
Configure retention:
Cleanup runs automatically after each backup.
Special Backup Scenarios¶
Pre-Update Backup¶
Before system update:
Pre-Migration Backup¶
Before major changes:
Quarantine Backup¶
Backup quarantine contents:
sudo tar czf /var/backups/mailborder/quarantine-$(date +%Y%m%d).tar.gz \
/var/spool/mailborder/quarantine/
Custom Rules Backup¶
Backup custom configurations:
sudo tar czf /var/backups/mailborder/custom-rules-$(date +%Y%m%d).tar.gz \
/etc/mailborder/custom/ \
/etc/rspamd/local.d/ \
/etc/postfix/mailborder_*
Restore Troubleshooting¶
Common Issues¶
Restore fails due to running services:
sudo mb-services stop
sudo mb-restore --full --from /var/backups/mailborder/backup.tar.gz
sudo mb-services start
Permission errors:
# Fix ownership after restore
sudo chown -R mailborder:mailborder /etc/mailborder
sudo chown -R www-data:www-data /srv/mailborder
sudo chown -R clamav:clamav /var/lib/clamav
Database restore errors:
# Check for existing database locks
sudo mysql -e "SHOW PROCESSLIST"
sudo mysql -e "KILL <process_id>"
# Retry restore
gunzip < backup.sql.gz | sudo mysql mailborder
Disk space issues: