Installer Vaultwarden en conteneur LXC sur Proxmox (sans Docker)¶
Héberger son propre coffre-fort de mots de passe, c'est reprendre la main sur ce qu'on a de plus sensible. Vaultwarden — la réécriture légère du serveur Bitwarden — le permet, et cette page pousse l'élégance un cran plus loin : installer Vaultwarden sans installer Docker dans le conteneur. Le binaire est extrait directement de l'image officielle via crane, qui sait télécharger et déballer une image de registre sans daemon Docker. Résultat : un conteneur LXC minimal, un seul process à surveiller, zéro couche superflue.
Le variant -alpine de l'image est utilisé car il est statiquement lié — aucune contrainte de version glibc, compatible avec n'importe quelle version de Debian.
Pour une installation via Docker Compose classique, voir Vaultwarden (Docker).
Prérequis¶
- Un hôte Proxmox VE avec accès
pct - Accès internet depuis l'hôte (téléchargement de
craneet de l'image Docker Hub) - Un pool de stockage
local-lvm
Valeurs d'exemple utilisées dans ce guide :
| Paramètre | Valeur d'exemple |
|---|---|
| ID du conteneur | 203 |
| IP fixe | 192.168.1.203/24 |
| Port interne | 8080 |
| Port externe (NAT) | 9080 |
| Image source | vaultwarden/server:1.36.0-alpine |
1⃣ Extraction du binaire depuis Docker Hub (sur l'hôte Proxmox)¶
Installer crane sur l'hôte (une seule fois) :
curl -sL https://github.com/google/go-containerregistry/releases/latest/download/go-containerregistry_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin crane
chmod +x /usr/local/bin/crane
Extraire le binaire vaultwarden et le dossier web-vault de l'image officielle :
mkdir -p /tmp/vw-extract
crane export vaultwarden/server:1.36.0-alpine - | tar -xf - -C /tmp/vw-extract vaultwarden web-vault
Vous obtenez /tmp/vw-extract/vaultwarden (le binaire) et /tmp/vw-extract/web-vault/ (l'interface web statique).
2⃣ Création du conteneur LXC¶
pveam update
pveam available | grep debian-12-standard
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
pct create 203 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
--hostname vaultwarden.votre-domaine.tld \
--memory 512 \
--swap 256 \
--cores 1 \
--rootfs local-lvm:8 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.203/24,gw=192.168.1.1 \
--unprivileged 1 \
--onboot 1
pct start 203
3⃣ Installation des paquets et déploiement du binaire¶
pct exec 203 -- apt-get update
pct exec 203 -- apt-get install -y --no-install-recommends curl ca-certificates openssl
pct exec 203 -- bash -c "
useradd -r -s /bin/false -d /srv/vaultwarden vaultwarden &&
mkdir -p /srv/vaultwarden/data /usr/share/vaultwarden &&
chown -R vaultwarden:vaultwarden /srv/vaultwarden &&
touch /var/log/vaultwarden.log &&
chown vaultwarden:vaultwarden /var/log/vaultwarden.log
"
pct push 203 /tmp/vw-extract/vaultwarden /usr/local/bin/vaultwarden
pct exec 203 -- chmod +x /usr/local/bin/vaultwarden
tar -czf /tmp/web-vault.tar.gz -C /tmp/vw-extract web-vault
pct push 203 /tmp/web-vault.tar.gz /tmp/web-vault.tar.gz
pct exec 203 -- bash -c "tar -xzf /tmp/web-vault.tar.gz -C /usr/share/vaultwarden && rm /tmp/web-vault.tar.gz"
rm -rf /tmp/vw-extract /tmp/web-vault.tar.gz
4⃣ Fichier d'environnement¶
Générer un token d'administration avant de continuer :
openssl rand -base64 48
Créer /etc/vaultwarden.env dans le conteneur :
pct exec 203 -- bash -c "cat > /etc/vaultwarden.env" << 'EOF'
ROCKET_ADDRESS=0.0.0.0
ROCKET_PORT=8080
DATA_FOLDER=/srv/vaultwarden/data
WEB_VAULT_FOLDER=/usr/share/vaultwarden/web-vault
WEB_VAULT_ENABLED=true
WEBSOCKET_ENABLED=true
SIGNUPS_ALLOWED=false
LOG_LEVEL=warn
DOMAIN=https://vaultwarden.votre-domaine.tld
ADMIN_TOKEN=<TOKEN_GÉNÉRÉ_CI-DESSUS>
EOF
pct exec 203 -- chmod 600 /etc/vaultwarden.env
SIGNUPS_ALLOWED=false est recommandé en production : créer les comptes via /admin plutôt que d'ouvrir les inscriptions publiques.
5⃣ Service systemd¶
pct exec 203 -- bash -c "cat > /etc/systemd/system/vaultwarden.service" << 'EOF'
[Unit]
Description=Vaultwarden Password Manager
After=network.target
[Service]
User=vaultwarden
Group=vaultwarden
EnvironmentFile=/etc/vaultwarden.env
ExecStart=/usr/local/bin/vaultwarden
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
pct exec 203 -- systemctl daemon-reload
pct exec 203 -- systemctl enable --now vaultwarden
6⃣ Redirection du port externe (NAT)¶
CT_IP=192.168.1.203
iptables -t nat -A PREROUTING -p tcp --dport 9080 -j DNAT --to-destination $CT_IP:8080
iptables -I FORWARD -p tcp -d $CT_IP --dport 8080 -j ACCEPT
iptables-save > /etc/iptables.rules
⚙️ Points d'administration importants¶
ADMIN_TOKENprotège l'interface/admin(gestion des utilisateurs, diagnostics, configuration à chaud) : à traiter comme un secret de premier niveau, ne jamais le laisser vide en production.- Placer le service derrière TLS (reverse proxy type Caddy) avant toute utilisation réelle — les clients Bitwarden (extension navigateur, application mobile) refusent de se connecter en HTTP non chiffré dès que
DOMAINest enhttps://. - Cas particulier des clients natifs : si vous mettez Vaultwarden derrière une authentification supplémentaire (SSO en forward auth, par ex. Authentik), les routes
/api,/identity,/notifications,/icons,/attachmentset/eventsdoivent rester accessibles directement, sans cette authentification supplémentaire — sinon la synchronisation des clients natifs casse (ils n'utilisent pas de flux de connexion par navigateur). - Sauvegarde et restauration : le dossier
/srv/vaultwarden/datacontient toute la base — par défaut une base SQLite (db.sqlite3) — ainsi que les pièces jointes. Une sauvegarde régulière de ce seul dossier permet une restauration complète : arrêter le service (systemctl stop vaultwarden), remplacer le contenu du dossier par la sauvegarde, remettre les permissions (chown -R vaultwarden:vaultwarden), puis redémarrer. - Mise à jour : il faut réextraire le binaire et le web-vault depuis une nouvelle version de l'image Docker Hub (reprendre l'étape 1 avec un tag plus récent), puis remplacer les fichiers et redémarrer le service. Toujours lire le changelog Vaultwarden avant une montée de version majeure.
- Logs :
pct exec 203 -- journalctl -u vaultwarden -f.
Conclusion¶
Extraire le binaire via crane plutôt que d'installer Docker dans le LXC donne un conteneur plus léger, avec un seul process à superviser, au prix de devoir réextraire manuellement le binaire à chaque montée de version.