# Script de synchronisation des notes Silverbullet avec Nextcloud via Unison

## Principe et Fonctionnement

1. Unison surveille les deux répertoires en continu
2. Dès qu'un changement est détecté, il synchronise (avec un délai de 5s entre deux syncs)
3. Après chaque synchronisation, exécution du script de scan de  Nextcloud ciblé sur le répertoire concerné

```
Changement fichier → Unison détecte → Synchronisation → Hook déclenché → Scan Nextcloud
```

> **warning** Warning
> Des tests ont été réalisés pour exécuter un script de synchro via Silverbullet (Lua-Space) mais sans succès.
> Impossible du fait que l’utilisateur `silverbullet` ne peut exécuter aucune commande de type `sudo`.
> La méthode ci-dessous reste la seule fonctionnelle à ce stade.

---

## Étape 1 : Installation d'Unison et Inotify

```bash
sudo apt update
sudo apt install unison inotify-tools
```

---

## Étape 2 : Configuration des droits

Créer le groupe partagé :

```bash
sudo groupadd silverbullet-sync
sudo usermod -aG silverbullet-sync nextcloud
sudo usermod -aG silverbullet-sync silverbullet
```

Configurer les permissions SilverBullet :

```bash
sudo chown -R silverbullet:silverbullet-sync /home/yunohost.app/silverbullet/notes
sudo chmod -R 775 /home/yunohost.app/silverbullet/notes
sudo chmod g+s /home/yunohost.app/silverbullet/notes
```

Configurer les permissions Nextcloud :

```bash
sudo mkdir -p /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet
sudo chown -R nextcloud:silverbullet-sync /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet
sudo chmod -R 775 /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet
sudo chmod g+s /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet
```

Ajouter un fichier d’exclusion `.sync-exclude.lst` pour Nextcloud :

```bash
sudo -u nextcloud nano /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet/.sync-exclude.lst
```

Contenu du fichier :

```
.git 
.stfolder* 
*.tmp
*~
~$*
.~lock.*
~*.tmp
*.textClipping
.DS_Store
Thumbs.db
.stfolder
.stignore
.stversions
*.part
*.crdownload
```
---

## Étape 3 : Créer le répertoire de configuration Unison

```bash
mkdir -p ~/.unison
sudo mkdir -p /home/yunohost.app/silverbullet/unison-nextcloud
```

---

## Étape 4 : Créer le profil Unison avec hook

```bash
nano ~/.unison/silverbullet.prf
```

Copiez cette configuration :

```bash
# Répertoires à synchroniser
root = /home/yunohost.app/silverbullet/notes
root = /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet

# Mode automatique sans interaction
batch = true
auto = true

# Mode surveillance temps réel - NON FONCTIONNEL
#repeat = watch
#repeat = 60

# Gestion des conflits (prioriser le plus récent)
force = newer
prefer = newer        # En cas de conflit, garde la version la plus récente
#remove = true         # Supprime les fichiers/dossiers si supprimés d'un côté

# Options supplémentaires utiles
#times = true          # Conserve les dates de modification
#perms = true          # Conserve les permissions
#terse = true          # Sortie concise (utile pour les logs)

# Permissions
perms = 0
group = true

# Logs
log = true
logfile = /home/yunohost.app/silverbullet/unison-nextcloud/unison.log

# Ignorer les fichiers temporaires
ignore = Name {.*.swp,*~,.DS_Store}
ignore = Name {*.tmp,*.lock,*.db-wal,*.db-shm}
ignore = Path {.git}

# Ne pas demander de confirmation
confirmbigdel = false
confirmmerge = false

# Gestion des erreurs
maxerrors = 10
retry = 3

# HOOK : Exécuter le script après chaque synchronisation
#backupcurrent = Name * -> /usr/local/bin/unison-scan-nextcloud.sh
```

## Étape 5 : Script de synchronisation

Opérations à effectuer:

Synchronisation Unison:
```bash
unison silverbullet
chown silverbullet /home/yunohost.app/silverbullet/notes
```

Synchronisation Nextcloud:
```bash
sudo -u nextcloud php8.3 --define apc.enable_cli=1 /var/www/nextcloud/occ files:scan --path="guillaume_ryckelynck/files/silverbullet"
```

Créer le script de synchronisation général :

```bash
nano /home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh
```

Contenu du fichier :

```bash
#!/bin/bash

# Chemins des répertoires à synchroniser
SB_DIR="/home/yunohost.app/silverbullet/notes"
NC_DATA="/home/yunohost.app/nextcloud/data"
NC_USER_PATH="guillaume_ryckelynck/files/silverbullet"
NC_DIR="$NC_DATA/$NC_USER_PATH"
NC_LOG_FILE="/home/yunohost.app/silverbullet/unison-nextcloud/nextcloud.log"

# Fonction pour lancer Unison
sync-unison() {
    echo "Lancement de la synchronisation..."
    unison -remove silverbullet
    echo "Synchronisation terminée."
}

update-dir() {
    chown -R silverbullet:silverbullet-sync $SB_DIR/*
    chown -R nextcloud:silverbullet-sync $NC_DIR/*
}

scan-nextcloud() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Scan Nextcloud déclenché" >> "$NC_LOG_FILE"
    sudo -u nextcloud php8.3 --define apc.enable_cli=1 /var/www/nextcloud/occ files:scan --path="$NC_USER_PATH" >> "$NC_LOG_FILE" 2>&1
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Scan terminé" >> "$NC_LOG_FILE"
}

# Surveillance des changements dans les deux répertoires
while true; do
    inotifywait -r -e modify,create,delete,move --exclude "\.stfolder*|\.git" $SB_DIR $NC_DIR

    echo "---"
    echo "Synchronisation Unison"
    sync-unison

    if [ $? -eq 0 ]; then
        echo "Mise à jour des droits sur les dossiers Silverbullet et Nextcloud."
        update-dir
        
        echo "Scan des fichiers Nextcloud."
        scan-nextcloud

        echo "Délai pour éviter les synchronisations trop fréquentes."
        sleep 5
    fi

    echo "Attente du prochain changement."
    echo "---"

done
```

Rendre le script exécutable :

```bash
sudo chmod +x /home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh 
```

Exécuter le script :

```bash
/home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh
```

---

## Étape 6 : Test manuel initial

Faire une première synchronisation manuelle :

```bash
/home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh
```

Si c'est la première fois, Unison vous demandera confirmation.
Tapez:

- `f` (pour "follow") si vous voulez prendre les fichiers de SilverBullet comme référence
- Ou répondez aux questions selon vos besoins

Vérifier les logs :

```bash
# Logs Unison
tail -50 /home/yunohost.app/silverbullet/unison-nextcloud/unison.log

# Logs des scans Nextcloud
tail -50 /home/yunohost.app/silverbullet/unison-nextcloud/nextcloud.log
```


## Etape 7 : Configurer un service systemd 

Pour lancer un script Bash au démarrage de ton ordinateur avec **systemd** et qu'il redémarre automatiquement s'il s'arrête, voici la procédure détaillée et concise :

---

### 1. Créer un fichier de service systemd

Crée un fichier de configuration pour ton service dans `/etc/systemd/system/`. Par exemple, si ton script s'appelle `mon_script.sh`, crée un fichier nommé `mon_script.service` :

```bash
sudo nano /etc/systemd/system/unison-silverbullet-nextcloud.service
```

### 2. Configurer le fichier de service

Ajoute le contenu suivant en adaptant les chemins et les options selon ton script :

```ini
[Unit]
Description=Script pour automatiser la synchronisation de mes notes entre Silverbullet et Nextcloud via Unison
After=network.target

[Service]
#User=ton_utilisateur  # Remplace par ton nom d'utilisateur
WorkingDirectory=/home/yunohost.app/silverbullet/unison-nextcloud/
ExecStart=/bin/bash /home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh
Restart=always        # Redémarre automatiquement si le script s'arrête
RestartSec=5          # Délai avant redémarrage (en secondes)

[Install]
WantedBy=multi-user.target
```

*   **`User`** : Spécifie sous quel utilisateur le script doit s'exécuter.
*   **`WorkingDirectory`** : Dossier de travail du script (optionnel, mais utile si ton script utilise des chemins relatifs).
*   **`ExecStart`** : Chemin complet vers ton script Bash.
*   **`Restart=always`** : Assure le redémarrage automatique en cas d'arrêt.
*   **`RestartSec`** : Délai avant le redémarrage (évite les boucles trop rapides).

### 3. Activer et démarrer le service

Recharge la configuration de systemd, active le service pour qu'il démarre au boot, puis démarre-le immédiatement :

```bash
sudo systemctl stop unison-silverbullet-nextcloud.service
sudo systemctl daemon-reload 
sudo systemctl enable unison-silverbullet-nextcloud.service
sudo systemctl start unison-silverbullet-nextcloud.service
```

### 4. Vérifier le statut du service

Pour t'assurer que tout fonctionne :

```bash
sudo systemctl status unison-silverbullet-nextcloud.service
```

Tu devrais voir un message indiquant que le service est **active (running)**.

---

### 5. Journal des logs (optionnel)

Pour consulter les logs de ton script (utile pour le débogage) :

```bash
journalctl -u unison-silverbullet-nextcloud.service -f
```

---

## Étape 8 : En cas de problème

### Le service ne démarre pas

```bash
# Vérifier les erreurs
sudo journalctl -u unison-silverbullet -n 50

# Tester en mode manuel
sudo unison silverbullet
```

### Les fichiers ne se synchronisent pas

```bash
# Vérifier les permissions
ls -la /home/yunohost.app/silverbullet/notes
ls -la /home/yunohost.app/nextcloud/data/guillaume_ryckelynck/files/silverbullet

# Vérifier que les utilisateurs sont dans le bon groupe
groups nextcloud
groups silverbullet
```

### Le scan Nextcloud ne fonctionne pas

```bash
# Tester le script manuellement
sudo /home/yunohost.app/silverbullet/unison-nextcloud/unison-silverbullet-nextcloud.sh

# Vérifier les logs
tail -50 /home/yunohost.app/silverbullet/unison-nextcloud/nextcloud.log
```

---
