Es ist mehr als ratsam, eine Anwendung, einen Server oder eine Installation jeglicher Art zu sichern, um Verluste aufgrund technischer Störungen, menschlicher Fehler oder Rollback-Situationen zu vermeiden.
IceWarp-Backup im Allgemeinen
IceWarp verfügt im Allgemeinen über zwei Arten von Daten:
- E-Mails und Dokumente werden direkt auf einem Dateisystem gespeichert, im Wesentlichen als .imap-Dateien.
- Andere Daten, wie Kontakte und Kalender (Groupware), werden in der Datenbank gespeichert.
Basierend auf den Spezifikationen der Installation empfiehlt es sich, eine Kombination aus folgenden Sicherungsmethoden zu verwenden:
- Snapshots mittels Virtualisierungstechnologie oder einem dedizierten Speichersystem.
- Datenbank mittels Skripten, die manuell/vom Scheduler gestartet werden.
- E-Mail-Dateien mittels Skripten, die manuell/vom Scheduler gestartet werden.
- Datenbank und Dateien mithilfe von Technologien von Drittanbietern.
- Datenbank mithilfe des integrierten IceWarp-Mechanismus.
- Konfiguration manuell oder mithilfe integrierter Tools.
Vergessen Sie nicht, dass die Konfiguration von Backups mit einem Wiederherstellungstest endet, um sicherzustellen, dass der konfigurierte Backup-Mechanismus zuverlässig ist. Versuchen Sie während des Wiederherstellungstests, nicht nur IceWarp als Ganzes wiederherzustellen, sondern auch Ordner für Ordner oder Datei für Datei, da die Wiederherstellung einer einzelnen fehlenden Datei wahrscheinlicher ist als die Wiederherstellung des gesamten Servers.
Einige der in diesem allgemeinen Abschnitt beschriebenen Ansätze werden anhand der Beispiele in den folgenden Abschnitten erläutert.
Sicherung der Datenbank und der Dateien mit einem Linux-Bash-Skript
Einer der oben beschriebenen Ansätze besteht in der Verwendung eines Skripts mit Standard-Dateioperationen und -Tools. Nachfolgend finden Sie ein Beispiel für ein bin/bash-Skript zum Erstellen der Sicherung auf der Linux-IceWarp-Installation – Dateien und Datenbank. Ein solches Skript kann in die crontab aufgenommen werden und beispielsweise jede Nacht gestartet werden.
Warnung: Lesen Sie das Skript sorgfältig durch und verstehen Sie es vollständig, bevor Sie es anwenden. Vergessen Sie nicht, alle erforderlichen Variablen entsprechend Ihrer spezifischen Installation zu ändern, insbesondere Pfade und Verzeichnisnamen.
#!/bin/bash
source /etc/icewarp/icewarp.conf
maildirpath="$(${IWS_INSTALL_DIR}/tool.sh get system C_System_Storage_Dir_MailPath | grep -P '(?<=: ).*(?=/mail/)' -o)"
backuppath="${maildirpath}/backup"
scriptdir="$(cd $(dirname $0) && pwd)"
mkdir -p ${maildirpath}
mkdir -p ${backuppath}
mkdir -p ${scriptdir}/logs
backupsrvhost="${1}" # if we take backups from another host
backupsrvport="${2}" # than the one we connect to
logdate="$(date +%Y%m%d)"
logfile="${scriptdir}/logs/bck_${logdate}.log"
function log {
echo $(date +%H:%M:%S) $1 >> ${logfile}
}
log "Starting backup."
utiltest="$(/usr/bin/find /usr/lib64 -type f -name "Entities.pm")"
if [[ -z "${utiltest}" ]]
then
log "Installing Entities.pm"
/usr/bin/yum -y install epel-release
/usr/bin/yum -y install perl-HTML-Encoding.noarch
fi
log "Reading DB access data."
dbpass="$(/usr/bin/cat ${IWS_INSTALL_DIR}/config/_webmail/server.xml | cat ${IWS_INSTALL_DIR}/config/_webmail/server.xml | egrep -o ".*" | perl -pe 's|^\<dbpass\>(.*)\</dbpass\>$|\1|' | perl -MHTML::Entities -pe 'decode_entities($_);')"
wcdbuser="$(/usr/bin/cat ${IWS_INSTALL_DIR}/config/_webmail/server.xml | egrep -o ".*" | perl -pe 's|^\<dbuser\>(.*)\</dbuser\>$|\1|')"
read -r dbhost dbport wcdbname <<< $(cat ${IWS_INSTALL_DIR}/config/_webmail/server.xml | egrep -o "mysql:host=.*;port=.*;dbname=.*" | perl -pe 's|^\<dbconn\>mysql:host=(.*);port=(.*);dbname=(.*)\</dbconn\>$|\1 \2 \3|')
read -r accdbname accdbuser <<< $(${IWS_INSTALL_DIR}/tool.sh get system c_system_storage_accounts_odbcconnstring | perl -pe 's|^c_system_storage_accounts_odbcconnstring: (.*);(.*);.*;.*;.*;.*$|\1 \2|')
read -r aspdbname aspdbuser <<< $(${IWS_INSTALL_DIR}/tool.sh get system c_as_challenge_connectionstring | perl -pe 's|^c_as_challenge_connectionstring: (.*);(.*);.*;.*;.*;.*$|\1 \2|')
read -r grwdbname grwdbuser <<< $(${IWS_INSTALL_DIR}/tool.sh get system c_gw_connectionstring | perl -pe 's|^c_gw_connectionstring: (.*);(.*);.*;.*;.*;.*$|\1 \2|')
read -r dcdbname dcdbuser <<< $(${IWS_INSTALL_DIR}/tool.sh get system c_accounts_global_accounts_directorycacheconnectionstring | perl -pe 's|^c_accounts_global_accounts_directorycacheconnectionstring: (.*);(.*);.*;.*;.*;.*$|\1 \2|')
easdbname="$(${IWS_INSTALL_DIR}/tool.sh get system c_activesync_dbconnection | ${IWS_INSTALL_DIR}/tool.sh get system c_activesync_dbconnection | egrep -o "mysql:host=.*;dbname=.*" | perl -pe 's|^mysql:host=.*;port=.*;dbname=(.*)$|\1|')"
easdbuser="$(${IWS_INSTALL_DIR}/tool.sh get system c_activesync_dbuser | perl -pe 's|^c_activesync_dbuser: (.*)$|\1|')"
easdbpass="$(${IWS_INSTALL_DIR}/tool.sh get system c_activesync_dbpass | perl -pe 's|^c_activesync_dbpass: (.*)$|\1|')"
if [ -z "${easdbpass}" ]; then easdbpass="easdbpass not discovered"; fi
if [[ "${dbpass}" =~ "^sqlite:.*" ]]; then dbpass="${easdbpass}"; fi
if [ -z "${dbpass}" ]; then dbpass="dbpass not discovered"; fi
if [ ! -z "${backupsrvhost}" ]; then dbhost="${backupsrvhost}"; fi # if we take backups from another host
if [ ! -z "${backupsrvport}" ]; then dbport="${backupsrvport}"; fi # than the one we connect to
/usr/bin/mysqldump --single-transaction -u ${accdbuser} -p${dbpass} -h${dbhost} -P ${dbport} ${accdbname} | gzip -c | cat > ${backuppath}/bck_db_acc_${accdbname}`date +%Y%m%d-%H%M`.sql.gz &
/usr/bin/mysqldump --single-transaction -u ${aspdbuser} -p${dbpass} -h${dbhost} -P ${dbport} ${aspdbname} | gzip -c | cat > ${backuppath}/bck_db_asp_${aspdbname}`date +%Y%m%d-%H%M`.sql.gz &
/usr/bin/mysqldump --single-transaction -u ${grwdbuser} -p${dbpass} -h${dbhost} -P ${dbport} ${grwdbname} | gzip -c | cat > ${backuppath}/bck_db_grw_${grwdbname}`date +%Y%m%d-%H%M`.sql.gz &
/usr/bin/mysqldump --single-transaction -u ${dcdbuser} -p${dbpass} -h${dbhost} -P ${dbport} ${dcdbname} | gzip -c | cat > ${backuppath}/bck_db_dc_${dcdbname}`date +%Y%m%d-%H%M`.sql.gz &
/usr/bin/mysqldump --single-transaction -u ${easdbuser} -p${easdbpass} -h${dbhost} -P ${dbport} ${easdbname} | gzip -c | cat > ${backuppath}/bck_db_eas_${easdbname}`date +%Y%m%d-%H%M`.sql.gz &
/usr/bin/mysqldump --single-transaction -u ${wcdbuser} -p${dbpass} -h${dbhost} -P ${dbport} ${wcdbname} | gzip -c | cat > ${backuppath}/bck_db_wc_${wcdbname}`date +%Y%m%d-%H%M`.sql.gz &
log "Finished DB backup."
wait ${!}
log "Starting IW config backup."
/usr/bin/tar -czf ${backuppath}/bck_cnf`date +%Y%m%d-%H%M`.tgz ${IWS_INSTALL_DIR}/config > /dev/null 2>&1
/usr/bin/tar -czf ${backuppath}/bck_cal`date +%Y%m%d-%H%M`.tgz ${IWS_INSTALL_DIR}/calendar > /dev/null 2>&1
${IWS_INSTALL_DIR}/tool.sh export account "*@*" u_backup > ${backuppath}/bck_acc_backup`date +%Y%m%d-%H%M`.csv
${IWS_INSTALL_DIR}/tool.sh export domain "*" d_backup > ${backuppath}/bck_dom_backup`date +%Y%m%d-%H%M`.csv
log "Finished IW config backup."
log "Cleaning old backups and logs."
/usr/bin/find ${backuppath}/ -type f -name "bck_*" -mtime +3 -delete > /dev/null 2>&1
/usr/bin/find ${scriptdir}/logs/ -type f -name "bck_*.log" -mtime +30 -delete > /dev/null 2>&1
log "All done."
exit 0
Sicherung der MySQL-Datenbank in der Windows-Umgebung
Das obige Beispiel sichert die Dateien und Datenbankeinträge. Wie bereits erwähnt, werden Dateien wie E-Mails direkt im Dateisystem gespeichert, und die Handhabung ist sehr ähnlich wie im vorherigen Teil. Die Handhabung von Datenbanken unter Windows kann spezifisch sein. Nachfolgend finden Sie ein Beispiel für eine MySQL-Sicherung mit einer .bat-Datei und robocopy und 7zip. Beide müssen auf dem Server installiert sein, auf dem das Skript ausgeführt wird.
Warnung: Lesen Sie das Skript sorgfältig durch und machen Sie sich mit ihm vertraut, bevor Sie es anwenden. Vergessen Sie nicht, alle erforderlichen Variablen entsprechend Ihrer spezifischen Installation anzupassen, insbesondere Pfade und Verzeichnisnamen.
@echo off
:: db admin user and password
set dbUser=user
set dbPassword=pass
:: IceWarp installation dir
set iwMainDir="C:\Program Files\IceWarp"
:: backup retention temp dir
set rtDir="C:\Program Files\IceWarp\backup\temp"
:: how many older backups do we keep
set rtDays=3
:: directory where to store the backups
set backupDir="C:\Program Files\IceWarp\backup\dbdump"
:: MySQL data dir
set mysqlDataDir="C:\Program Files\MariaDB 10.2\data"
:: full path to mysqldump.exe binary
set mysqldump="C:\Program Files\MariaDB 10.2\bin\mysqldump.exe"
:: full path to 7z.exe binary
set zip="C:\Program Files\7-Zip\7z.exe"
if not exist %backupDir% mkdir %backupDir%
if not exist %rtDir% mkdir %rtDir%
:: get date ( on windows in cs lang, change delim from / to ., ie.: for /F "tokens=2-4 delims=. )
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do (
set yy=%%i
set mon=%%j
set dd=%%k
)
:: get time
for /F "tokens=5-8 delims=:. " %%i in ('echo.^| time ^| find "current" ') do (
set hh=%%i
set min=%%j
)
echo dirName=%yy%%mon%%dd%_%hh%%min%
set dirName=%yy%%mon%%dd%_%hh%%min%
:: switch to the "data" folder
pushd %mysqlDataDir%
:: iterate over the folder structure in the "data" folder to get the databases
for /d %%f in (*) do (
if not exist %backupDir%\%dirName%\ (
mkdir %backupDir%\%dirName%
)
%mysqldump% --host="localhost" --user=%dbUser% --password=%dbPassword% --single-transaction --add-drop-table --databases %%f > %backupDir%\%dirName%\%%f.sql
%zip% a -tgzip %backupDir%\%dirName%\%%f.sql.gz %backupDir%\%dirName%\%%f.sql
del %backupDir%\%dirName%\%%f.sql
)
popd
:: backup server settings
%iwMainDir%\tool.exe export account "*@*" u_backup > %backupDir%\%dirName%\acc_u_backup.csv
%iwMainDir%\tool.exe export domain "*" d_backup > %backupDir%\%dirName%\dom_d_backup.csv
%zip% a -r %backupDir%\%dirName%\cfg.7z %iwMainDir%\config
%zip% a -r %backupDir%\%dirName%\cal.7z %iwMainDir%\calendar
:: remove backups older than 3 days
ROBOCOPY %backupDir% %rtDir% /mov /minage:%rtDays%
del "%rtDir%" /q
Wiederherstellungstest – Ordner mit mehreren Dateien (Linux)
- Finden Sie heraus, wann die fehlende Datei zuletzt aufgetreten ist. Zum Beispiel in den Snapshots im Verzeichnis /mnt/data/.zfs/snapshot/
- Dann rsync Sie zurück zu prod. maildir, zum Beispiel: rsync -av --include=„*/“ --include=„*.imap“ --exclude=„*“ /mnt/data/.zfs/snapshot/20220228-0000/icewarp/mail/domainexample.com/exampleaccount/inbox/ /mnt/data/icewarp/mail/domainexample.com/examleaccount/
- Führen Sie bei Bedarf den Befehl chown auf icewar:icewarp oder einem anderen Benutzerkonto aus, in dessen Kontext IW ausgeführt wird: chown -R icewarp:icewarp /mnt/data/icewarp/mail/domainexample.com/exampleaccount/inbox
- Wichtig – Verzeichnis-Cache aktualisieren: /opt/icewarp/tool.sh set account „account@domain.com” u_directorycache_refreshnow 1
- Wenn das Aktualisieren des Verzeichnis-Caches nicht ausreicht, setzen Sie auch den WebClient-Cache zurück: https://<DOMAIN>/wccm/main.php oder möglicherweise https://<DOMAIN>/webmail/wccm/main.php
- Bei weiteren Problemen: Starten Sie IMAP neu -> aktualisieren Sie den Verzeichnis-Cache -> aktualisieren Sie den WebClient-Cache
Wiederherstellungstest – bestimmte Datei (Linux)
In diesem Beispiel wird die Wiederherstellung erneut vom Pfad /mnt/data/.zfs/snapshot/ aus betrachtet.
- Finden Sie heraus, wo die fehlende Datei zuletzt aufgetreten ist. Dies kann durch Durchsuchen des Dateisystems mit grep und regulären Ausdrücken erfolgen: grep -Rl „Hallo, mein Name ist Alejandro“ /mnt/data/.zfs/snapshot/20220228-0000/icewarp/mail/domainexample.com/exampleaccount/inbox/ sucht rekursiv nach dieser Zeichenfolge im Ordner exampleaccount/inbox.
- Kopieren Sie die E-Mail, zum Beispiel: cp /mnt/data/.zfs/snapshot/20220228-0000/icewarp/mail/domainexample.com/exampleaccount/inbox/2022052512562547.imap /mnt/data/icewarp/mail/domainexample.com/exampleaccount/inbox
- Führen Sie bei Bedarf den Befehl chown auf icewar:icewarp oder einem anderen Benutzerkonto aus, in dessen Kontext IW ausgeführt wird: chown -R icewarp:icewarp /mnt/data/icewarp/mail/domainexample.com/exampleaccount/inbox
- Aktualisieren Sie den Verzeichnis-Cache: /opt/icewarp/tool.sh set account „account@domain.com“ u_directorycache_refreshnow 1
- Wenn die Aktualisierung des Verzeichnis-Caches nicht ausreicht, setzen Sie auch den WebClient-Cache zurück: https://<DOMAIN>/wccm/main.php oder möglicherweise https://<DOMAIN>/webmail/wccm/main.php
- Bei weiteren Problemen: IMAP neu starten -> Verzeichnis-Cache aktualisieren -> WebClient-Cache aktualisieren
Die Konfigurationsdaten des IceWarp-Servers werden in folgenden Ordnern gespeichert:
- {Installationsverzeichnis}/config/
- {Installationsverzeichnis}/spam/
- {Installationsverzeichnis}/calendar/
- {Installationsverzeichnis}/_webmail/config/
Diese Ordner enthalten die folgenden Informationen:
- Alle Systemeinstellungen
- Benutzer, Domänen und alle damit verbundenen Einstellungen
- Die Ordner „Calendar” und „Spam” enthalten die Standard-SQLite-Datenbanken für Groupware und Antispam. Diese enthalten die Daten für Kontakte, Kalender sowie weiße und schwarze Listen.
- Die Sicherung kann über die Remote-Konsole durchgeführt werden: Menüoption „Datei > Einstellungen sichern”. Sie kann auch über die Funktion „Extras > Systemsicherung” automatisiert werden.
Wenn Sie externe Datenbanken (MySQL, Microsoft SQL Server usw.) für Konten, Groupware oder Antispam verwenden, muss die Sicherung der Datenbank manuell oder mithilfe der Option im Abschnitt „System > Tools > Systemsicherung > Datenbank“ durchgeführt werden, um Ihre Datenbanken mit einem anderen Datenbankserver zu synchronisieren.
Weitere Informationen finden Sie in diesem Artikel.
Es wird seitens des Herstellers nicht empfohlen, ein integriertes Tool für die Sicherung der E-Mail-Dateien zu verwenden. Das interne Tool erstellt eine große ZIP-Datei, die aufgrund von Technologie-/Serverbeschränkungen, insbesondere bei großen Installationen, schwierig zu handhaben sein kann.
Abschließende Hinweise
Sofern es nicht direkt mit IceWarp zusammenhängt, vergessen Sie nicht, die RTO- (Recovery Time Objective) und RPO-Zeiten (Recovery Point Objective) einzuschätzen. Es ist wichtig zu verstehen, dass die Wiederherstellung Zeit braucht, und es ist sinnvoll, zu wissen, wie viel Zeit dies in Ihrer Umgebung ist. Einfach ausgedrückt ist RTO, wie schnell Daten wiederhergestellt werden können, und RPO, bis zu welchem Punkt. Vergessen Sie nicht, dass bei einer täglichen Sicherung der RPO 24 Stunden beträgt. Das bedeutet, dass der RPO die Zeitspanne im schlimmsten Fall ist.
Testen Sie die Backups regelmäßig. Führen Sie vor jedem Update ein manuelles Backup durch.
Überprüfen Sie die Konsistenz des Backups im Zusammenhang mit dem für Backup-Dateien zugewiesenen Speicherplatz. In vielen realen Szenarien wurden Backups aufgrund unzureichenden Speicherplatzes nicht durchgeführt.
Vergessen Sie nicht, die Erstellung von Backups selbst in das Überwachungssystem aufzunehmen.