Skip to content

Instantly share code, notes, and snippets.

@coldfire84
Created September 29, 2018 22:50
Show Gist options
  • Save coldfire84/81c3239c9fb477d64a166418f209871d to your computer and use it in GitHub Desktop.
Save coldfire84/81c3239c9fb477d64a166418f209871d to your computer and use it in GitHub Desktop.
#!/bin/bash
# Ensure you replace <mongo-admin> and <password> with your mongodb credentials
# Variables
###########################
CONTAINER="mongodb"
DATETIME=$(date +"%Y_%m_%d")
BACKUP_PATH="/var/docker/backup"
DROPBOX_UPLOADER_CONFIG_PATH="/var/docker/dropbox-uploader"
LOCAL_BACKUP_THRESHOD="7"
DROPBOX_BACKUP_THRESHOLD="28"
# Container paths to backup
# Script
###########################
echo "Backing up conatiner: $CONTAINER"
echo "Using backup path for tgz storage: $BACKUP_PATH"
echo "Dropbox-uploader config path: $DROPBOX_UPLOADER_CONFIG_PATH"
echo "Local backup threshold: $LOCAL_BACKUP_THRESHOD"
echo "Remote backup threshold: $DROPBOX_BACKUP_THRESHOLD"
# Perform Container Backup to tgz
# Perform Backup
CONTAINER_UPPER=$(echo $CONTAINER | awk '{print toupper($0)}')
PATH_REPLACE=$(echo $i | sed -e 's/\//-/g')
FILENAME="$DATETIME-$CONTAINER_UPPER$PATH_REPLACE.tgz"
# Use mongodump to backup database
mkdir -p /var/docker/backup/$CONTAINER_$DATETIME
docker exec -e CONTAINER=$CONTAINER -e DATETIME=$DATETIME -it mongodb mongodump --host $CONTAINER:27017 --username <mongo-admin> --authenticationDatabase admin --password <password> --out /backup/$CONTAINER_$DATETIME
# Archive backup
tar -cvzf /var/docker/backup/$FILENAME /var/docker/backup/$CONTAINER_$DATETIME
# Remove backup files
echo "Will remove folder: /var/docker/backup/$CONTAINER_$DATETIME/"
rm -rf /var/docker/backup/$CONTAINER_$DATETIME/
# Check for backup in expected backup path
BACKUP_FILE="$BACKUP_PATH/$FILENAME"
if [[ ! -f $BACKUP_FILE ]]; then
echo "ERROR Backup file NOT found: $BACKUP_PATH/$FILENAME"
exit 1;
else
echo "SUCCESS Backup file found: $BACKUP_PATH/$FILENAME"
fi
# Upload Backup to DropBox
DOCKER_RUN=$(docker run -i --rm -v $DROPBOX_UPLOADER_CONFIG_PATH:/config -v $BACKUP_PATH:/backup peez/dropbox-uploader upload /backup/$FILENAME $FILENAME)
if [[ "$DOCKER_RUN" == *"DONE"* ]]; then
echo "SUCCESS Uploaded new backup file to DropBox: $FILENAME";
else
echo "$DOCKER_RUN";
echo "ERROR Failed to upload new backup file to DropBox: $FILENAME";
exit 1;
fi
# Cleanup REMOTE DropBox backup files older than $DROPBOX_BACKUP_THRESHOLD days old
THRESHOLD=$(date +"%Y_%m_%d" -d "-$DROPBOX_BACKUP_THRESHOLD days");
DOCKER_RUN=$(docker run -i --rm -v $DROPBOX_UPLOADER_CONFIG_PATH:/config -v $BACKUP_PATH:/backup peez/dropbox-uploader list)
IFS=$'\n'
for i in $DOCKER_RUN
do
IFS=' ' read -ra arrline <<< "$i";
if [[ ${arrline[-1]} == *"$CONTAINER_UPPER$PATH_REPLACE"* ]]; then
IFS='-' read -ra arrfilename <<< "${arrline[-1]}";
REMOTE_FILE_NAME=$(echo ${arrline[-1]} | tr -d '\r')
if [[ ${arrfilename[0]} < $THRESHOLD ]]; then
echo "INFO deleting aged backup file: ${arrline[-1]}"
DOCKER_RUN=$(docker run -i --rm -v $DROPBOX_UPLOADER_CONFIG_PATH:/config -v $BACKUP_PATH:/backup peez/dropbox-uploader delete $REMOTE_FILE_NAME)
echo "$DOCKER_RUN"
fi
fi
done
# Cleanup LOCAL backup files older than Now - $LOCAL_BACKUP_THRESHOD days
THRESHOLD=$(date +"%Y_%m_%d" -d "-$LOCAL_BACKUP_THRESHOD days");
for i in $BACKUP_PATH/*$PATH_REPLACE.tgz
do
IFS='/' read -ra arrfilepath <<< "$i";
IFS='-' read -ra arrfilename <<< "${arrfilepath[-1]}";
if [[ ${arrfilename[0]} < $THRESHOLD ]]; then
rm $i;
echo "INFO Deleted aged backup: $i"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment