Recommandations production¶
Sécurité de base¶
SECRET_KEY: définissez une valeur longue et aléatoire explicitement. Sans cela, une clé est générée automatiquement et stockée dans/var/lib/wireguard-ui/secret_key— cela fonctionne, mais toute réinstallation ou perte du volume de données invalide toutes les sessions, et la clé ne peut pas être partagée entre plusieurs réplicas.
- Identifiants admin : changez le mot de passe généré automatiquement dès la première connexion (page Profil). Envisagez de définir
ADMIN_USERNAME/ADMIN_EMAILavant le tout premier démarrage si vous ne voulez pas des valeurs par défaut (admin/admin@wg.ui). SWAGGER_ENABLED: laissez àfalse(défaut) en production si l'exposition de la documentation OpenAPI n'est pas nécessaire.
Derrière un reverse proxy TLS¶
Si vous exposez l'interface via Traefik, Nginx, Caddy, etc. :
- Terminez le TLS au niveau du reverse proxy.
- Renseignez
TRUSTED_PROXIESavec l'IP ou le sous-réseau du proxy (ex.172.16.0.0/12pour un réseau Docker par défaut). Sans cela : - le cookie de session
access_tokenne sera pas marquéSecure(HTTPS non détecté) ; - le rate-limiting regroupera tous les visiteurs sur l'IP du proxy, ce qui peut bloquer l'accès à tout le monde après quelques requêtes.
- Le reverse proxy doit transmettre les en-têtes
X-Forwarded-ForetX-Forwarded-Proto.
Voir le détail dans Authentification & sécurité et Variables d'environnement.
Rate limiting¶
Activé par défaut (RATE_LIMIT_ENABLED=true). Ajustez RATE_LIMIT_MAX_REQUESTS/RATE_LIMIT_WINDOW_SECONDS selon votre trafic normal, et gardez RATE_LIMIT_AUTH_MAX_REQUESTS bas pour limiter le brute-force sur /api/auth/login.
Déploiement mono-worker
Le rate-limiter et l'état du service WireGuard sont gérés en mémoire, par process. L'image ne doit pas être répliquée horizontalement (plusieurs conteneurs actifs simultanément) sans revoir cette architecture — un seul conteneur wireguard-ui doit gérer une interface wg0 donnée.
Sauvegardes¶
Deux volumes à sauvegarder régulièrement :
| Volume | Contenu | Criticité |
|---|---|---|
/var/lib/wireguard-ui |
Base SQLite (utilisateurs, clients, réglages, audit, PAT), clé secrète générée | Élevée — perte = perte de toutes les données applicatives |
/etc/wireguard |
wg0.conf, clés serveur/clients actives |
Élevée — perte = reconstruction manuelle des tunnels |
Base de données en production¶
SQLite convient pour un déploiement mono-instance. Pour un environnement plus exigeant (sauvegardes centralisées, réplication), configurez DB_PATH vers une instance PostgreSQL :
L'URL est automatiquement convertie vers le driver asynchrone asyncpg — voir config.py.
Audit et conformité¶
AUDIT_RETENTION_DAYS(défaut 90) etAUDIT_MAX_EVENTS(défaut 10 000) contrôlent la purge automatique du journal d'audit. Augmentez ces valeurs si une politique de conformité impose une rétention plus longue.- Le journal est accessible via
GET /api/audit(page Audit, admin uniquement) — pensez à l'exporter périodiquement si la rétention configurée est courte.
Emails¶
Configurez SMTP depuis l'interface d'administration (page SMTP), pas via l'environnement (seuls MAIL_FROM/MAIL_NAME sont des variables d'environnement, utilisées comme repli). Testez la configuration avec le bouton Envoyer un email de test avant de compter dessus pour l'enrôlement des clients.
Checklist avant mise en production¶
- [ ]
SECRET_KEYdéfinie explicitement et sauvegardée. - [ ] Mot de passe admin changé.
- [ ]
TRUSTED_PROXIESrenseigné si un reverse proxy est utilisé. - [ ] TLS activé au niveau du reverse proxy.
- [ ] Volumes
wg_configetwireguard-ui_datasauvegardés automatiquement. - [ ]
SWAGGER_ENABLED=falsesauf besoin explicite. - [ ] SMTP configuré et testé si l'envoi de configuration par email est utilisé.
- [ ] OIDC configuré si une connexion SSO est requise (voir Authentification & sécurité).