Docker Hub - Quay.io - bfren ecosystem
Baïkal - a lightweight CalDAV and CardDAV server for your own calendars and contacts.
It is Nginx + PHP with:
dav.php, including the /.well-known/caldav and /.well-known/carddav redirects clients use to find itIt is designed to run behind a reverse proxy that handles SSL, such as Caddy Proxy - CalDAV and CardDAV clients send passwords, so always use HTTPS.
services:
baikal:
image: quay.io/bfren/baikal:php8.4-2.0
ports:
- "8080:80"
volumes:
- ./v/config:/config
- ./v/data:/data
Open http://localhost:8080 and follow Baïkal's set-up wizard: choose a time zone and admin password, then the database (SQLite is simplest, and is stored in /data/db). Then add users in the admin area, and point your calendar and contacts apps at https://<your-domain>/dav.php (most will also find it from just the domain).
/.well-known redirects, so most clients only need your domain nameImages are published to Docker Hub (bfren/baikal) and Quay.io (quay.io/bfren/baikal) for linux/amd64, linux/arm/v7 and linux/arm64. Tags start with the PHP version, and can include the Baïkal version.
| Tag | Example | Use when |
|---|---|---|
phpX.Y | php8.4 | You want the latest image for a PHP version |
phpX.Y-MAJOR | php8.4-2 | You want updates, but not breaking changes |
phpX.Y-MINOR | php8.4-2.0 | You want fixes only - recommended |
phpX.Y-VERSION | php8.4-2.0.0 | You want to pin this image exactly |
phpX.Y-baikalA.B | php8.4-baikal0.12 | You want to stay on a Baïkal minor version |
phpX.Y-baikalA.B.C | php8.4-baikal0.12.1 | You want an exact Baïkal release |
…-VERSION versions of both | php8.4-baikal0.12.1-2.0.0 | You want to pin both |
phpX.Y.Z | php8.4.26 | You want an exact PHP release |
baikalA.B.C, …-VERSION | baikal0.12.1 | You want a Baïkal release, on PHP 8.4 |
There is no latest tag. See Nginx + PHP for PHP support dates.
| Port | Purpose |
|---|---|
80 | HTTP - put a reverse proxy in front of it for SSL. |
| Volume | Purpose |
|---|---|
/config | Baïkal's configuration (baikal.yaml), written by the set-up wizard. |
/data | Baïkal's data - including the SQLite database in /data/db, if you use it. |
Back up both. Baïkal itself is part of the image, so it isn't in either volume.
| Variable | Values | Description | Default |
|---|---|---|---|
BF_BAIKAL_CONFIG_D | path | Baïkal's configuration folder - set by the image. Must end with /. | /config/ |
BF_BAIKAL_DATA_D | path | Baïkal's data folder - set by the image. Must end with /. | /data/ |
Nginx + PHP adds the PHP settings (php.ini overrides, extensions), and Nginx the nginx ones.
When the container starts, Nginx + PHP sets up nginx and PHP, then this image:
html folder instead of /www/public/config and /data/data/db if it doesn't exist, and sets /config and /data to be owned by the www userOlder versions of this image kept Baïkal's data in /specific. If /specific/db has anything in it, the container stops with a message: move the db folder to /data, update sqlite_file in /config/baikal.yaml, and start the container again.
./test.nu # builds the PHP 8.5 image and runs /test
./test.nu 8.2 # the same for PHP 8.2
./test.nu --all # every version, in parallel
./run.sh # builds the PHP 8.5 image and opens a shell (port 3000, local only)
/test runs this image's tests alongside the base images' tests, and fails if tests don't execute. They check that Baïkal is installed read-only and matches the version in the build log, the database and other required PHP extensions are loaded, the /.well-known redirects are configured, and nginx accepts the configuration.
Most clients find Baïkal from the domain alone, using /.well-known/caldav and /.well-known/carddav. If yours doesn't, give it the full address: https://<your-domain>/dav.php. Check your proxy passes the /.well-known paths through.
See Upgrading from older versions.
SQLite, unless you already run MySQL or PostgreSQL - it needs no other container, and is stored in /data/db, so backing up /data backs it up too.
Baïkal is part of the image, so pull a newer tag and recreate the container. Back up /config and /data first - your settings and data are only in those volumes.
Copyright (c) 2026 bfren (unless otherwise stated)
Content type
Image
Digest
sha256:b2dd29350…
Size
40.8 MB
Last updated
39 minutes ago
docker pull bfren/baikal:baikal0.12.1-2.0.2