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 hashSaisissez 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 -fVé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 dataPlanifiez 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 variableADMIN_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.comaffiche l'écran de connexion Bitwarden.- L'extension navigateur, configurée avec l'URL de votre serveur, synchronise le coffre.
https://vault.example.com/admindemande 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 pspour vérifier que le conteneur tourne,docker compose logspour 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.