Sauvegarder, restaurer et mettre à jour

Ce didacticiel sauvegarde la configuration de l'avant-poste, les informations d'identification d'accès, les autorisations d'appareil, la surveillance des points de contrôle et les notifications en file d'attente. Les e-mails originaux restent chez votre fournisseur de messagerie ; cette sauvegarde restaure l'instance Mailwake.

1. Que conserver

Une sauvegarde récupérable contient :

  • Le répertoire complet /data : mailwake.db , secret.key et les fichiers SQLite associés. Conservez la base de données et la clé ensemble.
  • Composer la configuration : ports, volumes et paramètres d'environnement.
  • L'image en cours d'exécution : restaurez la même version du programme que la base de données.

Le script ci-dessous cible l'installation standard de Compose. Il enregistre la configuration et l'image, arrête brièvement l'avant-poste, copie toutes les données, puis redémarre l'avant-poste. La surveillance s'interrompt pendant cet intervalle. Après le redémarrage, l'avant-poste reprend les points de contrôle enregistrés et récupère les messages toujours dans le dossier reçus au cours des dernières 24 heures.

Si votre installation utilise une configuration de proxy inverse ou d'autres fichiers montés sur l'hôte, copiez également ces fichiers dans la sauvegarde. Ajustez leurs chemins lors de la restauration sur une autre machine.

2. Créez votre première sauvegarde

Téléchargez le script de sauvegarde , enregistrez-le sous le nom backup.sh et placez-le dans le répertoire d'installation de votre serveur, par exemple ~/mailwake/backup.sh .

Afficher le script de sauvegarde

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"

Exécutez dans le terminal de votre serveur :

sh "$HOME/mailwake/backup.sh" "$HOME/mailwake" "$HOME/mailwake-backups"

Vérifiez le résultat : le terminal imprime Backup saved: avec le nouveau chemin de répertoire et docker compose ps affiche à nouveau l'avant-poste en cours d'exécution. Si la copie échoue, le script tente de redémarrer l'avant-poste et renvoie un échec. Les répertoires se terminant par .incomplete sont des sauvegardes inachevées ; conservez-les pour le dépannage.

Le répertoire de verrouillage empêche le chevauchement des sauvegardes planifiées et manuelles. Si l'hôte tombe en panne ou si le processus est arrêté de force, confirmez d'abord qu'aucune sauvegarde n'est en cours d'exécution, puis supprimez .mailwake-backup.lock du répertoire d'installation et réexécutez le script.

Chaque sauvegarde a cette disposition :

mailwake-20261008-030000/
  compose.yaml
  image-id.txt
  image.tar
  data/
    mailwake.db
    secret.key
    ...

L'enregistrement de l'image nécessite de l'espace disque supplémentaire et se produit avant l'arrêt de l'avant-poste. Le répertoire utilise des autorisations privées et contient à la fois les informations d'identification chiffrées et leur clé. Confirmez que data/mailwake.db , data/secret.key et image.tar existent, puis effectuez l'exercice de restauration ci-dessous au moins une fois.

3. Restaurer dans un nouveau volume

Arrêtez l'instance d'origine et conservez son volume d'origine. Les deux instances partagent les identités de boîte aux lettres et d’appareil, vous n’en exécutez donc qu’une seule à la fois.

cd ~/mailwake
docker compose stop core

Définissez backup sur votre chemin de sauvegarde réel. Préparez un nouveau répertoire d'installation, son image et sa configuration :

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 charge automatiquement compose.override.yaml . Il sélectionne un nouveau volume de données et l'image sauvegardée exacte. Créez le conteneur, copiez les données, définissez la propriété de l'utilisateur du conteneur et démarrez :

(
  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
)

Continuez seulement après la réussite de chaque commande. Si la vérification du volume vide échoue, choisissez un nouveau restore_volume , réécrivez le remplacement et recréez le conteneur. Une destination renseignée peut mélanger d'anciens fichiers avec des données restaurées ; cette procédure utilise un volume vide.

Vérifiez le résultat : connectez-vous avec votre mot de passe administrateur d'origine. Les boîtes aux lettres et les sélections de dossiers restent présentes, la surveillance reprend et les autorisations d'appareil proviennent de la sauvegarde. Si vous voyez un nouvel écran de configuration, arrêtez l'instance restaurée et vérifiez le chemin de copie et le montage du volume. Pour les erreurs de déchiffrement, confirmez que la base de données et que secret.key proviennent de la même sauvegarde.

4. Vérifiez l'instance restaurée

  1. Vérifiez le nombre de boîtes aux lettres, les dossiers sélectionnés et vérifiez les méthodes par rapport à l'installation d'origine.
  2. Envoyez une notification de test de chaîne et confirmez qu'elle arrive sur votre téléphone.
  3. Envoyez un nouvel e-mail depuis une autre boîte aux lettres vers un dossier surveillé et vérifiez son historique de livraison.
  4. Redémarrez l'instance restaurée, reconnectez-vous et confirmez que sa configuration et sa surveillance persistent.

Une fois vérifié, pointez le proxy inverse vers l'instance restaurée et gérez-la à partir de ~/mailwake-restored . Mettez à jour le travail de sauvegarde pour utiliser ce répertoire. Laissez l'instance d'origine arrêtée et conservez son volume et la sauvegarde jusqu'à ce que la récupération soit confirmée.

Les notifications en attente ou en échec reviennent à leur état sauvegardé et peuvent être à nouveau envoyées. Utilisez la même procédure pour annuler une mise à niveau, en restaurant ensemble les anciennes données et l'image.

5. Planifiez des sauvegardes et conservez une copie hors site

Sur un serveur Linux, effectuez d'abord une sauvegarde manuelle, puis utilisez crontab -e pour ajouter les éléments suivants. Remplacez /home/you par vos chemins absolus :

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

Cela s'exécute quotidiennement à 03h00 dans le fuseau horaire local du serveur. L'utilisateur planifié a besoin d'un accès Docker. Sur un NAS, utilisez la même commande Shell dans son planificateur de tâches. Le lendemain, recherchez un nouveau répertoire et Backup saved: dans le journal. Résoudre les échecs ; un planificateur ne peut pas établir qu'une sauvegarde est récupérable.

Une sauvegarde sur le même disque ne couvre pas les pannes de disque ou de machine. Copiez les répertoires terminés sur une autre machine ou sur un stockage de sauvegarde protégé, par exemple via SSH :

scp -r "$HOME/mailwake-backups/mailwake-20261008-030000" \
  backup-user@backup-host:/srv/mailwake-backups/

Remplacez la source, l'utilisateur distant, l'hôte et la destination. Restreindre l’accès à la destination aux responsables de sauvegarde. Utilisez un stockage chiffré ou chiffrez l’archive avant de la télécharger lorsque le chiffrement au repos est nécessaire. Une politique de conservation possible est de sept copies quotidiennes et quatre copies hebdomadaires. Avant de supprimer des sauvegardes plus anciennes, vérifiez la copie hors site et un exercice de restauration récent.

Sauvegarder une installation Docker Run

L'installation Docker Run utilise un conteneur nommé mailwake et le volume mailwake-data . Ces commandes s'exécutent dans un sous-shell et tentent de redémarrer le conteneur d'origine si la copie échoue :

(
  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"
)

Enregistrez votre commande Docker Run à côté des données. Pour restaurer, arrêtez le conteneur d'origine, chargez image.tar , créez un nouveau volume et un nouveau conteneur, puis copiez les données avant de commencer :

(
  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
)

Continuez seulement après la réussite de chaque commande et suivez la liste de contrôle de vérification ci-dessus. Conservez le conteneur et le volume d'origine, en laissant le conteneur d'origine arrêté pendant l'exécution de l'instance restaurée.

Markdown · AGPL-3.0-only · Contributeurs de Mailwake