Serveur principal
Système
| Élément | Valeur |
|---|---|
| OS | Debian 13 |
| Noyau | Mainline (dépôt Zabbly) |
| Disque système | NVMe |
| Exposition | Internet, via SWAG |
Services
Infrastructure
| Service | Rôle |
|---|---|
| SWAG | Reverse proxy, certificat wildcard Let's Encrypt |
| Authelia | Authentification unique |
| CrowdSec | Détection d'attaques, bouncer nginx, captcha Turnstile |
| DuckDNS | Mise à jour du DNS dynamique |
| Portainer CE (LTS) | Gestion des stacks |
| docker-socket-proxy | Accès filtré à l'API Docker |
| Watchtower | Mise à jour automatique des images |
| Glances | Supervision |
Productivité
| Service | Rôle |
|---|---|
| Nextcloud | Notes, veille |
| XWiki | Wiki |
| Joplin Server + client web | Notes |
| Passbolt | Mots de passe |
| Vikunja | Tâches |
| n8n | Automatisation |
| code-server | Éditeur dans le navigateur |
| Wallos | Suivi des abonnements |
Veille et lecture
| Service | Rôle |
|---|---|
| SearXNG | Métamoteur |
| Flus | Veille RSS |
| Wallabag | Lecture différée |
| changedetection.io | Surveillance de pages |
Médias
| Service | Rôle |
|---|---|
| Immich | Photos et vidéos, sans machine-learning |
| Jellystat | Statistiques Jellyfin |
| Castopod | Podcast (test) |
| aax2mp3 | Conversion de livres audio |
Localisation
| Service | Rôle |
|---|---|
| Dawarich | Historique de localisation |
| Photon | Géocodage inverse local pour Dawarich |
Réseau et outils
| Service | Rôle |
|---|---|
| web-check | Analyse de sites |
| networking-toolbox | Outils réseau |
| Sshwifty | Client SSH web |
| copyparty | Partage de fichiers |
| Dashy | Tableau de bord |
| github-readme-stats | Statistiques GitHub pour Dashy |
Outils système
Plakar, Lynis, tmux, htop, fzf, zoxide, yazi, ripgrep, fd-find, jq, glow, ffmpeg, 7zip, poppler-utils, ImageMagick, mkcert.
Configuration
Réseau Docker partagé
Tous les services publiés sont sur un réseau externe commun avec SWAG :
Dans chaque stack :
proxy:
external: true
SWAG
- Le proxy.conf inclus déclare déjà proxy_http_version, Upgrade, Connection et proxy_read_timeout. Les redéclarer dans un proxy-conf provoque l'erreur nginx « directive is duplicate ».
- Pour une API appelée par une application mobile, séparer un bloc location /api sans l'include Authelia.
CrowdSec : captcha Turnstile
Les variables se placent sur le service swag (le bouncer est un mod de SWAG), pas sur le service crowdsec :
- CROWDSEC_CAPTCHA_PROVIDER=turnstile
- CROWDSEC_SITE_KEY=<SITE_KEY>
- CROWDSEC_SECRET_KEY=<SECRET_KEY>
Authelia
Authelia ne recharge pas sa configuration à chaud :
Watchtower
Watchtower
Fork maintenu nickfedor/watchtower : le projet d'origine est archivé depuis décembre 2025. Même stack sur les deux machines :
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command:
- --cleanup
- --schedule=0 0 5 * * *
environment:
- TZ=Europe/Paris
- Passage chaque nuit à 5 h, après la sauvegarde de 3 h 30.
- Pas de --rolling-restart : ce fork refuse de démarrer avec cette option dès qu'un conteneur a un depends_on.
- Pas d'API HTTP : les notifications de mise à jour viennent d'un workflow n8n qui interroge docker-socket-proxy toutes les 10 minutes et envoie un message Telegram.
Exclure un conteneur de la mise à jour automatique :
- com.centurylinklabs.watchtower.enable=false
Conteneurs exclus : SWAG, Authelia, CrowdSec et la base de Nextcloud (image en latest). Ils se mettent à jour à la main, après lecture des notes de version : Portainer > Update the stack, avec « Re-pull image ».
Les bases épinglées sur une version majeure restent en mise à jour automatique : elles ne reçoivent que des correctifs mineurs.
Portainer
- Portainer ne gère pas build: . dans une stack (le contexte pointe vers un dossier temporaire). Construire l'image sur l'hôte, puis la référencer par son nom.
- Derrière le reverse proxy, un redéploiement long renvoie un 504 alors qu'il aboutit. Utiliser l'accès direct en local : https://<IP_SERVEUR>:9443.
Modèles d'applications
Portainer utilise la liste de modèles de Lissy93, plus fournie que celle d'origine. Réglage : Settings > General > App Templates, URL :
Un conteneur déployé depuis un modèle n'est pas une stack : Portainer ne conserve pas de fichier compose. Sa configuration se relit avec :
Conteneurs déployés ainsi : SearXNG, Glances, DuckDNS, Wallos, aax2mp3. Leur page de documentation reprend leur configuration relevée avec docker inspect.
Services système inutiles
Sur un serveur sans NFS, iSCSI ni bureau :
Ne garder qu'un seul gestionnaire de profils d'énergie : tuned ou power-profiles-daemon.
À l'inverse, rsyslog est nécessaire : sans lui, Debian 13 n'écrit pas /var/log/auth.log et CrowdSec ne surveille pas les connexions SSH.