CalDAV and CardDAV Server

Date: Wed, Jan 28, 2015

The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.

Calendars and address books are available for both local and remote access, possibly limited through authentication policies. They can be viewed and edited by calendar and contact clients on mobile phones or computers.

This is my working setup on Linux Debian with the python uwsgi server and Nginx.
I could not get the database to work, so the backend is file based!


apt-get install radicale uwsgi uwsgi-plugin-http uwsgi-plugin-python


request = utf-8
stock = utf-8

type = IMAP
imap_hostname = localhost
imap_port = 143
imap_ssl = False

type = from_file
file = /home/username/radicale/etc/rights

filesystem_folder = /home/username/radicale/collections

config = /home/username/radicale/etc/logging
#debug = True


keys = root

keys = console,file

keys = simple,full

level = DEBUG
handlers = file

class = StreamHandler
level = DEBUG
args = (sys.stdout,)
formatter = simple

class = FileHandler
args = ('/home/username/radicale/radicale.log',)
level = INFO
formatter = full

format = %(message)s

format = %(asctime)s - %(levelname)s: %(message)s


server {
    listen         80;
    rewrite        ^ https://$server_name$request_uri? permanent;

server {
    listen 443;
    root            /home/username/radicale/;
    index           index.html index.htm;
    access_log      /home/username/www/log/radicale-access.log;
    error_log       /home/username/www/log/radicale-error.log;

    ssl on;
    ssl_certificate      /home/username/etc/ssl/;
    ssl_certificate_key  /home/username/etc/ssl/;

    add_header      X-Frame-Options deny;

    gzip_static            on;
    gzip_http_version      1.1;
    gzip_proxied           expired no-cache no-store private auth;
    gzip_disable           "MSIE [1-6]\.";
    gzip_vary              on;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/radicale.sock;


#!/usr/bin/env python

import radicale

application = radicale.Application()


uid = www-data
gid = www-data
socket = /tmp/radicale.sock
plugins = http, python
wsgi-file = /home/username/radicale/radicale.wsgi