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.key und 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

sh
#!/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

  1. Überprüfen Sie die Postfachanzahl, ausgewählte Ordner und Prüfmethoden mit der Originalinstallation.
  2. Senden Sie eine Kanaltestbenachrichtigung und bestätigen Sie, dass sie auf Ihrem Telefon eintrifft.
  3. Senden Sie eine neue E-Mail aus einem anderen Postfach in einen überwachten Ordner und überprüfen Sie den Zustellungsdatensatz.
  4. 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