Files
EmailHostingPlatform/backup-email-server.sh
Tommy Parnell e9c35bdc8d init
2025-08-03 11:36:44 -04:00

180 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# Email Server Backup Script
# Creates backups of email server configuration and data
set -euo pipefail
# Configuration
BACKUP_DIR="/var/backups/email-server"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="email-backup-$DATE"
RETENTION_DAYS=30
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
info() {
echo -e "${BLUE}INFO: $1${NC}"
log "INFO: $1"
}
success() {
echo -e "${GREEN}SUCCESS: $1${NC}"
log "SUCCESS: $1"
}
error() {
echo -e "${RED}ERROR: $1${NC}" >&2
log "ERROR: $1"
exit 1
}
# Create backup directory
create_backup_dir() {
info "Creating backup directory..."
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"
}
# Backup PostgreSQL database
backup_database() {
info "Backing up PostgreSQL database..."
sudo -u postgres pg_dump postfix > "$BACKUP_DIR/$BACKUP_NAME/postfix_db.sql"
success "Database backup completed"
}
# Backup configuration files
backup_configs() {
info "Backing up configuration files..."
# Postfix
cp -r /etc/postfix "$BACKUP_DIR/$BACKUP_NAME/"
# Dovecot
cp -r /etc/dovecot "$BACKUP_DIR/$BACKUP_NAME/"
# Amavis
cp -r /etc/amavis "$BACKUP_DIR/$BACKUP_NAME/"
# OpenDKIM
cp -r /etc/opendkim "$BACKUP_DIR/$BACKUP_NAME/"
# SpamAssassin
cp -r /etc/spamassassin "$BACKUP_DIR/$BACKUP_NAME/"
# PostfixAdmin
if [[ -d "/var/www/postfixadmin" ]]; then
cp -r /var/www/postfixadmin "$BACKUP_DIR/$BACKUP_NAME/"
fi
# Apache configuration
cp -r /etc/apache2/sites-available "$BACKUP_DIR/$BACKUP_NAME/apache2-sites/"
success "Configuration backup completed"
}
# Backup SSL certificates
backup_ssl() {
info "Backing up SSL certificates..."
if [[ -d "/etc/letsencrypt" ]]; then
cp -r /etc/letsencrypt "$BACKUP_DIR/$BACKUP_NAME/"
success "SSL certificates backup completed"
else
info "No SSL certificates found to backup"
fi
}
# Backup mail data (optional - can be large)
backup_mail_data() {
if [[ "${1:-}" == "--include-mail" ]]; then
info "Backing up mail data (this may take a while)..."
if [[ -d "/var/mail/vhosts" ]]; then
tar -czf "$BACKUP_DIR/$BACKUP_NAME/mail_data.tar.gz" -C /var/mail vhosts
success "Mail data backup completed"
else
info "No mail data found to backup"
fi
else
info "Skipping mail data backup (use --include-mail to include)"
fi
}
# Create compressed archive
create_archive() {
info "Creating compressed archive..."
cd "$BACKUP_DIR"
tar -czf "$BACKUP_NAME.tar.gz" "$BACKUP_NAME"
rm -rf "$BACKUP_NAME"
success "Archive created: $BACKUP_DIR/$BACKUP_NAME.tar.gz"
}
# Cleanup old backups
cleanup_old_backups() {
info "Cleaning up backups older than $RETENTION_DAYS days..."
find "$BACKUP_DIR" -name "email-backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
success "Old backups cleaned up"
}
# Display backup information
show_backup_info() {
echo
echo -e "${GREEN}Backup completed successfully!${NC}"
echo "Backup location: $BACKUP_DIR/$BACKUP_NAME.tar.gz"
echo "Backup size: $(du -h "$BACKUP_DIR/$BACKUP_NAME.tar.gz" | cut -f1)"
echo
echo "To restore this backup:"
echo "1. Extract: tar -xzf $BACKUP_NAME.tar.gz"
echo "2. Stop services: systemctl stop postfix dovecot amavis apache2"
echo "3. Restore configurations to their original locations"
echo "4. Restore database: sudo -u postgres psql postfix < postfix_db.sql"
echo "5. Restart services: systemctl start postfix dovecot amavis apache2"
}
# Main function
main() {
echo -e "${BLUE}Email Server Backup Script${NC}"
echo "=========================="
echo
# Check if running as root
if [[ $EUID -ne 0 ]]; then
error "This script must be run as root"
fi
create_backup_dir
backup_database
backup_configs
backup_ssl
backup_mail_data "$@"
create_archive
cleanup_old_backups
show_backup_info
}
# Show usage if help requested
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
echo "Usage: $0 [--include-mail]"
echo
echo "Options:"
echo " --include-mail Include mail data in backup (can be large)"
echo " --help, -h Show this help message"
echo
echo "This script backs up:"
echo " - PostgreSQL database"
echo " - Configuration files (Postfix, Dovecot, Amavis, OpenDKIM, etc.)"
echo " - SSL certificates"
echo " - PostfixAdmin installation"
echo " - Mail data (if --include-mail is specified)"
exit 0
fi
main "$@"