Sign inSign up

bfren/baikal

By bfren

•Updated 39 minutes ago

Image
0

10K+

bfren/baikal repository overview

⁠Baïkal

GitHub release (latest by date) Docker Pulls Docker Image Size GitHub Workflow Status

Docker Hub⁠ - Quay.io⁠ - bfren ecosystem⁠

⁠Introduction

Baïkal⁠ - a lightweight CalDAV and CardDAV server for your own calendars and contacts.

It is Nginx + PHP⁠ with:

  • Baïkal 0.12.1 installed, read-only, outside your volumes - so upgrading means pulling a new image
  • the PHP extensions Baïkal requires and recommends, including SQLite, MySQL and PostgreSQL drivers
  • nginx set up for Baïkal's dav.php, including the /.well-known/caldav and /.well-known/carddav redirects clients use to find it

It 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.

⁠Quickstart

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).

⁠Features

  • 📅 CalDAV and CardDAV, with Baïkal's web admin area
  • 🗄️ SQLite, MySQL or PostgreSQL
  • 🔍 /.well-known redirects, so most clients only need your domain name
  • 🐘 PHP 8.2, 8.3, 8.4 and 8.5 - choose with the image tag
  • 🗜️ Everything from Nginx + PHP⁠: PHP-FPM, OPcache, compression, logs and a health check

⁠Tags

Images 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.

TagExampleUse when
phpX.Yphp8.4You want the latest image for a PHP version
phpX.Y-MAJORphp8.4-2You want updates, but not breaking changes
phpX.Y-MINORphp8.4-2.0You want fixes only - recommended
phpX.Y-VERSIONphp8.4-2.0.0You want to pin this image exactly
phpX.Y-baikalA.Bphp8.4-baikal0.12You want to stay on a Baïkal minor version
phpX.Y-baikalA.B.Cphp8.4-baikal0.12.1You want an exact Baïkal release
…-VERSION versions of bothphp8.4-baikal0.12.1-2.0.0You want to pin both
phpX.Y.Zphp8.4.26You want an exact PHP release
baikalA.B.C, …-VERSIONbaikal0.12.1You want a Baïkal release, on PHP 8.4

There is no latest tag. See Nginx + PHP⁠ for PHP support dates.

⁠Configuration

⁠Ports
PortPurpose
80HTTP - put a reverse proxy in front of it for SSL.
⁠Volumes
VolumePurpose
/configBaïkal's configuration (baikal.yaml), written by the set-up wizard.
/dataBaï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.

⁠Environment Variables
VariableValuesDescriptionDefault
BF_BAIKAL_CONFIG_DpathBaïkal's configuration folder - set by the image. Must end with /./config/
BF_BAIKAL_DATA_DpathBaï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.

⁠How It Works

When the container starts, Nginx + PHP⁠ sets up nginx and PHP, then this image:

  1. serves Baïkal's html folder instead of /www/public
  2. passes the two folder paths to PHP, so Baïkal keeps its configuration and data in /config and /data
  3. creates /data/db if it doesn't exist, and sets /config and /data to be owned by the www user
⁠Upgrading from older versions

Older 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.

⁠Testing

./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.

⁠Troubleshooting

⁠My phone or computer can't find the server

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.

⁠The container stops at start-up with "Legacy setup detected"

See Upgrading from older versions⁠.

⁠FAQs

⁠Which database should I use?

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.

⁠How do I upgrade Baïkal?

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.

⁠Licence

Copyright (c) 2026 bfren⁠ (unless otherwise stated)

Tag summary

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