
Bei Calendly zahlst du dauerhaft pro Nutzer und Monat. cal.com ist die Open-Source-Alternative auf deinem eigenen Server: Buchungsseiten, Teamplanung, Round-Robin-Zuweisung, Kalendersynchronisierung und Webhook-Automatisierung zum Preis eines VPS.
Diese Anleitung behandelt das Self-Hosting von cal.com mit Docker und PostgreSQL. Die Namen der .env-Variablen wurden im Mai 2026 mit dem aktuellen GitHub-Repository von cal.com abgeglichen. Da cal.com regelmäßig neue Variablen ergänzt, solltest du vor dem ersten Start immer die aktuelle .env.example im Repository prüfen. Cal.diy, der Community-Fork, wird auf dieselbe Weise installiert. Wenn du PostgreSQL unter Ubuntu installieren und pgAdmin einrichten möchtest, findest du dazu eine Schritt-für-Schritt-Anleitung.
Was cal.com bietet und für wen sich Self-Hosting eignet
cal.com ist eine Open-Source-Plattform für Terminplanung. Sie stellt die Infrastruktur für Buchungsseiten, Verfügbarkeitsregeln, Round-Robin-Routing, gemeinsame Teamplanung und die Kalendersynchronisierung mit Google, Outlook und iCal bereit. Der Funktionsumfang ist mit Calendly vergleichbar. Beim Preis gibt es einen deutlichen Unterschied: Der Teams-Plan von Calendly kostet 16 bis 20 US-Dollar pro Nutzer und Monat. Beim Self-Hosting von cal.com fallen nur deine Serverkosten an.
In drei Situationen ist Self-Hosting die klare Wahl: Aufgrund der DSGVO oder Vorgaben zum Datenspeicherort darfst du Buchungsdaten nicht über einen externen SaaS-Anbieter verarbeiten. Die nutzerabhängigen Kosten von Calendly werden für dein Team zu hoch. Du brauchst Kontrolle auf API-Ebene für eigene Integrationen.
Wenn du lediglich in fünf Minuten einen Buchungslink einrichten und keinen Server verwalten möchtest, ist der gehostete Gratis-Plan von cal.com einfacher. Diese Anleitung richtet sich an Teams, die sich bereits für Self-Hosting entschieden haben.
Server- und Softwareanforderungen
cal.com ist eine Next.js-Anwendung mit PostgreSQL als Datenbank. Der Ressourcenbedarf bleibt überschaubar.
Minimum: 2 vCPU, 4 GB RAM und 20 GB Speicherplatz. Cloud VPS 4 von Contabo deckt diese Anforderungen problemlos ab. Die Ausstattung reicht für einzelne Nutzer und kleine Teams mit einer cal.com-Instanz samt Postgres-Datenbank.
Empfehlung für mehrere Dienste auf demselben Server: 4 vCPU und 8 GB RAM, also die oben genannte Ausstattung von Contabo Cloud VPS 4. Wenn cal.com zusammen mit n8n oder anderen Tools auf demselben Server läuft, bieten 8 GB jedem Dienst genügend Spielraum.
Software: Docker und Docker Compose als Plugin-Version, also ‚docker compose‘ ohne Bindestrich, eine Domain mit DNS-Zugriff und SMTP-Zugangsdaten für E-Mail-Benachrichtigungen zu Buchungen. Im aktuellen Docker-Setup von cal.com läuft Redis standardmäßig neben PostgreSQL. Die Compose-Datei aus dem Repository enthält den Dienst bereits, sodass du ihn nicht separat installieren musst. Als Betriebssystem werden Ubuntu 22.04 oder 24.04 empfohlen.
Schritt 1: Repository klonen und Umgebung konfigurieren
Die Docker-Konfiguration wird im zentralen Monorepository von cal.com gepflegt. Klone es und kopiere die Umgebungsvorlage:
git clone https://github.com/calcom/cal.com.git cd cal.com cp .env.example .envÖffne .env und setze die folgenden Variablen. Diese Variablen waren im Mai 2026 erforderlich; prüfe die aktuelle .env.example immer auf Ergänzungen:
DATABASE_URL: deine PostgreSQL-Verbindungszeichenfolge. Format: postgresql://USER:PASSWORD@HOST:5432/DBNAME. Der mitgelieferte Postgres-Container verwendet standardmäßig postgresql://unicorn_user:magical_password@database:5432/calendso. Ändere diese Zugangsdaten vor dem Start.
NEXTAUTH_SECRET: Schlüssel für die Sitzungsverschlüsselung. Erzeuge ihn mit:
openssl rand -base64 32CALENDSO_ENCRYPTION_KEY: Schlüssel zur Verschlüsselung von Zugangsdaten. Erzeuge ihn mit:
openssl rand -base64 24 Dieser Schlüssel verwendet 24 Byte, nicht 32. Nach dem ersten Start darfst du ihn nie ändern, da sonst alle gespeicherten Zugangsdaten für Integrationen dauerhaft unbrauchbar werden. Dazu gehören Google-OAuth-Token und Kalenderverbindungen. Sichere den Schlüssel sofort an einem externen Ort.
REDIS_HOST, REDIS_PORT und REDIS_URL: Redis-Verbindungsdaten für den mitgelieferten Cache- und Warteschlangendienst. Mit dem folgenden Compose-Setup lauten sie REDIS_HOST=redis, REDIS_PORT=6379 und REDIS_URL=redis://redis:6379. Du musst sie nur ändern, wenn Redis außerhalb des standardmäßigen Compose-Netzwerks läuft.
NEXT_PUBLIC_WEBAPP_URL und NEXTAUTH_URL: Setze beide auf die vollständige öffentliche URL, unter der cal.com erreichbar sein wird: https://cal.yourdomain.com
EMAIL_FROM, EMAIL_SERVER_HOST, EMAIL_SERVER_PORT, EMAIL_SERVER_USER und EMAIL_SERVER_PASSWORD: Zugangsdaten des SMTP-Anbieters für E-Mails mit Buchungsbestätigungen. Resend und Postmark sind dafür geeignete Optionen.
Schritt 2: Stack starten
Nachdem du .env konfiguriert hast, startest du den vollständigen Stack mit cal.com, PostgreSQL, Redis und Prisma Studio:
docker compose up -dDie offizielle docker-compose.yml im Repository enthält Redis inzwischen standardmäßig neben PostgreSQL. Wenn du das aktuelle cal.com-Repository klonst, musst du die Compose-Datei daher nicht manuell bearbeiten. Prüfe lediglich, ob REDIS_HOST, REDIS_PORT und REDIS_URL aus Schritt 1 korrekt gesetzt sind. Die Standardwerte funktionieren bei einer typischen Installation auf einem einzelnen Server.
Beim ersten Start lädt Docker die Images herunter und führt die Datenbankmigrationen automatisch aus. Das dauert einige Minuten. Rufe cal.com unter http://YOUR_SERVER_IP:3000 oder über deine definierte NEXT_PUBLIC_WEBAPP_URL auf. Beim ersten Laden erscheint ein Einrichtungsassistent; erstelle dein Administratorkonto und trage den Namen deiner Organisation ein.
Prisma Studio, der Datenbank-Browser, läuft auf Port 5555, falls du die Datenbank direkt prüfen musst.
Teste die Installation, bevor du DNS änderst: Erstelle einen Test-Ereignistyp, führe eine Buchung durch und prüfe, ob sie in deiner Administrationsansicht erscheint. Falls keine E-Mail-Benachrichtigungen eintreffen, kontrolliere deine SMTP-Variablen. Fehlerhafte SMTP-Daten sind das häufigste Problem beim ersten Start.
Schritt 3: Domain und HTTPS
Erstelle im DNS einen A-Record, der deine Domain auf die IP-Adresse deines Servers verweist. Richte anschließend vor Port 3000 von cal.com einen Reverse Proxy mit SSL ein. Nginx mit Certbot und Caddy sind verbreitete Optionen:
- Gesamten Traffic auf Port 443 (HTTPS) an localhost:3000 weiterleiten
- Ein Let’s-Encrypt-Zertifikat für deine Domain bereitstellen
- HTTP auf Port 80 zu HTTPS umleiten
Nachdem der Proxy eingerichtet ist, aktualisierst du NEXT_PUBLIC_WEBAPP_URL und NEXTAUTH_URL in .env auf die https://-Version deiner Domain. Starte cal.com anschließend neu:
docker compose restart calcomTeste den gesamten Ablauf: Öffne die HTTPS-URL, melde dich an, erstelle eine Buchung und prüfe, ob die Bestätigungs-E-Mail mit der richtigen Domain im Link eintrifft. Wenn die E-Mail-Links weiterhin localhost oder http:// enthalten, wurden die env vars nicht übernommen. Prüfe sie auf Tippfehler und starte cal.com neu.
Schritt 4: cal.com aktuell halten
Sichere vor jedem Update deine Datenbank. Der genaue pg_dump-Befehl hängt vom Containernamen in deiner Compose-Datei ab. Ermittle mit docker compose ps den Namen deines Postgres-Containers und führe dann Folgendes aus:
docker exec -t <postgres-container-name> pg_dump -U unicorn_user calendso > backup_$(date +%Y%m%d).sqlLade anschließend die neuen Images herunter und starte den Stack neu:
docker compose pull docker compose up -dWenn sich das Schema geändert hat, führt cal.com die Datenbankmigrationen beim Start automatisch aus. Prüfe nach einem Update die Container-Logs und leite erst Traffic an die Anwendung weiter, wenn die Migrationen abgeschlossen sind.
Erzeuge CALENDSO_ENCRYPTION_KEY bei einem Update niemals neu. Dieser Wert ist kein regelmäßig zu wechselndes Passwort, sondern ein Master-Schlüssel für die Verschlüsselung. Wenn du ihn änderst, werden alle gespeicherten Zugangsdaten unbrauchbar.
Google Kalender und E-Mail verbinden
Erstelle für die Synchronisierung mit Google Kalender eine OAuth-2.0-Anwendung in der Google Cloud Console und aktiviere die Google Calendar API. Trage die Client-Zugangsdaten unter den Google-bezogenen Variablen in .env ein. Prüfe die aktuelle .env.example auf die genauen Variablennamen, da sie zwischen einzelnen cal.com-Versionen umbenannt wurden.
Setze die autorisierte Weiterleitungs-URI auf https://cal.yourdomain.com/api/auth/callback/google.
Im Administrationsbereich von cal.com aktivierst du App-Integrationen unter Settings → Apps. Danach können Nutzer ihre jeweiligen Google-Konten über ihre eigenen Einstellungsseiten verbinden.
SMTP für Buchungs-E-Mails sollte bereits funktionieren, wenn du die EMAIL_SERVER_*-Variablen in Schritt 1 gesetzt hast. Falls keine Bestätigungs-E-Mails eintreffen, prüfe, ob dein VPS-Anbieter Port 587 blockiert. Stelle außerdem sicher, dass du einen API-Schlüssel für Transaktions-E-Mails statt Marketing-E-Mails verwendest, und suche mit docker logs calcom nach dem SMTP-Fehler.
Hinweis zum Hosting
cal.com ist eine Next.js-Anwendung mit PostgreSQL-Datenbank und benötigt für eine selbst gehostete Anwendung relativ wenige Ressourcen. Ein einzelner Nutzer oder ein kleines Team kommt mit 8 GB RAM gut aus. Mehr Ressourcen brauchst du, wenn cal.com zusammen mit anderen Tools auf demselben Server läuft, etwa n8n für Buchungsautomatisierung, Analytics oder weitere Dienste. Mit 12 bis 24 GB erhält jeder Dienst genügend Arbeitsspeicher, ohne mit anderen Prozessen um Ressourcen zu konkurrieren. Contabo Cloud VPS 4 mit 4 vCPU, 8 GB RAM und 100 GB SSD ab 5,24 € pro Monat bei 24 Monaten Laufzeit ist ein sinnvoller Einstieg. Cloud VPS 6 mit 6 vCPU, 12 GB RAM und 200 GB SSD ab 7,14 € pro Monat eignet sich, wenn cal.com Teil eines größeren selbst gehosteten Stacks auf demselben Server ist.
FAQ: cal.com selbst hosten
Muss ich beim Aktualisieren von cal.com Datenbankmigrationen ausführen?
In den meisten Fällen ja. cal.com führt Prisma-Migrationen beim Start des Containers automatisch aus, wenn Schemaänderungen vorliegen. Nachdem du neue Images geladen und docker compose up -d ausgeführt hast, prüfst du in den Logs des Anwendungscontainers, ob die Migrationen erfolgreich abgeschlossen wurden, bevor du Traffic weiterleitest:docker compose logs calcom --tail=50
Suche nach einer Zeile, die angewendete Migrationen oder ‚No pending migrations.‘ meldet. Wenn der Container nach einem Update nicht startet, liegt es meist an einer fehlgeschlagenen Migration. Prüfe die Logs und DATABASE_URL und stelle sicher, dass der Postgres-Container fehlerfrei läuft, bevor du es erneut versuchst.
Erstelle vor jedem Update ein Datenbank-Backup. Eine fehlgeschlagene Migration an einer Live-Datenbank ohne Backup kann Daten dauerhaft beschädigen.
Welche Serveranforderungen gelten für das Self-Hosting von cal.com?
Minimum: 2 vCPU, 4 GB RAM, 20 GB Speicherplatz und Ubuntu 22.04 oder 24.04 mit Docker. Für ein Team-Deployment sind 4 vCPU und 8 GB RAM komfortabler, besonders wenn weitere Dienste denselben Server nutzen.
Wie verbinde ich cal.com mit PostgreSQL?
Setze DATABASE_URL in .env auf eine PostgreSQL-Verbindungszeichenfolge: postgresql://USER:PASSWORD@HOST:5432/DBNAME. Die mitgelieferte docker compose-Datei enthält einen Postgres-Container. Verwende diese Verbindungszeichenfolge für eine Installation auf einem einzelnen Server. cal.com führt die Migrationen beim ersten Start automatisch aus.
Kann ich cal.com mit meiner eigenen Domain verwenden?
Ja. Setze NEXT_PUBLIC_WEBAPP_URL und NEXTAUTH_URL in .env auf deine vollständige Domain (https://cal.yourdomain.com) und konfiguriere einen Reverse Proxy, der mit SSL auf Port 3000 verweist. Danach werden die Buchungsseiten über deine eigene Domain ausgeliefert.
Was passiert, wenn ich CALENDSO_ENCRYPTION_KEY nach der Einrichtung ändere?
Alle in deiner cal.com-Instanz gespeicherten Zugangsdaten werden mit diesem Schlüssel verschlüsselt, darunter Google-OAuth-Token, Kalenderverbindungen und Geheimnisse für Integrationen. Wenn du ihn nach dem ersten Start änderst, werden die gespeicherten Daten nicht neu verschlüsselt. Sie bleiben dauerhaft unlesbar.
Dadurch fallen alle Kalenderintegrationen ohne deutlichen Hinweis aus. Nutzer verlieren ihre Verbindungen zu Google Kalender. Die Anwendung startet möglicherweise weiterhin, aber Integrationen funktionieren ohne klare Fehlermeldung nicht mehr.
Behandle CALENDSO_ENCRYPTION_KEY wie einen Master-Schlüssel für die Datenbank. Erzeuge ihn einmal mit openssl rand -base64 24, speichere ihn außerhalb des Servers an einem sicheren Ort und ändere ihn nie. Falls du ihn verlierst und wechseln musst, beschreibt die Dokumentation von cal.com das Migrationsverfahren für diesen Sonderfall.
Wie richte ich E-Mail für eine selbst gehostete cal.com-Instanz ein?
Setze EMAIL_FROM, EMAIL_SERVER_HOST, EMAIL_SERVER_PORT, EMAIL_SERVER_USER und EMAIL_SERVER_PASSWORD in .env auf die Zugangsdaten deines SMTP-Anbieters. Resend und Postmark eignen sich für Transaktions-E-Mails. Starte cal.com nach Änderungen an .env neu: docker compose restart calcom.
Benötigt eine selbst gehostete cal.com-Instanz Redis?
Ja. Im aktuellen Docker-Setup von cal.com läuft Redis standardmäßig neben PostgreSQL und ist kein optionaler Zusatz. Wenn du einer älteren Anleitung oder Compose-Datei folgst, die nur PostgreSQL enthält, füge vor dem ersten Start einen Redis-Dienst hinzu. Redis nachträglich in eine bereits laufende cal.com-Installation einzubauen, verursacht mehr Aufwand als die direkte Einrichtung.
Wie hoste ich cal.com mit Docker und PostgreSQL für ein kleines Team auf einem VPS?
Klone auf einem Contabo Cloud VPS 4 mit 4 vCPU und 8 GB RAM das offizielle Docker-Repository von cal.com und konfiguriere die erforderlichen .env-Variablen DATABASE_URL, NEXTAUTH_SECRET, CALENDSO_ENCRYPTION_KEY und REDIS_*. Führe danach docker compose up -d aus, um cal.com, PostgreSQL und Redis gemeinsam zu starten. Schalte für HTTPS einen Reverse Proxy wie Caddy oder Nginx davor. PostgreSQL, Redis und Prisma Studio dürfen nicht über das öffentliche Internet erreichbar sein; nur die Ports 80 und 443 müssen offen sein. Die einzelnen Schritte findest du in der vollständigen Anleitung oben.
Haftungsausschluss: Die in diesem Artikel genannten Produktspezifikationen, Funktionen und Preise können sich ändern und je nach Region, Abrechnungszeitraum und laufender Aktion abweichen. Aktuelle Angaben, Preise und lokale Wechselkurse findest du auf der offiziellen Website des jeweiligen Anbieters oder der jeweiligen Marke.
