Gluetun Companion

> 🇬🇧 [English version](README.en.md) # Gluetun Companion > **Article liĂ©** — PrĂ©sentation et tour d'horizon illustrĂ© (captures d'Ă©cran de l'interface) sur le blog : **[Gluetun Companion : interface web pour piloter automatiquement vos serveurs VPN WireGuard et OpenVPN dans Gluetun](https://upandclear.org/2026/06/16/gluetun-companion-interface-web-pour-piloter-automatiquement-vos-serveurs-vpn-wireguard-et-openvpn-dans-gluetun/)**.

Build Trivy CVE scan Dependabot Docker arch i18n Gluetun compatible AirVPN Proton compatible Unraid DockerMan Discord Apprise Docker socket-proxy

> **Vous l'utilisez ? Vous l'aimez ? [⭐ Ajouter une Ă©toile !](https://github.com/Aerya/Gluetun-Companion/stargazers)** — ça prend deux secondes. > **Vous voulez aller Ă  l’essentiel ?** Consultez la [compatibilitĂ©](#compatibilitĂ©), passez directement au [dĂ©marrage rapide](#dĂ©marrage-rapide), puis revenez aux [fonctionnalitĂ©s](#fonctionnalitĂ©s) et au [fonctionnement dĂ©taillĂ©](#fonctionnement) selon vos besoins. La maintenance du projet est dĂ©crite dans les [workflows automatisĂ©s](#workflows-automatisĂ©s) et la [sĂ©curitĂ©](#sĂ©curitĂ©). Gluetun Companion est une interface Web pour piloter automatiquement vos serveurs VPN WireGuard et OpenVPN dans [Gluetun](https://github.com/qdm12/gluetun) : - Il benchmarke vos serveurs depuis le tunnel VPN lui-mĂȘme, en mode sidecar sans redĂ©marrer Gluetun, ou via le proxy HTTP intĂ©grĂ© - Chaque serveur est Ă©valuĂ© sur le dĂ©bit, la latence, le jitter, la perte de paquets, le DNS, l’historique et la stabilitĂ© rĂ©elle - Le meilleur serveur peut ĂȘtre sĂ©lectionnĂ© automatiquement selon votre usage : Ă©quilibrĂ©, gaming, BitTorrent, DDL, tĂ©lĂ©chargement ou streaming - Les pools de rotation permettent aussi de changer de serveur sans benchmark, en alĂ©atoire, round-robin ou selon le meilleur dĂ©bit historique - Les profils VPN gĂšrent plusieurs fournisseurs, protocoles et configurations personnalisĂ©es, avec chiffrement des secrets et support WireGuard/OpenVPN - Le catalogue Gluetun, l’import AirVPN, la dĂ©tection de nouveaux serveurs et l’exclusion des serveurs surchargĂ©s facilitent la maintenance au quotidien - Companion gĂšre les containers Docker liĂ©s Ă  Gluetun : recrĂ©ation aprĂšs bascule, pause pendant les tests et mise Ă  jour optionnelle des images - Il peut vĂ©rifier les trackers BitTorrent, gĂ©rer le port forwarding VPN et synchroniser les ports avec qBittorrent ou rTorrent - Historique, patterns horaires, notifications Discord/Apprise, API REST, endpoint Prometheus et dashboard Grafana complĂštent l’outil pour un vrai pilotage homelab > **Statut : bĂȘta.** Gluetun Companion est encore en phase de test. Il est dĂ©veloppĂ© et Ă©prouvĂ© principalement avec **AirVPN** ; les autres fournisseurs ne sont quasiment pas testĂ©s en conditions rĂ©elles, mĂȘme si la mĂ©canique (catalogue, benchmark, bascule, gestion des containers) est strictement identique pour tous. Vos retours sont prĂ©cieux. > > **État actuel des validations :** > - **100 % fonctionnel avec AirVPN en WireGuard** ; > - fonctionnement testĂ© en WireGuard avec quelques autres fournisseurs ; > - retours recherchĂ©s concernant les fournisseurs **OpenVPN** ; > - **ProtonVPN WireGuard + port forwarding NAT-PMP** pris en charge via les profils VPN ; retours encore utiles sur la synchronisation qBittorrent en conditions rĂ©elles ; > - retours recherchĂ©s pour les serveurs **Custom WireGuard** et **Custom OpenVPN**. **DĂ©veloppement assistĂ© par IA :** environ **70 % du code a Ă©tĂ© rĂ©alisĂ© avec l’aide de Claude Code et Codex**, sous direction et validation humaines. Une attention particuliĂšre est portĂ©e Ă  la sĂ©curitĂ© : [chiffrement et protection des secrets](#sĂ©curitĂ©), [workflows automatisĂ©s, Dependabot et Trivy](#workflows-automatisĂ©s), limitation de l’accĂšs au socket Docker via [`docker-socket-proxy`](#dĂ©marrage-rapide), tests automatisĂ©s et revue des modifications. Cette transparence ne remplace pas les retours en conditions rĂ©elles, particuliĂšrement importants pendant la bĂȘta. **Issues et pull requests bienvenues**, en respectant les formes : pour une [issue](https://github.com/Aerya/Gluetun-Companion/issues), merci d'indiquer la version, le fournisseur VPN, les logs pertinents et les Ă©tapes de reproduction ; pour une PR, une description claire du problĂšme rĂ©solu et du comportement attendu. --- ## CompatibilitĂ© Gluetun Companion prend en charge **WireGuard et OpenVPN** avec les fournisseurs compatibles Gluetun. Les profils VPN permettent de gĂ©rer les identifiants propres Ă  chaque protocole et fournisseur, tandis que les variables suivantes servent Ă  sĂ©lectionner les serveurs Ă  tester ou Ă  utiliser : | Variable Gluetun | Filtre | |---|---| | `SERVER_NAMES` | Nom du serveur | | `SERVER_COUNTRIES` | Pays | | `SERVER_REGIONS` | RĂ©gion | | `SERVER_CITIES` | Ville | | `SERVER_HOSTNAMES` | Hostname | Les profils **WireGuard et OpenVPN** bĂ©nĂ©ficient du benchmark, des mĂ©triques et de la bascule automatique. En mode sidecar, les profils WireGuard peuvent utiliser une identitĂ© dĂ©diĂ©e afin d'Ă©viter de perturber le tunnel principal ; les profils OpenVPN sont testĂ©s avec leurs propres identifiants. Conçu et testĂ© en prioritĂ© pour **[AirVPN](https://airvpn.org/?referred_by=483746)** *(lien affiliĂ©)* — [variables de filtre AirVPN](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/airvpn.md#optional-environment-variables). --- ## Table des matiĂšres - [CompatibilitĂ©](#compatibilitĂ©) - [DĂ©marrage rapide](#dĂ©marrage-rapide) - [FonctionnalitĂ©s](#fonctionnalitĂ©s) - [Mesure de performances](#mesure-de-performances) - [SĂ©lection & bascule automatique](#sĂ©lection--bascule-automatique) - [Pools de rotation](#pools-de-rotation) - [Multi-provider (WireGuard & OpenVPN)](#multi-provider-wireguard--openvpn) - [Catalogue de serveurs Gluetun](#catalogue-de-serveurs-gluetun) - [Gestion des containers Docker](#gestion-des-containers-docker) - [ContrĂŽle trackers BitTorrent](#contrĂŽle-trackers-bittorrent) - [AirVPN](#airvpn) - [Analyse & historique](#analyse--historique) - [Interface & notifications](#interface--notifications) - [IntĂ©gration & infrastructure](#intĂ©gration--infrastructure) - [Variables d'environnement](#variables-denvironnement) - [Fonctionnement](#fonctionnement) - [Mode Sidecar (dĂ©faut)](#mode-sidecar-dĂ©faut) - [Mode Proxy HTTP (optionnel)](#mode-proxy-http-optionnel) - [Containers Ă  redĂ©marrer aprĂšs bascule](#containers-Ă -redĂ©marrer-aprĂšs-bascule) - [Containers Ă  stopper pendant le benchmark](#containers-Ă -stopper-pendant-le-benchmark) - [Bandeau « Test en cours » et bouton ArrĂȘter](#bandeau--test-en-cours--et-bouton-arrĂȘter) - [SĂ©lecteur de serveurs AirVPN](#sĂ©lecteur-de-serveurs-airvpn) - [VĂ©rification rapide avant benchmark](#vĂ©rification-rapide-avant-benchmark-option) - [Optimisation horaire](#optimisation-horaire-option) - [SĂ©lection intelligente du benchmark](#sĂ©lection-intelligente-du-benchmark-recommandĂ©e-pour-les-gros-catalogues) - [Serveurs autorisĂ©s avant benchmark](#serveurs-autorisĂ©s-avant-benchmark-option) - [Éviter les serveurs AirVPN chargĂ©s](#Ă©viter-les-serveurs-airvpn-chargĂ©s-option-dĂ©diĂ©-airvpn) - [Écoute Docker events](#Ă©coute-docker-events) - [ContrĂŽle des trackers BitTorrent via le VPN](#contrĂŽle-des-trackers-bittorrent-via-le-vpn) - [Clients BitTorrent et dĂ©couverte des trackers](#clients-bittorrent-et-dĂ©couverte-des-trackers) - [Inventaire des ports forwardĂ©s VPN](#inventaire-des-ports-forwardĂ©s-vpn) - [Profils d'usage](#profils-dusage) - [Profils VPN (WireGuard & OpenVPN)](#profils-vpn-wireguard--openvpn) - [Profils OpenVPN](#profils-openvpn) - [Custom WireGuard : serveur personnel unique](#custom-wireguard--serveur-personnel-unique) - [Pools de rotation (fonctionnement)](#pools-de-rotation-1) - [Score de sĂ©lection — composantes de stabilitĂ©](#score-de-sĂ©lection--composantes-de-stabilitĂ©) - [Score de confiance par serveur](#score-de-confiance-par-serveur) - [Jitter & Packet Loss](#jitter--packet-loss) - [Patterns horaires](#vue-patterns-horaires-historypatterns) - [DĂ©tection nouveaux serveurs AirVPN](#dĂ©tection-de-nouveaux-serveurs-airvpn) - [Notifications contextuelles](#notifications-contextuelles) - [REST API](#rest-api) - [Endpoint /metrics Prometheus](#endpoint-prometheus-metrics) - [Cycle automatique vs manuel](#cycle-automatique-vs-dĂ©clenchement-manuel) - [Dashboard Grafana](#dashboard-grafana) - [Workflows automatisĂ©s](#workflows-automatisĂ©s) - [Notes](#notes) - [SĂ©curitĂ©](#sĂ©curitĂ©) - [CrĂ©dits](#crĂ©dits) - [Licence](#licence) --- ## DĂ©marrage rapide ### 1. Exposer le proxy HTTP Gluetun sur l'hĂŽte ```yaml # dans votre docker-compose.yml Gluetun existant ports: - 8887:8888 # ou le port que vous avez configurĂ© environment: HTTPPROXY: "on" HTTPPROXY_LOG: "off" # HTTPPROXY_USER: "" # optionnel — Ă  reporter dans ParamĂštres de l'UI # HTTPPROXY_PASSWORD: "" ``` ### 2. Monter le dossier compose de Gluetun Le companion doit pouvoir Ă©crire un `docker-compose.override.yml` dans le dossier qui contient votre `docker-compose.yml` Gluetun, puis relancer le service. > **Unraid / DockerMan** > Si Gluetun est gĂ©rĂ© par le Docker Manager d'Unraid (`net.unraid.docker.managed=dockerman`), Companion dĂ©tecte ce backend automatiquement et n'utilise pas `docker compose` pour les bascules. Montez le dossier des templates Unraid en Ă©criture, par exemple `- /boot/config/plugins/dockerMan/templates-user:/boot/config/plugins/dockerMan/templates-user`, afin que les changements soient persistĂ©s dans le template DockerMan avant recrĂ©ation du container. `CONTROL_BACKEND=unraid` permet de forcer ce mode si la dĂ©tection automatique ne suffit pas. ### 3. Lancer le companion ```yaml services: socket-proxy: image: tecnativa/docker-socket-proxy container_name: socket-proxy restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock:ro environment: CONTAINERS: 1 IMAGES: 1 NETWORKS: 1 VOLUMES: 1 POST: 1 DELETE: 1 networks: - companion-net gluetun-companion: image: ghcr.io/aerya/gluetun-companion:latest container_name: gluetun-companion restart: always ports: - 8765:8765 volumes: - /chemin/vers/data:/data - /chemin/vers/stack/gluetun:/compose # ← adapter - /chemin/vers/gluetun/openvpn:/openvpn extra_hosts: - "host.docker.internal:host-gateway" environment: - TZ=Europe/Paris - SECRET_KEY=remplacer-par-une-chaine-aleatoire # openssl rand -hex 32 - DATA_DIR=/data - GLUETUN_HOST=host.docker.internal - GLUETUN_PROXY_PORT=8887 - GLUETUN_CONTAINER=gluetun-airvpn # nom exact du container Gluetun (le service Compose est dĂ©tectĂ© automatiquement) - COMPOSE_DIR=/compose - OPENVPN_CONFIG_DIR=/openvpn - OPENVPN_CONTAINER_DIR=/gluetun/openvpn - DOCKER_HOST=tcp://socket-proxy:2375 # Optionnel : protĂ©ger /metrics par un Bearer token. # Laisser vide (ou non dĂ©fini) pour un accĂšs libre — standard pour les scrapes Prometheus internes. # - METRICS_TOKEN=votre-token-secret networks: - companion-net depends_on: - socket-proxy networks: companion-net: ``` ```bash docker compose up -d ``` > **Pourquoi `socket-proxy` ?** > Le socket Docker donne un accĂšs quasi-total Ă  l'hĂŽte. Le proxy [Tecnativa](https://github.com/Tecnativa/docker-socket-proxy) s'intercale entre Companion et le socket, et restreint l'accĂšs aux opĂ©rations nĂ©cessaires : lecture des containers/images/rĂ©seaux/volumes, et POST/DELETE requis pour crĂ©er et supprimer les containers sidecar temporaires. Il empĂȘche notamment tout accĂšs direct au daemon (exec, info, swarm
). Fonctionnement identique pour l'utilisateur, surface d'attaque rĂ©duite. Ouvrir **http://localhost:8765** — premiĂšre connexion : entrez le compte Ă  crĂ©er (enregistrĂ© automatiquement). > **Unraid / DockerMan :** un template XML temporaire est disponible dans [`templates/unraid`](templates/unraid/README.md) pour une installation manuelle ou via *Private Apps*, en attendant une Ă©ventuelle publication Community Applications. > **Companion dans la mĂȘme stack que Gluetun ?** > Supprimez `extra_hosts` et utilisez le nom de service : `GLUETUN_HOST: gluetun`. > Lors d'une bascule, le companion cible uniquement le service Gluetun (`docker compose up -d `) — il ne se recrĂ©e pas lui-mĂȘme. ### 4. Importer les serveurs **Serveurs → Importer depuis Gluetun** : le companion lit les variables `SERVER_NAMES`, `SERVER_COUNTRIES`, etc. directement depuis le container en cours et importe chaque valeur avec son type de filtre. Le catalogue Gluetun peut aussi importer les serveurs par pays, ville, rĂ©gion, hostname ou nom, avec filtre de type serveur quand le fournisseur l'expose (par exemple `P2P`, `Streaming`, `Secure Core`, `Tor` ou `Free` chez ProtonVPN). Ajout manuel possible depuis le mĂȘme Ă©cran. > ⚠ **Companion benchmarke chaque serveur individuellement par son nom.** Configurer `SERVER_COUNTRIES`, `SERVER_REGIONS` ou `SERVER_CITIES` ajoute une seule entrĂ©e (ex : « France ») — Companion ne dĂ©couvre **pas** automatiquement les serveurs individuels de ce pays. Ajoutez chaque serveur par son nom (`SERVER_NAMES`) pour que le benchmark fonctionne. **Minimum 2 serveurs nommĂ©s requis.** --- ## FonctionnalitĂ©s ### Mesure de performances - **Mode Sidecar** (dĂ©faut) — un container `gluetun-companion-test` clone la config rĂ©elle de Gluetun pour chaque serveur ; `gluetun-companion-sidecar` mesure le dĂ©bit via **Ookla + librespeed en parallĂšle** (mode dual, dĂ©faut), Ookla seul, librespeed seul ou iperf3 directement dans le tunnel VPN ; votre Gluetun principal n'est jamais relancĂ© pendant les tests - **Mode Proxy HTTP** (optionnel) — mesure via le proxy HTTP Gluetun sans container supplĂ©mentaire ; interrompt briĂšvement les services dĂ©pendants Ă  chaque bascule - **RĂ©sultats multi-sources** — les vitesses Ookla, librespeed et iperf3 sont stockĂ©es sĂ©parĂ©ment et affichĂ©es dans le dashboard et l'historique - **TĂ©lĂ©chargement multi-flux** — N connexions TCP simultanĂ©es (configurable, dĂ©faut : 4) - **Benchmark automatique** toutes les X heures — download, upload et latence par serveur ; cycle automatique dĂ©sactivable (dĂ©clenchement manuel uniquement) - **SĂ©lection intelligente du benchmark** *(option)* — Ă©vite les cycles Ă©normes sur les catalogues massifs : teste les meilleurs serveurs connus selon le profil d'usage, explore quelques nouveaux serveurs et rafraĂźchit les mesures anciennes - **Serveurs autorisĂ©s avant benchmark** *(option)* — sĂ©lectionnez les **types d'entrĂ©es** Ă  inclure dans chaque cycle (`SERVER_NAMES`, `SERVER_COUNTRIES`, `SERVER_CITIES`, `SERVER_REGIONS`, `SERVER_HOSTNAMES`) et, pour AirVPN, ignorez les serveurs trop chargĂ©s ; les serveurs exclus restent dans la liste et peuvent ĂȘtre testĂ©s manuellement - **VĂ©rification rapide avant benchmark** *(option)* — teste uniquement le serveur actif avant chaque cycle ; si le dĂ©bit est dans la plage ±N% par rapport au dernier rĂ©sultat connu, le benchmark complet est ignorĂ© — aucun container stoppĂ©, aucun redĂ©marrage VPN ; dĂ©clenche le benchmark complet uniquement si les performances dĂ©rivent significativement - **Optimisation horaire** *(option)* — analyse les patterns horaires de dĂ©bit et de variance pour identifier les meilleures et pires fenĂȘtres de benchmark ; affiche les plages recommandĂ©es dans les ParamĂštres ; option de dĂ©calage automatique : si le prochain cycle tombe sur une heure dĂ©favorable, il est dĂ©calĂ© jusqu'Ă  3 h vers la prochaine fenĂȘtre favorable - **Benchmark rapide Ă  la demande** — bouton disponible en permanence (dashboard et paramĂštres) ; teste uniquement le serveur actif via le proxy HTTP de Gluetun, rĂ©sultat en quelques secondes, aucune interruption VPN, rĂ©sultat sauvegardĂ© dans l'historique - **Estimation de durĂ©e** — le dashboard affiche une fourchette de durĂ©e calculĂ©e dynamiquement (optimiste / pessimiste) selon vos paramĂštres (`wait_secs`, `duration`, `samples`, `retries`, mode sidecar ou proxy) ; alerte automatique si le total estimĂ© dĂ©passe 30 minutes ; la mĂȘme estimation est affichĂ©e dans ParamĂštres au fil de vos rĂ©glages - **Jitter & Packet Loss** — stabilitĂ© rĂ©seau mesurĂ©e Ă  chaque test (21 sondes TTFB en mode proxy, handshakes TCP via sidecar) ; indicateur 🟱/🟡/🔮 sur la page Serveurs, colonnes dĂ©diĂ©es dans l'historique, jitter affichĂ© dans les patterns horaires ; intĂ©grĂ© dans le score de sĂ©lection (pĂ©nalitĂ© jusqu'Ă  −15 % jitter / −25 % perte) - **Latence DNS** *(sidecar)* — mesure du temps de rĂ©solution DNS depuis l'intĂ©rieur du tunnel VPN via `dig` (4 domaines en parallĂšle, mĂ©diane retournĂ©e) ; dĂ©tecte les rĂ©solveurs lents, surchargĂ©s ou qui interceptent les requĂȘtes ; colonne dans l'historique, tooltip sur l'indicateur StabilitĂ©, donnĂ©es dans les patterns horaires - **Écoute Docker events** — thread daemon qui surveille les Ă©vĂ©nements `start` du container Gluetun ; si Gluetun redĂ©marre de lui-mĂȘme (crash, mise Ă  jour, watchdog), dĂ©clenche automatiquement un quick check aprĂšs N secondes (dĂ©lai de reconnexion VPN) ; si la dĂ©rive de dĂ©bit dĂ©passe le seuil configurĂ© et que la bascule automatique est activĂ©e, lance immĂ©diatement un benchmark complet ; les redĂ©marrages dĂ©clenchĂ©s par Companion lui-mĂȘme sont ignorĂ©s ; cooldown de 5 min entre deux dĂ©clenchements ### RĂ©solveurs DNS observĂ©s Companion distingue deux informations : - l'**intermĂ©diaire DNS** lu dans la configuration Gluetun, par exemple `DNS local (192.168.0.64)` ; - les **rĂ©solveurs rĂ©ellement observĂ©s sur Internet**, par exemple `Cloudflare, Quad9`. Lorsqu'une adresse privĂ©e du tunnel semble appartenir au fournisseur VPN, l'interface reste prudente : `IntermĂ©diaire probable : DNS du fournisseur VPN AirVPN (10.x.x.x)`. Aucun logiciel local comme AdGuard Home ou Pi-hole n'est supposĂ© ou requis. La dĂ©tection universelle utilise le service gratuit [bash.ws](https://bash.ws/dnsleak) : un sidecar temporaire partageant le rĂ©seau de Gluetun demande un identifiant, provoque dix rĂ©solutions uniques, puis rĂ©cupĂšre les IP, ASN et pays des rĂ©solveurs observĂ©s. Aucun `docker exec` ni accĂšs supplĂ©mentaire au socket Docker n'est requis. Le rĂ©sultat est conservĂ© six heures pour limiter les requĂȘtes. Cette opĂ©ration communique au service tiers l'IP VPN et les requĂȘtes DNS de test, mais aucun identifiant Companion ni domaine consultĂ© par l'utilisateur. L'encart **Statut VPN** affiche l'intermĂ©diaire et les opĂ©rateurs observĂ©s. Dans les tableaux, seule la latence DNS reste visible ; le dĂ©tail est disponible en infobulle. L'Ă©tat est aussi exposĂ© par `GET /api/v1/status` sous la clĂ© `dns_path` (`intermediary`, `resolvers`, `observed_summary`, `tested_at`). ### SĂ©lection & bascule automatique - **Bascule automatique** vers le meilleur serveur (`docker compose up -d`), basĂ©e sur un score pondĂ©rĂ© intĂ©grant dĂ©bit actuel, historique exponentiel, jitter, perte paquets et reconnexions involontaires (via Docker events) ; curseur *PrioritĂ© dĂ©bit vs stabilitĂ©* configurable ; **6 profils d'usage** sĂ©lectionnables (ÉquilibrĂ©, Jeu en ligne, BitTorrent, DDL, TĂ©lĂ©chargement, Streaming) — chaque profil pondĂšre diffĂ©remment les mĂ©triques pour trouver le serveur le mieux adaptĂ© Ă  l'usage rĂ©el ; les services dĂ©pendants (`network_mode: service:gluetun`) sont recréés automatiquement - **Bascule manuelle** vers n'importe quel serveur configurĂ© depuis la page Serveurs — Gluetun est reconfigurĂ© et les containers `network_mode: service:gluetun` sont recréés automatiquement - **5 types de filtre** : `SERVER_NAMES`, `SERVER_COUNTRIES`, `SERVER_REGIONS`, `SERVER_CITIES`, `SERVER_HOSTNAMES` - **Retry** configurable par serveur + timeout global par serveur - **Auto-dĂ©sactivation** d'un serveur aprĂšs N Ă©checs consĂ©cutifs ### Pools de rotation - **Rotation sans benchmark** — basculez vers un serveur d'un groupe prĂ©dĂ©fini sans lancer de cycle de mesure complet ; idĂ©al pour la rotation pĂ©riodique ou les changements ponctuels - **Serveurs candidats lisibles** — chaque pool part de rĂšgles simples : serveur prĂ©cis, type de filtre Gluetun (`SERVER_NAMES`, `SERVER_COUNTRIES`, `SERVER_CITIES`, `SERVER_REGIONS`, `SERVER_HOSTNAMES`), profil VPN, top mĂ©trique, ou tous les serveurs actifs. Les rĂšgles peuvent ajouter leurs rĂ©sultats ou garder seulement les serveurs qui respectent toutes les rĂšgles. - **Exclusions par pool** — excluez des serveurs prĂ©cis d'un pool sans les dĂ©sactiver dans Companion ; ils restent disponibles ailleurs, mais ce pool ne les choisira jamais. - **3 modes de sĂ©lection** : đŸŽČ alĂ©atoire, 🔄 tour Ă  tour (round-robin avec curseur persistant), 🏆 meilleur dĂ©bit historique - **Limite finale** — aprĂšs rĂšgles et exclusions, restreindre le pool aux N meilleurs dĂ©bits historiques (si non renseignĂ©, tous les candidats restants sont Ă©ligibles) - **Manuel ou planifiĂ©** — dĂ©clenchement immĂ©diat depuis l'UI, ou rotation automatique sur un intervalle configurable (en heures ; ex. toutes les 12 h ou tous les 2 jours) - **Mesure aprĂšs bascule optionnelle** — aprĂšs chaque bascule, un test proxy rapide mesure le dĂ©bit du nouveau serveur et l'enregistre dans l'historique (mĂ©thode `proxy_qc`). Cette mesure ne choisit pas le serveur ; elle audite la rotation effectuĂ©e. - **Notifications** — alerte Discord/Apprise Ă  chaque rotation (manuelle ou automatique), avec serveur prĂ©cĂ©dent, nouveau serveur, dĂ©bit si la mesure aprĂšs bascule est activĂ©e ### Multi-provider (WireGuard & OpenVPN) - **Profils VPN** — crĂ©ez plusieurs profils d'identifiants depuis **ParamĂštres → Profils VPN** ; chaque profil est associĂ© Ă  un fournisseur **et Ă  un type de connexion** (WireGuard ou OpenVPN, selon ce que Gluetun gĂšre nativement pour ce fournisseur) ; **les 24 fournisseurs du wiki Gluetun sont intĂ©grĂ©s** - **Chiffrement des secrets** — les clĂ©s privĂ©es, mots de passe OpenVPN et autres champs sensibles sont chiffrĂ©s en base (Fernet/AES-128, clĂ© dĂ©rivĂ©e de `SECRET_KEY` via PBKDF2HMAC-SHA256 avec 480 000 itĂ©rations) ; changer `SECRET_KEY` rend les profils illisibles (comportement documentĂ©) - **Liaison serveurs ↔ profils** — sur la page **Serveurs**, assignez un profil VPN Ă  chaque serveur via un menu dĂ©roulant ; une colonne *Provider* affiche le profil associĂ© ; le filtre `?profile=` permet de ne voir que les serveurs d'un profil donnĂ© ou les serveurs non assignĂ©s - **Alerte serveurs orphelins** — un badge d'alerte signale les serveurs sans profil assignĂ© dĂšs qu'au moins un profil VPN est configurĂ© ; ces serveurs continuent de fonctionner normalement mais ne pourront pas ĂȘtre retenus par le benchmark multi-profil - **Benchmark multi-profil** — en mode sidecar, chaque serveur est testĂ© avec les identifiants de son profil injectĂ©s dans le container temporaire ; lors de la bascule finale, Companion Ă©crit automatiquement `VPN_SERVICE_PROVIDER`, `VPN_TYPE` et toutes les variables d'identifiants (`WIREGUARD_*` ou `OPENVPN_*`) dans `docker-compose.override.yml`, en blanchissant les identifiants hĂ©ritĂ©s du compose de base pour Ă©viter toute fuite entre fournisseurs - **Sidecar et OpenVPN** — les profils OpenVPN sont testĂ©s avec les mĂȘmes identifiants que le tunnel principal (la plupart des fournisseurs autorisent plusieurs connexions simultanĂ©es) ; la clĂ© sidecar dĂ©diĂ©e ne concerne que les profils WireGuard - **Politique de rotation** — trois modes configurables dans **ParamĂštres → Profils VPN → Politique de rotation** : - `none` — Companion reste toujours dans le profil actuellement actif ; les serveurs d'autres profils ne sont jamais retenus Ă  la fin du benchmark - `free` — choisit le meilleur serveur tous profils confondus (comportement par dĂ©faut sans profils) - `conditional` — bascule vers un autre profil uniquement si son meilleur serveur est supĂ©rieur de plus de N % au meilleur serveur du profil actif (seuil configurable, dĂ©faut 10 %) - **Colonne Provider dans `/history`** — chaque ligne de l'historique affiche le profil VPN associĂ© au serveur testĂ© (visible uniquement si au moins un profil est configurĂ©) **Fournisseurs intĂ©grĂ©s** (d'aprĂšs le [wiki Gluetun](https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers)) : | Fournisseur | WireGuard | OpenVPN | Identifiants OpenVPN | |---|---|---|---| | AirVPN | Natif | Natif | Certificat + clĂ© client (`OPENVPN_CERT`, `OPENVPN_KEY`) | | CyberGhost | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` + certificat + clĂ© client | | ExpressVPN | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | FastestVPN | Natif | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | Giganews (VyprVPN) | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | HideMyAss | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | IPVanish | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | IVPN | Natif | Natif | `OPENVPN_USER` (mot de passe optionnel avec l'ID de compte) | | Mullvad | Natif | — | OpenVPN supprimĂ© par Mullvad en janvier 2026 | | NordVPN | Natif | Natif | Identifiants de service (`OPENVPN_USER`/`OPENVPN_PASSWORD`) | | Perfect Privacy | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | Privado | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | Private Internet Access | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | PrivateVPN | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | ProtonVPN | Natif | Natif | Identifiants OpenVPN dĂ©diĂ©s (`+pmp` pour le port forwarding) | | PureVPN | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | SlickVPN | — | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` + certificat + clĂ© chiffrĂ©e | | Surfshark | Natif | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | TorGuard | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | VPN Secure | — | Natif | Certificat + clĂ© chiffrĂ©e + passphrase (`OPENVPN_KEY_PASSPHRASE`) | | VPN Unlimited | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` + certificat + clĂ© client | | VyprVPN | Via `custom` | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` | | Windscribe | Natif | Natif | `OPENVPN_USER`/`OPENVPN_PASSWORD` (fichier de config gĂ©nĂ©rĂ©) | | Custom | Natif | Natif | Fichier `.conf` montĂ© dans Gluetun + identifiants optionnels | > Les certificats et clĂ©s client (CyberGhost, VPN Unlimited, AirVPN OpenVPN, SlickVPN, VPN Secure) se renseignent directement dans le formulaire : collez le contenu base64 sur une seule ligne (sans les lignes `BEGIN`/`END`) — aucun fichier Ă  monter. > > Le mode **Custom WireGuard** reste disponible pour tout fournisseur sans WireGuard natif dans Gluetun (CyberGhost, PIA, PrivateVPN, PureVPN, TorGuard, VPN Unlimited, VyprVPN
) dĂšs lors qu'il fournit un fichier de configuration WireGuard standard. --- ### Catalogue de serveurs Gluetun - **Catalogue rĂ©el Gluetun en prioritĂ©** — le Sidecar catalogue monte automatiquement le volume `/gluetun` du container Gluetun quand il est accessible et lit `/gluetun/servers.json` en prioritĂ© ; ce fichier correspond Ă  la liste rĂ©ellement chargĂ©e par Gluetun. Si ce volume n'est pas disponible, Companion retombe sur le dĂ©pĂŽt public [`qdm12/gluetun-servers`](https://github.com/qdm12/gluetun-servers/tree/main/pkg/servers) - **Mise Ă  jour automatique** — la liste est rafraĂźchie **Ă  chaque cycle de benchmark** (intervalle configurable dans ParamĂštres → Mesurer, dĂ©faut : 6 h) ; un bouton dĂ©diĂ© dans les ParamĂštres et dans le modal `/servers` permet de forcer une mise Ă  jour immĂ©diate - **Auto-ajout des nouveaux serveurs** *(option)* — quand de nouveaux serveurs apparaissent dans le catalogue pour un **pays**, une **rĂ©gion** ou une **ville** que vous avez dĂ©jĂ  configurĂ©, Companion les ajoute automatiquement Ă  votre liste (type `SERVER_NAMES`) sans intervention manuelle ; dĂ©sactivĂ© par dĂ©faut, activable dans **ParamĂštres → Maintenance → Catalogue** - **Notification de changements** *(option)* — Discord/Apprise envoyĂ©s Ă  chaque refresh si des serveurs sont ajoutĂ©s ou supprimĂ©s du catalogue, avec le dĂ©tail par provider (+N/-N) ; activable dans **ParamĂštres → Notifications** - **3 modes d'import dans les ParamĂštres** : 1. **Tous les providers** — importe les serveurs de tous les providers disponibles dans le catalogue local Gluetun, ou dans le fallback GitHub 2. **Provider au choix** — importe uniquement les serveurs du provider sĂ©lectionnĂ© manuellement 3. **Provider actif** — dĂ©tecte automatiquement le provider configurĂ© dans votre Gluetun et n'importe que ses serveurs — pour chacun de ces modes, option de **lancer un benchmark complet** immĂ©diatement aprĂšs l'import (mĂ©thode configurĂ©e dans ParamĂštres, sur tous les serveurs de la liste) - **Tous les types de filtre** — chaque serveur est importĂ© avec ses attributs complets : `SERVER_NAMES`, `SERVER_COUNTRIES`, `SERVER_CITIES`, `SERVER_REGIONS`, `SERVER_HOSTNAMES` - **SĂ©lection multi-filtre depuis `/servers`** — sĂ©lectionnez des serveurs en mixant librement les types de filtre (ex : noms + pays + villes simultanĂ©ment) ; Companion applique le bon filtre dans Gluetun et change le type Ă  la volĂ©e si nĂ©cessaire - ⚠ **ProtonVPN** — Quand le volume `/gluetun` du container Gluetun est accessible, le **Catalogue** utilise `servers.json` et peut donc afficher les serveurs Premium rĂ©ellement chargĂ©s par Gluetun, avec leurs mĂ©tadonnĂ©es P2P/Streaming/hostname. Sans ce volume, le fallback GitHub peut rester limitĂ© aux donnĂ©es publiques. **PrĂ©requis** — le sidecar catalogue fonctionne sans configuration supplĂ©mentaire. Pour enrichir le catalogue avec les donnĂ©es rĂ©ellement chargĂ©es par Gluetun, Companion tente de monter automatiquement le volume `/gluetun` du container Gluetun en lecture seule ; sinon un accĂšs HTTPS sortant suffit pour le fallback GitHub. ### Gestion des containers Docker - **Containers rĂ©seau Gluetun (auto-gĂ©rĂ©s)** — les containers en cours d'exĂ©cution avec `network_mode: service:gluetun` sont dĂ©tectĂ©s et recréés automatiquement aprĂšs chaque bascule, y compris ceux dĂ©jĂ  dans un namespace mort (suite Ă  une bascule prĂ©cĂ©dente ratĂ©e). Les containers volontairement stoppĂ©s restent stoppĂ©s. Les containers dans une **stack Compose diffĂ©rente** de Gluetun sont Ă©galement gĂ©rĂ©s si leur rĂ©pertoire est accessible depuis Companion ou si leurs labels `com.docker.compose` sont prĂ©sents. La dĂ©tection d'orphelins est limitĂ©e aux containers rĂ©fĂ©rençant un **ancien Gluetun connu** (historique d'IDs en base) — Companion ne touche jamais aux dĂ©pendants d'un autre VPN ou d'une stack Ă©trangĂšre - **Containers Ă  redĂ©marrer aprĂšs bascule** — uniquement pour les containers utilisant le proxy HTTP/SOCKS5 de Gluetun ; liste ordonnĂ©e (glisser-dĂ©poser) - **Pause pendant le benchmark** — liste de containers (torrents, Usenet
) stoppĂ©s avant le dĂ©but du benchmark et relancĂ©s automatiquement Ă  la fin, mĂȘme en cas d'erreur - **Mise Ă  jour automatique des images Docker** *(option)* — au moment de la bascule, Companion peut mettre Ă  jour les images avant de relancer les containers : Gluetun lui-mĂȘme, les containers rĂ©seau auto-gĂ©rĂ©s, les containers Ă  redĂ©marrer aprĂšs bascule et les containers en pause pendant le benchmark ; activable individuellement par container depuis les ParamĂštres ### ContrĂŽle trackers BitTorrent - **Clients multiples** — configurez un ou plusieurs clients qBittorrent ou rTorrent/ruTorrent dans **ParamĂštres → BitTorrent** ; chaque client peut servir de source de trackers, mĂȘme s'il fait aussi partie des containers stoppĂ©s pendant le benchmark - **DĂ©couverte persistante** — Companion rĂ©cupĂšre les URLs de trackers depuis les torrents chargĂ©s, les dĂ©duplique, puis affiche la liste avec source, nombre de torrents, dernier test et taux de rĂ©ussite - **Passkeys masquĂ©es** — les passkeys et tokens privĂ©s sont retirĂ©s des URLs dĂ©tectĂ©es avant stockage/affichage, y compris quand ils sont dans la query string ou dans le chemin - **ContrĂŽle par URL** — chaque tracker peut ĂȘtre activĂ© ou ignorĂ© individuellement pour les vĂ©rifications futures - **Score de compatibilitĂ© VPN** — les trackers activĂ©s sont testĂ©s depuis le chemin VPN ; par dĂ©faut, 80 % de rĂ©ussite suffit pour considĂ©rer le serveur compatible afin d'Ă©viter les faux nĂ©gatifs quand un tracker est simplement down - **CritĂšre de bascule optionnel** — si l'option est activĂ©e, un serveur benchmarkĂ© sous le seuil trackers est exclu du choix auto-switch ; les pools ignorent les serveurs dĂ©jĂ  connus comme incompatibles - **Port forwarding par fournisseur** — dĂ©clarez des rĂšgles AirVPN/manual, Gluetun natif (`/v1/portforward`) ou custom dans **ParamĂštres → Port Forwarding** ; si l'automatisme est activĂ©, Companion applique les rĂšgles du fournisseur courant aprĂšs chaque bascule (manuelle, benchmark, rotation de pool), resynchronise qBittorrent ou rTorrent *(bĂȘta)* et exĂ©cute les hooks `on_port_change` configurĂ©s ; un contrĂŽle pĂ©riodique dĂ©tecte aussi les renouvellements de port sans redĂ©marrage ### AirVPN - **SĂ©lecteur de serveurs AirVPN intĂ©grĂ©** — bouton *+ Ajouter des serveurs AirVPN* sur la page Serveurs : donnĂ©es en direct depuis `airvpn.org/api/status/` (cache 5 min), quatre onglets — liste complĂšte searchable, rĂ©partition gĂ©ographique par pays, onglet **RecommandĂ©s** (charge < 70 %, bande passante ≄ 5 Gbit/s) et onglet **Changements** (nouveaux serveurs dĂ©tectĂ©s, serveurs disparus, Ă©volutions de charge, top 5 pays les plus sains) ; ajout multi-sĂ©lection en un clic - **Bande passante AirVPN visible et filtrable** — Companion stocke la capacitĂ© annoncĂ©e par AirVPN (`bw_max`) sĂ©parĂ©ment des benchmarks : colonne triable/filtrable dans `/servers`, filtre dans la fenĂȘtre d'import AirVPN, badges sur le dashboard, l'historique, les rotations de pool et les bascules. C'est une donnĂ©e fournisseur, pas une mesure de dĂ©bit rĂ©elle. - **Éviter les serveurs AirVPN chargĂ©s** *(optionnel, dĂ©diĂ© [AirVPN](https://airvpn.org/?referred_by=483746))* — au dĂ©marrage du benchmark, les serveurs **[AirVPN](https://airvpn.org/?referred_by=483746)** de type `SERVER_NAMES` dont la **charge** ou le **nombre d'utilisateurs** dĂ©passe un seuil configurable sont automatiquement ignorĂ©s ; donnĂ©es issues du cache AirVPN (mis Ă  jour toutes les 5 min) ; les serveurs sans donnĂ©es AirVPN ne sont jamais exclus ; seuils configurables dans ParamĂštres → Mesurer → Quels serveurs autoriser - **DĂ©tection de nouveaux serveurs AirVPN** *(optionnel)* — compare l'API AirVPN avec vos serveurs configurĂ©s toutes les 24 h ; banniĂšre et badge sur la page Serveurs + onglet *Changements* dans le modal d'ajout ; notification Discord/Apprise avec mention optionnelle ### Analyse & historique - **Score de confiance par serveur** — indicateur 🟱/🟡/🔮 sur la page Serveurs et dans l'historique ; basĂ© sur le nombre de mesures et la variabilitĂ© des rĂ©sultats ; intĂ©grĂ© dans le score de sĂ©lection automatique (pondĂ©ration lĂ©gĂšre) - **Patterns horaires** (`/history/patterns`) — graphique barres 0h–23h du dĂ©bit moyen par tranche horaire, colorĂ© selon les performances relatives ; meilleure et pire heure affichĂ©es ; permet de repĂ©rer les crĂ©neaux de saturation serveur - **Colonnes triables** — cliquez sur les en-tĂȘtes de colonne dans `/history` et `/servers` pour trier ; une seconde presse inverse l'ordre ; indicateurs â–Č/â–Œ/⇅ visuels ; tri persistant via pagination - **Test unitaire** d'un serveur depuis l'UI sans attendre le prochain cycle - **Export CSV** de l'historique complet ### Interface & notifications - **Web UI** dark/light/auto, FR/EN — auth, dashboard avec sparkline, historique paginĂ©, graphiques, page bascules avec gain Mbps et temps de connexion - **Panneau de dĂ©tail serveur** — clic sur un nom de serveur dans `/servers` : statistiques agrĂ©gĂ©es (dĂ©bits moyens, latence, pic, nombre de tests), sparkline des 30 derniers tests, derniers rĂ©sultats et actions (tester, basculer, historique complet) dans un panneau latĂ©ral - **Checklist premiers pas** — carte sur le dashboard guidant l'installation (profil VPN → import de serveurs → premier benchmark), disparaĂźt une fois la configuration terminĂ©e - **SĂ©lecteur de colonnes** — masquez les colonnes inutiles de `/servers` (prĂ©fĂ©rence conservĂ©e par navigateur) - **Recherche dans les paramĂštres** — champ de recherche filtrant les cartes de tous les onglets avec compteur de rĂ©sultats par onglet - **Logos des fournisseurs VPN** — affichĂ©s Ă  cĂŽtĂ© des noms de serveurs partout dans l'UI et dans le catalogue (SVG embarquĂ©s + favicons mis en cache cĂŽtĂ© serveur — le navigateur ne contacte jamais de service tiers) - **Bandeau de test global** — visible sur toutes les pages pendant un test : type de test, serveur en cours, progression en %, estimation du temps restant et bouton ArrĂȘter (Ă©tat persistant au rechargement de page) - **Notifications contextuelles** — 10 types d'alertes configurables indĂ©pendamment (bascule auto/manuelle, auto-exclusion, benchmark sans rĂ©sultat, fin de benchmark, rĂ©sultat quick check, rotation de pool, nouveaux serveurs AirVPN, changements catalogue, changement fenĂȘtre optimale) via webhook Discord (embed colorĂ©) et/ou [Apprise](https://github.com/caronc/apprise/wiki) (Telegram, ntfy, Gotify, Slack, Pushover
) ; sĂ©vĂ©ritĂ© 🔮/🟡/đŸ”” ; mention Discord globale avec seuil de sĂ©vĂ©ritĂ© configurable - **Purge automatique** de l'historique SQLite configurable (rĂ©tention en jours) ### IntĂ©gration & infrastructure - **Endpoint `/healthz`** non authentifiĂ© pour les healthchecks Docker - **Endpoint `/metrics`** au format Prometheus — dĂ©bit, latence, bascules, serveur actif ; optionnellement protĂ©gĂ© par Bearer token ; compatible Grafana - **REST API `/api/v1/`** protĂ©gĂ©e par Bearer token — statut VPN, liste des serveurs, historique, bascules, dĂ©clenchement benchmark complet ou rapide ; conçue pour Home Assistant, n8n, scripts bash - **Logs JSON structurĂ©s** optionnels via `LOG_JSON=1` (compatibles Loki/Grafana) - **Base de donnĂ©es SQLite** (WAL) — aucune dĂ©pendance externe --- ## Variables d'environnement | Variable | DĂ©faut | Description | |---|---|---| | `SECRET_KEY` | *(requis)* | ClĂ© Flask pour les sessions | | `GLUETUN_HOST` | `host.docker.internal` | HĂŽte du proxy HTTP Gluetun | | `GLUETUN_PROXY_PORT` | `8887` | Port du proxy HTTP Gluetun | | `GLUETUN_CONTAINER` | `gluetun-airvpn` | Nom du container Gluetun | | `COMPOSE_DIR` | `/compose` | Chemin (dans le container) du dossier compose Gluetun | | `CONTROL_BACKEND` | `auto` | Backend de contrĂŽle : dĂ©tection automatique, ou `compose` / `unraid` pour forcer le mode | | `UNRAID_TEMPLATE_DIR` | `/boot/config/plugins/dockerMan/templates-user` | Dossier des templates DockerMan Unraid, Ă  monter en Ă©criture si `CONTROL_BACKEND=unraid` ou si le container Gluetun est dĂ©tectĂ© comme DockerMan | | `DATA_DIR` | `/data` | Dossier de la base SQLite | | `OPENVPN_CONFIG_DIR` | `/openvpn` | Dossier accessible en Ă©criture par Companion pour les fichiers Custom OpenVPN | | `OPENVPN_CONTAINER_DIR` | `/gluetun/openvpn` | Chemin Ă©quivalent vu depuis le container Gluetun | | `DOCKER_HOST` | *(socket local)* | Remplacer par `tcp://socket-proxy:2375` si vous utilisez le proxy Tecnativa | | `METRICS_TOKEN` | *(vide)* | Si dĂ©fini, l'endpoint `/metrics` exige `Authorization: Bearer ` ; laisser vide pour un accĂšs libre (standard rĂ©seau interne) | Les paramĂštres de benchmark (flux, durĂ©e, warm-up, retry
) se configurent dans l'UI → **ParamĂštres**. --- ## Fonctionnement ### Mode Sidecar (dĂ©faut) ``` Cycle de benchmark (toutes les X heures) ├─ Containers "pause bench" stoppĂ©s (torrents, Usenet
) ├─ Pull ghcr.io/aerya/gluetun-companion-sidecar:latest │ (une seule fois par cycle, image conservĂ©e en cache ; best-effort : │ repli sur le cache si le registre/DNS est momentanĂ©ment indisponible) └─ Pour chaque serveur activĂ© : 1. Lancement de gluetun-companion-test (copie de votre Gluetun, configurĂ© sur le serveur cible) 2. Lancement de gluetun-companion-sidecar (network_mode: container:gluetun-companion-test) 3. Attente connexion VPN via /health polling (timeout configurable) 4. Test de dĂ©bit dans le tunnel VPN (moteur configurable) : - Dual (dĂ©faut) : Ookla + librespeed en parallĂšle, iperf3 en fallback - Ookla seul, librespeed seul, ou iperf3 seul → DL, UL, latence enregistrĂ©s par source 5. Stop + suppression des containers de test (image sidecar conservĂ©e) → Retry automatique si Ă©chec, timeout global par serveur → Auto-dĂ©sactivation si N Ă©checs consĂ©cutifs └─ Score pondĂ©rĂ© (65 % cycle actuel + 35 % historique exponentiel) └─ Bascule du vrai Gluetun vers le meilleur (un seul redĂ©marrage) └─ Containers "post-bascule" recréés (network namespace inclus) └─ Containers "pause bench" relancĂ©s (garanti — bloc finally) └─ Notification Discord / Apprise (si configurĂ©e) ``` **Moteurs de test disponibles (ParamĂštres → Mesurer → Mode Sidecar) :** - **Dual** (dĂ©faut) — Ookla + librespeed en parallĂšle ; rĂ©sultats des deux sources stockĂ©s sĂ©parĂ©ment - **Ookla uniquement** — CLI Speedtest.net, rarement bloquĂ© par les IPs VPN - **librespeed uniquement** — librespeed-cli, serveurs librespeed.org (HTTP) - **iperf3 uniquement** — TCP direct vers serveurs publics iperf3 (souvent bloquĂ©s par VPN) **Fallbacks :** - iperf3 en dernier recours si toutes les sources principales Ă©chouent (activĂ© par dĂ©faut) - Proxy HTTP en fallback si le sidecar Ă©choue complĂštement (dĂ©sactivĂ© par dĂ©faut) > ⚠ **Connexion simultanĂ©e** : le mode sidecar consomme un slot VPN supplĂ©mentaire pendant toute la durĂ©e du benchmark. VĂ©rifiez les limites de votre fournisseur (AirVPN : 3–5 selon l'abonnement). > Companion enchaĂźne les tests sidecar un par un et attend par dĂ©faut 180 s aprĂšs le nettoyage des containers (`sidecar_disconnect_wait_seconds`) pour laisser le fournisseur fermer la session VPN avant le serveur suivant. **C'est le principal facteur de durĂ©e d'un cycle** : avec N serveurs, le cycle dure au moins N × ce dĂ©lai. Si votre abonnement autorise plusieurs connexions simultanĂ©es (AirVPN : 3–5), rĂ©duisez-le nettement (60 s, voire moins) dans **ParamĂštres → Mesurer** pour raccourcir les cycles ; augmentez-le si vous voyez des erreurs « too many connections ». > L'image sidecar n'est tirĂ©e qu'**une fois par cycle** puis rĂ©utilisĂ©e depuis le cache : moins de charge sur le registre/DNS, et un test n'Ă©choue plus (ni ne bascule le serveur) sur un hoquet DNS passager. ### Mode Proxy HTTP (optionnel) ``` Cycle de benchmark (toutes les X heures) └─ Pour chaque serveur activĂ© : 1. Écriture de docker-compose.override.yml 2. docker compose up -d ← le vrai Gluetun redĂ©marre 3. Attente connexion VPN via poll proxy HTTP 4. Warm-up TCP optionnel (2 s, non comptĂ©s) 5. Download depuis N endpoints → mĂ©diane Mbps 6. Upload → Mbps 7. Latence TTFB → mĂ©diane ms └─ Score pondĂ©rĂ© → bascule → notification ``` Activer via **ParamĂštres → Mesurer → Mode Sidecar → dĂ©sactiver**. ### Containers Ă  redĂ©marrer aprĂšs bascule Dans **ParamĂštres → DĂ©cider → Containers Ă  redĂ©marrer aprĂšs bascule** : liste ordonnĂ©e de containers recréés aprĂšs chaque bascule VPN. En mode Compose, Companion utilise `docker compose up -d --force-recreate` ; en mode Unraid/DockerMan, il recrĂ©e les containers via le Docker SDK pour les rattacher au namespace rĂ©seau Gluetun courant. Drag & drop pour rĂ©ordonner. Utile pour `qbittorrent`, `radarr`, `sonarr`, ou tout service avec `network_mode: service:gluetun`. ### Containers Ă  stopper pendant le benchmark Dans **ParamĂštres → Mesurer → Containers Ă  stopper pendant le benchmark** : liste de containers stoppĂ©s avant le benchmark et relancĂ©s aprĂšs — dans tous les cas, mĂȘme si le benchmark plante. Si un container est dans les deux listes, la liste de pause a prioritĂ© (pas de doublon). Utile pour `qbittorrent`, `sabnzbd`, `nzbget`, `transmission`. ### ContrĂŽle des trackers BitTorrent via le VPN Dans **ParamĂštres → BitTorrent**, Companion peut vĂ©rifier si les trackers rĂ©ellement utilisĂ©s par vos torrents sont accessibles depuis le serveur VPN testĂ© ou sĂ©lectionnĂ©. L'objectif n'est pas de faire un vrai announce complet pour chaque torrent, mais de vĂ©rifier la connectivitĂ© utile avec quatre niveaux : D’aprĂšs la [documentation DNS officielle de Gluetun](https://github.com/qdm12/gluetun-wiki/blob/main/setup/options/dns.md), Gluetun active `BLOCK_MALICIOUS=on` par dĂ©faut. Certaines URL d'annonce peuvent donc ĂȘtre bloquĂ©es par ses listes DNS mĂȘme si le tracker est disponible. Dans **ParamĂštres → BitTorrent → Filtrage DNS Gluetun**, Companion permet de conserver cette protection tout en autorisant des domaines prĂ©cis via `DNS_UNBLOCK_HOSTNAMES`, ou de dĂ©sactiver entiĂšrement `BLOCK_MALICIOUS` en dernier recours. Le rĂ©glage est Ă©crit dans `docker-compose.override.yml`, appliquĂ© immĂ©diatement en recrĂ©ant Gluetun et conservĂ© lors des bascules suivantes. La dĂ©sactivation globale rĂ©duit la protection DNS de tous les containers partageant le rĂ©seau de Gluetun ; l'exception ciblĂ©e est recommandĂ©e. 1. **DNS** — le domaine du tracker peut ĂȘtre rĂ©solu. 2. **Port** — le port TCP/UDP du tracker rĂ©pond. 3. **Endpoint tracker** — l'URL `/announce` ou le handshake UDP tracker rĂ©pond. Une rĂ©ponse HTTP `400`, `401`, `403` ou `invalid request` peut ĂȘtre considĂ©rĂ©e comme joignable : le tracker refuse la requĂȘte de test, mais il est bien accessible. 4. **Score agrĂ©gĂ©** — si le pourcentage de trackers accessibles dĂ©passe le seuil configurĂ© (80 % par dĂ©faut), le serveur VPN est rĂ©putĂ© compatible. Ce seuil Ă©vite les faux nĂ©gatifs : un tracker privĂ© ou public peut ĂȘtre temporairement down, sans que le serveur VPN soit mauvais. Companion conserve l'historique par URL afin de distinguer progressivement un tracker globalement indisponible d'un tracker bloquĂ© seulement sur certains chemins VPN. Deux usages sont sĂ©parĂ©s dans **ParamĂštres → BitTorrent** : - **Activer le contrĂŽle trackers pendant les vĂ©rifications VPN** lance la dĂ©couverte avant benchmark, puis teste les URLs activĂ©es pour chaque serveur testĂ©. - **Exiger un rĂ©sultat trackers OK pour les bascules automatiques et les pools** transforme ce score en critĂšre d'Ă©ligibilitĂ© : pendant un benchmark, les serveurs sous le seuil sont exclus du choix final ; dans une rotation de pool, les serveurs dĂ©jĂ  connus sous le seuil sont ignorĂ©s, tandis que les serveurs jamais testĂ©s restent candidats. La page **Serveurs** affiche une colonne **Trackers** avec le dernier rĂ©sultat connu par serveur (`OK`, pourcentage sous seuil, ou `—` si jamais testĂ©). Cette colonne est triable afin d'isoler rapidement les serveurs compatibles ou problĂ©matiques. Les trackers HTTP/HTTPS sont testĂ©s via le proxy HTTP Gluetun quand il est configurĂ©. Les trackers UDP nĂ©cessitent que Companion puisse envoyer de l'UDP depuis le chemin VPN ; si votre installation ne fournit que le proxy HTTP, ils peuvent ĂȘtre listĂ©s et gĂ©rĂ©s, mais leur test rĂ©el dĂ©pendra de votre topologie rĂ©seau. ### Clients BitTorrent et dĂ©couverte des trackers Companion peut gĂ©rer plusieurs sources BitTorrent : par exemple un qBittorrent principal, un autre qBittorrent dĂ©diĂ© au cross-seed, et un rTorrent/ruTorrent. Chaque client configurĂ© contient : - type : `qBittorrent` ou `rTorrent / ruTorrent RPC2` ; - URL API/WebUI ; - identifiants ; - container Docker associĂ©, optionnel ; - filtres de catĂ©gorie ou tags ; - options pour inclure/exclure les torrents en pause ou les torrents privĂ©s. Pour qBittorrent, Companion utilise l'API Web : liste des torrents, puis endpoint trackers par hash. Pour rTorrent/ruTorrent, Companion utilise XML-RPC/RPC2 et rĂ©cupĂšre les trackers par torrent. La dĂ©couverte est toujours faite **avant** de stopper les containers configurĂ©s dans “Containers Ă  stopper pendant le benchmark”. Ainsi, si `qbittorrent` ou `rutorrent` est arrĂȘtĂ© pendant la mesure, Companion utilise la liste de trackers dĂ©jĂ  mise en cache. Les URLs dĂ©couvertes restent visibles dans l'interface et peuvent ĂȘtre activĂ©es ou ignorĂ©es une par une pour les cycles futurs. Les URLs sont normalisĂ©es sans passkey (`?passkey=...`, `authkey`, `token`, segments privĂ©s du chemin, etc.) pour Ă©viter d'exposer des secrets dans l'interface. ### Inventaire des ports forwardĂ©s VPN Dans **ParamĂštres → Port Forwarding**, Companion gĂšre les ports entrants nĂ©cessaires aux clients BitTorrent par fournisseur VPN. Trois Ă©tats sont possibles : - **DĂ©sactivĂ©** — les rĂšgles restent stockĂ©es mais ne sont pas appliquĂ©es. - **Actif manuel** — les rĂšgles peuvent ĂȘtre dĂ©clarĂ©es, vĂ©rifiĂ©es et synchronisĂ©es Ă  la demande. - **Actif automatique** *(par dĂ©faut dĂšs que le port forwarding est activĂ© ; dĂ©sactivable)* — quand Gluetun bascule vers un autre serveur ou fournisseur VPN (bascule manuelle, benchmark **ou rotation de pool**), Companion applique automatiquement les rĂšgles du fournisseur courant. Cela couvre aussi les bascules ProtonVPN vers un autre serveur du mĂȘme fournisseur, oĂč le port NAT-PMP peut changer. AprĂšs une reconnexion Gluetun dĂ©tectĂ©e par Docker, Companion relit aussi le port natif et le propage si nĂ©cessaire. Enfin, un **contrĂŽle pĂ©riodique (toutes les 5 min)** compare le port natif `/v1/portforward` au dernier port appliquĂ© : si Gluetun a renouvelĂ© le port **sans redĂ©marrage du container** (renouvellement NAT-PMP par exemple), les rĂšgles sont rĂ©appliquĂ©es automatiquement. Chaque entrĂ©e contient : - nom lisible ; - fournisseur (`AirVPN`, `ProtonVPN`, `Custom WireGuard`, etc., ou `Manual`) ; - mode (`Manual` ou `Natif Gluetun`) ; - port manuel, optionnel en mode natif ; - protocoles `TCP` et/ou `UDP` ; - client BitTorrent liĂ©, optionnel ; - commande optionnelle `on_port_change` ; - note libre. Pour chaque port dĂ©clarĂ©, l'interface affiche : - prĂ©sence du port dans `FIREWALL_VPN_INPUT_PORTS` ; - prĂ©sence du port dans `FIREWALL_INPUT_PORTS` ; - publication Docker du port sur le container Gluetun, par protocole ; - port d'Ă©coute qBittorrent lorsque l'entrĂ©e est liĂ©e Ă  un client qBittorrent. Le bouton **Synchroniser** met Ă  jour le port d'Ă©coute du client liĂ© : qBittorrent via l'API Web (`/api/v2/app/setPreferences` + relecture de vĂ©rification), ou **rTorrent via XML-RPC** (`network.port_range.set` + relecture — *support bĂȘta, implĂ©mentĂ© selon la spec XML-RPC mais pas encore validĂ© sur une instance rTorrent rĂ©elle ; le hook `on_port_change` reste disponible en repli*). En mode **Natif Gluetun**, Companion lit d'abord le Control Server Gluetun (`GET /v1/portforward`) puis pousse le port retournĂ© vers le client. **Tester l'accessibilitĂ© depuis Internet** : le bouton **Tester depuis Internet** de chaque rĂšgle effectue une **connexion TCP rĂ©elle** depuis Companion vers `IP_publique_VPN:port`. Companion sortant par la connexion de votre box (pas par le tunnel VPN), ce test exerce le vrai chemin entrant : Internet → fournisseur VPN → Gluetun → client. **TCP uniquement** — l'UDP n'a pas de handshake et n'est pas vĂ©rifiable ainsi. Les indicateurs de configuration (firewall, publication Docker, port d'Ă©coute) restent des contrĂŽles locaux ; ce bouton est le seul qui prouve l'accessibilitĂ© rĂ©elle. Pour une contre-vĂ©rification manuelle externe : [canyouseeme.org](https://canyouseeme.org/) ou [yougetsignal.com](https://www.yougetsignal.com/tools/open-ports/) (IP publique VPN et port Ă  saisir Ă  la main — ces sites ne sont pas prĂ©-remplissables). Pour activer le support natif Gluetun, exposez son [Control Server](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md). Dans Companion, renseignez l'URL, par exemple `http://host.docker.internal:8967` si le port Docker `8967:8000` est publiĂ©. Si Gluetun utilise une auth `apikey`, renseignez aussi la valeur `X-API-Key`. Companion utilise `/v1/portforward` comme source principale et retente l'endpoint legacy `/v1/openvpn/portforwarded` si le Control Server refuse ou ne propose pas l'endpoint moderne. #### ProtonVPN et qBittorrent ProtonVPN attribue un port NAT-PMP alĂ©atoire, susceptible de changer Ă  chaque connexion ou renouvellement. Il ne faut donc ni saisir un port fixe, ni publier ce port dans le Compose Docker. Dans le profil VPN ProtonVPN, activez **Port forwarding** ; Companion Ă©crit alors `VPN_PORT_FORWARDING=on` pour ce profil et peut limiter la sĂ©lection aux serveurs **P2P / port-forwarding** avec `PORT_FORWARD_ONLY=on`. Les autres types Gluetun disponibles (`Streaming`, `Secure Core`, `Tor`, `Free`) peuvent aussi ĂȘtre choisis depuis le profil ou le catalogue quand ils sont utiles. Configurez ensuite une rĂšgle avec le fournisseur `ProtonVPN`, le mode **Natif Gluetun** et le client qBittorrent concernĂ©. Companion : 1. lit le port courant dans `GET /v1/portforward` ; 2. l'envoie Ă  qBittorrent via `/api/v2/app/setPreferences` ; 3. relit les prĂ©fĂ©rences qBittorrent pour confirmer l'application ; 4. vĂ©rifie toutes les 5 minutes si Gluetun a renouvelĂ© le port et le rĂ©injecte si nĂ©cessaire ; 5. recommence aprĂšs une reconnexion Gluetun, une bascule vers ProtonVPN ou une bascule entre serveurs ProtonVPN. Avec ProtonVPN en **OpenVPN**, le nom d'utilisateur OpenVPN doit aussi porter le suffixe `+pmp`. Avec ProtonVPN en **WireGuard**, ce suffixe n'est pas utilisĂ©. Les intĂ©grations natives de Gluetun ouvrent elles-mĂȘmes le port dynamique cĂŽtĂ© VPN : `FIREWALL_VPN_INPUT_PORTS`, `FIREWALL_INPUT_PORTS` et un mapping Docker statique ne sont pas requis pour ce port. Pour AirVPN, Companion ne crĂ©e pas le port sur le panel AirVPN. Le flux attendu est : 1. rĂ©server le port dans le panel AirVPN ; 2. publier le port sur Gluetun, par exemple `19975:19975/tcp` et `19975:19975/udp` ; 3. ajouter le port Ă  `FIREWALL_INPUT_PORTS` et `FIREWALL_VPN_INPUT_PORTS` ; 4. dĂ©clarer le port dans Companion ; 5. lier le port au client qBittorrent concernĂ© ou ajouter une commande `on_port_change` ; 6. activer l’application automatique si les rĂšgles doivent suivre les changements de fournisseur VPN. Pour rTorrent/ruTorrent, liez simplement un client de type rTorrent Ă  la rĂšgle : la synchronisation XML-RPC s'applique automatiquement *(bĂȘta — voir ci-dessus)*. Pour les autres clients, les serveurs WireGuard personnels ou tout besoin spĂ©cifique, utilisez `on_port_change` pour appeler un script ou une commande maĂźtrisĂ©e. Les variables disponibles sont `{port}`, `{provider}`, `{name}`, `{protocols}` et `{client}`. Exemple : ```bash /compose/hooks/update-rtorrent-port.sh {port} ``` Une rĂšgle `Custom WireGuard` peut ainsi servir Ă  un serveur WireGuard personnel : le port est dĂ©clarĂ© en manuel, ou rĂ©cupĂ©rĂ© par un hook externe, puis Companion exĂ©cute la commande lorsque la rĂšgle devient applicable. ### Bandeau « Test en cours » et bouton ArrĂȘter Pendant tout test actif (benchmark complet, observation continue, test rapide proxy, sidecar, rotation de pool), un bandeau vert s'affiche en haut de chaque page avec le **type de test en cours**, le **serveur testĂ©**, la **progression en %** (barre + pourcentage) et une **estimation du temps restant** calculĂ©e sur la durĂ©e moyenne des serveurs dĂ©jĂ  testĂ©s ce cycle. Le bouton **ArrĂȘter** est disponible pour tous les modes : - **Benchmark / Observation / Sidecar** — arrĂȘt aprĂšs le serveur en cours (≀ 2 secondes). - **Test rapide (proxy)** — arrĂȘt aprĂšs l'Ă©chantillon en cours (≀ durĂ©e d'un Ă©chantillon, typiquement 8 s). - **Rotation de pool** — signal d'arrĂȘt envoyĂ© ; la rotation se termine proprement. La demande d'arrĂȘt est **persistĂ©e cĂŽtĂ© serveur** : recharger ou quitter la page ne la rĂ©initialise pas, le bandeau reste sur « ArrĂȘt demandé  » jusqu'Ă  l'arrĂȘt effectif. ### SĂ©lecteur de serveurs AirVPN Sur **Serveurs → + Ajouter des serveurs AirVPN** : un modal charge les donnĂ©es en direct depuis l'[API AirVPN](https://airvpn.org/?referred_by=483746) (cache 5 min cĂŽtĂ© serveur). Quatre onglets : - **Serveurs** — liste complĂšte avec barre de charge colorĂ©e (vert/orange/rouge), nombre d'utilisateurs, statut de santĂ©, tri par colonne, recherche en temps rĂ©el - **Par pays** — sections collapsibles par pays avec flag emoji, badge 🏆 **Best** sur le serveur le moins chargĂ©, bouton "SĂ©lectionner tous" par pays - **⭐ RecommandĂ©s** — serveurs rĂ©pondant aux critĂšres de prĂ©sĂ©lection : charge < 70 % et bande passante AirVPN annoncĂ©e ≄ 5 Gbit/s ; badge vert indiquant le nombre disponible. Le peering rĂ©el entre votre accĂšs et le serveur VPN n'est pas connu Ă  l'import : il est approchĂ© ensuite par les benchmarks Companion (latence, jitter, perte, dĂ©bit). - **↔ Changements** — diff depuis la derniĂšre consultation : nouveaux serveurs apparus (ajoutables en un clic), serveurs disparus de l'API, changements de charge ≄ 10 % (avec flĂšche ↑↓ et delta), top 5 pays classĂ©s par pourcentage de serveurs sains puis charge moyenne Les serveurs dĂ©jĂ  dans la base sont grisĂ©s et leur case Ă  cocher est dĂ©sactivĂ©e. La barre de recherche filtre simultanĂ©ment tous les onglets. SĂ©lection multiple, ajout en un clic. ### VĂ©rification rapide avant benchmark *(option)* Activer via **ParamĂštres → Mesurer → Éviter les tests inutiles**. Lorsque cette option est activĂ©e, chaque cycle commence par un test de dĂ©bit sur le **serveur actuellement actif uniquement** — avant de stopper des containers ou de relancer Gluetun : - **Dans la plage (dĂ©faut ±15 %)** : le benchmark complet est ignorĂ©. Aucun container n'est stoppĂ©, Gluetun n'est pas relancĂ©, aucune interruption VPN. Le cycle se termine en quelques secondes. - **Hors plage** : le benchmark complet se lance normalement — tous les serveurs sont testĂ©s, le meilleur est sĂ©lectionnĂ©. > **ImplĂ©mentation** : la vĂ©rification rapide passe **exclusivement par le proxy HTTP** de Gluetun — aucun container sidecar créé, aucune attente de reconnexion VPN. RĂ©sultat obtenu en 10–15 secondes. IdĂ©al pour des intervalles frĂ©quents (ex. toutes les 2–3 h) oĂč l'on veut un contrĂŽle rapide sans le coĂ»t d'un benchmark complet Ă  chaque fois. > La tolĂ©rance est configurable (1–100 %). Une valeur de 15 signifie : si le dĂ©bit actuel est compris entre 85 % et 115 % du dernier rĂ©sultat connu, le benchmark complet est ignorĂ©. ### Optimisation horaire *(option)* Activer via **ParamĂštres → Mesurer → Optimiser l’heure**. Companion analyse l’historique des tests pour calculer, pour chaque tranche horaire (0h–23h), le **dĂ©bit moyen** et le **coefficient de variation** (CV = σ/ÎŒ). Une heure avec un dĂ©bit Ă©levĂ© et une faible variance est une bonne fenĂȘtre de benchmark — les mesures y sont reprĂ©sentatives et reproductibles. **Score par heure** = `dĂ©bit_moyen × max(0, 1 − CV/100)` - 🟱 **Bonne fenĂȘtre** — score ≄ 70 % du maximum - 🔮 **À Ă©viter** — score < 50 % du maximum **Quand c’est utile** : si votre FAI rĂ©gule la bande passante Ă  certaines heures (throttling le soir, par exemple), ou si les serveurs VPN que vous utilisez sont significativement plus chargĂ©s Ă  certains moments de la journĂ©e. Dans ce cas, benchmarker aux heures creuses donne des mesures plus fidĂšles Ă  la rĂ©alitĂ© d’usage. **Quand c’est inutile** : si votre rĂ©seau est stable 24h/24 et que vos serveurs VPN ont une charge relativement constante, cette option n’apportera rien de concret. Elle ne change pas quel serveur est le plus rapide — elle change seulement *quand* vous le mesurez. **PrĂ©requis** : au moins **6 tests** dans au moins **8 tranches horaires** diffĂ©rentes. Les rĂ©sultats se stabilisent aprĂšs plusieurs jours de benchmarks automatiques. En dessous de ce seuil, les moyennes par heure sont trop sensibles aux valeurs aberrantes pour ĂȘtre fiables. **DĂ©calage automatique** *(sous-option)* : si le cycle planifiĂ© tombe sur une heure dĂ©favorable, le benchmark est dĂ©calĂ© d’un maximum de 3 h vers la prochaine fenĂȘtre favorable. Si aucune n’est trouvĂ©e dans ce dĂ©lai, le benchmark s’exĂ©cute immĂ©diatement. Une fois terminĂ©, le planificateur reprend son intervalle normal. **StabilitĂ© de la fenĂȘtre optimale** : la meilleure heure n’est confirmĂ©e et notifiĂ©e qu’aprĂšs **deux cycles consĂ©cutifs** pointant vers la mĂȘme heure. Cela Ă©vite les fausses alertes dues au bruit statistique (une seule mesure exceptionnelle suffisait autrefois Ă  faire changer la fenĂȘtre). > Cette option est complĂ©mentaire du cycle automatique — elle ne le remplace pas. L’intervalle configurĂ© reste la rĂ©fĂ©rence ; le dĂ©calage adaptatif n’ajuste que le prochain dĂ©clenchement si l’heure est jugĂ©e dĂ©favorable. ### SĂ©lection intelligente du benchmark *(recommandĂ©e pour les gros catalogues)* Activer via **ParamĂštres → Mesurer → Combien de serveurs tester**. Deux modes sont disponibles : - **Tout tester** — mode exhaustif : tous les serveurs actifs compatibles passent dans le cycle. C'est utile pour construire une base initiale, mais trĂšs long avec des catalogues comme NordVPN. - **SĂ©lection intelligente** — mode recommandĂ© : Companion teste les **N meilleurs serveurs dĂ©jĂ  connus** selon le profil d'usage actif, ajoute quelques serveurs **jamais testĂ©s**, puis rafraĂźchit quelques rĂ©sultats plus anciens que X jours. Les quotas configurables sont rangĂ©s dans **Options avancĂ©es de la sĂ©lection intelligente** : - **Top connus** — nombre de serveurs dĂ©jĂ  mesurĂ©s Ă  garder selon le profil d'usage. - **Nouveaux** — nombre de serveurs jamais benchmarkĂ©s Ă  explorer Ă  chaque cycle. - **Anciens aprĂšs J** + **À rafraĂźchir** — Ăąge minimum et nombre de rĂ©sultats anciens Ă  recontrĂŽler. Mettre un quota Ă  `0` dĂ©sactive cette partie. Le dashboard rappelle le mode utilisĂ©, le nombre de serveurs estimĂ© et le mode de test (`sidecar` ou `proxy`) avant lancement manuel. #### Observation continue pyramidale Activer via **ParamĂštres → Mesurer → Combien de serveurs tester → Observation continue pyramidale**. Ce mode sert Ă  rendre les profils d'usage sĂ©rieux sans lancer un benchmark gigantesque Ă  chaque fois. Il transforme le cycle automatique en collecte progressive : - **Exploration** — teste un lot de serveurs jamais mesurĂ©s, par rotation quotidienne dans la liste. - **Confirmation** — reprend les serveurs qui ont dĂ©jĂ  quelques mesures, jusqu'au seuil “confirmĂ©â€. - **Finalistes** — concentre les mesures sur les meilleurs candidats qui n'ont pas encore assez d'historique. - **RafraĂźchissement** — recontrĂŽle quelques serveurs matures dont les mesures sont devenues anciennes. En observation continue, Companion ne fait pas de quick check, ne coupe pas les containers configurĂ©s dans “Containers Ă  stopper pendant le benchmark” et ne bascule pas automatiquement de serveur. Le but est d'accumuler de l'historique utilisable, pas de perturber l'usage courant. Le dashboard affiche l'Ă©tat live de l'observation : serveur en cours, prochain serveur, progression du cycle, derniĂšres lignes d'activitĂ© Companion et lien direct vers `/history` pour consulter les rĂ©sultats enregistrĂ©s. Un watchdog interne vĂ©rifie rĂ©guliĂšrement que l'observation reprend bien aprĂšs un redĂ©marrage ou quand le cycle automatique classique est en pause. Si le cycle automatique classique est aussi activĂ©, il garde un objectif diffĂ©rent : comparer la sĂ©lection configurĂ©e Ă  intervalle rĂ©gulier et, si l'auto-switch est activĂ©, basculer Gluetun vers le meilleur serveur. Lorsqu'un cycle planifiĂ© arrive pendant l'observation continue, Companion met l'observation en pause, lance le benchmark complet normal (avec pause des containers si configurĂ©e), puis reprend l'observation via le watchdog. Les rotations de pool et les tests manuels (rapides ou complets) sont Ă©galement prioritaires : ils interrompent l'observation en cours, s'exĂ©cutent, puis l'observation reprend si nĂ©cessaire. Les profils ne doivent pas ĂȘtre compris comme une magie immĂ©diate : avec une ou deux mesures, ils donnent seulement une indication. Ils deviennent vraiment pertinents quand les serveurs ont plusieurs benchmarks complets, idĂ©alement Ă  des heures diffĂ©rentes. ### Serveurs autorisĂ©s avant benchmark *(option)* Activer via **ParamĂštres → Mesurer → Quels serveurs autoriser**. Ces rĂšgles rĂ©duisent la liste avant un benchmark complet. Les serveurs exclus restent visibles dans `/servers` et peuvent toujours ĂȘtre testĂ©s manuellement. Par dĂ©faut, le benchmark teste **toutes** les entrĂ©es activĂ©es dans `/servers`, quel que soit leur type Gluetun. Avec **Types Gluetun autorisĂ©s**, vous sĂ©lectionnez exactement quels types participeront au cycle : | Type | Variable Gluetun | Usage typique | |---|---|---| | **Nom** | `SERVER_NAMES` | Serveurs AirVPN individuels, nom prĂ©cis | | **Pays** | `SERVER_COUNTRIES` | SĂ©lection gĂ©ographique large | | **Ville** | `SERVER_CITIES` | SĂ©lection gĂ©ographique prĂ©cise | | **RĂ©gion** | `SERVER_REGIONS` | RĂ©gion / Ă©tat | | **Hostname** | `SERVER_HOSTNAMES` | Hostname FQDN | - **Tous cochĂ©s** (dĂ©faut) : comportement identique Ă  avant — aucun filtrage. - **Certains cochĂ©s** : seules les entrĂ©es des types cochĂ©s sont testĂ©es ; les autres restent dans `/servers` et peuvent ĂȘtre testĂ©es individuellement via le bouton « Tester maintenant ». > Utile si vous avez des entrĂ©es de type `country`/`region` pour une bascule de secours mais ne souhaitez les tester que ponctuellement, sans les inclure dans chaque cycle automatique. ### Éviter les serveurs AirVPN chargĂ©s *(option, dĂ©diĂ© [AirVPN](https://airvpn.org/?referred_by=483746))* Activer via **ParamĂštres → Mesurer → Quels serveurs autoriser → Éviter les serveurs AirVPN chargĂ©s**. Lorsque vous avez ajoutĂ© un grand nombre de serveurs **[AirVPN](https://airvpn.org/?referred_by=483746)** (type `SERVER_NAMES`), le benchmark complet peut ĂȘtre trĂšs long. Ce prĂ©-filtre permet d'**ignorer automatiquement les serveurs surchargĂ©s** au moment du lancement du cycle : - **Charge max (%)** — `0` = dĂ©sactivĂ©. Ex : `70` → les serveurs affichant une charge > 70 % dans le cache AirVPN sont ignorĂ©s pour ce cycle. - **Utilisateurs max** — `0` = dĂ©sactivĂ©. Ex : `30` → les serveurs avec plus de 30 utilisateurs connectĂ©s sont ignorĂ©s. Les deux seuils sont indĂ©pendants et cumulables — un serveur est ignorĂ© dĂšs qu'**au moins un** seuil activĂ© est dĂ©passĂ©. **DonnĂ©es utilisĂ©es** : la table interne `airvpn_snapshot`, mise Ă  jour toutes les **5 minutes** depuis l'API `airvpn.org/api/status/`. Aucun appel API supplĂ©mentaire n'est effectuĂ© au lancement du benchmark. **Serveurs sans donnĂ©es** : un serveur de type `name` sans entrĂ©e dans le snapshot (provider non-AirVPN, serveur hors API) n'est **jamais filtrĂ©** — il est toujours inclus dans le benchmark. **PĂ©rimĂštre** : ce filtre ne s'applique qu'aux serveurs de type `name` (**[AirVPN](https://airvpn.org/?referred_by=483746)**). Les entrĂ©es de type `country`, `city`, `region`, `hostname` ne sont jamais affectĂ©es. > Les serveurs ignorĂ©s restent dans `/servers`, peuvent ĂȘtre testĂ©s manuellement, et seront Ă  nouveau candidats au prochain cycle si leur charge a baissĂ© entre-temps. ### Écoute Docker events Un thread daemon dĂ©marre avec Companion et surveille en continu le flux d'Ă©vĂ©nements Docker filtrĂ© sur le container Gluetun. À chaque Ă©vĂ©nement `start` reçu : ``` ÉvĂ©nement Docker "start" reçu sur le container Gluetun ├─ RedĂ©marrage initiĂ© par Companion ? (fenĂȘtre de 180 s) → ignorĂ© silencieusement ├─ Cooldown actif ? (5 min depuis le dernier dĂ©clenchement) → ignorĂ© ├─ Benchmark dĂ©jĂ  en cours ? → ignorĂ© └─ OK — programmation d'un quick check diffĂ©rĂ© 1. Attente de N secondes (= valeur « DĂ©lai de reconnexion ») pour laisser le VPN se reconnecter 2. Quick check via le proxy HTTP sur le serveur actif ├─ VPN pas encore prĂȘt (pas de rĂ©ponse proxy) │ → log d'avertissement, abandon ├─ Aucun rĂ©sultat de rĂ©fĂ©rence en base │ → rĂ©sultat enregistrĂ© comme nouvelle rĂ©fĂ©rence, fin ├─ DĂ©bit dans la plage ±N % │ → log OK, fin └─ DĂ©rive dĂ©tectĂ©e (dĂ©bit hors plage) ├─ Bascule auto activĂ©e → benchmark complet immĂ©diat └─ Bascule auto dĂ©sactivĂ©e → log d'avertissement uniquement ``` **Suppression des redĂ©marrages Companion** : quand Companion bascule vers un serveur (`switch_server()`), il active une fenĂȘtre de suppression de 180 secondes. Tout Ă©vĂ©nement `start` reçu pendant cette fenĂȘtre est ignorĂ© — ce mĂ©canisme Ă©vite une boucle infinie oĂč Companion dĂ©clencherait lui-mĂȘme un quick check aprĂšs chaque bascule qu'il vient d'initier. **Badge dans l'historique** : les tests dĂ©clenchĂ©s par un Ă©vĂ©nement Docker sont marquĂ©s `docker_event` en base. Un badge sombre `auto` apparaĂźt sur la ligne correspondante dans l'historique (`/history`), avec un tooltip explicatif. **PrĂ©requis** : le socket Docker (ou le proxy Tecnativa) doit ĂȘtre accessible depuis Companion, et la variable `GLUETUN_CONTAINER` doit correspondre au nom exact du container Gluetun. ### Score de confiance par serveur Un indicateur colorĂ© est affichĂ© sur la page **Serveurs** (colonne *FiabilitĂ©*) et dans l'**Historique** pour chaque serveur. Il reflĂšte la fiabilitĂ© des mesures accumulĂ©es. | Niveau | Conditions | |---|---| | 🟱 ÉlevĂ© | ≄ 5 mesures **et** variabilitĂ© < 40 % | | 🟡 ModĂ©rĂ© | 2–4 mesures ou variabilitĂ© 40–70 % | | 🔮 Faible | ≀ 1 mesure, variabilitĂ© > 70 % ou Ă©checs consĂ©cutifs | La **variabilitĂ©** (coefficient de variation) mesure l'Ă©cart-type des dĂ©bits rapportĂ© Ă  la moyenne : 0 % = rĂ©sultats identiques Ă  chaque test, 100 % = rĂ©sultats trĂšs dispersĂ©s. Les tests `proxy_qc` sont exclus du calcul. Le score influence lĂ©gĂšrement la sĂ©lection automatique du meilleur serveur : HIGH × 1,0 · MEDIUM × 0,95 · LOW × 0,85 appliquĂ©s sur le score pondĂ©rĂ©. ### Profils d'usage Companion propose 6 **profils d'usage** sĂ©lectionnables depuis la page **Serveurs** (barre de pills) ou depuis **ParamĂštres → DĂ©cider → Profil d'usage**. Le profil actif dĂ©termine **comment le meilleur serveur est sĂ©lectionnĂ©** Ă  la fin de chaque cycle de benchmark, en pondĂ©rant diffĂ©remment les mĂ©triques mesurĂ©es. Important : un profil d'usage n'est fiable que si l'historique est suffisant. Au dĂ©but, Companion peut surtout comparer le dĂ©bit disponible ; la latence, le jitter, la perte de paquets, l'upload, le monoflux DDL et la stabilitĂ© ne deviennent discriminants qu'aprĂšs plusieurs benchmarks complets par serveur. Pour construire cet historique sans tester tout le catalogue en boucle, utilisez l'**observation continue pyramidale** dans **ParamĂštres → Mesurer**. | Profil | CritĂšre principal | Usage typique | |---|---|---| | **ÉquilibrĂ©** (dĂ©faut) | Score pondĂ©rĂ© existant (dĂ©bit + historique + stabilitĂ©) | Usage gĂ©nĂ©ral — comportement identique Ă  avant | | **Jeu en ligne** | Faible latence + faible jitter | FPS, MMO, jeux compĂ©titifs | | **BitTorrent** | Upload multiflux maximal | qBittorrent, Transmission, Deluge | | **DDL (mono-flux)** | DĂ©bit monoflux | Usenet (SABnzbd), tĂ©lĂ©chargeurs directs (JDownloader) | | **TĂ©lĂ©chargement (multi-flux)** | DĂ©bit download multiflux maximal | Radarr/Sonarr, transferts volumineux | | **Streaming vidĂ©o** | DĂ©bit stable + faible jitter | Jellyfin, Plex, lecture directe | **Algorithme** : pour chaque rĂ©sultat du cycle en cours, Companion calcule le `_weighted_score` (dĂ©bit + historique + stabilitĂ©), puis normalise [0,1] l'ensemble des rĂ©sultats sur chaque axe. La combinaison pondĂ©rĂ©e des scores normalisĂ©s dĂ©termine le meilleur serveur selon le profil actif. Le profil **ÉquilibrĂ©** reproduit exactement le comportement antĂ©rieur — aucune rĂ©gression. **Profil DDL et test monoflux** : le profil DDL exploite une mĂ©trique supplĂ©mentaire, le **dĂ©bit monoflux** (`dl_single_mbps`), mesurĂ©e aprĂšs le test principal (connexion VPN dĂ©jĂ  Ă©tablie, sans surcoĂ»t de reconnexion). Ce test est **optionnel** et dĂ©sactivĂ© par dĂ©faut — activer via **ParamĂštres → Mesurer → Mesure de vitesse → Test monoflux (DDL)**. **Page Serveurs** : la barre de profils affiche le **meilleur serveur pour le profil actif** (calculĂ© sur les moyennes historiques). Ce serveur est mis en Ă©vidence par un badge 🏆 sur sa ligne (masquĂ© en profil ÉquilibrĂ©). **Score explicable** : chaque serveur affichĂ© dans la vue tableau dispose d'un bouton 📊 (icĂŽne graphique) Ă  cĂŽtĂ© de son nom. Un clic ouvre un popover dĂ©taillant la contribution de chaque mĂ©trique au score final — dĂ©bit download, upload, latence, jitter, perte de paquets — sous forme de barres de progression pondĂ©rĂ©es, avec les valeurs brutes mesurĂ©es. Seules les mĂ©triques effectivement utilisĂ©es par le profil actif sont affichĂ©es. **FenĂȘtre temporelle de scoring** : par dĂ©faut, les moyennes utilisĂ©es pour le classement des serveurs sont calculĂ©es sur les **30 derniers jours**. Ce paramĂštre est ajustable dans **ParamĂštres → DĂ©cider → FenĂȘtre de scoring** : 7 j, 14 j, 30 j, ou toutes les donnĂ©es. Une fenĂȘtre courte favorise les performances rĂ©centes ; une fenĂȘtre longue lisse les pics ponctuels. **DĂ©tection d'outliers** : option activable dans **ParamĂštres → DĂ©cider → Filtrage des valeurs aberrantes**. Lorsqu'elle est active, les mesures isolĂ©es manifestement hors-norme sont ignorĂ©es lors du calcul des moyennes et du scoring — elles restent visibles dans l'historique. Exemple concret : si un serveur donne habituellement 80–100 Mbps et qu'un test exceptionnel affiche 5 ou 200 Mbps (pic rĂ©seau passager, saturation ponctuelle, test ratĂ©), cette valeur est Ă©cartĂ©e des calculs. La mĂ©thode IQR dĂ©termine automatiquement la plage normale par serveur et par mĂ©trique (dĂ©bit, latence, jitter
) sans seuil Ă  configurer. Requiert au minimum 4 mesures par serveur pour s'appliquer. ### Profils VPN (WireGuard & OpenVPN) Les profils VPN permettent de gĂ©rer plusieurs fournisseurs ou identitĂ©s VPN — en WireGuard comme en OpenVPN — dans une seule instance Companion, avec bascule automatique optimisĂ©e entre eux. Les 24 fournisseurs du [wiki Gluetun](https://github.com/qdm12/gluetun-wiki/tree/main/setup/providers) sont intĂ©grĂ©s (voir le [tableau des fournisseurs](#multi-provider-wireguard--openvpn)). #### CrĂ©ation d'un profil Dans **ParamĂštres → Profils VPN** : 1. Choisissez le provider dans le menu dĂ©roulant → les champs de configuration apparaissent dynamiquement selon les variables requises par Gluetun pour ce fournisseur 2. Si le fournisseur gĂšre les deux types, choisissez le **type de connexion** (WireGuard ou OpenVPN) — les champs s'adaptent au type sĂ©lectionnĂ© 3. Remplissez les champs (clĂ© privĂ©e, identifiants OpenVPN, etc.) — les champs marquĂ©s 🔒 sont chiffrĂ©s avant stockage 4. Nommez le profil (ex. « Mullvad — SuĂšde », « PIA — OpenVPN US ») 5. Les options *Actif* et *Rotation autorisĂ©e* permettent d'inclure ou exclure le profil des cycles automatiques > **SĂ©curitĂ© des secrets** : les valeurs chiffrĂ©es sont prĂ©fixĂ©es `enc:` en base. Elles ne sont dĂ©chiffrĂ©es qu'au moment de la construction de l'override Compose ou du lancement d'un container sidecar — jamais exposĂ©es dans les logs ni dans l'export de configuration. #### Profils OpenVPN Pour les fournisseurs OpenVPN, le profil porte selon le cas : - **Identifiants** — `OPENVPN_USER` / `OPENVPN_PASSWORD` (la majoritĂ© des fournisseurs : ExpressVPN, IPVanish, NordVPN, PIA, Surfshark, TorGuard, VyprVPN
) ; attention, plusieurs fournisseurs utilisent des identifiants *de service* distincts du login du site web (NordVPN, ProtonVPN, Surfshark, Windscribe) - **Certificat et clĂ© client** — CyberGhost, VPN Unlimited et AirVPN (OpenVPN) demandent en plus (ou Ă  la place) un certificat et une clĂ© client : collez le contenu base64 **sur une seule ligne**, sans les lignes `BEGIN`/`END`, dans les champs `OPENVPN_CERT` / `OPENVPN_KEY` — aucun fichier Ă  monter - **ClĂ© chiffrĂ©e + passphrase** — SlickVPN et VPN Secure utilisent une clĂ© client chiffrĂ©e (`OPENVPN_ENCRYPTED_KEY`) avec sa passphrase (`OPENVPN_KEY_PASSPHRASE`) À la bascule, Companion Ă©crit `VPN_TYPE=openvpn` et les variables `OPENVPN_*` dans l'override Compose, en blanchissant les identifiants des autres fournisseurs/types pour Ă©viter toute fuite. En mode sidecar, les profils OpenVPN sont testĂ©s avec leurs propres identifiants (pas de clĂ© sidecar dĂ©diĂ©e — la plupart des fournisseurs autorisent plusieurs connexions simultanĂ©es par compte). Le mode **Custom OpenVPN** (`VPN_SERVICE_PROVIDER=custom` + `VPN_TYPE=openvpn`) couvre tout fournisseur absent du catalogue Gluetun. Dans **ParamĂštres → Profils VPN → Configurations Custom OpenVPN**, Companion peut tĂ©lĂ©verser un fichier `.ovpn` ou `.conf`, dĂ©tecter ceux dĂ©jĂ  montĂ©s dans Gluetun, les lister et crĂ©er automatiquement le profil correspondant. Le mĂȘme dossier hĂŽte doit ĂȘtre montĂ© dans les deux containers : ```yaml # Compose de Gluetun services: gluetun-airvpn: volumes: - /home/aerya/docker/gluetun/openvpn:/gluetun/openvpn:ro # Compose de Companion services: gluetun-companion: volumes: - /home/aerya/docker/gluetun/openvpn:/openvpn environment: - OPENVPN_CONFIG_DIR=/openvpn - OPENVPN_CONTAINER_DIR=/gluetun/openvpn ``` Les fichiers tĂ©lĂ©versĂ©s apparaissent ainsi dans Gluetun sous `/gluetun/openvpn/nom-du-profil.ovpn`. La dĂ©tection peut aussi inventorier d'autres fichiers `.ovpn` ou `.conf` dĂ©jĂ  prĂ©sents sous `/gluetun`, sans `docker exec`. Comme indiquĂ© par Gluetun, les Ă©ventuels fichiers annexes rĂ©fĂ©rencĂ©s par la configuration (`ca.crt`, clĂ©, script
) doivent Ă©galement ĂȘtre montĂ©s sous `/gluetun` et rĂ©fĂ©rencĂ©s avec un chemin absolu. Si le fichier contient un nom d'hĂŽte dans sa directive `remote`, remplacez-le par une adresse IP afin que le pare-feu de dĂ©marrage de Gluetun n'ait pas besoin d'une rĂ©solution DNS prĂ©alable. #### Custom WireGuard : serveur personnel unique Le provider **Custom WireGuard** sert aux configurations Gluetun `VPN_SERVICE_PROVIDER=custom`, notamment quand vous avez un seul serveur WireGuard personnel ou un fournisseur sans catalogue de serveurs Gluetun. Dans ce mode, Companion ne renseigne **aucune variable `SERVER_*`** (`SERVER_NAMES`, `SERVER_COUNTRIES`, etc.). Les champs du profil custom dĂ©crivent directement l'unique endpoint WireGuard : - `WIREGUARD_ENDPOINT_IP` - `WIREGUARD_ENDPOINT_PORT` - `WIREGUARD_PUBLIC_KEY` - `WIREGUARD_PRIVATE_KEY` - `WIREGUARD_ADDRESSES` - `WIREGUARD_PRESHARED_KEY` si votre configuration l'utilise La ligne ajoutĂ©e dans **Serveurs** devient simplement un nom de suivi statistique, par exemple `Serveur perso`, `Home-WG` ou `VPS-Paris`. Elle permet d'attacher les benchmarks, l'historique, Prometheus et Grafana Ă  ce serveur, sans faire de comparatif entre plusieurs destinations. Configuration recommandĂ©e : 1. CrĂ©ez un profil **Custom WireGuard** dans **ParamĂštres → Profils VPN**. 2. Copiez les valeurs de votre fichier WireGuard `.conf` dans les champs du profil. 3. Ajoutez une seule entrĂ©e dans **Serveurs** avec un nom libre. 4. Assignez cette entrĂ©e au profil Custom WireGuard. 5. Laissez l'observation ou les benchmarks planifiĂ©s mesurer rĂ©guliĂšrement ce serveur. À la bascule, Companion Ă©crit `VPN_SERVICE_PROVIDER=custom`, `VPN_TYPE=wireguard` et les variables `WIREGUARD_*` dans `docker-compose.override.yml`, puis laisse toutes les variables `SERVER_*` vides. #### ⚠ ClĂ© WireGuard sidecar par profil (recommandĂ©e) > **Si vous utilisez le mode sidecar pour les benchmarks avec WireGuard, le plus fiable est de donner Ă  chaque profil WireGuard sa propre identitĂ© sidecar dĂ©diĂ©e. Companion permet aussi, en option avancĂ©e, de rĂ©utiliser la configuration WireGuard du profil principal.** > > Cette section ne concerne que les profils **WireGuard** : les profils OpenVPN sont testĂ©s directement avec leurs propres identifiants (la section *ClĂ© sidecar dĂ©diĂ©e* est masquĂ©e pour eux). **Pourquoi c'est recommandĂ© :** les containers sidecar de test clonent l'environnement de votre container Gluetun principal, y compris sa `WIREGUARD_PRIVATE_KEY`. Quand un container de test initie un nouveau handshake WireGuard avec la mĂȘme clĂ© depuis une adresse IP diffĂ©rente, certains fournisseurs VPN mettent Ă  jour la route du peer
 et le tunnel de votre Gluetun principal peut tomber. **Pourquoi il n'y a pas de clĂ© globale :** une clĂ© AirVPN ne peut pas s'authentifier auprĂšs de Mullvad ou Proton, et inversement. Une clĂ© sidecar partagĂ©e entre plusieurs providers est donc invalide par nature — chaque profil doit porter sa propre configuration. **Solution :** dans **ParamĂštres → Profils VPN**, modifiez chaque profil et renseignez la section *ClĂ© sidecar dĂ©diĂ©e* : - **ClĂ© privĂ©e sidecar** — nouvelle clĂ© privĂ©e gĂ©nĂ©rĂ©e auprĂšs du mĂȘme fournisseur que le profil (ex. `wg genkey` pour les providers qui l'acceptent, ou depuis votre espace client) - **Adresse IP sidecar** — l'adresse IP assignĂ©e Ă  cette clĂ© par votre fournisseur (format CIDR, ex. `10.x.x.x/32`) - **ClĂ© prĂ©-partagĂ©e sidecar** — uniquement si votre fournisseur en exige une **Cas AirVPN / device :** rĂ©exporter la configuration du mĂȘme device AirVPN redonne normalement le mĂȘme `PrivateKey`, `PresharedKey` et `Address`. Pour obtenir un triplet diffĂ©rent dĂ©diĂ© au sidecar, crĂ©ez un deuxiĂšme device/peer cĂŽtĂ© AirVPN, mĂȘme s'il correspond au mĂȘme serveur physique chez vous. **Option avancĂ©e :** cochez *RĂ©utiliser la configuration WireGuard du profil principal* si vous acceptez que le sidecar utilise les mĂȘmes identifiants WireGuard que Gluetun principal. C'est pratique pour les fournisseurs qui le tolĂšrent, mais cela peut perturber le tunnel principal chez d'autres. Si un profil n'a ni clĂ© sidecar dĂ©diĂ©e ni option de rĂ©utilisation activĂ©e, ses serveurs sont **ignorĂ©s** en mode sidecar (aucun rĂ©sultat d'Ă©chec enregistrĂ© — ils sont simplement exclus du cycle). Si le fallback proxy est activĂ©, ils basculent automatiquement en mode proxy. #### Liaison serveurs ↔ profils Sur la page **Serveurs** : - La colonne *Provider* affiche le profil VPN assignĂ© Ă  chaque serveur - Si aucun profil n'est assignĂ©, un menu dĂ©roulant permet l'assignation directe depuis le tableau - Le filtre `?profile=` (dropdown dans la barre de filtres) limite l'affichage aux serveurs d'un profil ou aux serveurs non assignĂ©s (`__none__`) - Les serveurs sans profil pendant qu'au moins un profil est configurĂ© sont signalĂ©s par une alerte *(serveurs orphelins)* #### Benchmark multi-profil — flux d'exĂ©cution ``` Cycle de benchmark avec profils VPN ├─ Chargement et dĂ©chiffrement des identifiants (WireGuard ou OpenVPN) │ pour chaque profil_id distinct dans la liste de serveurs │ → cache en mĂ©moire pour la durĂ©e du cycle (secrets dĂ©chiffrĂ©s, non persistĂ©s) └─ Pour chaque serveur activĂ© : 1. RĂ©cupĂ©ration de l'extra_env du profil associĂ© (VPN_SERVICE_PROVIDER, VPN_TYPE, WIREGUARD_* ou OPENVPN_*) 2. Mode sidecar : ├─ profil OpenVPN → container sidecar lancĂ© avec les identifiants du profil │ (la plupart des fournisseurs autorisent plusieurs connexions simultanĂ©es) ├─ profil WireGuard avec clĂ© sidecar dĂ©diĂ©e → container sidecar lancĂ© avec la clĂ© sidecar │ (Ă©vite le conflit de peer avec le tunnel Gluetun principal) ├─ profil WireGuard autorisant la rĂ©utilisation → sidecar avec les vars du profil principal └─ profil WireGuard sans clĂ© sidecar ni rĂ©utilisation → serveur IGNORÉ pour ce cycle (si fallback proxy activĂ© → test en mode proxy Ă  la place) 3. Mode proxy : test via le proxy HTTP Gluetun (pas de container sidecar) └─ SĂ©lection du meilleur serveur selon la politique de rotation : ├─ none → contraint au profil du serveur Gluetun actuellement actif ├─ conditional → bascule cross-profil si gain > seuil (dĂ©faut 10 %) └─ free → meilleur global, tous profils confondus └─ Bascule Gluetun : → Ă©criture de VPN_SERVICE_PROVIDER + VPN_TYPE + identifiants dans l'override Compose (les identifiants des autres fournisseurs/types sont blanchis) → docker compose up -d (un seul redĂ©marrage Gluetun) ``` #### Politique de rotation | Mode | Comportement | |---|---| | **none** | Companion cherche le meilleur serveur dans le profil actuellement actif. Si aucun rĂ©sultat n'est disponible pour ce profil (tous exclus, tous orphelins), aucune bascule. | | **free** | Tous les serveurs testĂ©s sont candidats — le meilleur global est retenu sans Ă©gard au profil. | | **conditional** | Le benchmark est global, mais la bascule vers un autre profil n'a lieu que si `score_meilleur_global > score_meilleur_du_profil_actif × (1 + seuil/100)`. Autrement, le meilleur serveur du profil actif est conservĂ©. | > Le seuil du mode `conditional` est configurable de 1 Ă  100 % dans les ParamĂštres. Un seuil de 10 % signifie : « ne change de profil que si le gain est supĂ©rieur Ă  10 % ». --- ### Pools de rotation Les pools de rotation permettent de basculer vers un serveur d'un groupe prĂ©dĂ©fini **sans dĂ©clencher de benchmark complet**. Accessible depuis la page **Rotation** dans la barre de navigation. #### CrĂ©ation d'un pool Dans **Rotation → Nouveau pool** : 1. Donnez un nom au pool (ex. « Gaming FR », « Fallback EU ») 2. Choisissez le **mode de sĂ©lection** : - đŸŽČ **AlĂ©atoire** — `random.choice()` parmi les candidats - 🔄 **Tour Ă  tour** — cycle alphabĂ©tique avec curseur persistant entre deux rotations - 🏆 **Meilleur dĂ©bit historique** — candidat avec le meilleur dĂ©bit moyen historique 3. Ajoutez un ou plusieurs **critĂšres** pour construire les **serveurs candidats** : - `Tous les serveurs actifs` — inclut l'intĂ©gralitĂ© des serveurs activĂ©s dans Companion - `Serveur prĂ©cis` — saisissez le nom exact ; l'autocomplete propose les serveurs existants - `Type de filtre Gluetun` — choisissez la variable (`SERVER_COUNTRIES`, `SERVER_NAMES`, etc.) et optionnellement une valeur (vide = tous les serveurs de ce type) - `Profil VPN` — tous les serveurs assignĂ©s Ă  un profil WireGuard ou OpenVPN spĂ©cifique - `Top N par mĂ©trique` — ajoute ou restreint selon les meilleurs historiques de dĂ©bit, jitter, perte ou DNS - `Bande passante AirVPN min.` — ajoute les serveurs AirVPN dont la capacitĂ© annoncĂ©e (`bw_max`) atteint au moins la valeur choisie 4. Choisissez comment combiner les rĂšgles : - **Ajouter les rĂ©sultats de chaque rĂšgle** — chaque rĂšgle ajoute des serveurs ; les doublons sont fusionnĂ©s automatiquement. - **Garder seulement les serveurs qui respectent toutes les rĂšgles** — plus strict, utile pour faire « France + profil AirVPN + Top dĂ©bit ». 5. Ajoutez si besoin des **exclusions du pool** : ces serveurs restent actifs dans Companion, mais ce pool ne les choisira jamais. 6. DĂ©finissez une **limite finale** optionnelle : si renseignĂ©e, seuls les N meilleurs dĂ©bits historiques restent Ă©ligibles aprĂšs rĂšgles et exclusions. 7. Configurez la **planification** : rotation automatique toutes les N heures (dĂ©sactivĂ©e = manuel uniquement) 8. Activez **Mesurer aprĂšs bascule** si vous souhaitez enregistrer le dĂ©bit aprĂšs chaque rotation. Cette mesure ne sert pas Ă  choisir le serveur. L'aperçu est mis Ă  jour en temps rĂ©el dans le modal : candidats avant exclusions, nombre de serveurs exclus, serveurs utilisables et limite finale Ă©ventuelle. #### Flux d'exĂ©cution d'une rotation ``` Rotation dĂ©clenchĂ©e (manuelle ou automatique) : 1. RĂ©solution des candidats ├─ rĂšgles ajoutĂ©es ensemble ou croisĂ©es selon le mode choisi ├─ retrait des exclusions explicites du pool ├─ retrait des serveurs connus incompatibles trackers (si option activĂ©e) └─ limite finale par dĂ©bit historique (si activĂ©e) 2. SĂ©lection du serveur cible (random / round-robin / meilleur dĂ©bit historique) 3. switch_server() → Ă©criture docker-compose.override.yml + docker compose up -d └─ Si profil VPN associĂ© : injection de VPN_SERVICE_PROVIDER, VPN_TYPE et WIREGUARD_* ou OPENVPN_* dans l'override 4. Attente reconnexion VPN + recrĂ©ation des containers `network_mode: service:gluetun` 5. Si mesure aprĂšs bascule activĂ©e : ├─ Attente reconnexion VPN (connection_wait_seconds) ├─ Test proxy rapide (proxy_qc) └─ Enregistrement dans speed_tests (test_trigger='pool_rotation') 6. Mise Ă  jour de l'Ă©tat du pool (last_rotated_at, next_rotation_at, dernier serveur, dernier dĂ©bit/erreur, curseur round-robin) 7. Notification Discord/Apprise (si activĂ©) ``` #### Planification automatique Le scheduler vĂ©rifie toutes les **5 minutes** si des pools ont une rotation en attente (`next_rotation_at <= now`). Si un benchmark est en cours, la rotation est diffĂ©rĂ©e au prochain tick (sans modifier `next_rotation_at`). > Les rotations de pool et les benchmarks partagent le mĂȘme verrou opĂ©rationnel : une rotation ne se dĂ©clenche pas pendant un benchmark actif, et inversement. Quand au moins un pool de rotation automatique est actif, le cycle automatique classique de **ParamĂštres → Mesurer** passe en pause : le toggle est dĂ©sactivĂ© dans l'UI, les benchmarks manuels restent disponibles, et les rotations de pool deviennent le planificateur principal. Cette mise en pause **persiste au redĂ©marrage du container** : Companion dĂ©tecte les pools actifs au dĂ©marrage et ne relance pas le cycle benchmark mĂȘme si la base de donnĂ©es conservait `auto_benchmark=1`. Les rotations de pool sont visibles sur le dashboard `/` et dans `/history`. Une bascule apparaĂźt comme activitĂ© de pool ; si l'option **Mesurer aprĂšs bascule** est activĂ©e, le test `proxy_qc` reçoit aussi le badge `pool`. #### Notifications de rotation de pool | Type | SĂ©vĂ©ritĂ© | Contenu | |---|---|---| | 🟡 Rotation de pool | Moyen | Nom du pool, mode (auto/manuel), serveur prĂ©cĂ©dent → nouveau, dĂ©bit si mesure aprĂšs bascule activĂ©e, IP publique | --- ### Score de sĂ©lection — composantes de stabilitĂ© Le score final de sĂ©lection intĂšgre dĂ©sormais **quatre composantes de fiabilitĂ©**, toutes pondĂ©rĂ©es par le curseur *PrioritĂ© dĂ©bit vs stabilitĂ©* (ParamĂštres) : ``` score = (w_cur × dĂ©bit_actuel + w_hist × historique_exp) × confidence_factor × effective_stability effective_stability = 1 − (stability_weight/100) × (1 − raw_stability) raw_stability = jitter_factor × loss_factor × reconnect_factor ``` | Composante | Source | PĂ©nalitĂ© max | |---|---|---| | **Jitter** | MesurĂ© Ă  chaque test (jitter_ms) | −15 % Ă  150 ms | | **Perte paquets** | MesurĂ© Ă  chaque test (packet_loss_pct) | −25 % Ă  10 % de perte | | **Reconnexions involontaires** | Docker events sur 30 j (test_trigger=docker_event) | −10 % par reconnexion, max −30 % | | **Confiance** (variance historique) | Coefficient de variation sur tous les tests de la fenĂȘtre de scoring (proxy_qc exclus) | −15 % (LOW) · −5 % (MEDIUM) | **Curseur PrioritĂ© dĂ©bit vs stabilitĂ©** (ParamĂštres → DĂ©cider) : - **0** — seul le dĂ©bit compte, toutes les pĂ©nalitĂ©s sont dĂ©sactivĂ©es - **30** (dĂ©faut) — 30 % des pĂ©nalitĂ©s sont appliquĂ©es - **100** — pĂ©nalitĂ©s complĂštes — un serveur Ă  300 Mbps avec 3 reconnexions involontaires + jitter Ă©levĂ© peut perdre jusqu'Ă  ~40 % de score > Un serveur Ă  200 Mbps sans reconnexion et avec un jitter stable sera prĂ©fĂ©rĂ© Ă  un 300 Mbps qui dĂ©connecte toutes les heures, dĂšs lors que `stability_weight ≄ ~20`. ### Vue patterns horaires (`/history/patterns`) Accessible depuis **Historique → Patterns horaires**, cette vue affiche les performances moyennes par tranche horaire (0h–23h) pour un serveur donnĂ©. - Graphique en barres colorĂ©es selon les performances relatives au maximum du serveur : 🟱 ≄ 85 % · 🟡 65–85 % · 🟠 45–65 % · 🔮 < 45 % - Heures en heure locale (variable d'environnement `TZ` respectĂ©e) - Meilleure et pire heure affichĂ©es en stat cards - Tests rapides (`proxy_qc`) exclus - **Visualisation pure** — cette vue n'influence pas le planificateur. C'est l'[Optimisation horaire](#optimisation-horaire-option) dans les ParamĂštres qui utilise ces donnĂ©es pour dĂ©caler les benchmarks automatiques. - Utile pour visualiser si un serveur VPN donnĂ© a des performances qui varient significativement selon l'heure ### DĂ©tection de nouveaux serveurs AirVPN FonctionnalitĂ© **dĂ©sactivĂ©e par dĂ©faut**, uniquement pour les utilisateurs AirVPN. Activable dans **ParamĂštres → Notifications**. **Logique :** 1. Toutes les 24 h, Companion rĂ©cupĂšre la liste AirVPN via `airvpn.org/api/status/` 2. Il compare avec les serveurs configurĂ©s (type `name`) pour dĂ©terminer quels pays vous utilisez 3. Si un nouveau serveur apparaĂźt dans un de ces pays, il est stockĂ© dans la base pendant 7 jours **Surfaces UI :** - **Badge** `+N` sur le bouton *Ajouter des serveurs AirVPN* (page Serveurs) - **BanniĂšre dismissable** en haut de la page Serveurs : *« 3 nouveaux serveurs disponibles dans vos pays (NL, FR) »* avec lien vers le modal - **Onglet Changements** dans le modal d'ajout : section *Nouveaux serveurs dĂ©tectĂ©s* avec badge ⭐ *Nouveau* et case Ă  cocher pour ajout direct ; filtre de recherche unifiĂ© **Notification Discord/Apprise :** EnvoyĂ©e uniquement lors de la dĂ©couverte de nouveaux serveurs, regroupĂ©e par pays. Utilise le champ *Mention Discord* global (voir [Notifications contextuelles](#notifications-contextuelles)). > AprĂšs 7 jours, les serveurs quittent automatiquement la liste des "nouveaux". Les serveurs ajoutĂ©s Ă  votre liste ne s'affichent plus dans le badge/banniĂšre. ### Notifications contextuelles Companion envoie des alertes ciblĂ©es via **webhook Discord** et/ou **[Apprise](https://github.com/caronc/apprise/wiki)** selon les Ă©vĂ©nements. Chaque type d'alerte est activable indĂ©pendamment dans **ParamĂštres → Notifications**. | Type d'alerte | SĂ©vĂ©ritĂ© | ActivĂ© par dĂ©faut | DĂ©clenchement | |---|---|---|---| | 🔮 Auto-exclusion serveur | Critique | ✅ | Un serveur est dĂ©sactivĂ© aprĂšs N Ă©checs consĂ©cutifs | | 🔮 Benchmark sans rĂ©sultat | Critique | ✅ | Le cycle complet se termine sans aucun rĂ©sultat valide | | 🟡 Bascule automatique | Moyen | ✅ | Companion bascule vers un meilleur serveur | | 🟡 Rotation de pool | Moyen | ✅ | Un pool de rotation bascule vers un nouveau serveur (auto ou manuel) | | 🟡 Nouveaux serveurs AirVPN | Moyen | *(selon dĂ©tection AirVPN)* | Nouveaux serveurs dĂ©tectĂ©s dans vos pays | | đŸ”” Bascule manuelle | Info | ❌ | Bascule dĂ©clenchĂ©e manuellement depuis l'UI | | đŸ”” Fin de benchmark | Info | ❌ | Cycle de benchmark terminĂ© avec succĂšs | | đŸ”” DĂ©jĂ  sur le meilleur | Info | ❌ | Le serveur actif est dĂ©jĂ  le meilleur — aucun changement | | đŸ”” RĂ©sultat quick check | Info | ✅ | Benchmark rapide manuel terminĂ© (serveur, vitesse, delta vs baseline) | | đŸ”” Changements catalogue | Info | ❌ | Serveurs ajoutĂ©s ou supprimĂ©s lors d'un refresh catalogue (dĂ©tail par provider) | | đŸ”” FenĂȘtre optimale changĂ©e | Info | ❌ | L'heure globale optimale de benchmark a changĂ© (basĂ© sur les patterns historiques) | **Mention Discord globale** : un seul champ `Mention Discord` (ex. `<@123456789>` pour un utilisateur, `<@&987654321>` pour un rĂŽle) s'applique Ă  toutes les alertes. Un seuil de sĂ©vĂ©ritĂ© est configurable : - **Critique uniquement** (dĂ©faut) — mention uniquement pour les alertes 🔮 - **Moyen et critique** — mention pour 🔮 et 🟡 - **Toutes** — mention pour toutes les alertes > La mention est injectĂ©e dans le payload Discord via `allowed_mentions` pour garantir la dĂ©livrance mĂȘme sur les serveurs avec restrictions de mentions. --- ### Jitter & Packet Loss Chaque test mesure automatiquement la **stabilitĂ©** de la connexion VPN, en plus du dĂ©bit. **MĂ©thode selon le mode :** - **Mode proxy** — 21 sondes TTFB (Time To First Byte) rĂ©parties sur 3 cibles (Cloudflare, Google, Quad9). La variance des temps de rĂ©ponse donne le jitter, les requĂȘtes Ă©chouĂ©es donnent le taux de perte. - **Mode sidecar** — l'endpoint `/ping` du container sidecar effectue des handshakes TCP sur les mĂȘmes 3 cibles (20 tentatives chacune). Retombe sur None si l'ancienne version du sidecar ne supporte pas `/ping`. **MĂ©triques produites :** - `jitter_ms` — Ă©cart-type des temps de rĂ©ponse (ms) — reprĂ©sente la variabilitĂ©/instabilitĂ© - `packet_loss_pct` — pourcentage de requĂȘtes/paquets perdus - `ping_min_ms` / `ping_max_ms` — meilleur et pire temps de rĂ©ponse **Surfaces UI :** - **Page Serveurs** — colonne *StabilitĂ©* : point colorĂ© 🟱 (jitter < 15 ms, perte < 1 %) / 🟡 (< 50 ms, < 5 %) / 🔮 (au-delĂ ), tooltip avec valeurs dĂ©taillĂ©es - **Historique** — colonnes *Jitter* et *Perte* avec code couleur identique par ligne - **Patterns horaires** — le tooltip de chaque barre inclut le jitter moyen de la tranche horaire **IntĂ©gration dans le score de sĂ©lection :** Le score est multipliĂ© par un facteur de pĂ©nalitĂ© cumulatif : - Jitter : `max(0.85, 1 − jitter_ms / 1000)` → pĂ©nalitĂ© jusqu'Ă  −15 % - Perte : `max(0.75, 1 − packet_loss_pct / 40)` → pĂ©nalitĂ© jusqu'Ă  −25 % > Un serveur rapide mais instable sera donc dĂ©classĂ© au profit d'un serveur lĂ©gĂšrement moins rapide mais fiable. ### Endpoint Prometheus `/metrics` L'endpoint `GET /metrics` expose les mĂ©triques clĂ©s au format texte Prometheus, sans dĂ©pendance externe. **MĂ©triques disponibles** (par serveur) : - `gluetun_companion_server_avg_dl_mbps` — dĂ©bit download moyen (benchmarks complets uniquement, `proxy_qc` exclu) - `gluetun_companion_server_avg_ul_mbps` — dĂ©bit upload moyen - `gluetun_companion_server_avg_latency_ms` — latence moyenne - `gluetun_companion_server_test_count` — nombre total de tests - `gluetun_companion_server_failure_count` — nombre de tests Ă©chouĂ©s - `gluetun_companion_server_consecutive_failures` — Ă©checs consĂ©cutifs en cours - `gluetun_companion_server_enabled` — 1 si activĂ© pour le benchmark - `gluetun_companion_server_active` — 1 si c'est le serveur Gluetun actuellement actif - `gluetun_companion_server_last_benchmark_ts_seconds` — timestamp Unix du dernier test enregistrĂ© Les mĂ©triques serveur portent les labels `server`, `provider` et `profile`, ce qui permet Ă  Grafana de proposer automatiquement des filtres quand vous ajoutez des serveurs, fournisseurs ou profils VPN. **MĂ©triques globales** : - `gluetun_companion_switches_total` — nombre total de bascules - `gluetun_companion_switches_success_total` — bascules rĂ©ussies - `gluetun_companion_benchmark_running` — 1 si un benchmark est en cours - `gluetun_companion_benchmark_total_servers`, `gluetun_companion_benchmark_done_servers`, `gluetun_companion_benchmark_remaining_servers` — progression du cycle en cours - `gluetun_companion_continuous_observation_enabled`, `gluetun_companion_continuous_observation_running` — Ă©tat de l'observation continue - `gluetun_companion_rotation_pools_total`, `gluetun_companion_rotation_pools_enabled`, `gluetun_companion_rotation_pools_auto_enabled` — Ă©tat global des pools - `gluetun_companion_rotation_pool_last_speed_mbps`, `gluetun_companion_rotation_pool_last_rotation_timestamp_seconds`, `gluetun_companion_rotation_pool_next_rotation_timestamp_seconds` — mĂ©triques par pool, avec label `pool` - `gluetun_companion_last_switch_timestamp_seconds` — timestamp Unix de la derniĂšre bascule **Authentification** : par dĂ©faut ouvert (standard pour un rĂ©seau interne). Deux façons de protĂ©ger `/metrics` par Bearer token : dĂ©finir la variable d'environnement `METRICS_TOKEN`, ou configurer un **token API** dans ParamĂštres → Maintenance → REST API (les deux sont supportĂ©s, `METRICS_TOKEN` a la prioritĂ©). **Scrape Prometheus** (Ă  ajouter dans `prometheus.yml`) : ```yaml scrape_configs: - job_name: gluetun-companion static_configs: - targets: ['gluetun-companion:8765'] # Si METRICS_TOKEN est dĂ©fini : # bearer_token: your-secret-token ``` --- ### REST API L'API est **dĂ©sactivĂ©e par dĂ©faut**. Pour l'activer : **ParamĂštres → Maintenance → REST API → GĂ©nĂ©rer un nouveau token**. **Authentification** : toutes les requĂȘtes doivent inclure l'en-tĂȘte : ``` Authorization: Bearer ``` **Endpoints disponibles :** | MĂ©thode | URL | Description | |---|---|---| | `GET` | `/api/v1/status` | Serveur actif, Ă©tat VPN, benchmark en cours, prochain cycle | | `GET` | `/api/v1/servers` | Liste complĂšte des serveurs avec dĂ©bit moyen, jitter, fiabilitĂ© | | `GET` | `/api/v1/history` | Historique des tests (`?limit=50&offset=0&server=Castor`) | | `GET` | `/api/v1/switches` | Historique des bascules (`?limit=20`) | | `POST` | `/api/v1/benchmark/trigger` | DĂ©clencher un benchmark complet (asynchrone, HTTP 202) | | `POST` | `/api/v1/benchmark/trigger-quick` | DĂ©clencher un test rapide proxy (asynchrone, HTTP 202) | **Exemples curl :** ```bash # Statut curl -H "Authorization: Bearer " http://localhost:8765/api/v1/status # DĂ©clencher un benchmark curl -X POST -H "Authorization: Bearer " http://localhost:8765/api/v1/benchmark/trigger # Historique des 10 derniers tests du serveur Castor curl -H "Authorization: Bearer " \ "http://localhost:8765/api/v1/history?limit=10&server=Castor" ``` **Codes de retour :** - `200` — succĂšs (GET) - `202` — dĂ©clenchement acceptĂ© (POST trigger) - `401` — token invalide ou absent - `403` — API dĂ©sactivĂ©e (aucun token configurĂ©) - `409` — un benchmark est dĂ©jĂ  en cours (POST trigger) > Les POST triggers retournent immĂ©diatement — le benchmark tourne en arriĂšre-plan. Utilisez `GET /api/v1/status` pour suivre la progression (`benchmark_running`). ### Cycle automatique vs dĂ©clenchement manuel Dans **ParamĂštres → Mesurer** : le cycle automatique peut ĂȘtre dĂ©sactivĂ© via le toggle *Activer le cycle de benchmark automatique*. Le champ intervalle est alors grisĂ©. Deux boutons restent disponibles Ă  tout moment (dashboard et paramĂštres) : - **Benchmark rapide** — teste uniquement le serveur actif via le proxy HTTP de Gluetun ; rĂ©sultat en quelques secondes, aucune interruption VPN, rĂ©sultat sauvegardĂ© dans l'historique (mĂ©thode `proxy_qc`). - **Benchmark complet** — lance un cycle complet immĂ©diatement, quels que soient le cycle automatique et l'option *VĂ©rification rapide*. Utilise la mĂ©thode configurĂ©e (sidecar ou proxy), label affichĂ© entre parenthĂšses sur le bouton. > **Estimation de durĂ©e** : le dashboard affiche sous les boutons une fourchette `~min–max / serveur` et un total estimĂ© pour la sĂ©lection rĂ©ellement testĂ©e, calculĂ©s Ă  partir de `wait_secs`, `duration`, `samples`, `retries`, du mode (proxy/sidecar), des filtres et de la sĂ©lection intelligente. Une alerte ⚠ s'affiche automatiquement si le total pessimiste dĂ©passe 30 minutes. La mĂȘme estimation est recalculĂ©e en temps rĂ©el dans **ParamĂštres → Mesurer** aprĂšs chaque modification. --- ## Dashboard Grafana Un fichier JSON de dashboard Grafana est tĂ©lĂ©chargeable depuis **ParamĂštres**. Il est prĂ©-cĂąblĂ© sur les mĂ©triques Prometheus de Companion et comprend des panneaux pour : - DĂ©bit descendant/montant par serveur (bar gauge) - Latence, jitter, perte de paquets, DNS (bar gauge) - Indice de confiance et score de profil (bar gauge) - Erreurs par type (donut chart) - Observation continue : activĂ©e/en cours, progression du cycle - Pools de rotation : nombre de pools, pools automatiques actifs, derniĂšre/prochaine rotation - Tableau rĂ©capitulatif de tous les serveurs - Filtres automatiques Grafana par provider, profil VPN et serveur ### MĂ©triques Prometheus disponibles En plus des mĂ©triques de base (`avg_dl`, `avg_ul`, `avg_latency`, `test_count`, `failure_count`, `enabled`, `active`), Companion expose : | MĂ©trique | Description | |---|---| | `gluetun_companion_server_avg_jitter_ms` | Jitter moyen (tests sidecar uniquement) | | `gluetun_companion_server_avg_loss_pct` | Perte de paquets moyenne | | `gluetun_companion_server_avg_dns_ms` | Latence DNS moyenne | | `gluetun_companion_server_confidence` | Indice de confiance : 0=LOW, 1=MEDIUM, 2=HIGH | | `gluetun_companion_server_score` | Score du profil actif [0–1] | | `gluetun_companion_server_last_benchmark_ts_seconds` | Timestamp Unix du dernier test | | `gluetun_companion_benchmark_total_servers`, `*_done_servers`, `*_remaining_servers` | Progression du cycle de benchmark/observation en cours | | `gluetun_companion_continuous_observation_enabled`, `*_running` | État de l'observation continue | | `gluetun_companion_rotation_pools_total`, `*_enabled`, `*_auto_enabled` | Compteurs globaux des pools | | `gluetun_companion_rotation_pool_last_speed_mbps`, `*_last_rotation_timestamp_seconds`, `*_next_rotation_timestamp_seconds` | MĂ©triques par pool (`pool`) | | `gluetun_companion_errors_total{type}` | Compteur d'erreurs par type : timeout, connection, vpn, other | --- ## Workflows automatisĂ©s Les badges en haut du README donnent un Ă©tat rapide. Les automatisations rĂ©ellement configurĂ©es dans le dĂ©pĂŽt sont les suivantes : | Automatisation | DĂ©clenchement | RĂŽle | |---|---|---| | [Build & publication Docker](.github/workflows/docker-publish.yml) | Chaque PR, chaque push sur `main` et chaque tag `v*` | Construit les images Companion et Sidecar pour `amd64`/`arm64`. Sur `main` et les tags, publie les images dans GHCR. Sur les PR, exĂ©cute aussi un smoke test HTTP en `amd64`. | | [Dependabot](.github/dependabot.yml) | Chaque lundi Ă  06:00 UTC | Surveille les dĂ©pendances Python de Companion et du Sidecar, les actions GitHub et les images de base Docker, puis ouvre des PR de mise Ă  jour. | | [Auto-merge Dependabot](.github/workflows/dependabot-automerge.yml) | À l’ouverture ou la mise Ă  jour d’une PR Dependabot | Demande l’auto-merge des mises Ă  jour `patch` aprĂšs rĂ©ussite des contrĂŽles. Cela nĂ©cessite que **Allow auto-merge** soit activĂ© dans les paramĂštres GitHub du dĂ©pĂŽt ; sinon la PR reste Ă  fusionner manuellement. Les mises Ă  jour mineures restent soumises Ă  revue et les mises Ă  jour majeures sont gĂ©nĂ©ralement ignorĂ©es par la configuration Dependabot. | | [Analyse Trivy](.github/workflows/trivy-scan.yml) | Chaque lundi Ă  07:00 UTC, ou manuellement | Construit et analyse les deux images pour les CVE `HIGH`/`CRITICAL`, publie les rĂ©sultats SARIF dans l’onglet Security et ouvre une PR de correction ou une issue lorsqu’une intervention manuelle est nĂ©cessaire. | Une rĂ©ussite du workflow Docker signifie que les images se construisent et dĂ©marrent dans le smoke test. Pour empĂȘcher techniquement la fusion d’une PR en cas d’échec, les contrĂŽles concernĂ©s doivent Ă©galement ĂȘtre dĂ©clarĂ©s comme **required status checks** dans les rĂšgles de protection de `main`. --- ## Notes - **Mode sidecar (dĂ©faut) :** votre Gluetun principal n'est jamais relancĂ© pendant les tests — les services dĂ©pendants ne sont pas interrompus. **Mode proxy (optionnel) :** le benchmark interrompt briĂšvement ces services Ă  chaque test de serveur. Planifiez pendant les heures creuses. - **FrĂ©quence et nombre de serveurs :** chaque test gĂ©nĂšre une reconnexion VPN. Tester 10 serveurs toutes les 2 heures = 120 reconnexions/jour. La plupart des fournisseurs limitent les connexions *simultanĂ©es*, pas la frĂ©quence — mais un intervalle trop court peut dĂ©clencher une dĂ©tection d'abus. **6 h et moins de 10 serveurs** est un rĂ©glage raisonnable. - En mode Compose, le fichier `docker-compose.override.yml` est gĂ©rĂ© automatiquement — ne le modifiez pas manuellement. En mode Unraid/DockerMan, Companion Ă©crit les variables gĂ©rĂ©es dans le template DockerMan du container Gluetun avant recrĂ©ation. - L'IPv6 est affichĂ© si votre fournisseur VPN le supporte (AirVPN le supporte). - Le socket Docker (`/var/run/docker.sock`) est requis pour le mode sidecar, les containers post-bascule et la pause pendant le benchmark. --- ## SĂ©curitĂ© - **CSRF** — Toutes les actions POST (formulaires et AJAX) sont protĂ©gĂ©es par un token CSRF via session serveur. L'en-tĂȘte `X-CSRF-Token` est injectĂ© automatiquement sur chaque `fetch` non-GET grĂące Ă  un intercepteur JavaScript. - **XSS** — Les donnĂ©es issues d'API tierces (AirVPN) injectĂ©es dans le DOM via `innerHTML` sont systĂ©matiquement Ă©chappĂ©es par une fonction `_esc()` (HTML entity encoding) avant insertion. Les attributs `onclick`/`onchange` inline prĂ©sents dans les composants dynamiques ne contiennent que des valeurs JSONifiĂ©es ou des constantes — aucune donnĂ©e utilisateur non Ă©chappĂ©e n'y est interpolĂ©e. - **SECRET_KEY** — L'application refuse de dĂ©marrer si `SECRET_KEY` est absente ou Ă©gale Ă  la valeur par dĂ©faut (`dev-secret-change-me`, `remplacer-par-une-chaine-aleatoire-longue`). GĂ©nĂšre une clĂ© sĂ©curisĂ©e avec : `openssl rand -hex 32`. - **Injection YAML/XML** — La valeur du filtre de serveur est assainie avant Ă©criture dans `docker-compose.override.yml` en mode Compose (retours Ă  la ligne supprimĂ©s, guillemets et backslashs Ă©chappĂ©s). En mode Unraid/DockerMan, les valeurs sont Ă©chappĂ©es avant Ă©criture dans le template XML, avec sauvegarde `.bak` datĂ©e. - **Socket Docker** — Le socket Docker est sĂ©curisĂ© via [docker-socket-proxy](https://github.com/Tecnativa/docker-socket-proxy), qui restreint les appels autorisĂ©s : lecture (containers, images, rĂ©seaux, volumes) + POST/DELETE pour la gestion des sidecars temporaires. Tout accĂšs direct au daemon Docker (exec, swarm, info
) est bloquĂ©. - **Anti brute-force** — Le login bloque une IP aprĂšs 5 Ă©checs en 5 minutes pendant 15 minutes (compteur en mĂ©moire, remis Ă  zĂ©ro Ă  la connexion rĂ©ussie). - **Exposition rĂ©seau** — Gunicorn Ă©coute sur `0.0.0.0:8765` (toutes interfaces). **Ne pas exposer ce port directement sur Internet.** Sur un serveur accessible publiquement, placez Companion derriĂšre un reverse proxy (Nginx, Caddy, Traefik) avec HTTPS et authentification forte, ou restreignez le binding Ă  l'interface locale : `127.0.0.1:8765:8765` dans le `docker-compose.yml`. - **`/metrics`** — Ouvert par dĂ©faut sur le LAN. Si votre machine est accessible depuis l'extĂ©rieur, dĂ©finissez la variable `METRICS_TOKEN` ou configurez un token API dans ParamĂštres → Maintenance → REST API : `/metrics` l'utilisera automatiquement pour exiger un Bearer token. - **Sidecar** — Chaque container sidecar (speed-test sur le port `8766`, catalogue sur le port `8767`) reçoit automatiquement un secret alĂ©atoire gĂ©nĂ©rĂ© par le Companion (`SIDECAR_SECRET`, 32 octets d'entropie via `secrets.token_hex`). Toutes les requĂȘtes HTTP vers le sidecar exigent ce secret dans l'en-tĂȘte `X-Sidecar-Token` — un sidecar sans le bon token rĂ©pond `403`. Ce secret est unique par instance et dĂ©truit avec le container Ă  la fin du test. Ces ports ne doivent pas ĂȘtre accessibles depuis l'extĂ©rieur : si votre hĂŽte est public, restreignez le binding ou isolez ces ports par firewall. - **Secrets dans /settings** — Le token API, le mot de passe proxy et les URLs de webhook sont affichĂ©s en clair dans l'interface d'administration. Tout accĂšs Ă  l'UI admin Ă©quivaut Ă  un accĂšs total Ă  ces secrets. ### SĂ©curitĂ© des images Docker Les deux images (`gluetun-companion` et `gluetun-companion-sidecar`) embarquent des **binaires Go tiers** (Docker CLI, Docker Compose, librespeed-cli, ookla speedtest) qui ont leur propre chaĂźne de dĂ©pendances, invisible pour les gestionnaires de paquets Python. Un pipeline Ă  deux niveaux maintient ces images Ă  jour : **Dependabot** (dĂ©jĂ  en place, exĂ©cutĂ© chaque lundi 06:00 UTC) : - Met Ă  jour les dĂ©pendances **pip** de Companion et du Sidecar (PRs automatiques ; les patchs demandent l'auto-merge si cette fonction GitHub est activĂ©e, les mineures restent en revue manuelle) - Surveille les images de base **Docker** (`python:3.12-slim`) — mises Ă  jour de sĂ©curitĂ© du runtime Python - Surveille les versions des **GitHub Actions** dans les workflows CI **Workflow Trivy** (`.github/workflows/trivy-scan.yml`, chaque lundi 07:00 UTC) : - Builde les deux images et les scanne avec [Trivy](https://github.com/aquasecurity/trivy) pour les CVE de sĂ©vĂ©ritĂ© HIGH et CRITICAL - Upload les rĂ©sultats au format SARIF dans l'**onglet Security** du dĂ©pĂŽt GitHub (visible sous *Security → Code scanning*) - Si des CVE avec fix disponible sont dĂ©tectĂ©es et qu'une image Docker CLI plus rĂ©cente existe : **ouvre automatiquement une PR** qui bumpe le `FROM docker:XX-cli` dans le Dockerfile - Si aucun changement automatique n'est possible : **ouvre une Issue** listant les CVE Ă  corriger manuellement **Smoke test** (`.github/workflows/docker-publish.yml`, sur chaque PR) : - Builde les deux images en amd64 - DĂ©marre chaque container avec une configuration minimale et vĂ©rifie qu'il rĂ©pond en HTTP dans les 20 secondes - Échoue si une image ne dĂ©marre plus ; il bloque la fusion lorsqu'il est configurĂ© comme contrĂŽle requis dans la protection de `main` --- ## CrĂ©dits Merci Ă  **[qdm12](https://github.com/qdm12/gluetun)** pour Gluetun, sans lequel ce projet n'existerait pas. Merci Ă  **[Tecnativa](https://github.com/Tecnativa/docker-socket-proxy)** pour docker-socket-proxy, utilisĂ© pour sĂ©curiser l'accĂšs au socket Docker. Merci Ă  **[brashenfr](https://github.com/brashenfr)**, **[dje33](https://github.com/the-real-dje33)**, **[lnksilver5](https://github.com/lnksilver5)**, **[prismillon](https://github.com/prismillon)**, **[Ptite Pomme](https://github.com/ptitzgeg-on-git)**, **[x0gen](https://github.com/x0gen)**, **[zlimteck](https://github.com/zlimteck)** et **[Zup](https://github.com/Gusdezup)** pour les idĂ©es et les tests. --- ## Licence [PolyForm Noncommercial 1.0.0](LICENSE) — usage personnel et associatif libre, usage commercial sur autorisation.