Radicale: Tu propio gestor de contactos, calendarios y tareas

Haz tu día a día un poco más privado. Pásate a Radicale y sé dueño de tu agenda.

Radicale: Tu propio gestor de contactos, calendarios y tareas

Hoy vengo a hablar de un nuevo servicio que estoy probando en mi red. Todo comenzó cuando empecé a hacer uso de las aplicaciones para gestionar tareas, tipo Google Tasks, Microsoft To-Do, la ya desaparecida Wunderlist...

Por otro lado, estoy intentando desligarme un poco de los servicios de Google y tenerlos todos auto alojados. Decidí empezar por un servidor de tareas sencillo y que me sirviera para el día a día. Y así fue como descubrí a Radicale. Entre los motivos por los que me decanté por él frente a otras opciones, están:

  • Permite tener toda la comunicación entre cliente y servidor cifrada
  • Puedo usarlo a nivel local o abrirlo al exterior
  • Extremadamente ligero, rápido y desarrollado en Python
  • No usa una base de datos como tal, con lo que migrarlo a otra plataforma es muy sencillo
  • Software libre
  • Permite crear tantos usuarios como queramos. En principio, lo estoy probando conmigo mismo, pero si va bien, lo intentaré extender a toda la familia
  • Soporta los estándares CardDav y CalDav, con lo que puede ser usado prácticamente desde cualquier SO
  • Extensible mediante plugins

Por estas y algunas razones más, decidí ponerlo a prueba un tiempo. Actualmente, se ha convertido en mi gestor de tareas principal y lo estoy sometiendo a pruebas para convertirlo en el gestor de contactos y calendario principal.

Instalación de Radicale

Para instalar Radicale, podemos optar por 2 vías: instalarlo en nuestro sistema o hacer uso de una imagen Docker.

Instalación en el sistema

Para el primer caso, nos bastará con ejecutar las órdenes (necesitaremos tener Python 3.x instalado previamente):

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

Y tan sólo tendremos que entrar a http://localhost:5232 para poder acceder a su web de configuración. Así de sencillo. Si queremos personalizarlo un poco, podemos basarnos en su tutorial de configuración básica. Lo veremos con más detalle más adelante.

Si queremos registrarlo como servicio, en función de nuestro SO podemos seguir uno de los ejemplos de la guía oficial.

Instalación mediante Docker

Si queremos instalarlo mediante una imagen Docker y aprovechar el ecosistema que estamos desplegando con entradas previas del blog, volveremos a echar mano de nuestro amigo docker-compose:

version: '3'

services:
  radicale:
    image: parrazam/radicale-with-infcloud:latest
    container_name: radicale
    restart: unless-stopped
    networks:
      - public
    volumes:
      - ./data:/data
      - ./config:/config:ro
    environment:
      - UID=1000
      - GID=1000
    labels:
      - "traefik.enable=true"
      - "traefik.port=5232"
      - "traefik.docker.network=public"
      - "traefik.http.routers.radicale.entrypoints=https"
      - "traefik.http.routers.radicale.rule=Host(`radicale.midomin.io`)"
      - "traefik.http.routers.radicale.tls=true"
      - "traefik.http.routers.radicale.tls.certresolver=certlocal"
      - "traefik.http.services.radicale.loadbalancer.server.port=5232"

networks:
  public:
    external: true
En la imagen Docker que especifico en esta entrada, estoy usando una propia creada a partir de la imagen sencilla de tomsquest/docker-radicale, y le añado la interfaz web InfCloud, de manera que podamos acceder a nuestro calendario desde cualquier sitio haciendo uso del navegador (por si no tenemos nuestras aplicaciones favoritas a mano). Prometo mantenerla actualizada, ¡con lo que sentíos libres de utilizarla!

La imagen que estoy usando la tenéis para varias arquitecturas (386, amd64 y arm[v7/64]. Podéis ver el detalle, versiones y enlaces en: https://hub.docker.com/repository/docker/parrazam/radicale-with-infcloud/

Como comenté antes, no hace uso de base de datos alguna, por lo que bastará con que creemos dos directorios, uno para la configuración y otro para que guarde los datos. Además, para evitar problemas de permisos o de seguridad, podemos ejecutar el servicio con el UID/GID de nuestro usuario (o el que prefiramos).

De nuevo, basta con ejecutar docker-compose up -d y acceder a https://radicale.midomin.io para poder ver la interfaz web donde podremos crear los calendarios y agendas que precisemos.

Configuración de Radicale

Una vez tenemos instalado Radicale, vamos a pasar a configurarlo. Si optamos por la primera opción, la instalación en el sistema, cuando arranquemos Radicale éste intentará buscar la configuración bajo las rutas /etc/radicale/config y ~/.config/radicale/config por defecto (salvo que le especifiquemos una mediante el parámetro --config o la variable de entorno RADICALE_CONFIG).

Podemos incluso especificar varios ficheros de configuración separándolos por : o ; si estamos bajo Windows. Incluso podemos definir configuraciones opcionales si la ruta la iniciamos con ?.

En el caso de Docker, dicha configuración la almacenaremos en un fichero config dentro de la carpeta config, como podéis ver en el fichero YML del paso anterior.

Autenticación

Lo primero que haremos, será definir el usuario (o los usuarios) que queremos dar de alta. Para ello, crearemos un fichero llamado users, que contendrá los usuarios y sus contraseñas encriptadas. Mediante el comando htpasswd podemos generar dicho fichero (con la opción -c):

# Creamos un nuevo fichero htpasswd con el usuario user1
$ htpasswd -c ./data/users user1
New password:
Re-type new password:
# Creamos un usuario más
$ htpasswd ./data/users user2
New password:
Re-type new password:

Una vez creado dicho fichero, deberíamos reducirle los permisos para que sólo nosotros podamos manipularlo:

$ chmod 600 ./data/users

Después, abrimos el fichero de configuración (según la configuración del fichero docker-compose.yml de más arriba, será un fichero config en el directorio ./config) y le añadiremos lo siguiente:

[auth]

# Authentication method
# Value: none | htpasswd | remote_user | http_x_remote_user
type = htpasswd

# Htpasswd filename
htpasswd_filename = /data/users

# Htpasswd encryption method
# Value: plain | bcrypt | md5
# bcrypt requires the installation of radicale[bcrypt].
htpasswd_encryption = md5

# Incorrect authentication delay (seconds)
delay = 5

# Message displayed in the client when a password is needed
realm = Radicale - Password Required

Como podéis observar, es bastante descriptivo lo que añadimos: Especificamos que el fichero de autenticación será de tipo htpasswd (mejor que tener las contraseñas en claro...), que estará bajo el directorio /data (ya que en docker-compose.yml hemos montado el directorio data en la raíz), que estará encriptado mediante MD5, que habrá que esperar 5 segundos para reintentarlo si metemos mal el usuario o la contraseña y el mensaje que se le mostrará al usuario en la web cuando se le requiera por la contraseña.

Configuración básica

Una vez tenemos la autenticación configurada, vamos a ver otras opciones básicas que deberíamos, al menos, revisar.

Servidor

Por defecto, Radicale sólo escucha las peticiones de la máquina donde está (localhost). Si queremos que sea accesible desde cualquier parte, deberemos añadir al fichero de configuración lo siguiente:

[server]

# CalDAV server hostnames separated by a comma
# IPv4 syntax: address:port
# IPv6 syntax: [address]:port
# For example: 0.0.0.0:9999, [::]:9999
hosts = 0.0.0.0:5232

# Max parallel connections
max_connections = 4
# 100 Megabyte
max_content_length = 100000000
# 30 seconds
timeout = 30

De esta manera, permitimos que el servicio escuche peticiones de cualquier host a través del puerto 5232, y limitamos el máximo número de conexiones a 4, el tamaño máximo y el timeout de dicha conexión.

Almacenamiento

Por defecto, Radicale almacena los datos en el directorio /var/lib/radicale/collections. Si los queremos en otro sitio, o si estamos usando la imagen Docker, deberemos especificar la ruta que usamos. En el segundo caso, deberemos especificar:

[storage]

# Folder for storing local collections, created if not present
#filesystem_folder = /var/lib/radicale/collections
filesystem_folder = /data/collections

El directorio de collections, al igual que el fichero users, no debería ser accesible más que por nosotros, ya que, de lo contrario, cualquiera podría acceder a nuestros calendarios e, incluso, bloquear su uso. Deberemos aplicar la misma acción con chmod que en el caso anterior.

Acceso a Radicale

Creación de un nuevo calendario o agenda de contactos

Para crear nuevos calendarios o agendas de contactos, bastará con que accedamos a la web mediante https://radicale.midomin.io (si hemos hecho uso del fichero docker-compose.yml y tenemos Traefik, si no accederemos por lo que configuremos o directamente por http://localhost:5232), y entraremos con uno de los usuarios que dimos de alta en el fichero users.

Una vez ahí, veremos que tenemos 2 opciones: Crear una nueva agenda o calendario, o importar uno existente. En nuestro caso, le daremos a crear uno nuevo. Pondremos el título con el que lo queremos llamar, una breve descripción para dejar claro qué objetivo tiene, un color con el que se reflejará por defecto en las aplicaciones y deberemos seleccionar qué queremos crear. Aquí tenemos varias opciones:

  • Agenda de contactos
  • Calendario, diario y tareas
  • Calendario y diario
  • Calendario y tareas
  • Tareas y diario
  • Calendario
  • Diario
  • Tareas

Como podemos ver, podemos combinar varios tipos o crear uno para cada uno de ellos completamente separados, ahí ya los gustos. Actualmente, como lo que estoy usando es sólo un gestor de tareas, creé uno de tipo "Tareas" únicamente. No pasa nada si no lo tenemos claro, ya que una vez creado podremos editarlo tantas veces como necesitemos y cambiarle cualquiera de sus atributos, así como el tipo del mismo. La única salvedad es que, si creamos una agenda de contactos, no podremos cambiar el tipo, siempre será una agenda de contactos. Y en los demás casos sólo podremos ir del más específico al más general. Es decir, si creamos un calendario de tipo "Tareas", más adelante podremos modificarlo y hacer que pase de "Tareas" a "Tareas y diario", "Calendario y tareas" o "Calendario, diario y tareas" (lo cual tiene todo el sentido del mundo, ya que si no perderíamos todo lo que hasta entonces habríamos creado). Por ello, os recomiendo que creéis lo más específico que necesitéis y, según vayáis probando la herramienta y queráis ampliar, bien creéis uno nuevo para cada cosa, bien aumentéis el que ya tenéis. Cada cual que escoja su mejor opción 😊.

Crear nuestra primera tarea

Empezamos accediendo a través de la URL que usamos para gestionar Radicale y veremos que arriba está la opción de InfCloud, o bien directamente entrando a https://radicale.midomin.io/.web/infcloud/, y accediendo con nuestro usuario y contraseña.

Una vez dentro, veremos una interfaz muy básica donde, a la izquierda, podremos seleccionar entre las opciones de agenda de contactos, calendario o listas de tareas, así como las opciones para refrescar, cerrar la sesión y cambiar la zona horaria.

Opciones para crear una nueva tarea desde la interfaz web de InfCloud
Opciones para crear una nueva tarea desde la interfaz web de InfCloud

Para crear nuestra primera tarea, bastará con que accedamos a la opción de To-Do Lists y hagamos clic sobre el icono de nuevo (en la parte superior, encima del calendario, el fichero con el +), para que se nos abra una opción a la derecha donde podremos rellenar el título de la tarea y opciones como:

  • Ubicación, si deseamos especificarla (URL de Google Maps, OpenStreetMaps, una dirección como tal...)
  • Tipo de tarea: Simple o con fecha de vencimiento
  • Porcentaje completado de la tarea
  • Estado (Incompleta o completada)
  • Privacidad (Pública, privada o confidencial)
  • Prioridad (Ninguna, baja, media o alta)
  • Lista de tareas donde la queremos crear (o calendario, si lo hemos creado con este soporte)
  • Recordatorios
  • URL
  • Nota o descripción detallada. Esta opción soporta la especificación de sub-tareas o checks, mediante el uso del formato [] y [x]

¡Le damos a guardar y ya tendremos nuestra primera tarea creada!

Acceso desde otras aplicaciones

Ahora que tenemos configurado nuestro servicio de agendas de contactos y calendarios, si queremos integrarlo con otras aplicaciones (en el caso de Mac OS con las aplicaciones nativas de Calendario, Contactos o Recordatorios, en el caso de Android a través de aplicaciones como DAVx5, por ejemplo), necesitaremos la URL que nos aparece cuando creamos un calendario o agenda, en la pantalla principal de Radicale.

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección:

Donar