Skip to main content

Synchroniser automatiquement Radicale et Nextcloud avec un script Bash

Radicale et Nextcloud sont deux solutions populaires pour gérer ses calendriers.

  • Radicale est un serveur CalDAV léger, idéal pour héberger ses agendas en local ou sur un petit serveur.

  • Nextcloud est une plateforme cloud complète qui intègre entre autres la gestion des calendriers via CalDAV.

Dans certains cas, on souhaite synchroniser automatiquement les fichiers .ics de Radicale vers Nextcloud : par exemple pour bénéficier de l’interface web conviviale de Nextcloud tout en continuant à utiliser Radicale comme serveur principal.

Cet article présente un script Bash qui automatise cette synchronisation et explique comment le mettre en place.


1. Le principe

Le script a pour objectif de :

  1. Lister les fichiers .ics présents dans Radicale pour un utilisateur donné.

  2. Comparer avec le contenu déjà présent dans Nextcloud via WebDAV.

  3. Supprimer côté Nextcloud les fichiers qui n’existent plus côté Radicale.

  4. Uploader (mettre à jour ou ajouter) les fichiers .ics de Radicale vers Nextcloud.

Résultat : les calendriers de Nextcloud deviennent une copie fidèle des calendriers Radicale, mis à jour automatiquement chaque nuit (ou selon la planification définie dans cron).


2. Le script Bash

Voici le script complet :

#!/bin/bash

# === À PERSONNALISER ===

# Répertoire racine des calendriers Radicale
RADICALE_ROOT="/srv/Files/Radicale/data/collections/collection-root/user/"

# Ton utilisateur Nextcloud
NEXTCLOUD_USER="user"

# Ton mot de passe ou token d'application Nextcloud
NEXTCLOUD_PASS="TOKEN"

# Hôte Nextcloud (ex: cloud.exemple.com)
NEXTCLOUD_HOST="cloud.exemple.com"

# Liste des calendriers à synchroniser (Radicale|Nextcloud)
CALENDARS=(
  "cal1|cal-1"
  "cal2|cal-2"
  "cal3|cal-3"
  "cal4|cal-4"
  "cal5|cal-5"
)

# =========================

for calendar in "${CALENDARS[@]}"; do
    RADICAL_NAME="${calendar%%|*}"
    NEXTCLOUD_NAME="${calendar##*|}"

    echo "Synchronisation du calendrier : $RADICAL_NAME --> $NEXTCLOUD_NAME"

    RADICAL_CAL_DIR="$RADICALE_ROOT/$RADICAL_NAME"
    NEXTCLOUD_URL="https://$NEXTCLOUD_HOST/remote.php/dav/calendars/$NEXTCLOUD_USER/$NEXTCLOUD_NAME"

    if [[ ! -d "$RADICAL_CAL_DIR" ]]; then
        echo "Dossier introuvable : $RADICAL_CAL_DIR — Ignore."
        continue
    fi

    # Liste des fichiers locaux
    declare -A local_files
    for ics_file in "$RADICAL_CAL_DIR"/*.ics; do
        if [[ -f "$ics_file" ]]; then
            file_name=$(basename "$ics_file")
            local_files["$file_name"]=1
        fi
    done

    # Récupération des fichiers distants
    echo "Recuperation des fichiers existants depuis Nextcloud..."
    remote_files=$(curl -s -u "$NEXTCLOUD_USER:$NEXTCLOUD_PASS" -X PROPFIND \
        -H "Depth: 1" "$NEXTCLOUD_URL" | grep -oP '(?<=<d:href>).*?\.ics(?=</d:href>)' | sed 's|.*/||')

    for remote_file in $remote_files; do
        if [[ -z "${local_files[$remote_file]}" ]]; then
            echo "Suppression distante : $remote_file"
            curl -s -u "$NEXTCLOUD_USER:$NEXTCLOUD_PASS" -X DELETE \
                "$NEXTCLOUD_URL/$remote_file" \
                || echo "Erreur lors de la suppression de $remote_file"
        fi
    done

    # Upload des fichiers locaux
    for ics_file in "$RADICAL_CAL_DIR"/*.ics; do
        if [[ -f "$ics_file" ]]; then
            FILE_NAME=$(basename "$ics_file")
            echo "Upload : $FILE_NAME"

            curl -s -X PUT -u "$NEXTCLOUD_USER:$NEXTCLOUD_PASS" \
                 -T "$ics_file" \
                 "$NEXTCLOUD_URL/$FILE_NAME" \
                 || echo "Erreur lors de l'envoi de $FILE_NAME"
        fi
    done

    echo "Termine pour $RADICAL_NAME"
    echo ""
done

echo "Synchronisation complete."

3. Pré-requis

Avant de lancer ce script, il faut :

  • Avoir un serveur Radicale fonctionnel avec des calendriers stockés dans un répertoire .ics.

  • Avoir un compte Nextcloud avec la gestion des calendriers activée.

  • Créer un token d’application dans Nextcloud (plutôt que d’utiliser directement son mot de passe).

  • Installer curl sur le système qui exécutera le script.


4. Configuration du script

Les variables principales à personnaliser sont :

  • RADICALE_ROOT : chemin vers le répertoire où Radicale stocke les .ics.

  • NEXTCLOUD_USER et NEXTCLOUD_PASS : ton utilisateur Nextcloud et son mot de passe (ou mieux : un token d’application).

  • NEXTCLOUD_HOST : ton domaine Nextcloud (par ex. cloud.exemple.com).

  • CALENDARS : la correspondance entre les noms des calendriers Radicale et Nextcloud ("Nom_Radicale|Nom_Nextcloud").


5. Automatiser avec cron

Pour exécuter la synchronisation chaque nuit à 3h du matin, ajoute cette ligne à la crontab (crontab -e) :

0 3 * * * /bin/bash /home/Radicale_to_Nextcloud/radicale_to_nextcloud.sh

Ainsi, tes calendriers Radicale seront automatiquement poussés vers Nextcloud sans intervention manuelle.


6. Avantages et limites

Avantages :

  • Pas besoin de configurer une double synchro CalDAV.

  • Nextcloud reçoit une copie exacte des fichiers .ics de Radicale.

  • Automatisation complète grâce à cron.

⚠️ Limites :

  • C’est une synchronisation unidirectionnelle (Radicale → Nextcloud). Toute modification faite directement dans Nextcloud sera écrasée.

  • Le script ne gère pas les conflits de modification.


Conclusion

Ce script Bash est une solution simple et efficace pour synchroniser automatiquement ses calendriers Radicale vers Nextcloud. En planifiant son exécution via cron, tu bénéficies de la puissance de Radicale et de l’ergonomie de Nextcloud, sans avoir à gérer les manipulations manuelles de fichiers .ics.