Skip to content

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 crane et 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_TOKEN protè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 DOMAIN est en https://.
  • 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, /attachments et /events doivent 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/data contient 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.