0 Votes

SWAG

Modifié par john le 2026/09/20 00:06

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

VariableValeurRôle
URL<DOMAINE>Domaine principal
SUBDOMAINSwildcardCertificat valable pour tous les sous-domaines (*.<DOMAINE>)
VALIDATIONduckdnsPreuve de propriété du domaine par un enregistrement DNS, via DuckDNS
DUCKDNSTOKEN<JETON>Jeton DuckDNS, le même que celui du conteneur DuckDNS
ONLY_SUBDOMAINSfalseLe domaine nu est aussi couvert
EMAIL<EMAIL>Avertissements de Let's Encrypt

Le renouvellement est automatique. Vérifier la date d'expiration :

echo | openssl s_client -connect 127.0.0.1:443 -servername <DOMAINE> 2>/dev/null | openssl x509 -noout -dates

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 | :

ModRôle
swag-dashboardTableau de bord sur le port 81 : proxy-confs actifs, statistiques de trafic (GoAccess), état de fail2ban
swag-crowdsecBouncer CrowdSec (voir CrowdSec)

Mods utiles, non installés :

ModRôle
swag-auto-reloadRecharge 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-dbipGéolocalisation des adresses, pour bloquer ou autoriser des pays
swag-cloudflare-real-ipVraies adresses des visiteurs derrière le proxy Cloudflare

Fichiers

Dans <APPDATA>/swag/config/nginx/ :

Fichier ou dossierRôle
nginx.confConfiguration générale de nginx
ssl.confRéglages TLS et en-têtes de sécurité, inclus par chaque proxy-conf
proxy.confEn-têtes transmis au service (IP d'origine, protocole, WebSocket), délais
resolver.confRésolveur DNS interne de Docker, pour trouver les conteneurs par leur nom
authelia-server.conf / authelia-location.confIntégration d'Authelia
authentik-*, ldap-*, tinyauth-*Équivalents pour d'autres systèmes d'authentification, non utilisés
site-confs/default.confSite par défaut, pour les noms non reconnus
proxy-confs/Un fichier par service publié
real-ip.conf, stream.confAdresse 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 -t           # vérifier la syntaxe
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êteEffet
Strict-Transport-SecurityImpose le HTTPS au navigateur pour les visites suivantes (HSTS)
Content-Security-PolicyPassage automatique en HTTPS des ressources ; interdit l'affichage du site dans un cadre d'un autre site
X-Frame-OptionsMême protection contre l'affichage dans un cadre, ancienne méthode
X-Content-Type-OptionsEmpêche le navigateur de deviner le type des fichiers
Referrer-PolicyNe transmet l'adresse de provenance qu'au même site
Permissions-PolicyDésactive certaines fonctions de suivi du navigateur
Alt-SvcAnnonce 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.

PrisonBannit
nginx-http-authLes échecs d'authentification HTTP basique
nginx-badbotsLes robots malveillants connus
nginx-botsearchLes recherches de pages d'administration ou de fichiers sensibles
nginx-denyLes accès refusés par une règle deny
nginx-unauthorizedLes réponses 401 répétées
nginx-444-copypartyPrison personnalisée pour copyparty
docker exec swag fail2ban-client status                       # prisons actives
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.