Sichern, wiederherstellen und aktualisieren
Dieses Tutorial sichert die Außenpostenkonfiguration, Zugangsdaten, Gerätegewährungen, Überwachungskontrollpunkte und Benachrichtigungen in der Warteschlange. Die ursprünglichen E-Mail-Nachrichten verbleiben bei Ihrem E-Mail-Anbieter. Dieses Backup stellt die Mailwake-Instanz wieder her.
1. Was zu bewahren ist
Ein wiederherstellbares Backup enthält:
-
Das vollständige
/data-Verzeichnis:mailwake.db,secret.keyund zugehörige SQLite-Dateien. Halten Sie die Datenbank und den Schlüssel zusammen. - Erstellen Sie die Konfiguration: Ports, Volumes und Umgebungseinstellungen.
- Das laufende Image: Stellen Sie die gleiche Programmversion wie die Datenbank wieder her.
Das folgende Skript zielt auf die Standardinstallation von Compose ab. Es speichert die Konfiguration und das Image, stoppt den Außenposten kurzzeitig, kopiert alle Daten und startet den Außenposten dann neu. Während dieses Intervalls wird die Überwachung unterbrochen. Nach dem Neustart fährt der Außenposten mit gespeicherten Prüfpunkten fort und holt Nachrichten ab, die sich noch im Ordner befinden und innerhalb der letzten 24 Stunden empfangen wurden.
Wenn Ihre Installation eine Reverse-Proxy-Konfiguration oder andere auf dem Host bereitgestellte Dateien verwendet, kopieren Sie diese Dateien ebenfalls in die Sicherung. Passen Sie ihre Pfade an, wenn Sie sie auf einem anderen Computer wiederherstellen.
2. Erstellen Sie Ihr erstes Backup
Laden Sie Backup-Skript herunter,
speichern Sie es unter dem Namen backup.sh und legen
Sie es in Ihrem Serverinstallationsverzeichnis ab, zum Beispiel
~/mailwake/backup.sh .
Sehen Sie sich das Backup-Skript an
#!/bin/sh
# Copyright (C) 2026 Mailwake contributors
# SPDX-License-Identifier: AGPL-3.0-only
# License: https://www.gnu.org/licenses/agpl-3.0.html
# Back up a running Compose installation; execute as a user with Docker access.
set -eu
if [ "$#" -ne 2 ]; then
echo "Usage: backup.sh /absolute/compose-directory /absolute/backup-directory" >&2
exit 2
fi
case "$1:$2" in
/*:/*) ;;
*) echo "Use absolute directory paths." >&2; exit 2 ;;
esac
cd "$1"
umask 077
lock=".mailwake-backup.lock"
if ! mkdir "$lock" 2>/dev/null; then
echo "Could not create $PWD/$lock. Check directory permissions and active backups." >&2
exit 1
fi
restart=0
cleanup() {
result=$?
trap - EXIT
if [ "$restart" -eq 1 ]; then
docker compose start core >&2 || result=1
fi
rmdir "$lock" || result=1
exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
container=$(docker compose ps -q core)
if [ -z "$container" ]; then
echo "Start the Core service before running this backup." >&2
exit 1
fi
mkdir -p "$2"
backup="$2/mailwake-$(date +%Y%m%d-%H%M%S)"
test ! -e "$backup"
staging="$backup.incomplete"
mkdir "$staging"
mkdir "$staging/data"
docker compose config > "$staging/compose.yaml"
docker inspect --format '{{.Image}}' "$container" > "$staging/image-id.txt"
docker image save --output "$staging/image.tar" "$(cat "$staging/image-id.txt")"
restart=1
docker compose stop core >&2
docker compose cp core:/data/. "$staging/data/" >&2
docker compose start core >&2
restart=0
mv "$staging" "$backup"
printf 'Backup saved: %s\n' "$backup"
Führen Sie in Ihrem Serverterminal Folgendes aus:
sh "$HOME/mailwake/backup.sh" "$HOME/mailwake" "$HOME/mailwake-backups"
Überprüfen Sie das Ergebnis: Das Terminal gibt
Backup saved: mit dem neuen Verzeichnispfad aus und
docker compose ps zeigt an, dass der Außenposten wieder
läuft. Wenn das Kopieren fehlschlägt, versucht das Skript, den
Außenposten neu zu starten, und gibt einen Fehler zurück.
Verzeichnisse, die auf .incomplete enden, sind
unvollendete Sicherungen; Bewahren Sie diese zur Fehlerbehebung auf.
Das Sperrverzeichnis verhindert überlappende geplante und manuelle
Sicherungen. Wenn der Host abstürzt oder der Prozess gewaltsam
beendet wird, stellen Sie zunächst sicher, dass kein Backup
ausgeführt wird, entfernen Sie dann
.mailwake-backup.lock aus dem Installationsverzeichnis
und führen Sie das Skript erneut aus.
Jedes Backup hat dieses Layout:
mailwake-20261008-030000/
compose.yaml
image-id.txt
image.tar
data/
mailwake.db
secret.key
...
Das Speichern des Images erfordert zusätzlichen Speicherplatz und
erfolgt, bevor der Außenposten stoppt. Das Verzeichnis verwendet
private Berechtigungen und enthält sowohl die verschlüsselten
Anmeldeinformationen als auch deren Schlüssel. Bestätigen Sie, dass
data/mailwake.db, data/secret.key und
image.tar vorhanden sind, und führen Sie dann die unten
stehende Wiederherstellungsübung mindestens einmal durch.
3. Wiederherstellen in einem neuen Volume
Stoppen Sie die ursprüngliche Instanz und behalten Sie ihr ursprüngliches Volume bei. Beide Instanzen teilen sich die Postfach- und Geräteidentitäten und führen daher jeweils nur eine aus.
cd ~/mailwake
docker compose stop core
Stellen Sie backup auf Ihren tatsächlichen
Sicherungspfad ein. Bereiten Sie ein neues Installationsverzeichnis,
dessen Image und Konfiguration vor:
backup="$HOME/mailwake-backups/mailwake-20261008-030000"
mkdir -p ~/mailwake-restored
cd ~/mailwake-restored
cp "$backup/compose.yaml" ./compose.yaml
docker load --input "$backup/image.tar"
restore_volume="mailwake-restored-$(date +%Y%m%d-%H%M%S)"
cat > compose.override.yaml <<EOF
name: mailwake-restored
services:
core:
image: $(cat "$backup/image-id.txt")
volumes:
core-data:
name: $restore_volume
networks:
default:
name: $restore_volume-network
EOF
Compose lädt automatisch compose.override.yaml . Es
wählt ein neues Datenvolumen und das genaue gesicherte Image aus.
Erstellen Sie den Container, kopieren Sie Daten, legen Sie den
Besitz für den Containerbenutzer fest und starten Sie:
(
set -eu
docker compose create --pull never core
docker compose run --rm --no-deps -T --user 0:0 --entrypoint sh core \
-c 'entries=$(ls -A /data) && test -z "$entries"'
docker compose cp "$backup/data/." core:/data/
docker compose run --rm --no-deps -T --user 0:0 --cap-add CHOWN --entrypoint chown core \
-R 10001:10001 /data
docker compose up -d --pull never
docker compose logs --tail=50 core
)
Fahren Sie erst fort, nachdem jeder Befehl erfolgreich war. Wenn die
Überprüfung des leeren Volumes fehlschlägt, wählen Sie ein neues
restore_volume aus, schreiben Sie die Überschreibung
neu und erstellen Sie den Container neu. Ein bevölkertes Ziel könnte
alte Dateien mit wiederhergestellten Daten vermischen; Dieses
Verfahren verwendet ein leeres Volume.
Überprüfen Sie das Ergebnis: Melden Sie sich mit
Ihrem ursprünglichen Administratorkennwort an. Postfächer und
Ordnerauswahlen bleiben vorhanden, die Überwachung wird fortgesetzt
und Gerätezuweisungen erfolgen aus der Sicherung. Wenn Sie einen
neuen Setup-Bildschirm sehen, stoppen Sie die wiederhergestellte
Instanz und überprüfen Sie den Kopierpfad und die Volume-Mount.
Bestätigen Sie bei Entschlüsselungsfehlern, dass die Datenbank und
secret.key aus derselben Sicherung stammen.
4. Überprüfen Sie die wiederhergestellte Instanz
- Überprüfen Sie die Postfachanzahl, ausgewählte Ordner und Prüfmethoden mit der Originalinstallation.
- Senden Sie eine Kanaltestbenachrichtigung und bestätigen Sie, dass sie auf Ihrem Telefon eintrifft.
- Senden Sie eine neue E-Mail aus einem anderen Postfach in einen überwachten Ordner und überprüfen Sie den Zustellungsdatensatz.
- Starten Sie die wiederhergestellte Instanz neu, melden Sie sich erneut an und bestätigen Sie, dass ihre Konfiguration und Überwachung bestehen bleibt.
Richten Sie nach der Überprüfung den Reverse-Proxy auf die
wiederhergestellte Instanz und verwalten Sie sie über
~/mailwake-restored. Aktualisieren Sie den
Sicherungsauftrag, um dieses Verzeichnis zu verwenden. Lassen Sie
die ursprüngliche Instanz gestoppt und behalten Sie ihr Volume und
die Sicherung bei, bis die Wiederherstellung bestätigt ist.
Ausstehende oder fehlgeschlagene Benachrichtigungen kehren in ihren gesicherten Zustand zurück und können erneut zugestellt werden. Verwenden Sie dasselbe Verfahren, um ein Upgrade rückgängig zu machen und dabei die alten Daten und das alte Image wiederherzustellen.
5. Planen Sie Backups und bewahren Sie eine externe Kopie auf
Führen Sie auf einem Linux-Server zunächst eine manuelle Sicherung
durch und fügen Sie dann mit crontab -e Folgendes
hinzu. Ersetzen Sie /home/you durch Ihre absoluten
Pfade:
PATH=/usr/local/bin:/usr/bin:/bin
0 3 * * * /bin/sh /home/you/mailwake/backup.sh /home/you/mailwake /home/you/mailwake-backups >> /home/you/mailwake-backup.log 2>&1
Dies läuft täglich um 03:00 Uhr in der lokalen Zeitzone des Servers.
Der geplante Benutzer benötigt Docker-Zugriff. Verwenden Sie auf
einem NAS denselben Shell-Befehl im Taskplaner. Suchen Sie am
nächsten Tag im Protokoll nach einem neuen Verzeichnis und
Backup saved:. Fehler beheben; Ein Planer kann nicht
feststellen, dass eine Sicherung wiederherstellbar ist.
Ein Backup auf derselben Festplatte deckt keinen Festplatten- oder Maschinenausfall ab. Kopieren Sie abgeschlossene Verzeichnisse auf eine andere Maschine oder einen geschützten Backup-Speicher, beispielsweise über SSH:
scp -r "$HOME/mailwake-backups/mailwake-20261008-030000" \
backup-user@backup-host:/srv/mailwake-backups/
Ersetzen Sie die Quelle, den Remote-Benutzer, den Host und das Ziel. Beschränken Sie den Zugriff am Ziel auf Backup-Betreuer. Verwenden Sie verschlüsselten Speicher oder verschlüsseln Sie das Archiv vor dem Hochladen, wenn eine Verschlüsselung im Ruhezustand erforderlich ist. Eine mögliche Aufbewahrungsrichtlinie sieht sieben tägliche und vier wöchentliche Kopien vor. Bevor Sie ältere Backups löschen, überprüfen Sie die externe Kopie und eine kürzlich durchgeführte Wiederherstellung.
Sichern Sie eine Docker Run-Installation
Die Docker Run-Installation verwendet einen Container namens
mailwake und ein Volume mailwake-data.
Diese Befehle werden in einer Subshell ausgeführt und versuchen, den
ursprünglichen Container neu zu starten, wenn das Kopieren
fehlschlägt:
(
set -eu
umask 077
backup="$HOME/mailwake-backups/mailwake-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$backup/data"
docker inspect --format '{{.Image}}' mailwake > "$backup/image-id.txt"
docker image save --output "$backup/image.tar" "$(cat "$backup/image-id.txt")"
trap 'docker start mailwake >/dev/null' EXIT
docker stop mailwake
docker cp mailwake:/data/. "$backup/data/"
docker start mailwake
trap - EXIT
printf 'Backup saved: %s\n' "$backup"
)
Speichern Sie Ihren Docker Run-Befehl zusammen mit den Daten.
Stoppen Sie zum Wiederherstellen den ursprünglichen Container, laden
Sie image.tar, erstellen Sie ein neues Volume und einen
neuen Container und kopieren Sie die Daten, bevor Sie beginnen:
(
set -eu
backup="$HOME/mailwake-backups/mailwake-20261008-030000"
image=$(cat "$backup/image-id.txt")
restore_volume="mailwake-restored-$(date +%Y%m%d-%H%M%S)"
docker stop mailwake
docker load --input "$backup/image.tar"
docker volume create "$restore_volume"
docker create --name mailwake-restored --restart unless-stopped \
--stop-timeout 30 --read-only --security-opt no-new-privileges:true --cap-drop ALL \
-p 127.0.0.1:8080:8080 -v "$restore_volume:/data" "$image"
docker run --rm --user 0:0 --entrypoint sh -v "$restore_volume:/data" "$image" \
-c 'entries=$(ls -A /data) && test -z "$entries"'
docker cp "$backup/data/." mailwake-restored:/data/
docker run --rm --user 0:0 --entrypoint chown -v "$restore_volume:/data" "$image" \
-R 10001:10001 /data
docker start mailwake-restored
)
Fahren Sie erst fort, nachdem jeder Befehl erfolgreich war, und befolgen Sie die oben stehende Überprüfungscheckliste. Behalten Sie den ursprünglichen Container und das ursprüngliche Volume bei und lassen Sie den ursprünglichen Container angehalten, während die wiederhergestellte Instanz ausgeführt wird.
Markdown · AGPL-3.0-only · Mailwake-Mitwirkende