logo rss

Mise en place d'un calendrier partagé sur Debian Linux avec Baïkal

Logo de Baïkal Logo Debian Illustration d’une page de calendrier avec une date mise en évidence

J'utilisais depuis quelques années le logiciel Zimbra, car son interface web est agréable et qu'il propose un calendrier. Initialement, il existait une version gratuite et open source qui remplissait parfaitement bien son rôle, et même si elle était devenue de plus en plus difficile à maintenir et à mettre à jour, elle restait globalement une solution correcte. Cependant, avec les développements récents (depuis la version 8.5 en fait) et des changements de propriétaires, l'édition gratuite a été complètement abandonnée. Je me suis donc retrouvé à la recherche de solutions alternatives pour les différents modules (calendrier, webmail, etc…).

Cet article se concentrera sur la mise en place d'un serveur de calendrier partagé. Je montrerai ici comment mettre en place la solution Baïkal sur GNU/Linux, qui supporte nativement CalDAV et CardDAV. Son interface web rend la gestion des utilisateurs et services plutôt aisée.

La base de données sqlite3 est un choix parfait pour un nombre raisonnable d'utilisateurs.

Un grand merci à ByteHamster l'auteur de Baïkal pour avoir rendu ce produit gratuit et Open Source.

Schéma illustrant l’architecture générale du serveur de calendrier partagé Baïkal sous Debian, avec des clients Thunderbird locaux et distants ainsi que la synchronisation mobile via DAVx⁵.
Architecture générale de l’environnement Baïkal, montrant le serveur Debian, les clients sur le réseau local, les utilisateurs distants via Thunderbird et la synchronisation des smartphones avec DAVx⁵.

Installation de Baïkal

Prérequis

  • Installation des prérequis:
root@host:~# apt update && apt install apache2 php-sqlite3 git sqlite3 unzip php php-xml libapache2-mod-php
root@host:~# wget https://github.com/sabre-io/Baikal/releases/download/0.11.1/baikal-0.11.1.zip
  • Décompresser et déplacer le dossier vers /var/www/baikal/ :
root@host:~# unzip baikal-0.11.1.zip
root@host:~# mv baikal /var/www/baikal
  • Définir www-data comme propriétaire du dossier :
root@host:~# chown -R www-data:www-data /var/www/baikal/

Certificats

Pour activer HTTPS sur votre serveur Baïkal, vous devez disposer de certificats TLS. Vous pouvez choisir entre la génération de certificats auto-signés ou l’utilisation de certificats Let’s Encrypt.

Les certificats auto-signés sont simples à générer, mais ils ne sont pas reconnus par défaut par les appareils et applications externes. En conséquence, des avertissements de sécurité s’afficheront lors de la connexion des clients à votre serveur.

Let’s Encrypt fournit des certificats TLS gratuits et reconnus publiquement. Les certificats émis par Let’s Encrypt sont automatiquement approuvés par les systèmes d’exploitation, les navigateurs web et les clients CalDAV/CardDAV, ce qui permet d’éviter les alertes de sécurité.

Dans ce guide, les deux méthodes sont présentées afin que vous puissiez choisir la solution la plus adaptée à votre environnement.

Certificats auto-signés

  • Commencez par créer le répertoire /etc/apache2/ssl/, qui sera utilisé pour stocker les certificats TLS ainsi que les clés privées associées :
root@host:~# mkdir /etc/apache2/ssl/
  • Générez le certificat TLS auto-signé à l’aide de openssl :
root@host:~# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/apache2/ssl/selfsigned.key -out /etc/apache2/ssl/selfsigned.crt
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:The Elements Of A State
Locality Name (eg, city) []:City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:STD Corp
Organizational Unit Name (eg, section) []:STD Department
Common Name (e.g. server FQDN or YOUR name) []:baikal.std.rocks
Email Address []:baikal@std.rocks
  • Créez le fichier cert.pem en concaténant la clé privée et le certificat :
root@host:~# cat /etc/apache2/ssl/selfsigned.key /etc/apache2/ssl/selfsigned.crt > /etc/apache2/ssl/cert.pem
  • 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
    # Generally already set by global Apache configuration
    #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
        # If you install cloning git repository, you may need the following
        Options +FollowSymlinks
        AllowOverride None
        # Configuration for apache-2.4:
        Require all granted
        # Configuration for apache-2.2:
        # Order allow,deny
        # Allow from all
    </Directory>

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

    SSLEngine On

    #SECURE SSL
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder On

    #AUTOGENERATE CERTIFICATES
    SSLCertificateFile    /etc/apache2/ssl/cert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/selfsigned.key

    #LETS ENCRYPT CERTIFICATES
    #SSLCertificateFile /etc/letsencrypt/live/baikal.std.rocks/fullchain.pem
    #SSLCertificateKeyFile /etc/letsencrypt/live/baikal.std.rocks/privkey.pem
</VirtualHost>

Certificats Let’s Encrypt

  • Commencez par arrêter le service Apache afin de permettre à Certbot d’écouter sur le port HTTP durant le processus de 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 propre nom de domaine et letsencrypt@std.rocks par votre adresse e-mail 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 mail.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 le renouvellement, mais vous pouvez également mettre en place une tâche cron ou un minuteur systemd afin de garantir le bon déroulement du processus.

  • 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
    # Generally already set by global Apache configuration
    #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
        # If you install cloning git repository, you may need the following
        Options +FollowSymlinks
        AllowOverride None
        # Configuration for apache-2.4:
        Require all granted
        # Configuration for apache-2.2:
        # Order allow,deny
        # Allow from all
    </Directory>

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

    SSLEngine On

    #SECURE SSL
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder On

    #AUTOGENERATE CERTIFICATES
    #SSLCertificateFile    /etc/apache2/ssl/cert.pem
    #SSLCertificateKeyFile /etc/apache2/ssl/selfsigned.key

    #LETS ENCRYPT CERTIFICATES
    SSLCertificateFile /etc/letsencrypt/live/baikal.std.rocks/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/baikal.std.rocks/privkey.pem
</VirtualHost>

Finalisation de la configuration

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

  • Activez les modules Apache requis pour 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 afin d’appliquer les modifications de configuration :
root@host:~# systemctl restart apache2

Vous pouvez maintenant poursuivre avec la configuration de Baïkal.

Configuration de Baïkal

  • Ouvrir un navigateur web et se connecter à l'interface web de Baïkal (https://IP_SERVER) afin de paramétrer le mot de passe administrateur :
Assistant d’installation de Baïkal affichant l’écran de configuration initiale avec les champs de mot de passe administrateur et le bouton Enregistrer les modifications
Assistant d’installation de Baïkal présentant les paramètres de configuration initiaux, notamment la définition du mot de passe administrateur pour le serveur de calendrier partagé CalDAV.
  • Garder la configuration par défaut et cliquer sur Enregistrer les modifications :
Écran de configuration de la base de données Baïkal montrant SQLite sélectionné comme moteur de base de données
Écran de configuration de la base de données Baïkal avec SQLite sélectionné comme moteur de stockage pour le serveur de calendrier partagé CalDAV.
  • Enfin, cliquer sur Commencer à utiliser Baïkal :
Écran final de l’assistant d’installation de Baïkal confirmant que la base de données est configurée et prête à être utilisée
Écran final de l’assistant d’installation de Baïkal confirmant que la base de données a été configurée avec succès et que le serveur de calendrier partagé est prêt à l’emploi.
  • Utiliser le mot de passe configuré précédemment et cliquer sur S'authentifier :
Écran d’authentification de l’interface d’administration web de Baïkal affichant les champs identifiant et mot de passe ainsi que le bouton d’authentification
Écran d’authentification de l’interface d’administration web de Baïkal, permettant d’accéder au tableau de bord et à la gestion du serveur de calendrier partagé CalDAV.
  • Pour ajouter des utilisateurs, cliquer sur Utilisateurs et ressources depuis le tableau de bord :
Tableau de bord de l’interface d’administration web de Baïkal affichant les informations système, l’état des services et l’accès à la gestion des utilisateurs et des ressources
Tableau de bord de l’interface d’administration web de Baïkal offrant une vue d’ensemble de l’état du système et un accès à la gestion des utilisateurs, des ressources et du serveur de calendrier partagé CalDAV.
  • Ensuite, cliquer sur le bouton Ajouter un utilisateur :
Page de gestion des utilisateurs de Baïkal affichant la section Utilisateurs avec l’accès à l’ajout de nouveaux comptes
Section de gestion des utilisateurs de l’interface d’administration web de Baïkal, permettant d’administrer les comptes et les ressources associées au serveur de calendrier partagé CalDAV.
  • Saisir les informations du nouveau compte et cliquer sur Enregistrer les modifications :
Formulaire de création d’utilisateur dans Baïkal affichant les champs nom d’utilisateur, nom affiché, adresse e-mail, mot de passe et le bouton Enregistrer les modifications
Formulaire de création d’un compte utilisateur dans l’interface d’administration web de Baïkal, utilisé pour ajouter de nouveaux utilisateurs au serveur de calendrier partagé CalDAV.
  • L'utilisateur est maintenant créé. Cliquer sur le bouton Calendriers :
Écran de gestion des utilisateurs de Baïkal montrant un compte créé avec l’accès aux paramètres des calendriers et des carnets d’adresses
Écran de gestion des utilisateurs dans l’interface d’administration web de Baïkal, permettant d’accéder aux calendriers et aux carnets d’adresses d’un utilisateur spécifique du serveur de calendrier partagé CalDAV.
  • À partir de là, on pourra ajouter un calendrier et obtenir les informations URI (qui peuvent être utiles en fonction du client de calendrier) :
Écran de gestion des calendriers de Baïkal affichant le calendrier par défaut et les informations d’URI CalDAV nécessaires à la configuration des clients de calendrier
Écran de gestion des calendriers dans l’interface d’administration web de Baïkal, affichant l’URI CalDAV requise pour configurer les clients de calendrier et synchroniser le calendrier partagé.

Configuration des Clients de Calendrier

À ce stade, nous disposons d'un serveur de calendrier partagé fonctionnel. Passons donc maintenant à la connexion des clients. Je vais ici montrer comment faire avec Thunderbird, qui dispose d'un calendrier intégré, ainsi qu'avec l'application Android DAVx5, qui permet la synchronisation avec les calendriers sur les appareils Android.

Thunderbird

  • Ouvrir Thunderbird et cliquer sur le bouton calendrier, puis sélectionner Nouveau calendrier… :
Interface principale du calendrier de Mozilla Thunderbird affichant la vue du calendrier et l’option permettant d’ajouter un nouveau calendrier
Interface principale du calendrier de Thunderbird, utilisée pour gérer les calendriers et démarrer la procédure d’ajout d’un nouveau calendrier réseau CalDAV.
  • Sélectionner Sur le réseau puis cliquer sur le bouton Suivant :
Boîte de dialogue de création d’un nouveau calendrier dans Thunderbird affichant l’option d’ajout d’un calendrier sur le réseau
Création d’un nouveau calendrier réseau dans Mozilla Thunderbird, première étape pour se connecter à un serveur de calendrier CalDAV.
  • Ajouter le nom d'utilisateur et l'URL https://IP_SERVER, puis cliquer sur Trouver des calendriers :
Configuration d’un calendrier réseau dans Thunderbird affichant le champ nom d’utilisateur et l’URL du serveur CalDAV avant la recherche des calendriers
Saisie du nom d’utilisateur et de l’URL du serveur CalDAV dans Thunderbird afin de détecter les calendriers disponibles sur le serveur Baïkal.
  • Si on a utilisé un certificat auto-signé, il faudra accepter l'exception de sécurité :
Avertissement de sécurité dans Thunderbird demandant l’ajout d’une exception de certificat pour un serveur CalDAV non approuvé
Avertissement de sécurité affiché dans Thunderbird lors de la connexion à un serveur CalDAV utilisant un certificat auto-signé, nécessitant l’ajout d’une exception de sécurité.
  • Saisir le mot de passe de l'utilisateur précédemment créé :
Boîte de dialogue d’authentification dans Thunderbird demandant le mot de passe utilisateur lors de la connexion à un serveur de calendrier CalDAV
Saisie du mot de passe utilisateur dans Thunderbird afin de s’authentifier auprès du serveur CalDAV Baïkal et d’accéder au calendrier partagé.
  • Enfin, cliquer sur S'abonner pour ajouter le calendrier :
Boîte de dialogue d’abonnement à un calendrier dans Thunderbird affichant le calendrier sélectionné et le bouton d’abonnement
Étape finale dans Thunderbird consistant à s’abonner à un calendrier CalDAV en sélectionnant le calendrier souhaité et en confirmant l’abonnement au calendrier partagé Baïkal.
  • Le calendrier partagé apparaîtra :
Vue du calendrier dans Mozilla Thunderbird affichant le calendrier CalDAV abonné, visible dans le panneau latéral
Vue du calendrier dans Thunderbird après l’abonnement au calendrier CalDAV Baïkal, le calendrier partagé apparaissant désormais dans la liste des calendriers disponibles.

DAVx5

  • Ouvrir l'application DAVx5 et cliquer sur le symbole plus pour ajouter un compte :
Interface principale de DAVx5 sur Android affichant le bouton d’ajout de compte pour configurer une connexion CalDAV
Écran principal de l’application DAVx5 sur Android, utilisé pour démarrer l’ajout d’un compte CalDAV et activer la synchronisation du calendrier partagé.
  • Sélectionner Se connecter avec URL et saisir les informations demandées :
Écran d’ajout de compte dans DAVx5 affichant l’option de connexion à un serveur CalDAV à l’aide d’une URL et d’un nom d’utilisateur
Ajout d’un compte CalDAV dans DAVx5 en renseignant l’URL du serveur, le nom d’utilisateur et le mot de passe sur un appareil Android afin de synchroniser le calendrier partagé.
  • Comme avec Thunderbird, on recevra un avertissement concernant le certificat si ce dernier est auto-signé. Cliquer simplement sur Accepter :
Écran d’avertissement de sécurité dans DAVx5 affichant les détails d’un certificat SSL auto-signé et demandant à l’utilisateur de l’accepter
Écran de validation du certificat dans DAVx5 lors de la connexion à un serveur CalDAV utilisant un certificat SSL auto-signé, nécessitant l’acceptation manuelle du certificat.
  • Enfin, cliquer sur Créer :
Écran de création de compte dans DAVx5 sur Android affichant le bouton permettant de finaliser l’ajout d’un compte CalDAV
Étape finale dans DAVx5 consistant à créer le compte CalDAV sur Android et à activer la synchronisation du calendrier partagé avec le serveur Baïkal.

Mettre à jour Baïkal

Baïkal est un logiciel maintenu, de nouvelles versions sortent donc avec le temps. Je vais expliquer ici comment mettre à jour Baïkal tout en préservant les données de l'utilisateur. La première étape, comme d'habitude pour ce genre d'opération, sera de faire une sauvegarde complète de votre système.

  • Arrêter le service apache2 :
root@host:~# systemctl stop apache2
  • Sauvegarder la base de données sqlite3 :
root@host:~# sqlite3 /var/www/baikal/Specific/db/db.sqlite ".backup 'backup.db.sqlite'"
  • Sauvegarder le dossier baikal :
root@host:~# cp -a /var/www/baikal /var/www/$(date +%Y%m%d).baikal
root@host:~# cd /tmp/
root@host:~# wget https://github.com/sabre-io/Baikal/releases/download/0.11.1/baikal-0.11.1.zip
root@host:~# unzip baikal-0.11.1.zip
  • Copier les répertoires actuels config et Specific dans /tmp/baikal:
root@host:~# cp -ra /var/www/baikal/config /tmp/baikal/
root@host:~# cp -ra /var/www/baikal/Specific /tmp/baikal/
  • Désactiver l'ancien dossier baikal :
root@host:~# cd /var/www/
root@host:~# mv baikal baikal.OLD
  • Déplacer la nouvelle version de baikal dans /var/www/ :
root@host:~# mv /tmp/baikal /var/www/
  • Redonner les droits à www-data :
root@host:~# chown -R www-data:www-data /var/www/baikal/
  • Démarrer le service apache :
root@host:~# systemctl start apache2
  • Ouvrir la page d'administration de Baïkal (exemple : https://baikal.std.rocks/admin/install/) et cliquer sur Start the upgrade :
Assistant de mise à jour de Baïkal affichant le processus de migration d’une version antérieure vers une version plus récente, avec les actions de démarrage de la mise à jour et d’accès à l’administration
Assistant de mise à jour de Baïkal illustrant le lancement et l’achèvement du processus de mise à niveau entre deux versions du logiciel, tout en préservant les données du serveur de calendrier partagé CalDAV.