Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dovecot_backup_-_skript

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
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
  • 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=7
 
# CUSTOM - dovecot Folders.
MAILDIR_TYPE='maildir'
MAILDIR_NAME='Maildir'
MAILDIR_USER='vmail'
MAILDIR_GROUP='vmail'
 
# 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

/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 : 09.04.2017                                                   #
# Version     : 1.02                                                         #
#                                                                            #
# 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) 2017 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 variables 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     : 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 - 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`
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)'`
 
# 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 ""
log "+-----------------------------------------------------------------+"
log "| Start backup the mailboxes of dovecot server................... |"
log "+-----------------------------------------------------------------+"
log ""
log "Run script with following parameter:"
log ""
log "SCRIPT_NAME...: $SCRIPT_NAME"
log ""
log "DIR_BACKUP....: $DIR_BACKUP"
log ""
log "MAIL_RECIPIENT: $MAIL_RECIPIENT"
log "MAIL_STATUS...: $MAIL_STATUS"
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 "$PROG_SENDMAIL" ]; then
        log "Check if command '$PROG_SENDMAIL' was found................[FAILED]"
        sendmail ERROR
        movelog
        exit 18
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 20
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
 
# Start backup.
log ""
log "+-----------------------------------------------------------------+"
log "| Run backup $SCRIPT_NAME ..................................... |"
log "+-----------------------------------------------------------------+"
log ""
 
# Set right permissions to backup directory.
chown -R $MAILDIR_USER:$MAILDIR_GROUP $DIR_BACKUP
chmod 700 $DIR_BACKUP
 
# Start real backup process for all users.
for users in `doveadm user "*"`; do
        log "Start backup process for user: $users ..."
 
        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
 
        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 $users-$FILE_DELETE -t|head -n $BACKUPFILES_DELETE;ls $users-$FILE_DELETE )|sort|uniq -u|xargs 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
 
        log "Ended backup process for user: $users ..."
        log ""
done
 
# Delete LOCK file.
if [ "$?" != 0 ]; then
        retval $?
        log ""
        $RM_COMMAND -f $FILE_LOCK
        sendmail ERROR
        movelog
        exit 99
else
        log ""
        log "+-----------------------------------------------------------------+"
        log "| End backup $SCRIPT_NAME ..................................... |"
        log "+-----------------------------------------------------------------+"
        log ""
fi
 
# Finish syncing.
log "+-----------------------------------------------------------------+"
log "| Finish......................................................... |"
log "+-----------------------------------------------------------------+"
log ""
 
# Status e-mail.
if [ $MAIL_STATUS = 'Y' ]; then
        sendmail STATUS
fi
# Move temporary log to permanent log
movelog
 
exit 0

Skript - Log

Nachfolgende Log-Datei entsteht im Verzeichnis

  • /var/log/ - hier z.B. /var/log/dovecot_backup.log

2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: +-----------------------------------------------------------------+
2017/01/11 15:28:38  INFO: | Start backup the mailboxes of dovecot server................... |
2017/01/11 15:28:38  INFO: +-----------------------------------------------------------------+
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: Run script with following parameter:
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: SCRIPT_NAME...: dovecot_backup
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: DIR_BACKUP....: /srv/backup
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: MAIL_RECIPIENT: root@tachtler.net
2017/01/11 15:28:38  INFO: MAIL_STATUS...: N
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: Check if command '/bin/dsync' was found....................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/tar' was found......................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/touch' was found....................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/rm' was found.......................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/cat' was found......................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/date' was found.....................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/bin/mkdir' was found....................[ OK ]
2017/01/11 15:28:38  INFO: Check if command '/sbin/sendmail' was found................[ OK ]
2017/01/11 15:28:38  INFO: Check if script is NOT already runnig .....................[ OK ]
2017/01/11 15:28:38  INFO: Check if DIR_BACKUP exists.................................[ OK ]
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:38  INFO: +-----------------------------------------------------------------+
2017/01/11 15:28:38  INFO: | Run backup dovecot_backup ..................................... |
2017/01/11 15:28:38  INFO: +-----------------------------------------------------------------+
2017/01/11 15:28:38  INFO:
2017/01/11 15:28:39  INFO: Start backup process for user: klaus@tachtler.net ...
2017/01/11 15:28:39  INFO: Extract mailbox data for user: klaus@tachtler.net ...
2017/01/11 15:29:46  INFO: Packaging to archive for user: klaus@tachtler.net ...
2017/01/11 15:29:49  INFO: Delete archive files for user: klaus@tachtler.net ...
2017/01/11 15:29:49  INFO: Delete old archive files /srv/backup ...................[FAILED]
2017/01/11 15:29:49  INFO: Delete mailbox files for user: klaus@tachtler.net ...
2017/01/11 15:29:49  INFO: Delete mailbox files at: /srv/backup ...................[ OK ]
2017/01/11 15:29:49  INFO: Ended backup process for user: klaus@tachtler.net ...
2017/01/11 15:29:49  INFO:
2017/01/11 15:29:49  INFO: Start backup process for user: petra@tachtler.net ...
2017/01/11 15:29:49  INFO: Extract mailbox data for user: petra@tachtler.net ...
2017/01/11 15:29:58  INFO: Packaging to archive for user: petra@tachtler.net ...
2017/01/11 15:30:00  INFO: Delete archive files for user: petra@tachtler.net ...
2017/01/11 15:30:00  INFO: Delete old archive files /srv/backup ...................[FAILED]
2017/01/11 15:30:00  INFO: Delete mailbox files for user: petra@tachtler.net ...
2017/01/11 15:30:00  INFO: Delete mailbox files at: /srv/backup ...................[ OK ]
2017/01/11 15:30:00  INFO: Ended backup process for user: petra@tachtler.net ...
2017/01/11 15:30:02  INFO:
2017/01/11 15:30:02  INFO:
2017/01/11 15:30:02  INFO: +-----------------------------------------------------------------+
2017/01/11 15:30:02  INFO: | End backup dovecot_backup ..................................... |
2017/01/11 15:30:02  INFO: +-----------------------------------------------------------------+
2017/01/11 15:30:02  INFO:
2017/01/11 15:30:02  INFO: +-----------------------------------------------------------------+
2017/01/11 15:30:02  INFO: | Finish......................................................... |
2017/01/11 15:30:02  INFO: +-----------------------------------------------------------------+
2017/01/11 15:30:02  INFO:

Anmerkung zur Ausführung:

:!: 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-r--r--  1 root  root  51290558 Apr 29 15:11 klaus@tachtler.net-dovecot_backup_20140429_151044.tar.gz
-rw-r--r--  1 root  root  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:

  1. Das Backup befindet sich unter /srv/backup
  2. 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:

  1. Das Backup befindet sich unter /tmp/recovery/tachtler.net/klaus/Maildir/
  2. 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:

  1. Das Backup befindet sich unter /tmp/recovery/tachtler.net/klaus/Maildir/
  2. Der Benutzer lautet klaus@tachtler.net
  3. 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:

  1. telnet 192.168.0.80 143
  2. a1 login klaus@tachtler.net geheim
  3. a2 list "" "*"
  4. a3 logout
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
tachtler/dovecot_backup_-_skript.txt · Zuletzt geändert: 2017/04/09 08:45 von klaus