Guide d'installation Vaultwarden avec Docker et Apache
Ce guide décrit l'installation complète de Vaultwarden (gestionnaire de mots de passe auto-hébergé) sur Debian 12 avec Docker, Apache en reverse proxy et SSL.
📋 Prérequis
- Serveur Debian 12
- Accès root ou sudo
- Nom de domaine configuré (ex: vault.domain.eu)
- Ports 80 et 443 ouverts dans le pare-feu
- Docker et Docker Compose installés
🔧 1. Installation des dépendances
# Mise à jour du système
apt update && apt upgrade -y
# Installation d'Apache et des modules nécessaires
apt install apache2 certbot python3-certbot-apache -y
# Activation des modules Apache
a2enmod proxy proxy_http ssl headers rewrite
# Redémarrage d'Apache
systemctl restart apache2
🐳 2. Installation de Docker et Docker Compose
Si Docker n'est pas déjà installé :
# Installation de Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Installation de Docker Compose
apt install docker-compose -y
# Vérification
docker --version
docker-compose --version
📁 3. Création de la structure Vaultwarden
🌐 4. Configuration DNS
Créez un enregistrement DNS A ou CNAME pointant vers votre IP publique :
Vérifiez avec :
Attendez que la propagation DNS soit complète avant de continuer.
🔐 5. Génération du certificat SSL avec Certbot
Étape 1 : Créer un vhost Apache temporaire
Contenu du vhost temporaire :
<VirtualHost *:80>
ServerName vault.domain.eu
ServerAdmin admin@domain.eu
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/vault-error.log
CustomLog ${APACHE_LOG_DIR}/vault-access.log combined
</VirtualHost>
Étape 2 : Activer le site et générer le certificat
# Activer le site
a2ensite vault.domain.eu.conf
# Tester la configuration
apachectl configtest
# Recharger Apache
systemctl reload apache2
# Générer le certificat SSL avec Certbot
certbot --apache -d vault.domain.eu
Certbot va vous poser quelques questions : - Email pour les notifications : indiquez votre email - Accepter les conditions : Oui - Redirection HTTPS automatique : Oui (recommandé)
🔧 6. Configuration Apache complète (reverse proxy)
Maintenant que le certificat est créé, remplacez le vhost par la configuration complète :
Contenu complet du vhost :
<VirtualHost *:80>
ServerName vault.domain.eu
ServerAdmin admin@domain.eu
# Redirection automatique vers HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/vault-error.log
CustomLog ${APACHE_LOG_DIR}/vault-access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName vault.domain.eu
ServerAdmin admin@domain.eu
# ========== CONFIGURATION SSL ==========
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/vault.domain.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vault.domain.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
# ========== HEADERS DE SÉCURITÉ ==========
# Force HTTPS pendant 1 an
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Empêche l'intégration dans une iframe
Header always set X-Frame-Options "DENY"
# Empêche le navigateur de deviner le type de contenu
Header always set X-Content-Type-Options "nosniff"
# Ne pas envoyer de referrer vers d'autres sites
Header always set Referrer-Policy "same-origin"
# Désactive les fonctionnalités inutiles du navigateur
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), magnetometer=(), gyroscope=(), accelerometer=()"
# Content Security Policy - stricte pour Vaultwarden
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://haveibeenpwned.com; connect-src 'self' https://api.pwnedpasswords.com https://api.2fa.directory https://2fa.directory; frame-ancestors 'none'; base-uri 'self'; form-action 'self';"
# Supprime les headers qui révèlent des infos serveur
Header always unset X-Powered-By
Header always unset Server
# ========== CONFIGURATION REVERSE PROXY ==========
ProxyPreserveHost On
ProxyRequests Off
# Transmet l'IP réelle du client
RequestHeader set X-Real-IP %{REMOTE_ADDR}s
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
RequestHeader set X-Forwarded-Proto https
# Proxy vers le conteneur Docker Vaultwarden
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
# Support WebSocket (notifications en temps réel)
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:8080/$1" [P,L]
# ========== LOGS ==========
ErrorLog ${APACHE_LOG_DIR}/vault-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/vault-ssl-access.log combined
</VirtualHost>
</IfModule>
Tester et appliquer la configuration
# Tester la configuration Apache
apachectl configtest
# Si "Syntax OK", recharger Apache
systemctl reload apache2
# Vérifier le statut
systemctl status apache2
🔒 7. Configuration de la sécurité globale Apache
Pour améliorer la sécurité globale du serveur Apache :
Modifiez ou ajoutez ces lignes :
Rechargez Apache :
🔑 8. Génération du token admin sécurisé
Étape 1 : Créer un mot de passe robuste
Choisissez un mot de passe mémorisable et robuste. Recommandations :
- Au moins 16 caractères
- Mélange de majuscules, minuscules, chiffres
- Caractères spéciaux : @, !, -, _, . (préférez ces caractères)
- Évitez si possible : $, `, ", ', \ (compliquent l'échappement)
Exemples :
- Admin@Vault2024!Secure
- MonVault-Super.Securise2024!
- Gestionnaire!MotsDePasse@2024
⚠️ TRÈS IMPORTANT : Sauvegardez ce mot de passe dans un endroit sûr ! Vous en aurez besoin pour accéder à l'interface admin (/admin).
Étape 2 : Générer le hash Argon2
Il existe plusieurs méthodes pour générer le hash :
Méthode 1 : Via un conteneur Docker temporaire (avant le lancement)
La commande vous demandera de taper votre mot de passe deux fois.
Méthode 2 : Via le conteneur en cours (après le lancement)
Méthode 3 : Avec argon2 installé sur le système
Exemple de hash obtenu :
Copiez ce hash complet (il commence par $argon2id$v=19$...)
🐳 9. Configuration Docker Compose
Créer le fichier docker-compose.yml
Contenu du docker-compose.yml :
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://vault.domain.eu
- SIGNUPS_ALLOWED=true
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8080:80"
Explications :
- DOMAIN : Votre domaine complet avec https://
- SIGNUPS_ALLOWED=true : Permet les inscriptions (à désactiver après votre première inscription)
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} : Référence la variable définie dans le fichier .env
- 127.0.0.1:8080:80 : Le port 8080 n'est accessible que localement (seul Apache peut y accéder)
- ./vw-data:/data : Les données sont sauvegardées dans le dossier local vw-data
Créer le fichier .env
Contenu du fichier .env :
VAULTWARDEN_ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$bXBGMENkdGR5RnZHN01BMQ$T1uQCvbn/9MNl8aXqNnP7mF6rMYBMlXPBxBiDONqrZM'
⚠️ POINTS CRITIQUES :
- Utilisez des guillemets simples '...' (pas de guillemets doubles)
- Utilisez des $ simples (ne doublez PAS les $)
- Remplacez par votre propre hash Argon2 complet
- Le hash doit commencer par $argon2id$v=19$...
Pourquoi cette méthode ?
Contrairement à mettre le token directement dans docker-compose.yml, le fichier .env ne nécessite pas de doubler les $. C'est la méthode recommandée dans la documentation officielle de Vaultwarden car elle évite les problèmes d'échappement.
🚀 10. Lancement de Vaultwarden
Vérifier les logs
# Voir les logs en temps réel
docker-compose logs -f
# Ou voir juste les dernières lignes
docker-compose logs | tail -30
Vérifications importantes : - ✅ Aucun warning "You are using a plain text ADMIN_TOKEN" - ✅ Le serveur démarre sur le port 80 (interne au conteneur) - ✅ Aucune erreur visible
Vérifier que le conteneur tourne
Vous devriez voir :
✅ 11. Test et première connexion
11.1 Test de l'accès HTTPS
Ouvrez votre navigateur : https://vault.domain.eu
Vous devriez voir : - ✅ Certificat SSL valide (cadenas vert) - ✅ Page de connexion/inscription Vaultwarden - ✅ Aucune erreur de certificat
11.2 Accès à l'interface admin
Allez sur : https://vault.domain.eu/admin
Pour vous connecter :
- Utilisez votre mot de passe en clair (celui que vous avez tapé pour générer le hash)
- NE PAS utiliser le hash Argon2
- Exemple : si vous avez tapé Admin@Vault2024!Secure lors de la génération du hash, c'est ce mot de passe que vous utilisez ici
Si la connexion échoue :
1. Vérifiez que vous utilisez bien le mot de passe en clair, pas le hash
2. Vérifiez qu'il n'y a pas de fichier config.json qui override la configuration :
Si ce fichier existe et contient un ancien token, supprimez-le :
11.3 Créer votre premier compte utilisateur
- Retournez sur
https://vault.domain.eu - Cliquez sur "Créer un compte"
- Renseignez votre email et un mot de passe maître très robuste
- Validez et connectez-vous
⚠️ IMPORTANT : Le mot de passe maître ne peut PAS être récupéré. Si vous le perdez, vous perdez l'accès à toutes vos données. Sauvegardez-le dans un endroit sûr !
🔒 12. Sécurisation post-installation
12.1 Désactiver les inscriptions publiques
Une fois votre compte créé, désactivez les inscriptions pour éviter que n'importe qui puisse créer un compte :
Modifiez la ligne :
Redémarrez Vaultwarden :
12.2 Configurer les paramètres dans l'interface admin
Connectez-vous à https://vault.domain.eu/admin et configurez :
Paramètres généraux :
- Domain URL : vérifiez que c'est bien https://vault.domain.eu
- Disable icon downloads : Si vous voulez économiser de la bande passante
Paramètres SMTP (optionnel mais recommandé) : - Permet d'envoyer des emails de vérification et d'invitation - Configurez avec votre serveur SMTP ou un service comme Gmail, Mailgun, etc.
Paramètres de sécurité : - Enable Two-Factor authentication : Activé par défaut (recommandé) - Invitations : Gérez qui peut inviter de nouveaux utilisateurs
N'oubliez pas de cliquer sur "Save" après chaque modification !
12.3 Tester les headers de sécurité
Vérifiez que votre installation est bien sécurisée :
- SecurityHeaders.com : https://securityheaders.com/?q=vault.domain.eu
- Mozilla Observatory : https://observatory.mozilla.org/
Vous devriez obtenir une note A ou A+.
12.4 Renouvellement automatique du certificat SSL
Certbot configure automatiquement un timer systemd pour renouveler les certificats. Vérifiez :
# Vérifier que le timer est actif
systemctl status certbot.timer
# Tester le renouvellement (dry-run)
certbot renew --dry-run
Le certificat sera renouvelé automatiquement tous les 60 jours.
🔧 13. Commandes utiles pour la gestion quotidienne
Gestion du conteneur Docker
cd /opt/vaultwarden
# Voir les logs en temps réel
docker-compose logs -f
# Voir les dernières lignes des logs
docker-compose logs --tail=50
# Arrêter Vaultwarden
docker-compose stop
# Démarrer Vaultwarden
docker-compose start
# Redémarrer Vaultwarden
docker-compose restart
# Arrêter et supprimer le conteneur (les données restent dans ./vw-data)
docker-compose down
# Mettre à jour Vaultwarden vers la dernière version
docker-compose pull
docker-compose up -d
# Voir l'état du conteneur
docker-compose ps
# Voir les statistiques de ressources (CPU, RAM)
docker stats vaultwarden
Gestion d'Apache
# Voir les logs Apache
tail -f /var/log/apache2/vault-ssl-error.log
tail -f /var/log/apache2/vault-ssl-access.log
# Tester la configuration
apachectl configtest
# Recharger Apache (sans interruption)
systemctl reload apache2
# Redémarrer Apache
systemctl restart apache2
# Voir l'état d'Apache
systemctl status apache2
Accès au shell du conteneur
# Ouvrir un shell dans le conteneur
docker exec -it vaultwarden /bin/sh
# Une fois dans le shell, vous pouvez explorer
ls -la /data/
exit
💾 14. Sauvegardes
14.1 Sauvegarde manuelle
# Arrêtez Vaultwarden avant la sauvegarde (recommandé)
cd /opt/vaultwarden
docker-compose stop
# Sauvegardez le répertoire data avec compression
tar -czf vaultwarden-backup-$(date +%Y%m%d-%H%M%S).tar.gz vw-data/
# Sauvegardez également les fichiers de configuration
cp docker-compose.yml docker-compose.yml.backup
cp .env .env.backup
# Redémarrez Vaultwarden
docker-compose start
# Déplacez la sauvegarde dans un endroit sûr
mv vaultwarden-backup-*.tar.gz /chemin/vers/sauvegardes/
14.2 Script de sauvegarde automatique
Créez un script de sauvegarde :
Contenu :
#!/bin/bash
# Configuration
BACKUP_DIR="/var/backups/vaultwarden"
VAULTWARDEN_DIR="/opt/vaultwarden"
RETENTION_DAYS=30
# Créer le répertoire de sauvegarde s'il n'existe pas
mkdir -p "$BACKUP_DIR"
# Date actuelle
DATE=$(date +%Y%m%d-%H%M%S)
# Arrêter Vaultwarden
cd "$VAULTWARDEN_DIR"
docker-compose stop
# Créer la sauvegarde
tar -czf "$BACKUP_DIR/vaultwarden-backup-$DATE.tar.gz" vw-data/
# Redémarrer Vaultwarden
docker-compose start
# Supprimer les sauvegardes de plus de X jours
find "$BACKUP_DIR" -name "vaultwarden-backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
# Afficher un message
echo "Sauvegarde terminée : $BACKUP_DIR/vaultwarden-backup-$DATE.tar.gz"
Rendre le script exécutable :
Automatiser avec cron (sauvegarde quotidienne à 3h du matin) :
Ajoutez cette ligne :
14.3 Restauration d'une sauvegarde
# Arrêter Vaultwarden
cd /opt/vaultwarden
docker-compose down
# Sauvegarder l'état actuel (au cas où)
mv vw-data vw-data.old
# Restaurer depuis la sauvegarde
tar -xzf /chemin/vers/vaultwarden-backup-YYYYMMDD-HHMMSS.tar.gz
# Redémarrer Vaultwarden
docker-compose up -d
# Vérifier les logs
docker-compose logs -f
🛡️ 15. Sécurité additionnelle avec Fail2ban
Fail2ban protège contre les attaques par force brute en bannissant les IP qui tentent trop de connexions échouées.
Installation
Configuration du filtre Vaultwarden
Contenu :
[INCLUDES]
before = common.conf
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =
Configuration de la jail
Contenu :
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
action = iptables-allports[name=vaultwarden]
logpath = /opt/vaultwarden/vw-data/vaultwarden.log
maxretry = 5
bantime = 14400
findtime = 14400
Explications :
- maxretry = 5 : 5 tentatives échouées maximum
- bantime = 14400 : Bannissement de 4 heures (en secondes)
- findtime = 14400 : Fenêtre de temps de 4 heures
Activer Fail2ban
# Redémarrer Fail2ban
systemctl restart fail2ban
# Vérifier le statut
systemctl status fail2ban
# Voir les jails actives
fail2ban-client status
# Voir les détails de la jail Vaultwarden
fail2ban-client status vaultwarden
🔄 16. Mise à jour de Vaultwarden
Vérifier la version actuelle
Mettre à jour vers la dernière version
cd /opt/vaultwarden
# Arrêter le conteneur
docker-compose down
# Sauvegarder les données (recommandé)
tar -czf vaultwarden-backup-avant-maj-$(date +%Y%m%d).tar.gz vw-data/
# Télécharger la dernière image
docker-compose pull
# Redémarrer avec la nouvelle version
docker-compose up -d
# Vérifier les logs
docker-compose logs -f
Revenir à une version précédente (rollback)
Si la mise à jour pose problème :
cd /opt/vaultwarden
docker-compose down
# Spécifier une version précise dans docker-compose.yml
nano docker-compose.yml
Modifiez :
Puis :
🧪 17. Tests et diagnostic
Test de connexion au port 8080 (local)
Vous devriez voir du HTML de la page Vaultwarden.
Test de connexion HTTPS
Vérifiez : - Code HTTP 200 - Présence des headers de sécurité (HSTS, X-Frame-Options, etc.)
Vérifier les certificats SSL
Diagnostic Apache
# Lister les modules activés
apache2ctl -M | grep proxy
apache2ctl -M | grep ssl
apache2ctl -M | grep headers
# Vérifier les sites activés
ls -la /etc/apache2/sites-enabled/
# Tester la configuration
apachectl configtest
Diagnostic Docker
# Voir tous les conteneurs
docker ps -a
# Voir l'utilisation des ressources
docker stats vaultwarden
# Inspecter le conteneur
docker inspect vaultwarden
# Voir les variables d'environnement
docker exec vaultwarden env | grep ADMIN
docker exec vaultwarden env | grep DOMAIN
⚠️ 18. Problèmes courants et solutions
Problème : "Invalid admin token"
Causes possibles :
1. Vous utilisez le hash au lieu du mot de passe en clair
2. Un fichier config.json override la configuration
Solutions :
# Vérifier s'il existe un config.json
ls -la /opt/vaultwarden/vw-data/config.json
# Si oui, le supprimer
rm /opt/vaultwarden/vw-data/config.json
docker-compose restart
# Vérifier que la variable est bien passée au conteneur
docker exec vaultwarden env | grep ADMIN_TOKEN
Problème : "502 Bad Gateway"
Causes possibles : 1. Vaultwarden n'est pas démarré 2. Mauvaise configuration du proxy 3. Port 8080 déjà utilisé
Solutions :
# Vérifier que Vaultwarden tourne
docker-compose ps
# Vérifier les logs
docker-compose logs
# Vérifier que le port 8080 est bien écouté
netstat -tlnp | grep 8080
# Redémarrer tout
docker-compose restart
systemctl reload apache2
Problème : Warnings Docker Compose sur les variables
Cause : Les $ dans le hash ne sont pas correctement échappés dans docker-compose.yml.
Solution : Utilisez un fichier .env avec des guillemets simples et des $ simples (comme expliqué dans ce guide).
Problème : Certificat SSL invalide
Solutions :
# Renouveler le certificat manuellement
certbot renew --force-renewal
# Vérifier les certificats
certbot certificates
# Reconfigurer le domaine
certbot --apache -d vault.domain.eu
Problème : Impossibilité de se connecter après mise à jour
Solution :
# Vider le cache du navigateur (Ctrl+Shift+R)
# Ou essayer en navigation privée
# Vérifier les logs Vaultwarden
docker-compose logs -f
# Revenir à la version précédente si nécessaire
docker-compose down
# Modifier docker-compose.yml avec l'ancienne version
docker-compose up -d
📚 19. Ressources et documentation
Documentation officielle
- Wiki Vaultwarden : https://github.com/dani-garcia/vaultwarden/wiki
- Repository GitHub : https://github.com/dani-garcia/vaultwarden
- Forum communautaire : https://github.com/dani-garcia/vaultwarden/discussions
Applications clientes Bitwarden
Vaultwarden est compatible avec tous les clients officiels Bitwarden :
- Web : https://vault.domain.eu
- Bureau : Windows, macOS, Linux - https://bitwarden.com/download/
- Mobile : Android, iOS - Disponibles sur les stores
- Extensions navigateur : Chrome, Firefox, Safari, Edge, etc.
- CLI : Ligne de commande - https://bitwarden.com/help/cli/
Configuration des clients
Pour utiliser votre instance auto-hébergée :
- Ouvrez l'application cliente
- Avant de vous connecter, cliquez sur l'icône ⚙️ (paramètres)
- Dans "Serveur", entrez :
https://vault.domain.eu - Connectez-vous avec vos identifiants
Sécurité et bonnes pratiques
- OWASP Top 10 : https://owasp.org/www-project-top-ten/
- Mozilla SSL Configuration Generator : https://ssl-config.mozilla.org/
- Let's Encrypt documentation : https://letsencrypt.org/docs/
📝 20. Checklist finale
Avant de considérer l'installation comme terminée, vérifiez :
- DNS configuré et résolu correctement
- Certificat SSL valide et auto-renouvelable
- Apache configuré avec headers de sécurité
- Vaultwarden démarre sans erreur
- Accès HTTPS fonctionnel
- Interface admin accessible avec le bon mot de passe
- Compte utilisateur créé et fonctionnel
- Inscriptions publiques désactivées (
SIGNUPS_ALLOWED=false) - Token admin hashé avec Argon2
- Sauvegarde automatique configurée
- Fail2ban configuré (optionnel mais recommandé)
- Tests de sécurité effectués (SecurityHeaders, Mozilla Observatory)
- Documentation sauvegardée
- Mots de passe admin et maître sauvegardés en lieu sûr
🎯 21. Points d'attention importants
Mot de passe admin vs mot de passe maître
Ne confondez pas :
- Token admin : Pour accéder à /admin (interface d'administration du serveur)
- Mot de passe maître : Pour accéder à votre coffre-fort personnel
Fichier config.json
Le fichier /opt/vaultwarden/vw-data/config.json est généré automatiquement quand vous sauvegardez des paramètres via l'interface admin. Les valeurs dans ce fichier ont priorité sur les variables d'environnement.
Si vous modifiez le fichier docker-compose.yml ou .env et que les changements ne sont pas pris en compte, vérifiez si config.json existe et override vos paramètres.
Sauvegardes critiques
Ce qui doit être sauvegardé absolument :
- /opt/vaultwarden/vw-data/ : Toutes vos données
- /opt/vaultwarden/docker-compose.yml : Configuration Docker
- /opt/vaultwarden/.env : Variables d'environnement
- Votre mot de passe admin (pour accéder à /admin)
- Votre mot de passe maître (pour accéder à votre coffre)
HTTPS obligatoire
N'exposez jamais Vaultwarden sans HTTPS. Les mots de passe transitent en clair sur HTTP !
Mises à jour
- Testez toujours les mises à jour sur une instance de test avant de les appliquer en production
- Faites une sauvegarde avant toute mise à jour
- Lisez les notes de version (changelog) avant de mettre à jour
🎉 Conclusion
Félicitations ! Votre instance Vaultwarden est maintenant opérationnelle et sécurisée.
Vous disposez maintenant d'un gestionnaire de mots de passe professionnel, auto-hébergé, compatible avec tous les clients Bitwarden, et totalement sous votre contrôle.
Profitez de votre nouveau coffre-fort numérique ! 🔐
Document créé le : $(date +%Y-%m-%d)
Version : 1.0
Auteur : Guide d'installation Vaultwarden
Testé sur : Debian 12, Docker 24.x, Apache 2.4.x