From a7c1ae052cb441d7445610b2ac5a7caf8e66d9d1 Mon Sep 17 00:00:00 2001 From: Jon Lockwood Date: Mon, 14 Feb 2022 09:51:20 +0930 Subject: [PATCH] feat(backup): Added backup cron and helper script. Backs up all of the data to the /backup dir. MR !1 --- dockerfile | 9 ++++- include/bin/backup.sh | 53 +++++++++++++++++++++++++++++ include/etc/cron.d/container_backup | 6 ++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 include/bin/backup.sh create mode 100644 include/etc/cron.d/container_backup diff --git a/dockerfile b/dockerfile index a81ccdc..fe8bb1f 100644 --- a/dockerfile +++ b/dockerfile @@ -55,8 +55,14 @@ RUN chmod +x /docker-entrypoint.sh \ # Create vmail user for system && groupadd -g 5000 vmail \ && useradd -g vmail -u 5000 vmail -d /var/vmail \ + # Ensure Backup directory is created + && mkdir /backup \ + && chown root:root /backup \ + && chmod 700 /backup \ # create SSL directory for ssl certificates && mkdir -p /ssl \ + # Ensure scripts are executable + && chmod +x /bin/backup.sh \ # Dovecot related commands && mkdir -p /srv/mail \ && chown vmail:vmail /srv/mail \ @@ -82,9 +88,10 @@ RUN chmod +x /docker-entrypoint.sh \ # Spammassassin related Commands && mkdir -p /var/spool/spamassassin \ && chmod 777 /var/spool/spamassassin \ + # Setup data volumes -VOLUME /srv/mail /ssl /var/spool/spamassassin /var/log +VOLUME /srv/mail /ssl /var/spool/spamassassin /backup /var/log # Configure postfix RUN postconf -e "maillog_file=/var/log/postfix.log" \ diff --git a/include/bin/backup.sh b/include/bin/backup.sh new file mode 100644 index 0000000..fecd9db --- /dev/null +++ b/include/bin/backup.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +set -e + +backup_version=1.0 +back_file_name="mail_server-$backup_version-$(date +%Y-%m-%d-%H%M-%Z).tar.gz" + +start=$(date '+%s') + +includes=(/srv/mail) +includes+=(/ssl) +includes+=(/var/spool/spamassassin) +includes+=(/var/log) +includes+=(/var/lib/amavis) + + +backup_command="tar -czpvf $back_file_name ${includes[@]}" + +cd /tmp + +echo "$backup_command" + +if ! $backup_command; then + status="tar failed" +elif ! mv "/tmp/$back_file_name" /backup/ ; then + status="mv failed" +else + status="success: version=$backup_version size=$(stat -c%s /backup/$back_file_name) duration=$((`date '+%s'` - $start)) command='$backup_command'" +fi + + +logger -t backup "$status" + + +if [ "0$POST_MASTER_EMAIL" != "0" ]; then + +cat << EOF | /usr/lib/dovecot/dovecot-lda -d "${POST_MASTER_EMAIL}" -o "plugin/quota=maildir:User quota:noenforcing" +Auto-Submitted: auto-generated +Date: $(date +'%a, %-d %b %Y %H:%M:%S %z') +To: ${POST_MASTER_EMAIL} +From: Mail Server +Subject: Backup $(date +%Y-%m-%d-%H:%M-%Z) + +Server backups have occured on $(hostname -f) + +Summary: + + $status + +EOF + +fi + diff --git a/include/etc/cron.d/container_backup b/include/etc/cron.d/container_backup new file mode 100644 index 0000000..fbd572f --- /dev/null +++ b/include/etc/cron.d/container_backup @@ -0,0 +1,6 @@ +# +# Backup the docker container +# +# m h dom mon dow user command +01 0,3,6,9,12,15,18,21 * * * root /bin/backup.sh 2>&1 +