Vaultwarden en Proxmox LXC: gestor de contraseñas autoalojado y sin filtraciones (2026)
LastPass tuvo su filtración. 1Password subió a $4 al mes por cada miembro de la familia. Bitwarden es excelente, pero sigues confiando en el servidor de otra persona. La solución es Vaultwarden: un servidor compatible con Bitwarden, reescrito en Rust, que corre en un contenedor LXC de Proxmox, usa menos de 100 MB de RAM y mantiene cada credencial en hardware que es tuyo. Esta guía te lleva por la instalación completa: creación del LXC, despliegue con Docker Compose, HTTPS con un proxy inverso, seguridad del panel de administración y una estrategia de respaldos que no te va a fallar. Los comandos están escritos para Proxmox VE 9.
Requisitos previos
Antes de empezar, asegúrate de tener lo siguiente:
- Proxmox VE 8.x o 9.x: los comandos de esta guía son para PVE 9. Si sigues en 7.x, actualiza primero; los cambios de cgroup v2 afectan la red de los LXC.
- Una plantilla LXC de Debian 12 descargada en Proxmox (Storage → debian-12-standard).
- Un dominio apuntando a tu servidor (o un Cloudflare Tunnel). Vaultwarden requiere HTTPS: los navegadores no cargan la bóveda web por HTTP plano y las apps móviles no sincronizan sin un certificado TLS válido.
- Nginx Proxy Manager o Traefik ya funcionando: esta guía muestra la integración con NPM. Si prefieres Traefik, revisa la guía de Traefik en Proxmox LXC.
- RAM: 512 MB mínimo, 1 GB recomendado para Vaultwarden más la sobrecarga de Docker. Técnicamente funciona con 256 MB, pero con carga vas a terminar usando swap.
- Almacenamiento: 4 GB mínimo para la raíz del contenedor. La base de datos de tu bóveda será diminuta (menos de 50 MB para la mayoría), pero las imágenes de Docker necesitan espacio.
Nota sobre hardware: Vaultwarden es ridículamente liviano: cualquier máquina que pueda correr Proxmox puede correrlo. Si estás armando tu primer nodo de homelab, el Beelink EQ12 ($169) tiene capacidad para un stack de 8 LXC con 16 GB de RAM y, según el fabricante, consume menos de 15 W en reposo. ¿Necesitas algo que también maneje la transcodificación de Jellyfin o el machine learning de Immich? Sube al Beelink SER7 con su Ryzen 7 7840HS.
Paso 1: crea el contenedor LXC
Entra a la interfaz web de Proxmox y haz clic en Create CT. Usa esta configuración:
| Campo | Valor |
|---|---|
| Hostname | vaultwarden |
| Plantilla | debian-12-standard |
| Unprivileged | ✓ (marcado) |
| Disco raíz | 8 GB en almacenamiento rápido |
| Núcleos de CPU | 1 (2 si te sobra capacidad) |
| RAM | 512 MB |
| Red | bridge vmbr0, DHCP o IP estática |
| DNS | Deja el valor por defecto del host |
Asígnale al contenedor una IP fija desde tu servidor DHCP o configúrala a mano en la pestaña de red: necesitas una dirección estable para que el proxy inverso apunte a ella. En esta guía uso 192.168.1.50.
Después de crearlo, abre las opciones del LXC y verifica que Nesting esté activado en Features: Docker lo necesita para funcionar dentro de un LXC. Si no está, agrégalo:
# From the Proxmox host shell
pct set 100 --features nesting=1
Reemplaza 100 con el ID de tu contenedor. Inicia el contenedor:
pct start 100
pct enter 100
Primero actualiza el sistema base:
apt update && apt upgrade -y
apt install -y curl ca-certificates gnupg2
Paso 2: instala Docker dentro del LXC
La distribución oficial de Vaultwarden es una imagen de Docker. Instalar Docker en un LXC con Debian 12 es sencillo usando el repositorio oficial:
# Add Docker's GPG key
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Add Docker repo
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine + Compose plugin
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Enable and start Docker
systemctl enable --now docker
Verifica que funcione:
docker run --rm hello-world
Deberías ver "Hello from Docker!". Si te sale un error de cgroups, revisa que nesting esté activado en el LXC y reinicia el contenedor.
Paso 3: despliega Vaultwarden con Docker Compose
Crea una carpeta dedicada para el stack:
mkdir -p /opt/vaultwarden/data
cd /opt/vaultwarden
Crea el archivo de Compose:
cat > /opt/vaultwarden/docker-compose.yml << 'EOF'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.yourdomain.com"
SIGNUPS_ALLOWED: "false"
ADMIN_TOKEN: ""
WEBSOCKET_ENABLED: "true"
LOG_LEVEL: "warn"
volumes:
- ./data:/data
ports:
- "3011:80"
- "3012:3012"
EOF
Dos cosas que configurar antes de arrancar:
1. Define tu dominio. Reemplaza vault.yourdomain.com con el subdominio real que vas a usar. Se incluye en los tokens JWT: si lo pones mal, los clientes no van a poder autenticarse.
2. Genera un ADMIN_TOKEN. Protege el panel /admin. Genera un hash bcrypt (Vaultwarden exige tokens con hash desde la v1.28):
# Install argon2 or use openssl to generate a random secret first
apt install -y argon2
# Generate a secure random password (save this — it's your admin password)
ADMIN_PASS=$(openssl rand -base64 48)
echo "Your admin password: $ADMIN_PASS"
# Hash it with argon2
echo -n "$ADMIN_PASS" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4
Copia el texto $argon2id$... resultante y pégalo como valor de ADMIN_TOKEN en tu archivo compose. Guarda tu contraseña de administrador en un lugar seguro; por ahora sirve un archivo de texto en tu carpeta personal, porque la vas a guardar en Vaultwarden en cuanto esté funcionando.
Arranca el stack:
cd /opt/vaultwarden
docker compose up -d
docker compose logs -f
Deberías ver que Vaultwarden anuncia que está escuchando en el puerto 80. Presiona Ctrl+C para salir del log. La bóveda web ya está disponible en http://192.168.1.50:3011, pero no puedes usarla por HTTP, así que pasa al paso del proxy inverso.
Paso 4: HTTPS con Nginx Proxy Manager
Si ya tienes NPM funcionando (o revisa la guía de Traefik si prefieres esa opción), entra a su interfaz web y agrega un nuevo Proxy Host:
- Domain Names:
vault.yourdomain.com - Forward Hostname / IP:
192.168.1.50 - Forward Port:
3011 - Websockets Support: ✓ activado (necesario para la sincronización en tiempo real)
- Block Common Exploits: ✓ activado
En la pestaña SSL, solicita un certificado de Let's Encrypt y activa Force SSL y HTTP/2 Support. Guarda. En unos 30 segundos tendrás un certificado TLS válido.
Agrega también una segunda ubicación para el endpoint de WebSocket. En la pestaña Advanced de NPM, agrega:
location /notifications/hub {
proxy_pass http://192.168.1.50:3012;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /notifications/hub/negotiate {
proxy_pass http://192.168.1.50:3011;
}
Esto enruta el tráfico WebSocket para la sincronización en tiempo real de la bóveda. Sin esto, los clientes consultan cada cierto tiempo en lugar de recibir los cambios al instante: funciona, pero no es lo ideal.
Entra a https://vault.yourdomain.com: deberías ver la pantalla de inicio de sesión de Vaultwarden con el candado de HTTPS válido.
Paso 5: configuración y panel de administración
Antes de crear cuentas, entra a https://vault.yourdomain.com/admin e inicia sesión con tu contraseña de administrador. Revisa estas opciones:
Configuración general:
- Vuelve a poner tu dominio real aquí (debería venir precargado).
- Configura Invitation expiration con un valor razonable (72 horas) si vas a invitar a familiares.
- Activa Emergency Access si quieres que un contacto de confianza pueda pedir acceso a la bóveda después de un período de espera.
Correo (SMTP): Vaultwarden envía correos para los códigos de autenticación en dos pasos y el acceso de emergencia. Configura SMTP con tu proveedor: las contraseñas de aplicación de Gmail funcionan, o puedes usar un servicio transaccional como Mailgun. Sin correo configurado no puedes usar los métodos de 2FA que dependen del email.
Ejemplo de SMTP para Gmail:
SMTP Host: smtp.gmail.com
SMTP Port: 587
SMTP Security: STARTTLS
SMTP Username: your@gmail.com
SMTP Password: [App Password — not your Gmail password]
SMTP From: your@gmail.com
Guarda y usa el botón Test SMTP. Corrige cualquier problema antes de seguir: te vas a arrepentir de no tener correo el día que necesites restablecer el 2FA.
Crea tu primera cuenta: ve a la bóveda web normal (https://vault.yourdomain.com), haz clic en Create Account y regístrate con tu correo. Después vuelve al panel de administración y de inmediato define SIGNUPS_ALLOWED: "false" en tu archivo compose y reinicia el contenedor:
cd /opt/vaultwarden
docker compose restart
Abre los registros solo cuando necesites agregar a un familiar o colega. Dejar el registro abierto expone tu servidor a cualquiera que encuentre la URL.
Paso 6: conecta tus dispositivos
Todos los clientes oficiales de Bitwarden funcionan con Vaultwarden: son totalmente compatibles a nivel de API. Lo único que cambia es que el cliente apunta a tu servidor en lugar de la nube de Bitwarden.
Escritorio (Windows/macOS/Linux): descarga la app oficial de Bitwarden para escritorio. En la pantalla de inicio de sesión, haz clic en el engranaje → Self-hosted environment → escribe https://vault.yourdomain.com. Inicia sesión normalmente.
Móvil (iOS/Android): el mismo flujo: toca el engranaje en la pantalla de inicio de sesión antes de escribir tus credenciales. La app verifica el certificado TLS de tu servidor antes de conectarse.
Extensiones del navegador: disponibles para Chrome, Firefox, Edge y Safari. Haz clic en el engranaje de la pantalla de inicio de sesión de la extensión → Self-hosted environment. Las extensiones autocompletan credenciales y generan códigos 2FA sin salir del navegador.
Activa el 2FA en tu cuenta: en la bóveda web, ve a Account Settings → Security → Two-step Login. Activa una app de autenticación (Aegis en Android es excelente; Raivo en iOS). Escanea el código QR, verifica un código de prueba y guarda tu código de recuperación en un lugar físicamente seguro: imprimirlo y guardarlo en una caja fuerte no es exagerado tratándose de un gestor de contraseñas.
Después de instalar: respaldos y actualizaciones
Vaultwarden guarda todo en una base de datos SQLite en /opt/vaultwarden/data/db.sqlite3. Ese archivo es toda tu bóveda. Perderlo significa perder todas tus contraseñas.
Estrategia de respaldo en tres capas:
Capa 1, snapshots de Proxmox Backup Server: configura PBS para hacer un snapshot del LXC completo cada noche. Así tienes recuperación a un punto en el tiempo de todo el contenedor. Si todavía no tienes un nodo de respaldo dedicado, sirve un disco conectado por USB. Para confiabilidad a largo plazo, un disco NAS Seagate IronWolf de 4 TB montado como datastore de PBS te da años de retención. Más sobre la arquitectura de almacenamiento: MinIO en Proxmox.
Capa 2, copia del archivo SQLite a tu MinIO o a una ubicación remota: agrega este script a cron:
cat > /opt/vaultwarden/backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/opt/vaultwarden/backups"
DB_FILE="/opt/vaultwarden/data/db.sqlite3"
mkdir -p "$BACKUP_DIR"
# SQLite safe backup using the .backup command
sqlite3 "$DB_FILE" ".backup $BACKUP_DIR/vault-$DATE.sqlite3"
# Compress it
gzip "$BACKUP_DIR/vault-$DATE.sqlite3"
# Keep only the last 30 days
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete
echo "Backup complete: vault-$DATE.sqlite3.gz"
EOF
chmod +x /opt/vaultwarden/backup.sh
# Add to cron — runs at 2 AM daily
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/vaultwarden/backup.sh >> /var/log/vaultwarden-backup.log 2>&1") | crontab -
Capa 3, exportación cifrada de Bitwarden: de vez en cuando exporta tu bóveda desde la interfaz web (Tools → Export Vault) como JSON cifrado. Guárdalo en una memoria USB o en la nube. Si tu nodo de Proxmox se quema por completo, puedes restaurar desde ahí en cualquier servidor compatible con Bitwarden.
Actualizaciones: Vaultwarden publica versiones con frecuencia. Actualiza con:
cd /opt/vaultwarden
docker compose pull
docker compose up -d
Revisa la página de versiones de Vaultwarden antes de actualizar: los cambios incompatibles son raros, pero están documentados. Descargar latest suele ser seguro, aunque fijar una versión en tu archivo compose te da más control.
Proxy inverso con Traefik: si usas el setup de la guía de Traefik, puedes agregar Vaultwarden como servicio enrutado por etiquetas de Docker en lugar de NPM. El proceso es parecido pero usa la configuración YAML o por etiquetas de Traefik; vale la pena si manejas más de 10 servicios.
Hardware para un nodo de homelab con más capacidad: si vas a crecer más allá de un solo servicio, el Beelink SER7 maneja una docena de contenedores LXC con holgura. Combínalo con un NVMe Crucial P3 Plus de 1 TB para la raíz de Proxmox y un SSD SATA Samsung 870 EVO de 1 TB como datastore secundario para las raíces de los LXC. El Beelink EQ12 es la opción económica si tu stack completo es Vaultwarden más 3 o 4 servicios livianos.
En cuanto a red, un switch administrable TP-Link TL-SG108E de 8 puertos te permite aislar con VLANs el tráfico del homelab, para que Vaultwarden viva en un segmento separado de tus dispositivos IoT: buena higiene de seguridad cuando corres un gestor de contraseñas.
Checklist de seguridad
Un gestor de contraseñas es un objetivo valioso. La instalación por defecto de Vaultwarden funciona, pero no está endurecida: revisa esta lista antes de conectar tus dispositivos.
Limita los intentos de inicio de sesión. Vaultwarden trae limitación integrada, pero agregar fail2ban delante del proxy inverso suma otra capa. Instala fail2ban en el contenedor de NPM o en el host de Proxmox y agrega un filtro que vigile las respuestas 401 de tu subdominio. Cinco intentos fallidos en diez minutos deberían bloquear esa IP por 10 minutos.
# fail2ban filter for Vaultwarden (save as /etc/fail2ban/filter.d/vaultwarden.conf)
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\..*$
^.*FAILED login attempt for .* from IP <ADDR>\..*$
ignoreregex =
# jail definition (/etc/fail2ban/jail.d/vaultwarden.local)
[vaultwarden]
enabled = true
port = http,https
filter = vaultwarden
logpath = /opt/vaultwarden/data/vaultwarden.log
maxretry = 5
bantime = 600
findtime = 600
Mantén el panel de administración fuera de internet. El endpoint /admin está protegido por el ADMIN_TOKEN, pero ¿para qué dejarlo expuesto? Agrega una lista de IPs permitidas en la configuración avanzada de NPM:
location /admin {
allow 192.168.1.0/24;
deny all;
proxy_pass http://192.168.1.50:3011;
}
Ahora el panel solo es accesible desde tu red local. Accede de forma remota con Tailscale o Headscale cuando lo necesites.
Desactiva las invitaciones si no las usas. Si eres el único usuario de la bóveda, desactiva también INVITATIONS_ALLOWED en tus variables de entorno:
INVITATIONS_ALLOWED: "false"
EMERGENCY_ACCESS_ALLOWED: "true" # keep this for account recovery
Activa 2FA con Duo o YubiKey en las cuentas de administrador. Vaultwarden soporta TOTP, Duo, OTP por correo, FIDO2/Passkeys y YubiKey. TOTP con Aegis (Android) o Raivo (iOS) es lo mínimo. Si tienes una YubiKey 5 NFC, agregar 2FA por hardware es la opción más fuerte: exige la llave física aunque tu contraseña maestra se vea comprometida.
Pon firewall directamente al LXC. La pestaña Firewall de cada LXC en Proxmox te deja agregar reglas a nivel de hipervisor. Permite solo los puertos 3011 y 3012 de entrada desde la IP del contenedor de NPM y bloquea todo lo demás. Así limitas el daño si otro equipo de la misma red se ve comprometido.
Evaluación honesta: cuándo NO autoalojar tu gestor de contraseñas
Vaultwarden es muy sólido, pero en la gestión de contraseñas es donde los trade-offs honestos importan de verdad.
Autoaloja Vaultwarden si: tienes un homelab confiable con UPS y varias capas de respaldo. Te sientes cómodo manteniendo un servidor y actualizándolo. Entiendes que tus contraseñas ahora son tan seguras como la seguridad física y de red de tu nodo de Proxmox.
No lo autoalojes si: tu homelab corre en una máquina sin UPS y la luz se va con frecuencia. No tienes un procedimiento de restauración probado para tu bóveda. Compartes la bóveda con familiares que no toleran caídas: una falla de hardware a las 2 de la mañana significa que nadie puede entrar a nada hasta que lo arregles. No estás seguro de que vas a estar al día con las actualizaciones de seguridad. Vaultwarden ha tenido parches de seguridad; ir semanas atrasado en un gestor de contraseñas es un riesgo real.
El punto medio honesto: muchos usuarios usan Vaultwarden autoalojado como bóveda principal, pero mantienen una cuenta de pago en la nube de Bitwarden como respaldo con una exportación de solo lectura. Así tienes control total y un plan B si tu homelab se apaga por un tiempo largo.
Si prefieres una opción administrada en la nube con un plan gratuito generoso y un servidor open source que podrías autoalojar después, la nube oficial de Bitwarden cuesta $0 al año para uso personal y la empresa pasa auditorías de seguridad de terceros. Es una opción respetable.
Preguntas frecuentes
¿Puedo migrar de 1Password o LastPass a Vaultwarden?
Sí. Ambas apps pueden exportar un CSV o JSON que luego importas en la bóveda web de Bitwarden (Tools → Import Data). Elige el formato de origen, sube el archivo y toda tu bóveda se importa en segundos. El formato .1pux de 1Password es el más limpio: úsalo en lugar de CSV si puedes.
¿Vaultwarden es realmente seguro? No es oficial.
Vaultwarden no implementa criptografía: es un servidor que maneja bloques cifrados. El cifrado real (AES-256-CBC con derivación de claves PBKDF2 o Argon2id) ocurre en los clientes oficiales de Bitwarden, que son open source y auditados. Tu bóveda se cifra con tu contraseña maestra antes de salir de tu dispositivo. El servidor, incluido Vaultwarden, solo ve texto cifrado. El proyecto existe desde 2018, tiene más de 45 mil estrellas en GitHub y un proceso activo de respuesta a vulnerabilidades. Es tan seguro como tu infraestructura y tu contraseña maestra.
¿Las extensiones de navegador de Bitwarden funcionan con Vaultwarden?
Sí, por completo. Todos los clientes oficiales de Bitwarden (extensiones para Chrome/Firefox/Edge/Safari, apps de escritorio para Windows/macOS/Linux y apps móviles para iOS y Android) funcionan con Vaultwarden sin modificaciones. Solo tienes que apuntarlos a la URL de tu servidor en la pantalla de inicio de sesión.
¿Cuánta RAM usa realmente Vaultwarden?
El proceso de Vaultwarden usa entre 10 y 30 MB de RSS. La sobrecarga de containerd de Docker suma otros 50 MB. En la práctica: 80-100 MB para todo el stack en un contenedor sin otros servicios. Por eso un LXC de 512 MB es más que suficiente. Si estás muy limitado, puedes correrlo con 256 MB y funciona, pero casi sin margen.
¿Qué diferencia hay entre Vaultwarden y el servidor autoalojado oficial de Bitwarden?
El paquete oficial de Bitwarden corre sobre .NET Core y requiere un stack con varios servicios, SQL Server o PostgreSQL y unos 2 GB de RAM como mínimo. Está pensado para organizaciones. Vaultwarden es una reimplementación en Rust de la misma API, en un solo binario, con SQLite por defecto y corre en 100 MB. Para uso personal y familiar, Vaultwarden es la opción clara. El servidor oficial agrega cosas como sincronización de directorio y políticas para empresas; la mayoría de los homelabbers no necesita nada de eso.
¿Puedo exponer Vaultwarden a internet?
Sí, y lo necesitas para la sincronización móvil, salvo que estés todo el tiempo en Tailscale/Headscale. Usa un dominio con TLS de Let's Encrypt, fail2ban o CrowdSec para limitar los intentos de inicio de sesión y activa el 2FA en todas las cuentas. Si no te sientes cómodo exponiéndolo, enrútalo con un Cloudflare Tunnel: no necesitas abrir puertos de entrada.
¿Quieres algo así para tu negocio?
Instalo infraestructura privada y autoalojada en Proxmox: IA, automatización y herramientas internas en hardware que es tuyo, documentado y entregado. Ver el stack de IA privada →
¿No sabes qué necesitas? Agenda una llamada gratis.