đ Dans cet article :Â
đ Cal.com Open Source : Pourquoi j’ai choisi le self-host
Cal.com est un outil de prise de rendez-vous 100% open source, une alternative puissante à Calendly. Le code est accessible, self-hostable gratuitement, et offre un contrÎle total sur vos données.
Pourtant, beaucoup optent pour Cal.com Cloud (l’hĂ©bergement officiel). Pratique pour dĂ©buter, mais :
- Plan Free : 0âŹ/mois pour 1 utilisateur
- Plan Teams : 15âŹ/user/mois pour Ă©quipe
- Limitations sur les types d’Ă©vĂ©nements et intĂ©grations
Pour mon activitĂ© de consultant, j’avais besoin d’une solution professionnelle sans frais rĂ©currents et avec contrĂŽle total des donnĂ©es clients.
Ma décision : VPS Debian + Docker + PostgreSQL + Cal.com self-hosted.
Résultat aprÚs déploiement :
- â ĂvĂ©nements et rendez-vous illimitĂ©s
- â CoĂ»t fixe : 6âŹ/mois (VPS OVH)
- â DonnĂ©es hĂ©bergĂ©es en France (RGPD compliant)
- â Personnalisation complĂšte
- â Ăconomie : ~300âŹ/an vs cloud
Dans ce guide, je vous montre exactement comment j’ai dĂ©ployĂ© Cal.com sur mon VPS avec Docker, PostgreSQL, et Nginx Reverse Proxy. Temps d’installation : 45 minutes (migrations incluses).
đ PrĂ©requis techniques
Avant de commencer, assurez-vous d’avoir :
Serveur :
- VPS Debian 11 ou 12 (Ubuntu fonctionne aussi)
- 4 GB RAM minimum (Cal.com + PostgreSQL sont gourmands)
- 30 GB stockage (Docker images + base de données)
- AccĂšs SSH root
Domaine :
- Un nom de domaine (ex: mondher.ch)
- Sous-domaine configuré (ex: call.mondher.ch)
- DNS pointant vers IP du VPS (A record)
Connaissances :
- Commandes Linux de base
- Notions Docker et Docker Compose
- SSH et accĂšs terminal
â ïž Important : Cal.com nĂ©cessite une base PostgreSQL. Ce guide couvre l’installation complĂšte.
đ ïž PrĂ©paration du serveur Debian
Connectez-vous en SSH :
ssh root@VOTRE_IP_VPS
1. Mettre Ă jour le systĂšme
apt update && apt upgrade -y
2. Installer Docker (si pas déjà fait)
# Installer les dépendances
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Ajouter la clé GPG officielle Docker
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Ajouter le repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installer Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io
# Vérifier
docker --version
3. Installer Docker Compose
# Télécharger Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Rendre exécutable
chmod +x /usr/local/bin/docker-compose
# Vérifier
docker-compose --version
đ Configuration PostgreSQL
Cal.com utilise Prisma ORM avec PostgreSQL. La base doit ĂȘtre prĂȘte AVANT de lancer Cal.com.
Créer le dossier de travail
mkdir -p /opt/docker/calcom
cd /opt/docker/calcom
Fichier docker-compose.yml pour PostgreSQL + Cal.com
nano docker-compose.yml
Collez cette configuration :
version: '3.8'
services:
postgres:
image: postgres:14-alpine
container_name: calcom-postgres
restart: unless-stopped
environment:
POSTGRES_USER: calcom
POSTGRES_PASSWORD: VotreMotDePasseSecurise123!
POSTGRES_DB: calcom
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- proxy
healthcheck:
test: ["CMD-SHELL", "pg_isready -U calcom"]
interval: 10s
timeout: 5s
retries: 5
calcom:
image: calcom/cal.com:latest
container_name: calcom
restart: unless-stopped
ports:
- "3000:3000"
environment:
# Base de données
DATABASE_URL: "postgresql://calcom:VotreMotDePasseSecurise123!@postgres:5432/calcom"
# Clés de sécurité (générer avec: openssl rand -base64 32)
NEXTAUTH_SECRET: "VOTRE_CLE_NEXTAUTH_32_CARACTERES"
CALENDSO_ENCRYPTION_KEY: "VOTRE_CLE_ENCRYPTION_32_CARACTERES"
# URL publique
NEXTAUTH_URL: "https://call.mondher.ch"
NEXT_PUBLIC_WEBAPP_URL: "https://call.mondher.ch"
# Configuration
NODE_ENV: production
depends_on:
postgres:
condition: service_healthy
volumes:
- ./calcom-data:/calcom-data
networks:
- proxy
networks:
proxy:
driver: bridge
Génération des clés de sécurité
IMPORTANT : Générez des clés uniques pour NEXTAUTH_SECRET et CALENDSO_ENCRYPTION_KEY :
# Clé NEXTAUTH_SECRET
openssl rand -base64 32
# Clé CALENDSO_ENCRYPTION_KEY
openssl rand -base64 32
Remplacez les valeurs dans le fichier docker-compose.yml.
â Checkpoint : PostgreSQL et Cal.com configurĂ©s avec variables d’environnement correctes.
đł DĂ©ploiement Cal.com avec Docker Compose
Lancez les conteneurs :
cd /opt/docker/calcom
docker-compose up -d
Vérifiez que les conteneurs tournent :
docker ps
Vous devriez voir :
- â
calcom-postgres(healthy) - â ïž
calcom(probablement unhealthy au début)
Pourquoi Cal.com est unhealthy ?
Car les migrations Prisma n’ont PAS encore Ă©tĂ© exĂ©cutĂ©es ! La base PostgreSQL est vide.
đ§ Migrations Prisma (ĂTAPE CRITIQUE)
C’est l’Ă©tape que j’ai ratĂ©e au dĂ©but et qui m’a coĂ»tĂ© 2 heures de debug !
Cal.com utilise Prisma ORM. Il faut créer les tables dans PostgreSQL AVANT que Cal.com démarre correctement.
Exécuter les migrations
docker-compose run --rm calcom npx prisma migrate deploy
Cette commande va :
- Se connecter Ă PostgreSQL
- Créer toutes les tables nécessaires (users, bookings, events, etc.)
- Appliquer les migrations Prisma
Sortie attendue :
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "calcom"
10 migrations found in prisma/migrations
Applying migration `20231010_init`
Applying migration `20231011_users_table`
...
The following migrations have been applied:
migrations/
ââ 20231010_init/
ââ 20231011_users_table/
...
â Generated Prisma Client
All migrations have been successfully applied.
Redémarrer Cal.com
docker-compose restart calcom
Attendez 30 secondes, puis vérifiez :
docker ps
Cal.com devrait maintenant ĂȘtre (healthy) ! â
â ïž Si encore unhealthy : VĂ©rifiez les logs : docker logs calcom --tail 100
đ Nginx Reverse Proxy et rĂ©seaux Docker
Ici, on arrive au piĂšge des rĂ©seaux Docker qui m’a bloquĂ© pendant des heures.
Le problÚme des réseaux isolés
Par défaut, Cal.com tourne sur le réseau proxy. Si votre Nginx Proxy Manager est sur un autre réseau (ex: n8n_proxy-network), ils ne peuvent PAS communiquer.
SymptÎme : 502 Bad Gateway malgré un conteneur healthy.
Solution : Connecter Nginx au réseau proxy
1. Vérifier le réseau de Cal.com :
docker inspect calcom | grep -A 20 "Networks"
Vous verrez : "proxy" avec une IP (ex: 172.19.0.3)
2. Connecter Nginx Proxy Manager au réseau proxy :
docker network connect proxy nginx-proxy-manager
3. Tester la connexion :
docker exec nginx-proxy-manager curl -I http://calcom:3000
Résultat attendu :
HTTP/1.1 307 Temporary Redirect
location: /auth/login
X-Powered-By: Next.js
â Nginx peut maintenant joindre Cal.com !
Configuration Nginx Proxy Manager
Allez sur http://VOTRE_IP:81 (interface Nginx Proxy Manager).
Créer un Proxy Host :
- Domain Names :
call.mondher.ch - Scheme :
http - Forward Hostname/IP :
calcom(nom du conteneur) - Forward Port :
3000 - âïž Block Common Exploits
- âïž Websockets Support (IMPORTANT !)
Onglet SSL :
- SSL Certificate : Request a new SSL Certificate
- âïž Force SSL
- âïž HTTP/2 Support
- Email : votre email
- âïž I Agree to Let’s Encrypt TOS
Cliquez sur Save.
đ SSL automatique avec Let’s Encrypt
Nginx Proxy Manager va automatiquement :
- â GĂ©nĂ©rer le certificat Let’s Encrypt
- â Configurer le reverse proxy
- â Rediriger HTTP â HTTPS
- â Renouveler le certificat auto (tous les 90 jours)
â
Checkpoint : AccĂ©dez Ă https://call.mondher.ch â Page de configuration Cal.com s’affiche !
đ§ ProblĂšmes courants et solutions
â Conteneur Cal.com unhealthy
Cause : Migrations Prisma non exécutées ou erreur de connexion PostgreSQL
Solution :
# Vérifier les logs
docker logs calcom --tail 100
# Exécuter les migrations
docker-compose run --rm calcom npx prisma migrate deploy
# Redémarrer
docker-compose restart calcom
â Erreur « table public.users does not exist »
Cause : Base de données vide, migrations non appliquées
Solution : Exécuter les migrations Prisma (voir section précédente)
â 502 Bad Gateway malgrĂ© conteneur healthy
Cause : Nginx et Cal.com sur des réseaux Docker isolés
Solution :
# Connecter Nginx au réseau proxy
docker network connect proxy nginx-proxy-manager
# Tester la connexion
docker exec nginx-proxy-manager curl -I http://calcom:3000
# Redémarrer Nginx
docker restart nginx-proxy-manager
â Variables DATABASE_URL non remplacĂ©es
Cause : Utilisation de ${POSTGRES_PASSWORD} dans docker-compose.yml
Solution : Remplacer les variables shell par les valeurs réelles :
# â MAUVAIS
DATABASE_URL: "postgresql://calcom:${POSTGRES_PASSWORD}@postgres:5432/calcom"
# â
BON
DATABASE_URL: "postgresql://calcom:VotreMotDePasse@postgres:5432/calcom"
đ Logs utiles
# Logs Cal.com
docker logs -f calcom
# Logs PostgreSQL
docker logs -f calcom-postgres
# Vérifier santé des conteneurs
docker ps -a
# Inspecter réseaux Docker
docker inspect calcom | grep -A 20 "Networks"
đŻ Conclusion : Cal.com self-hosted opĂ©rationnel
En 45 minutes (migrations incluses), vous venez de déployer une infrastructure de prise de rendez-vous professionnelle :
- â Cal.com avec Ă©vĂ©nements illimitĂ©s
- â PostgreSQL 14 performant
- â HTTPS automatique via Let’s Encrypt
- â Reverse proxy Ă©volutif (ajoutez d’autres apps facilement)
- â CoĂ»t : 6âŹ/mois au lieu de 12âŹ/mois minimum
Prochaines étapes pour aller plus loin :
- CrĂ©er vos types d’Ă©vĂ©nements (consultations, rĂ©unions, etc.)
- Connecter vos calendriers (Google Calendar, Outlook)
- Configurer les notifications email
- Personnaliser votre profil public
- Intégrer Cal.com sur votre site WordPress (popup ou iframe)
Depuis que j’ai migrĂ© sur mon VPS, j’ai Ă©conomisĂ© ~300⏠par an tout en gardant le contrĂŽle total de mes donnĂ©es et celles de mes clients.
đ Besoin d’aide pour votre dĂ©ploiement ?
Je partage mes workflows, astuces Docker et stratĂ©gies d’infrastructure dans ma newsletter.
Vous avez dĂ©ployĂ© Cal.com en suivant ce guide ? Partagez votre expĂ©rience en commentaire ! đȘ
