Guides et tutoriels

Installer Vaultwarden : mots de passe auto-hébergés

Publié le 28 janvier 2025 · 12 min de lecture

Pourquoi Vaultwarden

Vaultwarden est une réimplémentation légère de l'API Bitwarden, écrite en Rust : compatible avec tous les clients officiels Bitwarden (navigateur, mobile, desktop), elle tient dans 50 MB de RAM là où le serveur officiel exige plusieurs gigaoctets. C'est le gestionnaire de mots de passe auto-hébergé de référence.

Prérequis

Un VPS Ubuntu 24.04 avec Docker installé (voir notre guide « Installer Docker sur Ubuntu 24.04 ») et un domaine vault.example.com pointant vers le serveur. Le HTTPS est obligatoire : les clients Bitwarden reposent sur l'API Web Crypto du navigateur, inexistante en HTTP hors localhost.

Étape 1 — Arborescence

mkdir -p /opt/vaultwarden/data
cd /opt/vaultwarden

Étape 2 — Générer le token admin Argon2

Le panneau /admin est protégé par un token. Ne le stockez jamais en clair — générez un hachage Argon2 :

docker run --rm -it vaultwarden/server:latest /vaultwarden hash

Saisissez un mot de passe long ; la commande affiche une chaîne du type $argon2id$v=19$m=65540,t=3,p=4$.... Conservez-la pour l'étape suivante.

Étape 3 — docker-compose.yml

Créez /opt/vaultwarden/docker-compose.yml :

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: 'https://vault.example.com'
      SIGNUPS_ALLOWED: 'false'
      ADMIN_TOKEN: '$$argon2id$$v=19$$m=65540,t=3,p=4$$votre-hash-ici'
    volumes:
      - ./data:/data
    ports:
      - '127.0.0.1:8080:80'

Deux points critiques : le $ doit être doublé ($$) dans un fichier compose, sinon Docker tente une interpolation de variable ; et le conteneur n'écoute que sur 127.0.0.1, le reverse proxy fera le pont. SIGNUPS_ALLOWED: false n'empêche pas la création du premier compte via invitation depuis /admin, mais bloque les inscriptions sauvages.

Étape 4 — Lancer le conteneur

docker compose up -d
docker compose logs -f

Vérifiez en local : curl -I http://127.0.0.1:8080 doit répondre 200.

Étape 5 — Reverse proxy Nginx et HTTPS

Créez /etc/nginx/sites-available/vault.example.com :

server {
    listen 80;
    server_name vault.example.com;

    client_max_body_size 128M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Activez et certifiez :

ln -s /etc/nginx/sites-available/vault.example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
apt install -y certbot python3-certbot-nginx
certbot --nginx -d vault.example.com

Étape 6 — Créer votre compte

Passez temporairement SIGNUPS_ALLOWED à 'true', redémarrez (docker compose up -d), créez votre compte maître sur https://vault.example.com, puis repassez à 'false' et redémarrez. Votre compte existe, les inscriptions sont closes. Vous pourrez toujours inviter d'autres utilisateurs depuis /admin.

Importer vos mots de passe existants

Depuis Bitwarden, LastPass ou 1Password, exportez votre coffre en CSV ou JSON, puis dans Vaultwarden : Paramètres → Importer les données. Le coffre reste chiffré de bout en bout — vous seul détenez le mot de passe maître, le serveur ne stocke que des données illisibles sans lui. Détruisez le fichier d'export immédiatement après (shred -u export.csv) : il contient l'intégralité de vos secrets en clair.

Côté clients, installez l'extension officielle Bitwarden (Chrome, Firefox) ou l'application mobile, et renseignez l'URL de votre serveur dans les paramètres « Auto-hébergé » avant la première connexion. Tous vos appareils se synchronisent ensuite via votre VPS, sans passer par un cloud tiers.

Sauvegardes

Tout tient dans /opt/vaultwarden/data : db.sqlite3 (le coffre chiffré), attachments/, rsa_key*. Comme pour toute base SQLite, utilisez la commande de sauvegarde native plutôt qu'une copie de fichier :

sqlite3 /opt/vaultwarden/data/db.sqlite3 ".backup '/opt/vaultwarden/data/db-backup.sqlite3'"
tar -czf /backups/vaultwarden-$(date +%F).tar.gz -C /opt/vaultwarden data

Planifiez ce script en cron quotidien et expédiez l'archive vers un stockage externe (rclone, second VPS — voir notre guide sur la règle 3-2-1).

Hardening

  • Le token admin est un hachage Argon2, jamais une valeur en clair. Si vous n'utilisez pas /admin, supprimez carrément la variable ADMIN_TOKEN : le panneau est désactivé.
  • Configurez le SMTP dans environment (SMTP_HOST, SMTP_FROM, SMTP_SECURITY...) pour recevoir les invitations et les alertes de connexion.
  • Mettez à jour chaque semaine : docker compose pull && docker compose up -d.

Vérification

  • https://vault.example.com affiche l'écran de connexion Bitwarden.
  • L'extension navigateur, configurée avec l'URL de votre serveur, synchronise le coffre.
  • https://vault.example.com/admin demande le token et affiche les diagnostics.

Dépannage

  • Page blanche ou erreur de chiffrement : vous êtes en HTTP — le HTTPS est obligatoire.
  • 502 Bad Gateway : docker compose ps pour vérifier que le conteneur tourne, docker compose logs pour la cause.
  • Token admin refusé : les $ du hachage ne sont pas doublés dans le compose.
  • Invitations jamais reçues : SMTP absent ou incorrect — testez depuis /admin → Diagnostics.

Des tutoriels pas-à-pas rédigés par nos ingénieurs, testés sur notre infrastructure.

GLOBALCLOUDHOSTING →