Table des matières
Bonjour à tous,
Aujourd’hui, on va parler d’un sujet toujours ultra-important à mes yeux: les sauvegardes. Et ce dans un contexte bien part, il s’agit aujourd’hui de parler de la sauvegarde des mails.
Pourquoi maintenant ?
Les sauvegardes en général
Je ne vais pas vous le cacher, à propos des sauvegardes de mon serveur, c’est relativement ceinture-bretelle.
Je réalise des sauvegardes automatiques plusieurs fois par jour au sein du serveur avec borg (un outil de sauvegarde) pour archiver les modifications (pour revenir facilement à un état antérieur d’un service). J’ai ensuite des sauvegardes toutes les 12 heures de ce serveur sur un disque dur chez moi et enfin toutes les quelques semaines sur un autre disque stocké ailleurs. De plus, sur mon PC chez moi, j’ai également une copie des fichiers du serveur dans une machine virtuelle dans le but de pouvoir réaliser des tests (mises à jours de services comme Nextcloud, etc…).
Pour un serveur pour un usage personnel, ça peut paraitre beaucoup mais c’est le minimum selon moi. Mais voilà, il fallait une faille dans la matrice: un des seuls services que je n’héberge pas sur mon serveur, à savoir les mails.
Pourquoi les mails ?
Pour la petite histoire, je suis maintenant depuis quelques mois/années à la recherche d’un outil de prises de notes simple mais efficace et multi-plateforme. Dans l’idéal, si vous me connaissez, il faudrait que je puisse l’héberger et qu’il soit Open-source.
D’ailleurs, si vous avez un outil de prise de note multi-plateforme open-source à auto-héberger, n’hésitez pas à m’en faire part, j’en ai essayé beaucoup sans jamais être convaincu !
N’ayant rien trouvé de ce côté, j’ai orienté mes tests vers une solution qui n’est ni Open-source, si auto-hébergeable: l’application Notes d’Apple.
En fait, j’ai été déjà intrigué par la solution technique. Dans l’application, l’utilisateur voit ses notes et peut les modifier très simplement (on connait Apple pour la simplicité d’utilisation de ses outils). Derrière cette jolie façade, la façon dont sont stockées les notes est assez intéressante et je ne l’ai revu nulle part ailleurs. Dans l’adresse mail associée au compte iCloud, un dossier Notes est créé au milieu des autres dossiers. Les notes sont alors simplement stockées à cet endroit et modifiées quand la note est sauvegardée (on a une note = un mail).
Les applications Notes d’Apple sont alors uniquement des clients mails qui n’affichent que ce dossier dans un affichage dédié à la prise de notes.
Bref, j’avais testé ça avec mon mail perso. Et quelque temps après, depuis mon client Webmail (Rainloop), j’ai un jour voulu supprimer ce fameux dossier Notes. Je clique donc sur supprimer et je valide (en pestant sur le bouton de validation trop petit). Et au moment où je relâche le bouton de validation, je me rends compte que ce n’était pas le dossier Notes mais un dossier nommé Perso. Malheureusement, c’était trop tard, j’avais supprimé ce dossier et tous son contenu.
J’ai eu de la chance d’avoir un client mail qui m’avait téléchargé tous mes mails de tous mes dossiers. Cela m’a permis de me rendre compte que c’était un dossier vide !
Par contre, hors de question que cette situation ne se reproduise.
Comment sauvegarder ?
Bien qu’au final des mails ne valent pas grand-chose et qu’il soit vraiment rare les fois où un ancien mail serve à quelque-chose, j’ai donc cherché à les sauvegarder de façon pérenne.
Je me suis rapidement souvenu avoir mis un lien dans mes favoris RSS permettant cela, ni une ni deux, je le retrouve. Il s’agit de ce script (miroir ici).
Ce script est d’une utilisation la plus simple possible. Pas de fioriture, juste le nécessaire comme le veut le principe KISS (pour Keep It Simple, Stupid).
Il suffit en effet d’avoir Python 2 ou 3.8, et le script fonctionne sans avoir à installer la moindre dépendance. On donne notre nom d’utilisateur, le mot de passe et le serveur de la boîte mail et le tour est joué, les mails sont téléchargés dans le dossier courant.
Si on lance le script (3.8 tout du moins) avec l’option -h
, on trouve alors toutes les options disponibles, à savoir:
Usage: imapbackup [OPTIONS] -s HOST -u USERNAME [-p PASSWORD]
-d DIR --mbox-dir=DIR Write mbox files to directory. (defaults to cwd)
-a --append-to-mboxes Append new messages to mbox files. (default)
-y --yes-overwrite-mboxes Overwite existing mbox files instead of appending.
-f FOLDERS --folders=FOLDERS Specifify which folders use. Comma separated list.
-e --ssl Use SSL. Port defaults to 993.
-k KEY --key=KEY PEM private key file for SSL. Specify cert, too.
-c CERT --cert=CERT PEM certificate chain for SSL. Specify key, too.
Python's SSL module doesn't check the cert chain.
-s HOST --server=HOST Address of server, port optional, eg. mail.com:143
-u USER --user=USER Username to log into server
-p PASS --pass=PASS Prompts for password if not specified. If the first
character is '@', treat the rest as a path to a file
containing the password. Leading '' makes it literal.
-t SECS --timeout=SECS Sets socket timeout to SECS seconds.
--thunderbird Create Mozilla Thunderbird compatible mailbox
--nospinner Disable spinner (makes output log-friendly)
Par défaut, on voit que les nouveaux mails sont récupérés et ajoutés aux anciens. On a donc nos fichiers (1 fichier = 1 dossier sur le compte mail) qui grossissent au fil du temps. Il y a également la possibilité d’écraser tous les fichiers avec le contenu à un instant T, tout dépend des usages (on peut imaginer un cas où on télécharge tous les mails, on les archive avec borg puis on les supprime du serveur).
Le script compatible Python 2 offre la possibilité de compresser.
Et la conteneurisation dans tout ça ?
Certains vont trouver ça aberrant dans le sens où le script n’a aucune dépendance si ce n’est Python. Personnellement, je préfère tout scripter et que ça fonctionne sans que je ne me demande où tournera le script (que j’ai Python 3.7 ou Python 3.9 par exemple).
Le fait que le script soit ultra simple d’utilisation rend son image (Docker dans mon cas), ultra simple à écrire.
Voici donc mon fichier Dockerfile
.
FROM python 3.8-slim-buster
WORKDIR /app
COPY imapbackup38.py /
ENTRYPOINT ["python", "/imapbackup38.py"]
On a donc le script imapbackup38.py
à la racine et on l’exécute dans le dossier /app
.
Afin de l’utiliser dans une tâche cron (tâche récursive sous Linux), j’ai également créé un fichier docker-compose.yml
:
version: '3.7'
services:
imapbackup:
image: imapbackup:latest # to adapt according to your image
container_name: "imapbackup"
command: --ssl --server=${SERVER_MAIL} --user=${USER_MAIL} --pass=${PASS_MAIL}
volumes:
- ./data/imapbackup/user_at_example.com/:/app/
Avec le fichier .env
associé:
SERVER_MAIL=example.com
USER_MAIL=user@example.com
PASS_MAIL=this-is-a-password-without-numbers
Il suffit alors de lancer la commande docker-compose run --rm imapbackup
et le tour est joué.
Une fois par semaine dans mon cas me semble suffisant, à compléter avec un archivage avec borg.
De plus, de temps à autre, on peut vider les dossiers sur la boîte mail pour l’alléger.
Conclusion
J’avais croisé ce script il y a déjà un moment. Par manque de temps, je n’avais jamais pris le temps de mettre tout cela en place alors que franchement, c’est simple à mettre en place.
Un dernier point avant de vous quitter: peu importe ce que vous sauvegardez, si vous ne testez pas régulièrement vos sauvegardes, ça revient à ne rien faire du tout.