Baikal is a lightweight CalDAV/CardDAV server. This image is a ready-to-deploy container with nginx webserver and s6-overlay supervision. https://sabre.io/baikal/
Find a file
2026-08-14 23:58:46 +02:00
.github/workflows increase smoketest timeout + runtime chown volume mounts only 2026-08-05 02:22:05 -04:00
docker increase smoketest timeout + runtime chown volume mounts only 2026-08-05 02:22:05 -04:00
.dockerignore initial commit (claude) 2026-07-01 19:39:02 -04:00
compose.yml tighten up readme 2026-07-01 22:54:21 -04:00
Dockerfile update comments 2026-08-14 23:58:46 +02:00
README.md bump baikal to 0.12.0 and s6 to 3.2.3.2 2026-08-05 01:36:23 -04:00

baikal-alpine

Docker Image CI GHCR Docker Hub Baikal

A single-container image for Baikal (CalDAV/CardDAV server), built on php:8.4-fpm-alpine + nginx, supervised by s6-overlay.

  • Baikal version pinned via BAIKAL_VERSION build arg (default: 0.12.0)
  • PHP extensions: pdo_sqlite, sqlite3, pdo_mysql, mysqli, pdo_pgsql, pgsql, dom, simplexml, xml, curl, mbstring, ctype, iconv, zip, opcache
  • Mail via msmtp (configurable through env vars, see below)
  • nginx + php-fpm both run as the nginx user

Run

Copy compose.yml to the directory of your choice and edit as needed. Then, from that directory:

docker compose up -d

Then open http://localhost:8080/admin/ to run the install wizard.

Persistent data

Two named volumes hold everything that needs to survive:

  • /var/www/baikal/config — baikal.yaml, generated after install
  • /var/www/baikal/Specific — the SQLite db (if you use that backend) and any DAV auth backend, ACL Rules, etc.

Mail configuration

Set one of:

  • Discrete vars: SMTP_HOST, SMTP_PORT (default 587), SMTP_USER, SMTP_PASS, SMTP_FROM, SMTP_TLS (set to off to disable STARTTLS)
  • Or MSMTPRC — full msmtp config file contents, if you need something the discrete vars don't cover.

See docker/cont-init.d/20-msmtp.sh.

Database backend

Defaults to SQLite (zero config, stored in /var/www/baikal/Specific/db). For MySQL/Postgres, uncomment the db service in docker-compose.yml (or point at an existing server) and select it in the Baikal install wizard — the container already has both driver sets installed.

Image tags

Published to both ghcr.io/justadri/baikal-alpine and justadri/baikal-alpine

Tag Meaning
latest The current main
x.y.z (e.g. 0.12.0) Whatever ARG BAIKAL_VERSION in the Dockerfile currently is — moves with main
<short-sha> Pinned to that exact commit, for rollback/debugging

latest and the version tag always point at the same image.

Notes

  • BAIKAL_SKIP_CHOWN=1 skips the ownership fix-up in cont-init.d, if you're managing permissions yourself on the mounted volumes.

Credits

Baikal is the work of Jérôme Schneider fruux, and the Baikal volunteers. Inspired by ckulka with substantial help from Claude