Skip to content
Snippets Groups Projects
mongo-run.sh 3.21 KiB
Newer Older
#!/usr/bin/env bash
root's avatar
root committed
# Antoine Barbare 18/02/18 <antoine@barbare.me>
# Quentin Duchemin 20/10/19 add --forceTableScan to prevent error on newest Mongo versions
root's avatar
root committed

BACKUP_FOLDER=${BACKUP_FOLDER:-"/backup/"}

[ -z "${MONGO_HOST}" ] && { echo "=> MONGO_HOST cannot be empty" && exit 1; }
[ -z "${MONGO_PORT}" ] && { echo "=> MONGO_PORT cannot be empty" && exit 1; }
[ -z "${MONGO_DB}" ] && { echo "=> MONGO_DB cannot be empty" && exit 1; }

ping -c 1 -W 1 "${MONGO_HOST}" || { echo -e "\n=========== ${MONGO_HOST} not available, skipping backup... ===========\n"; exit 1; }
root's avatar
root committed
if [[ -z "${MONGO_USER}" && -z "${MONGO_PASS}" ]]; then
  BACKUP_CMD="mongodump --forceTableScan -d ${MONGO_DB} -h ${MONGO_HOST}:${MONGO_PORT} -o $BACKUP_FOLDER"'${BACKUP_NAME}'
  RESTORE_CMD="mongorestore -d ${MONGO_DB} -h ${MONGO_HOST}:${MONGO_PORT} "
root's avatar
root committed
else
  BACKUP_CMD="mongodump --forceTableScan -d ${MONGO_DB} -h ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PASS} -o $BACKUP_FOLDER"'${BACKUP_NAME}'
  RESTORE_CMD="mongorestore -d ${MONGO_DB} -h ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PASS} "
root's avatar
root committed
fi

# Make sure backup folder exists
mkdir -p "${BACKUP_FOLDER}"
root's avatar
root committed
##########################
# CREATING BACKUP SCRIPT #
##########################
backup_script_name="${MONGO_SERVICE_NAME}-backup.sh"

echo "=> ${MONGO_SERVICE_NAME}: Creating backup script"
rm -f "/$backup_script_name"

cat <<EOF >> "/$backup_script_name"
#!/bin/bash

BACKUP_NAME=\$(date +\%Y.\%m.\%d.\%H\%M\%S)

echo "=> ${MONGO_SERVICE_NAME}: Backup started: \${BACKUP_NAME}"
if ${BACKUP_CMD} ;then
    MONGO_BACKUP=$BACKUP_FOLDER\${BACKUP_NAME}
    echo " => Compress files \$MONGO_BACKUP.tar.gz"
    tar -czf \$MONGO_BACKUP.tar.gz \$MONGO_BACKUP && \
    rm -rf \$MONGO_BACKUP && \
root's avatar
root committed
    echo "${MONGO_SERVICE_NAME}:  Backup succeeded"
else
    echo "${MONGO_SERVICE_NAME}: Backup failed"
    rm -rf $BACKUP_FOLDER\${BACKUP_NAME}
fi
EOF
chmod +x /$backup_script_name

###########################
# CREATING RESTORE SCRIPT #
###########################
restore_script_name="${MONGO_SERVICE_NAME}-restore.sh"
backup_log="${MONGO_SERVICE_NAME}_mongo_backup.log"

echo "=> ${MONGO_SERVICE_NAME}: Creating restore script"
rm -f "/$restore_script_name"

cat <<EOF >> /$restore_script_name
#!/bin/bash

echo "=> ${MONGO_SERVICE_NAME}: Restore database from \$1"
echo "  => Uncompress save \$1"
tar -xzvf \$1
output="\$(echo \$1 | awk -F'.tar.gz' '{print \$1}')"
if mongorestore -d ${MONGO_SERVICE_NAME} -h ${MONGO_HOST}:${MONGO_PORT} \$output;then
      echo "${MONGO_SERVICE_NAME}: Restore succeeded"
root's avatar
root committed
else
      echo "${MONGO_SERVICE_NAME}: Restore failed"
root's avatar
root committed
fi
root's avatar
root committed
EOF
chmod +x /$restore_script_name

touch /$backup_log
tail -F /$backup_log &

if [ -n "${INIT_BACKUP}" ]; then
    echo "=> ${MONGO_SERVICE_NAME}: Create a backup on the startup"
    /$backup_script_name
elif [ -n "${INIT_RESTORE_LATEST}" ]; then
    echo "=> ${MONGO_SERVICE_NAME}: Restore latest backup"
    until nc -z $MONGO_HOST $MONGO_PORT
    do
        echo "waiting database container..."
        sleep 1
    done
    ls -d -1 $BACKUP_FOLDER* | tail -1 | xargs /$restore_script_name
fi

echo "${CRON_TIME} /$backup_script_name >> /$backup_log 2>&1" >> /crontab.conf
crontab  /crontab.conf
echo "=> ${MONGO_SERVICE_NAME}: Running cron job"