À qui s'adresse ce document : à toute personne qui veut comprendre comment fonctionne notre système, même sans aucune connaissance préalable. Chaque composant est expliqué depuis zéro.
Ce document est le socle de vérité de notre infrastructure — les données qu'il contient (paths, versions, configuration, historique) sont vérifiées et protégées. Les suggestions d'amélioration sont les bienvenues mais taguées par source pour qu'on sache qui a proposé quoi.
| Source | Contribution | Date |
|---|---|---|
| Hermes (DeepSeek V4 Pro) | Rédaction initiale — sections 1 à 10 : état des lieux complet, historique réel, roadmap 4 phases | 6 juin 2026 |
| 🤖 Gemini | Section 11 — suggestions Recyclarr, Kometa, Tdarr/Unmanic, Maintainerr (fusionnées et vérifiées par Hermes) | 6 juin 2026 |
| 🤖 Claude Sonnet 4.6 | Section 12 — angles morts : FlareSolverr, monitoring Transmission R/O, fallback FR, ffprobe validation | 6 juin 2026 |
| 🤖 GPT-4o | Section 13 — architecture de l'autonomie : boucle fermée, test restore, dry-run systématique, orchestration centralisée | 6 juin 2026 |
| 🤖 Grok 4 | Section 14 — accélération opérationnelle : autobrr (IRC racing), Notifiarr (dashboard natif), BorgBackup, analyse historique | 6 juin 2026 |
| future | — en attente de nouvelles suggestions — |
Format pour les suggestions futures : chaque ajout est tagué [🤖 Nom_AI] dans son titre de section, et la table ci-dessus est mise à jour. Toute suggestion qui contredit des données réelles (paths, versions, historique) est filtrée — le socle ne bouge pas.
Un seedbox est un serveur dédié (généralement dans un datacenter) qui télécharge et partage des fichiers via le protocole BitTorrent — 24h/24, 7j/7, à très haut débit (souvent 1 Gbps ou plus).
Pourquoi utiliser un seedbox plutôt que son PC personnel ? - Débit internet 10× à 100× plus rapide que la maison - Disponible en permanence (pas besoin de laisser son PC allumé) - Préserve les ratios sur les trackers privés (seeding continu) - Ne consomme pas la bande passante domestique - Protège la vie privée (l'adresse IP exposée est celle du datacenter)
Notre seedbox est hébergé chez Whatbox.ca (plan goji, juin 2026) et tourne sous Linux.
| Élément | Détail |
|---|---|
| Hébergeur | Whatbox.ca — plan goji |
| Expiration | Mai 2026 (renouvellement en cours) |
| OS | Linux (whatbox custom) |
| Stockage | ~24 volumes de 20 To (montés via l'API Sonarr /diskspace) |
| Connexion SSH | evilguard@goji.whatbox.ca port 22 |
| Client torrent | Transmission (interface web : transmission.evilguard.box.ca) |
| Media server | DEMONPLEX / Jellyfin — lit la librairie et sert le contenu |
| Domaine | *.evilguard.box.ca (sous-domaines pour chaque app) |
Six applications web, chacune accessible via son sous-domaine HTTPS :
| Application | URL | Rôle |
|---|---|---|
| Overseerr | overseerr.evilguard.box.ca |
Portail de requêtes — l'utilisateur demande un film/série ici |
| Sonarr | sonarr.evilguard.box.ca |
Gestionnaire de séries TV |
| Radarr | radarr.evilguard.box.ca |
Gestionnaire de films |
| Prowlarr | prowlarr.evilguard.box.ca |
Agrégateur d'indexers (moteurs de recherche torrent) |
| Bazarr | bazarr.evilguard.box.ca |
Gestionnaire de sous-titres automatiques |
| Transmission | transmission.evilguard.box.ca |
Client de téléchargement (LE SEUL qu'on ne touche JAMAIS) |
| Jellyfin/DEMONPLEX | — | Media server (lecture du contenu) |
┌─────────────────────────────────────────────────┐
│ 1. L'utilisateur demande un film/série │
│ → Overseerr (interface simple, comme Netflix) │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 2. Sonarr (séries) ou Radarr (films) │
│ prennent la requête et cherchent la release │
│ parfaite selon nos critères de qualité │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 3. Prowlarr interroge les indexers │
│ (C411, Nyaa.si, SubsPlease…) │
│ → trouve les torrents disponibles │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 4. Transmission télécharge le .torrent │
│ (NE JAMAIS TOUCHER — géré par Sonarr/Radarr) │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 5. Sonarr/Radarr importent le fichier fini │
│ → renommage propre, placement dans la lib. │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 6. Bazarr scanne et télécharge les sous-titres │
│ (FR, EN) automatiquement │
└────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ 7. DEMONPLEX / Jellyfin │
│ → l'utilisateur peut maintenant regarder │
└─────────────────────────────────────────────────┘
C'est la « porte d'entrée » du système. L'utilisateur tape le nom d'un film ou d'une série, Overseerr cherche dans la base TMDb (The Movie Database), affiche une fiche avec jaquette et synopsis, et l'utilisateur clique « Demander ».
Une fois approuvée, la requête est transmise à Sonarr ou Radarr qui se charge du reste.
/api/v1GET /status (PAS /system/status — piège connu !)https://overseerr.evilguard.box.ca/api-docsSonarr est le cerveau pour les séries. Il : - Garde une base de données de toutes les séries qu'on suit - Sait quels épisodes on a déjà et lesquels il manque - Cherche automatiquement les nouveaux épisodes (via Prowlarr) - Renomme proprement les fichiers et les place dans la librairie - Suit les calendriers de diffusion (les épisodes qui sortent cette semaine)
/api/v3 (identique à Radarr — mêmes endpoints)Même chose que Sonarr, mais pour les films. Cherche, télécharge, renomme, organise.
/api/v3Un indexer, c'est un site qui référence des torrents (comme C411, YGG, Nyaa.si). Prowlarr centralise la connexion à TOUS les indexers et les expose à Sonarr/Radarr de façon unifiée.
Avant Prowlarr, il fallait configurer chaque indexer manuellement dans chaque application. Prowlarr le fait une fois et synchronise automatiquement.
Nos 5 indexers actifs (nettoyés de 64 à 5 en mai 2026) :
| Indexer | Rôle |
|---|---|
| C411 | Indexer principal — films et séries, besoin d'une API key |
| Nyaa.si | Anime — LE tracker de référence mondial |
| SubsPlease | Anime saisonnier (sorties hebdomadaires) |
| Tokyo Toshokan | Anime historique / catalogue |
| Shana Project | Anime |
Bazarr scanne la librairie (ce que Sonarr/Radarr ont importé) et télécharge les sous-titres manquants depuis des providers comme OpenSubtitles.org, Sous-Titres.eu, Addic7ed.
Le client de téléchargement. Sonarr et Radarr lui envoient les .torrent à télécharger. Il seed (partage) pour maintenir les ratios sur les trackers privés.
RÈGLE D'OR : l'agent Hermes ne touche JAMAIS à Transmission. Aucune suppression de torrent, aucun arrêt de seed, aucune modification. La raison est simple : supprimer un torrent = ratio détruit sur les trackers privés = bannissement potentiel.
Transmission téléchargeait directement dans les mêmes dossiers que la librairie :
/home/evilguard/files/anime/ ← 84 torrents + dossiers propres Sonarr
/home/evilguard/files/serie tele/ ← 386 torrents + dossiers propres Sonarr
/home/evilguard/files/films/ ← 358 torrents + dossiers propres Radarr
Conséquences :
1. Doublons dans DEMONPLEX — le media server voyait les dossiers propres de Sonarr ET les dossiers bruts de Transmission (ex: Hell's Paradise/ ET Jigokuraku S01 [BD]/)
2. Hardlinks cassés — source et destination dans le même dossier, Sonarr copiait au lieu de hardlinker → espace disque gaspillé
3. Sonarr health warning — "Download client places downloads in root folder"
/home/evilguard/files/
├── .torrents/ ← Transmission UNIQUEMENT (non scanné par DEMONPLEX)
│ ├── anime/
│ ├── tv/
│ └── movies/
├── anime/ ← Librairie Sonarr (scannée par DEMONPLEX)
├── serie tele/ ← Librairie Sonarr
└── films/ ← Librairie Radarr
Le . devant .torrents/ cache le dossier au media server — plus de doublons. La séparation permet aussi les vrais hardlinks (Transmission seed depuis .torrents/, Sonarr hardlinke vers la librairie sans copie supplémentaire).
Statut : les torrents ont été déplacés vers .torrents/ le 31 mai 2026. 828 torrents, 0 conflit de dossiers partagés. Migration sécurisée et vérifiée.
Le système de scoring détermine QUELLE release est choisie quand plusieurs sont disponibles. On ne veut pas n'importe quelle version — on veut la meilleure qualité en français.
| Format | Score | Signification |
|---|---|---|
| MULTI (FR + VO) | +100 | Le graal — piste française ET originale dans le même fichier |
| French / VF | +50 | Version française disponible |
| VOSTFR | +30 | VO avec sous-titres français (fallback acceptable) |
| VO sans FR | 0 | Dernier recours — aucun français |
| Tout le reste | -10000 | Rejeté automatiquement |
| Format | Score | Signification |
|---|---|---|
| MULTI (VO jap + VF) | +100 | Parfait — VO japonaise pour le puriste, VF pour partager |
| VO japonaise | +50 | Préférence d'authenticité |
| VF seule | +20 | Fallback si rien d'autre |
Any (id=-2). Si English ou Original, les custom formats français sont ignorés même avec des scores positifs.À côté du seedbox, on a un VPS Hostinger (2.25.147.23, domaine evilai.fun) qui héberge des services d'automatisation. Ces services sont indépendants du seedbox physiquement, mais communiquent avec.
/root/automation-stack/)| Service | Port | RAM idle | Rôle |
|---|---|---|---|
| n8n | 5678 | ~350 MB | Automatisation visuelle (400+ intégrations) |
| Miniflux | 8080 | ~80 MB | Lecteur RSS (actualités) |
| Changedetection.io | 5000 | ~120 MB | Surveillance de sites web (détection de changements) |
| Cronicle | 3012 | ~30 MB | Planificateur de tâches avec interface GUI |
| ntfy | 2586 | ~40 MB | Notifications push |
Total idle : ~650 MB RAM
Deux jobs automatisés produisent un briefing d'actualité chaque matin :
Collecte horaire (chaque heure, :10) : un script Python interroge l'API Miniflux, récupère les nouveaux articles de toutes les catégories (AI/ML, AI Agents, Tech, US Politics, Canada Politics, World/Conflicts) et les stocke dans un buffer.
Briefing matinal (10:55 UTC = 6:55 Montréal) : un autre script assemble le buffer, déduplique les articles (URL exacte + similarité Jaccard > 65%), puis appelle Claude CLI pour rédiger un briefing intelligent. Le résultat est livré sur Telegram.
Coût : ~4 850 tokens Anthropic par jour (~0.90$—1.50$/mois).
Cinq jobs automatisés tournent en permanence, sans intervention humaine :
| Job | Fréquence | Rôle | Mode |
|---|---|---|---|
| Briefing - Hourly Collection | Chaque heure à :10 | Récupère les nouveaux articles RSS → buffer | no_agent (script pur, 0 tokens) |
| Briefing - Morning Report | 10:55 UTC quotidien | Assemble le buffer → Claude → briefing livré sur Telegram | no_agent |
| Briefing - Feed Health Check | Lundi 9:00 UTC | Vérifie que tous les flux RSS répondent encore | Agent léger (terminal only) |
| Briefing - Memory Prune | 1er du mois 3:00 UTC | Nettoie les vieux buffers | no_agent (script pur) |
| Seedbox Weekly Health Check | Dimanche 10:00 UTC | Audit READ-ONLY complet des 5 apps *Arr | Agent (media-management skill) |
Le Weekly Health Check vérifie automatiquement : - Les 5 apps sont-elles en ligne ? - Les profils de qualité ont-ils les bons scores ? - Y a-t-il des warnings dans la queue Sonarr/Radarr ? - Les indexers Prowlarr sont-ils tous fonctionnels ? - L'espace disque est-il correct ?
Tous les résultats sont livrés sur Telegram.
Voici l'état du seedbox avant notre grand nettoyage :
| Problème | Détail |
|---|---|
| Indexers Prowlarr | 64 indexers — dont des sites pornos, cracks, jeux, trackers morts, clones, Pirate Bay, YGG (déjà mort) |
| Profils de scoring | Scores incorrects sur presque tous les profils. french=0 ou MULTI=+20 au lieu de +100. Résultat : les releases FR n'étaient pas priorisées correctement. |
| Profils inutiles | Profils SD et Ultra-HD actifs (jamais utilisés, pouvaient causer des downloads non désirés) |
| Langue des profils | Certains profils avaient language=English au lieu de Any → les custom formats FR étaient ignorés |
| Queue zombie | Entrées coincées en warning dans la queue Sonarr/Radarr — parfois déjà téléchargées via une autre release |
| Torrents dans la librairie | 828 torrents Transmission dans les mêmes dossiers que la librairie → doublons DEMONPLEX |
| Fichiers orphelins | Dossiers de releases brutes, fichiers .part incomplets, doublons JP/EN |
| Séries mal catégorisées | 3 séries anime classées en standard au lieu de anime (mauvais absolute numbering) |
| Webhook cassé | Un webhook mort qui polluait les logs |
.torrents/ avec la méthode torrent-set-location du RPC — sans casser le seeding/anime//serie tele/.part supprimés| Composant | Statut | Notes |
|---|---|---|
| Sonarr | ✅ OK | 3 profils, séries TV gérées correctement, queue propre |
| Radarr | ✅ OK | 5 profils, films gérés, scores corrigés |
| Prowlarr | ✅ OK | 5 indexers propres, sync auto vers Sonarr/Radarr |
| Bazarr | ✅ OK | Sous-titres FR actifs |
| Overseerr | ✅ OK | Portail de requêtes fonctionnel |
| Transmission | ✅ OK | 828 torrents dans .torrents/, seeding OK |
| DEMONPLEX/Jellyfin | ✅ OK | Plus de doublons depuis la séparation |
| Stack automation VPS | ✅ OK | 5 services Docker, ~650 MB idle |
| Briefing quotidien | ✅ OK | Livré chaque matin 6:55 Montréal |
| Weekly Health Check | ✅ OK | Tous les dimanches 10:00 UTC |
| Point | Risque |
|---|---|
| C411 | Indexer principal — si l'API key expire ou que le site tombe, on perd la source principale |
| FlareSolverr | Est down → les indexers protégés par Cloudflare sont inaccessibles |
| Renouvellement seedbox | Le plan expire en mai 2026 (peut-être déjà renouvelé — à vérifier) |
| Pas de backup automatisé | Pas de backup des configs *Arr ni de la base de données |
| Pas de monitoring d'espace disque proactif | On sait quand c'est plein via le health check, mais pas d'alerte précoce |
| Pas de détection automatique de séries manquantes | Le health check détecte les problèmes MAIS ne les résout pas |
Voici la feuille de route pour transformer cet écosystème en un système qui tourne pratiquement tout seul, avec l'agent Hermes comme superviseur.
Ces améliorations ne coûtent presque rien et apportent une résilience immédiate.
Script cron hebdomadaire → SSH sur le seedbox → export des configs → stockage local VPS
Ce qu'on sauvegarde : - Configurations Sonarr/Radarr/Prowlarr/Bazarr (les .db et config.xml) - Liste des séries et films (export JSON via API) - Custom formats
Outil : Un script Python de 50 lignes + cronjob Hermes no_agent=true
Script cron quotidien → GET /diskspace → si volume > 85% → alerte Telegram
Ne pas attendre 95%. À 85%, on a le temps d'agir avant que les downloads échouent.
Le health check actuel est dominical. Un check quotidien (léger, 2 appels API) sur Prowlarr uniquement permet de détecter un indexer qui tombe en 24h au lieu de 7 jours.
L'API key C411 a une durée de vie. Un check mensuel peut vérifier que les appels à C411 fonctionnent encore (via Prowlarr /indexer/test).
Ces améliorations demandent un peu plus de logique mais restent dans le domaine du scriptable.
Actuellement le health check DÉTECTE les entrées zombie dans la queue. Mais il ne les RÉSOUT pas.
Flux proposé :
1. Script scanne la queue Sonarr/Radarr → trouve les entrées en warning
2. Pour chaque entrée : vérifie via API si l'épisode a déjà un fichier (hasFile=True)
3. Si oui → DELETE /queue/{id}?removeFromClient=false (safe, juste l'affichage)
4. Si non → log dans le rapport sans action (décision humaine)
5. Résumé livré sur Telegram : « 3 zombies nettoyés, 1 épisode vraiment manquant »
Risque : FAIBLE — la seule action destructive (removeFromClient=true) n'est JAMAIS utilisée.
Recyclarr est un outil qui synchronise les configurations *Arr avec les TRaSH Guides (standards de la communauté). Une fois configuré :
french=+50 n'est pas revenu à 0Installation : un binaire sur le VPS + un fichier YAML de config + un cron mensuel.
Actuellement, les requêtes Overseerr nécessitent une approbation manuelle.
Règles d'auto-approbation proposées : - Film standard (pas 4K, pas box set, < 20 Go estimé) → auto-approuver - Série standard (pas 4K, < 3 saisons) → auto-approuver - Film 4K, box set, collection complète → demander confirmation humaine - Espace disque < 50 Go sur le volume cible → refuser avec notification
Implémentation : script Python qui interroge Overseerr /request?filter=pending, applique les règles, POST /request/{id}/approve ou notifie.
FlareSolverr est un conteneur Docker qui résout les challenges Cloudflare pour les indexers. Quand il tombe, les indexers protégés deviennent inaccessibles.
Monitoring :
- Check périodique de la santé FlareSolverr (HTTP GET sur son port)
- Si down → docker restart flaresolverr
- Si toujours down après 3 tentatives → alerte Telegram
Ces améliorations utilisent l'intelligence de l'agent Hermes pour prendre des décisions complexes.
Un agent qui, chaque semaine : 1. Analyse les tendances Overseerr (ce que les utilisateurs demandent) 2. Compare avec ce qui est disponible sur les indexers 3. Suggère des ajouts proactifs : « Cette série est dispo en MULTI 1080p, tendance #1 cette semaine sur Overseerr. L'ajouter ? » 4. L'utilisateur répond « oui » et l'agent fait tout : lookup → add → search
Technologie : cronjob Hermes avec media-management skill, fréquence hebdomadaire.
Quand un download échoue pour une raison complexe (pas juste un zombie), un agent diagnostique :
Utiliser l'historique des downloads pour prédire la qualité : - Quels indexers ont le meilleur taux de succès pour le FR/MULTI ? - Quels types de releases échouent le plus souvent ? - Ajuster automatiquement les priorités d'indexers dans Prowlarr
Implémentation : base SQLite légère sur le VPS, alimentée par les logs des queues Sonarr/Radarr.
Quand l'espace disque atteint 80% : 1. Lister les séries non monitorées (plus suivies) 2. Lister les fichiers les plus volumineux 3. Lister les doublons qualité (ex: on a le 1080p ET le 720p du même épisode) 4. Proposer un plan de nettoyage avec impact estimé en Go 5. L'utilisateur valide et l'agent exécute
Un job cron qui tourne toutes les 6 heures et exécute TOUS les checks précédents en séquence :
Toutes les 6h :
├── Check 1 : Toutes les apps en ligne ?
├── Check 2 : Espace disque < 85% ?
├── Check 3 : Indexers Prowlarr OK ?
├── Check 4 : Queue Sonarr/Radarr propre ?
├── Check 5 : FlareSolverr up ?
├── Check 6 : Briefing livré ce matin ?
└── Rapport consolidé → Telegram (seulement si problème)
Silencieux si tout va bien. L'utilisateur ne reçoit un message que quand quelque chose nécessite son attention.
Un mini-dashboard web (sur le portal evilai.fun) qui affiche en temps réel :
- Statut de tous les services (vert/jaune/rouge)
- Derniers downloads (avec jaquettes)
- Espace disque (jauge visuelle)
- Activité récente (timeline des événements)
- Santé des indexers
Intégré au dashboard existant ou en page dédiée ops.evilai.fun/seedbox.
Un agent Hermes accessible via Telegram qui peut : - « Ajoute la série X » → lookup, choix du profil, add, search - « Pourquoi le download de Y est bloqué ? » → diagnostic complet, résolution - « Quel espace disque il reste ? » → réponse instantanée - « Trouve-moi un film d'action français récent » → recherche Overseerr → proposition - « Fais le ménage » → scan complet, rapport de nettoyage, exécution après approbation
Cet assistant est déjà partiellement possible aujourd'hui — il suffit d'activer le seedbox-management skill dans une conversation Telegram.
Si un deuxième seedbox est ajouté (pour la redondance ou la capacité) : - Synchronisation des configurations *Arr entre les deux seedboxes - Répartition des downloads (load balancing) - Failover automatique si un seedbox tombe
MAINTENANT ─── PHASE 1 ─── PHASE 2 ─── PHASE 3 ─── PHASE 4
(stable) (fondations) (semi-auto) (autonome) (rêve)
│ │ │ │ │
│ backup auto recyclarr curation dashboard
│ alerte disk queue auto conflits assistant
│ prowlarr 24h overseerr prédictif multi-box
│ │ flaresolv scaling
│ │ │ gardien
▼ ▼ ▼ ▼ ▼
juin 2026 ~1-2 sem ~2-4 sem ~1-3 mois ~6+ mois
| Outil | Usage |
|---|---|
| Hermes Agent (cronjobs) | Cerveau central — exécute les scripts, prend des décisions, communique via Telegram |
| Python (scripts no_agent) | Tâches répétitives sans IA — 0 tokens, rapide, fiable |
| arr-http skill | Interface propre avec les APIs *Arr — pas de curl bricolé |
| seedbox-management skill | Connaissances métier — scoring, pièges, procédures |
| Claude CLI | Génération de texte intelligente (briefings, rapports) |
| n8n | Automatisation visuelle pour les workflows complexes |
| Changedetection.io | Surveillance de changements (ex: nouvelle release d'un outil) |
| Cronicle | Planification alternative si Hermes cron ne suffit pas |
| Recyclarr | Synchronisation TRaSH Guides (à installer) |
| Docker | Conteneurisation de tous les services VPS |
| Telegram | Canal de communication principal — rapports, alertes, confirmations |
On est passé d'un seedbox chaotique (64 indexers dont des sites pornos, scores FR à 0, doublons partout, queue zombie) à un système propre et stable (5 indexers, scoring correct, architecture séparée, health checks automatisés).
La prochaine étape est de passer de stable à autonome : un système qui non seulement détecte ses propres problèmes mais les résout, et qui anticipe les besoins avant qu'ils ne deviennent des urgences.
Et au-delà de l'autonomie, la section suivante explore des outils complémentaires pour optimiser l'espace, automatiser la curation, et gérer la rétention — des briques essentielles pour un seedbox qui tourne vraiment tout seul.
Ajout juin 2026 — analyse croisée Hermes + Gemini pour compléter la roadmap vers l'autonomie.
Ces quatre outils sont purement algorithmiques (open-source, pas de LLM, pas de tokens). Ils s'intègrent à la stack existante pour couvrir trois angles morts de notre architecture actuelle : la qualité vidéo automatisée, l'enrichissement de la librairie, et le nettoyage intelligent.
Recyclarr est un outil CLI qui synchronise automatiquement les configurations Sonarr/Radarr avec les TRaSH Guides — les standards de la communauté *Arr.
Ce que ça apporte par rapport à notre setup manuel actuel :
- Les custom formats TRaSH (x265, HEVC, 10bit, groupes à éviter) sont importés automatiquement
- Les scores de priorité sont maintenus à jour sans intervention humaine
- Fini le risque qu'un profil revienne à french=0 sans qu'on le sache
- Supporte nos profils FR/MULTI via les templates de langue
Intégration à notre roadmap : correspond à la Phase 2.2 déjà planifiée. Installation : un binaire sur le VPS, un fichier YAML de config, un cronjob Hermes mensuel.
Configuration type (fichier recyclarr.yml) :
sonarr:
series-fr:
base_url: https://sonarr.evilguard.box.ca
api_key: !env SONARR_API_KEY
quality_definition: series
quality_profiles:
- name: HD-720p/1080p
reset_unmatched_scores: true
qualities:
- name: Bluray-1080p
- name: WEB-1080p
- name: Bluray-720p
custom_formats:
# Priorité x265/HEVC pour économiser l'espace
- names: [x265 (HD), HEVC]
scores: [100]
# On garde notre scoring FR — Recyclarr ne touche pas aux CFs qu'on ne liste pas
- names: [MULTi|DUAL]
scores: [100]
- names: [French Audio]
scores: [50]
- names: [VOSTFR]
scores: [30]
radarr:
movies-fr:
base_url: https://radarr.evilguard.box.ca
api_key: !env RADARR_API_KEY
quality_definition: movie
quality_profiles:
- name: HD-1080p
custom_formats:
- names: [x265 (HD), HEVC]
scores: [100]
- names: [MULTi|DUAL]
scores: [100]
- names: [French Audio]
scores: [50]
⚠️ Recyclarr ne remplace PAS notre scoring FR manuel — il le complète avec les formats techniques (codec, groupe). Les deux couches coexistent.
Kometa (anciennement Plex Meta Manager) s'intègre à DEMONPLEX/Jellyfin pour enrichir la librairie avec des métadonnées et des collections automatisées.
Ce que ça fait concrètement : - Crée des collections dynamiques basées sur des listes Trakt, IMDb, TMDb, Letterboxd - Exemple : collection « Top 250 IMDb », « Animés de la saison », « Films français primés » - Interroge Radarr/Sonarr pour identifier les médias manquants dans ces collections - Peut déclencher automatiquement l'ajout des titres manquants dans Radarr/Sonarr
Pourquoi c'est pertinent pour nous : - Plus besoin de chercher manuellement « quels films français sont sortis ce mois-ci » - Kometa fait la curation éditoriale et Overseerr gère l'approbation - Les collections apparaissent dans DEMONPLEX comme des catégories « Netflix-style »
Intégration à notre roadmap : ce n'est pas dans les phases 1-4 actuelles — c'est une couche supplémentaire entre la Phase 2 (semi-auto) et la Phase 3 (curation agent). Kometa automatise la curation éditoriale pendant que l'agent Hermes garde la supervision stratégique.
Installation : conteneur Docker sur le VPS, config YAML pointant vers l'API DEMONPLEX et les APIs *Arr. Cron quotidien.
Tdarr et Unmanic sont des moteurs d'analyse et de transcodage vidéo qui tournent en arrière-plan.
Le problème qu'ils résolvent : Beaucoup de releases sont encodées en H.264, un codec qui produit des fichiers volumineux. Le H.265 (HEVC) offre une qualité visuelle identique pour une taille de fichier 40 à 60% inférieure.
Fonctionnement :
1. Le moteur scanne le dossier /home/evilguard/files/
2. Identifie les fichiers H.264 (via ffprobe)
3. Transcode la piste vidéo en H.265 tout en copiant l'audio et les sous-titres sans perte
4. Remplace le fichier original (ou le place à côté selon la config)
Gain estimé pour notre librairie : - 828 torrents seedés × moyenne ~2-5 Go par fichier → potentiellement 2-4 To d'espace récupéré - Pour de l'anime en 1080p : réduction typique de 1.5 Go → 600 Mo par épisode
⚠️ Mises en garde critiques :
| Risque | Détail |
|---|---|
| Hardlinks | Le transcodage casse les hardlinks Transmission. Solution : transcoder UNIQUEMENT dans la librairie (pas dans .torrents/). Transmission continue à seeder le fichier original H.264. |
| CPU intensif | Le transcodage est très lourd. Sur un seedbox partagé (Whatbox), c'est probablement interdit par les ToS. Solution : faire tourner Tdarr sur le VPS Hostinger, télécharger le fichier, le transcoder, le re-uploader. Ou utiliser un worker node externe. |
| Qualité | Un mauvais preset peut dégrader l'image. Utiliser libx265 avec preset=slow et crf=22-24 pour un résultat transparent. |
Recommandation : commencer par un test sur 5-10 fichiers anime (les plus petits, les plus rapides) via Unmanic en mode dry-run pour mesurer le gain réel avant de déployer à grande échelle.
Intégration à notre roadmap : Phase 3 (autonomie avancée) ou Phase 4 (rêve). C'est le projet le plus lourd techniquement, mais avec le plus gros retour sur investissement en espace disque.
Maintainerr est une interface de règles de rétention pour Plex/Jellyfin/*Arr.
Le problème : actuellement, rien ne supprime jamais rien. Les séries terminées qu'on a regardées il y a 3 ans dorment sur le disque pour toujours.
Règles de rétention proposées :
| Règle | Délai | Justification |
|---|---|---|
| Série terminée, tous les épisodes vus | Supprimer après 30 jours | Si on l'a finie et qu'on l'a regardée, pas besoin de garder |
| Film regardé | Supprimer après 90 jours | On peut toujours le re-télécharger si on veut le revoir |
| Série/film jamais regardé | Supprimer après 6 mois | Si en 6 mois personne ne l'a regardé, c'est qu'il n'intéresse pas |
| Anime en VO japonaise (sans VF) | Conserver indéfiniment | L'anime est une collection, pas juste de la consommation |
| Contenu ajouté manuellement (watchlist) | Ne jamais supprimer | L'utilisateur a explicitement demandé ce contenu |
Détails techniques :
- Maintainerr se connecte à DEMONPLEX pour savoir ce qui a été regardé
- Se connecte à Sonarr/Radarr pour déclencher la suppression
- Utilise deleteFiles=false par défaut (retire juste de la librairie *Arr)
- Mode dry-run disponible pour simuler avant d'exécuter
Économie potentielle : en appliquant ces règles, on pourrait libérer 30-50% de l'espace occupé par du contenu déjà consommé.
Intégration à notre roadmap : correspond à la Phase 3.4 (auto-scaling de la librairie). Maintainerr est la brique technique qui implémente les règles de décision. L'agent Hermes garde la supervision : « 12 séries et 8 films éligibles à la suppression — exécuter ? »
OUTIL → PHASE ACTUELLE EFFORT GAIN PRINCIPAL
─────────────────────────────────────────────────────────────
Recyclarr → Phase 2.2 ★☆☆ Profils toujours à jour
Kometa → Phase 2.5 (NEW) ★★☆ Curation éditoriale auto
Tdarr/Unmanic → Phase 3 (avancé) ★★★ Gain 40-60% espace disque
Maintainerr → Phase 3.4 ★★☆ Nettoyage intelligent
Aucun de ces outils ne consomme de tokens LLM. Ce sont des binaires/containers open-source qui tournent en cron ou en daemon. L'agent Hermes reste le superviseur : il reçoit les rapports, valide les actions destructives, et garde la vue d'ensemble.
Ajout juin 2026 — Claude Sonnet 4.6 a identifié des angles morts que ni la roadmap initiale ni Gemini n'avaient couverts.
Ces sept points ne sont pas des « features à construire » mais des trous de sécurité opérationnelle : des risques qui ne sont pas détectés par nos health checks actuels. La plupart se résolvent avec des scripts de 20 à 50 lignes.
Le problème (rappel) : FlareSolverr est le proxy qui contourne les challenges Cloudflare pour les indexers protégés. Il est actuellement down chez nous (signalé « All indexer proxies unavailable » dans Prowlarr). Avec l'évolution de Cloudflare vers Turnstile (challenges invisibles), le FlareSolverr classique (v1/v2) est cassé pour de bon.
La solution en 2026 — fork 21hsmw : - Le fork FlareSolverr v3 / 21hsmw intègre le support Turnstile et des challenges JS plus modernes - Alternative : FlareSolverr-rotating-HA avec un pool de proxies résidentiels - Ces forks ne sont pas « officiels » mais ils sont activement maintenus et testés contre les défis Cloudflare actuels
Plan d'action :
1. Vérifier si C411 est réellement derrière Cloudflare → curl -I https://c411.org (chercher cf-ray dans les headers)
2. Si oui : remplacer le conteneur FlareSolverr actuel par le fork 21hsmw (docker pull 21hsmw/flaresolverr:latest)
3. Tester dans Prowlarr : POST /indexer/test sur l'indexer C411
4. Si le test passe → redéployer, sinon → chercher un proxy résidentiel ou un autre indexer FR
Si FlareSolverr reste cassé : chercher un indexer FR/MULTI qui n'est PAS derrière Cloudflare (YGG est mort, Pirate Bay est public → les releases FR y sont rares). Alternatives à évaluer : Sharewood, TheCinemaClub, un tracker FR privé.
⚠️ Note : certains seedbox (dont Whatbox) peuvent bloquer FlareSolverr par politique. Vérifier les ToS avant de redéployer.
Priorité : 🔴 Urgent si C411 est derrière CF et FlareSolverr est down. Un indexer principal inaccessible = tout le téléchargement FR est bloqué.
La règle d'or est « Transmission = off-limits pour toute écriture ». 100% d'accord.
Mais ça ne veut pas dire zéro visibilité. Un script read-only qui interroge le RPC Transmission peut donner des alertes vitales sans jamais toucher à un torrent.
Ce que le script lit (via transmission-remote) :
- Ratio de chaque torrent (upload/download)
- Temps de seed
- Torrents en erreur (status=error)
- Trackers muets (pas de réponse depuis X heures)
- Torrents en pause/arrêtés anormalement
Alarmes à configurer :
| Alerte | Seuil | Risque |
|---|---|---|
| Ratio < 0.5 après 7 jours | 🟠 Warning | Vérifier le tracker — ratio faible = bannissement possible |
| Ratio < 1.0 après 30 jours | 🔴 Critique | Hit-and-run sur tracker privé → ban |
| Torrent en erreur | 🔴 Critique | Fichier perdu, tracker down, ou ratio mort |
| Tracker muet > 24h | 🟠 Warning | Le tracker est down, pas le torrent |
Script minimal (SSH, read-only, 0 tokens) :
# Via SSH sur le seedbox (transmission-remote est installé par défaut sur Whatbox)
ssh evilguard@goji.whatbox.ca 'transmission-remote --list' | \
awk 'NR>2 {print $1, $2, $4, $5, $6}' | \
python3 -c "
import sys, json
for line in sys.stdin:
parts = line.strip().split()
if len(parts) >= 5:
tid, done, size, ratio, status = parts[0], parts[1], parts[2], parts[3], parts[4]
# Ratio parsing — transmission-remote affiche '0.0', '1.5', 'None', 'N/A'
try:
r = float(ratio)
if r < 0.5 and float(done.rstrip('%')) >= 100:
print(f'LOW RATIO: torrent {tid} seeded {done}, ratio={r}')
except ValueError:
pass # skip non-numeric ratios
"
Sécurité : le script utilise transmission-remote --list qui est purement read-only. Aucun flag --remove, --stop, --start, --verify ne figure dans la commande. Le seul appel modifiant quoi que ce soit déclencherait une alarme dans l'audit du script.
Résultat : un cronjob Hermes quotidien (no_agent=true) qui alerte Telegram seulement si des torrents dépassent les seuils de ratio. Silencieux sinon.
État actuel : 5 indexers dans Prowlarr. 4 sont des trackers anime (Nyaa.si, SubsPlease, Tokyo Toshokan, Shana Project). Un seul indexer couvre le contenu général FR/MULTI : C411.
Si C411 tombe (API key expirée, maintenance, Cloudflare qui bloque, ban du compte) : - ✅ Anime continue à fonctionner (Nyaa + SubsPlease) - ❌ Films FR, séries FR, tout le contenu MULTi/VF — plus aucun téléchargement possible
Solutions à évaluer :
| Option | Effort | Avantage | Inconvénient |
|---|---|---|---|
| Ajouter un 2e tracker FR privé (ex: Sharewood, TheCinemaClub) | ★★★ | Redondance totale | Nécessite une inscription/invitation |
| Indexer public FR (ex: Cpasbien, OxTorrent — via Jackett) | ★☆☆ | Rapide, pas d'invitation | Qualité aléatoire, pas de ratio à protéger |
| Usenet (indexer + provider) | ★★★ | Complémentaire au torrent, pas de ratio, plus rapide | Coût mensuel (~10-30€), courbe d'apprentissage |
| Rester sur C411 seul + alertes | ★☆☆ | Rien à faire | Aucune redondance — si C411 tombe, tout s'arrête |
Recommandation immédiate : option la moins chère = ajouter un indexer public FR dans Prowlarr (via Jackett si nécessaire) comme fallback silencieux. Configuré avec un score plus bas que C411 dans les profils de qualité, il ne sera jamais choisi sauf si C411 est indisponible.
À faire cette semaine : vérifier quels indexers publics FR sont encore actifs en 2026 → test de connexion via Prowlarr POST /indexer/test.
État actuel : ntfy tourne sur le VPS (port 2586) mais n'est utilisé par rien. Le canal d'alerte principal est Telegram (via les cronjobs Hermes et le deliver).
Le risque : si Hermes ou Telegram est down (rate-limit, blocage IP, panne du gateway), les alertes critiques (disque plein, tracker down, ratio faible) n'arrivent pas.
Plan (effort minimal) : 1. Le script de monitoring ratio (12.2) et le health check hebdo envoient aussi vers ntfy 2. ntfy est configuré avec un webhook vers Home Assistant (si utilisé) 3. L'app ntfy sur le téléphone reçoit les alertes critiques même si Telegram est muet
Une ligne dans un script :
curl -s -d "ALERTE: Ratio faible torrent #42 — ratio=0.3" https://ntfy.evilai.fun/seedbox-alerts
Aucun changement d'infrastructure — ntfy est déjà déployé, juste pas utilisé.
État actuel : Changedetection.io surveille des sites web pour le briefing (changements de contenu). Mais on ne surveille pas les pages de statut de notre propre infra.
2 URLs à ajouter (30 secondes) :
1. Page de statut C411 (s'ils en ont une) ou page d'accueil C411 (détecte si le site est down)
2. Page de statut Whatbox : https://whatbox.ca/status ou leur page d'incidents
Avantage : Changedetection alerte AVANT que le health check hebdo ne détecte la panne — et avant que toi tu ne remarques que les downloads sont bloqués depuis 3 jours.
Effort : 0 code. 2 URLs dans l'interface Changedetection.io. Notification vers ntfy ou Telegram.
Le problème : Bazarr télécharge des sous-titres, mais personne ne vérifie leur qualité. Un sous-titre VOSTFR peut être : - Parfaitement synchronisé - Décalé de 2 secondes (agaçant mais lisible) - Complètement désynchronisé (inutilisable) - Partiel (seulement les 10 premières minutes) - Machine-translated (qualité médiocre)
Solution : un script subliminal (CLI Python) peut :
1. Scanner les fichiers déjà sous-titrés par Bazarr
2. Scorer chaque sous-titre (match de nom, hash, score de confiance)
3. Reporter ceux qui sont en dessous d'un seuil
# Exemple — subliminal score les sous-titres existants
subliminal --verbose download -l fr --age 7d /home/evilguard/files/serie\ tele/
# En mode --dry-run, il liste ce qu'il téléchargerait SANS rien modifier
Priorité : 🟢 Faible. C'est un problème de qualité, pas de fonctionnement. Mettre ça en Phase 3 (quand les urgences sont réglées).
Le problème : le scoring Custom Formats favorise les releases marquées MULTI, mais personne ne vérifie que la piste audio FR est réellement présente dans le fichier. Les releases sont taguées par les uploaders, pas par une vérification automatique.
Scénario réel : un uploader tag MULTi parce que le fichier MKV a un flag de langue fra dans ses métadonnées — mais la piste est vide, mal encodée, ou pire : c'est une VOSTFR taguée MULTI par erreur. Sonarr l'importe avec un score de +100, et DEMONPLEX affiche le film comme « disponible en français ».
Solution — script ffprobe hebdomadaire sur un échantillon aléatoire :
# 1. Lister les 20 derniers imports Sonarr/Radarr
# 2. Via SSH, ffprobe sur chaque fichier
# 3. Vérifier la présence d'une piste audio avec lang=fre/fra
# 4. Si absent → alerte « MULTI tagué mais pas de piste FR »
# Commande type (sur un fichier)
ssh evilguard@goji.whatbox.ca \
"ffprobe -v quiet -show_entries stream=index,codec_type,codec_name:stream_tags=language \
-of json 'FICHIER.mkv'" | \
python3 -c "
import sys, json
tracks = json.load(sys.stdin)
has_fr = any(
s.get('codec_type') == 'audio' and
s.get('tags', {}).get('language', '') in ('fre', 'fra')
for s in tracks.get('streams', [])
)
print('OK' if has_fr else 'PAS DE PISTE FR')
"
Fréquence : hebdomadaire, sur les 20 derniers imports. Si > 10% des fichiers n'ont pas de piste FR malgré le scoring MULTI → alerte Telegram.
Coût : ~5 secondes par fichier × 20 fichiers = ~2 minutes par semaine. SSH read-only, aucun fichier modifié.
Priorité : 🟡 Moyenne. Pas urgent mais ça ferme un angle mort réel. Si 15% de notre librairie MULTI n'a pas de français en pratique, tout le scoring est compromis.
| # | Angle mort | Effort | Impact | Phase suggérée |
|---|---|---|---|---|
| 12.1 | FlareSolverr fork / bypass | ★★☆ | 🔴 Critique si C411 CF | IMMÉDIAT |
| 12.2 | Transmission R/O ratios | ★☆☆ | 🟠 Protège trackers privés | Phase 1 (cette semaine) |
| 12.5 | Changedetection C411/Whatbox | ★☆☆ | 🟠 Alerte avant panne | Phase 1 (cette semaine) |
| 12.4 | ntfy bus secondaire | ★☆☆ | 🟡 Canal d'alerte backup | Phase 1 (cette semaine) |
| 12.3 | Redondance indexer FR | ★★☆ | 🟠 Évite panne totale | Phase 2 |
| 12.7 | ffprobe validation piste FR | ★★☆ | 🟡 Qualité long terme | Phase 3 |
| 12.6 | Bazarr qualité sous-titres | ★★☆ | 🟢 Cosmétique | Phase 3+ |
Ce qui peut être fait ce weekend : les items 12.1, 12.2, 12.4, 12.5 — les quatre ensemble prennent moins de 2 heures et ferment les risques les plus critiques.
Ajout juin 2026 — GPT-4o a analysé l'ensemble du document. Sur ses 8 recommandations, 4 étaient déjà couvertes (points 2, 4, 5, 7) et 4 apportent un regard architectural nouveau.
L'analyse de GPT est centrée sur une idée-force : le système ne manque pas de monitoring — il manque de boucles fermées. Détecter un problème, c'est bien. Le réparer automatiquement et n'alerter que si la réparation échoue, c'est l'autonomie.
État actuel : la plupart de nos checks s'arrêtent à l'étape « detect + report ». Le health check hebdo liste les problèmes et attend l'humain. Même les scripts no_agent (hourly_collect, morning_briefing) sont des collecteurs, pas des réparateurs.
Le modèle cible en 5 étapes :
DÉTECTER → VÉRIFIER → RÉPARER → CONFIRMER → ESCALADER
(script) (cross- (action (re-check (seulement
check) safe) post-action) si échec)
Exemple concret — nettoyage de queue zombie :
| Étape | Action | Qui |
|---|---|---|
| Detect | GET /queue → entrées warning détectées |
Script no_agent (toutes les 6h) |
| Verify | GET /episode?seriesId=X → hasFile=True ? |
Même script, cross-check API |
| Repair | DELETE /queue/{id}?removeFromClient=false |
Script (safe — ne touche pas Transmission) |
| Confirm | GET /queue → l'entrée a disparu ? |
Script, 2 secondes après |
| Escalate | Si hasFile=False ET entrée toujours en warning → Telegram |
Hermes cronjob avec contexte |
Le point clé de GPT : ne jamais escalader avant d'avoir essayé de réparer. Si la réparation échoue, le message Telegram arrive AVEC le diagnostic et la tentative échouée — l'humain n'a pas à refaire l'enquête.
Ce modèle s'applique à :
- Queue zombie → auto-clean si hasFile=True
- Indexer down → auto-retest 3× en 30 minutes avant d'alerter
- Import bloqué → auto-retrigger EpisodeSearch 1× avant d'alerter
- Disque > 85% → auto-dry-run Maintainerr, proposer la liste, ne pas supprimer
Ce qui ne s'automatise PAS (escalade immédiate) :
- Tout ce qui touche à deleteFiles=true
- Tout ce qui touche à Transmission (même en lecture, on ne répare pas)
- Changement de profil de qualité (risque de re-download massif)
- Approbation Overseerr > 50 Go (séries complètes, 4K)
État actuel : Phase 1.1 propose un backup quotidien des configs *Arr (bases SQLite, config.xml, Custom Formats). Mais le document ne mentionne pas la restauration de test.
Ce que GPT souligne (et il a raison) : « A backup you haven't restored is a guess, not a backup. »
Procédure de test de restauration — à exécuter 1× par mois :
1. Créer un conteneur Sonarr jetable (Docker, port aléatoire, volume vide)
2. Restaurer le dernier backup SQLite + config.xml dans le conteneur
3. Vérifier que :
- Les séries sont listées (count = même que prod)
- Les profils de qualité ont les bons scores (french=+50, MULTI=+100)
- Les indexers Prowlarr sont joignables (test de connexion)
- Les root folders sont montés (ou au moins listés)
4. Détruire le conteneur
Automatisation : un script test_restore.sh exécuté par un cronjob Hermes mensuel (no_agent=true). Il spin un conteneur, restaure, valide 4 assertions, nettoie, et envoie ✅ Restore test OK ou ❌ Restore test FAILED: <raison> sur Telegram.
Coût : ~2 minutes de CPU par mois. Aucun token. Juste Docker + curl.
État actuel : le dry-run est mentionné à plusieurs endroits (Maintainerr en 11.4, cleanup filesystem en section 8, Unmanic en 11.3) mais comme une suggestion locale, pas comme une règle transverse.
Ce que GPT recommande : toute action destructive doit avoir un mode dry-run obligatoire avant exécution. Et ce dry-run doit être traçable (loggé, horodaté, avec le résultat affiché).
Politique proposée — à appliquer à tous les nouveaux scripts :
# Template standard pour tout script destructif
DRY_RUN = os.environ.get("DRY_RUN", "true").lower() == "true"
def delete_queue_entry(queue_id):
if DRY_RUN:
log(f"[DRY-RUN] Would delete queue entry {queue_id}")
return {"simulated": True, "id": queue_id}
else:
resp = call("sonarr", "DELETE", f"queue/{queue_id}",
params={"removeFromClient": "false"})
log(f"[LIVE] Deleted queue entry {queue_id} — status: {resp}")
return resp
Règle : le cronjob passe toujours en DRY_RUN=true en première exécution. Le rapport arrive sur Telegram : « 12 entrées à nettoyer, 3 indexers à retester, 0 fichier à supprimer. Envoyer EXECUTE pour lancer. »
L'humain répond EXECUTE → le cronjob repasse avec DRY_RUN=false.
C'est plus lent qu'un auto-clean silencieux, mais c'est infiniment plus sûr. Et après 2-3 semaines sans faux positifs, on peut passer certains nettoyages en auto (queue zombie, retest indexer) tout en gardant le dry-run obligatoire pour les suppressions de fichiers.
C'est la recommandation architecturale la plus structurelle de GPT.
État actuel — ce qui contrôle quoi :
Hermes cronjobs (5) → health check, briefing, collecte RSS
n8n → workflows visuels (installé, peu utilisé)
Cronicle → scheduler alternatif (installé, inutilisé)
Scripts no_agent (3) → hourly_collect, morning_briefing, briefing_prune
cron (système) → aucun (tout passe par Hermes)
Le problème : si on ajoute 5 nouveaux scripts pour la Phase 1 (backup, disk alert, Prowlarr check, ratio Transmission, FlareSolverr check), on se retrouve avec ~10 jobs indépendants qui ne se parlent pas. Si le job « disk alert » détecte un disque plein pendant que le job « Prowlarr check » essaie de lancer un search, personne ne fait le lien.
La recommandation de GPT : un orchestrateur unique qui : 1. Possède l'état — sait ce qui est en cours, ce qui a échoué, ce qui est bloqué 2. Séquence les actions — ne lance pas un search si le disque est à 90% 3. Centralise les alertes — un seul flux Telegram, pas 10 jobs qui ping chacun de leur côté 4. Survit aux pannes — si le VPS reboot, l'orchestrateur reprend là où il était
Deux candidats naturels dans notre stack :
| Option | Avantages | Inconvénients |
|---|---|---|
| n8n (port 5678) | Déjà installé, workflows visuels, 400+ intégrations, webhooks natifs, gestion d'erreur intégrée | Consomme ~350 MB RAM, logique dans une UI (pas dans Git), courbe d'apprentissage |
| Hermes cronjobs chaînés | Pas de nouveau service, tout en code (Git), token-efficient, déjà maîtrisé | Pas de séquencement natif entre jobs, pas de mémoire d'état partagée, parallélisme manuel |
Recommandation : rester sur Hermes comme cerveau central (les cronjobs existent déjà, on les maîtrise) mais ajouter un job « superviseur » unique qui remplace les jobs indépendants de la Phase 1 :
Toutes les heures — job superviseur (no_agent=false, 1 seul job) :
├── 1. Script backup_configs.py (no_agent: backup DB → .tar.gz)
├── 2. Script check_disk.py (no_agent: alert si >85%)
├── 3. Script check_prowlarr.py (no_agent: indexers OK ?)
├── 4. Script check_flaresolverr.py (no_agent: FlareSolverr répond ?)
├── 5. Script check_transmission.py (no_agent: ratios, via SSH R/O)
├── 6. Agent (Hermes) — consolide les 5 rapports
│ → Si tout OK : silencieux (pas de message)
│ → Si 1-2 warnings : 1 message consolidé Telegram
│ → Si critique (disque >95%, C411 down) : ALERTE immédiate
└── 7. Agent — si dry-run approuvé, exécute les réparations safe
Avantage : un seul job à superviser, un seul flux Telegram, une seule boucle de décision. Les scripts restent indépendants et testables unitairement — le job superviseur les orchestre.
Évolution future : si la complexité explose (20+ scripts, dépendances entre eux), migrer vers n8n. Mais pour la Phase 1-2, Hermes + 1 job superviseur est le bon ratio simplicité/puissance.
Quatre des huit recommandations de GPT sont déjà traitées dans les sections précédentes. Il les a identifiées indépendamment, ce qui renforce leur priorité :
| Point GPT | Déjà couvert dans | Priorité validée |
|---|---|---|
| #2 — Single points of failure (C411, FlareSolverr) | Sections 12.1, 12.3 [🤖 Claude] | 🔴 Critique |
| #4 — Layered monitoring (daily, pas weekly) | Phase 1 + Sections 12.2, 12.4, 12.5 [🤖 Claude] | 🟠 Baseline |
| #5 — ffprobe post-import validation | Section 12.7 [🤖 Claude] | 🟡 Qualité |
| #7 — Recyclarr pour config drift | Phase 2.2 + Section 11.1 [🤖 Gemini] | 🟡 Stabilité |
Ce recoupement est précieux : trois modèles différents (Gemini, Claude, GPT) ont identifié indépendamment les mêmes risques. Ça valide le diagnostic.
| # | Contribution | Type | Intégration |
|---|---|---|---|
| 13.1 | Boucle fermée detect→verify→repair→confirm→escalate | Nouveau modèle | À appliquer à tous les nouveaux scripts Phase 1-2 |
| 13.2 | Backup test restore (pas juste backup) | Ajout à Phase 1.1 | Ajouter test_restore.sh mensuel au plan Phase 1 |
| 13.3 | Dry-run first comme politique système | Formalisation | Template Python standard, flag DRY_RUN obligatoire |
| 13.4 | Orchestrateur unique (pas 10 jobs indépendants) | Nouvelle architecture | Job superviseur Hermes qui consolide les scripts Phase 1 |
| — | Points 2,4,5,7 | Confirmation | Déjà couverts — priorité renforcée |
La phrase à retenir de GPT : « The project doesn't need more automation first. It needs safer automation first. »
C'est le principe directeur pour toute la Phase 1 : chaque nouveau script commence par un dry-run, chaque réparation est vérifiée après coup, et l'humain n'est dérangé que si la machine a échoué.
Ajout juin 2026 — Grok 4 a fourni l'analyse la plus « terrain » des quatre modèles. Il a confirmé 8 points déjà couverts et apporté 2 outils que personne d'autre n'avait mentionnés, plus 2 améliorations concrètes.
L'approche de Grok est résolument orientée seedbox privé + tracker privé : IRC racing, tableau de bord natif *Arr, cross-seed. C'est le seul modèle qui a parlé le langage du power-user de tracker.
Grok a identifié 8 points déjà traités — le taux de recoupement le plus élevé des quatre contributeurs. C'est une excellente nouvelle : cinq modèles indépendants convergent sur les mêmes priorités.
| Point Grok | Déjà couvert dans | Statut |
|---|---|---|
| Backup auto + test restore | Phase 1.1 + Section 13.2 [🤖 GPT] | ✅ Couvert, priorité renforcée |
| Transmission R/O monitoring | Section 12.2 [🤖 Claude] | ✅ Couvert |
| Disk alerts >85% | Phase 1.2 | ✅ Couvert |
| Recyclarr | Phase 2.2 + Section 11.1 [🤖 Gemini] | ✅ Couvert |
| Tdarr/Unmanic | Section 11.3 [🤖 Gemini] | ✅ Couvert |
| Maintainerr/Kometa | Sections 11.2, 11.4 [🤖 Gemini] | ✅ Couvert |
| ffprobe validation FR | Section 12.7 [🤖 Claude] | ✅ Couvert |
| Fallback indexers FR | Section 12.3 [🤖 Claude] | ✅ Couvert |
C'est LA contribution majeure de Grok. Aucun des quatre autres modèles n'a mentionné autobrr, et c'est pourtant l'outil le plus impactant pour un seedbox avec tracker privé.
autobrr est un daemon qui surveille les annonces IRC des trackers privés en temps réel. Là où Prowlarr poll les flux RSS toutes les ~15-30 minutes, autobrr reçoit l'annonce instantanément via IRC.
La différence concrète :
Prowlarr RSS (actuel) : [sortie du release] ... 15-30 min ... [Prowlarr voit] → [envoie à Sonarr] → [recherche]
autobrr IRC (cible) : [sortie du release] → [autobrr reçoit] → [push instantané] → [Sonarr import]
└── délai : < 5 secondes ──┘
Pourquoi c'est critique pour nous : - Sur C411 (tracker privé), les releases populaires ont des centaines de leechers dans les 60 premières secondes - Plus on arrive tôt dans le swarm, plus on upload → meilleur ratio - Pour le contenu FR/MULTI, être dans les premiers = différence entre ratio 2.0 et ratio 0.3 - autobrr peut appliquer des filtres complexes (langue, résolution, taille, release group) AVANT de push → pas de bruit
Filtre type pour notre stack :
# Exemple — filtre autobrr pour contenu FR/MULTI
filters:
- name: "FR-MULTI-1080p"
match_releases: "MULTi.*1080p|FRENCH.*1080p|VFQ.*1080p"
must_not_contain: ["4K", "2160p", "CAM", "TS", "HC"]
min_size: "500MB"
max_size: "15GB"
actions:
- type: "sonarr"
- type: "radarr"
Architecture de déploiement : - autobrr tourne sur le VPS Hostinger en conteneur Docker (~50 MB RAM) - Il se connecte au canal IRC de C411 (si C411 a un announce channel IRC — à vérifier) - Il push directement vers Sonarr/Radarr sur le seedbox via leurs API HTTPS - Si C411 n'a PAS d'IRC, autobrr peut quand même servir de filtre avancé sur les flux RSS
Priorité : 🟠 Phase 2. C'est le plus gros saut qualitatif en termes d'automatisation après la Phase 1. À planifier juste après Recyclarr.
Note : il faut vérifier que C411 a un canal IRC d'annonce. Les trackers privés français n'ont pas toujours cette infrastructure. Si IRC n'est pas dispo, le mode RSS filtré d'autobrr reste utile mais perd l'avantage de vitesse.
Notifiarr est un pont entre les applications *Arr et Discord (ou d'autres plateformes). C'est le seul outil de la liste qui offre une intégration native et bidirectionnelle avec Sonarr, Radarr, Prowlarr, et Bazarr.
Ce que ça apporte par rapport à notre setup actuel (Telegram + Hermes cron) :
| Fonctionnalité | Actuel (Telegram) | Avec Notifiarr |
|---|---|---|
| Notifications de grab/import | ❌ Aucune | ✅ « Film X importé en 1080p MULTi » |
| Dashboard web en temps réel | ❌ Aucun | ✅ Vue unifiée de TOUS les *Arr |
| Alertes de santé | Hebdo uniquement | ✅ Push instantané si un service down |
| Historique des downloads | Via API, manuellement | ✅ Timeline visuelle |
| Gestion des requêtes | Via Overseerr uniquement | ✅ Vue combinée Overseerr + *Arr |
Le dashboard Notifiarr en particulier : une interface web qui montre l'état de Sonarr, Radarr, Prowlarr, Bazarr en une seule page — downloads en cours, espace disque, santé des indexers, erreurs récentes. C'est ce que notre roadmap Phase 4.1 envisageait de construire manuellement.
Points de friction :
| Inconvénient | Détail |
|---|---|
| Discord-centric | Notifiarr est conçu pour Discord en premier. Les notifications Telegram nécessitent un webhook intermédiaire ou Notifiarr → ntfy → Telegram. |
| Compte requis | Nécessite un compte sur notifiarr.com (gratuit, mais c'est une dépendance externe) |
| Chevauchement avec Hermes | Si Hermes fait déjà le health check, ajouter Notifiarr = doublon partiel. À utiliser en complément (temps réel), pas en remplacement (analyse). |
| Pas de français | L'interface est en anglais uniquement |
Recommandation : installer Notifiarr en complément du health check Hermes, pas en remplacement. Hermes garde l'analyse hebdomadaire approfondie + le dry-run + les actions. Notifiarr apporte le temps réel et le dashboard visuel que Hermes ne peut pas fournir (pas d'interface web).
Déploiement : conteneur Docker sur le VPS Hostinger (~50 MB RAM). Configuration via une interface web. Connexion aux API *Arr existantes.
Priorité : 🟡 Phase 2-3. Utile mais pas critique. Les notifications Telegram + Hermes couvrent déjà l'essentiel. Notifiarr est un confort, pas une nécessité.
État actuel : Phase 1.1 mentionne rsync comme outil de backup. Grok suggère BorgBackup comme alternative plus puissante.
Différence rsync vs Borg :
| rsync | BorgBackup | |
|---|---|---|
| Copie | Miroir exact (full copy) | Snapshots dédupliqués |
| Espace | Chaque backup = copie complète | Seules les différences sont stockées |
| Historique | 1 version (la dernière) | N versions (configurable : 7j, 4 semaines, 6 mois) |
| Chiffrement | Non (ou couche externe) | Natif (AES-256) |
| Compression | Non | LZ4/zstd (compressé + dédupliqué) |
Pour nos backups de config *Arr : - Bases SQLite + XML = ~50-100 Mo par backup - Avec Borg : 30 jours d'historique = ~100 Mo + incréments (~5 Mo/jour) = ~250 Mo total - Avec rsync : 30 jours × 100 Mo = 3 Go (ou on ne garde que la dernière)
Script type :
#!/bin/bash
# Backup quotidien des configs *Arr vers Borg
export BORG_PASSPHRASE="$(cat /root/.borg_passphrase)"
# Initialiser le repo (première fois)
borg init --encryption=repokey /mnt/backups/seedbox-configs.borg
# Backup
borg create --stats --compression lz4 \
/mnt/backups/seedbox-configs.borg::'{hostname}-{now:%Y-%m-%d}' \
/home/evilguard/.arr_keys.json \
/home/evilguard/.config/Sonarr/Backups/ \
/home/evilguard/.config/Radarr/Backups/ \
/home/evilguard/.config/Prowlarr/Backups/
# Nettoyage : garder 7 jours, 4 semaines, 6 mois
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
/mnt/backups/seedbox-configs.borg
⚠️ Stockage hors-seedbox : Grok a raison d'insister là-dessus. Si le seedbox est compromis, un backup stocké SUR le seedbox ne sert à rien. La destination doit être le VPS Hostinger (
/root/backups/seedbox/). Le script tourne sur le VPS et pull les backups via SSH — c'est le VPS qui va chercher les données, pas le seedbox qui les push.
Priorité : 🟠 Phase 1.1 (backup). Borg remplace rsync dans le plan Phase 1. Même effort, meilleur résultat.
C'est l'idée la plus « IA » de Grok : utiliser l'historique des imports pour entraîner des décisions futures.
Le concept : 1. Analyser l'historique Sonarr/Radarr (1-6 mois) via leur API 2. Croiser avec les succès/échecs de download 3. Identifier les release groups fiables pour le contenu FR/MULTI 4. Bloquer automatiquement (ou baisser le score) des groupes problématiques
Ce que ça pourrait révéler (exemples hypothétiques) :
| Release group | Taux de succès FR | Action |
|---|---|---|
EXTREME |
94% (47/50 imports OK) | ✅ Fiable — garder le score standard |
FASTSUB |
62% (31/50 imports OK) | ⚠️ Instable — baisser le score ou bloquer si <70% |
FRENCHiES |
98% (49/50 imports OK) | ✅ Très fiable — augmenter le score |
Implémentation :
- Script Python qui interroge /api/v3/history?pageSize=500 (Sonarr) et /api/v3/history?pageSize=500 (Radarr)
- Parse le nom de la release pour extraire le groupe (dernier segment après -)
- Croise avec le statut de l'import (imported vs failed)
- Génère un rapport : « 3 groupes à bloquer, 2 groupes recommandés »
- L'humain valide avant application
Où ça s'intègre : ce n'est pas dans les phases 1-4 actuelles. C'est une couche d'intelligence qui peut s'ajouter à partir de la Phase 3. Pas de nouvelle dépendance — juste de l'analyse de données existantes.
Priorité : 🟢 Phase 3+. Intéressant mais pas urgent. Les Custom Formats TRaSH + Recyclarr couvrent déjà une partie de ce besoin.
Grok a pointé deux métriques spécifiques que nos health checks actuels ne couvrent pas :
Bazarr — santé des providers de sous-titres :
- GET /api/providers → vérifier qu'au moins 1 provider FR est activé
- GET /api/system/languages → vérifier que fr est dans les langues
- Si 0 providers FR actifs → Bazarr télécharge 0 sous-titres, et le compteur wanted reste à 0 (sans erreur visible)
- C'est un silent failure — tout a l'air de marcher, mais rien ne se passe
Prowlarr — statut de la dernière synchronisation :
- GET /api/v1/indexerstats → vérifier la date du dernier sync réussi
- Si le dernier sync date de >24h → les indexers n'envoient plus de nouveaux résultats à Sonarr/Radarr
- Cause possible : Prowlarr est up mais le mécanisme de sync est cassé (bug, timeout, API key expirée)
À ajouter au health check hebdo (SOP-A) et au job superviseur horaire (Section 13.4) :
# Bazarr
providers = call("bazarr", "GET", "system/providers")
fr_active = [p for p in providers.get("data", []) if p.get("enabled") and "fr" in str(p.get("languages", [])).lower()]
if not fr_active:
alert("⚠️ Bazarr : aucun provider FR actif — aucun sous-titre téléchargé")
# Prowlarr sync
stats = call("prowlarr", "GET", "indexerstats")
last_sync = stats.get("lastSyncTime")
if last_sync and (now - last_sync).days > 1:
alert("⚠️ Prowlarr : dernière synchronisation > 24h — indexers non propagés")
Priorité : 🟠 Phase 1 (à inclure dans le health check dès maintenant). 5 lignes de code, zéro coût.
C'est une extension de la Section 12.7 (Claude). Claude a proposé la validation ffprobe. Grok propose d'aller plus loin : si la validation échoue, déclencher automatiquement une re-search.
Workflow :
ffprobe → piste FR absente → alerte + trigger POST /command {name: "EpisodeSearch", episodeIds: [id]}
Pourquoi c'est malin : le fichier MULTI tagué sans piste FR est probablement un faux tag de l'uploader (piste FR annoncée dans le nom mais absente du fichier). Une autre release du même épisode aura peut-être la vraie piste MULTI. Autant re-search tout de suite plutôt que d'attendre la prochaine recherche automatique.
La boucle complète (détection → réparation) :
1. Script ffprobe hebdo → scanne les 20 derniers imports
2. Si piste FR absente → log l'épisode + release group fautif
3. POST /command {name: "EpisodeSearch", episodeIds: [id]} → re-search
4. Si le re-search trouve un meilleur fichier → l'ancien est remplacé automatiquement
5. Si toujours pas de FR après 2 tentatives → alerter l'humain
Ajouter à la boucle fermée de Section 13.1 :
DÉTECTER (ffprobe) → VÉRIFIER (piste FR absente ?) → RÉPARER (re-search) → CONFIRMER (nouveau ffprobe) → ESCALADER (si 2 échecs)
Priorité : 🟡 Phase 2-3. Nécessite que le health check de base soit stable d'abord.
Suggestion légère mais pertinente : versionner les exports de config dans Git.
Ce que ça apporte par rapport au backup classique :
- Historique des changements : « Qui a changé le score MULTI de +100 à +20 et quand ? »
- Diff visuel : git diff entre deux versions de la config
- Rollback facile : git checkout <commit> pour revenir à une config stable
Fichiers à versionner :
seedbox-config/
├── sonarr/
│ ├── quality-profiles.json # Export API
│ ├── custom-formats.json
│ └── settings.json
├── radarr/
│ ├── quality-profiles.json
│ ├── custom-formats.json
│ └── settings.json
├── prowlarr/
│ ├── indexers.json
│ └── applications.json
└── README.md # Explication des profils, historique des changements
Automatisation : un script export_configs.sh qui :
1. Appelle les API *Arr pour exporter les configs en JSON
2. Commit dans le repo Git local
3. Push vers un repo privé (GitHub/GitLab)
4. Tourne en cron hebdomadaire (no_agent=true)
Priorité : 🟢 Phase 2. Faible effort, bonne hygiène, pas critique.
| # | Contribution | Type | Intégration |
|---|---|---|---|
| 14.2 | autobrr — IRC racing + filtres avancés | Nouvel outil | Phase 2 (après Recyclarr). Game-changer si C411 a un canal IRC |
| 14.3 | Notifiarr — dashboard natif + notifications riches | Nouvel outil | Phase 2-3. Confort, pas critique |
| 14.4 | BorgBackup — snapshots dédupliqués chiffrés | Amélioration Phase 1.1 | Remplace rsync. Script prêt à l'emploi |
| 14.5 | Analyse historique release groups | Nouvelle idée | Phase 3+. Analyse de données existantes |
| 14.6 | Bazarr provider + Prowlarr sync health | Ajout health check | Phase 1 — 5 lignes de code |
| 14.7 | Ffprobe → re-search auto | Extension Section 12.7 | Phase 2-3. Boucle fermée de réparation |
| 14.8 | Git versioning configs | Nouvelle pratique | Phase 2. Bonne hygiène |
| — | 8 points de confirmation | Validation | Déjà couverts — priorité renforcée |
Le mot de Grok : « Your foundation is already better than most people's final state. »
C'est le seul modèle qui a formulé un compliment sur l'architecture existante avant de proposer des améliorations. Et sa reco autobrr est la contribution la plus « seedbox-native » des cinq modèles — personne d'autre n'a pensé à l'IRC racing, qui est pourtant la pratique standard des power-users de trackers privés.
Document rédigé le 6 juin 2026 par l'agent Hermes pour EViLGUARD. Dernière mise à jour : 6 juin 2026 — ajout Sections 11 (🤖 Gemini), 12 (🤖 Claude), 13 (🤖 GPT-4o), 14 (🤖 Grok 4)