Overview
Cal.com provides official Docker images and Docker Compose configurations for easy deployment:- Docker Hub:
calcom/cal.com - Scarf Registry:
calcom.docker.scarf.sh/calcom/cal.com(default, for metrics) - GitHub: Source Dockerfiles in the main repository
Support Policy: Cal.com maintains official Docker configurations, but users are responsible for their Docker-based installations. Community support is available via GitHub Discussions.
Docker Compose Services
The defaultdocker-compose.yml includes multiple services:
Service Architecture
Database Service
Redis Service
- Caching
- Job queues
- Session storage
- Rate limiting
Cal.com Web Service
API v2 Service
Prisma Studio (Development)
Dockerfile Deep Dive
Main Application Dockerfile
The Cal.com Dockerfile uses multi-stage builds:Stage 1: Builder
NEXT_PUBLIC_WEBAPP_URL is set to a placeholder during build and replaced at runtime by start.sh script.Stage 2: Builder-Two
Stage 3: Runner
API v2 Dockerfile
Environment Variables
Runtime Variables
These must be set in your.env file:
Build-time Arguments
For custom builds, pass these arguments:Startup Process
Thescripts/start.sh handles initialization:
Initialization Steps
- URL Replacement: Updates static files if
NEXT_PUBLIC_WEBAPP_URLchanged - Database Wait: Ensures PostgreSQL is ready
- Migrations: Applies pending database migrations
- App Store Seed: Syncs app metadata
- Application Start: Launches Next.js server
Migrations run automatically on every container start. This is safe and idempotent.
Docker Compose Usage
Running Services
Updating Images
Scaling Services
Custom Docker Builds
Building from Source
Custom Dockerfile
Create a custom Dockerfile extending the base image:Multi-platform Builds
ARM Architecture
ARM Images
For Apple Silicon, Raspberry Pi, and ARM servers:Building for ARM
Volumes and Persistence
Default Volumes
Backup Volumes
Inspect Volumes
Networks
Default Network
stack network.
Custom Networks
Health Checks
Built-in Health Check
The Dockerfile includes automatic health monitoring:Custom Health Checks
Check Health Status
Production Optimizations
Resource Limits
Restart Policies
Logging Configuration
Read-only Root Filesystem
Troubleshooting
View Logs
Container Shell Access
Database Connection Issues
Port Conflicts
Out of Memory
Migration Failures
Security Best Practices
Secret Management
Non-root User
Modify Dockerfile to run as non-root:Network Isolation
Remove Development Tools
Monitoring and Observability
Prometheus Metrics
Expose metrics endpoint:Container Stats
Production Checklist
- Change default database credentials
- Generate strong secrets (
NEXTAUTH_SECRET,CALENDSO_ENCRYPTION_KEY) - Generate VAPID keys for push notifications
- Remove or secure Prisma Studio service
- Configure proper
NEXT_PUBLIC_WEBAPP_URL - Set up external database or configure backups
- Configure Redis persistence
- Set resource limits and restart policies
- Configure logging rotation
- Enable health checks
- Use secrets management (not .env file)
- Set up reverse proxy (Nginx, Traefik, Caddy)
- Configure SSL certificates
- Test backup and restore procedures
- Monitor container health and logs
- Document custom configurations
Next Steps
- Configure Environment Variables
- Set up Database with connection pooling
- Review Deployment for orchestration options