[{"data":1,"prerenderedAt":183},["ShallowReactive",2],{"seo-verification":3,"blog-heberger-cal-com-ma-fr":6,"promo-bar-likely":182},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-heberger-cal-com-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":118,"ctaBody":119,"ctaButton":120,"ctaUrl":121,"relatedPosts":122},88,"heberger-cal-com",{"fr":10,"en":12,"ar":13,"es":14},"host-calcom-on-your-own-vps","استضافة-calcom-على-خادمك-الافتراضي-الخاص-vps","alojar-cal-com-en-un-vps","Héberger Cal.com sur VPS : guide complet Docker","Déployez Cal.com sur VPS avec Docker, PostgreSQL et reverse proxy. Résolution du CLIENT_FETCH_ERROR, invariants, mise à jour sûre et dépannage.",9,2,false,"2026-03-24T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-cal-com-poster.svg",{"categorySlug":25,"appSlug":34},"cal-com","Calendly est pratique mais propriétaire, limité dans son plan gratuit et gourmand sur vos données de réunion. Cal.com est son équivalent open source : prise de rendez-vous, intégrations agenda et visio, le tout hébergeable sur votre propre VPS. Ce guide couvre le déploiement initial, la configuration du reverse proxy, le CLIENT_FETCH_ERROR qui bloque les nouvelles installations Docker depuis début 2026, et les erreurs les plus fréquentes.",[37,42,52,56,82,86,90,106,110,114],{"type":38,"title":39,"body":40,"items":41},"h2","Pourquoi auto-héberger Cal.com sur un VPS","Cal.com est une application Next.js adossée à PostgreSQL qui gère la planification de rendez-vous, les types d'événements, les disponibilités et la synchronisation avec les calendriers (Google, CalDAV, Office 365). L'auto-hébergement répond à un besoin précis : maîtriser les données de disponibilité et de prise de rendez-vous de vos clients, qui transitent normalement par un service tiers américain. Sur VPS, vous éliminez les limites du plan gratuit (un seul type d'événement, marque imposée), vous branchez vos propres clés d'API Google\u002Fvisio et vous intégrez le widget de réservation directement dans votre site sous votre domaine. Comme Cal.com est une application Node persistante avec base de données et build de production, elle exige un VPS — un mutualisé ne peut ni faire tourner le processus ni héberger PostgreSQL.",[],{"type":43,"title":44,"items":45},"ul","Bénéfices concrets de Cal.com auto-hébergé",[46,47,48,49,50,51],"Types d'événements sans plafond : entretiens 15 min, démos 30 min, ateliers de groupe, sans paywall.","Données de réservation chez vous : aucune fuite des coordonnées et créneaux clients vers un SaaS tiers.","White-label total : le lien de réservation porte votre domaine, pas celui d'un éditeur.","Webhooks et API : déclenchez des automatisations (CRM, facturation) à chaque rendez-vous pris.","Intégrations Google Agenda, CalDAV et visio (Jitsi, Google Meet) configurées avec vos propres clés.","Réservations d'équipe et round-robin pour distribuer les rendez-vous entre plusieurs collaborateurs.",{"type":38,"title":53,"body":54,"items":55},"Prérequis techniques","Cal.com est plus exigeant que la moyenne du self-hosting à cause de son socle Next.js et de l'étape de build. Prévoyez 2 vCPU, 4 Go de RAM et 20 Go de disque pour une instance d'équipe confortable ; 2 Go de RAM peuvent suffire pour un usage individuel mais le build initial est plus serré. Il faut Docker et Docker Compose, une base PostgreSQL (incluse dans le compose officiel), un domaine `rdv.votredomaine.com` pointé vers le VPS, et plusieurs variables d'environnement obligatoires : `NEXTAUTH_SECRET`, `CALENDSO_ENCRYPTION_KEY` (clés générées aléatoirement) et `NEXT_PUBLIC_WEBAPP_URL` réglée sur votre URL HTTPS finale. Pour la synchro agenda et la visio, prévoyez les identifiants OAuth Google.",[],{"type":57,"title":58,"steps":59,"items":81},"steps","Déployer Cal.com pas à pas",[60,63,66,69,72,75,78],{"title":61,"body":62},"Cloner le dépôt de déploiement Docker","Sur le VPS : `git clone https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fdocker.git cal-docker && cd cal-docker`. Ce dépôt fournit un `docker-compose.yml` et un fichier `.env.example` à adapter.",{"title":64,"body":65},"Générer les secrets et configurer l'environnement","Copiez `.env.example` en `.env`, puis générez les clés : `openssl rand -base64 32` pour `NEXTAUTH_SECRET` et pour `CALENDSO_ENCRYPTION_KEY`. Renseignez `NEXT_PUBLIC_WEBAPP_URL=https:\u002F\u002Frdv.votredomaine.com` et les identifiants PostgreSQL. **Conservez immédiatement ces trois valeurs dans un gestionnaire de secrets** — vous ne pourrez plus les changer après le premier démarrage sans perdre toutes vos intégrations.",{"title":67,"body":68},"Ajouter NEXTAUTH_URL_INTERNAL pour éviter le CLIENT_FETCH_ERROR","Ajoutez dans votre `.env` la ligne `NEXTAUTH_URL_INTERNAL=http:\u002F\u002Fcalcom:3000`. Sans cette variable, le conteneur Next.js tente de résoudre son propre domaine public (`rdv.votredomaine.com`) depuis l'intérieur du réseau Docker, où le DNS externe ne répond pas — et toute requête d'authentification côté serveur échoue avec `CLIENT_FETCH_ERROR`. `NEXTAUTH_URL_INTERNAL` court-circuite cette résolution en pointant directement vers le service Docker (`calcom` est le nom du service dans `docker-compose.yml`). Cette variable est distincte de `NEXTAUTH_URL` : les deux doivent être présentes.",{"title":70,"body":71},"Construire et lancer la stack","Démarrez avec `docker compose up -d`. Le premier démarrage construit l'image Next.js et applique les migrations Prisma sur PostgreSQL — c'est l'étape la plus longue, suivez-la avec `docker compose logs -f`.",{"title":73,"body":74},"Se connecter la première fois","Ouvrez l'URL : Cal.com vous redirige vers son assistant de première configuration (`\u002Fauth\u002Fsetup`) où vous créez VOTRE compte administrateur. Faites-le dès la fin de l'installation : cet assistant n'est protégé par rien tant que le premier compte n'existe pas.",{"title":76,"body":77},"Créer le compte et configurer les disponibilités","Définissez vos plages horaires et un premier type d'événement. Testez une réservation de bout en bout pour valider la chaîne complète avant de brancher les intégrations.",{"title":79,"body":80},"Connecter agenda et visio","Dans les intégrations, ajoutez vos identifiants OAuth Google pour la synchro bidirectionnelle de l'agenda, et activez Jitsi ou Google Meet pour générer automatiquement un lien de visio à chaque réservation.",[],{"type":38,"title":83,"body":84,"items":85},"Reverse proxy : nginx et Caddy","Cal.com écoute sur le port 3000 du conteneur. Il faut un reverse proxy HTTPS devant lui pour deux raisons : exposer le port 443 et transmettre le bon en-tête `Host` — sans quoi `NEXT_PUBLIC_WEBAPP_URL` ne correspond plus à l'origine réelle et les redirections d'authentification cassent.\n\n**Avec Caddy** (recommandé, certificat automatique) :\n\n```\nrdv.votredomaine.com {\n    reverse_proxy calcom:3000\n}\n```\n\nCaddy obtient et renouvelle le certificat Let's Encrypt sans configuration supplémentaire.\n\n**Avec nginx**, ajoutez ce bloc dans votre configuration :\n\n```\nserver {\n    listen 443 ssl;\n    server_name rdv.votredomaine.com;\n    ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Frdv.votredomaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Frdv.votredomaine.com\u002Fprivkey.pem;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:3000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n```\n\nDans les deux cas, l'URL doit correspondre **exactement** à `NEXT_PUBLIC_WEBAPP_URL` : sans barre oblique finale, en HTTPS, avec le bon sous-domaine. Un écart d'un caractère produit des redirections infinies ou un écran blanc.",[],{"type":38,"title":87,"body":88,"items":89},"Invariants critiques du premier démarrage","Trois variables d'environnement sont figées définitivement au **premier démarrage** de Cal.com. Les modifier après coup corrompt silencieusement toutes les intégrations stockées : l'application redémarre normalement, affiche zéro erreur, mais Google Calendar, Zoom et toutes les connexions OAuth cessent de fonctionner — leurs tokens sont chiffrés avec la clé d'origine, désormais incompatible. Ce comportement est documenté dans calcom\u002Fdocker \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fdocker\u002Fissues\u002F333\">issue #333\u003C\u002Fa> et calcom\u002Fcal.diy \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fcal.diy\u002Fissues\u002F13290\">issue #13290\u003C\u002Fa> : des utilisateurs ont perdu toutes leurs intégrations après une mise à jour qui avait régénéré le fichier `.env`.\n\n**`CALENDSO_ENCRYPTION_KEY`** — chiffre les tokens OAuth stockés en base. Toute modification invalide silencieusement toutes les intégrations existantes.\n\n**`NEXTAUTH_URL`** — ancre les cookies de session. Un changement casse l'authentification pour tous les utilisateurs actifs.\n\n**`NEXT_PUBLIC_WEBAPP_URL`** — intégrée dans les builds Next.js lors de la compilation. Changer cette valeur exige un rebuild complet et une reconnexion de toutes les intégrations.\n\nBonne pratique : copiez ces trois valeurs dans un gestionnaire de secrets (Bitwarden, HashiCorp Vault, Ansible Vault) dès leur génération. Si vous gérez votre VPS en infrastructure-as-code, stockez-les dans un vault chiffré — ne laissez jamais le fichier `.env` être leur seul emplacement.",[],{"type":57,"title":91,"steps":92,"items":105},"Mettre à jour Cal.com en toute sécurité",[93,96,99,102],{"title":94,"body":95},"Sauvegarder la base PostgreSQL","Avant toute mise à jour : `docker exec cal-docker-db-1 pg_dump -U calcom calcom | gzip > \u002Fopt\u002Fbackup\u002Fcalcom-$(date +%Y%m%d).sql.gz`. Les migrations Prisma ne sont pas réversibles — cette sauvegarde est votre seul filet.",{"title":97,"body":98},"Vérifier que CALENDSO_ENCRYPTION_KEY est inchangée","Comparez la valeur dans votre `.env` avec celle conservée dans votre gestionnaire de secrets. Si elles diffèrent, **n'allez pas plus loin** : restaurez la valeur d'origine avant de continuer. Une clé différente détruira toutes vos intégrations OAuth au redémarrage.",{"title":100,"body":101},"Tirer la nouvelle image et relancer","Mettez à jour avec `docker compose pull && docker compose up -d`. Suivez le démarrage avec `docker compose logs -f calcom` — attendez le message indiquant que le serveur est prêt avant de tester.",{"title":103,"body":104},"Vérifier les intégrations après la mise à jour","Ouvrez Paramètres → Intégrations et confirmez que chaque connexion existante (Google Calendar, Zoom, etc.) est toujours active. Un statut « non connecté » est le signe que la clé a changé entre deux démarrages — restaurez la sauvegarde et le `.env` d'origine.",[],{"type":38,"title":107,"body":108,"items":109},"Dépannage : CLIENT_FETCH_ERROR et autres erreurs Docker","**CLIENT_FETCH_ERROR au chargement de la page** — Depuis début 2026, toutes les nouvelles installations Docker rencontrent cette erreur lors du premier chargement. Cause : le conteneur Next.js résout `NEXTAUTH_URL` (votre domaine public) depuis l'intérieur du réseau Docker, où le DNS externe n'est pas accessible. Solution : ajoutez `NEXTAUTH_URL_INTERNAL=http:\u002F\u002Fcalcom:3000` dans votre `.env` et redémarrez avec `docker compose up -d`. Cette variable force NextAuth à appeler sa propre API en interne, sans passer par le domaine public. Documenté dans calcom\u002Fcal.diy \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fcal.diy\u002Fissues\u002F27668\">issue #27668\u003C\u002Fa> (février 2026, 8 commentaires confirmant l'erreur sur toutes les distributions Docker récentes).\n\n**Intégrations perdues après une mise à jour** — La cause est presque toujours une `CALENDSO_ENCRYPTION_KEY` différente entre deux démarrages. Vérifiez que votre `.env` n'a pas été écrasé par un `.env.example` lors du pull. Comparez la valeur actuelle avec celle dans votre gestionnaire de secrets. Si les valeurs diffèrent : restaurez la base PostgreSQL, remettez l'ancienne clé dans le `.env` et relancez avec `docker compose up -d`.\n\n**Build « JavaScript heap out of memory »** — Le compilateur Next.js manque de RAM. Solution : `fallocate -l 2G \u002Fswapfile && mkswap \u002Fswapfile && swapon \u002Fswapfile`, puis relancez `docker compose build`. Sur un VPS à 2 Go, le swap est souvent indispensable pour le premier build et les mises à jour majeures. Retirez le fichier swap une fois le build terminé.\n\n**Redirect loop ou « Unable to find valid origin »** — `NEXT_PUBLIC_WEBAPP_URL` ne correspond pas à l'URL réelle. Vérifiez que cette variable est bien `https:\u002F\u002Frdv.votredomaine.com` (sans barre oblique finale, avec le bon domaine et le bon protocole HTTPS), que le reverse proxy transmet bien l'en-tête `Host`, puis relancez avec `docker compose up -d --build` pour forcer un rebuild avec la bonne URL.\n\n**Migrations Prisma bloquées au démarrage** — Si le conteneur redémarre en boucle avec des erreurs de migration, la base de données n'est peut-être pas encore prête. Attendez quelques secondes et relancez `docker compose restart calcom`. Si le problème persiste, vérifiez les logs PostgreSQL avec `docker compose logs db`.",[],{"type":111,"body":112,"items":113},"tip","Automatisez la sauvegarde de votre base PostgreSQL avec un cron quotidien. Exemple de commande à planifier : `docker exec cal-docker-db-1 pg_dump -U calcom calcom | gzip > \u002Fopt\u002Fbackup\u002Fcalcom-$(date +%Y%m%d-%H%M).sql.gz`. Conservez au minimum 7 jours de sauvegardes rotatives et externalisez-les sur un stockage objet (S3-compatible, Backblaze B2) : en cas de perte du VPS, la base PostgreSQL est la seule partie non-reproductible de votre instance Cal.com.",[],{"type":38,"title":115,"body":116,"items":117},"Pour aller plus loin","Une fois Cal.com opérationnel, plusieurs pistes pour renforcer l'installation : activer les alertes sur les certificats SSL pour anticiper les expirations, brancher un monitoring HTTP (Uptime Kuma, Better Uptime) sur `https:\u002F\u002Frdv.votredomaine.com\u002Fapi\u002Fhealth`, et restreindre le port 3000 du conteneur à `127.0.0.1` pour qu'il ne soit plus accessible directement. Pour les installations d'équipe, le reverse proxy peut servir plusieurs instances Cal.com derrière des sous-domaines distincts à partir d'un seul VPS — voir \u003Ca href=\"\u002Fblog\u002Fdeployer-avec-coolify\">déploiement avec Coolify\u003C\u002Fa> pour une gestion multi-services simplifiée. La documentation officielle de Cal.com couvre également la configuration SMTP pour les e-mails de confirmation et l'intégration Stripe pour les réservations payantes.",[],"Hébergez votre prise de rendez-vous","Le VPS Cloud ServOrbit fournit la RAM et le Docker nécessaires au build de Cal.com, avec un template PostgreSQL et reverse proxy prêts à configurer. Offrez à vos clients un lien de réservation sous votre propre domaine.","Déployer sur VPS Cloud","\u002Fvps-cloud",[123,145,166],{"id":124,"slug":125,"slugs":126,"title":130,"excerpt":131,"readTime":132,"views":18,"isPinned":19,"noindex":19,"publishedAt":133,"updatedAt":134,"category":135,"categories":140,"featuredImage":30,"bgImage":31,"posterImage":142,"relatedSolution":143},41,"deployer-avec-coolify",{"fr":125,"en":127,"ar":128,"es":129},"deploy-your-applications-with-coolify-on-a-vps","نشر-تطبيقاتك-باستخدام-coolify-على-vps","desplegar-aplicaciones-con-coolify-en-un-vps","Déployer vos applications avec Coolify sur un VPS","Déployer Coolify sur un VPS : installation, configuration HTTPS, connexion Git, première application, bases de données, sauvegardes et dépannage.",12,"2026-05-10T00:00:00+00:00","2026-10-31T01:54:10+00:00",{"id":136,"name":137,"slug":138,"color":139,"icon":138},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[141],{"id":136,"name":137,"slug":138,"color":139,"icon":138},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":138,"appSlug":144},"coolify",{"id":146,"slug":147,"slugs":148,"title":152,"excerpt":153,"readTime":154,"views":155,"isPinned":19,"noindex":19,"publishedAt":156,"updatedAt":157,"category":158,"categories":163,"featuredImage":30,"bgImage":31,"posterImage":165,"relatedSolution":30},116,"certificats-ssl-lets-encrypt-vps",{"fr":147,"en":149,"ar":150,"es":151},"free-ssl-certificates-with-lets-encrypt-on-a-vps","شهادات-ssl-مجانية-باستخدام-lets-encrypt-على-خادم-vps","certificados-ssl-gratis-con-lets-encrypt-en-un-vps","Certificats SSL gratuits avec Let's Encrypt sur VPS","Guide complet Let's Encrypt sur VPS : certbot nginx, wildcard DNS-01, renouvellement systemd, hardening TLS, dépannage rate-limits et comparatif certbot\u002Facme.sh\u002FCaddy.",8,0,"2026-02-24T00:00:00+00:00","2026-09-30T11:20:34+00:00",{"id":154,"name":159,"slug":160,"color":161,"icon":162},"Sécurité & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[164],{"id":154,"name":159,"slug":160,"color":161,"icon":162},"\u002Fblog\u002Fcovers\u002Fcertificats-ssl-lets-encrypt-vps-poster.svg",{"id":167,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":154,"views":175,"isPinned":19,"noindex":19,"publishedAt":176,"updatedAt":177,"category":178,"categories":179,"featuredImage":30,"bgImage":31,"posterImage":181,"relatedSolution":30},228,"durcissement-serveur-linux-initial",{"fr":168,"en":170,"ar":171,"es":172},"initial-linux-server-hardening","تصليب-الخادم-linux-الأولي","hardening-inicial-servidor-linux","Durcissement initial d'un serveur Linux","Créez un utilisateur sudo, configurez SSH avec clés, activez UFW et fail2ban sur Ubuntu ou Debian en moins d'une heure.",1,"2026-08-06T00:00:00+00:00","2026-10-20T23:18:07+00:00",{"id":154,"name":159,"slug":160,"color":161,"icon":162},[180],{"id":154,"name":159,"slug":160,"color":161,"icon":162},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",true,1794270713870]