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
- Open
http://your-server-ip:5232in your browser - Log in with the username and password you created
- Click Create new address book or Create new calendar
- Configure your clients to connect (see below)
Client Configuration
The CalDAV/CardDAV URL pattern is:
https://your-domain:5232/user/calendar-name/
iOS / macOS
- Settings → Calendar → Accounts → Add Account → Other → CalDAV
- Server:
your-domain:5232 - Username and password
- Repeat for Contacts → CardDAV
Android (DAVx5)
- Install DAVx5 from F-Droid or Play Store
- Add account with URL:
https://your-domain:5232 - Username and password
- DAVx5 auto-discovers calendars and contacts
Thunderbird
- Calendar → New Calendar → Network → CalDAV
- 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/caldavredirecting to/ - Add Custom Location for
/.well-known/carddavredirecting 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.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments