Blog / Tutoriales / Cómo alojar cal.com con Docker y PostgreSQL
(last updated: )

Cómo alojar cal.com con Docker y PostgreSQL

Alojar cal.com en tu servidor te da control total sobre los datos de reservaciones, las integraciones y los costos. Esta guía explica cómo desplegar cal.com con Docker y PostgreSQL, configurar HTTPS y correo electrónico, y evitar errores comunes durante las actualizaciones y la configuración inicial.

Lectura de 11 min
How to Self-Host cal.com with Docker and PostgreSQL
Cómo alojar cal.com con Docker y PostgreSQL

Calendly cobra por usuario y por mes, indefinidamente. cal.com es la alternativa open source que funciona en tu propio servidor sin precios por usuario. Incluye páginas de reservación, programación para equipos, asignación round-robin, sincronización de calendarios y automatización con webhooks, todo por el costo de un VPS.

Esta guía explica cómo alojar cal.com con Docker y PostgreSQL. Los nombres de las variables de .env se verificaron con el repositorio actual de cal.com en GitHub en mayo de 2026, pero cal.com agrega variables con frecuencia. Revisa siempre el archivo .env.example actual del repositorio antes de ejecutar la aplicación por primera vez. Cal.diy, el fork de la comunidad, sigue el mismo proceso de instalación. Si te interesa la instalación de PostgreSQL en Ubuntu y la configuración de pgAdmin, consulta nuestra guía paso a paso.

Qué hace cal.com y quién debería alojarlo

cal.com es una plataforma open source de programación de citas. Proporciona la infraestructura para páginas de reservación, reglas de disponibilidad, distribución round-robin, programación colectiva para equipos y sincronización con Google Calendar, Outlook e iCal. Sus funciones son comparables con las de Calendly. La diferencia de precio es considerable: el plan Teams de Calendly cuesta entre $16 y $20 por usuario al mes. Con cal.com, solo pagas el costo de tu servidor.

Alojarlo en tu servidor tiene sentido en tres situaciones: los requisitos del RGPD o de residencia de datos no permiten enviar datos de reservaciones mediante un SaaS externo; el precio por usuario de Calendly resulta demasiado alto para tu equipo; o necesitas control mediante API para crear integraciones personalizadas.

Si solo quieres publicar un enlace de reservación en cinco minutos y no administrar ningún servidor, el plan gratuito alojado de cal.com es más sencillo. Esta guía está dirigida a equipos que ya decidieron alojar la plataforma por su cuenta.

Requisitos de servidor y software

cal.com es una aplicación Next.js que usa PostgreSQL como base de datos. Sus requisitos de recursos son moderados.

Mínimo: 2 vCPU, 4 GB de RAM y 20 GB de disco. El plan Cloud VPS 4 de Contabo cubre estos requisitos con margen. Esta configuración sirve para uso individual y equipos pequeños con una sola instancia de cal.com y su base de datos Postgres.

Recomendado si compartes el servidor con otros servicios: 4 vCPU y 8 GB de RAM, las mismas especificaciones del Cloud VPS 4 de Contabo mencionado antes. Si planeas ejecutar cal.com junto con n8n u otras herramientas en el mismo servidor, 8 GB ofrecen suficiente margen para cada servicio.

Software: Docker y Docker Compose, en su versión de plugin, con el comando ‘docker compose’ sin guion; un dominio con acceso a la configuración DNS; y credenciales SMTP para las notificaciones de reservaciones por correo. La configuración actual de Docker para cal.com ejecuta Redis junto con PostgreSQL de forma predeterminada. El archivo Compose del repositorio ya lo incluye, así que no necesitas instalarlo por separado. El sistema operativo recomendado es Ubuntu 22.04 o 24.04.

Paso 1: clona el repositorio y configura el entorno

La configuración de Docker se mantiene en el monorepo principal de cal.com. Clónalo y copia la plantilla de variables de entorno:

git clone https://github.com/calcom/cal.com.git cd cal.com cp .env.example .env

Abre .env y define las siguientes variables. Estas son las variables que se verificaron como obligatorias en mayo de 2026. Revisa siempre el archivo .env.example actual por si se agregaron otras:

DATABASE_URL: la cadena de conexión a PostgreSQL. Formato: postgresql://USER:PASSWORD@HOST:5432/DBNAME. El valor predeterminado del contenedor Postgres incluido es postgresql://unicorn_user:magical_password@database:5432/calendso. Cambia esas credenciales antes de ejecutarlo.

NEXTAUTH_SECRET: clave de cifrado de sesiones. Genérala con:

openssl rand -base64 32

CALENDSO_ENCRYPTION_KEY: clave para cifrar credenciales. Genérala con:

openssl rand -base64 24 

Esta clave usa 24 bytes, no 32. Nunca debes cambiarla después de la primera ejecución. Si la cambias, dañarás de forma permanente todas las credenciales de integración almacenadas, como tokens OAuth de Google y conexiones de calendarios. Guarda de inmediato una copia externa.

REDIS_HOST, REDIS_PORT y REDIS_URL: datos de conexión de Redis para el servicio incluido de caché y colas. Con la configuración de Compose que aparece abajo, los valores son REDIS_HOST=redis, REDIS_PORT=6379 y REDIS_URL=redis://redis:6379. No necesitas cambiarlos, salvo que ejecutes Redis fuera de la red predeterminada de Compose.

NEXT_PUBLIC_WEBAPP_URL y NEXTAUTH_URL: configura ambas con la URL pública completa donde estará disponible cal.com: https://cal.yourdomain.com

EMAIL_FROM, EMAIL_SERVER_HOST, EMAIL_SERVER_PORT, EMAIL_SERVER_USER y EMAIL_SERVER_PASSWORD: credenciales de tu proveedor SMTP para los correos de confirmación de reservaciones. Resend y Postmark son opciones confiables.

Paso 2: inicia el stack

Después de configurar .env, inicia el stack completo: cal.com, PostgreSQL, Redis y Prisma Studio:

docker compose up -d

El archivo docker-compose.yml oficial del repositorio ahora incluye un servicio Redis junto con PostgreSQL de forma predeterminada. Si clonaste el repositorio actual de cal.com, no necesitas editar manualmente el archivo Compose. Solo confirma que las variables REDIS_HOST, REDIS_PORT y REDIS_URL del paso 1 tengan los valores correctos. Los valores predeterminados funcionan en una configuración estándar con un solo servidor.

Durante la primera ejecución se descargan las imágenes y se aplican automáticamente las migraciones de la base de datos. El proceso tarda unos minutos. Abre cal.com en http://YOUR_SERVER_IP:3000 o en el valor definido para NEXT_PUBLIC_WEBAPP_URL. Al cargarlo por primera vez aparecerá un asistente de configuración. Crea tu cuenta de administrador y establece el nombre de tu organización.

Prisma Studio, el explorador de la base de datos, se ejecuta en el puerto 5555 por si necesitas inspeccionarla directamente.

Haz una prueba antes de modificar el DNS: crea un tipo de evento de prueba, registra una reservación y confirma que aparezca en la vista de administración. Si no recibes las notificaciones por correo, revisa las variables SMTP. Ese es el problema más común durante la primera ejecución.

Paso 3: dominio y HTTPS

Crea un registro A en el DNS que apunte tu dominio a la IP del servidor. Después, configura un proxy inverso con SSL delante del puerto 3000 de cal.com. Tanto Nginx con Certbot como Caddy son opciones comunes:

  • Envía todo el tráfico del puerto 443 (HTTPS) a localhost:3000
  • Genera un certificado Let’s Encrypt para tu dominio
  • Redirige HTTP (puerto 80) a HTTPS

Cuando el proxy esté configurado, actualiza NEXT_PUBLIC_WEBAPP_URL y NEXTAUTH_URL en .env con la versión https:// de tu dominio. Después, reinicia el servicio:

docker compose restart calcom

Prueba todo el flujo: abre la URL HTTPS, inicia sesión, crea una reservación y confirma que el correo incluya el dominio correcto en el enlace. Si los enlaces todavía muestran localhost o http://, las env vars no se aplicaron. Busca errores de escritura y reinicia el servicio.

Paso 4: mantén cal.com actualizado

Antes de cualquier actualización, crea un backup de la base de datos. El comando exacto de pg_dump depende del nombre del contenedor en tu archivo Compose. Ejecuta docker compose ps para confirmar el nombre del contenedor Postgres y después usa:

docker exec -t <postgres-container-name> pg_dump -U unicorn_user calendso > backup_$(date +%Y%m%d).sql

Después, descarga las imágenes nuevas y reinicia:

docker compose pull docker compose up -d

cal.com ejecuta automáticamente las migraciones de la base de datos al iniciar cuando detecta cambios en el esquema. Después de actualizar, revisa los logs del contenedor y confirma que las migraciones terminaron antes de enviar tráfico.

Nunca regeneres CALENDSO_ENCRYPTION_KEY durante una actualización. No es una contraseña que debas rotar. Es una clave maestra de cifrado y cambiarla daña todas las credenciales almacenadas.

Conectar Google Calendar y el correo electrónico

Para sincronizar Google Calendar, crea una aplicación OAuth 2.0 en Google Cloud Console y activa la API de Google Calendar. Agrega las credenciales del cliente a .env en las variables relacionadas con Google. Revisa el archivo .env.example actual para conocer los nombres exactos, ya que han cambiado entre versiones de cal.com.

Configura el URI de redireccionamiento autorizado como https://cal.yourdomain.com/api/auth/callback/google.

En el panel de administración de cal.com, activa las integraciones de apps en Settings → Apps. Después, cada usuario podrá conectar su cuenta de Google desde su propia página de configuración.

El servicio SMTP para los correos de reservaciones ya debería funcionar si configuraste las variables EMAIL_SERVER_* en el paso 1. Si no recibes los correos de confirmación, verifica que tu proveedor de VPS no bloquee el puerto 587, confirma que usas una clave de API para correo transaccional y no para marketing, y ejecuta docker logs calcom para consultar el error SMTP.

Nota sobre el hosting

cal.com es una app Next.js con una base de datos PostgreSQL y consume pocos recursos frente a otros servicios alojados en servidores propios. Un usuario o un equipo pequeño puede trabajar sin problemas con 8 GB de RAM. Necesitarás más recursos cuando ejecutes cal.com junto con otras herramientas en el mismo servidor, como n8n para automatizar reservaciones, sistemas de analítica o servicios adicionales. Para ese escenario, entre 12 y 24 GB ofrecen espacio suficiente para cada servicio sin competir por recursos. Contabo Cloud VPS 4 (4 vCPU, 8 GB de RAM, SSD de 100 GB y €5.24/mes con un plazo de 24 meses) es un punto de partida práctico. Cloud VPS 6 (6 vCPU, 12 GB de RAM, SSD de 200 GB y €7.14/mes) tiene sentido si cal.com forma parte de un stack más amplio en el mismo servidor.

Preguntas frecuentes sobre alojar cal.com

¿Necesito ejecutar migraciones de la base de datos al actualizar cal.com?

En la mayoría de los casos, sí. cal.com ejecuta automáticamente las migraciones de Prisma cuando el contenedor inicia y detecta cambios en el esquema. Después de descargar las imágenes nuevas y ejecutar docker compose up -d, revisa los logs del contenedor de la aplicación para confirmar que las migraciones terminaron antes de enviar tráfico:
docker compose logs calcom --tail=50
Busca una línea que indique que se aplicaron las migraciones o ‘No pending migrations.’ Si el contenedor no inicia después de una actualización, suele deberse a una migración fallida. Revisa los logs, verifica que DATABASE_URL sea correcto y confirma que el contenedor Postgres esté en buen estado antes de intentarlo otra vez.
Crea siempre un backup de la base de datos antes de actualizar. Una migración dañada en una base de datos activa y sin backup puede provocar una pérdida grave de datos.

¿Qué requisitos de servidor tiene cal.com si lo alojo por mi cuenta?

Mínimo: 2 vCPU, 4 GB de RAM, 20 GB de disco y Ubuntu 22.04 o 24.04 con Docker. Para un despliegue de equipo, 4 vCPU y 8 GB de RAM ofrecen más margen, especialmente si otros servicios comparten el servidor.

¿Cómo conecto cal.com con PostgreSQL?

Configura DATABASE_URL en .env con una cadena de conexión de PostgreSQL: postgresql://USER:PASSWORD@HOST:5432/DBNAME. El archivo docker compose incluido contiene un contenedor Postgres. Usa esa cadena de conexión si todo se ejecutará en un solo servidor. cal.com aplica las migraciones automáticamente durante el primer inicio.

¿Puedo usar cal.com con mi propio dominio?

Sí. Configura NEXT_PUBLIC_WEBAPP_URL y NEXTAUTH_URL en .env con tu dominio completo (https://cal.yourdomain.com), configura un proxy inverso con SSL que apunte al puerto 3000 y las páginas de reservación se publicarán desde tu dominio.

¿Qué ocurre si cambio CALENDSO_ENCRYPTION_KEY después de configurar cal.com?

Todas las credenciales almacenadas en tu instancia de cal.com, incluidos los tokens OAuth de Google, las conexiones de calendarios y los secretos de integración, se cifran con esta clave. Cambiarla después de la primera ejecución no vuelve a cifrar los datos almacenados. Los deja ilegibles de forma permanente.
Como resultado, todas las integraciones de calendarios dejan de funcionar sin avisar. Los usuarios pierden sus conexiones con Google Calendar. La app puede iniciar, pero las integraciones fallarán sin mostrar un mensaje de error claro.
Trata CALENDSO_ENCRYPTION_KEY como una clave maestra de la base de datos. Genérala una vez con openssl rand -base64 24, guárdala en un lugar seguro fuera del servidor y no la cambies. Si la pierdes y necesitas rotarla, la documentación de cal.com explica el procedimiento de migración para ese caso.

¿Cómo configuro el correo electrónico en una instalación propia de cal.com?

Configura EMAIL_FROM, EMAIL_SERVER_HOST, EMAIL_SERVER_PORT, EMAIL_SERVER_USER y EMAIL_SERVER_PASSWORD en .env con las credenciales de tu proveedor SMTP. Resend y Postmark son opciones confiables para correo transaccional. Reinicia el servicio después de cambiar .env : docker compose restart calcom.

¿Una instalación propia de cal.com necesita Redis?

Sí. La configuración actual de Docker para cal.com ejecuta Redis junto con PostgreSQL como parte estándar del stack, no como un componente opcional. Si sigues una guía o un archivo Compose antiguo que solo incluye PostgreSQL, agrega un servicio Redis antes de la primera ejecución. Incorporarlo después de que cal.com ya esté funcionando provoca más interrupciones que incluirlo desde el principio.

¿Cuál es la mejor forma de alojar cal.com con Docker y PostgreSQL en un VPS para un equipo pequeño?

En un Contabo Cloud VPS 4 (4 vCPU y 8 GB de RAM), clona el repositorio oficial de Docker para cal.com, configura las variables obligatorias de .env (DATABASE_URL, NEXTAUTH_SECRET, CALENDSO_ENCRYPTION_KEY y las variables REDIS_*) y ejecuta docker compose up -d para iniciar cal.com, PostgreSQL y Redis juntos. Coloca un proxy inverso como Caddy o Nginx delante de los servicios para activar HTTPS. Mantén PostgreSQL, Redis y Prisma Studio fuera de internet. Solo los puertos 80 y 443 deben ser accesibles. Consulta los pasos anteriores para ver el procedimiento detallado.

Aviso: Las especificaciones, funciones y precios de los productos mencionados en este artículo pueden cambiar y variar según la región, el periodo de facturación y las promociones activas. Consulta el sitio web oficial de cada proveedor o marca para obtener cifras, precios y tipos de cambio locales vigentes.

Compartir 𝕏 in