Aller au contenu

WF-B — Orchestrateur de transfert

WF-B est le cœur du système. Il tourne automatiquement toutes les 5 minutes et fait trois choses en parallèle :

  1. Section A — Surveille les transferts déjà lancés
  2. Section B — Consolide le rapport par drive
  3. Section C — Lance de nouveaux transferts

xlBpp5lN38ASrmq9 — Statut : Actif

[Trigger 5min]
├─── Section A (poll)
│ A1: Lire Transfert_Detail (Sheets)
│ A2: Extraire les jobs EN COURS
│ A3: POST /status → rclone-agent
│ A4: MAJ Sheets (statut final)
├─── Section B (rapport)
│ B1: Lire Transfert_Detail (Sheets)
│ B2: Consolider par drive
│ B3: MAJ onglet Rapport (Sheets)
└─── Section C (lancement)
C1: Lire Transfert_Detail (Sheets)
C2: Préparer lancement (filtre EN ATTENTE, max N simultanés)
C3: POST /transfer → rclone-agent
C4: MAJ Sheets (statut → EN COURS, job_id)

A1 lit toutes les lignes de Transfert_Detail.

A2 filtre uniquement celles avec statut = EN COURS.

A3 appelle GET /status/<job_id> sur rclone-agent pour chaque job. Retourne le statut actuel (RUNNING, SUCCESS, ERROR) et les dernières lignes du log.

A4 met à jour le Sheets :

  • SUCCESS → statut DÉJÀ TRANSFÉRÉ
  • ERROR → statut ERREUR
  • RUNNING → statut reste EN COURS

Agrège les résultats par drive (nom du drive source) et écrit dans l’onglet Rapport : nombre total de fichiers, nombre transférés, nombre en erreur, progression en %.

C1 lit le Sheets.

C2 filtre les lignes EN ATTENTE et vérifie qu’on n’a pas déjà trop de jobs en cours simultanément (limite configurable).

C3 appelle POST /transfer sur rclone-agent avec :

{
"src_drive_id": "<ID drive source>",
"dst_drive_id": "<ID drive destination>",
"path": "<chemin relatif>",
"type": "fichier | dossier"
}

JSON.stringify obligatoire

Le body est construit avec JSON.stringify({...}) dans l’expression n8n (pas une interpolation de chaîne). C’est essentiel pour les noms de fichiers contenant des backslashes ou caractères spéciaux.

C4 met à jour le Sheets : statut → EN COURS, job_id → <id retourné par rclone-agent>.

Fenêtre de terminal
# Voir les 5 dernières exécutions
N8N_IP=$(docker inspect n8n-rkaf-n8n-1 --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
curl -s "http://${N8N_IP}:5678/api/v1/executions?workflowId=<ID_WF_B>&limit=5" \
-H "X-N8N-API-KEY: <TOKEN>" | python3 -c "
import sys,json; r=json.load(sys.stdin)
for e in r['data']: print(e['id'], e['status'], e.get('startedAt','')[:19])
"

Si le nœud C3 retourne “connection closed unexpectedly” :

  1. Vérifier que rclone-agent tourne : systemctl status rclone-agent
  2. Vérifier les logs : journalctl -u rclone-agent --since 30m --no-pager
  3. Redémarrer si nécessaire : sudo systemctl restart rclone-agent

Si des jobs restent EN COURS indéfiniment alors que rclone-agent a été redémarré :

Fenêtre de terminal
# Le statut des jobs persist sur disque
ls /home/sidy/scripts/logs/job_*.status | tail -5
cat /home/sidy/scripts/logs/job_<id>.status