From 2ed87ffdd6cf17fe339ca53db80a0d26795484c0 Mon Sep 17 00:00:00 2001 From: ztimson Date: Fri, 29 May 2026 21:51:22 -0400 Subject: [PATCH] Fixed backups & added replica recovery --- README.md | 15 +++++++++------ backup.sh | 12 +++++------- docker-compose.yml | 13 +++++++++++++ entrypoint.sh | 12 ++++++++---- 4 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 docker-compose.yml diff --git a/README.md b/README.md index 328a5e6..b5f9149 100644 --- a/README.md +++ b/README.md @@ -51,12 +51,15 @@ To restore a backup, uncompress it and use the official `mongorestore` ### Environment Variables -| Variable | Description | Default | Example | -|--------------------|--------------------------------|--------------------------|---------------| -| `BACKUP_CRON` | Cron schedule expression | - | `0 */6 * * *` | -| `BACKUP_DIR` | Directory to store backups | /data/backups | `/backups` | -| `BACKUP_DB` | Database that will be backedup | `$MONGO_INITDB_DATABASE` | `admin` | | -| `BACKUP_RETENTION` | Number of backups to keep | - | `7` | +| Variable | Description | Default | Example | +|------------------------------|--------------------------------------------------|--------------------------|---------------| +| `BACKUP_CRON` | Cron schedule expression | | `0 */6 * * *` | +| `BACKUP_DIR` | Directory to store backups | `/data/backups` | `/backups` | +| `BACKUP_DB` | Database to backup | `$MONGO_INITDB_DATABASE` | `admin` | +| `BACKUP_RETENTION` | Number of backups to keep, defaults to unlimited | | `7` | +| `MONGO_INITDB_DATABASE` | Default database name | | `momentum` | +| `MONGO_INITDB_ROOT_USERNAME` | Root username for mongodump auth | | `root` | +| `MONGO_INITDB_ROOT_PASSWORD` | Root password for mongodump auth | | `secret` | ### Built With diff --git a/backup.sh b/backup.sh index f174371..0ffb0dd 100644 --- a/backup.sh +++ b/backup.sh @@ -1,18 +1,16 @@ #!/bin/bash TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S) -BACKUP_FILE="${MONGO_INITDB_DATABASE}_${TIMESTAMP}.dump.tar.gz" +if [[ -z "$BACKUP_DB" ]]; then BACKUP_DB="$MONGO_INITDB_DATABASE"; fi +BACKUP_FILE="${BACKUP_DB}_${TIMESTAMP}.dump.tar.gz" TEMP_DUMP="/tmp/mongo_dump_${TIMESTAMP}" -# Create & zip backup mkdir -p "$BACKUP_DIR" -if [[ -z "$BACKUP_DB" ]]; then BACKUP_DB="$MONGO_INITDB_DATABASE"; fi -mongodump --host localhost --db "$BACKUP_DB" -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_USERNAME" --out "$TEMP_DUMP" +mongodump --host localhost --db "$BACKUP_DB" -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" --out "$TEMP_DUMP" tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "$TEMP_DUMP" . rm -rf "$TEMP_DUMP" -# Remove old backups if [[ -n "$BACKUP_RETENTION" ]]; then - cd "$BACKUP_DIR" - ls -1t dump_${MONGO_INITDB_DATABASE}_*.tar.gz | tail -n +$((BACKUP_RETENTION + 1)) | xargs -r rm -f + cd "$BACKUP_DIR" + ls -1t ${BACKUP_DB}_*.dump.tar.gz | tail -n +$((BACKUP_RETENTION + 1)) | xargs -r rm -f fi diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0663d7b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +services: + db: + build: . + environment: + MONGO_INITDB_DATABASE: momentum + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: secret + BACKUP_CRON: "0 2 * * *" + BACKUP_RETENTION: "7" + BACKUP_DIR: /data/backups + volumes: + - data:/data/db + - backups:/data/backups diff --git a/entrypoint.sh b/entrypoint.sh index eb6aeaf..5f9b87b 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,12 +1,16 @@ #!/bin/bash -# Setup cron job if BACKUP_CRON is set if [ -n "$BACKUP_CRON" ]; then - echo "$BACKUP_CRON /usr/local/bin/backup.sh >> /var/log/mongo-backup.log 2>&1" > /etc/cron.d/mongo-backup + env >> /etc/environment + echo "$BACKUP_CRON root . /etc/environment; /usr/local/bin/backup >> /var/log/mongo-backup.log 2>&1" > /etc/cron.d/mongo-backup chmod 0644 /etc/cron.d/mongo-backup - crontab /etc/cron.d/mongo-backup cron fi -# Execute original mongo entrypoint +# Clean up stale locks from unclean shutdown +rm -f /data/db/mongod.lock +rm -f /data/db/.lock +rm -f /data/db/WiredTiger.lock +mongod --replSet rs0 --repair + exec /usr/local/bin/docker-entrypoint.sh "$@"