👍 On aime
- ✓Très faible consommation de ressources (moins de 100 Mo de RAM)
- ✓Compatible avec toutes les applications et extensions officielles Bitwarden
- ✓Déploiement simplifié via Docker et Docker Compose
- ✓HTTPS automatique via le reverse proxy Caddy et Let's Encrypt
👎 On regrette
- ✕Configuration initiale exigeante nécessitant rigueur et sécurité
- ✕Gestion délicate du token d'administration (hash Argon2 et échappement des variables)
- ✕Dépendance à un nom de domaine et ports ouverts (80/443) pour le certificat
📑 Sommaire ▾
- 01 Prérequis
- 02 Étape 1 : Installer Docker et Docker Compose
- 03 Étape 2 : Configurer le DNS
- 04 Étape 3 : Générer le token d’administration
- 05 Étape 4 : Créer le réseau Docker partagé
- 06 Étape 5 : Le docker-compose.yml de Vaultwarden
- 07 Étape 6 : Le Caddyfile pour le HTTPS automatique
- 08 Étape 7 : Lancer les services
- 09 Étape 8 : Créer votre compte et inviter les autres
- 10 Étape 9 : Activer la double authentification
- 11 Étape 10 : Sauvegardes chiffrées automatiques
- 12 Vérification finale
- 13 Sécurité : le durcissement à ne pas négliger
- 14 FAQ
- · Vaultwarden est-il vraiment compatible avec les applications Bitwarden ?
- · Pourquoi mes inscriptions sont-elles bloquées ?
- · Le panneau /admin renvoie une erreur ou n’accepte pas mon token, pourquoi ?
- · Let’s Encrypt n’arrive pas à émettre le certificat, que faire ?
- · Puis-je héberger Vaultwarden sur mon NAS plutôt qu’un VPS ?
- · Comment migrer mes mots de passe depuis un autre gestionnaire ?
- 21 Sur le même sujet
Vous voulez votre propre gestionnaire de mots de passe, sur votre serveur, sans abonnement et sans confier vos secrets à un cloud tiers ? Vaultwarden est la réponse idéale : c’est une réimplémentation légère en Rust du serveur Bitwarden, compatible avec toutes les applications et extensions officielles Bitwarden. Il tourne sur moins de 100 Mo de RAM, ce qui le rend déployable sur le plus petit des VPS.
Mais un gestionnaire de mots de passe est l’un des services les plus sensibles que vous puissiez héberger : il doit être en HTTPS obligatoire, avec son panneau d’administration verrouillé et des sauvegardes fiables. Dans ce tutoriel, on déploie Vaultwarden via Docker, derrière un reverse proxy Caddy qui gère le HTTPS et les certificats Let’s Encrypt automatiquement. Tout est dans des fichiers versionnables, reproductibles, et durcis pour la production.
Prérequis
- Un VPS sécurisé sous Ubuntu 24.04 (ou Debian 12). Si ce n’est pas encore fait, suivez d’abord notre guide pour installer et sécuriser un VPS Ubuntu.
- Docker et Docker Compose installés (commande d’installation à l’étape 1).
- Un nom de domaine dont vous contrôlez le DNS. On utilisera
vault.exemple.frcomme exemple. - Les ports 80 et 443 ouverts sur votre pare-feu UFW : indispensables pour la validation Let’s Encrypt et le trafic HTTPS.
- Quelques minutes et un peu de rigueur : c’est un service critique, on ne bâcle pas.
Étape 1 : Installer Docker et Docker Compose
Si Docker n’est pas présent, installez-le depuis le dépôt officiel (les versions des dépôts Ubuntu sont souvent en retard) :
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ajoutez votre utilisateur au groupe docker (déconnectez-vous/reconnectez-vous ensuite pour appliquer) :
sudo usermod -aG docker $USER
Vérifiez :
docker --version && docker compose version
Étape 2 : Configurer le DNS
Caddy a besoin que votre domaine pointe vers l’IP du VPS pour émettre le certificat. Chez votre fournisseur DNS, créez un enregistrement A (et AAAA si IPv6) :
| Type | Nom | Valeur |
|---|---|---|
| A | vault.exemple.fr | 203.0.113.10 |
Attendez la propagation, puis vérifiez depuis votre machine :
dig +short vault.exemple.fr
La commande doit renvoyer l’IP de votre VPS. Tant que ce n’est pas le cas, Let’s Encrypt échouera à émettre le certificat.
Étape 3 : Générer le token d’administration
Vaultwarden expose un panneau d’administration sous /admin, protégé par un token. Ce token doit être un hash Argon2, pas une chaîne en clair. Générez-le directement avec l’image Vaultwarden :
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
Saisissez un mot de passe administrateur long et unique quand l’outil le demande. Il affichera une chaîne commençant par $argon2id$.... Copiez-la précieusement : c’est elle qu’on placera dans la configuration. Notez aussi le mot de passe en clair correspondant dans votre coffre-fort : c’est celui que vous taperez pour accéder à /admin.
Piège fréquent : Si vous collez le hash Argon2 dans un fichier
.env, le signe$doit être échappé ($$) car Docker Compose l’interprète comme une variable. On gère ce point à l’étape suivante.
Étape 4 : Créer le réseau Docker partagé
Pour que Caddy joigne le conteneur Vaultwarden par son nom, les deux partagent un réseau Docker dédié. Créez-le une seule fois :
docker network create web
Si vous suivez déjà notre tutoriel reverse proxy Caddy, ce réseau existe peut-être déjà : la commande renverra une erreur sans gravité, ignorez-la.
Étape 5 : Le docker-compose.yml de Vaultwarden
Créez un dossier de travail et le fichier de composition :
mkdir -p ~/vaultwarden && cd ~/vaultwarden
nano docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
# Désactive l'inscription publique : personne ne peut créer de compte
SIGNUPS_ALLOWED: "false"
# Autorise l'invitation manuelle d'utilisateurs depuis /admin
INVITATIONS_ALLOWED: "true"
# URL publique du service (HTTPS obligatoire)
DOMAIN: "https://vault.exemple.fr"
# Hash Argon2 du token admin (noter le $$ à la place de $)
ADMIN_TOKEN: "${ADMIN_TOKEN}"
# WebSockets pour la synchro temps réel des clients
ENABLE_WEBSOCKET: "true"
volumes:
- ./vw-data:/data
networks:
- web
networks:
web:
external: true
Créez ensuite le fichier .env qui contient le token, en doublant chaque $ du hash Argon2 :
nano .env
ADMIN_TOKEN='$$argon2id$$v=19$$m=65540,t=3,p=4$$VOTRE_HASH_ICI'
Remplacez par le hash généré à l’étape 3, en remplaçant chaque $ par $$. Les apostrophes simples protègent la chaîne.
Notez l’absence de section ports: : Vaultwarden n’est jamais exposé directement sur Internet. Il n’est accessible qu’à travers Caddy, via le réseau interne web. C’est le principe de sécurité fondamental de ce déploiement.
Étape 6 : Le Caddyfile pour le HTTPS automatique
Si vous avez déjà un Caddy en place (voir notre tuto dédié), ajoutez simplement le bloc de site. Sinon, créez un dossier Caddy :
mkdir -p ~/caddy && cd ~/caddy
nano Caddyfile
{
# Email pour les notifications Let's Encrypt
email admin@exemple.fr
}
vault.exemple.fr {
# Certificat Let's Encrypt et redirection HTTP -> HTTPS automatiques
encode gzip zstd
# En-têtes de sécurité
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
# On envoie tout le trafic vers le conteneur Vaultwarden
reverse_proxy vaultwarden:80
}
Puis le docker-compose.yml de Caddy dans ~/caddy :
nano docker-compose.yml
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
networks:
- web
volumes:
caddy_data:
caddy_config:
networks:
web:
external: true
Le volume caddy_data est critique : il conserve vos certificats. Sans lui, vous redemanderiez un certificat à chaque redémarrage et atteindriez vite les limites de Let’s Encrypt.
Étape 7 : Lancer les services
Démarrez d’abord Vaultwarden, puis Caddy :
cd ~/vaultwarden && docker compose up -d
cd ~/caddy && docker compose up -d
Suivez les logs de Caddy pour voir l’émission du certificat en direct :
docker compose logs -f caddy
Vous devriez voir une ligne du type certificate obtained successfully pour vault.exemple.fr. Visitez ensuite https://vault.exemple.fr : la page d’accueil de Vaultwarden s’affiche avec un cadenas valide.
Étape 8 : Créer votre compte et inviter les autres
Comme SIGNUPS_ALLOWED est à false, personne ne peut s’inscrire librement. Pour créer votre premier compte, deux options :
Option A (recommandée) : via le panneau admin. Rendez-vous sur https://vault.exemple.fr/admin, saisissez le mot de passe admin (étape 3), puis utilisez « Invite User » pour vous inviter, ainsi que votre famille ou équipe. Chacun reçoit un lien d’inscription.
Option B : ouvrir temporairement les inscriptions. Passez SIGNUPS_ALLOWED à "true", relancez, créez les comptes, puis remettez "false". Moins propre, à éviter.
Une fois votre compte créé, installez l’extension navigateur Bitwarden ou l’application mobile, et dans les paramètres, configurez l’URL du serveur sur https://vault.exemple.fr avant de vous connecter. Tout le reste fonctionne exactement comme Bitwarden.
Étape 9 : Activer la double authentification
C’est non négociable pour un coffre-fort de mots de passe. Une fois connecté à l’interface web :
- Allez dans Paramètres → Sécurité → Connexion en deux étapes.
- Activez TOTP (application d’authentification) au minimum, ou idéalement une clé matérielle WebAuthn/FIDO2 (YubiKey).
- Notez votre code de récupération dans un endroit sûr hors du coffre-fort.
Sans 2FA, votre seul rempart est le mot de passe maître. Avec, même un mot de passe compromis ne suffit pas à un attaquant.
Étape 10 : Sauvegardes chiffrées automatiques
Un coffre-fort sans sauvegarde, c’est tous vos accès qui disparaissent à la première panne disque. Vaultwarden stocke tout dans ~/vaultwarden/vw-data (base SQLite, pièces jointes, clés). Voici un script de sauvegarde quotidien :
nano ~/vaultwarden/backup.sh
#!/bin/bash
set -euo pipefail
DATA_DIR="$HOME/vaultwarden/vw-data"
BACKUP_DIR="$HOME/vaultwarden/backups"
STAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p "$BACKUP_DIR"
# Sauvegarde cohérente de la base SQLite (commande native sqlite3 dans le conteneur)
docker compose -f "$HOME/vaultwarden/docker-compose.yml" exec -T vaultwarden \
/bin/sh -c "sqlite3 /data/db.sqlite3 '.backup /data/db-backup.sqlite3'"
# Archive l'ensemble des données
tar -czf "$BACKUP_DIR/vaultwarden-$STAMP.tar.gz" -C "$DATA_DIR" .
# Conserve les 14 derniers jours
find "$BACKUP_DIR" -name 'vaultwarden-*.tar.gz' -mtime +14 -delete
Rendez-le exécutable et planifiez-le via cron (tous les jours à 3h) :
chmod +x ~/vaultwarden/backup.sh
(crontab -l 2>/dev/null; echo "0 3 * * * $HOME/vaultwarden/backup.sh") | crontab -
Important : une sauvegarde sur le même serveur ne protège pas d’un incendie, d’un vol ou d’un ransomware. Envoyez ces archives hors-site et chiffrées : notre guide sauvegarde automatique avec Restic et Backblaze montre comment répliquer ces backups vers un stockage distant.
Vérification finale
Contrôlez que tout est en place :
# Les conteneurs tournent
docker ps --filter "name=vaultwarden" --filter "name=caddy"
# Le HTTP redirige bien vers HTTPS (code 308)
curl -sI http://vault.exemple.fr | head -1
# Le HTTPS répond et le certificat est valide
curl -sI https://vault.exemple.fr | head -1
# Le panneau admin n'est PAS accessible sans token (doit demander une auth)
curl -sI https://vault.exemple.fr/admin | head -1
Pour un audit TLS complet, testez votre domaine sur SSL Labs : vous devriez viser A ou A+ grâce aux en-têtes HSTS et aux protocoles modernes de Caddy.
Sécurité : le durcissement à ne pas négliger
Vaultwarden héberge vos secrets les plus sensibles. Au-delà du HTTPS, appliquez ces mesures :
- Mot de passe maître très fort. C’est l’unique clé de tout votre coffre : une phrase de passe longue et unique (4-5 mots aléatoires minimum). Aucun chiffrement ne sauve un coffre protégé par un mot de passe faible.
- Panneau /admin verrouillé. Le token Argon2 le protège déjà. Pour aller plus loin, restreignez l’accès à
/adminpar IP dans Caddy, ou désactivez-le (DISABLE_ADMIN_TOKEN: "true") une fois la configuration terminée. - Pare-feu UFW strict. N’ouvrez que les ports 80, 443 et SSH. Le port interne 80 de Vaultwarden ne doit jamais être exposé.
- Fail2ban. Vaultwarden journalise les tentatives de connexion. Couplé à Fail2ban, vous bannissez les IP qui tentent de forcer un compte. Activez la journalisation (
LOG_FILE) et créez une règle dédiée. - Mises à jour régulières. Mettez à jour l’image (
docker compose pull && docker compose up -d) après chaque sauvegarde, jamais avant. Une migration ratée sans backup peut corrompre la base. - 2FA obligatoire pour tous les comptes (voir étape 9).
Pour aller plus loin sur la protection d’un VPS exposé, consultez nos bonnes pratiques dans installer et sécuriser un VPS Ubuntu.
FAQ
Vaultwarden est-il vraiment compatible avec les applications Bitwarden ?
Oui, totalement. Vaultwarden implémente l’API Bitwarden, donc l’extension navigateur, les applications mobiles iOS/Android, les clients desktop et le CLI officiels fonctionnent sans modification. Il suffit de configurer l’URL du serveur sur votre domaine Vaultwarden avant la connexion. L’expérience est identique à Bitwarden Cloud.
Pourquoi mes inscriptions sont-elles bloquées ?
C’est voulu : SIGNUPS_ALLOWED: "false" empêche que n’importe qui crée un compte sur votre instance exposée. Pour ajouter des utilisateurs, passez par le panneau /admin et utilisez la fonction d’invitation. C’est la configuration sécurisée recommandée pour un service public.
Le panneau /admin renvoie une erreur ou n’accepte pas mon token, pourquoi ?
Dans 90 % des cas, c’est le hash Argon2 mal échappé dans le .env : chaque $ du hash doit être doublé en $$ dans Docker Compose. Vérifiez aussi que vous saisissez bien le mot de passe en clair (pas le hash) dans le formulaire /admin. Régénérez le hash à l’étape 3 si nécessaire.
Let’s Encrypt n’arrive pas à émettre le certificat, que faire ?
C’est presque toujours un problème de DNS (le domaine ne pointe pas encore vers le VPS) ou de pare-feu (port 80 fermé). Vérifiez dig +short vault.exemple.fr et sudo ufw status. Les logs Caddy (docker compose logs caddy) indiquent la cause exacte du rejet ACME. Pendant le débogage, utilisez l’environnement de staging de Let’s Encrypt pour ne pas atteindre les limites de taux.
Puis-je héberger Vaultwarden sur mon NAS plutôt qu’un VPS ?
Oui, parfaitement. Synology (Container Manager), QNAP (Container Station) et TrueNAS gèrent Docker. La logique est identique : conteneur Vaultwarden derrière un reverse proxy HTTPS, jamais exposé directement. Voir notre comparatif Synology vs TrueNAS vs QNAP pour choisir la plateforme.
Comment migrer mes mots de passe depuis un autre gestionnaire ?
Exportez vos données depuis votre gestionnaire actuel (LastPass, 1Password, Bitwarden Cloud, KeePass…) au format CSV ou JSON, puis importez-les via le client Bitwarden connecté à votre Vaultwarden (Outils → Importer des données). Supprimez ensuite le fichier d’export non chiffré : c’est une copie en clair de tous vos secrets.
Sur le même sujet
- Vaultwarden vs Bitwarden Cloud : coût, sécurité, performance
- Meilleur gestionnaire de mots de passe self-hosted
- Reverse proxy HTTPS automatique avec Caddy et Docker
- Sauvegarde automatique avec Restic et Backblaze
Vous avez désormais un gestionnaire de mots de passe souverain, en HTTPS, sauvegardé et durci. C’est l’un des services les plus utiles qu’un homelab puisse offrir. Pour suivre les nouvelles versions de Vaultwarden, les failles de sécurité et les meilleures pratiques d’auto-hébergement, abonnez-vous à notre bot de veille Telegram.