5.2 KiB
CalBook
CalBook ist ein modernes, self-hosted Terminbuchungssystem mit genau einem Termintyp: Gespräch.
Die öffentliche Buchung hat eine optionale Personenauswahl: Nutzer wählen "Alle" oder eine spezifische Person. CalBook wählt automatisch verfügbare Personen und legt den Termin für alle passenden Personen an.
Das Backend ist Admin-only:
- Es gibt keinen separaten Mitarbeiter-Login/-Bereich.
- Buchungskapazität entsteht aus den im Admin angelegten Personen-Kalendern.
- Die Personenanzahl wird automatisch aus aktiven Kalender-Personen berechnet.
Stack
- Next.js 15 (App Router)
- Tailwind CSS + framer-motion
- Prisma + PostgreSQL
- NextAuth Credentials Login
- tsdav für CalDAV
- node-cron für 5-Minuten-Sync
- Nodemailer SMTP
- Docker + Docker Compose
Schnellstart
./deploy.sh
Ein Befehl – führt interaktiv durch Konfiguration, generiert Secrets, baut Container, richtet Datenbank ein und legt Admin an.
Die App ist danach unter der eingegebenen URL erreichbar.
Deployment-Modi
direct: App auf:3000, Mailhog auf:8025proxy: keine Host-Ports, Routing über vorhandenes Traefik
Für echte Mail-Links (Storno/Umbuchen) als URL deine Domain angeben (z. B. https://calbook.deinedomain.tld).
Docker Build
- App-Image als Next.js-Standalone-Build.
- BuildKit-Cache für
npm ci– Folge-Builds ohne erneuten Download. - Prisma/Seed über separaten
calbook-toolsService. - DB-Volumes stack-spezifisch:
./volumes/postgres-<stack-name>.
Default Login
- E-Mail: Wert aus
ADMIN_EMAILin.env - Passwort: Wert aus
ADMIN_PASSWORDin.env
Wichtige Routen
Öffentlich:
- Buchung:
/buchen - Einbettung:
/buchen?embed=true - Mitarbeiter-Buchung:
/buchen/<slug> - Datenschutz:
/datenschutz - Impressum:
/impressum - Stornierung:
/stornieren?token=... - Login:
/anmelden
Admin (alle unter /admin/*):
- Dashboard:
/admin/uebersicht - Termine:
/admin/termine - Kalender-Personen:
/admin/kalender - E-Mail-Templates:
/admin/email-templates - Branding (Header + Footer):
/admin/branding - Rechtliches:
/admin/rechtliches - Instant Meeting:
/admin/instant-meeting - Backup:
/admin/backup - Einstellungen (global + SMTP):
/admin/einstellungen
Mailhog (nur direct-Modus):
http://localhost:8025
API
GET /api/public/mitarbeiterGET /api/public/slots?datum=YYYY-MM-DDGET /api/public/slots-monatPOST /api/public/buchenGET /api/public/umbuchen?token=POST /api/public/stornierenGET|PATCH /api/admin/einstellungenPOST /api/admin/einstellungen/test-smtpGET|POST /api/admin/kalenderPATCH|DELETE /api/admin/kalender/[id]GET|POST /api/admin/kalender/[id]/syncPOST /api/admin/kalender/test-connectionGET|PATCH /api/admin/termineGET /api/admin/letzte-buchungenPATCH /api/admin/letzte-buchungenGET|POST /api/admin/backupGET|POST /api/admin/instant-meetingPOST /api/cron/sync
Hinweise
- UI und API sind auf Deutsch (ohne i18n-Framework).
- Zeitzone standardmäßig
Europe/Berlin. - Embed-Modus:
/buchen?embed=true. - SMTP kann im Admin-Backend unter Einstellungen gepflegt werden.
- Deployment:
./deploy.shführt durch alles (Konfiguration, Build, Prisma, Seed). - Traefik-Integration über Labels + externes Docker-Netzwerk (
proxy). - Zwei Compose-Varianten:
docker-compose.proxy.yml,docker-compose.direct.yml. calbook-app: schlankes Runtime-Image.calbook-tools: nur für Prisma/Seed-Kommandos.- Container-Namen via
STACK_NAME(<stack>-app,<stack>-db,<stack>-mailhog). - Postgres-Daten unter
./volumes/postgres-<stack-name>(stack-spezifisch). POST /api/cron/syncbenötigt Headerx-cron-secretmitCRON_SECRET.TRUST_PROXY_HEADERS=truefür korrektes Rate-Limiting hinter Reverse-Proxy.- Buchbare Wochentage/Uhrzeiten pro Personen-Kalender im Admin unter Kalender.
- E-Mail-Templates: 10 Event-Typen, 9 Design-Styles, Live-Vorschau, Custom-Templates.
- Öffentliche API-Routen sind IP-basiert rate-limitiert.
- Mutierende API-Requests prüfen Request-Herkunft (Origin/Sec-Fetch-Site).
- Buchungen nutzen serielle DB-Transaktionen und Slot-Locking gegen Race-Conditions.
- In-Memory-Caches für Settings und Slot-Abfragen (TTL via Env konfigurierbar).
- SMTP/CalDAV-Fehler mit Retry/Backoff + persistenter DeliveryIssue-Queue.
- Umbuchung per Token-Link, Reminder-Mails (24h und 2h vorher) via Cron.
- Admin: No-Show-Markierung, SMTP-Testmail.
- Backup: Vollständiger Export/Import inkl. CalDAV-Key-Re-Encryption (URLs werden ausgefiltert).
- Standalone-Export-Script:
scripts/export-backup.sh(für Versionen ohne Backup-API). - Session-Timeout: Nach 2 Stunden Inaktivität automatischer Logout.
- Prisma-Migrationen unter
prisma/migrations.
Traefik (vorhanden)
CalBook startet keinen eigenen Traefik-Container. Labels werden auf den calbook-app-Service gesetzt.
Relevante .env-Variablen:
DEPLOYMENT_MODE=proxyENABLE_TRAEFIK=trueTRAEFIK_HOST=deine-domain.tldTRAEFIK_ENTRYPOINTS=websecureTRAEFIK_TLS=trueTRAEFIK_CERTRESOLVER=tls_resolverTRAEFIK_ROUTER_NAME=calbookTRAEFIK_SERVICE_NAME=calbookTRAEFIK_DOCKER_NETWORK=proxy
deploy.sh setzt automatisch den passenden Compose-Modus und erstellt das Proxy-Netzwerk.