Radicale, une alternative à google Calendar

Et si pour se dégoogliser on commmencé par l'agenda ...?

Pourquoi Radicale

Se passer de Gmail moi ça fait plus d'un an que j'essaye mais franchement c'est dur. À l'occasion d'un changement de téléphone je suis tombé sur le projet Radicale. Mon but était juste de partager des contacts mais Radicale semblait tellement simple que j'ai voulu tenter l'expérience de la dégooglisation de mon agenda.

Ce qui m'a convaincu c'est ça:

$ python3 -m pip install --upgrade radicale
$ python3 -m radicale --config "" --storage-filesystem-folder=~/.var/lib/radicale/collections

Donc en gros Radicale nécsessite juste un module python et un fichier de configuration. Profitons de cette simplicité pour mettre en oeuvre nos connaissances Ansible et créer un rôle Radicale.

Rôles Ansible Radicale

Avant de démarrer la création d'un rôle faisons la liste des tâches à réaliser.

Pour installer Radicale il nous faut:

Htpasswd: Création du mot de passe d'accès

htpasswd est un outil fourni par Apache pour gérer l'authentification de base par fichier d'utilisateur.

Radicale prend en charge ce mode de sécurisation. Pour l'activer il faut ajouter dans le fichier de configuration l'option suivante:

[auth]
type = htpasswd

Et pour générer un fichier contenant un utilisateur et un mot de passe on lance la commande:

htpasswd -c passwdfile user_name

Certificat

Voici les divers étapes qui m'ont permis d'obtenir un certificat:

openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Configuration Radicale

Voici la configuration que j'ai mis en place. Pas de commentaire particulier. Pour en savoir plus référez vous à la documentation.

[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/passwdfile
# encryption method used in the htpasswd file
htpasswd_encryption = md5
# Average delay after failed login attempts in seconds
delay = 1

[server]
hosts = 0.0.0.0:5232
ssl = True
protocol = PROTOCOL_TLS
ciphers = AES256-SHA
certificate = /etc/ssl/radicale.cert.pem
key = /etc/ssl/radicale.key.pem
max_connections = 5
# 10 Megabyte
max_content_length = 10000000
# 30 seconds
timeout = 30

[encoding]
request = utf-8
stock = utf-8

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

Création du rôle Radicale

Dans l'article sur ansible nous avons aborder la création d'un rôle. Vous pouvez reproduire manuellement l'arborescence d'un rôle ou télécharger le projet radicale sur mon compte bitbucket.

On obtient l'arboresence suivante:

.
├── inventaire
│   ├── file
│   │   ├── passwdfile
│   │   ├── server.crt
│   │   ├── server.csr
│   │   ├── server.key
│   │   └── server.key.org
│   └── host
├── playbook.yml
└── roles
    └─ radicale
       ├── tasks
       │   └── main.yml
       └── template
           ├── config.j2
           ├── logging.j2
           └── radicale.service.j2

Le fichier main.yml contient les tâches à réaliser. Pas de commentaire sur ce fichier qui est évident à comprendre. Il faut juste l'adapter à votre configuration personnelle:

- name: Install python3
  become: true
  apt: name=python3 update_cache=yes

- name: Intall pip
  become: true
  apt: name=python3-pip update_cache=no

- name: Install Radicale
  become: true
  pip:
    name: radicale[bcrypt]
    executable: pip3

- name: Creation user/group Radicale
  become: true
  user:
    name: radicale
    system: true
    shell: /sbin/nologin
    createhome: no

- name: Creates conf directory
  become: true
  file:
    path: /etc/radicale
    state: directory
    owner: root
    group: root
    mode: 0755

- name: Copy du fichier passwd
  become: true
  copy: src="inventaire/file/passwdfile"  dest="/etc/radicale/passwdfile"

- name: Copie de la cles SSL
  become: true
  copy: src="inventaire/file/pasgrave.key" dest="/etc/ssl/radicale.key.pem"

- name: Copie du certificats SSL
  become: true
  copy: src="inventaire/file/pasgrave.crt" dest="/etc/ssl/radicale.cert.pem"

- name: Creation du fichier de configuration
  become: true
  template: src=template/config.j2 dest=/etc/radicale/config

- name: Creation du fichier de logging
  become: true
  template: src=template/logging.j2 dest=/etc/radicale/logging

- name: creation dossier storage + droit
  become: true
  file:
    path: /var/lib/radicale/collections
    state: directory
    owner: radicale
    group: radicale
    # The storage should not be readable by others.
    mode: 0750

- name: Creation du service
  become: true
  template: src=template/radicale.service.j2 dest=/etc/systemd/system/radicale.service

- name: Start service
  become: true
  service:
    name: radicale
    enabled: true
    state: restarted

Playbook Radicale

Il ne reste plus qu'à ajouter le rôle radicale dans un playbook:

---
- name: Installation Radicale
  hosts: CardDav
  remote_user: user
  roles:
    - radicale

...

Lancer le playbook et ...

page de login

Voila l'interface de gestion de Radicale diponible en à l'url https://hostname:5232/

La suite

Dans l'article sur l'utilisation de radicale nous verrons comment partager un agenda avec Linux et IOS.

Sources

Notes divers

Ansible fourni un module pour la gestion de l'authentification htpasswd mais je suis peut être tombé sur un bug dans ce module.