Skip to content

Installer Vaultwarden en conteneur LXC sur Proxmox (sans Docker)

Guide d'installation manuelle, étape par étape, de Vaultwarden (serveur compatible Bitwarden) en conteneur LXC Proxmox, sans installer Docker à l'intérieur : le binaire est extrait directement de l'image Docker Hub officielle via crane, un outil qui télécharge et extrait des images de registre sans avoir besoin d'un daemon Docker.

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.