- docker-compose.yml: baikal (ckulka/baikal:nginx) + caddy Reverse Proxy - Persistente Daten unter ./daten (config, data, caddy_certs) - Caddy-Image mit Entrypoint: erstellt beim Start automatisch ein selbstsigniertes 100-Jahres-Zertifikat, falls noch keins vorhanden ist - README mit Setup-, Backup- und Zertifikats-Anleitung
Baikal Server (Docker)
CalDAV/CardDAV-Server (sabre/baikal) per Docker Compose, mit vorgeschaltetem Caddy als TLS-Reverse-Proxy.
Aufbau
- baikal —
ckulka/baikal:nginx, liefert Baikal auf Port 80 (intern) - caddy — eigenes Image (
caddy:2-alpine+openssl), terminiert TLS auf Port 443 und leitet anbaikalweiter. HTTP (Port 80) wird permanent auf HTTPS umgeleitet.
Alle persistenten Daten liegen im Projektverzeichnis unter ./daten:
daten/
config/ Baikal-Konfiguration (Setup, Admin-Login, DB-Settings)
data/ Baikal-Nutzdaten (Kalender, Adressbuecher, SQLite-DB)
caddy_certs/ Selbstsigniertes TLS-Zertifikat (baikal.crt / baikal.key)
daten/ ist damit der einzige Ordner, den man fuer Backups sichern bzw. bei
einem Umzug/Redeploy 1:1 mitnehmen muss.
TLS-Zertifikat (100 Jahre, automatisch)
Der Caddy-Container hat einen eigenen Entrypoint
(caddy/entrypoint.sh): Beim Start prueft er, ob unter
daten/caddy_certs/baikal.crt + baikal.key bereits ein Zertifikat liegt.
- Nicht vorhanden -> es wird automatisch ein neues, selbstsigniertes
Zertifikat per
opensslerzeugt, gueltig fuer 36500 Tage (100 Jahre). - Vorhanden -> wird unveraendert weiterverwendet (kein Ueberschreiben bei jedem Neustart).
Caddys eingebautes automatisches HTTPS (ACME / interne CA mit kurzlebigen
Zertifikaten) ist im Caddyfile bewusst per auto_https off deaktiviert —
stattdessen wird das selbst erzeugte Langzeit-Zertifikat direkt referenziert.
Da es sich um ein selbstsigniertes Zertifikat handelt, werden CalDAV/CardDAV- Clients (Browser, Thunderbird, DAVx5, iOS/macOS Kalender-App, ...) beim ersten Verbinden eine Zertifikatswarnung anzeigen. Das Zertifikat muss dort einmalig als vertrauenswuerdig akzeptiert bzw. importiert werden.
Hostname/CN anpassen
Der Common Name (CN) und SAN-Eintrag des Zertifikats werden ueber die
Umgebungsvariable CADDY_CERT_CN gesteuert (Default: baikal.local).
Eigene Domain/IP setzen, bevor der Container zum ersten Mal hochfaehrt (das
Zertifikat wird nur EINMAL erzeugt — danach daten/caddy_certs loeschen und
neu starten, falls sich der Hostname aendert):
cp .env.example .env
# .env bearbeiten: CADDY_CERT_CN=baikal.meine-domain.de
Start
docker compose up -d --build
Danach ist der Setup-Wizard erreichbar unter:
https://<host-oder-ip>/admin/
Dort einmalig Admin-Zugang, Zeitzone und Datenbank (Standard: SQLite, kein externer DB-Server noetig) einrichten.
CalDAV/CardDAV-URLs (nach Setup)
- CalDAV:
https://<host>/dav.php/calendars/<username>/ - CardDAV:
https://<host>/dav.php/addressbooks/<username>/
Neustart / Update
docker compose pull
docker compose up -d --build
Alle Nutzdaten bleiben in ./daten erhalten, solange dieser Ordner nicht
geloescht wird.
Zertifikat erneuern / Hostname aendern
docker compose down
rm -rf daten/caddy_certs
docker compose up -d --build
Beim naechsten Start wird automatisch ein neues 100-Jahres-Zertifikat mit dem
aktuellen CADDY_CERT_CN erzeugt.