Skip to main content

Command Palette

Search for a command to run...

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

Updated
6 min read
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

  • image indique l’image Docker utilisée.

  • container_name fixe un nom clair.

  • ports expose le service en local.

  • volumes stocke les données hors du conteneur.

  • restart relance 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 :

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.