Guide de déploiement

Déployer Vaultwarden sur un VPS : mots de passe auto-hébergés

Déployer sur un VPS Cloud →

Tutoriel

Sécurité & Monitoring

Déployer Vaultwarden sur un VPS : mots de passe auto-hébergés

Vaultwarden est une implémentation open-source, écrite en Rust, du serveur Bitwarden — assez légère pour tourner aux côtés d'autres services sur le plus petit des VPS, tout en restant parfaitement compatible avec chaque client Bitwarden officiel, sur toutes les plateformes.

15 min de lecture23 étapes
Sommaire· Pourquoi auto-héberger votre gestionnaire de mots de passe ?1/22
  1. 01Pourquoi auto-héberger votre gestionnaire de mots de passe ?
  2. 02Principaux avantages
  3. 03Prérequis
  4. 04Déployer Vaultwarden en 5 étapes
  5. 05Configurer le SMTP et la 2FA par e-mail
  6. 06Configurer SMTP correctement
  7. 07Compatibilité client/serveur et erreurs silencieuses
  8. 08Symptômes d'un mismatch de version client/serveur
  9. 09Diagnostiquer et résoudre le mismatch
  10. 10Coffre vide après la mise à jour des clients Bitwarden 2026.8.0 : diagnostic et parade
  11. 11Symptômes de ce défaut de compatibilité
  12. 12Diagnostiquer et réparer un coffre vide
  13. 13Mise à jour 1.37.4 : sept correctifs de sécurité et ruptures à connaître
  14. 14Les sept avis de sécurité de la 1.37.4
  15. 15Avant de passer en 1.37.4 : ce qui peut casser
  16. 16Bitwarden passe en double licence : ce qui change, ce qui ne change pas
  17. 17Ce qui change et ce qui ne change pas pour Vaultwarden
  18. 18Ne confondez pas licence des clients et licence du serveur
  19. 19Régression 1.37.1 : changement de mot de passe maître bloqué
  20. 20Piège SIGNUPS_ALLOWED=false : ne le posez qu'après le premier compte admin
  21. 21Des sauvegardes quotidiennes en une ligne cron
  22. 22La documentation officielle

Pourquoi auto-héberger votre gestionnaire de mots de passe ?

Les gestionnaires de mots de passe cloud facturent par utilisateur et par mois, stockent votre coffre chiffré sur des serveurs que vous ne contrôlez pas, et peuvent disparaître ou augmenter leurs tarifs du jour au lendemain. Vaultwarden inverse ce modèle : un conteneur sur votre VPS, un volume Docker à sauvegarder, et un nombre sans limite de compte d'utilisateurs pour un coût d'infrastructure fixe. Comme Vaultwarden parle le protocole Bitwarden, chaque client Bitwarden — extension Chrome, module Firefox, iOS, Android, Windows, Linux, CLI — se connecte à votre instance auto-hébergée sans la moindre modification.

Principaux avantages

  • 100 % compatible avec tous les clients Bitwarden officiels — pas de fork, pas d'application maison, rien à réapprendre
  • Chiffrement AES-256 de bout en bout : votre mot de passe maître ne quitte jamais votre appareil
  • Moins de 50 Mo de RAM au repos — tourne sans peine sur un VPS de 512 Mo aux côtés d'autres services
  • Utilisateurs et coffres d'organisation sans limite de comptes, avec partage chiffré et accès selon les rôles
  • Authentificateur TOTP intégré : remplacez Google Authenticator par une alternative auto-hébergée
  • Accès d'urgence — accordez à un contact de confiance un accès en lecture après un délai d'attente configurable

Prérequis

Il vous faut un VPS d'au moins 1 vCPU, 512 Mo de RAM, avec Docker installé (Ubuntu 22.04 LTS recommandé). Vous avez aussi besoin d'un nom de domaine pointant vers le VPS — les clients Bitwarden refusent les coffres non-HTTPS, HTTPS est donc obligatoire. Ouvrez les ports 80 et 443 dans votre pare-feu : ufw allow 80 && ufw allow 443.

Déployer Vaultwarden en 5 étapes

  1. Installer Docker

    Si Docker n'est pas déjà installé : curl -fsSL https://get.docker.com | sh && systemctl enable --now docker. Vérifiez avec docker --version.

  2. Démarrer Vaultwarden

    Lancez le conteneur : docker run -d --name vaultwarden --restart=always -v vaultwarden:/data -p 127.0.0.1:8000:80 -e WEBSOCKET_ENABLED=true vaultwarden/server:latest. Le serveur démarre en moins d'une seconde et écoute sur le port 8000 en localhost.

  3. Configurer HTTPS avec Caddy

    Installez Caddy : apt install -y caddy. Créez /etc/caddy/Caddyfile avec : passwords.votre-domaine.com { reverse_proxy localhost:8000 }. Rechargez Caddy : systemctl reload caddy. Un certificat TLS Let's Encrypt est provisionné automatiquement et renouvelé indéfiniment — zéro configuration.

  4. Créer votre compte

    Ouvrez https://passwords.votre-domaine.com dans votre navigateur. Cliquez sur « Create Account », choisissez un mot de passe maître robuste (il chiffre tout localement avant que quoi que ce soit ne soit envoyé au serveur), et votre coffre est actif immédiatement.

  5. Verrouiller les inscriptions

    Une fois tous les comptes créés, arrêtez le conteneur et relancez-le en ajoutant -e SIGNUPS_ALLOWED=false à la commande docker run. Votre instance est désormais accessible sur invitation uniquement. Pour la gestion continue des utilisateurs, activez le panneau d'administration en ajoutant -e ADMIN_TOKEN=$(openssl rand -base64 48).

  6. Se connecter la première fois

    À la première ouverture de l'URL, Vaultwarden affiche le coffre web Bitwarden : cliquez sur « Créer un compte » et définissez vous-même votre e-mail et votre mot de passe maître (il n'est récupérable par personne, pas même par nous). Faites-le IMMÉDIATEMENT : l'inscription est ouverte.

Configurer le SMTP et la 2FA par e-mail

Vaultwarden peut envoyer des e-mails pour la vérification d'adresse, la réinitialisation de mot de passe, les invitations d'organisation et la double authentification par e-mail (_ENABLE_EMAIL_2FA=true). Ce dernier point mérite une attention particulière : si le SMTP n'est pas configuré ou mal configuré, la 2FA par e-mail est déclarée activée mais n'envoie jamais rien — le code ne part pas, l'utilisateur ne peut plus se connecter, et Vaultwarden ne remonte aucune erreur visible.

La confusion la plus fréquente porte sur les ports et le chiffrement. Deux valeurs coexistent et ne sont pas interchangeables :

- Port 465 avec SMTP_SECURITY=force_tls — connexion TLS dès le début (anciennement « SMTPS »). Compatible avec la plupart des FAI et relais d'entreprise.
- Port 587 avec SMTP_SECURITY=starttls — connexion en clair qui monte en TLS via la commande STARTTLS. Valeur attendue par la majorité des fournisseurs SMTP modernes (SendGrid, Brevo, Postmark, Gmail SMTP).

Utiliser force_tls sur le port 587 — ou starttls sur le 465 — fait échouer la connexion SMTP en silence : les logs Vaultwarden n'indiquent rien, les e-mails ne partent pas, et l'interface affiche « envoyé » si vous testez depuis le panneau admin. Le seul signal est l'absence d'e-mail chez le destinataire.

Configurer SMTP correctement

  1. Choisir port et sécurité selon votre fournisseur

    Consultez la documentation de votre relais SMTP (Gmail, Brevo, Postmark, SendGrid…). Règle pratique : si votre fournisseur indique le port 465 → SMTP_SECURITY=force_tls ; s'il indique le port 587 → SMTP_SECURITY=starttls. Ne mélangez pas les deux.

  2. Passer les variables SMTP au conteneur

    Relancez le conteneur avec les variables nécessaires :

    docker run -d --name vaultwarden --restart=always \
      -v vaultwarden:/data \
      -p 127.0.0.1:8000:80 \
      -e SMTP_HOST=smtp.votre-fournisseur.com \
      -e [email protected] \
      -e SMTP_PORT=587 \
      -e SMTP_SECURITY=starttls \
      -e SMTP_USERNAME=votre_login \
      -e SMTP_PASSWORD=votre_mot_de_passe \
      vaultwarden/server:latest
  3. Tester l'envoi depuis le panneau admin

    Ouvrez https://passwords.votre-domaine.com/admin, faites défiler jusqu'à la section SMTP Email Settings et utilisez le bouton Send test email. Si l'e-mail n'arrive pas dans les 60 secondes, vérifiez les logs du conteneur : docker logs vaultwarden 2>&1 | grep -i smtp. Un message Connection refused indique un mauvais port ; TLS handshake error indique une incompatibilité de sécurité.

  4. Activer la 2FA par e-mail seulement après avoir validé l'envoi

    N'activez _ENABLE_EMAIL_2FA=true qu'une fois l'envoi de test confirmé. Si vous l'activez avant, les utilisateurs dont le client demande un code ne reçoivent rien et se retrouvent bloqués. Pour débloquer un compte verrouillé : ouvrez /admin, localisez l'utilisateur et cliquez Deactivate TOTP pour désactiver temporairement la 2FA.

Compatibilité client/serveur et erreurs silencieuses

Les clients Bitwarden récents ont introduit un nouveau flux d'authentification initiale qui appelle l'endpoint /identity/accounts/prelogin/password. Les instances Vaultwarden figées sur une version antérieure à 1.36.0 ne connaissent pas cet endpoint et retournent une erreur 404 sans message explicite — le client affiche simplement un échec de connexion générique. Le piège est insidieux : les appareils déjà connectés avant la mise à jour du client continuent de fonctionner normalement, car leur session est déjà établie et ne passe pas par ce nouveau chemin d'authentification. Seuls les nouveaux appareils échouent. Si vous lancez curl https://votre-domaine.com/identity/accounts/prelogin/password -X POST -d '{"email":"[email protected]"}' -H 'Content-Type: application/json' et obtenez un 404, votre serveur est trop ancien.

Symptômes d'un mismatch de version client/serveur

  • Connexion impossible sur un nouvel appareil ou navigateur, alors que les appareils existants fonctionnent normalement
  • Message d'erreur générique sans indication de cause ("An error has occurred" ou "Invalid username or password")
  • L'extension Chrome ou Firefox fraîchement installée échoue, mais la version identique sur un autre poste fonctionne
  • Le coffre web Bitwarden hébergé sur votre instance répond 404 sur /identity/accounts/prelogin/password
  • Aucune erreur dans les logs Vaultwarden côté serveur — l'endpoint n'existe pas, il n'y a rien à logger
  • Le problème est apparu après une mise à jour automatique du client Bitwarden sur le nouvel appareil

Diagnostiquer et résoudre le mismatch

  1. Vérifier la version de votre serveur

    Interrogez l'endpoint de version : curl https://votre-domaine.com/api/version. Si la réponse affiche une version antérieure à 1.36.0, votre serveur ne supporte pas le nouveau flux d'authentification des clients récents.

  2. Mettre à jour vers la dernière image

    La solution la plus sûre est d'utiliser systématiquement vaultwarden/server:latest et de maintenir l'image à jour. Pour mettre à jour : docker pull vaultwarden/server:latest && docker stop vaultwarden && docker rm vaultwarden, puis relancez la même commande docker run qu'à l'installation. Vaultwarden preserve les données dans le volume — aucune migration manuelle n'est nécessaire.

  3. Vérifier que la mise à jour a pris effet

    Après redémarrage, interrogez à nouveau curl https://votre-domaine.com/api/version et confirmez que la version est 1.36.0 ou supérieure. Testez ensuite la connexion depuis un nouvel onglet de navigation privée.

  4. Épingler une version si la stabilité prime

    Si vous préférez contrôler manuellement les mises à jour, utilisez un tag versionné : vaultwarden/server:1.37.2 par exemple. Dans ce cas, surveillez les releases sur GitHub et mettez à jour dès qu'une nouvelle version client Bitwarden est déployée — les deux sont couplés.

Coffre vide après la mise à jour des clients Bitwarden 2026.8.0 : diagnostic et parade

Si, après la mise à jour d'une application Bitwarden en 2026.8.0, la connexion réussit mais que le coffre reste vide, le coupable n'est pas le chiffrement. Les tickets du dépôt Vaultwarden (#7607 et #7612, fermés en août 2026) montrent un défaut de compatibilité sur les données de politiques d'organisation : le client 2026.8.0 attend une date de révision que le serveur n'envoyait pas, lève une erreur et abandonne l'affichage du coffre. Le serveur n'écrit rien dans ses journaux, ce qui rend le problème trompeur. Le correctif côté serveur est livré dans Vaultwarden 1.37.2 (publiée en août 2026), dont les notes précisent qu'elle est requise pour les clients 2026.8.0 et suivants. Si vous êtes sur 1.37.4 ou plus récent, vous l'avez déjà ; si le coffre est vide, c'est d'abord l'état local du client qu'il faut nettoyer. Une précision importante : une version antérieure de cet article attribuait ce symptôme à un « nouveau format EncString » non supporté par Vaultwarden. Nous n'avons trouvé aucune trace de cela dans les tickets officiels ; cette explication a été retirée.

Symptômes de ce défaut de compatibilité

  • Connexion acceptée, mais coffre vide ou qui ne se charge pas après la synchronisation
  • Pas de suggestions d'auto-remplissage, application de bureau qui plante ou extension qui affiche « failed to fetch »
  • Dans la console du navigateur, l'erreur RangeError: Invalid time value dans toSdkPolicyView (relevée dans le ticket #7612)
  • Aucune erreur dans les journaux du serveur Vaultwarden
  • Cas rapportés surtout sur des comptes membres d'une organisation qui a au moins une politique configurée, même désactivée ; l'interface web servie par Vaultwarden fonctionne

Diagnostiquer et réparer un coffre vide

  1. Vérifier la version du serveur

    Ouvrez /admin/diagnostics ou lancez docker exec vaultwarden /vaultwarden --version. Il faut 1.37.2 au minimum pour les clients 2026.8.0+. Assurez-vous aussi qu'une seule instance tourne : un fichier compose en double a déjà causé des symptômes identiques.

  2. Mettre le serveur à jour si besoin

    Utilisez la même procédure que pour toute mise à jour (récupérer l'image, recréer le conteneur sur le même volume). Visez directement la dernière version : voir la section sur la 1.37.4 plus bas.

  3. Nettoyer l'état local du client

    Déconnectez-vous complètement puis reconnectez-vous. Si le coffre reste vide, vider le stockage de l'extension (les entrées policies) ou la désinstaller puis la réinstaller règle la plupart des cas. Sur macOS, certains utilisateurs ont dû supprimer les données du conteneur de l'application de bureau avant de se reconnecter.

  4. Contrôler l'environnement avant de rétrograder

    Consultez /admin/diagnostics pour les en-têtes manquants (une erreur de TOTP a été corrigée ainsi), gardez l'administration et le coffre sur le même domaine, et testez en désactivant les bloqueurs de publicités. En dernier recours seulement, repassez les clients en 2026.7.0, version qui fonctionnait pour les premiers rapporteurs, en attendant la mise à jour du serveur.

Mise à jour 1.37.4 : sept correctifs de sécurité et ruptures à connaître

Vaultwarden 1.37.4 est sortie le 5 octobre 2026. Ses notes listent sept avis de sécurité, d'abord publiés en privé, en attente d'attribution d'identifiants CVE : au moment de la publication, aucun numéro CVE n'était donné, seulement des identifiants GHSA. La plupart concernent les organisations (membres, invitations, journaux, clés d'API) et les fonctions partagées. Si vous exploitez des organisations ou des Sends, mettez à jour sans attendre ; pour un coffre strictement personnel, le risque est moindre mais la mise à jour reste recommandée.

Les sept avis de sécurité de la 1.37.4

  • Révocation de membres d'une organisation : gravité haute, 8.1 (GHSA-69q9-v8p6-xvx3)
  • Authentification à deux facteurs : gravité moyenne, 6.8 (GHSA-7jg8-8m5x-6j9r)
  • Invitations d'organisation : gravité moyenne, 6.8 (GHSA-v576-3wvq-xh3c)
  • Pièces jointes : gravité moyenne, 6.5 (GHSA-q5x6-grh5-fqgc)
  • Journaux d'événements d'organisation : gravité moyenne, 4.3 (GHSA-64mc-4p6f-r7x9)
  • Partage d'éléments : gravité moyenne, 4.3 (GHSA-7ccc-c43j-4p36)
  • Clé d'API d'organisation : gravité basse, 3.8 (GHSA-qwx4-wcv4-mpcv)

Avant de passer en 1.37.4 : ce qui peut casser

  1. Reverse proxy et IP du client

    Avec IP_HEADER=X-Forwarded-For, l'adresse retenue est désormais l'adresse la plus à droite qui ne figure pas dans IP_HEADER_TRUSTED_PROXIES (avant : la plus à gauche). Si plusieurs proxies se suivent devant Vaultwarden, listez-les tous dans IP_HEADER_TRUSTED_PROXIES, sinon vos journaux et limites de débit verront la mauvaise adresse.

  2. Sends et CLI

    bw send receive ne fonctionne plus avec le CLI 2026.4.2 et antérieur. Créer et gérer des Sends reste possible avec tous les clients : mettez à jour le CLI si vous recevez des Sends en ligne de commande.

  3. MariaDB ou MySQL sans TLS

    Si votre serveur de base ne gère pas les connexions TLS natives, l'image Alpine peut échouer à s'y connecter. Ajoutez MARIADB_TLS_DISABLE_PEER_VERIFICATION=1 à l'environnement de Vaultwarden. Avec SQLite, par défaut dans ce guide, vous n'êtes pas concerné.

  4. Options et points d'accès retirés

    Plusieurs drapeaux expérimentaux (par exemple ssh-agent ou mutual-tls) ont été supprimés : s'ils figurent encore dans EXPERIMENTAL_CLIENT_FEATURE_FLAGS, le démarrage journalise un avertissement et l'enregistrement des réglages du panneau d'administration échoue tant qu'ils n'en sont pas retirés. DUO_USE_IFRAME est supprimée et ignorée. Les anciens points d'accès POST /identity/accounts/register et POST /api/accounts/prelogin sont retirés ; les notes indiquent qu'aucun client actuel ne les utilise.

  5. Faire pivoter la clé d'API d'organisation

    Avant cette version, les administrateurs d'une organisation pouvaient aussi consulter sa clé d'API. Si certains ne sont pas entièrement de confiance, faites pivoter la clé après la mise à jour (console d'administration, Paramètres, Faire pivoter la clé d'API).

Bitwarden passe en double licence : ce qui change, ce qui ne change pas

Le 9 octobre 2026, Bitwarden a annoncé sur son forum communautaire que, à partir de la prochaine version, les applications publiées dans les boutiques seront les versions sous licence commerciale ; les téléchargements directs depuis son site suivent le même régime. Le code continue d'être développé et publié sous GPLv3 sur GitHub. Le dépôt des clients portait déjà deux licences : GPLv3 par défaut, et la licence Bitwarden v1.0 limitée au dossier bitwarden_license. La nouveauté est donc surtout celle des binaires distribués, pas celle du code. Le bulletin hebdomadaire selfh.st du 16 octobre a relevé ce virage en notant que la formule « toutes les fonctionnalités actuelles sont disponibles dans les deux versions » ne dit rien des fonctionnalités à venir. C'est le point à surveiller.

Ce qui change et ce qui ne change pas pour Vaultwarden

  • Ne change pas : Bitwarden indique qu'il n'y a aucun changement pour l'auto-hébergement ; le serveur Vaultwarden est un projet indépendant, sous licence AGPL-3.0, qui n'est pas concerné par la licence des clients
  • Ne change pas : les fonctionnalités actuelles restent disponibles dans les deux versions des clients, offre gratuite comprise ; aucune action n'est demandée aux utilisateurs existants
  • À surveiller : Bitwarden prévient que certains composants futurs ne seront publiés que sous licence commerciale, et que chaque nouvelle fonctionnalité sera jugée au cas par cas ; les clients des boutiques et la version GPLv3 pourraient diverger
  • À surveiller : si une fonctionnalité future n'existe que dans le build commercial, rien ne garantit qu'elle fonctionne avec un serveur tiers ; testez chaque mise à jour de client sur un compte secondaire avant de la généraliser
  • Si vous voulez rester sur le code GPLv3, vous pouvez compiler les clients depuis le dépôt GitHub, au prix d'un entretien à votre charge

Ne confondez pas licence des clients et licence du serveur

Le changement annoncé touche la façon dont Bitwarden distribue ses applications. Vaultwarden reste un logiciel libre distinct, réimplémentant le protocole côté serveur sous licence AGPL-3.0. Votre déploiement décrit dans ce guide n'a donc rien à modifier aujourd'hui. Notez la date des versions clientes que vous validez : c'est ce qui vous permettra de repérer le jour où les deux builds divergent. Si vous migrez depuis Bitwarden en ligne, la check-list de migration de ce guide reste valable telle quelle.

Régression 1.37.1 : changement de mot de passe maître bloqué

La version 1.37.1 contient une régression connue (issue GitHub #7659) : la requête de changement de mot de passe maître retourne HTTP 422 avec le message missing field newMasterPasswordHash. L'opération échoue côté serveur sans que le client ne donne d'information utile. La correction est dans la version 1.37.2, publiée peu après. Si vous avez épinglé la version 1.37.1, montez directement à 1.37.2 — la commande est la même que pour n'importe quelle mise à jour : docker pull vaultwarden/server:1.37.2 && docker stop vaultwarden && docker rm vaultwarden, puis relancez le conteneur avec le nouveau tag.

Piège SIGNUPS_ALLOWED=false : ne le posez qu'après le premier compte admin

Une erreur courante à l'installation : poser -e SIGNUPS_ALLOWED=false avant d'avoir créé le compte administrateur. Résultat — votre propre instance vous refuse la création de compte et vous ne pouvez plus vous connecter. L'ordre est impératif : (1) démarrez sans ce paramètre, (2) créez immédiatement votre compte admin via l'interface web, (3) puis seulement relancez le conteneur avec SIGNUPS_ALLOWED=false. Si vous avez déjà verrouillé et que vous êtes bloqué, la sortie de secours est d'activer le panneau d'administration via -e ADMIN_TOKEN=$(openssl rand -base64 48) et d'inviter l'utilisateur admin depuis /admin.

Des sauvegardes quotidiennes en une ligne cron

Ajoutez ceci au crontab de root (crontab -e) : 0 3 * * * docker run --rm -v vaultwarden:/data -v /backup:/out busybox tar czf /out/vaultwarden-$(date +%F).tar.gz /data. Exécutez-le tous les jours à 3 h du matin — l'intégralité du coffre (fichier SQLite + pièces jointes) atterrit dans /backup sous forme d'archive horodatée. Envoyez ce répertoire vers S3 ou Backblaze B2 avec rclone pour une protection hors-site.

La documentation officielle

Pour la configuration avancée et les options propres à l'outil, référez-vous à la documentation officielle de Vaultwarden. Ce guide couvre la mise en ligne sur VPS ; la doc éditeur reste la référence pour les réglages fins, les mises à jour majeures et les cas d'usage spécifiques.

Déployez Vaultwarden sur votre VPS

Commandez un VPS ServOrbit, déployez Vaultwarden en quelques minutes, et devenez propriétaire de votre coffre de mots de passe pour de bon.