Vaultwarden : coffre-fort de mots de passe self-hosted

Vaultwarden : coffre-fort de mots de passe self-hosted

Hébergez votre propre gestionnaire de mots de passe compatible Bitwarden sur un VPS. Vaultwarden est une réécriture en Rust, légère et compatible 100% avec les clients officiels Bitwarden (web, mobile, desktop, navigateurs).

Introduction

Bitwarden cloud, c'est bien. Mais payer 10 €/mois pour de la famille ou avoir vos secrets sur un serveur tiers ne vous tente pas. Vaultwarden est l'alternative self-hosted :

  • API compatible Bitwarden à 100%
  • Tourne en ~50 Mo de RAM
  • Tous les clients Bitwarden officiels fonctionnent (web, mobile iOS/Android, extensions navigateur, CLI)
  • Fonctions premium gratuites : TOTP intégré, partage, fichiers joints
  • Famille / équipe (organizations) sans limite

Un VPS à 5 €/mois suffit pour 50 users.

Prérequis

  • VPS Linux (Debian/Ubuntu recommandé) avec Docker installé
  • Nom de domaine pointant vers le VPS (ex: vault.votre-domaine.fr)
  • Reverse proxy (Nginx, Caddy ou Traefik) avec HTTPS

Étape 1 : Préparer le serveur

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

Étape 2 : docker-compose.yml

sudo nano docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.votre-domaine.fr"
      SIGNUPS_ALLOWED: "true"
      INVITATIONS_ALLOWED: "true"
      ADMIN_TOKEN: "VOTRE_TOKEN_ADMIN_GENERE"
      WEBSOCKET_ENABLED: "true"
      LOG_FILE: "/data/vaultwarden.log"
      LOG_LEVEL: "warn"
      SMTP_HOST: "smtp.example.com"
      SMTP_FROM: "[email protected]"
      SMTP_PORT: 587
      SMTP_SECURITY: "starttls"
      SMTP_USERNAME: "votre_smtp_user"
      SMTP_PASSWORD: "votre_smtp_password"
    volumes:
      - ./data:/data
    ports:
      - "127.0.0.1:8080:80"
      - "127.0.0.1:3012:3012"

Générez un admin token :

openssl rand -base64 48

Collez-le dans ADMIN_TOKEN.

⚠️ Une fois vos comptes créés, mettez SIGNUPS_ALLOWED: "false".

Étape 3 : Démarrer

sudo docker compose up -d
sudo docker compose logs -f

Vous devez voir :

Rocket has launched from http://0.0.0.0:80

Étape 4 : Reverse proxy Nginx + Let's Encrypt

sudo nano /etc/nginx/sites-available/vaultwarden
server {
    listen 80;
    listen [::]:80;
    server_name vault.votre-domaine.fr;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name vault.votre-domaine.fr;

    ssl_certificate /etc/letsencrypt/live/vault.votre-domaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vault.votre-domaine.fr/privkey.pem;
    
    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;
    }

    location /notifications/hub {
        proxy_pass http://127.0.0.1:3012;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /notifications/hub/negotiate {
        proxy_pass http://127.0.0.1:8080;
    }
}
sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/
sudo certbot --nginx -d vault.votre-domaine.fr
sudo nginx -t && sudo systemctl reload nginx

Étape 5 : Créer votre compte

Ouvrez https://vault.votre-domaine.frCréer un compte. Choisissez un mot de passe maître fort et impossible à oublier.

Étape 6 : Installer les clients

  • Extension navigateur : Chrome / Firefox / Edge → Bitwarden → Settings → Server URL : https://vault.votre-domaine.fr
  • Mobile iOS / Android : Bitwarden app → Paramètres → URL du serveur
  • Desktop : Settings → Server URL
  • CLI : bw config server https://vault.votre-domaine.fr

Étape 7 : Activer 2FA TOTP

  1. Web UI → Account Settings → Two-step Login
  2. Cliquez sur Authenticator app
  3. Scannez le QR avec Google Authenticator / Authy / Aegis
  4. Notez les codes de récupération

Étape 8 : Désactiver les inscriptions

SIGNUPS_ALLOWED: "false"
sudo docker compose up -d

Étape 9 : Page admin

Ouvrez https://vault.votre-domaine.fr/admin → entrez l'ADMIN_TOKEN. Vous pouvez :

  • Lister / supprimer les users
  • Inviter par email
  • Voir les organisations
  • Consulter les logs

Étape 10 : Backups quotidiens

sudo nano /usr/local/bin/backup-vaultwarden.sh
#!/bin/bash
DATE=$(date +%Y-%m-%d)
DEST=/backup/vaultwarden
mkdir -p "$DEST"

docker compose -f /opt/vaultwarden/docker-compose.yml stop
tar czf "$DEST/vaultwarden-$DATE.tar.gz" -C /opt/vaultwarden data/
docker compose -f /opt/vaultwarden/docker-compose.yml start

find "$DEST" -name "vaultwarden-*.tar.gz" -mtime +30 -delete
sudo chmod +x /usr/local/bin/backup-vaultwarden.sh
echo "0 3 * * * /usr/local/bin/backup-vaultwarden.sh" | sudo crontab -

Étape 11 : Migration vers PostgreSQL (gros volumes)

environment:
  DATABASE_URL: "postgresql://vault:password@db:5432/vaultwarden"

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: vault
      POSTGRES_PASSWORD: password
      POSTGRES_DB: vaultwarden
    volumes:
      - ./pgdata:/var/lib/postgresql/data

Étape 12 : Whitelist de domaines

SIGNUPS_DOMAINS_WHITELIST: "verycloud.fr"

Étape 13 : Performance

  • 100 users : VPS 1 vCPU / 1 Go RAM
  • 1000 users : VPS 2 vCPU / 2 Go RAM + PostgreSQL
  • Sync : ~10 Ko (faible)

Dépannage

"Trouble connecting to your server"

curl -I https://vault.votre-domaine.fr

Vérifiez certificat SSL valide.

Notifications push KO

WebSockets cassés. Vérifiez la config Nginx pour /notifications/hub.

Admin page 401

Vérifiez ADMIN_TOKEN puis redémarrez le container.

Email d'invitation non envoyé

docker compose logs vaultwarden | grep -i smtp

Test : page admin → Send test email.

Commandes utiles

docker compose ps
docker compose logs -f vaultwarden
docker compose exec vaultwarden sqlite3 /data/db.sqlite3 "SELECT email FROM users;"
sudo du -sh /opt/vaultwarden/data/
docker compose exec vaultwarden sqlite3 /data/db.sqlite3 ".backup /data/backup.db"
docker compose pull && docker compose up -d

Conclusion

Vaultwarden vous offre :

  • Bitwarden complet sans abonnement
  • 100% de contrôle sur vos données
  • Fonctions premium gratuites (TOTP, partage, fichiers)

Pour aller plus loin :

  • Activez le SSO via OIDC pour vos équipes
  • Mettez en place du monitoring uptime
  • Combinez avec Vault (HashiCorp) pour les secrets infra

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members