> đŹđ§ [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/)**.
> **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.