
O Vaultwarden es un servidor compatible con los clientes oficiales de Bitwarden, escrito en Rust. Cabe en una Raspberry Pi, consume muy poca memoria y ofrece en el autoalojamiento funciones que en Bitwarden oficial requieren plan de pago, como el autenticador TOTP integrado y el acceso de emergencia. No es Bitwarden Inc.: es el proyecto de la comunidad (antesbitwarden_rs), bajo licencia AGPL-3.0, actualmente en la 1.37.3.
Si ya tienes un Linux en Internet y no quieres enviar la caja fuerte a la nube de nadie, este es el camino corto: un contenedor, HTTPS delante y las aplicaciones oficiales apuntando a tu dominio.
Qué es (y qué no es)
Las aplicaciones (Android, iOS, escritorio, extensión, CLI) hablan la API de Bitwarden, y Vaultwarden implementa esa API. La caja fuerte sigue cifrada en el cliente (zero-knowledge): los elementos llegan al servidor ya cifrados con una clave derivada de la contraseña maestra, y el servidor no puede leerlos.
- Sirve para ] a ti, a la familia, al homelab, a un equipo pequeño. Funciona con SQLite (por defecto), MySQL o PostgreSQL. En nuestra prueba, el contenedor recién iniciado y sin usuarios ocupó unos 10 MiB de RAM.
- No es adecuado para una empresa que necesita SOC 2, SLA y soporte de Bitwarden Inc. El proyecto no tiene una auditoría formal equivalente. Usted es el backup, el parche y el cortafuegos.
Sigue las versiones, porque los clientes oficiales evolucionan rápido: la 1.37.0 es necesaria para los clientes 2026.7.0 en adelante, y la 1.37.2 para los 2026.8.0 en adelante. La 1.37.0, de julio de 2026, también corrigió un paquete de fallos de seguridad (SSRF en el endpoint de iconos, acceso a elementos entre organizaciones, inundación de WebSocket sin autenticación, entre otros), y la 1.37.3 pasó a revocar los tokens de “recordar este dispositivo” del 2FA cuando la contraseña o el 2FA cambian. Desde la 1.35.0 (diciembre de 2025), el inicio de sesión único (SSO) mediante OpenID Connect es nativo, activado con SSO_ENABLED. SCIM y Secrets Manager siguen siendo exclusivos de Bitwarden oficial.
Levantar con Docker y Caddy
La vía recomendada por el proyecto es el contenedor. HTTPS es obligatorio: el web vault utiliza la Web Crypto API, que el navegador solo habilita en un contexto seguro. El Caddy obtiene y renueva el certificado por sí solo. (Si Docker aún es algo nuevo, existe el curso de Docker.)

Genere el token del panel de administración (Argon2) antes del compose. El comando pide la contraseña dos veces e imprime el hash:
docker run --rm -it vaultwarden/server:1.37.3 /vaultwarden hash
Pegue la cadena $argon2id$... en el YAML. En Compose, cada $ se convierte en $$.
mkdir -p /opt/vaultwarden && cd /opt/vaultwarden
# /opt/vaultwarden/compose.yaml
services:
vaultwarden:
image: vaultwarden/server:1.37.3
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.exemplo.com.br"
SIGNUPS_ALLOWED: "true"
ADMIN_TOKEN: "$$argon2id$$v=19$$m=65540,t=3,p=4$$COLE_O_HASH"
volumes:
- ./vw-data:/data
caddy:
image: caddy:2
container_name: vw-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- vaultwarden
volumes:
caddy_data:
caddy_config:
# /opt/vaultwarden/Caddyfile
vault.exemplo.com.br {
encode zstd gzip
reverse_proxy vaultwarden:80
}
# DNS do domínio → IP desta máquina, depois:
docker compose up -d
docker compose logs -f
curl -s https://vault.exemplo.com.br/alive
O /alive responde con la fecha y hora del servidor cuando todo está en marcha. No olvides el volumen ./vw-data:/data: sin un volumen persistente, la versión actual de Vaultwarden se niega a iniciar y muestra ¡No hay volumen persistente! en el registro. Es una protección para que no pierdas la bóveda al recrear el contenedor.
Quien ya tiene nginx (ISPConfig, por ejemplo) prescinde del servicio Caddy: publique Vaultwarden solo en 127.0.0.1:8000 y haga proxy con Let's Encrypt en nginx. El WebSocket utiliza el mismo puerto 80 del contenedor; el antiguo puerto 3012 ya no es necesario.
Primer inicio de sesión y bloquear el registro
Abre https://vault.exemplo.com.br y cree su cuenta. Después cierre el puerto:
SIGNUPS_ALLOWED: "false"
docker compose up -d
Las invitaciones posteriores salen del panel /admin, con el token que generaste. Sin ADMIN_TOKEN, el panel ni siquiera existe — y así debe quedarse si no vas a usarlo. Si usas SSO, la 1.37.3 trajo el SSO_SIGNUPS_ALLOWED para controlar aparte el registro por esa vía.
Activa el 2FA en la caja fuerte (TOTP o FIDO2) el primer día. Es la misma app de Bitwarden; la diferencia es solo el servidor.
Apuntar los clientes oficiales
En cualquier app de Bitwarden, en la pantalla de inicio de sesión: Self-hosted → pegue https://vault.exemplo.com.br. Inicia sesión con el correo electrónico de la cuenta que creaste. Extensión del navegador, móvil y CLI (bw config server) usan la misma URL.
No reportes bugs de Vaultwarden al soporte de Bitwarden Inc. El README es explícito: las issues y discusiones van al GitHub y al Matrix del proyecto.
Backup — si no tienes, no tienes bóveda
El volumen ./vw-data es la bóveda: db.sqlite3, rsa_key.pem (firma los tokens de inicio de sesión), adjuntos, Sends y el config.json del panel admin. Copiar el archivo de SQLite con el servicio en ejecución puede generar una copia incoherente; el propio binario tiene un comando que realiza la copia segura de la base de datos, sin detener nada:
docker compose exec vaultwarden /vaultwarden backup
# Backup to 'data/db_20261005_170645.sqlite3' was successful
Un script diario que genera esa copia, empaqueta el volumen sin la base de datos “viva” y limpia el temporal:
#!/bin/sh
# /usr/local/sbin/vw-backup
set -eu
cd /opt/vaultwarden
docker compose exec -T vaultwarden /vaultwarden backup
tar -czf "/backup/vw-$(date +%F).tar.gz" -C vw-data \
--exclude='db.sqlite3*' --exclude='icon_cache' .
rm -f vw-data/db_*.sqlite3
Para restaurar, extrae el paquete en un vw-data vacío, renómbrelo db_AAAAMMDD_HHMMSS.sqlite3 para db.sqlite3 y levante el Compose. Guarde la copia fuera de la máquina — otro disco, otro VPS, un bucket mediante rclone — y pruebe la restauración al menos una vez. El OnCalendar= del systemd se encarga de la programación si no quieres usar cron.
Actualizando
Cambie la etiqueta de la imagen en el compose.yaml por la nueva versión, haga la copia de seguridad y vuelva a crear el contenedor:
/usr/local/sbin/vw-backup
docker compose pull
docker compose up -d
docker compose logs --tail=30 vaultwarden
Fijar la versión (en lugar de latest) deja la actualización bajo su control y la reversión sencilla: basta con volver a la etiqueta. Lea las notas de la release antes, sobre todo cuando mencionen compatibilidad con una nueva versión de los clientes.
Referencias
- github.com/dani-garcia/vaultwarden (AGPL-3.0, v1.37.3)
- Wiki — proxy, token de admin, backup, SSO con OpenID Connect
- Clientes oficiales de Bitwarden
Un binario Rust, un volumen y HTTPS. La bóveda permanece en el hardware que tú controlas — y la aplicación en el bolsillo sigue siendo la misma.