Vaultwarden con Docker: gestor de contraseñas propio

Vaultwarden con Docker: gestor de contraseñas propio

Vaultwarden con Docker: gestor de contraseñas propio

Vaultwarden es la alternativa autohospedada a Bitwarden Cloud: mismos clientes, mismas extensiones, corriendo en tu propio servidor. Este tutorial cubre desde el docker-compose hasta los backups, pasando por el proxy inverso y la migración de contraseñas.

Por Javier · Actualizado: 2025-06-10

Vaultwarden es una implementación del servidor Bitwarden escrita en Rust, compatible con todos los clientes oficiales. Autohospedado en Docker, consume entre 10 y 20 MB de RAM frente a los 150-300 MB del servidor oficial, e incluye sin coste funciones de 2FA —TOTP, YubiKey— que en Bitwarden Cloud requieren suscripción de pago.

Para quien ya gestiona su propio servidor

Si tienes Proxmox, un NAS o cualquier máquina con Docker corriendo en casa, ya diste el paso más difícil. Tienes la infraestructura, sabes qué es un volumen, un puerto, una variable de entorno. Pero las contraseñas siguen viviendo en Bitwarden Cloud, en un servidor que no controlas, con una política de privacidad que no has leído y una dependencia de la que llevas tiempo queriendo salir.

Lo entiendo: mover las contraseñas da más respeto que mover cualquier otra cosa. Si la instancia cae, si el backup falla, si algo se desconfigura… el daño puede ser gordo. Esa duda es legítima y este post la tiene en cuenta. No te voy a decir que es fácil y sin riesgos; te voy a decir exactamente qué necesitas, qué puede salir mal y cómo dejarlo funcionando de forma sólida.

Al final de esta guía tendrás Vaultwarden corriendo en Docker con HTTPS, el panel de administración protegido y, si vienes de Bitwarden Cloud, tus datos ya importados. Sin suscripción, sin terceros, con el vault en tu disco.

Por qué importa

Ligero de verdad

10-20 MB de RAM en reposo. Corre sin problemas en una Raspberry Pi o un VPS pequeño.

HTTPS obligatorio

Los clientes Bitwarden exigen conexión segura. Necesitarás un proxy inverso con certificado antes de levantar el contenedor.

2FA sin coste extra

TOTP, YubiKey y Duo incluidos de serie, sin suscripción premium. En Bitwarden Cloud son funciones de pago.

Tú gestionas el backup

El vault vive en un volumen SQLite en tu servidor. La disponibilidad y los backups son responsabilidad tuya.

Lo que necesitas antes de empezar

Vaultwarden no necesita un servidor potente. Funciona perfectamente en una Raspberry Pi 4, un VPS de 1 GB o una VM ligera en Proxmox. Lo que sí necesita sin negociación es HTTPS: los clientes de Bitwarden —extensión del navegador, app móvil, app de escritorio— se niegan a conectar si el servidor no presenta un certificado SSL válido.

Antes de escribir una sola línea de configuración, asegúrate de tener:

  • Docker y Docker Compose instalados (Compose v2, el que se llama con docker compose, no el antiguo docker-compose)
  • Un dominio o subdominio apuntando a tu servidor (por ejemplo vault.tudominio.com)
  • Un proxy inverso ya funcionando con HTTPS —Caddy, Nginx Proxy Manager o Traefik son las opciones más habituales en homelab
  • Los puertos 80 y 443 accesibles desde internet si quieres acceso externo, o una VPN si prefieres que todo quede en red privada

En mi caso lo corro detrás de Caddy en un LXC de Proxmox. Caddy gestiona los certificados Let’s Encrypt automáticamente, sin pasos extra. Si ya tienes Nginx Proxy Manager montado, también es perfectamente válido y te cuento los dos.

Levantar Vaultwarden con Docker Compose

La imagen oficial es vaultwarden/server en Docker Hub. Crea un directorio para el proyecto y dentro un archivo docker-compose.yml con este contenido:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./vw-data:/data
    environment:
      DOMAIN: "https://vault.tudominio.com"
      SIGNUPS_ALLOWED: "false"
      ADMIN_TOKEN: "CAMBIA_ESTO_POR_EL_HASH_ARGON2"
    ports:
      - "127.0.0.1:8080:80"

Algunos puntos importantes de esta configuración:

  • ./vw-data:/data — aquí vive la base de datos SQLite y todos los adjuntos. Es lo único que necesitas hacer backup.
  • DOMAIN — URL completa con HTTPS. Vaultwarden la usa para generar enlaces internos correctos en emails y en la API.
  • SIGNUPS_ALLOWED: "false" — desactiva el registro público desde el primer momento. Puedes invitar usuarios desde el panel de admin una vez configurado.
  • 127.0.0.1:8080:80 — el contenedor solo escucha en localhost; el proxy inverso es el único que expone tráfico al exterior.

Levanta el contenedor con docker compose up -d y comprueba que arranca sin errores con docker compose logs -f vaultwarden. Deberías ver en los logs algo como Rocket has launched from http://0.0.0.0:80. Si ves ese mensaje, el servidor está corriendo y esperando que el proxy inverso le pase tráfico.

Proxy inverso y HTTPS

Sin HTTPS no hay nada que hacer: los navegadores modernos bloquean las extensiones de Bitwarden sobre HTTP plano. Aquí va la configuración mínima para los dos proxies más comunes en homelab.

Con Caddy

Si Caddy corre en el mismo host, añade esto a tu Caddyfile:

vault.tudominio.com {
    reverse_proxy 127.0.0.1:8080
}

Caddy solicita y renueva el certificado de Let’s Encrypt automáticamente. No hay nada más que configurar: recarga Caddy con systemctl reload caddy y ya debería responder en HTTPS.

Con Nginx Proxy Manager

Desde la interfaz gráfica de Nginx Proxy Manager, crea un nuevo Proxy Host con estos datos:

  • Domain Names: vault.tudominio.com
  • Forward Hostname / IP: IP del servidor donde corre el contenedor (o el nombre del contenedor si NPM está en la misma red Docker)
  • Forward Port: 8080
  • En la pestaña SSL: solicita certificado Let’s Encrypt y activa Force SSL

Una vez guardado, accede a https://vault.tudominio.com. Si ves la pantalla de login de Bitwarden, vas por buen camino.

Configurar el ADMIN_TOKEN de forma segura

El panel de administración de Vaultwarden vive en https://vault.tudominio.com/admin. Desde él puedes invitar usuarios, revisar logs de acceso, configurar SMTP y ajustar opciones avanzadas. Protegerlo bien importa.

Desde la versión 1.29.0 (enero 2024), el formato recomendado para ADMIN_TOKEN es un hash argon2 en lugar de texto plano. Un token en texto plano sigue funcionando, pero si alguien lee tu fichero de entorno o un backup de la configuración, lo tiene directamente. Con argon2, lo que almacenas es el hash, no el secreto.

Para generar el hash necesitas el binario argon2:

# En Debian/Ubuntu
sudo apt install argon2

# Genera el hash (sustituye la contraseña por la que quieras)
echo -n "tu-contraseña-segura" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4

El resultado es una cadena que empieza por $argon2id$v=19$.... Copia ese hash completo como valor de ADMIN_TOKEN en el docker-compose y reinicia el contenedor:

docker compose restart vaultwarden

Para entrar al panel de admin usas la contraseña original (no el hash). Vaultwarden verifica internamente la contraseña contra el hash almacenado. El flujo es igual que cualquier sistema de autenticación con contraseñas hasheadas.

Migrar desde Bitwarden Cloud

Si ya usas Bitwarden en la nube y quieres traer tus contraseñas al servidor propio, el proceso es más sencillo de lo que parece.

  1. En la app web de Bitwarden Cloud, ve a Herramientas → Exportar vault. Puedes elegir JSON sin cifrar o JSON cifrado con contraseña. El cifrado es más seguro durante el transporte, aunque añade un paso al importar.
  2. Crea tu cuenta en el Vaultwarden autohospedado. Para ello, activa temporalmente SIGNUPS_ALLOWED: "true" en el docker-compose, reinicia el contenedor, regístrate y vuelve a ponerlo en "false". También puedes invitarte desde el panel /admin.
  3. En la app web de tu Vaultwarden, ve a Herramientas → Importar datos, selecciona Bitwarden (JSON) y sube el archivo exportado.
  4. Verifica que todas las entradas están presentes antes de cerrar sesión en Bitwarden Cloud.

Importante: el export JSON no cifrado contiene todas tus contraseñas en texto plano. Bórralo del disco en cuanto termines la importación y no lo dejes reposar en el escritorio ni en una carpeta de descargas.

Backups y mantenimiento

Autohospedar significa que la disponibilidad y los backups son tu responsabilidad. No hay un equipo de operaciones detrás gestionando réplicas ni snapshots automáticos. Si pierdes el volumen ./vw-data, pierdes todas las contraseñas almacenadas.

Lo mínimo razonable para un uso real:

  • Backup diario de vw-data a un destino externo: otro disco, un NAS, o un bucket remoto vía rclone. SQLite permite copia en frío parando el contenedor y copiando db.sqlite3, o puedes usar el endpoint /admin/diagnostics para triggerar un backup online.
  • Actualizar el contenedor regularmente. docker compose pull && docker compose up -d es suficiente. Vaultwarden tiene un historial de actualizaciones activo; no lo dejes meses sin tocar.
  • Vigilar el certificado SSL. Si caduca y la renovación automática falla por cualquier motivo, la extensión del navegador deja de conectar sin un mensaje de error especialmente claro.

En mi setup tengo un script que para el contenedor, copia el directorio de datos a mi NAS vía rsync y vuelve a levantarlo. Lo ejecuta cron cada noche. Nada elegante, pero lo he probado restaurando desde cero y funciona.

Una última cosa que merece mención aparte: si activas el 2FA en tu cuenta —TOTP, YubiKey o Duo, todos disponibles sin coste adicional en Vaultwarden—, guarda los códigos de recuperación en un lugar físico o en una segunda cuenta de confianza. Perder acceso al segundo factor en tu gestor de contraseñas autohospedado no tiene un soporte técnico al que llamar.

Preguntas frecuentes

Q: ¿Vale Vaultwarden para guardar contraseñas del trabajo sin pagar suscripción?

A: Vaultwarden es compatible con todos los clientes oficiales de Bitwarden y no tiene coste de suscripción, pero la infraestructura corre por tu cuenta. Si tu servidor doméstico tiene buena disponibilidad y mantienes backups regulares, puede sustituir perfectamente al plan de pago de Bitwarden Cloud para uso personal o de equipo pequeño.

Q: ¿Cuánta RAM necesita en un servidor casero ya saturado?

A: Vaultwarden consume entre 10 y 20 MB de RAM en reposo, frente a los 150-300 MB del servidor oficial de Bitwarden. Cabe sin problemas en una Raspberry Pi o en un VPS de gama baja junto con otros servicios.

Q: ¿Qué pasa si no configuro HTTPS y lo dejo en HTTP?

A: Los clientes de Bitwarden, incluidas las extensiones de navegador, exigen conexión segura y simplemente no funcionarán sobre HTTP plano. Necesitas un proxy inverso (Nginx, Caddy, Traefik) con certificado válido, ya sea de Let's Encrypt o un certificado propio si usas dominio interno.

Q: ¿Cómo migro mis contraseñas desde Bitwarden Cloud sin perder nada?

A: Desde la web de Bitwarden Cloud exportas el vault en formato JSON cifrado o sin cifrar, y luego lo importas directamente en tu instancia de Vaultwarden desde el mismo cliente. El proceso es directo; carpetas, colecciones y notas seguras se conservan tal cual.

Q: ¿Por qué el ADMIN_TOKEN ahora se genera con argon2 y cómo afecta a versiones antiguas?

A: Desde Vaultwarden 1.29.0 (enero 2024), el panel de administración requiere que el token esté hasheado con argon2 en lugar de un texto en claro, lo que evita que la contraseña quede expuesta en la variable de entorno. Si tienes una instalación anterior con token en texto plano, sigue funcionando pero recibirás aviso de deprecación; conviene migrar generando el hash con 'echo -n tupassword | argon2 salt -e' o la herramienta que recomienda la documentación oficial.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *