[{"data":1,"prerenderedAt":170},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-cal-com-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-cal-com-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":109,"ctaBody":110,"ctaButton":111,"ctaUrl":112,"relatedPosts":113},88,"alojar-cal-com-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-cal-com","host-calcom-on-your-own-vps","استضافة-calcom-على-خادمك-الافتراضي-الخاص-vps","Alojar Cal.com en VPS: guía completa con Docker","Despliegue Cal.com en un VPS con Docker, PostgreSQL y reverse proxy. Solución al CLIENT_FETCH_ERROR, invariantes del primer arranque y depuración.",9,0,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,"Autoalojamiento","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 es práctico, pero propietario, limitado en su plan gratuito y ávido de sus datos de reuniones. Cal.com es su equivalente open source: reserva de citas, integraciones de calendario y videollamada, y todo alojable en su propio VPS. Esta guía cubre el despliegue inicial, la configuración del reverse proxy, el CLIENT_FETCH_ERROR que bloquea las nuevas instalaciones Docker desde principios de 2026 y los errores más frecuentes.",[37,41,51,54,79,82,85,100,103,106],{"type":38,"title":39,"body":40},"h2","Por qué autoalojar Cal.com en un VPS","Cal.com es una aplicación Next.js respaldada por PostgreSQL que gestiona la planificación de citas, los tipos de evento, las disponibilidades y la sincronización con los calendarios (Google, CalDAV, Office 365). El autoalojamiento responde a una necesidad concreta: controlar los datos de disponibilidad y de reserva de sus clientes, que normalmente pasan por un servicio externo estadounidense. En un VPS elimina los límites del plan gratuito (un solo tipo de evento, marca impuesta), conecta sus propias claves de API de Google y de videollamada, e integra el widget de reserva directamente en su sitio bajo su dominio. Como Cal.com es una aplicación Node persistente con base de datos y build de producción, exige un VPS: un alojamiento compartido no puede ni ejecutar el proceso ni alojar PostgreSQL.",{"type":42,"title":43,"items":44},"ul","Beneficios concretos de Cal.com autoalojado",[45,46,47,48,49,50],"Tipos de evento ilimitados: entrevistas de 15 min, demos de 30 min, talleres de grupo, sin muro de pago.","Datos de reserva en su servidor: ninguna fuga de los contactos ni de los horarios de sus clientes hacia un SaaS externo.","White-label total: el enlace de reserva lleva su dominio, no el de un proveedor.","Webhooks y API: active automatizaciones (CRM, facturación) con cada cita reservada.","Integraciones con Google Calendar, CalDAV y videollamada (Jitsi, Google Meet) configuradas con sus propias claves.","Reservas de equipo y round-robin para repartir las citas entre varios colaboradores.",{"type":38,"title":52,"body":53},"Requisitos técnicos","Cal.com es más exigente que la media del self-hosting por su base Next.js y por la etapa de build. Prevea 2 vCPU, 4 GB de RAM y 20 GB de disco para una instancia de equipo cómoda; 2 GB de RAM pueden bastar para un uso individual, pero el build inicial queda más ajustado. Necesita Docker y Docker Compose, una base de datos PostgreSQL (incluida en el compose oficial), un dominio `rdv.yourdomain.com` apuntando al VPS y varias variables de entorno obligatorias: `NEXTAUTH_SECRET`, `CALENDSO_ENCRYPTION_KEY` (claves generadas aleatoriamente) y `NEXT_PUBLIC_WEBAPP_URL` ajustada a su URL HTTPS final. Para la sincronización del calendario y la videollamada, prepare las credenciales OAuth de Google.",{"type":55,"title":56,"steps":57},"steps","Desplegar Cal.com paso a paso",[58,61,64,67,70,73,76],{"title":59,"body":60},"Clonar el repositorio de despliegue Docker","En el VPS: `git clone https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fdocker.git cal-docker && cd cal-docker`. Este repositorio proporciona un `docker-compose.yml` y un archivo `.env.example` que hay que adaptar.",{"title":62,"body":63},"Generar los secretos y configurar el entorno","Copie `.env.example` como `.env` y genere después las claves: `openssl rand -base64 32` para `NEXTAUTH_SECRET` y para `CALENDSO_ENCRYPTION_KEY`. Indique `NEXT_PUBLIC_WEBAPP_URL=https:\u002F\u002Frdv.yourdomain.com` y las credenciales de PostgreSQL. **Guarde estos tres valores en un gestor de secretos de inmediato** — no podrá cambiarlos tras el primer arranque sin perder todas sus integraciones.",{"title":65,"body":66},"Añadir NEXTAUTH_URL_INTERNAL para evitar el CLIENT_FETCH_ERROR","Añada `NEXTAUTH_URL_INTERNAL=http:\u002F\u002Fcalcom:3000` a su `.env`. Sin esta variable, el contenedor Next.js intenta resolver su propio dominio público (`rdv.yourdomain.com`) desde dentro de la red Docker, donde el DNS externo no responde — cada petición de autenticación del lado del servidor falla con `CLIENT_FETCH_ERROR`. `NEXTAUTH_URL_INTERNAL` cortocircuita esa resolución apuntando directamente al nombre del servicio Docker (`calcom` es el nombre del servicio en `docker-compose.yml`). Esta variable es independiente de `NEXTAUTH_URL`: ambas deben estar presentes.",{"title":68,"body":69},"Compilar y arrancar la stack","Arranque con `docker compose up -d`. El primer arranque construye la imagen Next.js y aplica las migraciones Prisma sobre PostgreSQL: es la etapa más larga, sígala con `docker compose logs -f`.",{"title":71,"body":72},"Conectarse por primera vez","Abra la URL: Cal.com le redirige a su asistente de primera configuración (`\u002Fauth\u002Fsetup`), donde crea SU cuenta de administrador. Hágalo nada más terminar la instalación: ese asistente no está protegido por nada mientras no exista la primera cuenta.",{"title":74,"body":75},"Crear la cuenta y configurar las disponibilidades","Defina sus franjas horarias y un primer tipo de evento. Pruebe una reserva de principio a fin para validar toda la cadena antes de conectar las integraciones.",{"title":77,"body":78},"Conectar calendario y videollamada","En las integraciones, añada sus credenciales OAuth de Google para la sincronización bidireccional del calendario y active Jitsi o Google Meet para generar automáticamente un enlace de videollamada en cada reserva.",{"type":38,"title":80,"body":81},"Reverse proxy: nginx y Caddy","Cal.com escucha en el puerto 3000 dentro del contenedor. Un reverse proxy HTTPS es necesario por dos motivos: exponer el puerto 443 y reenviar la cabecera `Host` correcta — de lo contrario `NEXT_PUBLIC_WEBAPP_URL` ya no coincide con el origen real y las redirecciones de autenticación fallan.\n\n**Con Caddy** (recomendado, certificado automático):\n\n```\nrdv.yourdomain.com {\n    reverse_proxy calcom:3000\n}\n```\n\nCaddy obtiene y renueva el certificado Let's Encrypt sin configuración adicional.\n\n**Con nginx**, añada este bloque a su configuración:\n\n```\nserver {\n    listen 443 ssl;\n    server_name rdv.yourdomain.com;\n    ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Frdv.yourdomain.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Frdv.yourdomain.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\nEn ambos casos, la URL debe coincidir **exactamente** con `NEXT_PUBLIC_WEBAPP_URL`: sin barra oblicua final, en HTTPS, con el subdominio correcto. Una diferencia de un solo carácter produce redirecciones infinitas o pantalla en blanco.",{"type":38,"title":83,"body":84},"Invariantes críticos del primer arranque","Tres variables de entorno quedan permanentemente bloqueadas en el **primer arranque** de Cal.com. Modificarlas después corrompe silenciosamente todas las integraciones almacenadas: la aplicación reinicia con normalidad, no muestra ningún error, pero Google Calendar, Zoom y todas las conexiones OAuth dejan de funcionar — sus tokens fueron cifrados con la clave original, ahora incompatible. Este comportamiento está documentado en calcom\u002Fdocker \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fdocker\u002Fissues\u002F333\">issue #333\u003C\u002Fa> y calcom\u002Fcal.diy \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fcal.diy\u002Fissues\u002F13290\">issue #13290\u003C\u002Fa>: usuarios han perdido todas sus integraciones tras una actualización que regeneró el archivo `.env`.\n\n**`CALENDSO_ENCRYPTION_KEY`** — cifra los tokens OAuth almacenados en la base de datos. Cualquier cambio invalida silenciosamente todas las integraciones existentes.\n\n**`NEXTAUTH_URL`** — ancla las cookies de sesión. Un cambio rompe la autenticación para todos los usuarios activos.\n\n**`NEXT_PUBLIC_WEBAPP_URL`** — integrada en el build de Next.js en el momento de la compilación. Cambiar este valor exige un rebuild completo y volver a conectar todas las integraciones.\n\nBuena práctica: copie estos tres valores en un gestor de secretos (Bitwarden, HashiCorp Vault, Ansible Vault) en cuanto los genere. Si gestiona su VPS como infraestructura-como-código, guárdelos en un vault cifrado — nunca deje que el archivo `.env` sea su único almacén.",{"type":55,"title":86,"steps":87},"Actualizar Cal.com de forma segura",[88,91,94,97],{"title":89,"body":90},"Hacer copia de seguridad de la base PostgreSQL","Antes de cualquier actualización: `docker exec cal-docker-db-1 pg_dump -U calcom calcom | gzip > \u002Fopt\u002Fbackup\u002Fcalcom-$(date +%Y%m%d).sql.gz`. Las migraciones Prisma no son reversibles — esta copia de seguridad es su única red de seguridad.",{"title":92,"body":93},"Verificar que CALENDSO_ENCRYPTION_KEY no ha cambiado","Compare el valor de su `.env` con el almacenado en su gestor de secretos. Si difieren, **no continúe**: restaure el valor original antes de seguir. Una clave diferente destruirá silenciosamente todas sus integraciones OAuth al reiniciar.",{"title":95,"body":96},"Descargar la nueva imagen y reiniciar","Actualice con `docker compose pull && docker compose up -d`. Siga el arranque con `docker compose logs -f calcom` — espere el mensaje que indica que el servidor está listo antes de hacer pruebas.",{"title":98,"body":99},"Verificar las integraciones tras la actualización","Abra Configuración → Integraciones y confirme que cada conexión existente (Google Calendar, Zoom, etc.) sigue activa. Un estado «no conectado» indica que la clave cambió entre reinicios — restaure la copia de seguridad y el `.env` original.",{"type":38,"title":101,"body":102},"Depuración: CLIENT_FETCH_ERROR y otros errores Docker","**CLIENT_FETCH_ERROR al cargar la página** — Desde principios de 2026, todas las nuevas instalaciones Docker encuentran este error en la primera carga. Causa: el contenedor Next.js intenta resolver `NEXTAUTH_URL` (su dominio público) desde dentro de la red Docker, donde el DNS externo no es accesible. Solución: añada `NEXTAUTH_URL_INTERNAL=http:\u002F\u002Fcalcom:3000` a su `.env` y reinicie con `docker compose up -d`. Esta variable fuerza a NextAuth a llamar a su propia API internamente, sin pasar por el dominio público. Documentado en calcom\u002Fcal.diy \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcalcom\u002Fcal.diy\u002Fissues\u002F27668\">(febrero 2026, issue #27668)\u003C\u002Fa> (febrero de 2026, 8 comentarios que confirman el error en todas las distribuciones Docker recientes).\n\n**Integraciones perdidas tras una actualización** — La causa es casi siempre una `CALENDSO_ENCRYPTION_KEY` diferente entre dos arranques. Compruebe que su `.env` no haya sido sobreescrito por un `.env.example` durante el pull. Compare el valor actual con el guardado en su gestor de secretos. Si difieren: restaure la base PostgreSQL, vuelva a poner la clave original en `.env` y reinicie con `docker compose up -d`.\n\n**Build «JavaScript heap out of memory»** — El compilador Next.js se queda sin RAM. Solución: `fallocate -l 2G \u002Fswapfile && mkswap \u002Fswapfile && swapon \u002Fswapfile`, y vuelva a ejecutar `docker compose build`. En un VPS de 2 GB, el swap suele ser imprescindible para el primer build y las actualizaciones mayores. Retire el archivo swap una vez terminado el build.\n\n**Bucle de redirección o «Unable to find valid origin»** — `NEXT_PUBLIC_WEBAPP_URL` no coincide con la URL real. Compruebe que esta variable sea exactamente `https:\u002F\u002Frdv.yourdomain.com` (sin barra oblicua final, dominio correcto, protocolo HTTPS), que el reverse proxy reenvíe correctamente la cabecera `Host`, y reinicie con `docker compose up -d --build` para forzar un rebuild con la URL correcta.\n\n**Migraciones Prisma bloqueadas al arrancar** — Si el contenedor reinicia en bucle con errores de migración, es posible que la base de datos todavía no esté lista. Espere unos segundos y ejecute `docker compose restart calcom`. Si el problema persiste, revise los logs de PostgreSQL con `docker compose logs db`.",{"type":104,"body":105},"tip","Automatice la copia de seguridad de su base PostgreSQL con un cron diario. Ejemplo de comando a programar: `docker exec cal-docker-db-1 pg_dump -U calcom calcom | gzip > \u002Fopt\u002Fbackup\u002Fcalcom-$(date +%Y%m%d-%H%M).sql.gz`. Conserve al menos 7 días de copias rotativas y envíelas a un almacenamiento de objetos externo (compatible con S3, Backblaze B2): en caso de pérdida del VPS, la base de datos PostgreSQL es la única parte no reproducible de su instancia de Cal.com.",{"type":38,"title":107,"body":108},"Para ir más lejos","Una vez que Cal.com funciona, varios pasos para reforzar la instalación: activar alertas sobre los certificados SSL para anticipar sus vencimientos, configurar monitorización HTTP (Uptime Kuma, Better Uptime) sobre `https:\u002F\u002Frdv.yourdomain.com\u002Fapi\u002Fhealth`, y restringir el puerto 3000 del contenedor a `127.0.0.1` para que no sea accesible directamente. Para instalaciones de equipo, el reverse proxy puede servir varias instancias de Cal.com detrás de subdominios distintos desde un único VPS — consulte \u003Ca href=\"\u002Fblog\u002Fdeployer-avec-coolify\">el despliegue con Coolify\u003C\u002Fa> para una gestión multi-servicio simplificada. La documentación oficial de Cal.com también cubre la configuración SMTP para los correos de confirmación y la integración con Stripe para reservas de pago.","Aloje su sistema de citas","El VPS Cloud de ServOrbit aporta la RAM y el Docker necesarios para compilar Cal.com, con una plantilla PostgreSQL y reverse proxy lista para configurar. Ofrezca a sus clientes un enlace de reserva bajo su propio dominio.","Desplegar en VPS Cloud","\u002Fvps-cloud",[114,136,156],{"id":115,"slug":116,"slugs":117,"title":121,"excerpt":122,"readTime":17,"views":123,"isPinned":19,"publishedAt":124,"updatedAt":21,"category":125,"categories":130,"featuredImage":30,"bgImage":31,"posterImage":132,"relatedSolution":133},41,"desplegar-aplicaciones-con-coolify-en-un-vps",{"fr":118,"en":119,"ar":120,"es":116},"deployer-avec-coolify","deploy-your-applications-with-coolify-on-a-vps","نشر-تطبيقاتك-باستخدام-coolify-على-vps","Desplegar sus aplicaciones con Coolify en un VPS","Despliegue Coolify en un VPS: instalación, configuración HTTPS, conexión Git, primera aplicación, bases de datos, copias de seguridad y diagnóstico.",1,"2026-05-10T00:00:00+00:00",{"id":126,"name":127,"slug":128,"color":129,"icon":128},3,"Despliegue","deploiement","bg-success\u002F10 text-success",[131],{"id":126,"name":127,"slug":128,"color":129,"icon":128},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":134,"appSlug":135},"despliegue-de-aplicaciones-devops","coolify",{"id":137,"slug":138,"slugs":139,"title":143,"excerpt":144,"readTime":145,"views":18,"isPinned":19,"publishedAt":146,"updatedAt":21,"category":147,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":30},116,"certificados-ssl-gratis-con-lets-encrypt-en-un-vps",{"fr":140,"en":141,"ar":142,"es":138},"certificats-ssl-lets-encrypt-vps","free-ssl-certificates-with-lets-encrypt-on-a-vps","شهادات-ssl-مجانية-باستخدام-lets-encrypt-على-خادم-vps","Certificados SSL gratis con Let's Encrypt en un VPS","Despliegue Let's Encrypt en su VPS: HTTPS gratuito, renovación automática y A+ en SSL Labs con Nginx, Caddy o Traefik en Docker.",4,"2026-02-24T00:00:00+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},8,"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[154],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fcertificats-ssl-lets-encrypt-vps-poster.svg",{"id":157,"slug":158,"slugs":159,"title":163,"excerpt":164,"readTime":148,"views":18,"isPinned":19,"publishedAt":165,"updatedAt":21,"category":166,"categories":167,"featuredImage":30,"bgImage":31,"posterImage":169,"relatedSolution":30},228,"hardening-inicial-servidor-linux",{"fr":160,"en":161,"ar":162,"es":158},"durcissement-serveur-linux-initial","initial-linux-server-hardening","تصليب-الخادم-linux-الأولي","Endurecimiento (hardening) inicial de un servidor Linux","Cree un usuario sudo, configure SSH con claves y active UFW y fail2ban en Ubuntu o Debian en menos de una hora.","2026-08-06T00:00:00+00:00",{"id":148,"name":149,"slug":150,"color":151,"icon":152},[168],{"id":148,"name":149,"slug":150,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",1789664995697]