Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database.
  • Dockerfile 69.3%
  • Shell 30.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Hermes 9b6b792ed4
Some checks failed
Debug Auth / debug (push) Failing after 4s
Build and Push / build (push) Failing after 4s
fix: use TCP for php-fpm (not unix socket), remove socket wait from entrypoint
2026-06-14 16:47:59 -04:00
.forgejo/workflows debug: fix python inline approach for auth 2026-06-14 16:21:24 -04:00
.dockerignore ci: retry with user-configured secrets 2026-06-14 15:49:23 -04:00
docker-compose.yml Update workflow: push to srstone/dkr-baikal; fix compose image ref 2026-06-13 23:43:38 -04:00
docker-entrypoint.sh fix: use TCP for php-fpm (not unix socket), remove socket wait from entrypoint 2026-06-14 16:47:59 -04:00
Dockerfile fix: use TCP for php-fpm (not unix socket), remove socket wait from entrypoint 2026-06-14 16:47:59 -04:00
nginx.conf fix: use TCP for php-fpm (not unix socket), remove socket wait from entrypoint 2026-06-14 16:47:59 -04:00
README.md Update workflow: push to srstone/dkr-baikal; fix compose image ref 2026-06-13 23:43:38 -04:00

Baïkal Docker

Baïkal is a lightweight CalDAV + CardDAV server. This repository builds a Docker image with nginx + PHP 8.3 + SQLite and optionally pushes it to Docker Hub as srstone/dkr-baikal via Forgejo Actions.

Quick Start

docker compose up -d

Then visit http://<host>/ and follow the web installer.

Using SQLite (default)

The built-in SQLite backend requires zero setup — just complete the web installer and select SQLite as the database type.

Using MySQL / PostgreSQL

The image includes pdo_mysql and pdo_pgsql extensions. Create a separate database container and point Baikal at it in the web installer.

Persistent Volumes

Volume Path Contents
baikal-config /var/www/baikal/config config.yaml + environment-specific config
baikal-data /var/www/baikal/Specific SQLite database, calendars, address books

Both volumes must be backed up regularly.

Traefik Reverse Proxy

Uncomment the labels and networks sections in docker-compose.yml, then:

docker compose up -d

Update the Host() rule to your domain.

Forgejo Actions CI

1. Register a runner

On the machine that will run builds (e.g. ChinPi5):

docker run -d \
  --name act_runner \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v act_unner_data:/data \
  -e CONFIG_FILE=/data/config.yaml \
  code.forgejo.org/forgejo/act_runner:latest \
  forgejo-runner register \
    --instance https://git.chin.cloud \
    --token <REGISTRATION_TOKEN> \
    --name chinpi5-runner \
    --labels "ubuntu-latest:docker://node:20-bookworm,ubuntu-22.04:docker://node:20-bookworm"

Get the registration token from: Forgejo Admin → Site Administration → Actions → Runners → Create Registration Token

After registration, restart the container so it starts polling:

docker restart act_runner

2. Add Docker Hub secrets

In your Forgejo repository: Settings → Actions → Secrets

Secret Value
DOCKER_USERNAME Your Docker Hub username
DOCKER_PASSWORD A Docker Hub Access Token (Account Settings → Security → Access Tokens)

3. Create the Docker Hub repository

Create a public repository on Docker Hub named baikal so the CI push doesn't fail on first run.

4. Push to trigger

git push origin main

The runner will pick up the job, build linux/amd64 and linux/arm64 images, and push them to Docker Hub.

File Layout

.
├── Dockerfile               # Multi-stage build
├── docker-compose.yml       # Compose with optional Traefik labels
├── docker-entrypoint.sh     # Boots php-fpm, exec's nginx
├── nginx.conf               # nginx site config
├── .dockerignore
├── .forgejo/workflows/
│   └── docker-build.yml     # CI pipeline
└── README.md