sudo nano /usr/local/bin/namingo-backup.sh
sudo chmod +x /usr/local/bin/namingo-backup.sh
sudo /usr/local/bin/namingo-backup.sh
sudo crontab -e
Add this line:
0 2 * * * /usr/local/bin/namingo-backup.sh >> /var/log/namingo-backup.log 2>&1
sudo nano /usr/local/bin/namingo-backup.sh
sudo chmod +x /usr/local/bin/namingo-backup.sh
sudo /usr/local/bin/namingo-backup.sh
sudo crontab -e
Add this line:
0 2 * * * /usr/local/bin/namingo-backup.sh >> /var/log/namingo-backup.log 2>&1
| #!/bin/bash | |
| # Namingo Backup Script | |
| # Creates dated backups and uploads to R2 via rclone | |
| set -e # Exit on error | |
| # Configuration | |
| BACKUP_DIR="/tmp/namingo-backup" | |
| DATE=$(date +%F_%H-%M-%S) | |
| RCLONE_REMOTE="RCLONE_NAME:BUCKET" # REPLACE ME ! | |
| ENV_FILE="/var/www/cp/.env" | |
| # Colors for output | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| NC='\033[0m' # No Color | |
| # Logging function | |
| log() { | |
| echo -e "${GREEN}[$(date +%T)]${NC} $1" | |
| } | |
| error() { | |
| echo -e "${RED}[$(date +%T)] ERROR:${NC} $1" | |
| exit 1 | |
| } | |
| warn() { | |
| echo -e "${YELLOW}[$(date +%T)] WARNING:${NC} $1" | |
| } | |
| # Create backup directory | |
| log "Creating backup directory: $BACKUP_DIR/$DATE" | |
| mkdir -p "$BACKUP_DIR/$DATE" || error "Failed to create backup directory" | |
| cd "$BACKUP_DIR/$DATE" | |
| # Extract MySQL credentials from .env | |
| log "Reading MySQL credentials from $ENV_FILE" | |
| if [ ! -f "$ENV_FILE" ]; then | |
| error ".env file not found at $ENV_FILE" | |
| fi | |
| DB_HOST=$(grep "^DB_HOST=" "$ENV_FILE" | cut -d'=' -f2) | |
| DB_DATABASE=$(grep "^DB_DATABASE=" "$ENV_FILE" | cut -d'=' -f2) | |
| DB_USERNAME=$(grep "^DB_USERNAME=" "$ENV_FILE" | cut -d'=' -f2) | |
| DB_PASSWORD=$(grep "^DB_PASSWORD=" "$ENV_FILE" | cut -d'=' -f2) | |
| DB_PORT=$(grep "^DB_PORT=" "$ENV_FILE" | cut -d'=' -f2) | |
| if [ -z "$DB_USERNAME" ] || [ -z "$DB_PASSWORD" ] || [ -z "$DB_DATABASE" ]; then | |
| error "Failed to extract MySQL credentials from .env file" | |
| fi | |
| log "MySQL credentials loaded successfully" | |
| # Backup MySQL/MariaDB database | |
| log "Backing up database: $DB_DATABASE" | |
| # Detect if mariadb-dump or mysqldump is available | |
| if command -v mariadb-dump &> /dev/null; then | |
| DUMP_CMD="mariadb-dump" | |
| else | |
| DUMP_CMD="mysqldump" | |
| fi | |
| $DUMP_CMD --single-transaction --routines --triggers --events \ | |
| --default-character-set=utf8mb4 \ | |
| -h "$DB_HOST" \ | |
| -P "$DB_PORT" \ | |
| -u "$DB_USERNAME" \ | |
| -p"$DB_PASSWORD" \ | |
| "$DB_DATABASE" | gzip > "registry-$DATE.sql.gz" || error "Database dump failed" | |
| log "Database backup completed: registry-$DATE.sql.gz" | |
| # Backup /opt/registry | |
| log "Backing up /opt/registry..." | |
| sudo tar -czf "opt-registry-$DATE.tar.gz" -C /opt registry 2>/dev/null || warn "Failed to backup /opt/registry" | |
| # Backup /var/www/cp | |
| log "Backing up /var/www/cp..." | |
| sudo tar -czf "var-www-cp-$DATE.tar.gz" -C /var/www cp 2>/dev/null || warn "Failed to backup /var/www/cp" | |
| # Backup /var/www/whois | |
| log "Backing up /var/www/whois..." | |
| sudo tar -czf "var-www-whois-$DATE.tar.gz" -C /var/www whois 2>/dev/null || warn "Failed to backup /var/www/whois" | |
| # Backup /usr/share/adminer (if exists) | |
| if [ -d "/usr/share/adminer" ]; then | |
| log "Backing up /usr/share/adminer..." | |
| sudo tar -czf "adminer-$DATE.tar.gz" -C /usr/share adminer 2>/dev/null || warn "Failed to backup adminer" | |
| fi | |
| # Backup web server config (detect which one is installed) | |
| if [ -d "/etc/caddy" ]; then | |
| log "Backing up Caddy configuration..." | |
| sudo tar -czf "etc-caddy-$DATE.tar.gz" -C /etc caddy 2>/dev/null || warn "Failed to backup Caddy config" | |
| elif [ -d "/etc/nginx/sites-available" ]; then | |
| log "Backing up Nginx configuration..." | |
| sudo tar -czf "etc-nginx-sites-$DATE.tar.gz" -C /etc nginx/sites-available nginx/sites-enabled 2>/dev/null || warn "Failed to backup Nginx config" | |
| elif [ -d "/etc/apache2/sites-available" ]; then | |
| log "Backing up Apache configuration..." | |
| sudo tar -czf "etc-apache-sites-$DATE.tar.gz" -C /etc apache2/sites-available apache2/sites-enabled 2>/dev/null || warn "Failed to backup Apache config" | |
| fi | |
| # Backup systemd service files | |
| log "Backing up systemd service files..." | |
| sudo tar -czf "systemd-namingo-units-$DATE.tar.gz" -C /etc/systemd/system \ | |
| whois.service rdap.service epp.service das.service msg_producer.service msg_worker.service \ | |
| namingo-epp-reload.service namingo-epp-reload.path 2>/dev/null || warn "Some systemd units may not exist" | |
| # Backup logs (optional) | |
| if [ -d "/var/log/namingo" ]; then | |
| log "Backing up Namingo logs..." | |
| sudo tar -czf "var-log-namingo-$DATE.tar.gz" -C /var/log namingo 2>/dev/null || warn "Failed to backup logs" | |
| fi | |
| # Backup TMCH certificates (if they exist) | |
| if [ -f "/etc/ssl/certs/tmch.pem" ] || [ -f "/etc/ssl/certs/tmch_pilot.pem" ]; then | |
| log "Backing up TMCH certificates..." | |
| sudo tar -czf "tmch-certs-$DATE.tar.gz" -C /etc/ssl/certs tmch.pem tmch_pilot.pem 2>/dev/null || warn "Failed to backup TMCH certs" | |
| fi | |
| # Fix permissions for rclone upload | |
| log "Adjusting file permissions..." | |
| sudo chown -R $USER:$USER "$BACKUP_DIR/$DATE" | |
| # Calculate total backup size | |
| BACKUP_SIZE=$(du -sh "$BACKUP_DIR/$DATE" | cut -f1) | |
| log "Total backup size: $BACKUP_SIZE" | |
| # Upload to R2 via rclone | |
| log "Uploading backups to R2: $RCLONE_REMOTE/$DATE/" | |
| rclone copy "$BACKUP_DIR/$DATE" "$RCLONE_REMOTE/$DATE/" --progress || error "rclone upload failed" | |
| log "Verifying upload..." | |
| rclone ls "$RCLONE_REMOTE/$DATE/" > /dev/null || error "Upload verification failed" | |
| # Delete local backup | |
| log "Cleaning up local backups..." | |
| sudo rm -rf "$BACKUP_DIR/$DATE" || warn "Failed to delete local backup directory" | |
| log "${GREEN}✓${NC} Backup completed successfully!" | |
| log "Remote location: $RCLONE_REMOTE/$DATE/" | |
| exit 0 |