Skip to content

Commit d40a2eb

Browse files
committed
Updated MongoDB S3 backup script
1 parent a270760 commit d40a2eb

File tree

3 files changed

+70
-52
lines changed

3 files changed

+70
-52
lines changed

backup/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ COPY startup.sh /etc/service/startup/run
8686
RUN chmod +x /etc/service/startup/run
8787

8888
# Backup script for mongodb
89-
#COPY mongodb_backup.sh /etc/service/mongodb_backup/run
90-
#RUN chmod +x /etc/service/mongodb_backup/run
89+
COPY mongodb_backup.sh /etc/service/mongodb_backup/run
90+
RUN chmod +x /etc/service/mongodb_backup/run
9191

9292

9393
# Start the postfix daemon during container startup

backup/mongodb_backup.sh

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,78 @@
11
#!/bin/bash
2-
#The Shell script will be used for taking backup and send it to S3 bucket.
2+
# Shell script for MongoDB backup with pruning and S3 strategy
33

4-
# TO list all Databases in mongodb databases
54
DATE1=$(date +%Y%m%d%H%M)
65
DATE=$(date +%d-%m-%y_%H-%M)
6+
MONTH=$(date +%b)
7+
backup_dir="/var/lib/backup/mongodb"
8+
mongodb_backup_dir="/var/lib/mongodb-backup"
9+
mongodb_data_dir="/root/mongodb_data"
10+
report_file="/tmp/mongodbbackup.txt"
711

8-
mkdir -p /var/lib/backup/mongodb
12+
mkdir -p $backup_dir $mongodb_backup_dir $mongodb_data_dir
913

10-
#Full Mongodb backup
14+
# Full MongoDB backup
15+
mongodump --host mongodb:27017 --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o $mongodb_backup_dir
1116

12-
mongodump --host mongodb:27017 --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o /var/lib/mongodb-backup/dump
17+
# List databases
18+
mongosh --quiet --host mongodb:27017 --eval "printjson(db.adminCommand('listDatabases'))" \
19+
-u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" \
20+
| grep -i name | awk -F'"' '{print $4}' > /mongo_dbs.txt
1321

22+
# Backup listed databases
23+
while read -r db; do
24+
echo "Creating backup for $db"
25+
mongodump --host mongodb:27017 --db "$db" --authenticationDatabase admin \
26+
-u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o $mongodb_backup_dir
27+
done < /mongo_dbs.txt
1428

15-
showdb(){
16-
mongo --quiet --host mongodb:27017 --eval "printjson(db.adminCommand('listDatabases'))" -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" | grep -i name | awk -F'"' '{print $4}'
17-
}
29+
# Archive backups
30+
tar czf "$backup_dir/${SOURCE_NAME}_mongodb_db_backup_${DATE1}.tgz" $mongodb_backup_dir/. \
31+
&& rsync -avr /var/lib/mongodb/ $mongodb_data_dir/ \
32+
&& tar czf "$backup_dir/${SOURCE_NAME}_mongodb_data_backup_${DATE1}.tgz" $mongodb_data_dir/.
1833

34+
# Upload backups to S3 (Daily Backup)
35+
if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/daily_backup/; then
36+
echo "Daily backup succeeded." >> $report_file
37+
else
38+
echo "Daily backup failed." >> $report_file
39+
fi
1940

20-
showdb > /mongo_dbs.txt
41+
# Monthly Backup
42+
if [ "$(date -d +1day +%d)" -eq 1 ]; then
43+
if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/monthly_backup/; then
44+
echo "Monthly backup succeeded." >> $report_file
45+
else
46+
echo "Monthly backup failed." >> $report_file
47+
fi
48+
fi
2149

22-
#Backing up the databases listed.
23-
while read -r db
24-
do
25-
echo "Creating backup for $db"
26-
mongodump --host mongodb:27017 --db "$db" --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o /var/lib/mongodb-backup/
27-
done < "/mongo_dbs.txt"
50+
# Quarterly Backup
51+
if [[ "$MONTH" == "Mar" || "$MONTH" == "Jun" || "$MONTH" == "Sep" || "$MONTH" == "Dec" ]] && [ "$(date -d +1day +%d)" -eq 1 ]; then
52+
if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/quarterly_backup/; then
53+
echo "Quarterly backup succeeded." >> $report_file
54+
else
55+
echo "Quarterly backup failed." >> $report_file
56+
fi
57+
fi
2858

29-
tar czf /var/lib/backup/mongodb/"${SOURCE_NAME}"_mongodb_db_backup_"${DATE1}".tgz /var/lib/mongodb-backup/. && rsync -avr /var/lib/mongodb/ /root/mongodb_data/ && tar czf /var/lib/backup/mongodb/"${SOURCE_NAME}"_mongodb_data_backup_"${DATE1}".tgz /root/mongodb_data/.
59+
# Prune old backups from S3
60+
# Daily Backup Prune (31 days)
61+
s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/daily_backup/ | \
62+
awk -v DEL="$(date +%F -d "31 days ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done
3063

31-
# Moving the backup to S3 bucket
32-
if s3cmd put -r --no-mime-magic /var/lib/backup/mongodb/ s3://"${S3_BUCKET_MONGODB}"/;
33-
then
34-
echo "DATE:" "$DATE" > /tmp/mongodbbackup.txt
35-
echo " " >> /tmp/mongodbbackup.txt
36-
echo "DESCRIPTION: ${SOURCE_NAME}_Mongodb backup" >> /tmp/mongodbbackup.txt
37-
echo " " >> /tmp/mongodbbackup.txt
38-
echo "STATUS: mongodb backup is Successful." >> /tmp/mongodbbackup.txt
39-
echo " " >> /tmp/mongodbbackup.txt
40-
echo "******* Mongodb Database Backup ****************" >> /tmp/mongodbbackup.txt
41-
echo " " >> /tmp/mongodbbackup.txt
42-
s3cmd ls --no-mime-magic s3://"${S3_BUCKET_MONGODB}"/ --human-readable | grep -i "${SOURCE_NAME}"_mongodb_db | cut -d' ' -f3- | tac | head -10 | sed "s,s3:\/\/${S3_BUCKET_MONGODB}\/,,g" &>> /tmp/mongodbbackup.txt
43-
echo " " >> /tmp/mongodbbackup.txt
44-
echo "************** Mongodb data Backup *************" >> /tmp/mongodbbackup.txt
45-
echo " " >> /tmp/mongodbbackup.txt
46-
s3cmd ls --no-mime-magic s3://"${S3_BUCKET_MONGODB}"/ --human-readable | grep -i "${SOURCE_NAME}"_mongodb_data | cut -d' ' -f3- | tac | head -10 | sed "s,s3:\/\/${S3_BUCKET_MONGODB}\/,,g" &>> /tmp/mongodbbackup.txt
47-
echo " " >> /tmp/mongodbbackup.txt
48-
echo "********************** END *********************" >> /tmp/mongodbbackup.txt
49-
else
50-
echo "DATE:" "$DATE" > /tmp/mongodbbackup.txt
51-
echo " " >> /tmp/mongodbbackup.txt
52-
echo "DESCRIPTION: ${SOURCE_NAME}_Mongodb backup" >> /tmp/mongodbbackup.txt
53-
echo " " >> /tmp/mongodbbackup.txt
54-
echo "STATUS: mongodb backup is Failed." >> /tmp/mongodbbackup.txt
55-
echo " " >> /tmp/mongodbbackup.txt
56-
echo "Something went wrong, Please check it" >> /tmp/mongodbbackup.txt
57-
< /tmp/mongodbbackup.txt mail -s "${SOURCE_NAME}: mongodb backup" "${CRON_BACKUP_MAIL}"
58-
fi
64+
# Monthly Backup Prune (1 year)
65+
s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/monthly_backup/ | \
66+
awk -v DEL="$(date +%F -d "3 months ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done
67+
68+
# Quarterly Backup Prune (3 years)
69+
s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/quarterly_backup/ | \
70+
awk -v DEL="$(date +%F -d "3 years ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done
71+
72+
# Send report via email
73+
< $report_file mail -s "${SOURCE_NAME}: MongoDB Backup Report" "${CRON_BACKUP_MAIL}"
5974

60-
# Remove the old backup data in local directory to avoid excessive storage use
61-
find /var/lib/backup/mongodb/ -type f -exec rm {} \;
62-
find /root/mongodb_data/ -type f -exec rm {} \;
63-
find /var/lib/mongodb-backup/ -type f -exec rm {} \;
75+
# Clean up local backup data
76+
find $backup_dir $mongodb_data_dir $mongodb_backup_dir -type f -exec rm {} \;
77+
rm $report_file
6478

65-
< /tmp/mongodbbackup.txt mail -s "${SOURCE_NAME}: mongodb backup" "${CRON_BACKUP_MAIL}"

backup/startup.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ do
1919
/bin/nginx_backup.sh
2020
sleep 60
2121
fi
22+
if [ "$HOUR" = "10" ] && [ "$MINUTE" = "35" ]
23+
then
24+
/bin/mongodb_backup.sh
25+
sleep 60
26+
fi
2227
if [ "$HOUR" = "09" ] && [ "$MINUTE" = "35" ]
2328
then
2429
/bin/mqtts_backup.sh
2530
sleep 60
2631
fi
27-
done
32+
done

0 commit comments

Comments
 (0)