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
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.