Radicale Setup

2025-09-10 · 8 min read

Quitting Google is hard. radicale

I'd like to retire my Proxmox machine and use it only to host nfs shares, so I need to shutdown Proxmox and recreate my nfs shares on another machine, or on a clean reinstall of debian.

To do that, I need to turn off the Nextcloud container, the last running container on my Proxmox host, which requires the decommission of my Nextcloud calendar. I've already setup Syncthing to handle all the casual file sync tasks I previously relegated to Nextcloud, but since moving my calendar off Google, I've been relying on Nextcloud's Calendar plugin/extension, which worked well. And to get the calendar exported from Nextcloud Calendar, I must set up an alternative caldav server to host this calendar, export the calendar from Nextcloud, and set up sync with DavX5 on my phone. I've chosen Radicale, which seems to be the de facto choice for self-hosting caldav calendars.

It blows my mind how difficult calendars are. And surprisingly complex in the background. I realize that the bulk of calendar complexity is supporting collaboration, but holy smokes, a better approach than caldav sync is surely warranted by now...

Google doesn't make it easy to leave. There are so many quality-of-life integrations in a Google account that take care of a LOT of stuff for you: file sync, calendar, contacts, email, all integrated more or less seamlessly. Credit to Google's engineers (maybe those engineers from 15 years ago before Google stopped caring about the end user), but these apps and services all work really well together.

It's been quite a tough job setting up and integrating these services, getting them to work well on my phone, having some reasonable access to them in a browser and generally having a "normal" experience with these things we take for granted and that just work with a Google account.

The Setup

Radicale can be installed with python pip, but recent python pip implementations require a virtual install invironment and don't want you to blindly run pip install as root (and rightly so). To save myself some pip madness, I've opted for a docker instance.

  1. Set up docker compose, see my other post for that.
  2. Within the docker app directory and after pulling the docker-compose.yml, create a directory called config and touch two files in this directory: config and users.
  3. Edit the docker-compose.yml to reflect listening ports and path:
    ports:
#- 127.0.0.1:5232:5232
- 0.0.0.0:5232:5232
    volumes:
- ./data:/data
- ./config:/config:ro
  1. Make sure the config/config file contains the following options:
[server]
hosts = 0.0.0.0:5232

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

[storage]
filesystem_folder = /data/collections

If you pulled the example config file from the radicale how-to, just find and modify these entries. Basically, you want the storage path and users file to be valid. Note I don't know if the directive to listen on all interfaces is effectively interpreted from the docker-compose.yml or from the config/config. If you know this, please email me and let me know.

  1. We now need to get a user and password into the users file for htaccess to read. However, since we've chosen bcrypt as the hashing method, we can't rely on openssl passwd which doesn't support bcrypt. So we need to install apache2-utils:
apt install apache2-utils

Now create a user:bcrypt-hash piped into the config/users file:

htpasswd -nbBC 10 username PASSWORD > config/users 

You should see something like the following in your config/users:

username:$2y$10$gREHxzZR7a8KOz60rpqJNeV06KUQKC18ZU3gAVwzzlGtRSa3.Tmr6
  1. Restart the docker instance.

  2. Check that you can sign in at your ip:5232 with the user/password combo you used in step 5: radicale signin

  3. Once signed in, create a new collection.

  4. Use the url/password setup on DavX5 to connect to Radicale and sync your calendar.

*
Jules