Meetings einfach planen mit Cal.com
Cal.com ist eine Open-Source Software für das einfache planen von Meetings. Dabei kann Cal.com selbst auf einem Server betrieben werden oder im Abo von Cal.com genutzt werden.
Vorteile einer Terminbuchungs Lösung
Nichts ist nerviger als E-Mails mit Terminvorschlägen mit Kunden und Mandanten hin und her zu senden.
Wäre es nicht viel einfachher, wenn Kunden und Mandanten sich durch den Terminkalender klicken können und einen passenden Termin selber auswählen?
Das bietet die Lösung von Cal.com. Dabei bietet Cal.com einen eigenen Hostingdienst an oder man kann die Open-Source Software auf einem eigenen Server betreiben. Dazu beraten wir Sie gerne.
Es können mehrere Event Types definiert werden mit eigenen Geschäftszeiten sowie eigenen Limitierungen für die Buchung. Die Dauer kann fest vorgegeben werden oder wir stellen dem Buchenden mehrere Möglichkeiten zur Verfügung, z.B. 15 Minuten, 30 Minuten oder 60 Minuten.
Es sind Pflichtfelder sowie auch optionale Felder möglich.
Damit Buchungstermine nicht mit eigenen Terminen kollidieren, können wir mehrere Kalender in unserem Benutzerprofil einbinden. Auch das einbinden von Privaten Kalendern ist möglich. Sind dort schon Termine vorhanden, stehen diese Zeiten nicht mehr in der Buchungsübersicht zur Auswahl und sind automatisch geblockt. Kunden und Mandaten habe natürlich auf die Kalender keinen Zugriff und sehen auch nicht warum diese Termine geblockt sind. Die Termine sind einfach nicht auswählbar.
Funktionen im Überblick
- Mehrere Benutzer möglich
- Geschäftszeiten definierbar, aber auch Ausnahmen können eingestellt werden
- Die eigenen Kalender können per CalDav, Exchange und vielen anderen Diensten eingebunden werden, damit bereits belegte Zeiten nicht von Kunden gebucht werden können.
- Buchungen können mit und ohne Bestätigung eingestellt werden, es ist auch möglich eine Bestätigung einzustellen, wenn die Buchung kurzfristig ist, z.B. bei Buchungen unter 2 Stunden vorlaufzeit.
- Ebenso kann eine Sperrfrist für kurzfristige Buchungen eingestellt werden.
- Es können mehrere optionale wie auch Pflichtfelder erstellt werden.
Installationsanleitung für Ubuntu 22.04 LTS
Die Docker Version von Cal.com benötigt docker, docker-compose sowie git.
apt install docker
apt install docker-compose
apt install git
Anschließend wechseln wir in das Verzeichnis /opt.
cd /opt
Und downloaden die aktuelle Version mit git.
git clone --recursive https://github.com/calcom/docker.git calcom
Dadurch wird ein Unterordner calcom in /opt erstellt. Nun wechsel wir in den calcom Ordner.
cd calcom
Im Ordner calcom muss nun das calcom submodule geupdatet werden.
git submodule update --remote --init
Nun öffnen wir die docker-compose.yaml Konfigurationsdatei und Klammern den Teil vom Prisma Studio aus. Dafür setzten wir vor die Zeilen ein #.
nano docker-compose.yaml
Die Konfigurationsdatei sollte wie folgt aussehen.
# Use postgres/example user/password credentials
version: '3.8'
volumes:
database-data:
networks:
stack:
name: stack
external: false
services:
database:
container_name: database
image: postgres:17
restart: always
volumes:
- database-data:/var/lib/postgresql/data/
env_file: .env
networks:
- stack
calcom:
image: calcom.docker.scarf.sh/calcom/cal.com
build:
context: .
dockerfile: Dockerfile
args:
NEXT_PUBLIC_WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_URL}
NEXT_PUBLIC_LICENSE_CONSENT: ${NEXT_PUBLIC_LICENSE_CONSENT}
CALCOM_TELEMETRY_DISABLED: ${CALCOM_TELEMETRY_DISABLED}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
CALENDSO_ENCRYPTION_KEY: ${CALENDSO_ENCRYPTION_KEY}
DATABASE_URL: ${DATABASE_URL}
network: stack
restart: always
networks:
- stack
ports:
- 3000:3000
env_file: .env
environment:
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
depends_on:
- database
# Optional use of Prisma Studio. In production, comment out or remove the section below to prevent unwanted access to your database.
# studio:
# image: calcom.docker.scarf.sh/calcom/cal.com
# restart: always
# networks:
# - stack
# ports:
# - 5555:5555
# env_file: .env
# environment:
# - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
# depends_on:
# - database
# command:
# - npx
# - prisma
# - studio
# END SECTION: Optional use of Prisma Studio.
Wir speichern die docker-compose.yaml Datei und machen weiter mit der .env Datei.
Die Konfigurationsdatei .env.example bennen wir in .env um.
mv .env.example .env
In der Konfigurationsdatei .env müssen folgende Zeilen geändert werden:
- NEXT_PUBLIC_WEBAPP_URL=
- NEXTAUTH_URL=
- NEXTAUTH_SECRET=
- CALENDSO_ENCRYPTION_KEY=
- EMAIL_FROM=
- EMAIL_SERVER_HOST=
- E_MAIL_SERVER_PORT=
- EMAIL_SAERVER_USER=
- EMAIL_SERVER_PASSWORD
- NODE_TLS_REJECT_UNAUTHORIZED=0 (Wenn ein Nginx Proxy vor Cal.com verwendet wird)
Für die Generierung von NEXTAUTH_SECRET nutzen wir openssl rand -base64 32 und notieren uns den generierten Key für diesen später in die Konfigurationsdatei einzufügen.
openssl rand -base64 32
Für CALENDSO_ENCRYPTION_KEY nutzen wir zur Generierung dd if=/dev/urandom bs=1K count=1 | md5sum und notieren uns auch diesen Key für später.
dd if=/dev/urandom bs=1K count=1 | md5sum
Anschließend öffnen wir die .env Konfigurationsdatei und nehmen die Änderungen vor.
nano .env
Folgende Einträge sollten nun zu sehen sein.
# Set this value to 'agree' to accept our license:
# LICENSE: https://github.com/calendso/calendso/blob/main/LICENSE
#
# Summary of terms:
# - The codebase has to stay open source, whether it was modified or not
# - You can not repackage or sell the codebase
# - Acquire a commercial license to remove these terms by emailing: license@cal.com
NEXT_PUBLIC_LICENSE_CONSENT=
LICENSE=
# BASE_URL and NEXT_PUBLIC_APP_URL are both deprecated. Both are replaced with one variable, NEXT_PUBLIC_WEBAPP_URL
# BASE_URL=http://localhost:3000
# NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_WEBAPP_URL=
# Configure NEXTAUTH_URL manually if needed, otherwise it will resolve to {NEXT_PUBLIC_WEBAPP_URL}/api/auth
NEXTAUTH_URL=
# It is highly recommended that the NEXTAUTH_SECRET must be overridden and very unique
# Use `openssl rand -base64 32` to generate a key
NEXTAUTH_SECRET=
# Encryption key that will be used to encrypt CalDAV credentials, choose a random string, for example with `dd if=/dev/urandom bs=1K count=1 | md5sum`
CALENDSO_ENCRYPTION_KEY=
# Deprecation note: JWT_SECRET is no longer used
# JWT_SECRET=secret
POSTGRES_USER=unicorn_user
POSTGRES_PASSWORD=magical_password
POSTGRES_DB=calendso
DATABASE_HOST=database:5432
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
GOOGLE_API_CREDENTIALS={}
# Set this to '1' if you don't want Cal to collect anonymous usage
CALCOM_TELEMETRY_DISABLED=1
# Used for the Office 365 / Outlook.com Calendar integration
MS_GRAPH_CLIENT_ID=
MS_GRAPH_CLIENT_SECRET=
# Used for the Zoom integration
ZOOM_CLIENT_ID=
ZOOM_CLIENT_SECRET=
# E-mail settings
# Configures the global From: header whilst sending emails.
EMAIL_FROM=
# Configure SMTP settings (@see https://nodemailer.com/smtp/).
EMAIL_SERVER_HOST=
EMAIL_SERVER_PORT=
EMAIL_SERVER_USER=
EMAIL_SERVER_PASSWORD=
NODE_ENV=production
NODE_TLS_REJECT_UNAUTHORIZED=0
Die Zeilen NEXT_PUBLIC_WEBAPP_URL= und NEXTAUTH_URL= müssen eure Domain enthalten. Bei NEXTAUTH_URL wird hinter die Domain zusätzlich noch /api/auth hinzugefügt, z.B. https://xyz.com/apit/auth
Damit HTTPS funktioniert, wird ein Nginx Proxy benötigt. Die Installation und Konfiguration ist nicht bestandteil dieser Anleitung.
NEXTAUTH_SECRET= muss mit dem eben generierten Key vervollständigt werden und CALENDSO_ENCCYPTION_KEY ebenso.
Anschließend müssen die E-Mail Einstellungen vorgenommen werden, damit später bei gebuchten Terminen automatisch eine Bestätigungsemail versendet wird.
Am Ende fügen wir noch NODE_TLS_REJECT_UNAUTHORIZED=0 ein, sofern ein Nginx Proxy verwendet wird.
Sind alle Einstellungen geändert und die .env Datei gespeichert, können wir den Docker Container erstmalig starten.
docker-compose pull && docker-compose up -d
Der Docker Container sollte nun unter http://localhost:3000 erreichbar sein bzw. muss der Nginx Proxy auf die IP-Adresse des Servers verweisen und den Port 3000.