#!/usr/bin/env bash set -euo pipefail # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_FILE="$SCRIPT_DIR/backups/db-backup-standalone.log" MONGO_SERVICE="mongo" COMPOSE_FILE="$SCRIPT_DIR/docker-compose-standalone.yaml" # Initialize log file (overwrite if exists) mkdir -p "$(dirname "$LOG_FILE")" > "$LOG_FILE" # Function to log messages log() { local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[$timestamp] $*" | tee -a "$LOG_FILE" } # stop mongo container while we copy its volume log "Stopping MongoDB container..." docker compose -f "$COMPOSE_FILE" stop "$MONGO_SERVICE" # timestamp for filename TIMESTAMP=$(date +"%Y-%m-%d-%H-%M") # backup directory and retention (can be overridden via env) BACKUP_DIR="${BACKUP_DIR:-$SCRIPT_DIR/backups}" KEEP="${KEEP:-7}" mkdir -p "$BACKUP_DIR" BACKUP_FILE="$BACKUP_DIR/mongo-volume-backup-$TIMESTAMP.tar.gz" log "Creating backup: $BACKUP_FILE" sudo tar -czvpf "$BACKUP_FILE" mongo-volume log "Backup created successfully." # rotate old backups: keep only the newest $KEEP files if [ "$KEEP" -gt 0 ]; then log "Rotating backups, keeping the newest $KEEP files." # gather files sorted newest-first mapfile -t files < <(ls -1t "$BACKUP_DIR"/mongo-volume-backup-*.tar.gz 2>/dev/null || true) if [ "${#files[@]}" -gt "$KEEP" ]; then for f in "${files[@]:$KEEP}"; do log "Removing old backup: $f" rm -f -- "$f" done fi log "Rotation completed." else log "Backup rotation disabled (KEEP=$KEEP)." fi log "Starting MongoDB container..." docker compose -f "$COMPOSE_FILE" start "$MONGO_SERVICE" log "Database backup process completed successfully."