SWAG
Reverse proxy du serveur : nginx préconfiguré par LinuxServer.io, avec obtention et renouvellement automatiques du certificat Let's Encrypt, fail2ban intégré et un système de mods pour ajouter des fonctions. Toutes les requêtes venant d'Internet passent par lui.
Stack et intégration avec Authelia et CrowdSec : voir Reverse proxy.
Certificat
| Variable | Valeur | Rôle |
|---|---|---|
| URL | <DOMAINE> | Domaine principal |
| SUBDOMAINS | wildcard | Certificat valable pour tous les sous-domaines (*.<DOMAINE>) |
| VALIDATION | duckdns | Preuve de propriété du domaine par un enregistrement DNS, via DuckDNS |
| DUCKDNSTOKEN | <JETON> | Jeton DuckDNS, le même que celui du conteneur DuckDNS |
| ONLY_SUBDOMAINS | false | Le domaine nu est aussi couvert |
| <EMAIL> | Avertissements de Let's Encrypt |
Le renouvellement est automatique. Vérifier la date d'expiration :
Autres possibilités : VALIDATION=http (sans DNS, mais pas de certificat wildcard), VALIDATION=dns avec DNSPLUGIN (Cloudflare, OVH…), CERTPROVIDER=zerossl, EXTRA_DOMAINS pour d'autres domaines, STAGING=true pour tester sans consommer le quota de Let's Encrypt.
Mods
Déclarés dans DOCKER_MODS, séparés par | :
| Mod | Rôle |
|---|---|
| swag-dashboard | Tableau de bord sur le port 81 : proxy-confs actifs, statistiques de trafic (GoAccess), état de fail2ban |
| swag-crowdsec | Bouncer CrowdSec (voir CrowdSec) |
Mods utiles, non installés :
| Mod | Rôle |
|---|---|
| swag-auto-reload | Recharge nginx à chaque modification dans /config/nginx |
| swag-auto-proxy (avec universal-docker) | Crée le proxy d'un conteneur portant le label swag=enable ; labels swag_port, swag_url, swag_auth=authelia, swag_auth_bypass=/api |
| swag-maxmind ou swag-dbip | Géolocalisation des adresses, pour bloquer ou autoriser des pays |
| swag-cloudflare-real-ip | Vraies adresses des visiteurs derrière le proxy Cloudflare |
Fichiers
Dans <APPDATA>/swag/config/nginx/ :
| Fichier ou dossier | Rôle |
|---|---|
| nginx.conf | Configuration générale de nginx |
| ssl.conf | Réglages TLS et en-têtes de sécurité, inclus par chaque proxy-conf |
| proxy.conf | En-têtes transmis au service (IP d'origine, protocole, WebSocket), délais |
| resolver.conf | Résolveur DNS interne de Docker, pour trouver les conteneurs par leur nom |
| authelia-server.conf / authelia-location.conf | Intégration d'Authelia |
| authentik-*, ldap-*, tinyauth-* | Équivalents pour d'autres systèmes d'authentification, non utilisés |
| site-confs/default.conf | Site par défaut, pour les noms non reconnus |
| proxy-confs/ | Un fichier par service publié |
| real-ip.conf, stream.conf | Adresse réelle derrière un autre proxy ; proxy TCP/UDP |
Chaque fichier existe aussi en .sample : à chaque mise à jour, SWAG remet les modèles à jour sans toucher aux fichiers actifs. Comparer de temps en temps les deux versions pour intégrer les évolutions.
Après toute modification :
docker exec swag nginx -s reload # appliquer
Proxy-confs actifs
Un fichier <SERVICE>.subdomain.conf par service. Les préfixes numériques (10-, 20-…) fixent l'ordre de chargement. Un fichier renommé en .disabled (ou toute extension autre que .conf) est ignoré.
Services publiés : adguard, castopod-test, changedetection, code, copyparty, dashboard, dashy, dawarich, flus, glances, immich, jellyfin, jellystat, joplin, joplin-app, n8n, networking-toolbox, nextcloud, osint (web-check), passbolt, portainer, searx, ssh (Sshwifty), vikunja, wallabag, wallos, xwiki.
Exemple commenté de proxy-conf écrit à la main : voir Reverse proxy.
TLS et en-têtes de sécurité
Dans ssl.conf : TLS 1.2 et 1.3 uniquement.
Les en-têtes de sécurité proposés par SWAG sont tous commentés, donc inactifs :
| En-tête | Effet |
|---|---|
| Strict-Transport-Security | Impose le HTTPS au navigateur pour les visites suivantes (HSTS) |
| Content-Security-Policy | Passage automatique en HTTPS des ressources ; interdit l'affichage du site dans un cadre d'un autre site |
| X-Frame-Options | Même protection contre l'affichage dans un cadre, ancienne méthode |
| X-Content-Type-Options | Empêche le navigateur de deviner le type des fichiers |
| Referrer-Policy | Ne transmet l'adresse de provenance qu'au même site |
| Permissions-Policy | Désactive certaines fonctions de suivi du navigateur |
| Alt-Svc | Annonce HTTP/3 |
Pour les activer, les décommenter dans ssl.conf puis recharger nginx. Précautions : HSTS est mémorisé longtemps par les navigateurs (le site ne pourra plus être servi en HTTP), et les restrictions de cadre peuvent casser un service affiché dans un autre (un tableau de bord qui intègre des pages, par exemple). Tester service par service.
fail2ban intégré
SWAG contient son propre fail2ban, qui bannit à partir des journaux de nginx, en complément de CrowdSec.
| Prison | Bannit |
|---|---|
| nginx-http-auth | Les échecs d'authentification HTTP basique |
| nginx-badbots | Les robots malveillants connus |
| nginx-botsearch | Les recherches de pages d'administration ou de fichiers sensibles |
| nginx-deny | Les accès refusés par une règle deny |
| nginx-unauthorized | Les réponses 401 répétées |
| nginx-444-copyparty | Prison personnalisée pour copyparty |
docker exec swag fail2ban-client status <PRISON> # adresses bannies
docker exec swag fail2ban-client set <PRISON> unbanip <IP> # débannir
Configuration : <APPDATA>/swag/config/fail2ban/. DISABLE_F2B=true désactive ce fail2ban.
Sauvegarde
<APPDATA>/swag (configuration, proxy-confs, certificats) est sauvegardé par le script de Sauvegarde.