0 Votes

Code source wiki de ReverseProxy

Version 5.1 par john le 2026/09/19 20:37

Masquer les derniers auteurs
john 1.1 1 Point d'entrée unique du serveur : toutes les requêtes venant d'Internet passent par SWAG, qui les filtre avec CrowdSec et les authentifie avec Authelia avant de les transmettre aux services.
2
3 == Composants ==
4
5 |=Composant|=Rôle
6 |SWAG|Nginx, certificat wildcard Let's Encrypt (validation DNS DuckDNS), mods dashboard et bouncer CrowdSec
7 |CrowdSec|Analyse les journaux de SWAG et de l'hôte, décide des blocages
8 |Authelia|Authentification unique devant les services
9
10 Les trois conteneurs sont sur le réseau Docker externe ##proxy##, partagé avec tous les services publiés.
11
12 == Stack ==
13
14 {{code language="yaml"}}
15 networks:
16 proxy:
17 external: true
18
19 services:
20 crowdsec:
21 image: docker.io/crowdsecurity/crowdsec:latest
22 container_name: crowdsec
23 environment:
24 - TZ=Europe/Paris
25 - GID=1000
26 - CUSTOM_HOSTNAME=<HOSTNAME>
27 - COLLECTIONS=crowdsecurity/nginx crowdsecurity/http-cve crowdsecurity/whitelist-good-actors
28 volumes:
29 - <APPDATA>/crowdsec/config:/etc/crowdsec
30 - <APPDATA>/crowdsec/data:/var/lib/crowdsec/data
31 - <APPDATA>/swag/config/log/nginx:/var/log/swag:ro
32 - <APPDATA>/swag/config/crowdsec/ban.html:/var/lib/crowdsec/lua/templates/ban.html:ro
33 - /var/run/docker.sock:/var/run/docker.sock:ro
34 - /var/log:/var/log/host:ro
john 4.1 35 - <APPDATA>/Nextcloud/Data:/var/log/nextcloud-data:ro
john 1.1 36 networks: [proxy]
37 restart: unless-stopped
38 security_opt:
39 - no-new-privileges=true
40
41 swag:
42 image: lscr.io/linuxserver/swag:latest
43 container_name: swag
44 restart: unless-stopped
45 cap_add:
46 - NET_ADMIN
47 ports:
48 - "80:80"
49 - "443:443"
50 - "81:81"
51 environment:
52 - PUID=1000
53 - PGID=1000
54 - TZ=Europe/Paris
55 - URL=<DOMAINE>
56 - SUBDOMAINS=wildcard
57 - VALIDATION=duckdns
58 - DUCKDNSTOKEN=<TOKEN_DUCKDNS>
59 - ONLY_SUBDOMAINS=false
60 - EMAIL=<EMAIL>
61 - DOCKER_MODS=linuxserver/mods:swag-dashboard|ghcr.io/linuxserver/mods:swag-crowdsec
62 - CROWDSEC_LAPI_URL=http://crowdsec:8080
63 - CROWDSEC_API_KEY=<CLE_BOUNCER>
64 - CROWDSEC_SITE_KEY=<TURNSTILE_SITE_KEY>
65 - CROWDSEC_SECRET_KEY=<TURNSTILE_SECRET_KEY>
66 - CROWDSEC_CAPTCHA_PROVIDER=turnstile
67 volumes:
68 - <APPDATA>/swag/config:/config
69 networks: [proxy]
70
71 authelia:
72 image: authelia/authelia
73 container_name: authelia
74 restart: unless-stopped
75 environment:
76 - TZ=Europe/Paris
77 - AUTHELIA_NOTIFIER_SMTP_PASSWORD_FILE=/config/secrets/smtp_password
78 volumes:
79 - <APPDATA>/authelia/config:/config
80 - <APPDATA>/authelia/data:/data
81 - <APPDATA>/authelia/secrets:/config/secrets:rw
82 networks:
83 proxy:
84 aliases: [authelia]
85 {{/code}}
86
87 {{warning}}
88 Le port 81 sert au tableau de bord SWAG. Il ne doit jamais être redirigé sur la box : seuls 80 et 443 sont ouverts vers Internet.
89 {{/warning}}
90
91 == Publier un nouveau service ==
92
93 Le conteneur du service doit être sur le réseau ##proxy##. Ensuite, dans ##<APPDATA>/swag/config/nginx/proxy-confs/## :
94
95 {{code language="bash"}}
96 cp <SERVICE>.subdomain.conf.sample <SERVICE>.subdomain.conf
97 {{/code}}
98
99 Dans le fichier copié :
100
101 * vérifier que ##$upstream_app## correspond au nom du conteneur et ##$upstream_port## à son port interne ;
102 * décommenter les lignes Authelia pour protéger le service.
103
104 Sans sample fourni par SWAG, partir d'un sample existant et l'adapter. Ne pas redéclarer les directives déjà présentes dans ##proxy.conf## (voir [[Dépannage>>Wiki Batcave John.Infrastructure.ServeurPrincipal.Depannage.WebHome]]).
105
106 SWAG recharge nginx automatiquement quand un proxy-conf change.
107
john 5.1 108 == Exemple de proxy-conf écrit à la main : Dawarich ==
109
110 SWAG ne fournit pas de modèle pour Dawarich. Fichier ##<APPDATA>/swag/config/nginx/proxy-confs/dawarich.subdomain.conf## :
111
112 {{code language="nginx"}}
113 server {
114 listen 443 ssl;
115 listen [::]:443 ssl;
116
117 server_name dawarich.*;
118
119 include /config/nginx/ssl.conf;
120
121 client_max_body_size 0;
122
123 #include /config/nginx/authelia-server.conf;
124
125 location / {
126 #include /config/nginx/authelia-location.conf;
127
128 include /config/nginx/proxy.conf;
129 include /config/nginx/resolver.conf;
130 set $upstream_app dawarich_app;
131 set $upstream_port 3000;
132 set $upstream_proto http;
133 proxy_pass $upstream_proto://$upstream_app:$upstream_port;
134 }
135
136 location /cable {
137 include /config/nginx/proxy.conf;
138 include /config/nginx/resolver.conf;
139 set $upstream_app dawarich_app;
140 set $upstream_port 3000;
141 set $upstream_proto http;
142 proxy_pass $upstream_proto://$upstream_app:$upstream_port;
143 }
144
145 location /api {
146 include /config/nginx/proxy.conf;
147 include /config/nginx/resolver.conf;
148 set $upstream_app dawarich_app;
149 set $upstream_port 3000;
150 set $upstream_proto http;
151 proxy_pass $upstream_proto://$upstream_app:$upstream_port;
152
153 proxy_buffer_size 16k;
154 proxy_busy_buffers_size 32k;
155 }
156 }
157 {{/code}}
158
159 |=Élément|=Rôle
160 |##server_name dawarich.*##|Sous-domaine, quel que soit le domaine principal
161 |##ssl.conf##|Certificat wildcard et réglages TLS de SWAG
162 |##client_max_body_size 0##|Pas de limite de taille : les imports d'historique dépassent largement la limite par défaut de nginx
163 |##resolver.conf## et ##set $upstream_app##|Résolution du nom du conteneur au moment de la requête : nginx démarre même si Dawarich est arrêté
164 |##location /cable##|Connexion WebSocket (Action Cable) pour les mises à jour en direct ; les en-têtes nécessaires sont déjà dans ##proxy.conf##
165 |##location /api##|API des applications de suivi, avec des tampons agrandis pour les réponses volumineuses
166
167 === Protéger un service par Authelia ===
168
169 Il faut décommenter **les deux** lignes :
170
171 * ##include /config/nginx/authelia-server.conf;## dans le bloc ##server## : déclare l'échange avec Authelia ;
172 * ##include /config/nginx/authelia-location.conf;## dans chaque ##location## à protéger.
173
174 Une ##location## sans cette seconde ligne reste accessible sans Authelia : c'est ainsi qu'on laisse une API ouverte aux applications mobiles tout en protégeant l'interface.
175
176 Ici, les deux lignes sont commentées : Dawarich n'est protégé que par son propre identifiant.
177
john 1.1 178 == CrowdSec ==
179
john 3.1 180 Voir la page [[CrowdSec>>Wiki Batcave John.Infrastructure.ServeurPrincipal.CrowdSec.WebHome]].
john 1.1 181
john 3.1 182 == Authelia ==
john 1.1 183
john 2.1 184 Voir la page [[Authelia>>Wiki Batcave John.Infrastructure.ServeurPrincipal.Authelia.WebHome]].