Vaultwarden es una reimplementación no oficial del servidor de Bitwarden escrita en Rust: mismo protocolo, mismos clientes oficiales (apps, extensión de navegador, CLI), pero un binario único que consume una fracción de los recursos del servidor .NET oficial. Si ya te fías de guardar tus contraseñas en la nube de un tercero, autoalojar tu propio gestor con Vaultwarden te da el mismo cifrado de extremo a extremo sin depender de la infraestructura de nadie más.
Vaultwarden vs Bitwarden oficial
El proyecto lo mantiene dani-garcia y originalmente se llamó bitwarden_rs; se renombró a Vaultwarden para evitar confusión de marca con el Bitwarden oficial, pero sigue siendo compatible con la API del cliente sin ningún cambio en las apps.
La diferencia práctica más relevante para un homelab: Bitwarden gatea detrás de planes de pago funciones como organizaciones, autenticación en dos pasos o Bitwarden Send, mientras que Vaultwarden las desbloquea todas de forma gratuita al ser un servidor propio. A cambio, es un proyecto comunitario sin soporte comercial ni SLA — para uso personal o de un grupo pequeño es una diferencia razonable a asumir; para una empresa que necesita soporte contractual, el servidor oficial sigue siendo la opción a evaluar.
Instalación con Docker Compose
# docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
DOMAIN: 'https://vault.tudominio.com'
SIGNUPS_ALLOWED: 'true'
volumes:
- ./vw-data:/data
ports:
- '11001:80'
docker compose up -d
DOMAIN no es cosmético: Vaultwarden lo necesita para generar correctamente las URLs de los adjuntos y para que el cliente sepa que está hablando en HTTPS a través del proxy inverso. Si lo omites o lo dejas apuntando a http://, algunas funciones (como subir archivos adjuntos) fallan de forma poco intuitiva.
## Importante
Vaultwarden necesita HTTPS real de cara al cliente — los navegadores y las apps de Bitwarden rechazan sincronizar contra un origen sin TLS válido. Publica el contenedor detrás de un proxy inverso con certificado, como se explica en la guía de proxy inverso con Nginx, y usa Certbot y Let’s Encrypt para el certificado si no tienes ya uno.
Asegurar el panel de administración
Vaultwarden incluye un panel /admin para gestionar usuarios y organizaciones desde el navegador, protegido por un ADMIN_TOKEN. Desde las versiones recientes, en vez de guardar el token en texto plano, se genera un hash argon2id:
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
El comando pide la contraseña dos veces y devuelve una cadena PHC ($argon2id$...). Esa cadena, no la contraseña original, es lo que va en el compose — pero Docker Compose interpola cualquier $ como variable de entorno, así que en docker-compose.yml hay que duplicar cada $ de la cadena a $$:
environment:
ADMIN_TOKEN: '$$argon2id$$v=19$$m=...'
## Peligro
No guardes el
ADMIN_TOKENen texto plano ni lo subas a un repositorio Git, aunque sea privado — quien lo obtenga tiene control total sobre todas las cuentas del servidor. Usa siempre el hash argon2id, no la cadena de caracteres simple que aceptaban versiones antiguas.
Cierra el registro tras crear tu cuenta
SIGNUPS_ALLOWED: 'true' es necesario la primera vez, para poder crear tu propia cuenta desde el cliente. En cuanto la tengas creada, cámbialo a 'false' y reinicia el contenedor:
environment:
SIGNUPS_ALLOWED: 'false'
docker compose up -d
Dejar el registro abierto en un servidor expuesto a internet significa que cualquiera que encuentre la URL puede crearse una cuenta y usar tu instancia como su propio gestor de contraseñas.
Backups
Todo el estado de Vaultwarden vive en el volumen /data: la base de datos SQLite, los adjuntos y los iconos cacheados. Un backup consistente es tan simple como copiar ese directorio con el contenedor detenido, o usar sqlite3 para un volcado en caliente sin parar el servicio:
docker exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '/data/db-backup.sqlite3'"
Si ya tienes una estrategia de backups incrementales en el servidor, el mismo enfoque de backups con rsync y hardlinks funciona igual de bien apuntando al directorio vw-data. Dado que aquí guardas credenciales, para la copia fuera del servidor merece más la pena un remote cifrado de rclone que un rsync sin cifrar hacia otro disco.
Conectar los clientes de Bitwarden
Las apps oficiales de escritorio, móvil, la extensión de navegador y el CLI de Bitwarden funcionan contra Vaultwarden sin modificación: en la pantalla de inicio de sesión, antes de introducir el email, hay que cambiar el “servidor” (self-hosted) a la URL de tu instancia (https://vault.tudominio.com). A partir de ahí, el flujo de login, sincronización y autenticación en dos pasos es idéntico al de Bitwarden Cloud.
Siguiente paso
Con Vaultwarden funcionando, el resto del stack de identidad de tu homelab gana sentido: el mismo dominio protegido con HTTPS que usas aquí puede reutilizarse para otros servicios autoalojados, como el propio Gitea si ya gestionas tu propio Git. Revisa periódicamente el changelog de Vaultwarden antes de actualizar el contenedor — al ser un proyecto que sigue de cerca los cambios de protocolo de Bitwarden, alguna actualización mayor puede requerir migrar el formato de la base de datos.
## Nota
✍️ Transparencia: Este artículo ha sido creado con el apoyo de herramientas de inteligencia artificial. Toda la información técnica ha sido revisada y validada por el autor antes de su publicación.