oneuptime/Devops/backup/backup.sh
Carl Downing 7a23067e18 don't
2023-07-30 08:08:53 -07:00

204 lines
7.2 KiB
Bash
Executable File

###
#
# Please make sure kubectl is installed and context is pointed to the cluster you want to restore to.
# This only runs on Linux (Ubuntu) and not on MacOS
###
# IP of the mongodb servers.
MONGO_HOSTS='a59a474aad89940889c1eb69b1a8f884-135820180.us-east-2.elb.amazonaws.com'
MONGO_HOST='a59a474aad89940889c1eb69b1a8f884-135820180.us-east-2.elb.amazonaws.com' #Add one host because mongodump only supports one host.
MONGO_PORT="27017"
ONEUPTIME_DB_USERNAME='oneuptime'
ONEUPTIME_DB_PASSWORD='password'
ONEUPTIME_DB_NAME='oneuptimedb'
CURRENT_DATE=$(date +%s)
CURRENT_USER=$(whoami)
BACKUP_PATH=~/db-backup
BACKUP_RETAIN_DAYS=2
TODAY=`date +"%d-%b-%Y"`
ENVIRONMENT='Staging'
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr 0)
# # Delete all the monitor logs before 3 days before taking the backup.
THREE_DAYS_AGO=$(date -d "-3 days" +"%Y-%m-%d")
THREE_MONTHS_AGO=$(date -d "-90 days" +"%Y-%m-%d")
SIX_MONTHS_AGO=$(date -d "-180 days" +"%Y-%m-%d")
function HELP() {
echo ""
echo "OneUptime DB backup command line documentation."
echo ""
echo "all arguments are optional and have a default value when not set"
echo ""
echo " -l Backup path on local system where backup file will be stored. Default value - $BACKUP_PATH"
echo " -n Database name. Default value 'oneuptimedb'"
echo " -p Database password. Default value 'password'"
echo " -r Helm release name. Default value 'fi'"
echo " -t Backup retain days. Set the number of days backup is kept before it is deleted. Default value '14'"
echo " -u Set database username. Default value 'oneuptime'."
echo " -v Set database environment. Enums {Production, Staging}, defaults to 'Staging'."
echo ""
echo " -h Help."
echo ""
exit 1
}
# PASS IN ARGUMENTS
while getopts "u:p:n:l:t:v:h" opt; do
case $opt in
u)
ONEUPTIME_DB_USERNAME="$OPTARG"
;;
p)
ONEUPTIME_DB_PASSWORD="$OPTARG"
;;
n)
ONEUPTIME_DB_NAME="$OPTARG"
;;
l)
BACKUP_PATH="$OPTARG"
;;
t)
BACKUP_RETAIN_DAYS="$OPTARG"
;;
v)
ENVIRONMENT="$OPTARG"
;;
h)
HELP
;;
\?)
echo "Invalid option -$OPTARG" >&2
HELP
echo -e "Use -h to see the help documentation."
exit 2
;;
esac
done
function BACKUP_SUCCESS(){
curl --request POST \
--url https://events.pagerduty.com/v2/change/enqueue \
--header 'Content-Type: application/json' \
--data '{
"routing_key": "a92c8fef8b394f01d02a9f9c0e1317f5",
"payload": {
"summary": "Backup created successfully on vm. Archive: '$BACKUP_PATH'/oneuptime-backup-'$CURRENT_DATE'.archive",
"source": "production-db-backup-vm"
}
}'
curl -X POST -H 'Content-type: application/json' --data '{
"blocks": [
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*'$ENVIRONMENT' Backup Complete*\n Date: '$TODAY'\nPath: '$BACKUP_PATH'/oneuptime-backup-'$CURRENT_DATE'.archive"
}
},
{
"type": "divider"
}
]
}' https://hooks.slack.com/services/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
}
function BACKUP_FAIL_SERVER(){
curl --request POST \
--url https://events.pagerduty.com/v2/enqueue \
--header 'Content-Type: application/json' \
--data '{
"payload": {
"summary": "Could not create backup on vm. Archive: '$BACKUP_PATH'/oneuptime-backup-'$CURRENT_DATE'.archive",
"severity": "error",
"source": "production-db-backup-vm"
},
"routing_key": "a92c8fef8b394f01d02a9f9c0e1317f5",
"event_action": "trigger"
}'
curl -X POST -H 'Content-type: application/json' --data '{
"blocks": [
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*'$ENVIRONMENT' Backup Failed*\n Date: '$TODAY'\nReason: Could not create backup on container.\nPath: '$BACKUP_PATH'/oneuptime-backup-'$CURRENT_DATE'.archive"
}
},
{
"type": "divider"
}
]
}' https://hooks.slack.com/services/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
}
function BACKUP_FAIL_LOCAL(){
curl -X POST -H 'Content-type: application/json' --data '{
"blocks": [
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*'$ENVIRONMENT' Backup Failed*\n Date: '$TODAY'\nReason: Could not create backup on local path.\nPath: '$BACKUP_PATH'/oneuptime-backup-'$CURRENT_DATE'.archive"
}
},
{
"type": "divider"
}
]
}' https://hooks.slack.com/services/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
}
echo "Taking a backup on the server"
echo ""
# Drop audit logs collection because we don't need to take backup of that.
# echo "Removing audit logs collections. This will take some time."
# sudo mongo ${ONEUPTIME_DB_NAME} --host="${MONGO_HOSTS}" --port="${MONGO_PORT}" --username="$ONEUPTIME_DB_USERNAME" --password="$ONEUPTIME_DB_PASSWORD" --eval 'db.auditlogs.drop()'
# Remove old monitor logs to make backup faster
# echo "Removing old monitor logs. This will take some time."
# sudo mongo ${ONEUPTIME_DB_NAME} --host="${MONGO_HOSTS}" --port="${MONGO_PORT}" --username="$ONEUPTIME_DB_USERNAME" --password="$ONEUPTIME_DB_PASSWORD" --eval "db.monitorlogs.remove({'createdAt': { \$lt: ISODate('${THREE_DAYS_AGO}')}})"
sudo mongo ${ONEUPTIME_DB_NAME} --host="${MONGO_HOSTS}" --port="${MONGO_PORT}" --username="$ONEUPTIME_DB_USERNAME" --password="$ONEUPTIME_DB_PASSWORD" --eval "db.monitorlogbyweeks.remove({'createdAt': { \$lt: ISODate('${SIX_MONTHS_AGO}')}})"
sudo mongo ${ONEUPTIME_DB_NAME} --host="${MONGO_HOSTS}" --port="${MONGO_PORT}" --username="$ONEUPTIME_DB_USERNAME" --password="$ONEUPTIME_DB_PASSWORD" --eval "db.monitorlogbydays.remove({'createdAt': { \$lt: ISODate('${THREE_MONTHS_AGO}')}})"
sudo mongo ${ONEUPTIME_DB_NAME} --host="${MONGO_HOSTS}" --port="${MONGO_PORT}" --username="$ONEUPTIME_DB_USERNAME" --password="$ONEUPTIME_DB_PASSWORD" --eval "db.monitorlogbyhours.remove({'createdAt': { \$lt: ISODate('${THREE_MONTHS_AGO}')}})"
echo "Sleeping for 1 minute..."
# Sleeping for 1 mins for database server to cool down.
sleep 1m
# Ensure the backup directory is already created
mkdir $BACKUP_PATH || echo "Backup directory already exist!"
# Instead of deleting auditlogs and monitorlogs collection, we can ignore the collection during backup
# --excludeCollection=auditlogs --excludeCollection=monitorlogs
if mongodump --forceTableScan --authenticationDatabase="${ONEUPTIME_DB_NAME}" --host="${MONGO_HOST}" --db="${ONEUPTIME_DB_NAME}" --port="${MONGO_PORT}" --username="${ONEUPTIME_DB_USERNAME}" --password="${ONEUPTIME_DB_PASSWORD}" --archive="$BACKUP_PATH/oneuptime-backup-$CURRENT_DATE.archive" --excludeCollection=auditlogs --excludeCollection=monitorlogs; then
echo ${green}"BACKUP SUCCESS $"${reset}
BACKUP_SUCCESS
else
echo ${red}"Failure, exit status: $"${reset}
BACKUP_FAIL_SERVER
fi
####### Remove backups older than {BACKUP_RETAIN_DAYS} days ########
echo "Removing backup older than ${BACKUP_RETAIN_DAYS} days."
find $BACKUP_PATH* -mtime +${BACKUP_RETAIN_DAYS} -exec rm -f {} \; || echo "Removed!"
echo ""
echo "Done - File Name: oneuptime-backup-$CURRENT_DATE.archive"