Déploiement Cal.com self-hosted sur VPS Debian

par Déc 31, 2025Déploiement & Infrastructure

🚀 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 :

  1. Se connecter Ă  PostgreSQL
  2. Créer toutes les tables nécessaires (users, bookings, events, etc.)
  3. 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 :

  1. Domain Names : call.mondher.ch
  2. Scheme : http
  3. Forward Hostname/IP : calcom (nom du conteneur)
  4. Forward Port : 3000
  5. ☑ Block Common Exploits
  6. ☑ Websockets Support (IMPORTANT !)

Onglet SSL :

  1. SSL Certificate : Request a new SSL Certificate
  2. ☑ Force SSL
  3. ☑ HTTP/2 Support
  4. Email : votre email
  5. ☑ 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 :

  1. CrĂ©er vos types d’Ă©vĂ©nements (consultations, rĂ©unions, etc.)
  2. Connecter vos calendriers (Google Calendar, Outlook)
  3. Configurer les notifications email
  4. Personnaliser votre profil public
  5. 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.

Recevoir les tips infrastructure

Vous avez dĂ©ployĂ© Cal.com en suivant ce guide ? Partagez votre expĂ©rience en commentaire ! đŸ’Ș

Articles similaires

Aucun résultat

La page demandée est introuvable. Essayez d'affiner votre recherche ou utilisez le panneau de navigation ci-dessus pour localiser l'article.