Module 9 · 9.4
Français
Recettes : Uptime Kuma et Vaultwarden
Module 9: Docker et docker compose · Temps de lecture : 13 minutes
Objectif pédagogique : À l'issue de cette leçon, vous saurez faire tourner Uptime Kuma et Vaultwarden avec docker compose derrière Caddy, avec https, des inscriptions fermées, une sauvegarde des volumes et une méthode fixe de mise à jour.
Notions clés : conteneur reverse proxy, Caddyfile, https automatique, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, sauvegarde des volumes, docker compose pull, en-tête personnalisé
Ce que nous construisons
Deux services pratiques sur votre propre serveur, chacun sur son propre sous-domaine :
- Uptime Kuma sur
status.example.com: un outil de surveillance avec une interface web qui garde un œil sur vos sites web, vos ports et vos certificats, et vous envoie une alerte en cas de panne (leçon 8.3). Attention : une surveillance qui tourne sur le même serveur que ce qu'elle surveille ne voit pas que ce serveur entier tombe en panne. Utilisez-la donc pour vos autres sites et services, ou installez-la sur un second serveur. - Vaultwarden sur
kluis.example.com: une version serveur légère et indépendante, compatible avec les applications et les extensions de navigateur de Bitwarden. Un coffre-fort de mots de passe est un logiciel sensible : ne vous lancez que si vous êtes prêt à le maintenir à jour et à le sauvegarder sérieusement. Utiliser tout simplement le gestionnaire de mots de passe d'un fournisseur est aussi une très bonne option.
Devant eux, nous plaçons Caddy dans un conteneur : il prend en charge les ports 80 et 443, gère lui-même les certificats Let's Encrypt (leçons 7.3 et 7.4) et transmet le trafic au bon conteneur. Uptime Kuma et Vaultwarden ne publient eux-mêmes aucun port (leçon 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Prérequis
- Docker Engine avec le plug-in compose (leçon 9.2).
- Deux enregistrements DNS qui pointent vers votre serveur, A et AAAA (leçon 7.1) :
status.example.cometkluis.example.com. - Les ports 80 et 443 libres sur le serveur. Si un nginx ou un Caddy du système utilise déjà ces ports, le conteneur Caddy ne pourra pas les utiliser. Choisissez alors : soit vous arrêtez le serveur web du système, soit vous lui confiez le rôle de proxy et vous publiez les conteneurs sur
127.0.0.1(leçon 9.3). Dans cette recette, c'est le conteneur Caddy qui s'en charge. - Dans ufw, ouvrez 80/tcp, 443/tcp et, pour HTTP/3, aussi 443/udp (leçon 5.2). À strictement parler, Docker contourne ufw, mais ainsi l'aperçu de votre pare-feu correspond à la réalité.
Les fichiers
Tout se trouve dans un seul dossier, /srv/diensten/ :
/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .envcompose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- uptime-kuma:/app/data
vaultwarden:
image: vaultwarden/server:1.37.5
restart: unless-stopped
environment:
DOMAIN: "https://kluis.example.com"
SIGNUPS_ALLOWED: "true"
ADMIN_TOKEN: ${VW_ADMIN_TOKEN}
volumes:
- ./vw-data:/data
volumes:
caddy-data:
caddy-config:
uptime-kuma:Avant de commencer, vérifiez quelle est la version la plus récente de Vaultwarden (les releases sur GitHub) et indiquez-la dans le tag. Seul Caddy publie des ports, et ceux-ci doivent être publics. Les volumes caddy-data (certificats), uptime-kuma et le dossier vw-data contiennent tout ce que vous devez conserver.
Caddyfile
{
email beheer@example.com
}
status.example.com {
reverse_proxy uptime-kuma:3001
header {
X-Weboke-Cursus "jouw-code-uit-de-opdracht"
defer
}
}
kluis.example.com {
reverse_proxy vaultwarden:80
}Caddy obtient automatiquement un certificat pour les deux noms et redirige http vers https. uptime-kuma et vaultwarden sont les noms de services du fichier compose : Caddy les trouve sur le réseau interne. Le bloc header ajoute un en-tête supplémentaire à chaque réponse de status.example.com ; vous l'utiliserez dans l'exercice pour prouver que votre conteneur proxy tourne. Avec defer, l'en-tête est ajouté une fois que le service en arrière-plan a donné sa réponse. Si vous voulez aussi HSTS et les autres en-têtes de sécurité de la leçon 7.4, placez-les dans le même bloc.
Configurer Vaultwarden en toute sécurité
Quatre points font la différence entre un coffre-fort sûr et un coffre-fort dangereux.
Un : uniquement via https. Le coffre-fort web de Bitwarden utilise la cryptographie du navigateur, et les navigateurs ne la mettent à disposition que sur des pages https. Sans https, il ne fonctionne donc pas correctement, et c'est tant mieux. La documentation de Vaultwarden recommande un reverse proxy pour https, comme Caddy ici. Réglez DOMAIN sur l'adresse https complète.
Deux : inscriptions fermées. Avec SIGNUPS_ALLOWED: "true", toute personne qui trouve la page peut créer un compte sur votre serveur. Démarrez donc, créez immédiatement votre ou vos propres comptes, passez la valeur à "false" et exécutez à nouveau docker compose up -d. Pour ajouter quelqu'un plus tard, utilisez la fonction d'invitation de la page d'administration.
Trois : un jeton d'administration haché. La page d'administration (/admin) est protégée par ADMIN_TOKEN. N'y mettez pas un mot de passe lisible, mais un hachage Argon2. Vous le générez avec Vaultwarden lui-même :
anna@web1:/srv/diensten$ sudo docker compose exec vaultwarden /vaultwarden hash
Password:
Confirm Password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'Placez cette ligne dans .env (donc VW_ADMIN_TOKEN='$argon2id$...', avec des guillemets simples) et rendez le fichier lisible uniquement par root : sudo chmod 600 .env. Dans un fichier .env, vous n'avez pas besoin de doubler les caractères $ ; si vous placez le hachage directement sous environment: dans le fichier compose, c'est en revanche nécessaire (chaque $ devient $$), sinon Compose essaie de les remplacer comme des variables. Pour vous connecter à /admin, utilisez le mot de passe que vous avez saisi, pas le hachage. Attention : les paramètres que vous enregistrez dans la page d'administration sont stockés dans vw-data/config.json et priment alors sur les variables d'environnement.
Quatre : sauvegarde et restauration. Tout se trouve dans vw-data : la base de données, les pièces jointes et les clés. Incluez ce dossier dans votre sauvegarde restic (leçon 8.2) et, pour la base de données, suivez les instructions de sauvegarde du wiki de Vaultwarden, afin de ne pas copier un fichier à moitié écrit. Testez la restauration (exercice O8.2) : un coffre-fort sans sauvegarde fonctionnelle met en danger tous vos mots de passe.
Les notifications entre appareils (websockets) passent par le même port dans les versions récentes de Vaultwarden ; Caddy les transmet sans réglage supplémentaire.
Configurer Uptime Kuma
Après docker compose up -d, ouvrez https://status.example.com. Lors de la première visite, Uptime Kuma vous demande de créer un compte administrateur. Faites-le immédiatement : tant que ce compte n'existe pas, toute personne qui trouve la page peut le créer. Si vous ne voulez prendre aucun risque, retirez d'abord le bloc status du Caddyfile, créez le compte via un tunnel SSH (leçon 2.3), puis remettez le bloc en place.
Ajoutez ensuite des sondes : une sonde HTTP pour votre site web, une sonde TCP pour un port, une alerte de certificat et un canal de notification (e-mail, messagerie instantanée ou service de notifications push). Activez aussi l'authentification à deux facteurs dans les paramètres d'Uptime Kuma.
Démarrer et vérifier
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker compose ps
NAME SERVICE STATUS PORTS
diensten-caddy-1 caddy Up 2 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, ...
diensten-uptime-kuma-1 uptime-kuma Up 2 minutes (healthy)
diensten-vaultwarden-1 vaultwarden Up 2 minutes (healthy)
anna@web1:/srv/diensten$ sudo docker compose logs caddy | grep -i "certificate obtained"
anna@web1:~$ curl -sI https://status.example.com | grep -i x-weboke
x-weboke-cursus: jouw-code-uit-de-opdrachtSeul Caddy a des ports. Si l'obtention du certificat échoue, les journaux de Caddy en indiquent la raison : le plus souvent, le DNS ne pointe pas encore vers le serveur, ou le port 80 n'est pas joignable (leçon 7.3).
Mettre à jour
Un conteneur n'est pas mis à jour par unattended-upgrades (leçon 4.2). Prévoyez un moment fixe, par exemple toutes les deux semaines :
anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prunepull récupère les images les plus récentes dans le tag que vous avez choisi (ainsi caddy:2 reste dans la version 2). Pour Vaultwarden avec un numéro de version, adaptez d'abord le tag après avoir lu les notes de version. Lors d'une nouvelle version majeure, lisez toujours les notes de version : il faut parfois modifier quelque chose dans votre configuration. Avant une mise à jour importante, sauvegardez les volumes.
Suivez aussi les avis de sécurité des développeurs. Une vulnérabilité dans Vaultwarden ou Caddy n'est corrigée chez vous que si vous récupérez la nouvelle version.
En pratique
Cette recette fonctionne sur n'importe quel VPS avec Docker, chez WebOké ou chez un autre fournisseur. Il s'agit d'autonomie : le fournisseur de votre VPS ne gère rien à l'intérieur de vos conteneurs. Prenez un snapshot avant la première mise en place, vous pourrez ainsi expérimenter l'esprit tranquille.
Résumé
- Un seul fichier compose avec Caddy comme conteneur reverse proxy ; seul Caddy publie les ports 80 et 443, les services ne publient rien.
- Caddy gère automatiquement les certificats et https, et peut ajouter vos propres en-têtes avec
header. - Vaultwarden : https obligatoire,
DOMAINsur l'adresse https, inscriptions fermées après la création de votre compte,ADMIN_TOKENsous forme de hachage Argon2 dans un.envavec les droits 600. - Uptime Kuma : créer immédiatement le compte administrateur et activer l'authentification à deux facteurs ; surveillez surtout d'autres serveurs et sites avec.
- Sauvegardez les volumes et le dossier
vw-data, et mettez à jour avecdocker compose pulletup -dà un moment fixe.
Quiz
Exercice
Exercice Z9.4 : Prouvez que votre conteneur tourne. Récupérez votre code personnel dans l'exercice et placez-le dans le Caddyfile de votre conteneur Caddy en tant qu'en-tête X-Weboke-Cursus pour l'un de vos sous-domaines (comme status.<jouwdomein>). Rechargez Caddy et saisissez le nom d'hôte. Le programme récupère https://<hostnaam>/ et vérifie que le certificat est valide et que l'en-tête contient exactement votre code. Collez en outre la sortie de docker compose ps et indiquez quel service est le seul à publier des ports.
Pour aller plus loin
- Gestionnaire de mots de passe et passkeys : voici comment sécuriser vos connexions
- Uptime Kuma (installation avec Docker) : https://github.com/louislam/uptime-kuma
- Wiki de Vaultwarden, Using Docker Compose : https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki de Vaultwarden, Enabling admin page : https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki de Vaultwarden, Enabling HTTPS : https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Documentation de Caddy, header : https://caddyserver.com/docs/caddyfile/directives/header
