Skip to content

Instantly share code, notes, and snippets.

@groundcat
Created November 1, 2025 04:52
Show Gist options
  • Select an option

  • Save groundcat/cb0b5de78b3d80d051082860ef807e21 to your computer and use it in GitHub Desktop.

Select an option

Save groundcat/cb0b5de78b3d80d051082860ef807e21 to your computer and use it in GitHub Desktop.
backup solution for Namingo registry system with automated R2 upload
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment