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.keyet 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
#!/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
- 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.
- Envoyez une notification de test de chaîne et confirmez qu'elle arrive sur votre téléphone.
- Envoyez un nouvel e-mail depuis une autre boîte aux lettres vers un dossier surveillé et vérifiez son historique de livraison.
- 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