Cal.com self-hosted : agenda en ligne open-source — déploiement Hetzner VPS 2026
📍 Article principal du cluster : Productivité PME en self-hosted : la stack open-source 2026
Cet article fait partie du cluster « Productivité self-hosted ». Pour la vue d’ensemble (Penpot, Cal.com, Affine, Excalidraw, AppFlowy), commencez par le pilier.
Introduction
Quand un consultant à Dakar veut permettre à ses prospects de réserver un appel découverte, il a longtemps eu deux options : Calendly (10 USD/mois minimum, exigeant carte bancaire internationale) ou un système d’emails et de réponses manuelles qui consomme une heure par jour. La première option pose des problèmes pratiques (paiement en USD, conditions générales américaines, dépendance à un service tiers) et la seconde fait perdre un temps précieux qui pourrait être consacré à la mission elle-même. Ce dilemme touche aussi les coachs, les formateurs, les avocats, les médecins en cabinet — tout professionnel qui doit gérer des prises de rendez-vous récurrentes.
Cal.com est l’alternative open-source à Calendly, avec une fonctionnalité égale voire supérieure. La version self-hosted permet de bénéficier de toute la richesse fonctionnelle (gestion de plusieurs types d’événements, intégration calendriers Google/Outlook/CalDAV, formulaires de qualification, paiement en option) sans dépendance à un service tiers. Ce guide vous accompagne pas à pas dans le déploiement de Cal.com sur un VPS Hetzner avec Docker Compose, depuis la création du serveur jusqu’à la configuration des intégrations calendriers. Comptez deux à trois heures pour une première installation complète si vous n’êtes pas familier avec Docker.
Prérequis
- VPS : Hetzner CX31 (4 vCPU, 8 Go RAM, 80 Go SSD) — environ 7,90 €/mois
- OS : Ubuntu 24.04 LTS
- Nom de domaine : sous-domaine prêt (par exemple cal.votre-pme.sn)
- Niveau requis : intermédiaire (SSH, Docker basique)
- Temps estimé : 2 à 3 heures pour une installation complète
- Service SMTP : compte Sendgrid, Mailgun, ou serveur Postal self-hosted (pour l’envoi des confirmations de RDV)
1. Cal.com vs Calendly : la comparaison fonctionnelle
La question légitime est : Cal.com est-il vraiment au niveau de Calendly en 2026 ? La réponse courte est oui, et même au-dessus sur plusieurs critères. Cal.com a rattrapé en trois ans son retard fonctionnel et propose désormais des fonctionnalités absentes de Calendly, notamment la gestion d’équipes avec round-robin, les workflows automatisés sans plugin tiers, et la personnalisation totale du branding sans surcoût.
| Critère | Calendly Pro | Cal.com self-hosted |
|---|---|---|
| Coût mensuel (1 user) | 10 USD (~6 000 FCFA) | 4,15 € (~2 700 FCFA, partage VPS) |
| Coût mensuel (5 users) | 50 USD (~30 000 FCFA) | ~2 700 FCFA (même VPS) |
| Branding personnalisé | Plan Teams (16 USD) | Inclus |
| Intégrations calendrier | Google, Outlook, iCloud | + CalDAV générique |
| Round-robin équipes | Plan Teams | Inclus |
| Workflows email/SMS | Limité | Avancé |
| API publique | Plan Teams | Inclus |
| Embed sur site | Oui | Oui (HTML/iframe/script) |
Le différentiel économique devient massif dès qu’on dépasse le solo : une équipe de cinq commerciaux sur Calendly Pro coûte 360 000 FCFA par an, contre environ 32 000 FCFA pour Cal.com self-hosted (en partageant le VPS avec d’autres services). Cette économie permet aussi de financer le temps d’administration et la formation des utilisateurs, qui restent les vrais coûts cachés du self-hosting.
2. Architecture de Cal.com
Cal.com est une application Next.js (React + TypeScript) avec une base PostgreSQL. L’architecture reste relativement simple comparée à des produits comme Mattermost ou Nextcloud : un seul service applicatif principal, une base de données, et optionnellement Redis pour le cache. Cette simplicité facilite le diagnostic en cas de problème mais signifie aussi que toute la charge passe par un seul conteneur — c’est pourquoi on recommande un VPS confortable (CX31) plutôt que minimal (CX21).
- web : application Next.js (frontend + backend API), conteneur principal
- postgres : base de données PostgreSQL 16 (utilisateurs, événements, réservations, intégrations)
- nginx ou caddy : reverse proxy frontal, gère TLS et compression (optionnel si le service tourne derrière Coolify)
Étape 1 — Préparer le VPS Hetzner
Cette première étape pose les fondations système. Sur un VPS frais Ubuntu 24.04 chez Hetzner, vous partez d’une base saine : pas de paquets superflus, kernel récent, pare-feu UFW disponible. La création de l’utilisateur dédié cal (plutôt que de tout faire en root) est une bonne pratique de sécurité incontournable, qui limite l’exposition en cas de compromission d’une dépendance applicative.
# Connexion SSH initiale en root
ssh root@<IP_DU_VPS>
# Mise à jour et user dédié
apt update && apt upgrade -y
adduser cal
usermod -aG sudo cal
rsync --archive --chown=cal:cal ~/.ssh /home/cal
# Configurer le pare-feu UFW pour ne laisser passer que SSH, HTTP et HTTPS
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# Installer Docker depuis le dépôt officiel
apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release; echo $VERSION_CODENAME) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
usermod -aG docker cal
Une fois ces commandes exécutées, déconnectez la session root et reconnectez-vous en tant qu’utilisateur cal. Vérifiez avec docker compose version que vous obtenez bien la version 2.30 ou supérieure. Si docker ps renvoie une erreur de permission, c’est que le groupe Docker n’a pas été rechargé : déconnectez complètement votre terminal SSH puis reconnectez-vous, ne vous contentez pas de relancer un nouveau shell.
Étape 2 — Cloner le dépôt Cal.com et préparer la configuration
Cal.com fournit un repository GitHub officiel avec un fichier docker-compose.yaml production-ready. Plutôt que de réinventer cette configuration, on utilise celle maintenue upstream — vous bénéficierez automatiquement des correctifs et améliorations apportés par l’équipe Cal.com à chaque mise à jour.
# Se placer dans /opt et cloner
cd /opt
sudo git clone https://github.com/calcom/docker.git cal-docker
sudo chown -R cal:cal cal-docker
cd cal-docker
# Copier le fichier d'environnement modèle
cp .env.example .env
# Éditer les variables
nano .env
Le fichier .env contient une trentaine de variables. Les essentielles à configurer en priorité sont : NEXT_PUBLIC_WEBAPP_URL (votre URL HTTPS publique, ex. https://cal.votre-pme.sn), NEXTAUTH_SECRET (générer avec openssl rand -base64 32), CALENDSO_ENCRYPTION_KEY (idem), POSTGRES_PASSWORD (mot de passe fort 24+ caractères), et les variables SMTP (EMAIL_FROM, EMAIL_SERVER_HOST, EMAIL_SERVER_PORT, EMAIL_SERVER_USER, EMAIL_SERVER_PASSWORD) pour permettre l’envoi des confirmations de RDV. Sans SMTP fonctionnel, Cal.com fonctionnera mais aucune notification ne sera envoyée — ce qui rend l’outil pratiquement inutilisable.
Étape 3 — Configurer le service SMTP
L’envoi de mails est crucial pour Cal.com (confirmations de RDV, rappels, annulations). Trois options s’offrent à vous selon votre contexte : utiliser un service SMTP transactionnel (Sendgrid, Mailgun, Brevo offrent des plans gratuits jusqu’à 100-300 emails par jour, généralement suffisant pour une PME), utiliser le SMTP de votre hébergeur d’email professionnel (OVH, Gandi, Google Workspace, Microsoft 365), ou déployer un Postal self-hosted dans un autre tutoriel du cluster.
# Exemple pour Brevo (ex-Sendinblue), plan gratuit 300 emails/jour :
EMAIL_FROM="rendez-vous@votre-pme.sn"
EMAIL_SERVER_HOST=smtp-relay.brevo.com
EMAIL_SERVER_PORT=587
EMAIL_SERVER_USER=votre-login-brevo@votre-pme.sn
EMAIL_SERVER_PASSWORD=votre-clef-smtp-brevo
# Important : configurer SPF et DKIM pour votre domaine
# afin que les emails ne tombent pas en spam
# Voir le tutoriel "Email pro deliverability 2026" du cluster
La configuration SPF/DKIM est cruciale en 2026 pour que vos emails de confirmation atteignent bien les destinataires. Sans ces enregistrements DNS configurés, Gmail et Outlook risquent fort de classer vos emails Cal.com en spam, ce qui ruinera l’expérience prospect (le client ne reçoit jamais sa confirmation et croit que la réservation a échoué). Référez-vous au tutoriel dédié SPF/DKIM/DMARC dans le cluster « Email pro deliverability ».
Étape 4 — Lancer la stack et créer le compte administrateur
Tous les éléments sont en place. Le premier lancement avec docker compose up -d télécharge les images (environ 1,5 Go au total — Next.js et PostgreSQL sont volumineux), démarre PostgreSQL, attend qu’il soit prêt, puis démarre l’application Cal.com. Lors du tout premier démarrage, Cal.com exécute les migrations de schéma de base — comptez 60 à 90 secondes avant que l’URL ne réponde.
# Démarrer
docker compose up -d
# Suivre les logs pour vérifier le démarrage propre
docker compose logs -f --tail=50
# Tester l'accès
curl -I https://cal.votre-pme.sn
# Si erreur 502, attendre 60 secondes et réessayer (migrations DB)
# Si erreur certificat TLS, vérifier que le DNS pointe bien vers l'IP VPS
Au premier accès dans le navigateur, Cal.com vous propose le wizard d’installation initiale. Créez immédiatement le compte administrateur : choisissez un identifiant clair (admin@votre-pme.sn), un mot de passe fort, et activez le 2FA dès que possible (paramètres utilisateur après création). Les paramètres globaux d’instance (nom de l’organisation, fuseau horaire par défaut, langue) se configurent ensuite dans le panneau d’administration.
Étape 5 — Connecter votre calendrier Google / Outlook
Pour que Cal.com soit utile, il doit synchroniser avec votre calendrier existant : c’est ce qui empêche un prospect de réserver un créneau sur lequel vous êtes déjà occupé par une autre réunion. Cal.com supporte trois principales intégrations : Google Calendar (via OAuth), Microsoft 365 / Outlook (via OAuth), et CalDAV générique (qui couvre Apple iCloud, Nextcloud Calendar, et autres serveurs CalDAV).
# Pour Google Calendar :
# 1. Aller sur https://console.cloud.google.com
# 2. Créer un nouveau projet "Cal.com Integration"
# 3. Activer l'API "Google Calendar API"
# 4. Créer des credentials OAuth 2.0 :
# - Type : Web application
# - Authorized redirect URIs :
# https://cal.votre-pme.sn/api/integrations/googlecalendar/callback
# 5. Récupérer Client ID et Client Secret
# 6. Dans Cal.com, Settings > Integrations > Google Calendar
# coller Client ID et Client Secret
# 7. Cliquer "Connect" et autoriser l'accès au calendrier
# Pour Microsoft 365 :
# Procédure similaire via portal.azure.com > App registrations
# Documentation officielle : docs.cal.com/integrations/calendars/office365
Cal.com utilise les API officielles, donc l’authentification OAuth est sécurisée et révocable à tout moment depuis votre compte Google ou Microsoft. Aucun mot de passe n’est stocké côté Cal.com — seuls les tokens d’accès rafraîchissables sont conservés en base, chiffrés avec votre CALENDSO_ENCRYPTION_KEY. Si vous révoquez l’accès depuis Google plus tard, Cal.com reçoit une erreur et notifie l’utilisateur de reconnecter son calendrier.
Étape 6 — Configurer un type d’événement et tester
Le concept central de Cal.com est l’« event type » (type d’événement) : c’est un créneau réservable que vous proposez à vos prospects. Vous pouvez en avoir plusieurs (par exemple « Appel découverte 30 min », « Rendez-vous client 1 h », « Atelier formation 2 h »), chacun avec ses propres règles (durée, disponibilité, lien visioconférence, formulaire de qualification).
# Dans l'interface Cal.com :
# 1. "Event Types" > "+ New"
# 2. Title : "Appel découverte 30 minutes"
# 3. Slug : appel-decouverte (apparaîtra dans l'URL publique)
# 4. Duration : 30 minutes
# 5. Description : visible par le prospect
# Onglet "Limits" :
# - Min booking notice : 4 hours (pas de RDV moins de 4h à l'avance)
# - Future booking : 60 days (pas plus de 2 mois à l'avance)
# - Maximum per day : 4 (pour ne pas se laisser submerger)
# Onglet "Workflows" : ajouter un workflow
# - Email confirmation au booker
# - Rappel 24h avant
# - Rappel 1h avant
# - Email de remerciement après le RDV
# L'URL publique devient : https://cal.votre-pme.sn/<votre-username>/appel-decouverte
# Partagez ce lien dans votre signature email, sur votre site, sur LinkedIn
Avant de communiquer le lien à vos prospects, faites un test complet : ouvrez le lien dans une fenêtre incognito, réservez un créneau avec un email de test, vérifiez que vous recevez bien la confirmation, et que l’événement apparaît dans votre Google Calendar avec le bon fuseau horaire. Cette validation de bout en bout vous évite de découvrir un problème technique seulement quand un prospect important se plaint de ne pas avoir reçu sa confirmation.
Adaptation au contexte ouest-africain
Trois points méritent attention pour optimiser Cal.com dans le contexte ouest-africain. Premièrement, les fuseaux horaires : votre organisation est probablement en GMT (Côte d’Ivoire, Mali, Burkina) ou GMT (Sénégal en heure légale). Configurez bien le fuseau horaire par défaut de votre instance pour éviter les confusions — un prospect français qui réserve à 14h Paris doit voir 13h GMT côté africain, et inversement. Cal.com gère cela automatiquement via les paramètres timezone du compte, mais vérifiez que les nouveaux comptes héritent du bon défaut.
Deuxièmement, l’intégration vidéoconférence. Cal.com peut générer automatiquement des liens Google Meet, Zoom, ou Whereby à chaque réservation. Pour une PME ouest-africaine, Google Meet est souvent le choix le plus pragmatique : il fonctionne bien sur connexions limitées, ne demande pas d’installation côté client, et s’intègre nativement avec Google Calendar. Si vous voulez auto-héberger aussi votre solution vidéo, considérez Jitsi Meet self-hosted (autre tutoriel du cluster).
Troisièmement, la prise en compte des spécificités payment. Si vous facturez vos rendez-vous (consultations payantes), Cal.com supporte Stripe pour le paiement à la réservation. Stripe est disponible au Sénégal, Côte d’Ivoire et plusieurs autres pays UEMOA depuis 2023, mais avec des limitations. Pour une PME qui veut intégrer Wave ou Orange Money directement, il faudra développer un connecteur custom via l’API Cal.com — ce n’est pas trivial et dépasse le cadre de ce tutoriel.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| « Database connection error » au démarrage | PostgreSQL pas encore prêt | Attendre 60s puis docker compose restart web |
| Emails de confirmation jamais reçus | SMTP mal configuré ou en spam | Vérifier les logs, configurer SPF/DKIM, tester avec mail-tester.com |
| Erreur OAuth Google « redirect_uri_mismatch » | URL de callback mal renseignée dans Google Console | Vérifier strictement l’URL exacte (https, sans slash final) |
| Calendrier ne synchronise pas | Token OAuth expiré ou révoqué | Reconnecter depuis Settings > Integrations |
| Page de réservation lente | Trop de calendriers connectés à scanner | Limiter à 1-2 calendriers principaux, ajuster la recherche de disponibilité |
Sauvegarde minimale
La sauvegarde de Cal.com se résume à la base PostgreSQL — il n’y a pas de fichiers utilisateur volumineux à archiver. Programmez un dump quotidien automatique vers un stockage distant. Vu que les rendez-vous représentent l’agenda commercial vital de votre activité, cette sauvegarde n’est pas optionnelle.
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
BACKUP_DIR=/var/backups/calcom
mkdir -p $BACKUP_DIR
docker exec $(docker ps -q -f name=calcom-postgres) \
pg_dump -U calendso calendso | gzip > $BACKUP_DIR/db-$DATE.sql.gz
# Sync vers Hetzner Storage Box
rsync -az $BACKUP_DIR/ \
u123456@u123456.your-storagebox.de:/calcom/
# Conserver 30 jours sur le VPS
find $BACKUP_DIR -mtime +30 -delete
Testez la restauration au moins une fois par trimestre sur un VPS jetable. La procédure complète prend environ 30 minutes : créer un VPS de test, restaurer la base, redémarrer l’application avec la base restaurée, et vérifier qu’un compte de test peut se connecter et voir ses événements. Cette discipline transformera un incident de production en simple inconvénient mineur.
Tutoriels frères du cluster
- AppFlowy self-hosted : alternative Notion open-source — déploiement Docker 2026
- Email pro deliverability 2026 : SPF, DKIM, DMARC, MTA-STS, BIMI, ARC
- Penpot self-hosted : alternative Figma open-source — déploiement Coolify + Postgres 2026
FAQ
Cal.com peut-il vraiment remplacer Calendly à 100% ?
Pour 95% des cas d’usage, oui. Les fonctionnalités Calendly Pro et Teams sont toutes disponibles et même au-delà (workflows avancés, API publique). Quelques fonctionnalités très spécifiques de Calendly Enterprise (audit logs poussés, SAML SSO) demandent des configurations supplémentaires.
Mes prospects européens vont-ils faire confiance à un Cal.com self-hosted ?
Oui, l’expérience utilisateur est identique à Calendly et le branding est le vôtre. Aucun prospect ne saura que c’est self-hosted sauf si vous l’écrivez explicitement.
Combien d’utilisateurs un VPS CX31 peut-il accueillir ?
Pour un usage typique (10 à 30 réservations par jour, 5 à 20 utilisateurs), un CX31 est confortable. Au-delà de 100 réservations quotidiennes, monitorer la charge et envisager CX41.
Cal.com supporte-t-il les paiements Mobile Money (Wave, Orange Money) ?
Pas nativement. Stripe (CB internationale) et PayPal sont supportés. Pour Mobile Money, il faut développer une intégration custom via l’API ou utiliser un agrégateur comme PayDunya en intermédiaire.
Comment migrer depuis Calendly vers Cal.com ?
Calendly ne propose pas d’export structuré direct. La migration se fait manuellement : recréer les types d’événements, exporter les bookings passés en CSV, recréer les liens publics avec les mêmes slugs pour préserver les URLs partagées dans vos signatures email.
Pour aller plus loin
- 🔝 Retour au pilier : Productivité PME en self-hosted : la stack open-source 2026
- Documentation officielle Cal.com : docs.cal.com
- Dépôt GitHub : github.com/calcom/cal.com
- Documentation Docker self-hosting : github.com/calcom/docker
Mots-clés : cal.com self-hosted, alternative calendly open-source, prise de rendez-vous en ligne, hetzner vps deploy, agenda professionnel pme, docker compose 2026.