Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Dovecot Backup - Skript
HINWEIS - Die Nachfolgende Konfiguration von Dovecot setzt eine lauffähige Installation von Dovecot voraus, wie unter nachfolgendem internen Link beschrieben !!!
Dovecot ist ein Open-Source-IMAP-und POP3-E-Mail-Server für Linux bzw. UNIX-ähnlichen Systeme, entwickelt mit dem Hauptaugenmerk auf Sicherheit. Dovecot ist eine ausgezeichnete Wahl für kleine und große Installationen. Dovecot ist schnell und einfach zu installieren, erfordert keine besonderen Voraussetzungen und ist Ressourcenschonend.
Dovecot wird von Timo Sirainen entwickelt.
Beschreibung | Externer Link |
---|---|
Linux-Magazin | Wie Admins ihre Mailserver vor Datenverlust schützen / Artikel aus Ausgabe 06/2018 |
Homepage | http://dovecot.org |
Dokumentation | http://dovecot.org/documentation.html |
Wiki Dovecot2 | http://wiki2.dovecot.org/ |
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root
zu werden geben Sie bitte folgenden Befehl ein:
$ su - Password:
Backup
Nachfolgendes Skript ermöglicht die Erstellung einer *.tar.gz-Datei
- von allen Benutzerkonten
- oder über eine Datei mit E-Mail-Adressen, der zu sichernden Benutzerkonten
- pro Benutzer eine eigene *.tar.gz-Datei
- auf Dateiebene
- mit konfigurierbaren Parametern
- und automatischer Löschung von älteren Sicherungsdateien
- und Erstellung einer fortlaufenden Log-Datei unter
/var/log/
Nachfolgende Parameter sind in der aktuellen Version konfigurierbar: (Nur relevanter Ausschnitt)
... ############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME='dovecot_backup' # CUSTOM - Backup-Files. DIR_BACKUP='/srv/backup' FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz FILE_DELETE='*.tar.gz' BACKUPFILES_DELETE=14 # CUSTOM - dovecot Folders. MAILDIR_TYPE='maildir' MAILDIR_NAME='Maildir' MAILDIR_USER='vmail' MAILDIR_GROUP='vmail' # CUSTOM - Path and file name of a file with e-mail addresses to backup, if # SET. If NOT, the script will determine all mailboxes by default. # FILE_USERLIST='/path/and/file/name/of/user/list/with/one/email/per/line' # - OR - # FILE_USERLIST='' FILE_USERLIST='' # CUSTOM - Mail-Recipient. MAIL_RECIPIENT='root@tachtler.net' # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS='N' ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## ...
Parametername | Beschreibung |
---|---|
SCRIPT_NAME | Name des Skriptes |
DIR_BACKUP | Verzeichnis in dem die Backup-Dateien erstellt werden sollen |
FILE_BACKUP | Allgemeiner Teil der Bezeichnung für die Backup-Dateien |
FILE_DELETE | Endung zur Löschung von älteren Archivdateien, muss wie FILE_BACKUP enden ! |
BACKUPFILES_DELETE | Anzahl der Backup-Dateien pro Benutzer die gespeichert bleiben sollen |
MAILDIR_TYPE | Maildir-Format - ohne Doppelpunkt |
MAILDIR_NAME | Name des Maildir-Verzeichnisses unterhalb des home -Verzeichnisses des Benutzers |
MAILDIR_USER | Benutzername unter dem alle Postfächer (Mailboxes) verwaltet werden, siehe auch: Dovecot CentOS 6 - Konfiguration Authentifizierung - Authentifizierungsbenutzer Dovecot CentOS 7 - Konfiguration Authentifizierung - Authentifizierungsbenutzer |
MAILDIR_GROUP | Benutzergruppe unter dem alle Postfächer (Mailboxes) verwaltet werden, siehe auch: Dovecot CentOS 6 - Konfiguration Authentifizierung - Authentifizierungsbenutzer Dovecot CentOS 7 - Konfiguration Authentifizierung - Authentifizierungsbenutzer |
FILE_USERLIST | Datei mit E-Mail-Adressen (eine pro Zeile), welche Mailboxen/Benutzer gesichert werden, anstelle der Ermittlung durch doveadm user ”*” , um nicht alle Mailboxen/Benutzer zwangsweise zu sichern |
MAIL_RECIPIENT | Empfänger E-Mail-Adresse für E-Mails des Skripts |
MAIL_STATUS | Versand einer Status E-Mail nach erfolgreicher Skript Ausführung |
/var/lib/dovecot
Damit nachfolgendes Backup-Skript die nötigen Rechte zum lesen der Konfigurationsdatei
/var/lib/dovecot/db/shared-mailboxes.db
hat, müssen die Besitzrechte am Verzeichnis
/var/lib/dovecot
wie folgt angepasst werden:
# chown dovecot:vmail /var/lib/dovecot
Ein Überprüfung der entsprechenden Besitzrechte sollte dann wie folgt aussehen:
# ls -ld /var/lib/dovecot/ drwxr-x--- 3 dovecot vmail 56 Mar 16 15:01 /var/lib/dovecot/
WICHTIG - Vorhergehend werden der Gruppe vmail
die Rechte: lesen und ausführen eingeräumt.
Skript
#!/bin/bash ############################################################################## # Script-Name : dovecot_backup.sh # # Description : Script to backup the mailboxes from dovecot. # # On successful execution only a LOG file will be written. # # On error while execution, a LOG file and a error message # # will be send by e-mail. # # # # Last update : 30.01.2019 # # Version : 1.09 # # # # Author : Klaus Tachtler, <klaus@tachtler.net> # # DokuWiki : http://www.dokuwiki.tachtler.net # # Homepage : http://www.tachtler.net # # # # +----------------------------------------------------------------------+ # # | This program is free software; you can redistribute it and/or modify | # # | it under the terms of the GNU General Public License as published by | # # | the Free Software Foundation; either version 2 of the License, or | # # | (at your option) any later version. | # # +----------------------------------------------------------------------+ # # # # Copyright (c) 2019 by Klaus Tachtler. # # # ############################################################################## ############################################################################## # H I S T O R Y # ############################################################################## # Version : 1.01 # # Description : Bugfix: Delete all temporary domain directories not only the # # last one. Thanks to Guenther J. Niederwimmer. # # -------------------------------------------------------------------------- # # Version : 1.02 # # Description : GitHub: Issue #1 # # The name of the variable to delete the number of old backup # # files $DAYS_DELETE was renamed to $BACKUPFILES_DELETE. This # # was done for better understanding, because if the script was # # running more than once a day, this could be misunderstood. # # Thanks to Diane Trout. # # -------------------------------------------------------------------------- # # Version : 1.03 # # Description : Quota calculation double the calculated size of a mailbox, # # when dict was used. See also following mailing-list entry: # # # # https://www.dovecot.org/list/dovecot/2012-February/ # # 063585.html # # # # Thanks to André Peters. # # -------------------------------------------------------------------------- # # Version : 1.04 # # Description : Typo: Correction of the return code query of # # "# Delete LOCK file." in a pure string comparison. # # Thanks to Oli Sennhauser. # # -------------------------------------------------------------------------- # # Version : 1.05 # # Description : GitHub: Issue #4 # # Add error handling for dsync command. # # Add runtime statistics. # # Thanks to HenrikWMG. # # -------------------------------------------------------------------------- # # Version : 1.06 # # Description : Avoid an error when trying to delete backup files, if the # # $BACKUPFILES_DELETE count is NOT reached. # # Change file owner, after backup was created. # # Change file permissions to 600, after backup was created. # # Thanks to Seep1959. # # -------------------------------------------------------------------------- # # Version : 1.07 # # Description : Compatibility: Change the parameter order for the step # # "Delete archive files for user" for better compatibility # # with FreeBSD. # # Thanks to Alexander Preyer. # # -------------------------------------------------------------------------- # # Version : 1.08 # # Description : GitHub Issue #9 # # Add ability to only backup specific mailboxes, by using the # # variable FILE_USERLIST with the file path and file name as # # content. The file must contain one e-mail address per line. # # Add the calculation of the script runtime. # # Thanks to graue Ritter. # # -------------------------------------------------------------------------- # # Version : 1.09 # # Description : Add a switch to enable or disable e-mail address check, when # # FILE_USERLIST was set and used. # # Thanks to kbridger. # # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # ############################################################################## ############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME='dovecot_backup' # CUSTOM - Backup-Files. DIR_BACKUP='/srv/backup' FILE_BACKUP=dovecot_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz FILE_DELETE='*.tar.gz' BACKUPFILES_DELETE=14 # CUSTOM - dovecot Folders. MAILDIR_TYPE='maildir' MAILDIR_NAME='Maildir' MAILDIR_USER='vmail' MAILDIR_GROUP='vmail' # CUSTOM - Path and file name of a file with e-mail addresses to backup, if # SET. If NOT, the script will determine all mailboxes by default. # FILE_USERLIST='/path/and/file/name/of/user/list/with/one/user/per/line' # - OR - # FILE_USERLIST='' FILE_USERLIST='' # CUSTOM - Check when FILE_USERLIST was used, if the user per line was a # valid e-mail address [Y|N]. FILE_USERLIST_VALIDATE_EMAIL='N' # CUSTOM - Mail-Recipient. MAIL_RECIPIENT='root@tachtler.net' # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS='N' ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## # Variables. DSYNC_COMMAND=`command -v dsync` TAR_COMMAND=`command -v tar` TOUCH_COMMAND=`command -v touch` RM_COMMAND=`command -v rm` PROG_SENDMAIL=`command -v sendmail` CAT_COMMAND=`command -v cat` DATE_COMMAND=`command -v date` MKDIR_COMMAND=`command -v mkdir` CHOWN_COMMAND=`command -v chown` CHMOD_COMMAND=`command -v chmod` GREP_COMMAND=`command -v grep` FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock' FILE_LOG='/var/log/'$SCRIPT_NAME'.log' FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log' FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail' FILE_MBOXLIST='/tmp/'$SCRIPT_NAME'.mboxlist' VAR_HOSTNAME=`uname -n` VAR_SENDER='root@'$VAR_HOSTNAME VAR_EMAILDATE=`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'` declare -a VAR_LISTED_USER=() declare -a VAR_FAILED_USER=() VAR_COUNT_USER=0 VAR_COUNT_FAIL=0 # Functions. function log() { echo $1 echo `$DATE_COMMAND '+%Y/%m/%d %H:%M:%S'` " INFO:" $1 >>${FILE_LAST_LOG} } function retval() { if [ "$?" != "0" ]; then case "$?" in *) log "ERROR: Unknown error $?" ;; esac fi } function movelog() { $CAT_COMMAND $FILE_LAST_LOG >> $FILE_LOG $RM_COMMAND -f $FILE_LAST_LOG $RM_COMMAND -f $FILE_LOCK } function sendmail() { case "$1" in 'STATUS') MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.' ;; *) MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!' ;; esac $CAT_COMMAND <<MAIL >$FILE_MAIL Subject: $MAIL_SUBJECT Date: $VAR_EMAILDATE From: $VAR_SENDER To: $MAIL_RECIPIENT MAIL $CAT_COMMAND $FILE_LAST_LOG >> $FILE_MAIL $PROG_SENDMAIL -f $VAR_SENDER -t $MAIL_RECIPIENT < $FILE_MAIL $RM_COMMAND -f $FILE_MAIL } # Main. log "" RUN_TIMESTAMP=`$DATE_COMMAND '+%s'` log "+-----------------------------------------------------------------+" log "| Start backup of the mailboxes [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`] |" log "+-----------------------------------------------------------------+" log "" log "SCRIPT_NAME.................: $SCRIPT_NAME" log "" log "DIR_BACKUP..................: $DIR_BACKUP" log "" log "MAIL_RECIPIENT..............: $MAIL_RECIPIENT" log "MAIL_STATUS.................: $MAIL_STATUS" log "" log "FILE_USERLIST...............: $FILE_USERLIST" log "FILE_USERLIST_VALIDATE_EMAIL: $FILE_USERLIST_VALIDATE_EMAIL" log "" # Check if command (file) NOT exist OR IS empty. if [ ! -s "$DSYNC_COMMAND" ]; then log "Check if command '$DSYNC_COMMAND' was found....................[FAILED]" sendmail ERROR movelog exit 11 else log "Check if command '$DSYNC_COMMAND' was found....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$TAR_COMMAND" ]; then log "Check if command '$TAR_COMMAND' was found......................[FAILED]" sendmail ERROR movelog exit 12 else log "Check if command '$TAR_COMMAND' was found......................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$TOUCH_COMMAND" ]; then log "Check if command '$TOUCH_COMMAND' was found....................[FAILED]" sendmail ERROR movelog exit 13 else log "Check if command '$TOUCH_COMMAND' was found....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$RM_COMMAND" ]; then log "Check if command '$RM_COMMAND' was found.......................[FAILED]" sendmail ERROR movelog exit 14 else log "Check if command '$RM_COMMAND' was found.......................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$CAT_COMMAND" ]; then log "Check if command '$CAT_COMMAND' was found......................[FAILED]" sendmail ERROR movelog exit 15 else log "Check if command '$CAT_COMMAND' was found......................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$DATE_COMMAND" ]; then log "Check if command '$DATE_COMMAND' was found.....................[FAILED]" sendmail ERROR movelog exit 16 else log "Check if command '$DATE_COMMAND' was found.....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$MKDIR_COMMAND" ]; then log "Check if command '$MKDIR_COMMAND' was found....................[FAILED]" sendmail ERROR movelog exit 17 else log "Check if command '$MKDIR_COMMAND' was found....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$CHOWN_COMMAND" ]; then log "Check if command '$CHOWN_COMMAND' was found....................[FAILED]" sendmail ERROR movelog exit 18 else log "Check if command '$CHOWN_COMMAND' was found....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$CHMOD_COMMAND" ]; then log "Check if command '$CHMOD_COMMAND' was found....................[FAILED]" sendmail ERROR movelog exit 19 else log "Check if command '$CHMOD_COMMAND' was found....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$GREP_COMMAND" ]; then log "Check if command '$GREP_COMMAND' was found.....................[FAILED]" sendmail ERROR movelog exit 20 else log "Check if command '$GREP_COMMAND' was found.....................[ OK ]" fi # Check if command (file) NOT exist OR IS empty. if [ ! -s "$PROG_SENDMAIL" ]; then log "Check if command '$PROG_SENDMAIL' was found................[FAILED]" sendmail ERROR movelog exit 21 else log "Check if command '$PROG_SENDMAIL' was found................[ OK ]" fi # Check if LOCK file NOT exist. if [ ! -e "$FILE_LOCK" ]; then log "Check if script is NOT already runnig .....................[ OK ]" $TOUCH_COMMAND $FILE_LOCK else log "Check if script is NOT already runnig .....................[FAILED]" log "" log "ERROR: The script was already running, or LOCK file already exists!" log "" sendmail ERROR movelog exit 30 fi # Check if DIR_BACKUP Directory NOT exists. if [ ! -d "$DIR_BACKUP" ]; then log "Check if DIR_BACKUP exists.................................[FAILED]" $MKDIR_COMMAND -p $DIR_BACKUP log "DIR_BACKUP was now created.................................[ OK ]" else log "Check if DIR_BACKUP exists.................................[ OK ]" fi # Check if FILE_USERLIST NOT set OR IS empty. log "" if [ ! -n "$FILE_USERLIST" ]; then log "Check if the variable FILE_USERLIST is set.................[ NO ]" log "Mailboxes to backup will be determined by doveadm user \"*\"." for users in `doveadm user "*"`; do VAR_LISTED_USER+=($users); done else log "Check if the variable FILE_USERLIST is set.................[ OK ]" log "Mailboxes to backup will read from file." log "" log "- File: [$FILE_USERLIST]" # Check if file exists. if [ -f "$FILE_USERLIST" ]; then log "- Check if FILE_USERLIST exists............................[ OK ]" else log "- Check if FILE_USERLIST exists............................[FAILED]" log "" sendmail ERROR movelog exit 40 fi # Check if file is readable. if [ -r "$FILE_USERLIST" ]; then log "- Check if FILE_USERLIST is readable.......................[ OK ]" else log "- Check if FILE_USERLIST is readable.......................[FAILED]" log "" sendmail ERROR movelog exit 41 fi # Read file into variable. while IFS= read -r line do # Check for valid e-mail address. if [ $FILE_USERLIST_VALIDATE_EMAIL = 'Y' ]; then # Check if basic email address syntax is valid. if echo "${line}" | $GREP_COMMAND '^[a-zA-Z0-9]*@[a-zA-Z0-9]*\.[a-zA-Z0-9]*$' >/dev/null; then VAR_LISTED_USER+=($line); else log "" log "ERROR: The user: $line is NOT valid e-mail address!" ((VAR_COUNT_FAIL++)) VAR_FAILED_USER+=($line); fi else VAR_LISTED_USER+=($line); fi done <"$FILE_USERLIST" # Check if VAR_COUNT_FAIL is greater than zero. If YES, set VAR_COUNT_USER to VAR_COUNT_FAIL. if [ "$VAR_COUNT_FAIL" -ne "0" ]; then VAR_COUNT_USER=$VAR_COUNT_FAIL fi fi # Start backup. log "" log "+-----------------------------------------------------------------+" log "| Run backup $SCRIPT_NAME ..................................... |" log "+-----------------------------------------------------------------+" log "" # Start real backup process for all users. for users in "${VAR_LISTED_USER[@]}"; do log "Start backup process for user: $users ..." ((VAR_COUNT_USER++)) DOMAINPART=${users#*@} LOCALPART=${users%%@*} LOCATION="$DIR_BACKUP/$DOMAINPART/$LOCALPART/$MAILDIR_NAME" USERPART="$DOMAINPART/$LOCALPART" log "Extract mailbox data for user: $users ..." $DSYNC_COMMAND -o plugin/quota= -f -u $users backup $MAILDIR_TYPE:$LOCATION # Check the status of dsync and continue the script depending on the result. if [ "$?" != "0" ]; then case "$?" in 1) log "Synchronization failed > user: $users !!!" ;; 2) log "Synchronization was done without errors, but some changes couldn't be done, so the mailboxes aren't perfectly synchronized for user: $users !!!" ;; esac if [ "$?" -gt "3" ]; then log "Synchronization failed > user: $users !!!" fi ((VAR_COUNT_FAIL++)) VAR_FAILED_USER+=($users); else log "Synchronization done for user: $users ..." cd $DIR_BACKUP log "Packaging to archive for user: $users ..." $TAR_COMMAND -cvzf $users-$FILE_BACKUP $USERPART --atime-preserve --preserve-permissions log "Delete archive files for user: $users ..." (ls -t $users-$FILE_DELETE|head -n $BACKUPFILES_DELETE;ls $users-$FILE_DELETE)|sort|uniq -u|xargs -r rm if [ "$?" != "0" ]; then log "Delete old archive files $DIR_BACKUP .....................[FAILED]" else log "Delete old archive files $DIR_BACKUP .....................[ OK ]" fi log "Delete mailbox files for user: $users ..." $RM_COMMAND "$DIR_BACKUP/$DOMAINPART" -rf if [ "$?" != "0" ]; then log "Delete mailbox files at: $DIR_BACKUP .....................[FAILED]" else log "Delete mailbox files at: $DIR_BACKUP .....................[ OK ]" fi fi log "Ended backup process for user: $users ..." log "" done # Set owner and rights permissions to backup directory and backup files. $CHOWN_COMMAND -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP $CHMOD_COMMAND 700 $DIR_BACKUP $CHMOD_COMMAND -R 600 $DIR_BACKUP/* # Delete LOCK file. if [ "$?" != "0" ]; then retval $? log "" $RM_COMMAND -f $FILE_LOCK sendmail ERROR movelog exit 99 else log "+-----------------------------------------------------------------+" log "| End backup $SCRIPT_NAME ..................................... |" log "+-----------------------------------------------------------------+" log "" fi # Finish syncing with runntime statistics. log "+-----------------------------------------------------------------+" log "| Runtime statistics............................................. |" log "+-----------------------------------------------------------------+" log "" log "- Number of determined users: $VAR_COUNT_USER" log "- ...Summary of failed users: $VAR_COUNT_FAIL" if [ "$VAR_COUNT_FAIL" -gt "0" ]; then log "- ...Mailbox of failed users: " for i in "${VAR_FAILED_USER[@]}" do log "- ... $i" done fi log "" END_TIMESTAMP=`$DATE_COMMAND '+%s'` log "Runtime: `$DATE_COMMAND -u -d "0 $END_TIMESTAMP seconds - $RUN_TIMESTAMP seconds" +'%H:%M:%S'` time elapsed." log "" log "+-----------------------------------------------------------------+" log "| Finished creating the backups [`$DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)'`] |" log "+-----------------------------------------------------------------+" log "" # If errors occurred on user backups, exit with return code 1 instead of 0. if [ "$VAR_COUNT_FAIL" -gt "0" ]; then sendmail ERROR movelog exit 1 else # Status e-mail. if [ $MAIL_STATUS = 'Y' ]; then sendmail STATUS fi movelog exit 0 fi
Beispieldatei: FILE_USERLIST
Nachfolgend eine Beispiel für den Inhalt einer Datei, welche unter der Variable:
# CUSTOM - Path and file name of a file with e-mail addresses to backup, if # SET. If NOT, the script will determine all mailboxes by default. # FILE_USERLIST='/path/and/file/name/of/user/list/with/one/email/per/line' # - OR - # FILE_USERLIST='' FILE_USERLIST='/srv/dovecot_backup.userlist'
definiert werden kann:
klaus@tachtler.net petra@tachtler.net
Skript - Log
Nachfolgende Log-Datei entsteht im Verzeichnis
/var/log/
- hier z.B./var/log/dovecot_backup.log
OHNE FILE_USERLIST
:
2019/01/30 14:24:28 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:24:28 INFO: | Start backup of the mailboxes [Wed, 30 Jan 2019 14:24:28 (CET)] | 2019/01/30 14:24:28 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: Run script with following parameter: 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: SCRIPT_NAME...: dovecot_backup 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: DIR_BACKUP....: /srv/backup 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: MAIL_RECIPIENT: you@example.com 2019/01/30 14:24:28 INFO: MAIL_STATUS...: N 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: Check if command '/bin/dsync' was found....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/tar' was found......................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/touch' was found....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/rm' was found.......................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/cat' was found......................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/date' was found.....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/mkdir' was found....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/chown' was found....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/chmod' was found....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/bin/grep' was found.....................[ OK ] 2019/01/30 14:24:28 INFO: Check if command '/sbin/sendmail' was found................[ OK ] 2019/01/30 14:24:28 INFO: Check if script is NOT already runnig .....................[ OK ] 2019/01/30 14:24:28 INFO: Check if DIR_BACKUP exists.................................[ OK ] 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: Check if the variable FILE_USERLIST is set.................[ NO ] 2019/01/30 14:24:28 INFO: Mailboxes to backup will be determined by doveadm user "*". 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:28 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:24:28 INFO: | Run backup dovecot_backup ..................................... | 2019/01/30 14:24:28 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:24:28 INFO: 2019/01/30 14:24:29 INFO: Start backup process for user: klaus@tachtler.net ... 2019/01/30 14:24:29 INFO: Extract mailbox data for user: klaus@tachtler.net ... 2019/01/30 14:27:43 INFO: Synchronization done for user: klaus@tachtler.net ... 2019/01/30 14:27:43 INFO: Packaging to archive for user: klaus@tachtler.net ... 2019/01/30 14:27:48 INFO: Delete archive files for user: klaus@tachtler.net ... 2019/01/30 14:27:48 INFO: Delete old archive files /srv/backup .....................[ OK ] 2019/01/30 14:27:48 INFO: Delete mailbox files for user: klaus@tachtler.net ... 2019/01/30 14:27:48 INFO: Delete mailbox files at: /srv/backup .....................[ OK ] 2019/01/30 14:27:48 INFO: Ended backup process for user: klaus@tachtler.net ... 2019/01/30 14:27:48 INFO: 2019/01/30 14:27:48 INFO: Start backup process for user: petra@tachtler.net ... 2019/01/30 14:27:48 INFO: Extract mailbox data for user: petra@tachtler.net ... 2019/01/30 14:27:56 INFO: Synchronization done for user: petra@tachtler.net ... 2019/01/30 14:27:56 INFO: Packaging to archive for user: petra@tachtler.net ... 2019/01/30 14:27:57 INFO: Delete archive files for user: petra@tachtler.net ... 2019/01/30 14:27:57 INFO: Delete old archive files /srv/backup .....................[ OK ] 2019/01/30 14:27:57 INFO: Delete mailbox files for user: petra@tachtler.net ... 2019/01/30 14:27:57 INFO: Delete mailbox files at: /srv/backup .....................[ OK ] 2019/01/30 14:27:57 INFO: Ended backup process for user: petra@tachtler.net ... 2019/01/30 14:28:01 INFO: 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO: | End backup dovecot_backup ..................................... | 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO: 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO: | Runtime statistics............................................. | 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO: 2019/01/30 14:28:01 INFO: - Number of determined users: 2 2019/01/30 14:28:01 INFO: - ...Summary of failed users: 0 2019/01/30 14:28:01 INFO: 2019/01/30 14:28:01 INFO: Runtime: 00:03:33 time elapsed. 2019/01/30 14:28:01 INFO: 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO: | Finished creating the backups [Wed, 30 Jan 2019 14:28:01 (CET)] | 2019/01/30 14:28:01 INFO: +-----------------------------------------------------------------+ 2019/01/30 14:28:01 INFO:
MIT FILE_USERLIST
:
2019/01/30 15:07:51 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:51 INFO: | Start backup of the mailboxes [Wed, 30 Jan 2019 15:07:51 (CET)] | 2019/01/30 15:07:51 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: Run script with following parameter: 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: SCRIPT_NAME...: dovecot_backup 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: DIR_BACKUP....: /srv/backup 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: MAIL_RECIPIENT: you@example.com 2019/01/30 15:07:51 INFO: MAIL_STATUS...: N 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: Check if command '/bin/dsync' was found....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/tar' was found......................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/touch' was found....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/rm' was found.......................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/cat' was found......................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/date' was found.....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/mkdir' was found....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/chown' was found....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/chmod' was found....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/bin/grep' was found.....................[ OK ] 2019/01/30 15:07:51 INFO: Check if command '/sbin/sendmail' was found................[ OK ] 2019/01/30 15:07:51 INFO: Check if script is NOT already runnig .....................[ OK ] 2019/01/30 15:07:51 INFO: Check if DIR_BACKUP exists.................................[ OK ] 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: Check if the variable FILE_USERLIST is set.................[ OK ] 2019/01/30 15:07:51 INFO: Mailboxes to backup will read from file. 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: - File: [/home/klaus/dovecot_backup.userlist] 2019/01/30 15:07:51 INFO: - Check if FILE_USERLIST exists............................[ OK ] 2019/01/30 15:07:51 INFO: - Check if FILE_USERLIST is readable.......................[ OK ] 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: ERROR: The email address: notvaild_email.net is not valid! 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:51 INFO: | Run backup dovecot_backup ..................................... | 2019/01/30 15:07:51 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:51 INFO: 2019/01/30 15:07:51 INFO: Start backup process for user: klaus@tachtler.net ... 2019/01/30 15:07:51 INFO: Extract mailbox data for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: Synchronization done for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: Packaging to archive for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: Delete archive files for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: Delete old archive files /srv/backup .....................[ OK ] 2019/01/30 15:07:54 INFO: Delete mailbox files for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: Delete mailbox files at: /srv/backup .....................[ OK ] 2019/01/30 15:07:54 INFO: Ended backup process for user: klaus@tachtler.net ... 2019/01/30 15:07:54 INFO: 2019/01/30 15:07:54 INFO: Start backup process for user: petra@tachtler.net ... 2019/01/30 15:07:54 INFO: Extract mailbox data for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: Synchronization done for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: Packaging to archive for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: Delete archive files for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: Delete old archive files /srv/backup .....................[ OK ] 2019/01/30 15:07:56 INFO: Delete mailbox files for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: Delete mailbox files at: /srv/backup .....................[ OK ] 2019/01/30 15:07:56 INFO: Ended backup process for user: petra@tachtler.net ... 2019/01/30 15:07:56 INFO: 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO: | End backup dovecot_backup ..................................... | 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO: 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO: | Runtime statistics............................................. | 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO: 2019/01/30 15:07:56 INFO: - Number of determined users: 2 2019/01/30 15:07:56 INFO: - ...Summary of failed users: 1 2019/01/30 15:07:56 INFO: - ...Mailbox of failed users: 2019/01/30 15:07:56 INFO: - ... notvaild_email.net 2019/01/30 15:07:56 INFO: 2019/01/30 15:07:56 INFO: Runtime: 00:00:05 time elapsed. 2019/01/30 15:07:56 INFO: 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO: | Finished creating the backups [Wed, 30 Jan 2019 15:07:56 (CET)] | 2019/01/30 15:07:56 INFO: +-----------------------------------------------------------------+ 2019/01/30 15:07:56 INFO:
Anmerkung zur Ausführung:
HINWEIS - Bis Version 1.05
!
HINWEIS - Falls nachfolgende Fehlermeldung auftreten sollte:
... INFO: Delete old archive files /srv/backup ......................[FAILED]
bedeutet dies nur, dass noch nicht genug alte Archivdateien vorhanden sind, damit diese gelöscht werden können!
Skript - Logrotate
Damit die LOG-Datei des Skriptes nicht ins unendliche wächst, sollte diese ebenfalls, wie auch die Log-Dateien von Dovecot selbst, rotiert werden.
Um die LOG-Dateien des Skriptes ebenfalls wie die LOG-Dateien von Dovecot selbst zu rotieren ist nachfolgende Ergänzung in der Kofigurationsdatei
/etc/logrotate.d/dovecot
erforderlich:
VORHER: (Komplette Konfigurationsdatei)
# dovecot SIGUSR1: Re-opens the log files. /var/log/dovecot.log { missingok notifempty delaycompress sharedscripts postrotate /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true endscript }
NACHHER: (Komplette Konfigurationsdatei)
# dovecot SIGUSR1: Re-opens the log files. /var/log/dovecot.log /var/log/dovecot_backup.log { missingok notifempty delaycompress sharedscripts postrotate /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true endscript }
Nachfolgend die geänderte Zeile (Nur relevanter Ausschnitt):
... /var/log/dovecot.log /var/log/dovecot_backup.log { ...
Skript - cron-Job
Nachfolgend kann auch ein cron
-Job zur z.B. nächtlichen Ausführung eingerichtet werden. Dazu können nachfolgende zwei Konfigurationszeilen an die bestehende Konfigurationsdatei
/etc/crontab
angehängt werden:
# Backup dovecot mailboxes 5 03 * * * root /usr/local/bin/dovecot_backup.sh > /dev/null 2>&1
* Ausführung nächtlich um 03:05 Uhr
Skript - Dateien
Nachfolgend sollten nachfolgende Dateien im Backup-Verzeichnis, welches im Skript definiert ist, erstellt worden sein, nachdem das Skript zur Ausführung gekommen ist. Hier z.B. /srv/backup/
, was mit nachfolgendem Befehl überprüft werden kann:
# ls -la /srv/backup/ total 50108 drwx------ 2 vmail vmail 4096 Apr 29 15:11 . drwxr-xr-x. 4 root root 4096 Apr 29 13:03 .. -rw------- 1 vmail vmail 51290558 Apr 29 15:11 klaus@tachtler.net-dovecot_backup_20140429_151044.tar.gz -rw------- 1 vmail vmail 21230432 Apr 29 15:12 petra@tachtler.net-dovecot_backup_20140429_151044.tar.gz
Recovery
Die Erstellung eines Backups (Sicherung) ist eine Sache, jedoch wie können im Fall eines Datenverlusts, die Daten wiederhergestellt werden.
Entpacken
Nachfolgendes Beispiel zeigt, wie zuerst die im Backup enthaltenen Daten in eine Verzeichnis unterhalb von
/tmp
wiederhergestellt werden können.
Dazu kann mit nachfolgendem Befehl ein Verzeichnis mit dem Namen recovery
unterhalb des Verzeichnisses /tmp
angelegt werden:
# mkdir /tmp/recovery
Anschließend kann dann mit nachfolgendem Befehl das komplette Maildir-Verzeichnis aller Benutzer unterhalb einer ganzen Domäne wiederhergestellt werden:
Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:
- Das Backup befindet sich unter
/srv/backup
- Der Benutzer lautet
klaus@tachtler.net
# tar -xvzf /srv/backup/klaus@tachtler.net-dovecot_backup_20140429_151044.tar.gz -C /tmp/recovery --atime-preserve --preserve-permissions
Nach erfolgreicher Ausführung des oben gezeigten Befehls, kann mit nachfolgendem Befehl überprüft werden, ob alle Daten aus der Backup-Datei erfolgreich extrahiert werden konnten:
# ls -la /tmp/recovery/tachtler.net/klaus/Maildir total 464 drwx------ 30 vmail vmail 4096 Apr 29 15:11 . drwx------ 3 vmail vmail 4096 Apr 29 15:10 .. drwx------ 2 vmail vmail 36864 Apr 29 15:11 cur -rw------- 1 vmail vmail 0 Apr 29 15:10 dovecot-acl-list -rw------- 1 vmail vmail 260484 Apr 29 15:11 dovecot.index.cache -rw------- 1 vmail vmail 8640 Apr 29 15:11 dovecot.index.log -rw------- 1 vmail vmail 24 Apr 29 15:11 dovecot-keywords -rw------- 1 vmail vmail 648 Apr 29 15:10 dovecot.mailbox.log -rw------- 1 vmail vmail 20649 Apr 29 15:11 dovecot-uidlist -rw------- 1 vmail vmail 8 Apr 29 15:10 dovecot-uidvalidity -r--r--r-- 1 vmail vmail 0 Apr 29 15:10 dovecot-uidvalidity.535fa4ee drwx------ 5 vmail vmail 4096 Apr 29 15:11 .Drafts drwx------ 5 vmail vmail 4096 Apr 29 15:11 .Junk -rw------- 1 vmail vmail 0 Apr 29 15:10 maildirfolder -rw------- 1 vmail vmail 81 Apr 29 15:11 maildirsize drwx------ 2 vmail vmail 4096 Apr 29 15:10 new drwx------ 5 vmail vmail 4096 Apr 29 15:11 .Sent -rw------- 1 vmail vmail 574 Apr 29 15:10 subscriptions drwx------ 2 vmail vmail 4096 Apr 29 15:11 tmp drwx------ 5 vmail vmail 4096 Apr 29 15:11 .Trash
dsync-Befehl
Nachfolgender Befehl kopiert dann im laufenden Betrieb, die Daten in das Maildir-Verzeichnis von Dovecot zurück.
Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:
- Das Backup befindet sich unter
/tmp/recovery/tachtler.net/klaus/Maildir/
- Der Benutzer lautet
klaus@tachtler.net
# dsync -R -f -u klaus@tachtler.net backup maildir:/tmp/recovery/tachtler.net/klaus/Maildir
Mit nachfolgendem Befehl kann nun überprüft werden, ob das recovery (zurück kopieren) erfolgreich war.
Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:
- Das Backup befindet sich unter
/tmp/recovery/tachtler.net/klaus/Maildir/
- Der Benutzer lautet
klaus@tachtler.net
- Das Maildir-Verzeichnis unter Dovecot befindet sich unter
/var/spool/vmail/tachtler.net/klaus/Maildir
# ls -la /var/spool/vmail/tachtler.net/klaus/Maildir total 480 drwx------ 30 vmail vmail 4096 Apr 29 16:27 . drwx------ 4 vmail vmail 4096 Apr 29 12:27 .. drwx------ 2 vmail vmail 36864 Apr 29 16:27 cur -rw------- 1 vmail vmail 0 Apr 29 16:26 dovecot-acl-list -rw------- 1 vmail vmail 260484 Apr 29 16:27 dovecot.index.cache -rw------- 1 vmail vmail 8556 Apr 29 16:27 dovecot.index.log -rw------- 1 vmail vmail 648 Apr 29 16:26 dovecot.mailbox.log -rw------- 1 vmail vmail 20649 Apr 29 16:27 dovecot-uidlist -rw------- 1 vmail vmail 8 Apr 29 16:26 dovecot-uidvalidity -r--r--r-- 1 vmail vmail 0 Apr 29 16:26 dovecot-uidvalidity.535fb6a3 drwx------ 5 vmail vmail 4096 Apr 29 16:27 .Drafts drwx------ 6 vmail vmail 4096 Apr 29 16:27 .Junk -rw------- 1 vmail vmail 0 Apr 29 16:26 maildirfolder -rw------- 1 vmail vmail 25 Apr 29 16:27 maildirsize drwx------ 2 vmail vmail 4096 Apr 29 16:26 new drwx------ 5 vmail vmail 4096 Apr 29 16:27 .Sent -rw------- 1 vmail vmail 574 Apr 29 16:26 subscriptions drwx------ 2 vmail vmail 24576 Apr 29 16:27 tmp drwx------ 5 vmail vmail 4096 Apr 29 16:27 .Trash
Login-Test mit telnet
Um zu Überprüfen, ob eine Anmeldung als Benutzer von einem entfernten Rechner möglich ist, kann nachfolgender Befehl genutzt werden:
# telnet 192.168.0.80 143 Trying 192.168.0.80... Connected to 192.168.0.80. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=DIGEST-MD5 AUTH=CRAM-MD5 AUTH=LOGIN] Dovecot ready. a1 login klaus@tachtler.net geheim a1 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE COMPRESS=DEFLATE QUOTA ACL RIGHTS=texk] Logged in a2 list "" "*" * LIST (\HasChildren) "/" INBOX * LIST (\HasNoChildren \Junk) "/" INBOX/Junk * LIST (\HasNoChildren \Sent) "/" INBOX/Sent * LIST (\HasNoChildren \Trash) "/" INBOX/Trash * LIST (\HasNoChildren \Drafts) "/" INBOX/Drafts a2 OK List completed. a3 logout * BYE Logging out a3 OK Logout completed. Connection closed by foreign host.
Erforderliche Benutzereingaben:
telnet 192.168.0.80 143
a1 login klaus@tachtler.net geheim
a2 list "" "*"
a3 logout