Deploy Radicale

Calendar, task and contact server that syncs to your phone and laptop

Deploy Radicale

Just deployed

/data

Deploy and Host Radicale on Railway

Radicale is a small CalDAV and CardDAV server that holds your calendars, to-do lists and contacts and syncs them to every device you own. It speaks the open standards Apple Calendar, Thunderbird, DAVx⁵ and Evolution already use, so nothing needs a plugin — add an account, point it at a URL, and your appointments live on infrastructure you control. It stores each calendar as ordinary iCalendar and vCard files and needs no database, which makes it the usual answer for scheduling without a groupware suite attached.

Deploy Radicale on Railway and this template gives you a working server rather than a blank one. A single radicale service runs the upstream ghcr.io/kozea/radicale:stable image behind a wrapper that writes Radicale's configuration and password file from the variables you fill in, so there is nothing to upload and no shell to log into. A volume at /data holds every collection, and CalDAV, CardDAV and the browser interface all answer on one public HTTPS domain.

Radicale service and its data volume on Railway

Getting Started with Radicale on Railway

Set RADICALE_ADMIN_USERNAME and RADICALE_ADMIN_PASSWORD before you deploy — there are no default credentials, and the container refuses to start without a password rather than expose an open server. Once it is live, open https:///.web/ and sign in. The first authenticated request creates your storage and seeds a Personal Calendar and Personal Address Book, so the screen is not empty.

The green + button creates a collection: pick a type, give it a URL fragment, title, description and colour, and it appears as a card with a copyable address. That address goes into your client. On Android, DAVx⁵ takes the base URL https:/// with your credentials and finds every collection itself; on macOS and iOS, add a CalDAV account with the same address. Thunderbird takes a single collection URL under New Calendar → On the Network.

To confirm it works, create an event on your phone and reload the web interface — the item count rises within a sync cycle. To add people, put their logins in RADICALE_EXTRA_USERS as comma-separated user:password pairs; each gets private storage on first sign-in, and owner_only keeps them out of each other's calendars.

Radicale collections screen listing five calendars and address books Creating a Travel Calendar collection in Radicale Editing the Work Calendar title, description and colour

About Hosting Radicale

Most calendar hosting comes bundled with something much larger. A groupware suite gives you calendars alongside files, chat and mail, and charges you in memory and maintenance for all of it. Radicale implements CalDAV (RFC 4791) and CardDAV (RFC 6352) well enough that standard clients treat it as any other server, and does nothing else.

  • CalDAV and CardDAV in one server — events, journals, tasks and contacts, with the calendar-query reports clients depend on
  • Plain-file storage — every item is an .ics or .vcf file, so a backup is a copy and a restore is a copy back
  • Per-user isolationowner_only rights give each account its own namespace
  • Built-in web interface — create, rename, recolour, upload and delete collections from a browser
  • Optional git history — each change is committed, so a deleted calendar leaves an undo trail
  • htpasswd authentication — bcrypt credentials, plus LDAP, IMAP, PAM, Dovecot and OAuth2 backends

The architecture is deliberately flat. The radicale service is the whole application: it terminates client requests, authenticates them against a password file rebuilt on each boot from your variables, and reads and writes collection files on the volume. No database, no object storage.

Why Deploy Radicale on Railway

Railway removes the parts of self-hosting that have nothing to do with calendars:

  • HTTPS and a public domain are provisioned for you — CalDAV clients refuse plaintext
  • The volume is managed and survives every redeploy
  • Configuration is variables, not a file you SSH in to edit
  • Usage-based pricing suits a service that idles almost all day

Common Use Cases

  • Replacing Google Calendar and Contacts for a person or household, keeping phones and laptops in sync with no data broker in between
  • A small team's shared scheduling — separate logins, one server, no seat licence
  • Backing an automation that writes appointments over CalDAV: booking systems, on-call rotations, release schedules
  • Contact storage for a CRM or mail client that speaks CardDAV but has nowhere to put contacts

Dependencies for Radicale

  • ghcr.io/kozea/radicale:stable — the upstream image, currently Radicale 3.8.0. latest there is the nightly master build; stable tracks tagged releases
  • Source repository: https://github.com/gridalpha/radicale-railway — adds the boot-time configuration renderer and health endpoint
  • A volume mounted at /data, holding collections/

Environment Variables Reference

VariableDefaultPurpose
RADICALE_ADMIN_USERNAMEadminLogin for the first account
RADICALE_ADMIN_PASSWORDPassword for it; required
RADICALE_EXTRA_USERSemptyMore logins as user:password, comma separated
RADICALE_RIGHTS_TYPEowner_onlyowner_only, owner_write, authenticated or from_file
RADICALE_GIT_VERSIONINGtrueCommit every change to a git repository in the collections folder
RADICALE_HTPASSWD_ENCRYPTIONbcryptHash used in the password file
RADICALE_MAX_CONNECTIONS32Parallel connections accepted
RADICALE_LOG_LEVELinfodebug, info, notice, warning, error

Accounts are rebuilt from these variables on every boot, so a password change is a variable edit. Removing a login removes access but leaves its collections on the volume.

Deployment Dependencies

  • Source and documentation: https://github.com/Kozea/Radicale
  • Configuration reference: https://radicale.org/v3.html
  • Container image: https://github.com/Kozea/Radicale/pkgs/container/radicale

Hardware Requirements for Self-Hosting Radicale

ResourceMinimumRecommended
CPU0.1 vCPU0.5 vCPU
RAM128 MB512 MB
Storage1 GB volume5 GB volume
RuntimePython 3.9+Python 3.12+

Calendar data is tiny — a decade of household appointments is single-digit megabytes. Size the volume for attachments and history.

Self-Hosting Radicale Elsewhere

Radicale installs from PyPI. This runs it on port 5232 with bcrypt passwords:

pip install "radicale[bcrypt]"
htpasswd -B -c /etc/radicale/users alice
python3 -m radicale --config /etc/radicale/config

A minimal configuration file, at /etc/radicale/config:

[server]
hosts = 0.0.0.0:5232, [::]:5232

[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt

[storage]
filesystem_folder = /var/lib/radicale/collections

Running it yourself also means a TLS certificate, a reverse proxy and a backup job, since CalDAV clients will not send credentials over plain HTTP.

Is Radicale Free?

Radicale is free and open-source under the GPLv3, with no paid tier, licence key or seat limit — create as many accounts and calendars as your storage allows. The only cost of running it on Railway is infrastructure: a low-CPU container and a small volume, billed by usage.

FAQ

What is Radicale? An open-source CalDAV and CardDAV server. It stores calendars, tasks and contacts as standard files and serves them to any client that speaks those protocols — Apple Calendar, Thunderbird, DAVx⁵, Evolution.

What does this Railway template deploy? One radicale service running the official image, with a volume at /data for collections and a public HTTPS domain. The first account comes from the username and password you supply, and each account starts with a calendar and address book already made.

Why is there no database in this template? Radicale's storage backend is the filesystem — each event is an .ics file, each contact a .vcf. A database would serve no purpose, so the volume is the only persistence layer and a backup is a folder copy.

How do I connect my iPhone or Android phone to a self-hosted Radicale server? On iOS, add a CalDAV account under Settings with the server address https:/// and your credentials; contacts use a CardDAV account with the same values. Android's DAVx⁵ takes that base URL and finds every collection.

Can several people share one Radicale deployment? Yes. Put extra logins in RADICALE_EXTRA_USERS as comma-separated user:password pairs. With owner_only permissions each sees only its own collections; set RADICALE_RIGHTS_TYPE to authenticated to share one pool.

How do I recover a calendar a client deleted by accident? Leave RADICALE_GIT_VERSIONING at true. Every change is committed to a git repository inside the collections folder, so deleted items stay in the history.

Does Radicale support recurring events and shared tasks? Yes. It handles VEVENT, VTODO and VJOURNAL components including recurrence rules, and answers the calendar-query and free-busy reports clients use to expand them, with limits that stop a malformed rule exhausting it.


Template Content

More templates in this category

View Template
Rocky Linux
Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
47
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51