#!/usr/bin/env bash # Bezalel Database Backup — MemPalace + Evennia + Fleet # Runs nightly after re-mine completes. Keeps 7 days of rolling backups. set -euo pipefail BACKUP_BASE="/root/wizards/bezalel/home/backups" DATE=$(date +%Y%m%d_%H%M%S) LOG="/var/log/bezalel_db_backup.log" # Sources LOCAL_PALACE="/root/wizards/bezalel/.mempalace/palace" FLEET_PALACE="/var/lib/mempalace/fleet" EVENNIA_DB="/root/wizards/bezalel/evennia/bezalel_world/server/evennia.db3" # Destinations LOCAL_BACKUP="${BACKUP_BASE}/mempalace/mempalace_${DATE}.tar.gz" FLEET_BACKUP="${BACKUP_BASE}/fleet/fleet_${DATE}.tar.gz" EVENNIA_BACKUP="${BACKUP_BASE}/evennia/evennia_${DATE}.db3.gz" log() { echo "[$(date -Iseconds)] $1" | tee -a "$LOG" } log "Starting database backup cycle..." # 1. Backup local MemPalace tar -czf "$LOCAL_BACKUP" -C "$(dirname "$LOCAL_PALACE")" "$(basename "$LOCAL_PALACE")" log "Local palace backed up: ${LOCAL_BACKUP} ($(du -h "$LOCAL_BACKUP" | cut -f1))" # 2. Backup fleet MemPalace tar -czf "$FLEET_BACKUP" -C "$(dirname "$FLEET_PALACE")" "$(basename "$FLEET_PALACE")" log "Fleet palace backed up: ${FLEET_BACKUP} ($(du -h "$FLEET_BACKUP" | cut -f1))" # 3. Backup Evennia DB (gzip for space) gzip -c "$EVENNIA_DB" > "$EVENNIA_BACKUP" log "Evennia DB backed up: ${EVENNIA_BACKUP} ($(du -h "$EVENNIA_BACKUP" | cut -f1))" # 4. Prune backups older than 7 days find "${BACKUP_BASE}/mempalace" -name 'mempalace_*.tar.gz' -mtime +7 -delete find "${BACKUP_BASE}/fleet" -name 'fleet_*.tar.gz' -mtime +7 -delete find "${BACKUP_BASE}/evennia" -name 'evennia_*.db3.gz' -mtime +7 -delete log "Pruned backups older than 7 days" # 5. Report counts MP_COUNT=$(find "${BACKUP_BASE}/mempalace" -name 'mempalace_*.tar.gz' | wc -l) FL_COUNT=$(find "${BACKUP_BASE}/fleet" -name 'fleet_*.tar.gz' | wc -l) EV_COUNT=$(find "${BACKUP_BASE}/evennia" -name 'evennia_*.db3.gz' | wc -l) log "Backup cycle complete. Retained: mempalace=${MP_COUNT}, fleet=${FL_COUNT}, evennia=${EV_COUNT}" touch /var/lib/bezalel/heartbeats/db_backup.last