Ir al contenido
  1. Posts/

Vaultwarden: gestor de contraseñas self-hosted (guía completa)

Llevo años usando gestores de contraseñas en la nube. LastPass, 1Password, Bitwarden. Todos funcionan bien, pero siempre me quedaba esa sensación de incomodidad: mis contraseñas más importantes están en servidores de otra persona. Sí, están cifradas. Sí, confío en el cifrado. Pero el control real nunca era mío.

Hace unos meses decidí montar mi propio gestor de contraseñas con Vaultwarden en mi servidor Unraid. Y no pienso volver atrás.

Por qué self-hostear tu gestor de contraseñas
#

La respuesta corta: porque puedes.

La respuesta larga tiene más matices. No es solo paranoia sobre privacidad. Es control total sobre tus datos. Es no depender de que una empresa decida triplicar el precio o cerrar el servicio. Es saber exactamente dónde están tus contraseñas y quién tiene acceso a ellas.

Yo accedo a mi Vaultwarden únicamente a través de Tailscale. No hay puertos abiertos a internet. No hay reverse proxy público. Cero superficie de ataque desde fuera de mi red privada. Si alguien quiere mis contraseñas, primero tiene que comprometer mi red Tailscale, y eso ya es otro nivel de complejidad.

Además, el coste es cero. Bueno, el coste del servidor que ya tenías corriendo. Vaultwarden usa recursos mínimos. En mi Unraid apenas consume 50MB de RAM. Comparado con los 40€/año de 1Password o los 10€/año de Bitwarden Premium, sale a cuenta rápido.

Vaultwarden vs Bitwarden: qué diferencia hay
#

Vaultwarden es una implementación no oficial del servidor de Bitwarden escrita en Rust. Es mucho más ligera que el servidor oficial de Bitwarden (que está en C# y necesita SQL Server, Redis y varios microservicios).

Con Vaultwarden tienes todas las funcionalidades premium de Bitwarden gratis: TOTP, archivos adjuntos, bóvedas compartidas, todo. El servidor oficial requiere licencia de pago para muchas de estas features.

Lo importante: los clientes son los mismos. Usas las apps oficiales de Bitwarden (navegador, móvil, desktop) y simplemente apuntas a tu servidor en lugar de a los de Bitwarden. La experiencia de usuario es idéntica.

Algunas personas tienen dudas sobre usar una implementación no oficial para algo tan crítico como contraseñas. Yo lo veo al revés: el código de Vaultwarden está en GitHub, puedes auditarlo. Es software libre. Y la comunidad es muy activa. He tenido mejor soporte en el Discord de Vaultwarden que con tickets de empresas comerciales.

Instalación: Docker Compose en Unraid
#

Yo corro Vaultwarden en Unraid usando Docker. Podría haberlo desplegado directamente desde Community Applications, pero prefiero docker-compose porque tengo más control sobre la configuración.

Aquí está mi docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      - DOMAIN=https://tu-servidor.tail12345.ts.net:8443
      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=true
      - SHOW_PASSWORD_HINT=false
      - ADMIN_TOKEN=${ADMIN_TOKEN}
      - SMTP_HOST=smtp.mailgun.org
      - [email protected]
      - SMTP_PORT=587
      - SMTP_SECURITY=starttls
      - [email protected]
      - SMTP_PASSWORD=${SMTP_PASSWORD}
    volumes:
      - /mnt/user/appdata/vaultwarden:/data
    ports:
      - 8222:80

Algunas notas sobre esta configuración:

DOMAIN: apunta a mi hostname de Tailscale con el puerto que uso para HTTPS. Esto es importante para que las invitaciones por email y los enlaces funcionen correctamente.

SIGNUPS_ALLOWED=false: nadie puede registrarse libremente en mi servidor. Solo yo puedo invitar usuarios desde el panel de admin. Fundamental para seguridad.

INVITATIONS_ALLOWED=true: puedo enviar invitaciones por email a mi familia. Sin esto, tendría que crear cuentas manualmente.

ADMIN_TOKEN: un hash argon2 que protege el panel de administración en /admin. Lo genero con este comando:

1
docker run --rm -it vaultwarden/server:latest /vaultwarden hash --preset owasp

Te pide una contraseña y te devuelve el hash. Ese hash va en la variable de entorno. No pongas la contraseña en texto plano ahí.

SMTP: configurado para enviar emails de invitación y recuperación de cuenta. Uso Mailgun porque es gratis hasta 100 emails/día y funciona sin problemas. Puedes usar cualquier SMTP que tengas.

El volumen /mnt/user/appdata/vaultwarden es donde se guardan todos los datos: base de datos SQLite, archivos adjuntos, iconos de sitios web. Esto es lo que tienes que respaldar.

Puerto 8222 porque en mi Unraid ya tengo otros servicios en puertos más comunes. Luego Tailscale Serve se encarga del proxy y el HTTPS.

HTTPS con Tailscale Serve
#

Aquí es donde la cosa se pone interesante. Muchas guías te dicen que montes Caddy o Traefik. Yo antes usaba Caddy. Pero desde que descubrí Tailscale Serve, todo es más simple.

Tailscale Serve te da HTTPS automático con certificados válidos sin tener que tocar Let’s Encrypt, sin configurar DNS, sin abrir puertos. Magia negra de Tailscale.

En mi servidor Unraid (que está en Tailscale con el hostname tu-servidor), ejecuto:

1
tailscale serve --bg https:8443 http://localhost:8222

Esto hace que https://tu-servidor.tail12345.ts.net:8443 sirva el contenido de http://localhost:8222 (donde corre Vaultwarden) con un certificado HTTPS válido automático.

El flag --bg lo deja corriendo en background y sobrevive a reinicios. Tailscale se encarga de renovar los certificados sin intervención.

La ventaja brutal de este enfoque: solo accesible dentro de mi red Tailscale. No hay forma de llegar desde internet público. Ni siquiera con VPN tradicional, porque Tailscale funciona con WireGuard punto a punto.

Si usas otro método (Caddy, Traefik, Nginx Proxy Manager), funciona igual de bien. Pero asegúrate de que no estás exponiendo el puerto a internet. Usa un dominio interno o configura firewall para que solo acepte conexiones locales.

Asegurando Vaultwarden
#

Tener HTTPS y signups deshabilitados es un buen comienzo, pero hay más cosas que hacer.

Panel de admin: el endpoint /admin es poderoso. Desde ahí puedes ver todos los usuarios, eliminar cuentas, enviar invitaciones, ver diagnósticos. Por eso uso ADMIN_TOKEN con un hash argon2 fuerte.

La primera vez que entras a https://tu-servidor/admin, te pide el token (la contraseña, no el hash). Luego guarda una cookie y no te vuelve a pedir hasta que expira o cierras sesión.

Guarda esa contraseña en otro gestor de contraseñas o en papel físico. Si la pierdes, tienes que regenerar el hash y reiniciar el contenedor. Molesto pero no catastrófico.

Backups: esto es crítico. Tu Vaultwarden tiene todas tus contraseñas. Si el disco falla y no tienes backup, estás jodido.

Yo hago backup de /mnt/user/appdata/vaultwarden/ cada noche con un script rsync a mi NAS Synology. También tengo un backup semanal que va a Backblaze B2 cifrado con restic.

El backup más importante es db.sqlite3 dentro de esa carpeta. Es la base de datos completa. Los subdirectorios attachments/ e icon_cache/ también son importantes si usas archivos adjuntos. El cache de iconos se puede regenerar, así que es menos crítico.

Actualizaciones: Vaultwarden se actualiza bastante seguido. Yo tengo Watchtower configurado para auto-actualizar contenedores, pero puedes hacerlo manual con:

1
2
docker-compose pull
docker-compose up -d

Antes de actualizar, haz un snapshot del directorio de datos. Nunca se sabe.

2FA en tu cuenta: activa autenticación de dos factores en tu cuenta de Vaultwarden. Usa una app TOTP (Aegis, Authy, Google Authenticator). Guarda los códigos de recuperación en un lugar seguro fuera de Vaultwarden.

Sí, es irónico guardar backups de tu gestor de contraseñas en papel. Pero es necesario. Si pierdes el acceso a tu 2FA y a tu Vaultwarden, necesitas una forma de recuperar.

Apps móviles y extensiones de navegador
#

Esto es lo mejor: usas las apps oficiales de Bitwarden. En iOS, Android, Chrome, Firefox, Edge, Safari, todas.

Cuando instalas la app, en lugar de iniciar sesión directamente, vas a ajustes y cambias la URL del servidor. Pones tu URL de Vaultwarden (https://tu-servidor.tail12345.ts.net:8443 en mi caso).

Luego inicias sesión con tu email y contraseña como lo harías normalmente.

La extensión de navegador funciona perfecta. Autorellena contraseñas, genera nuevas, guarda credenciales automáticamente. No hay diferencia funcional con usar Bitwarden oficial.

En móvil, asegúrate de tener Tailscale corriendo. Sin eso, no llegas a tu servidor. Yo tengo Tailscale siempre activo en el iPhone y funciona sin problemas. Consume batería mínima.

Un detalle: algunos móviles matan apps en background agresivamente. Si Tailscale se cierra, pierdes acceso a Vaultwarden. En iOS no es problema, pero en Android puede pasar. Añade Tailscale a las excepciones de optimización de batería.

Migración desde otros gestores
#

Yo venía de 1Password. El proceso fue más fácil de lo esperado.

Desde 1Password: exporta a CSV desde la app de escritorio. Luego en Vaultwarden, vas a Tools > Import Data, seleccionas “1Password (csv)” y subes el archivo. Done.

Desde LastPass: igual, exporta a CSV desde la bóveda web y luego importa en Vaultwarden.

Desde Bitwarden Cloud: lo más directo. Exporta desde Bitwarden a formato JSON y luego importa ese JSON en tu Vaultwarden. Conserva carpetas, notas, todo.

Después de importar, revisa que todo se haya traído correctamente. A veces los campos personalizados o los adjuntos necesitan ajuste manual.

Y lo más importante: no borres tu bóveda anterior hasta que hayas confirmado que Vaultwarden funciona perfecto durante al menos una semana. Murphy siempre acecha.

Estrategia de backups
#

Ya mencioné que hago backups nocturnos, pero voy a detallar más porque esto es importante.

Mi estrategia tiene tres capas:

Local (Unraid a NAS): cada noche a las 3 AM, un script rsync copia /mnt/user/appdata/vaultwarden/ al NAS Synology. Mantengo 7 días de backups rotativos. Es rápido y permite restaurar en segundos si algo se rompe.

Remoto (Backblaze B2): cada domingo, restic hace un snapshot cifrado y lo sube a B2. Mantengo 4 snapshots semanales y 6 mensuales. Esto me protege contra desastres físicos (incendio, robo, fallo masivo de hardware).

Export manual: una vez al mes, exporto toda la bóveda a JSON cifrado desde la web de Vaultwarden y guardo ese archivo en un USB que está en otro lugar físico. Paranoia, pero útil si todos los sistemas digitales fallan.

El script de backup nocturno es simple:

1
2
3
4
5
6
7
8
#!/bin/bash
SOURCE="/mnt/user/appdata/vaultwarden"
DEST="/mnt/remote/backups/vaultwarden"
DATE=$(date +%Y%m%d)

rsync -a --delete "$SOURCE/" "$DEST/latest/"
cp -al "$DEST/latest" "$DEST/$DATE"
find "$DEST" -maxdepth 1 -type d -name "20*" -mtime +7 -exec rm -rf {} \;

Esto mantiene un snapshot diario y borra los que tienen más de 7 días. La opción -al en cp hace hard links, así que no duplica archivos innecesariamente.

Para probar que tus backups funcionan, restaura uno en un entorno de test. Si nunca has restaurado un backup, no sabes si realmente tienes un backup.

Qué puede salir mal (y cómo arreglarlo)
#

He tenido algunos problemas en estos meses. Aquí están los más comunes:

No puedo acceder desde el móvil: 99% de las veces es porque Tailscale se desconectó. Abre la app de Tailscale, reconecta, y ya. A veces el móvil cambia de red (WiFi a 4G) y Tailscale tarda unos segundos en reconectar.

El panel de admin no acepta mi contraseña: probablemente pusiste el hash en lugar de la contraseña original. El hash va en la variable de entorno ADMIN_TOKEN. En el navegador introduces la contraseña en texto plano.

Las invitaciones por email no llegan: revisa la configuración SMTP. Ejecuta docker logs vaultwarden y busca errores de conexión. Si usas Gmail, necesitas una app password, no tu contraseña normal. Mailgun es más simple.

El contenedor no arranca después de actualizar: mira los logs. Normalmente es un problema de permisos en /data. Asegúrate de que el usuario del contenedor puede escribir ahí. En Unraid, esto no suele ser problema, pero en otros sistemas puede pasar.

Perdí mi contraseña maestra y el 2FA: aquí es donde los backups de códigos de recuperación salvan vidas. Si no los tienes, vas a tener que restaurar desde un backup de la base de datos o resetear todo. Por eso insisto tanto en los códigos de recuperación.

El certificado HTTPS me da error: si usas Tailscale Serve, no debería pasar. Si usas otro método, verifica que el certificado no haya expirado y que el dominio en DOMAIN coincida con el certificado. Let’s Encrypt a veces falla si los DNS no están bien configurados.

La sincronización entre dispositivos es lenta: Vaultwarden sincroniza cada vez que abres la app o cada pocos minutos en background. Si parece que no sincroniza, fuerza un refresh manual desde la app. También revisa que no tengas problemas de red en Tailscale.

Reflexiones finales
#

Llevo tres meses con Vaultwarden y no he mirado atrás. Saber que mis contraseñas están en mi hardware, en mi red, bajo mi control, me da una tranquilidad que ningún servicio en la nube me daba.

No es para todo el mundo. Si no tienes un servidor 24/7 o no te sientes cómodo con Docker y networking, usa Bitwarden Cloud o 1Password. Son buenas opciones. Pero si ya tienes un homelab y quieres dar el paso a self-hostear algo crítico, Vaultwarden es probablemente el mejor sitio para empezar.

Es estable, consume pocos recursos, tiene una comunidad activa, y la experiencia de usuario es idéntica a la versión comercial. No pierdes nada, ganas control.

Mi configuración con Tailscale es paranoia nivel medio-alto. Perfectamente puedes exponerlo detrás de un reverse proxy con Cloudflare, siempre que uses dominios aleatorios, geoblocking, rate limiting y todas las protecciones posibles. Pero si tienes la opción de no exponerlo a internet público, mejor no lo hagas.

El tiempo de configuración inicial es de una o dos horas. El mantenimiento es mínimo, básicamente actualizar el contenedor cada pocas semanas y verificar que los backups funcionan.

Si estás pensando en self-hostear tu gestor de contraseñas, hazlo. Vaultwarden es rock-solid y la sensación de control sobre tus datos más críticos no tiene precio.


Recursos útiles:

Si tienes dudas o quieres compartir tu setup, déjame un comentario.