Confiar todas tus contraseñas a un servicio ajeno cuesta soltarlo, y montar el Bitwarden oficial en tu servidor pide varios contenedores y bastante RAM. Vaultwarden resuelve las dos cosas: es un servidor compatible con las aplicaciones de Bitwarden, escrito en Rust, que cabe en el rincón más modesto de un VPS. En esta guía lo levantas con Docker Compose, lo publicas con HTTPS tras un proxy inverso (un requisito que no es opcional), proteges el panel de administración y cierras el registro para que nadie más se cree una cuenta. La misma explicación está disponible en inglés.

Puntos clave

  • Vaultwarden es un servidor de contraseñas no oficial pero compatible con Bitwarden, escrito en Rust y con licencia AGPL-3.0; su repositorio reúne unas 63.800 estrellas en GitHub.
  • La última versión estable del servidor es la v1.36.0 (mayo de 2025), que empaqueta la web vault 2026.4.1; se distribuye como la imagen vaultwarden/server y escucha en el puerto 80 dentro del contenedor.
  • HTTPS es obligatorio: la web vault del navegador solo funciona sobre una conexión segura porque depende de la Web Crypto API. Por eso Vaultwarden se publica siempre detrás de un proxy inverso con TLS, nunca por HTTP a pelo.
  • Es extremadamente ligero: en reposo ronda los 10 MB de RAM, frente a los varios contenedores y el orden de 2 GB que pide la Bitwarden oficial autoalojada.
  • El panel /admin se activa con la variable ADMIN_TOKEN (mejor un hash Argon2 que texto plano), y SIGNUPS_ALLOWED=false cierra el registro una vez tienes tu cuenta.

¿Qué es Vaultwarden y en qué se diferencia de Bitwarden?

Vaultwarden es una reimplementación del servidor de Bitwarden escrita en Rust, mantenida por Daniel García y antes conocida como bitwarden_rs. No es el producto oficial, pero habla el mismo protocolo de la API, así que las aplicaciones y extensiones de Bitwarden (Android, iOS, escritorio, navegador y línea de comandos) se conectan a él sin cambios: solo apuntan a la URL de tu servidor en lugar de a la nube de Bitwarden. Guardas tus contraseñas, notas seguras, tarjetas y códigos TOTP en tu propia infraestructura, cifrados de extremo a extremo.

La gran diferencia es el peso. La imagen oficial de Bitwarden está pensada para grandes despliegues y arranca una pila de contenedores (base de datos, identidad, API, iconos, etc.) que consume del orden de 2 GB de RAM. Vaultwarden reduce todo eso a un único binario de Rust que, en reposo, apenas ronda los 10 MB de memoria y guarda los datos en un simple fichero SQLite. Esa frugalidad es la razón por la que encaja en una Raspberry Pi o en el VPS más barato, y por la que domina el self-hosting de gestores de contraseñas.

A cambio, Vaultwarden implementa por su cuenta funciones que en Bitwarden son de pago: organizaciones para compartir contraseñas, colecciones, adjuntos, la función Send y varios segundos factores (aplicación TOTP, correo, FIDO2 WebAuthn, YubiKey y Duo). Es un proyecto comunitario con un solo mantenedor principal, así que conviene seguir sus notas de versión y hacer copias de seguridad, algo que de todos modos harías con cualquier bóveda de contraseñas.

¿Cómo es el docker-compose.yml de Vaultwarden?

Vaultwarden se despliega con un único servicio. Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Fija la versión 1.36.0 en lugar de :latest (una etiqueta flotante puede saltar de versión en un reinicio y sorprenderte), persiste todo en un volumen con nombre montado en /data y publica el puerto solo en la interfaz local 127.0.0.1, porque quien debe llegar a Vaultwarden desde fuera es el proxy inverso, no Internet directamente:

services:
  vaultwarden:
    image: vaultwarden/server:1.36.0
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.tudominio.com"
      SIGNUPS_ALLOWED: "true"
      ADMIN_TOKEN: "pega-aqui-tu-hash-argon2"
      TZ: "Europe/Madrid"
    volumes:
      - vaultwarden_data:/data
    ports:
      - "127.0.0.1:8080:80"

volumes:
  vaultwarden_data:

Arráncalo y sigue los registros del primer arranque:

docker compose up -d
docker compose logs -f vaultwarden

La variable DOMAIN debe apuntar a la URL pública final con https://, porque de ella dependen las notificaciones en vivo, los adjuntos y el segundo factor WebAuthn. Desde la versión 1.29, esas notificaciones por WebSocket viajan por el mismo puerto 80, así que ya no necesitas exponer el antiguo puerto 3012. Como todas estas claves son sensibles, gestiónalas como secretos y no las dejes en claro en un compose que subes a un repositorio; la guía de variables de entorno y secretos en Docker explica cómo hacerlo con un fichero .env o con Docker secrets. Si partes de cero, repasa antes cómo instalar Docker en Ubuntu 24.04.

¿Por qué es obligatorio publicarlo con HTTPS tras un proxy?

Este es el punto que más problemas da a quien empieza, así que conviene dejarlo claro: la web vault de Vaultwarden solo funciona sobre HTTPS. No es una recomendación de seguridad, es un requisito técnico. El cliente web cifra y descifra tu bóveda en el navegador con la Web Crypto API, y los navegadores solo exponen esa API en contextos seguros (HTTPS o localhost). Si intentas abrir Vaultwarden por http:// en una IP o un dominio, verás la interfaz pero el inicio de sesión fallará. Por eso nunca se publica el contenedor por HTTP a pelo: siempre va detrás de un proxy inverso que termina el TLS.

La forma más cómoda en esta serie es delegarlo en un proxy inverso. Con Traefik, basta añadir al servicio las etiquetas del router para que obtenga un certificado de Let’s Encrypt automáticamente y enrute vault.tudominio.com al puerto 80 del contenedor:

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.vaultwarden.rule=Host(`vault.tudominio.com`)"
      - "traefik.http.routers.vaultwarden.entrypoints=websecure"
      - "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt"
      - "traefik.http.services.vaultwarden.loadbalancer.server.port=80"

Si prefieres una interfaz gráfica para gestionar los certificados, Nginx Proxy Manager hace lo mismo desde el navegador: creas un proxy host que apunta a vaultwarden:80 en la red de Docker, activas SSL con Let’s Encrypt y marcas la casilla de WebSockets para que funcionen las notificaciones. Sea cual sea el proxy, el resultado es el mismo: los clientes hablan siempre por https://vault.tudominio.com y el contenedor nunca queda expuesto directamente.

¿Cómo protejo el panel /admin y cierro el registro?

Vaultwarden incluye un panel de administración en la ruta /admin desde el que puedes ver usuarios, invitar a gente, revisar la configuración y gestionar organizaciones. Ese panel está desactivado hasta que defines la variable ADMIN_TOKEN. En lugar de poner una contraseña en texto plano (que quedaría legible en tu compose y en la memoria del proceso), lo recomendable es guardar un hash Argon2. Genera uno con la propia imagen y pega el resultado en ADMIN_TOKEN:

docker run --rm -it vaultwarden/server:1.36.0 /vaultwarden hash

El registro merece la misma atención. En el compose de arriba, SIGNUPS_ALLOWED está en "true" para que puedas crear tu primera cuenta desde la pantalla de registro. En cuanto la tengas, cámbialo a "false" y reinicia (docker compose up -d) para que nadie más pueda registrarse en tu servidor. A partir de ahí, si necesitas dar de alta a más personas, lo haces invitándolas desde el panel /admin. Si expones Vaultwarden a Internet, esto no es opcional: un servidor de contraseñas con el registro abierto es una invitación a que cualquiera cree cuentas en él.

Con el token bien puesto, entra en https://vault.tudominio.com/admin, introduce el token y revisa la sección de ajustes: ahí confirmas el DOMAIN, decides si habilitas el envío de correos (para invitaciones y avisos de inicio de sesión) y ajustas políticas de la organización. Todos esos cambios se guardan en un fichero config.json dentro de /data, así que también entran en tus copias de seguridad.

¿Cómo hago copias de seguridad de la bóveda?

Toda la información de Vaultwarden vive en el volumen /data, de modo que respaldar ese volumen es respaldar tu bóveda entera. Dentro encontrarás el fichero principal db.sqlite3 (usuarios y contraseñas cifradas), la carpeta attachments/ con los adjuntos, sends/ con los envíos temporales, el config.json del panel y las claves rsa_key* que firman los tokens de sesión. Si pierdes esas claves, todos los usuarios tendrán que volver a iniciar sesión, así que inclúyelas en la copia.

La forma más segura de copiar la base de datos SQLite en caliente es usar su propio comando de respaldo, que produce un fichero consistente aunque Vaultwarden esté escribiendo:

docker exec vaultwarden \
  sqlite3 /data/db.sqlite3 ".backup '/data/backup.sqlite3'"

Después copias backup.sqlite3 y el resto de /data a un destino externo. Este es el sitio ideal para encadenar la serie: automatiza esa copia cifrada y sube el volumen a un bucket S3 o a otro servidor con una herramienta de backup dedicada, y programa la restauración de prueba de vez en cuando. Restaurar es tan simple como detener el contenedor, reemplazar el contenido de /data por tu copia y volver a levantarlo; recuperas usuarios, organizaciones y adjuntos tal cual estaban.

Preguntas frecuentes

¿Puedo usar las apps oficiales de Bitwarden con Vaultwarden?

Sí, y es precisamente su gracia. Las aplicaciones de escritorio, móvil, la extensión del navegador y la línea de comandos de Bitwarden se conectan a Vaultwarden sin ninguna modificación: en la pantalla de acceso, en las opciones de servidor autoalojado, pones la URL de tu instancia (https://vault.tudominio.com) y a partir de ahí funciona igual que la nube oficial. Vaultwarden implementa la misma API, por lo que sincronización, autorrelleno y bóvedas compartidas se comportan como esperas.

¿Vaultwarden necesita una base de datos externa?

No para empezar. Por defecto guarda todo en un fichero SQLite dentro de /data, lo cual es más que suficiente para uso personal, familiar o de un equipo pequeño, y no requiere ningún contenedor adicional. Si prevés muchos usuarios o quieres separar el almacenamiento, admite PostgreSQL o MariaDB configurando la variable DATABASE_URL con la cadena de conexión al contenedor de la base de datos. Para la inmensa mayoría de instalaciones, SQLite es la opción más sencilla y la que menos mantenimiento pide.

¿Es seguro exponer Vaultwarden a Internet?

Lo es si tomas tres precauciones: publícalo siempre por HTTPS tras el proxy inverso, cierra el registro con SIGNUPS_ALLOWED=false en cuanto tengas tu cuenta y protege el panel con un ADMIN_TOKEN fuerte en formato Argon2. Como capas extra, activa el segundo factor en tu cuenta, mantén la imagen actualizada a la última versión estable y considera restringir el acceso con una VPN si no necesitas llegar desde cualquier red. Con eso, un servidor de contraseñas autoalojado es tan seguro como el cuidado que pongas en su configuración.

Conclusión

Vaultwarden es la vía más ligera y directa para tener tu propio Bitwarden: un contenedor, un volumen y unos minutos bastan para dejar de depender de una nube ajena sin renunciar a las apps oficiales. La clave, y el punto donde más gente tropieza, es que la web vault exige HTTPS, así que publícalo siempre tras un proxy inverso con TLS como Traefik o Nginx Proxy Manager. Cierra el registro, protege el panel /admin con un hash Argon2 y guarda el volumen /data en tu rutina de copias: con esos cuatro cuidados tendrás un gestor de contraseñas propio, fiable y bajo tu control.

Fuentes

  1. Vaultwarden: repositorio oficial en GitHub
  2. Vaultwarden Wiki: uso con Docker Compose
  3. Vaultwarden Wiki: habilitar el panel de administración
  4. Imagen vaultwarden/server en Docker Hub
  5. Bitwarden: ayuda de los clientes oficiales

Ruta: Redes y acceso remoto seguro con Docker