rss logo

Installer un serveur CalDAV/CardDAV Baïkal sur Debian 13

Logo Baikal Logo de Debian Icône représentant un calendrier partagé

Baïkal est un serveur CalDAV et CardDAV léger et open source qui permet d’héberger et de synchroniser vos calendriers et vos contacts sur votre propre infrastructure. Il constitue une alternative simple aux services de synchronisation dans le cloud.

J’ai longtemps utilisé Zimbra, dont j’appréciais l’interface web, la gestion des courriels et les fonctions de calendrier partagé. Son édition gratuite et open source répondait bien à mes besoins, même si sa maintenance et ses mises à jour sont progressivement devenues plus complexes. Cependant, au fil des changements de propriétaire et de licence, la disponibilité et l’avenir de cette édition sont devenus de plus en plus incertains. J’ai donc commencé à rechercher des alternatives pour ses différents composants : calendrier, webmail, etc.

Dans cet article, je vous explique comment installer et configurer un serveur CalDAV/CardDAV Baïkal sur Debian 13, activer un accès sécurisé en HTTPS et synchroniser vos calendriers avec Thunderbird et DAVx⁵ sur Android. Baïkal propose également une interface web d’administration pour gérer les utilisateurs, les calendriers et les carnets d’adresses.

Pour cette installation, nous utiliserons SQLite, qui convient bien à un petit nombre d’utilisateurs et nécessite peu d’administration.

Et un grand merci à ByteHamster pour assurer la maintenance de Baïkal, ce projet libre et open source.

Architecture de Baïkal sur Debian avec des clients Thunderbird locaux et distants et la synchronisation des smartphones via DAVx⁵ sur Internet.
Architecture du service de calendriers partagés Baïkal : serveur Debian, clients du réseau local, utilisateurs Thunderbird distants et synchronisation des smartphones avec DAVx⁵.

Installation de Baïkal

Prérequis

  • Installez les paquets nécessaires :
root@host:~# apt update && apt install apache2 php-sqlite3 git sqlite3 unzip php php-xml libapache2-mod-php
  • Téléchargez la dernière version de Baïkal en consultant le dépôt GitHub officiel : versions de Baïkal :
root@host:~# wget https://github.com/sabre-io/Baikal/releases/download/0.13.0/baikal-0.13.0.zip
  • Décompressez l’archive et déplacez le dossier dans /var/www/baikal/ :
root@host:~# unzip baikal-0.13.0.zip
root@host:~# mv baikal /var/www/baikal
  • Définissez www-data comme propriétaire du dossier :
root@host:~# chown -R www-data:www-data /var/www/baikal/

Certificats TLS

Pour activer HTTPS sur votre serveur Baïkal, vous avez besoin de certificats TLS. Vous pouvez générer des certificats autosignés ou utiliser des certificats Let’s Encrypt.

Les certificats autosignés sont faciles à générer, mais les appareils et applications externes ne leur font pas confiance par défaut. Les clients affichent donc des avertissements de sécurité lors de la connexion au serveur.

Let’s Encrypt fournit des certificats TLS gratuits et reconnus publiquement. Ils sont automatiquement reconnus par les systèmes d’exploitation, les navigateurs et les clients CalDAV/CardDAV, ce qui évite les avertissements de sécurité.

Ce guide présente les deux méthodes afin que vous puissiez choisir celle qui convient le mieux à votre environnement.

Certificats autosignés

  • Créez d’abord le répertoire /etc/apache2/ssl/ pour y stocker les certificats TLS et les clés privées :
root@host:~# mkdir /etc/apache2/ssl/
  • Générez le certificat TLS autosigné avec openssl :
root@host:~# openssl req -x509 -nodes -days 3650 \
  -newkey rsa:4096 \
  -keyout /etc/apache2/ssl/selfsigned.key \
  -out /etc/apache2/ssl/selfsigned.crt \
  -subj "/CN=baikal.std.rocks" \
  -addext "subjectAltName=DNS:baikal.std.rocks"
  • Limitez les permissions de la clé privée selfsigned.key afin que seul son propriétaire puisse la lire ou la modifier :
root@host:~# chmod 600 /etc/apache2/ssl/selfsigned.key
  • Modifiez le fichier de configuration du VirtualHost Apache /etc/apache2/sites-available/000-default.conf :
<VirtualHost *:443>

    DocumentRoot /var/www/baikal/html
    ServerName baikal.std.rocks

    RewriteEngine On
    # Généralement déjà défini dans la configuration globale d’Apache
    #RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteRule /.well-known/carddav /dav.php [R=308,L]
    RewriteRule /.well-known/caldav  /dav.php [R=308,L]

    <Directory "/var/www/baikal/html">
        Options None
        # Cette option peut être nécessaire en cas d’installation par clonage du dépôt Git
        Options +FollowSymlinks
        AllowOverride None
        # Configuration pour Apache 2.4 :
        Require all granted
    </Directory>

    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>

    SSLEngine On

    #PARAMÈTRES SSL SÉCURISÉS
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder On

    #CERTIFICATS AUTOSIGNÉS
    SSLCertificateFile /etc/apache2/ssl/selfsigned.crt
    SSLCertificateKeyFile /etc/apache2/ssl/selfsigned.key

    #CERTIFICATS LET’S ENCRYPT
    #SSLCertificateFile /etc/letsencrypt/live/baikal.std.rocks/fullchain.pem
    #SSLCertificateKeyFile /etc/letsencrypt/live/baikal.std.rocks/privkey.pem
</VirtualHost>

Certificats Let's Encrypt

  • Arrêtez d’abord le service Apache pour permettre à Certbot d’écouter sur le port HTTP pendant la validation du certificat :
root@host:~# systemctl stop apache2.service
  • Installez le paquet certbot :
root@debian:~# apt update && sudo apt install certbot
  • Utilisez certbot pour demander un certificat SSL/TLS Let’s Encrypt. Remplacez baikal.std.rocks par votre nom de domaine et letsencrypt@std.rocks par votre adresse électronique d’administration :
root@debian:~# certbot certonly --standalone -d baikal.std.rocks --email letsencrypt@std.rocks --agree-tos --noninteractive
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for baikal.std.rocks

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/baikal.std.rocks/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/baikal.std.rocks/privkey.pem
This certificate expires on 2026-04-23.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

💡 Remarque : Surveillez la date d’expiration de votre certificat. Certbot configure automatiquement son renouvellement, mais vous pouvez également définir une tâche cron ou un minuteur systemd pour assurer son exécution.

  • Modifiez le fichier de configuration du VirtualHost Apache /etc/apache2/sites-available/000-default.conf :
<VirtualHost *:443>

    DocumentRoot /var/www/baikal/html
    ServerName baikal.std.rocks

    RewriteEngine On
    # Généralement déjà défini dans la configuration globale d’Apache
    #RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteRule /.well-known/carddav /dav.php [R=308,L]
    RewriteRule /.well-known/caldav  /dav.php [R=308,L]

    <Directory "/var/www/baikal/html">
        Options None
        # Cette option peut être nécessaire en cas d’installation par clonage du dépôt Git
        Options +FollowSymlinks
        AllowOverride None
        # Configuration pour Apache 2.4 :
        Require all granted
    </Directory>

    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>

    SSLEngine On

    #PARAMÈTRES SSL SÉCURISÉS
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder On

    #CERTIFICATS AUTOSIGNÉS
    #SSLCertificateFile /etc/apache2/ssl/selfsigned.crt
    #SSLCertificateKeyFile /etc/apache2/ssl/selfsigned.key

    #CERTIFICATS LET’S ENCRYPT
    SSLCertificateFile /etc/letsencrypt/live/baikal.std.rocks/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/baikal.std.rocks/privkey.pem
</VirtualHost>

Finaliser la configuration

Une fois votre certificat autosigné ou Let’s Encrypt généré, vous pouvez poursuivre l’installation de Baïkal.

  • Activez les modules Apache nécessaires à la réécriture des URL et à la prise en charge de SSL :
root@host:~# a2enmod rewrite
root@host:~# a2enmod ssl
  • Redémarrez le service Apache pour appliquer la configuration :
root@host:~# systemctl restart apache2

Vous pouvez maintenant configurer Baïkal.

Configuration de Baïkal

  • Ouvrez un navigateur et accédez à l’interface web de Baïkal avec l’adresse IP du serveur (https://IP_SERVER) ou son nom DNS (https://DNS_NAME), puis définissez le mot de passe administrateur :
Configuration initiale de Baïkal avec les champs du mot de passe administrateur et le bouton Save changes
Configuration initiale de Baïkal et définition du mot de passe administrateur.
  • Conservez la configuration par défaut de la base de données (SQLite), puis cliquez sur Save changes (Enregistrer les modifications) :
Écran de configuration de Baïkal avec SQLite sélectionné comme moteur de base de données
Configuration de la base de données de Baïkal avec SQLite.
  • Cliquez ensuite sur Start using Baïkal (Commencer à utiliser Baïkal) :
Écran de fin d’installation de Baïkal confirmant que la base de données est configurée
L’assistant d’installation confirme que la base de données de Baïkal est correctement configurée.
  • Saisissez le mot de passe défini précédemment et cliquez sur Authenticate (S’authentifier) :
Page de connexion à Baïkal avec les champs d’identifiant et de mot de passe et le bouton Authenticate
Écran d’authentification permettant d’accéder au tableau de bord d’administration de Baïkal.
  • Pour ajouter des utilisateurs, cliquez sur Users and Resources (Utilisateurs et ressources) dans le tableau de bord :
Tableau de bord de Baïkal avec les informations système, l’état des services et la gestion des utilisateurs
Le tableau de bord de Baïkal présente l’état du système et donne accès à la gestion des utilisateurs et des ressources.
  • Cliquez ensuite sur Add User (Ajouter un utilisateur) :
Page de gestion des utilisateurs de Baïkal permettant d’ajouter des comptes
Gestion des comptes utilisateurs et des ressources associées dans l’administration de Baïkal.
  • Renseignez les informations du nouveau compte et cliquez sur Save changes (Enregistrer les modifications) :
Formulaire Baïkal avec les champs identifiant, nom affiché, adresse électronique et mot de passe
Formulaire de création d’un compte utilisateur dans l’administration de Baïkal.
  • L’utilisateur est créé. Cliquez sur Calendars (Calendriers) :
Compte utilisateur Baïkal avec accès aux paramètres des calendriers et des carnets d’adresses
Accès aux calendriers et aux carnets d’adresses d’un utilisateur depuis l’administration de Baïkal.
  • Vous pouvez ici ajouter un calendrier et obtenir son URI, qui peut être utile selon le client de calendrier :
Gestion des calendriers Baïkal avec le calendrier par défaut et son URI CalDAV
L’interface de gestion des calendriers affiche l’URI CalDAV à utiliser pour configurer les clients.

Configurer les clients de calendrier

Notre serveur de calendriers partagés est maintenant opérationnel. Nous allons y connecter les clients. Je vous présente la configuration de Thunderbird, qui intègre un agenda, et de l’application DAVx⁵, qui permet de synchroniser les calendriers sur les appareils Android.

Thunderbird

  • Ouvrez Thunderbird, cliquez sur le bouton Agenda, puis sélectionnez Nouvel agenda… (New Calendar) :
Vue de l’agenda Mozilla Thunderbird avec l’option d’ajout d’un nouvel agenda
Interface de l’agenda Thunderbird permettant de gérer les calendriers et d’ajouter un agenda réseau.
  • Sélectionnez Sur le réseau (On the Network), puis cliquez sur Suivant (Next) :
Fenêtre Thunderbird proposant la création d’un agenda sur le réseau
Création d’un agenda réseau dans Thunderbird pour se connecter au serveur CalDAV.
  • Saisissez le nom d’utilisateur et l’URL du serveur Baïkal avec son adresse IP (https://IP_SERVER) ou son nom DNS (https://DNS_NAME), puis cliquez sur Rechercher des agendas (Find Calendars) :
Configuration de l’agenda réseau Thunderbird avec le nom d’utilisateur et l’URL du serveur CalDAV
Saisie de l’identifiant et de l’URL du serveur Baïkal pour rechercher les calendriers disponibles.
  • Si vous utilisez un certificat autosigné, confirmez l’exception de sécurité :
Avertissement Thunderbird demandant une exception pour le certificat du serveur CalDAV
Avertissement de Thunderbird lors de la connexion à un serveur CalDAV utilisant un certificat autosigné.
  • Saisissez le mot de passe de l’utilisateur créé précédemment :
Thunderbird demande le mot de passe de l’utilisateur pour se connecter au serveur CalDAV
Authentification auprès du serveur CalDAV Baïkal avec le mot de passe de l’utilisateur.
  • Cliquez enfin sur S’abonner (Subscribe) pour ajouter le calendrier :
Fenêtre d’abonnement Thunderbird avec le calendrier sélectionné et le bouton Subscribe
Sélection du calendrier CalDAV et confirmation de l’abonnement dans Thunderbird.
  • Le calendrier partagé apparaît dans Thunderbird :
Vue de l’agenda Thunderbird avec le calendrier CalDAV dans le volet de gauche
Le calendrier Baïkal apparaît dans la liste des agendas Thunderbird après l’abonnement.

DAVx⁵

  • Ouvrez l’application DAVx⁵ et appuyez sur le symbole plus pour ajouter un compte :
Écran principal de DAVx⁵ sur Android avec le bouton d’ajout d’un compte CalDAV
Écran principal de DAVx⁵ permettant d’ajouter un compte pour synchroniser les calendriers.
  • Sélectionnez Connexion avec une URL (Connect with URL) et renseignez les informations demandées :
Ajout d’un compte DAVx⁵ avec l’URL du serveur CalDAV et le nom d’utilisateur
Ajout d’un compte CalDAV sur Android avec l’URL du serveur, le nom d’utilisateur et le mot de passe.
  • Comme dans Thunderbird, un avertissement s’affiche si le certificat est autosigné. Appuyez sur Accepter (Accept) :
DAVx⁵ affiche les détails du certificat SSL autosigné et demande son acceptation
Validation du certificat autosigné lors de la connexion au serveur CalDAV dans DAVx⁵.
  • Appuyez enfin sur Créer (Create) :
Écran de création du compte DAVx⁵ sur Android avec le bouton de confirmation
Création du compte CalDAV dans DAVx⁵ pour synchroniser les calendriers Android avec Baïkal.

Mettre à jour Baïkal

Baïkal est activement maintenu et de nouvelles versions paraissent régulièrement. Voici comment mettre à jour Baïkal tout en conservant les données des utilisateurs. Comme pour toute opération de ce type, commencez par effectuer une sauvegarde complète de votre système.

  • Arrêtez le service apache2 :
root@host:~# systemctl stop apache2
  • Sauvegardez la base de données sqlite3 :
root@host:~# sqlite3 /var/www/baikal/Specific/db/db.sqlite ".backup 'backup.db.sqlite'"
  • Sauvegardez le dossier baikal :
root@host:~# cp -a /var/www/baikal /var/www/$(date +%Y%m%d).baikal
  • Téléchargez la dernière version de Baïkal depuis le dépôt officiel, puis décompressez-la dans /tmp/ :
root@host:~# cd /tmp/
root@host:~# wget https://github.com/sabre-io/Baikal/releases/download/0.13.0/baikal-0.13.0.zip
root@host:~# unzip baikal-0.13.0.zip
  • Copiez les dossiers config et Specific de l’installation actuelle dans /tmp/baikal :
root@host:~# cp -ra /var/www/baikal/config /tmp/baikal/
root@host:~# cp -ra /var/www/baikal/Specific /tmp/baikal/
  • Renommez l’ancien dossier baikal :
root@host:~# cd /var/www/
root@host:~# mv baikal baikal.OLD
  • Déplacez la nouvelle version de baikal dans /var/www/ :
root@host:~# mv /tmp/baikal /var/www/
  • Rétablissez www-data comme propriétaire des fichiers :
root@host:~# chown -R www-data:www-data /var/www/baikal/
  • Démarrez le service apache :
root@host:~# systemctl start apache2
  • Ouvrez la page d’administration de Baïkal, par exemple https://baikal.std.rocks/admin/install/, puis cliquez sur Start the upgrade (Démarrer la mise à jour) :
Assistant Baïkal avec les étapes de démarrage de la mise à jour et d’accès à l’administration
L’assistant Baïkal présente le démarrage et la fin de la mise à jour entre deux versions.