Por qué migrar a Vaultwarden self-hosted
Bitwarden aumentó sus precios aproximadamente un 98% a principios de 2026 en los planes individuales y familiares. Este aumento hizo que la pregunta del coste se volviera concreta para una herramienta que hasta entonces resultaba asequible. Pero el coste no es la única razón para migrar.
Vaultwarden es una reescritura en Rust del servidor Bitwarden. Expone la misma API que el servicio oficial, lo que significa que todos los clientes Bitwarden — extensión de navegador, aplicación móvil, CLI — funcionan sin ninguna modificación, simplemente apuntando a tu propio dominio. Las bóvedas de equipo, organizaciones, colecciones, TOTP y autenticación de dos factores están disponibles en la instancia self-hosted, mientras que en el servicio cloud oficial requieren planes de pago.
Verifica esto en github.com/dani-garcia/vaultwarden: el proyecto tiene más de 40.000 estrellas y una comunidad activa, con discusiones de migración regulares incluyendo un hilo de 200+ comentarios abierto en 2026.
Lo que Vaultwarden ofrece frente a Bitwarden cloud
- Coste mensual fijo: el precio de tu VPS, no una suscripción por usuario o por funcionalidad.
- Bóvedas de organización y colecciones sin coste adicional: disponibles desde la instalación, no reservadas a un plan premium.
- TOTP integrado: códigos de autenticación de dos factores almacenados en Vaultwarden, sin necesitar Bitwarden Premium.
- Datos en tu infraestructura: ningún tercero tiene acceso a tu bóveda cifrada ni a los registros de conexión.
- Compatibilidad total con los clientes oficiales de Bitwarden: sin cambios de hábitos para tus usuarios.
- Consumo muy bajo: menos de 50 MB de RAM en reposo, funciona en el VPS más pequeño junto a otros servicios.
Requisitos previos antes de empezar
Vaultwarden ya desplegado. Esta guía cubre únicamente la migración de datos. Si tu instancia no está lista, empieza por desplegar Vaultwarden en tu VPS.
Bitwarden CLI instalado en una versión reciente. Se recomienda la versión 2024.x o superior. Comprueba con bw --version. Instala con npm install -g @bitwarden/cli o descargando el binario desde bitwarden.com/help/cli.
SMTP configurado en Vaultwarden. Las invitaciones de organización requieren un servidor SMTP funcional. Sin él, el paso de importación de organizaciones falla silenciosamente. Variables de entorno a verificar en tu docker-compose.yml o archivo .env de Vaultwarden:
SMTP_HOST=smtp.example.com
[email protected]
SMTP_PORT=587
SMTP_SECURITY=starttls
[email protected]
SMTP_PASSWORD=tucontraseñaUna cuenta de administrador activa en tu Vaultwarden. La necesitarás para crear manualmente las organizaciones tras la importación.
Estimación de tiempo. Reserva de 30 a 60 minutos según el volumen de datos y el número de organizaciones.
Migrar de Bitwarden cloud a Vaultwarden: procedimiento completo
Autenticarse en Bitwarden cloud con la CLI
Abre un terminal e inicia sesión en tu cuenta de Bitwarden cloud. La CLI se autentica en el servidor oficial por defecto — no cambies el
servertodavía; este comando debe apuntar a Bitwarden cloud:bw loginIntroduce tu correo electrónico y contraseña maestra. Una vez autenticado, desbloquea la bóveda y exporta la clave de sesión:
export BW_SESSION=$(bw unlock --raw)El flag
--rawes esencial: sin él,bw unlockmuestra un mensaje formateado en lugar de la clave bruta, y los comandos posteriores que usen$BW_SESSIONdevolverán un error de autenticación.Verifica que la sesión es válida:
bw statusLa respuesta debe indicar
"status": "unlocked".Exportar tu bóveda personal en formato Bitwarden JSON
El export en formato JSON nativo de Bitwarden (
bitwardenjson) conserva todos los metadatos: tipos de entradas, campos personalizados, URIs, notas, TOTP. No uses el formato CSV, que pierde esta información.bw export --format bitwardenjson --output ./bitwarden-personal.jsonAttention : Este archivo no contiene tus archivos adjuntos. Es la laguna más importante del export estándar. Los adjuntos deben descargarse por separado, entrada por entrada (paso 4).
El archivo JSON está cifrado en el lado del cliente — contiene tus datos en texto claro. Almacénalo en un directorio privado y elimínalo tras la importación.
Exportar cada organización por separado
Los datos de organización no están incluidos en el export de la bóveda personal. Cada organización debe exportarse con su propio identificador.
Primero lista tus organizaciones para obtener sus identificadores:
bw list organizationsPara cada organización mostrada, anota su
idy expórtala:bw export --organizationid <id-de-la-organizacion> --format bitwardenjson --output ./bitwarden-org-<nombre>.jsonRepite este comando para cada organización. Si el comando devuelve un error de permisos, verifica que eres propietario o administrador de la organización.
Descargar los archivos adjuntos
Este es el paso que la mayoría de guías omite. El export JSON lista las entradas pero no contiene los archivos adjuntos.
Para cada entrada que tenga un adjunto, usa el comando
bw get attachment:bw list items | jq '.[] | select(.attachments != null) | {id, name, attachments}'Para descargar cada adjunto:
bw get attachment <nombre-del-archivo> --itemid <id-de-la-entrada> --output ./attachments/Si tienes muchos adjuntos, este script de bash automatiza la descarga:
mkdir -p ./attachments bw list items | jq -c '.[] | select(.attachments != null)' | while read item; do ITEM_ID=$(echo $item | jq -r '.id') ITEM_NAME=$(echo $item | jq -r '.name') echo $item | jq -c '.attachments[]' | while read att; do ATT_ID=$(echo $att | jq -r '.id') ATT_NAME=$(echo $att | jq -r '.fileName') bw get attachment "$ATT_NAME" --itemid "$ITEM_ID" --output "./attachments/${ITEM_ID}_${ATT_NAME}" done doneImportar en Vaultwarden
Primero redirige la CLI hacia tu instancia Vaultwarden:
bw config server https://vault.tudominio.comAutentícate en Vaultwarden:
bw logout bw login export BW_SESSION=$(bw unlock --raw)Importa la bóveda personal:
bw import bitwardenjson ./bitwarden-personal.jsonPara las organizaciones, primero crea la organización en la interfaz web de Vaultwarden, luego recupera su identificador:
bw list organizationsImporta cada archivo de organización con el identificador recién creado:
bw import bitwardenjson ./bitwarden-org-<nombre>.json --organizationid <nuevo-id>Finalmente, vuelve a adjuntar manualmente los archivos descargados a sus entradas a través de la interfaz web de Vaultwarden.
Verificar la importación y actualizar los clientes
Antes de dar la migración por completada, realiza estas comprobaciones:
En la interfaz web de Vaultwarden:
- el número de entradas coincide con el de Bitwarden cloud;
- los campos personalizados están presentes en algunas entradas de referencia;
- los códigos TOTP funcionan;
- las organizaciones y sus colecciones son visibles.En los clientes Bitwarden (extensión de navegador, aplicación móvil):
- cierra sesión en la cuenta de Bitwarden cloud;
- en los ajustes del cliente, cambia la URL del servidor ahttps://vault.tudominio.com;
- vuelve a iniciar sesión con las mismas credenciales.Espera la sincronización completa antes de eliminar nada de la cuenta antigua.
Configuración post-migración
Copias de seguridad automáticas. A diferencia del servicio cloud, hacer copias de seguridad de tu instancia self-hosted es tu responsabilidad. El archivo de datos de Vaultwarden es data/db.sqlite3. Un cron diario es suficiente:
0 3 * * * tar -czf /backup/vaultwarden-$(date +%Y%m%d).tar.gz /opt/vaultwarden/data/ 2>/dev/nullInvitaciones de organización. Si gestionas organizaciones con varios miembros, cada miembro debe ser reinvitado desde la interfaz de administración de Vaultwarden. La invitación se envía por correo electrónico.
Autenticación de dos factores. Configura el 2FA en tu cuenta de Vaultwarden self-hosted en el primer inicio de sesión. Vaultwarden soporta TOTP, Duo, WebAuthn (claves FIDO2) y correo electrónico.
Cifra el archivo de export antes de almacenarlo
El export JSON de Bitwarden contiene tus contraseñas en texto claro. Si necesitas conservar este archivo temporalmente, cífralo con GPG:
gpg --symmetric --cipher-algo AES256 bitwarden-personal.json
rm bitwarden-personal.jsonElimina el archivo sin cifrar inmediatamente. Un archivo JSON de Bitwarden olvidado en una carpeta temporal es una brecha de seguridad directa.
Solución de errores frecuentes
Sesión expirada durante el export. Síntoma: Not logged in o Session key is invalid a mitad del proceso. Solución:
export BW_SESSION=$(bw unlock --raw)--raw faltante en bw unlock. Sin --raw, bw unlock muestra un mensaje formateado en lugar de la clave bruta, y todos los comandos posteriores fallan con error de autenticación.
bw export --organizationid devuelve You do not have permission. No eres propietario ni administrador de la organización. Verifica tu rol en la interfaz web de Bitwarden.
La importación falla con already exists. Vacía la bóveda de Vaultwarden (Ajustes → Zona de peligro → Purgar bóveda) antes de relanzar la importación.
Los códigos TOTP no funcionan tras la importación. Verifica que usas el formato bitwardenjson, no csv que no soporta TOTP.
Adjuntos ausentes tras la importación. El export JSON estándar no contiene adjuntos. Deben descargarse con bw get attachment (paso 4) y adjuntarse manualmente.
Tu bóveda self-hosted está operativa
La migración de Bitwarden cloud a Vaultwarden se resume en seis pasos si preparaste tu instancia y SMTP de antemano: export personal, exports por organización, descarga de adjuntos, reconfiguración de la CLI, importaciones, verificación.
Los dos puntos a no ignorar son el formato bitwardenjson (no csv) y el paso de los adjuntos, que no forma parte de ningún export automático.
Para reforzar la seguridad del VPS que aloja tu Vaultwarden, consulta la checklist de hardening Linux y la guía sobre actualizaciones de seguridad automáticas.