Salut les dev ! 👋
Aujourd'hui, je vais vous parler d'un outil qui a littéralement transformé ma façon de gérer mes services web : SWAG (Secure Web Application Gateway). Si vous êtes dans le monde du homelab ou si vous déployez plusieurs services web, cet article va vous intéresser !
Table des matières
- Mais qu'est-ce que SWAG exactement ?
- Pourquoi SWAG plutôt qu'autre chose ?
- Notre architecture cible
- Configuration réseau et DNS (étape cruciale !)
- Installation avec Docker Compose
- Configuration étape par étape
- Ajouter nos premiers services
- Troubleshooting réseau
- Tips et bonnes pratiques
- Sécurisation avec Authelia (bonus)
- Résultat final
- Debugging courant
- Conclusion
- Pour aller plus loin
🤔 Mais qu'est-ce que SWAG exactement ?
SWAG, c'est un reverse proxy tout-en-un basé sur nginx qui gère automatiquement vos certificats SSL Let's Encrypt. En gros, c'est votre portier numérique qui :
- 🔒 Sécurise automatiquement vos services avec des certificats SSL
- 🌐 Expose vos services Docker sur des sous-domaines propres
- 🛡️ Protège vos applications avec une authentification centralisée
- 📋 Gère tout ça avec de la configuration simple
💭 Pourquoi SWAG plutôt qu'autre chose ?
Avant SWAG, j'utilisais nginx classique avec certbot... Quelle galère ! 😅 Entre les renouvellements de certificats qui plantent, les configs nginx à maintenir manuellement, et la gestion des domaines, c'était un vrai casse-tête.
SWAG résout tout ça d'un coup :
- Certificats wildcard automatiques
- Configs pré-faites pour les services populaires
- Intégration native avec Docker
- Support de l'authentification (Authelia, OAuth, etc.)
🏗️ Notre architecture cible
Imaginons qu'on veuille exposer plusieurs services :
- Un Home Assistant sur
homeassistant.mondomaine.fr - Un serveur de fichiers sur
files.mondomaine.fr - Une interface d'administration sur
admin.mondomaine.fr
Avec SWAG, tout passe par un seul point d'entrée sécurisé !
🌐 Configuration réseau et DNS (étape cruciale !)
Avant de plonger dans Docker, il faut préparer le terrain côté réseau. C'est souvent l'étape que les débutants oublient ! 😅
1. Configuration chez votre provider (exemple Free)
Chez Free, il faut :
-
Se connecter à l'interface Freebox :
http://mafreebox.freebox.fr - Aller dans "Paramètres de la Freebox" > "Gestion des ports"
-
Créer une redirection de port :
- Port externe : 443 (HTTPS)
- Port interne : 443
- IP destination : IP locale de votre serveur (ex: 192.168.1.100)
- Protocole : TCP
-
Optionnel : Port 80 pour les redirections HTTP vers HTTPS :
- Port externe : 80
- Port interne : 80
- IP destination : 192.168.1.100
💡 Tip sécurité : Au lieu d'exposer directement les ports 80/443, vous pouvez utiliser des ports custom (ex: 8443) et faire la redirection. Plus sécurisé !
2. Configuration DuckDNS
DuckDNS, c'est le DNS dynamique gratuit parfait pour les homelabs !
- Inscription sur duckdns.org
-
Créer votre domaine :
monhomelab.duckdns.org - Noter votre token (on en aura besoin dans Docker)
💡 Alternative DNS providers : DuckDNS n'est pas obligatoire ! SWAG supporte plein d'autres providers :
Gratuits :
- DuckDNS (
duckdns) - Le plus simple pour débuter- FreeDNS (
freedns) - Autre alternative gratuite- No-IP (
noip) - Service populaire avec version gratuitePayants (mais plus pro) :
- Cloudflare (
cloudflare) - Excellent, rapide et pas cher- OVH (
ovh) - Provider français- Gandi (
gandi) - Interface simple- Route53 (
route53) - AWS, très fiable- DigitalOcean (
digitalocean) - Simple à utiliser- Namecheap (
namecheap) - Bon rapport qualité/prixConfiguration type pour Cloudflare :
environment: - URL=mondomaine.com - VALIDATION=dns - DNSPLUGIN=cloudflare - EMAIL=votre-email@example.com - CLOUDFLARETOKEN=votre-api-token-cloudflareLa liste complète est dispo dans la doc SWAG ! 📚
3. Vérification IP publique
Votre DuckDNS doit pointer vers votre IP publique :
# Vérifier votre IP publique
curl ifconfig.me
# Vérifier que DuckDNS pointe bien dessus
nslookup monhomelab.duckdns.org
Si les IPs correspondent, c'est bon ! 🎯
4. Test de connectivité
Avant même de démarrer SWAG, testez que le port forwarding fonctionne :
# Sur votre serveur local, démarrez un serveur web simple
python3 -m http.server 8080
# Depuis l'extérieur, testez avec votre domaine
curl http://monhomelab.duckdns.org:8080
Si ça marche, vous êtes prêts pour SWAG !
📦 Installation avec Docker Compose
Première étape : créer notre docker-compose.yml pour SWAG.
version: "3.8"
networks:
web-proxy:
external: false
services:
swag:
image: lscr.io/linuxserver/swag:latest
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- URL=monhomelab.duckdns.org # Votre domaine DuckDNS
- VALIDATION=duckdns # Validation via DuckDNS
- DUCKDNSTOKEN=12345678-1234-1234-1234-123456789012 # Votre token DuckDNS
- SUBDOMAINS=wildcard # Permet *.monhomelab.duckdns.org
- EMAIL=votre-email@example.com
- ONLY_SUBDOMAINS=false # Important pour que le domaine principal marche
volumes:
- ./swag/data:/config
ports:
- "80:80" # HTTP (redirections vers HTTPS)
- "443:443" # HTTPS (vos services sécurisés)
networks:
- web-proxy
restart: unless-stopped
🔧 Configuration étape par étape
1. Préparation des variables d'environnement
Les variables importantes à comprendre :
- URL : Votre domaine complet (DuckDNS, Cloudflare, ou autre provider)
- VALIDATION=duckdns : Type de validation selon votre provider (voir liste ci-dessus)
- SUBDOMAINS=wildcard : Génère un certificat pour tous vos sous-domaines
- DUCKDNSTOKEN : Token/API key de votre provider DNS
- ONLY_SUBDOMAINS=false : Permet d'utiliser le domaine principal aussi
💭 Pourquoi DuckDNS dans cet exemple ? C'est gratuit et ultra simple pour débuter ! Mais si vous avez déjà un domaine chez Cloudflare/OVH/Gandi, utilisez-le directement.
2. Configuration DuckDNS automatique
SWAG va automatiquement :
- Mettre à jour votre IP sur DuckDNS
- Valider votre domaine via l'API DuckDNS
- Générer le certificat wildcard
- Renouveler automatiquement tout ça !
C'est la magie de cette combo SWAG + DuckDNS ! ✨
3. Premiers pas après démarrage
# Démarrer SWAG
docker-compose up -d swag
# Vérifier les logs
docker logs swag
# Vous devriez voir quelque chose comme :
# "Server ready"
# "Certificate renewal successful"
4. Structure des dossiers créés
Après le premier démarrage, SWAG crée cette structure :
swag/data/
├── nginx/
│ ├── nginx.conf
│ ├── site-confs/
│ └── proxy-confs/ # ← Les configs de nos services !
├── keys/
│ └── letsencrypt/ # ← Nos certificats SSL
└── log/
🎯 Ajouter nos premiers services
Service 1 : Home Assistant
Créons notre service Home Assistant dans le même réseau :
# Ajout dans docker-compose.yml
homeassistant:
image: homeassistant/home-assistant:stable
container_name: homeassistant
environment:
- TZ=Europe/Paris
volumes:
- ./homeassistant/data:/config
networks:
- web-proxy
ports:
- "8123:8123" # Optionnel, pour accès direct local
restart: unless-stopped
Configuration du proxy dans SWAG
Créer le fichier : swag/data/nginx/proxy-confs/homeassistant.subdomain.conf
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name homeassistant.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app homeassistant;
set $upstream_port 8123;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
# Support des WebSockets (important pour Home Assistant !)
location /api/websocket {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app homeassistant;
set $upstream_port 8123;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Test de votre configuration
Une fois tout configuré, testez vos URLs :
- ✅
https://monhomelab.duckdns.org→ Page par défaut SWAG - ✅
https://homeassistant.monhomelab.duckdns.org→ Votre Home Assistant - ✅ Certificat SSL valide et wildcard !
🔧 Troubleshooting réseau
Problème : "Site inaccessible depuis l'extérieur"
- Vérifiez votre IP publique :
# Sur votre serveur
curl ifconfig.me
# Doit correspondre à :
nslookup monhomelab.duckdns.org
- Testez le port forwarding :
# Depuis l'extérieur (4G par exemple)
telnet monhomelab.duckdns.org 443
- Vérifiez les logs SWAG :
docker logs swag | grep -i "certificate\|error\|duckdns"
Problème : "DuckDNS validation failed"
Vérifiez votre token DuckDNS :
# Test manuel de l'API DuckDNS
curl "https://www.duckdns.org/update?domains=monhomelab&token=VOTRE_TOKEN&ip="
Doit retourner "OK" si le token est bon.
Problème : "Certificat non généré"
Souvent c'est un souci de timing. DuckDNS peut mettre quelques minutes à propager :
# Redémarrez SWAG après quelques minutes
docker restart swag
# Surveillez les logs
docker logs -f swag
🔥 Tips et bonnes pratiques
1. Réseau Docker dédié
Créez toujours un réseau dédié pour vos services web :
# Créer le réseau manuellement
docker network create web-proxy
# Ou le définir comme external dans docker-compose
networks:
web-proxy:
external: true
2. Gestion des logs
Surveillez les logs pour déboguer :
# Logs SWAG en temps réel
docker logs -f swag
# Logs nginx spécifiques
docker exec swag tail -f /config/log/nginx/error.log
3. Test de configuration
Avant de redémarrer, testez toujours :
# Test de la config nginx
docker exec swag nginx -t
# Rechargement à chaud (si test OK)
docker exec swag nginx -s reload
4. Wildcard certificates
Avec les certificats wildcard, vous pouvez ajouter autant de sous-domaines que vous voulez sans renouveler le certificat !
🛡️ Sécurisation avec Authelia (bonus)
Pour aller plus loin, on peut ajouter une authentification centralisée :
# Service Authelia
authelia:
image: authelia/authelia:latest
container_name: authelia
volumes:
- ./authelia/data:/config
networks:
- web-proxy
environment:
- TZ=Europe/Paris
restart: unless-stopped
Et dans notre config nginx, on ajoute :
# En haut du fichier de config de service
include /config/nginx/authelia-server.conf;
# Dans la location /
include /config/nginx/authelia-location.conf;
🎯 Résultat final
Une fois tout configuré, vous avez :
✅ https://homeassistant.monhomelab.duckdns.org - Sécurisé avec SSL
✅ https://files.monhomelab.duckdns.org - Protégé par authentification
✅ https://admin.monhomelab.duckdns.org - Accessible uniquement pour les admins
Le tout avec un seul certificat wildcard qui se renouvelle automatiquement !
🐛 Debugging courant
Problème : "502 Bad Gateway"
# Vérifier que le service target existe
docker ps | grep nom-du-service
# Vérifier la résolution DNS interne
docker exec swag nslookup nom-du-service
Problème : Certificat non généré
# Vérifier les logs de génération
docker logs swag | grep -i "certificate\|error\|duckdns"
# Tester manuellement DuckDNS
curl "https://www.duckdns.org/update?domains=VOTRE_DOMAINE&token=VOTRE_TOKEN&ip="
Problème : WebSockets qui ne passent pas
Ajoutez toujours ces headers dans vos configs :
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
🎉 Conclusion
SWAG a vraiment simplifié ma vie de homelabber ! En quelques fichiers de config, j'ai :
- Des certificats SSL automatiques
- Des sous-domaines propres pour tous mes services
- Une authentification centralisée
- Une maintenance quasi nulle
Si vous hésitez encore à passer le cap, foncez ! C'est un investissement en temps qui se rentabilise très vite.
🔗 Pour aller plus loin
Et vous, vous utilisez quoi comme reverse proxy ? Dites-moi en commentaire ! 💬
Top comments (1)
Traefik fait déjà tout ça, avec un simple label sur les services docker compose pour les exposer sous leur propre sous-domaine et un autre label pour activer l'authentification Authelia.
Mais cool d'avoir d'autres alternatives.