🛠️ Tutos · ⏱ 11 min de lecture

Héberger Vaultwarden avec Docker et HTTPS en 2026 (tutoriel complet, reverse proxy Caddy)

Tutoriel 2026 pas à pas pour auto-héberger Vaultwarden avec Docker : déploiement sécurisé, HTTPS automatique via Caddy et Let's Encrypt, panneau admin protégé, double authentification, sauvegardes chiffrées et durcissement. Configs docker-compose et Caddyfile prêtes à l'emploi.

S Par Équipe Selfhostr · tests indépendants
Héberger Vaultwarden avec Docker et HTTPS en 2026 (tutoriel complet, reverse proxy Caddy)
ⓘ Cet article peut contenir des liens affiliés (sans surcoût pour toi, ça soutient nos tests). Voir la disclosure.
💾
< 100 Mo
Consommation RAM
🦀
Rust
Langage
🔗
Bitwarden
Compatibilité

👍 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

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.fr comme 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) :

TypeNomValeur
Avault.exemple.fr203.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 :

  1. Allez dans Paramètres → Sécurité → Connexion en deux étapes.
  2. Activez TOTP (application d’authentification) au minimum, ou idéalement une clé matérielle WebAuthn/FIDO2 (YubiKey).
  3. 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 à /admin par 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

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.

Tags : vaultwardendockerhttpscaddybitwardenself-hostingsecurite

Sur le même sujet

🛠️ Tutos

Déployer Immich avec Docker en 2026 : tutoriel complet (HTTPS, reverse proxy, sauvegardes)

Tutoriel 2026 pas à pas pour auto-héberger Immich, l'alternative à Google Photos, avec Docker Compose : galerie photos et vidéos, reconnaissance faciale, HTTPS automatique via Caddy et Let's Encrypt, sauvegardes et durcissement. Configs prêtes à l'emploi.

Lire
🛠️ Tutos

Reverse proxy HTTPS automatique avec Caddy et Docker en 2026 (certificats Let's Encrypt sans effort)

Tutoriel 2026 pour déployer un reverse proxy Caddy avec Docker : HTTPS et certificats Let's Encrypt automatiques, redirection de plusieurs services, en-têtes de sécurité et renouvellement transparent. Configs Caddyfile et docker-compose prêtes à l'emploi.

Lire
🛠️ Tutos

Tutoriel Gitea avec Docker en 2026 : déployer sa forge git self-hosted en HTTPS

Tutoriel 2026 pour déployer Gitea, la forge git légère self-hosted, avec Docker : base PostgreSQL, reverse proxy HTTPS, SSH sur port dédié, Actions CI/CD, durcissement et sauvegarde. Configs docker-compose et Caddy prêtes à l'emploi.

Lire