mirror of
https://github.com/OneUptime/oneuptime
synced 2024-11-22 23:30:10 +00:00
204 lines
7.2 KiB
Bash
Executable File
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"
|