Créer un serveur d’agenda et de contacts 100 % privé, accessible partout

Avoir un agenda et des contacts synchronisés est devenu courant. Le problème, c’est que ces données passent presque toujours par des services tiers. Elles sont stockées sur des serveurs que vous ne contrôlez pas.
Dans cet article, vous allez mettre en place votre propre serveur CalDAV et CardDAV, hébergé chez vous, accessible depuis n’importe où, sans ouvrir de ports sur votre box.
L’objectif est simple :
garder la maîtrise de vos données,
synchroniser agenda et contacts sur téléphone et ordinateur,
utiliser une solution claire, maintenable et reproductible.
La mise en place repose sur trois outils : Docker, Tailscale et Baïkal.
Base système
Ce tutoriel fonctionne sur une base Debian et ses dérivés (Debian, Raspberry Pi OS Lite, Ubuntu Server).
Le système doit être opérationnel, accessible en SSH et à jour.
Pourquoi CalDAV et CardDAV ?
CalDAV et CardDAV sont des protocoles standards.
CalDAV permet de synchroniser des agendas.
CardDAV permet de synchroniser des contacts.
Ils sont compatibles avec la majorité des clients actuels : Android, iOS, Thunderbird, macOS ou Linux.
L’avantage de ces protocoles est leur simplicité. Le serveur stocke les données. Les clients se synchronisent automatiquement.
Les briques utilisées
Avant de passer aux commandes, posons le rôle de chaque outil.
Docker isole le service et facilite la maintenance.
Baïkal fournit le serveur CalDAV et CardDAV.
Tailscale permet un accès distant sécurisé sans ouverture de ports.
Chaque brique a un rôle précis. Ensemble, elles forment une solution cohérente.
Installer Docker
Docker permet de lancer Baïkal dans un conteneur. Le service reste isolé du système et facile à mettre à jour.
Installez Docker avec la commande officielle :
curl -sSL https://get.docker.com | sh
Cette commande télécharge un script maintenu par Docker. Il installe le moteur et ses dépendances.
Ajoutez ensuite votre utilisateur au groupe Docker :
sudo usermod -aG docker $USER
Cette étape évite d’utiliser sudo pour chaque commande Docker. Déconnectez-vous puis reconnectez-vous pour appliquer le changement.
Vérifiez l’installation :
docker --version
Si une version s’affiche, Docker fonctionne.
Installer Tailscale
Tailscale crée un réseau privé chiffré entre vos appareils. Chaque machine rejoint ce réseau après authentification.
Installez Tailscale :
curl -fsSL https://tailscale.com/install.sh | sh
Démarrez ensuite la connexion :
sudo tailscale up
Un lien s’affiche dans le terminal. Ouvrez-le dans votre navigateur et connectez-vous à votre compte Tailscale.
Une fois validé, le serveur obtient une adresse IP privée Tailscale.
Pour la connaître :
tailscale ip -4
Cette IP servira pour accéder au serveur Baïkal.
Déployer Baïkal avec Docker
Baïkal est un serveur léger, stable et simple à administrer.
Préparer l’arborescence
Créez un dossier dédié au service :
mkdir mon-agenda
cd mon-agenda
Vous êtes libre de choisir le nom du dossier !
Cette organisation permet de séparer clairement la configuration et les données.
Créer le fichier docker-compose.yml
Créez le fichier :
nano docker-compose.yml
Ajoutez le contenu suivant :
version: "2"
services:
baikal:
image: ckulka/baikal:nginx
container_name: baikal
restart: always
ports:
- "8080:80"
volumes:
- ./config:/var/www/baikal/config
- ./data:/var/www/baikal/Specific
Comprendre cette configuration
imageindique l’image Docker utilisée.container_namefixe un nom clair.portsexpose le service en local.volumesstocke les données hors du conteneur.restartrelance le service après un redémarrage.
Lancez le service :
docker compose up -d
Docker télécharge l’image puis démarre le conteneur.
Vérifiez qu’il tourne :
docker ps
Configuration de Baïkal
Depuis un appareil connecté à Tailscale, ouvrez un navigateur :
http://IP_TAILSCALE:8080
Vous tomberez sur cette page, elle permet d’initialiser Baïkal :

choisissez le fuseau horaire Europe/Paris,
activez CalDAV et CardDAV,
définissez un mot de passe administrateur.
Connectez-vous ensuite avec le compte admin.
Créez un utilisateur et ses ressources par défaut :
un agenda.
un carnet d’adresses.






Connexion des clients
Sur Android
Installez DAVx5 à partir du magasin d’application F-Droid (Gratuit) ou depuis le Google PlayStore (5.99€ afin de soutenir les développeurs derrière le projet)
Ajoutez un compte :
utilisateur et mot de passe définis dans Baïkal.
DAVx5 détecte automatiquement l’agenda et les contacts.
Sur ordinateur
Avec Thunderbird :
Agenda : Nouvel agenda → Sur le réseau → Entrez le nom d’utilisateur et l’URL vers l’agenda :
http://IP_TAILSCALE:8080/dav.php/calendars/VOTRE_NOM_DUTILISATEUR/defalut/ → Une fenêtre invitant à entrer le mot de passe de votre utilisateur Baïkal apparaîtra, saisissez le.Contacts : Carnet d’adresse → Nouveau carnet CardDAV→ Entrez le nom d’utilisateur et l’URL vers le carnet d’adresse : http://IP_TAILSCALE:8080/dav.php/addressbooks/VOTRE_NOM_DUTILISATEUR/default/ → Une fenêtre invitant à entrer le mot de passe de votre utilisateur Bakaï apparaîtra , saisissez le.
Les URL sont basées sur la même adresse du serveur.
Sauvegarde
Les données de Baïkal sont stockées dans les volumes Docker.
Il est important de conserver une copie de ces dossiers en dehors du conteneur. Le support de sauvegarde dépend de votre environnement.
L’essentiel est simple : les données ne doivent pas dépendre uniquement du conteneur.
voici un petit script permettant de sauvegarder vos données sur une clé USB branché à votre serveur, vous pouvez utiliser crontab afin d’automatiser le processus
ATTENTION : Veuillez remplacer [UTILISATEUR] par votre nom d’utilisateur :
#!/bin/bash
# --- CONFIGURATION ---
# Dossier de destination (Votre clé USB)
BACKUP_DIR="/mnt/usb_backup/baikal_backups"
# Dossiers sources (Votre installation Baïkal)
# Note: Utilisez le chemin absolu pour éviter les erreurs cron
SOURCE_DB="/home/[UTILISATEUR]/Baïkal/data/db/db.sqlite"
CONFIG_DIR="/home/[UTILISATEUR]/Baïkal/config"
# Date pour le nom du fichier
DATE=$(date +%F_%H-%M)
# --- EXECUTION ---
# 1. On vérifie que la clé USB est bien là
if mountpoint -q /mnt/usb_backup; then
# Création du dossier s'il n'existe pas sur la clé
mkdir -p "$BACKUP_DIR"
# 2. Copie de la base de données (Tes contacts et agendas)
if [ -f "$SOURCE_DB" ]; then
cp "$SOURCE_DB" "$BACKUP_DIR/db_$DATE.sqlite"
else
echo "ERREUR: Fichier db.sqlite introuvable dans $SOURCE_DB" >> /home/theamn/backup_error.log
exit 1
fi
# 3. Copie de la configuration (Vos utilisateurs et réglages)
cp -r "$CONFIG_DIR" "$BACKUP_DIR/config_$DATE"
# 4. Nettoyage : Supprime les vieux fichiers de plus de 2 mois (60 jours)
find "$BACKUP_DIR" -name "db_*.sqlite" -mtime +60 -delete
find "$BACKUP_DIR" -name "config_*" -type d -mtime +60 -exec rm -rf {} +
# Petit log pour dire que tout va bien (optionnel)
# echo "Sauvegarde OK le $DATE" >> /home/[UTILISATEUR]/backup.log
else
# Si la clé n'est pas montée, on note l'erreur
echo "ALERTE : Clé USB non détectée le $DATE" >> /home/[UTILISATEUR]/backup_error.log
fi
Conclusion
Cette configuration permet d’héberger un agenda et des contacts privés, accessibles partout, sans exposition directe de votre réseau.
Elle repose sur des outils simples, bien documentés et utilisés en production.
C’est une solution concrète pour reprendre le contrôle sur ses données et progresser en administration système.


