#!/bin/bash # World backup — local snapshot + optional Google Drive upload TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/data/bedrock-server/backups" WORLD_DIR="/data/bedrock-server/worlds" LOG="/data/logs/backup.log" MAX_LOCAL=10 log() { echo "$(date '+%Y-%m-%d %H:%M:%S') [BACKUP] $*" | tee -a "$LOG"; } mkdir -p "$BACKUP_DIR" # ── Check world exists ──────────────────────────────────────────────── if [ ! -d "$WORLD_DIR" ] || [ -z "$(ls -A "$WORLD_DIR" 2>/dev/null)" ]; then log "No world data found yet — skipping." exit 0 fi # ── Local backup ────────────────────────────────────────────────────── BACKUP_FILE="$BACKUP_DIR/world_$TIMESTAMP.tar.gz" log "Creating local backup: $BACKUP_FILE" tar -czf "$BACKUP_FILE" -C "$(dirname "$WORLD_DIR")" worlds/ if [ $? -ne 0 ]; then log "ERROR: Local backup failed!" exit 1 fi SIZE=$(du -sh "$BACKUP_FILE" | cut -f1) log "Local backup complete: world_$TIMESTAMP.tar.gz ($SIZE)" # ── Prune old local backups (keep MAX_LOCAL) ────────────────────────── COUNT=$(ls "$BACKUP_DIR"/world_*.tar.gz 2>/dev/null | wc -l) if [ "$COUNT" -gt "$MAX_LOCAL" ]; then TO_DEL=$((COUNT - MAX_LOCAL)) ls -t "$BACKUP_DIR"/world_*.tar.gz | tail -n "$TO_DEL" | xargs rm -f log "Pruned $TO_DEL old local backup(s). Keeping $MAX_LOCAL." fi # ── Google Drive upload (only if GDRIVE_SA_KEY secret is set) ───────── if [ -n "$GDRIVE_SA_KEY" ]; then log "GDRIVE_SA_KEY found — uploading to Google Drive..." python3 /data/scripts/google_drive_backup.py "$BACKUP_FILE" >> "$LOG" 2>&1 if [ $? -eq 0 ]; then log "Google Drive upload successful!" else log "WARNING: Google Drive upload failed (local backup is still safe)." fi else log "GDRIVE_SA_KEY not set — skipping Google Drive upload." log " To enable: follow setup steps in google_drive_backup.py" fi