How to Self-Host Radicale with Docker Compose

What Is Radicale?

Radicale is a lightweight CalDAV and CardDAV server. It syncs your calendars and contacts across all your devices — replacing Google Calendar, iCloud Calendar, Google Contacts, and iCloud Contacts. Radicale is written in Python, stores data as simple files on disk, requires no database, and runs with minimal resources. It works with any CalDAV/CardDAV client: Thunderbird, GNOME Calendar, iOS Calendar/Contacts, macOS Calendar/Contacts, DAVx5 (Android), and more.

Updated March 2026: Verified with latest Docker images and configurations.

Prerequisites

  • A Linux server (Ubuntu 22.04+ recommended)
  • Docker and Docker Compose installed (guide)
  • 64 MB of free RAM
  • 100 MB of free disk space
  • A domain name (strongly recommended — most CalDAV clients require HTTPS)

Docker Compose Configuration

Create a docker-compose.yml file:

services:
  radicale:
    image: tomsquest/docker-radicale:3.6.1.0
    container_name: radicale
    restart: unless-stopped
    ports:
      - "5232:5232"
    volumes:
      - radicale_data:/data
      - ./config:/config:ro
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5232/.well-known/caldav"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  radicale_data:

Create the configuration file at ./config/config:

[server]
hosts = 0.0.0.0:5232

[auth]
type = htpasswd
htpasswd_filename = /data/users
htpasswd_encryption = bcrypt

[storage]
filesystem_folder = /data/collections

[rights]
type = owner_only

Create a user with htpasswd:

mkdir -p config
docker run --rm -it tomsquest/docker-radicale:3.6.1.0 htpasswd -nBC 10 admin

Copy the output line into a users file and mount it, or create it directly:

# Install htpasswd tool on host
apt install apache2-utils  # or: apk add apache2-utils
htpasswd -nBC 10 admin > ./users

Then mount the users file:

volumes:
  - radicale_data:/data
  - ./config:/config:ro
  - ./users:/data/users:ro

Start the stack:

docker compose up -d

Initial Setup

  1. Open http://your-server-ip:5232 in your browser
  2. Log in with the username and password you created
  3. Click Create new address book or Create new calendar
  4. Configure your clients to connect (see below)

Client Configuration

The CalDAV/CardDAV URL pattern is:

https://your-domain:5232/user/calendar-name/

iOS / macOS

  1. Settings → Calendar → Accounts → Add Account → Other → CalDAV
  2. Server: your-domain:5232
  3. Username and password
  4. Repeat for Contacts → CardDAV

Android (DAVx5)

  1. Install DAVx5 from F-Droid or Play Store
  2. Add account with URL: https://your-domain:5232
  3. Username and password
  4. DAVx5 auto-discovers calendars and contacts

Thunderbird

  1. Calendar → New Calendar → Network → CalDAV
  2. Location: https://your-domain:5232/user/calendar-name/

Configuration

Multiple Users

Create additional users:

htpasswd -BC 10 ./users newuser
docker compose restart radicale

Each user’s calendars and contacts are isolated by default (with rights = owner_only).

Shared Calendars

To allow calendar sharing between users, change the rights configuration:

[rights]
type = from_file
file = /config/rights

Create ./config/rights:

# Allow read access to shared calendar
[shared-calendar-read]
user: .*
collection: shared/.*
permissions: rR

# Allow admin full access everywhere
[admin-full]
user: admin
collection: .*
permissions: RrWw

Auto-Discovery

For automatic client discovery, configure your reverse proxy to handle .well-known URLs:

/.well-known/caldav  → redirect to /
/.well-known/carddav → redirect to /

This allows clients to find the CalDAV/CardDAV server using just the domain name.

Reverse Proxy

HTTPS is required for most CalDAV/CardDAV clients. Set up a reverse proxy with SSL:

Nginx Proxy Manager config:

  • Scheme: http
  • Forward Hostname: radicale
  • Forward Port: 5232
  • Add Custom Location for /.well-known/caldav redirecting to /
  • Add Custom Location for /.well-known/carddav redirecting to /

See Reverse Proxy Setup for full configuration.

Backup

Radicale stores everything as files — no database to dump:

docker run --rm -v radicale_data:/data -v $(pwd):/backup alpine \
  tar czf /backup/radicale-backup-$(date +%Y%m%d).tar.gz /data

This backs up all calendars, contacts, and user configuration.

See Backup Strategy for a complete backup approach.

Troubleshooting

Client Says “Server Not Found” or “SSL Error”

Symptom: CalDAV clients can’t connect, report SSL or connection errors. Fix: Most clients require HTTPS. Set up a reverse proxy with SSL. Radicale itself doesn’t handle TLS — it relies on the proxy.

Calendar Events Not Syncing

Symptom: Events created on one device don’t appear on another. Fix: Check that both devices use the same CalDAV URL pointing to the same calendar. In DAVx5, force a sync. Verify Radicale logs:

docker compose logs radicale

403 Forbidden When Creating Calendar

Symptom: Client gets 403 when trying to create a new calendar or address book. Fix: Check the rights configuration. With owner_only, users can only create collections under their own username path (e.g., /admin/my-calendar/).

iOS/macOS Shows “Account Error”

Symptom: Apple devices show persistent “cannot verify account” errors. Fix: Ensure .well-known redirects are configured. Apple clients are strict about CalDAV discovery. Also verify your SSL certificate is valid (not self-signed) — Apple rejects self-signed certs.

Resource Requirements

  • RAM: ~30-50 MB
  • CPU: Negligible
  • Disk: ~10 MB for the application, contacts and calendars are tiny (kilobytes per entry)

Frequently Asked Questions

Is Radicale free?

Yes. Radicale is fully open source under the GPL-3.0 license. No paid version, no restrictions.

Does Radicale have a web interface for managing calendars?

Radicale has a minimal web UI for creating and deleting calendars and address books, but not for viewing or editing events. You manage events through CalDAV clients — your phone’s calendar app, Thunderbird, GNOME Calendar, etc. Radicale is a sync server, not a calendar application.

Can I use Radicale with Google Calendar or Apple Calendar simultaneously?

Yes. You can add Radicale as an additional CalDAV account alongside Google or iCloud on any device. Events on each service stay separate — Radicale doesn’t sync with Google or Apple, it’s an independent CalDAV server.

How does Radicale compare to Baikal?

Both are CalDAV/CardDAV servers. Radicale is lighter — no database, file-based storage, ~30 MB RAM. Baikal uses SQLite or MySQL, has a more polished web admin UI, and handles larger deployments better. For a single user or small household, Radicale is simpler. For 10+ users or if you want a proper admin interface, Baikal is the better choice.

Can Radicale sync with Android?

Yes, through DAVx5 (available on F-Droid and Google Play). DAVx5 provides CalDAV/CardDAV sync on Android and auto-discovers calendars and contacts from your Radicale server. It works with any Android calendar and contacts app.

How many users can Radicale handle?

Radicale handles dozens of users easily — it’s limited by file I/O rather than CPU or RAM. For 50+ concurrent users, consider Baikal with PostgreSQL instead. For typical household or small team use (2-10 users), Radicale is more than sufficient.

Does Radicale support recurring events?

Yes. Recurring events are a CalDAV feature handled by the client, not the server. Your calendar app creates the recurrence rule in the iCalendar format, and Radicale stores and syncs it correctly across all connected devices.

Verdict

Radicale is the best lightweight CalDAV/CardDAV server. It does exactly one thing: sync calendars and contacts across devices. No web UI for managing events (use your native calendar app), no database, no complexity. If you want a web-based calendar interface, look at Baikal (still CalDAV, but with a nicer web admin) or pair Radicale with a web calendar client. For pure sync with minimal resource usage, Radicale is unbeatable.

Comments