diff --git a/.gitignore b/.gitignore index 9dec15b..d253eca 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ lerna-debug.log* # Dumps dump +backups/ # Diagnostic reports (https://nodejs.org/api/report.html) diff --git a/scripts/monthlyMongoBackup.sh b/scripts/monthlyMongoBackup.sh new file mode 100755 index 0000000..a65693b --- /dev/null +++ b/scripts/monthlyMongoBackup.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BACKUP_ROOT="${BACKUP_ROOT:-$APP_DIR/backups}" +DB_NAME="${DB_NAME:-EMI_SOCIAL}" +MONGO_IMAGE="${MONGO_BACKUP_IMAGE:-mongo:7}" +KEEP_ARCHIVES="${KEEP_ARCHIVES:-12}" + +timestamp="$(date -u +%Y%m%dT%H%M%SZ)" +dump_name="emi_social_${timestamp}" +archive_path="$BACKUP_ROOT/${dump_name}.tar.gz" + +mkdir -p "$BACKUP_ROOT" + +docker run --rm \ + --user "$(id -u):$(id -g)" \ + --env-file "$APP_DIR/.env" \ + -e DB_NAME="$DB_NAME" \ + -e DUMP_NAME="$dump_name" \ + -v "$BACKUP_ROOT:/backup" \ + "$MONGO_IMAGE" \ + bash -lc ' + set -euo pipefail + : "${MONGO_URL:?MONGO_URL is missing}" + + uri="$MONGO_URL" + uri="${uri/\/myFirstDatabase?/\/${DB_NAME}?}" + uri="${uri/\/myFirstDatabase$/\/${DB_NAME}}" + + mongodump --uri "$uri" --db "$DB_NAME" --out "/backup/$DUMP_NAME" + ' + +tar -czf "$archive_path" -C "$BACKUP_ROOT" "$dump_name" +rm -rf "$BACKUP_ROOT/$dump_name" + +find "$BACKUP_ROOT" -maxdepth 1 -name 'emi_social_*.tar.gz' -type f \ + -printf '%T@ %p\n' \ + | sort -rn \ + | awk -v keep="$KEEP_ARCHIVES" 'NR > keep { print $2 }' \ + | xargs -r rm -f + +echo "Created MongoDB backup: $archive_path"