Tutoriales de VPS
Instalar Vaultwarden en un VPS (2026): guía completa de Docker Compose, HTTPS con Caddy, copias de seguridad y endurecimiento de seguridad
Este tutorial está dirigido a usuarios que quieren autohospedar un servicio de gestión de contraseñas compatible con Bitwarden en un VPS de bajo coste. Aprenderás a desplegar Vaultwarden con Docker Compose, vincular el servicio solo a un puerto local, proporcionar HTTPS con Caddy, desactivar el registro público, configurar invitaciones por SMTP, activar la verificación en dos pasos y, sobre todo, dominar las copias de seguridad, la restauración, las actualizaciones y la resolución de problemas habituales.
Instalar Vaultwarden en un VPS (2026): guía completa de Docker Compose, HTTPS con Caddy, copias de seguridad y endurecimiento de seguridad
Un gestor de contraseñas es uno de los mejores servicios para autohospedar a largo plazo en un VPS. No consume disco como los álbumes de fotos, los discos en la nube o las bibliotecas multimedia, ni consume GPU y RAM como los servicios de IA; pero su valor es alto: las extensiones de navegador, las apps móviles, los clientes de escritorio, el uso compartido en equipo, las contraseñas aleatorias, la verificación en dos pasos y la sincronización entre dispositivos afectan directamente a tu seguridad diaria.
Vaultwarden es un servidor compatible con Bitwarden implementado en Rust. No es el servicio oficial de Bitwarden, pero es compatible con la mayoría de los clientes de Bitwarden, consume muy pocos recursos y encaja muy bien en VPS personales, equipos pequeños y entornos domésticos. Muchos VPS de 1C1G o incluso más pequeños pueden ejecutarlo.
Pero precisamente porque almacena contraseñas, el despliegue no puede limitarse a "que la página abra". Este artículo explica las cosas con mentalidad de producción: cómo desplegar Vaultwarden con Docker Compose, cómo obtener HTTPS automático con Caddy, por qué debe desactivarse el registro público, cómo configurar SMTP, qué directorios deben respaldarse, qué hay que tener en cuenta al restaurar y cómo reducir el riesgo de exposición pública.
Sí.
Las ventajas de Vaultwarden son ser ligero, estable y tener un ecosistema de clientes maduro. Puedes seguir usando la extensión de navegador, la app móvil y el cliente de escritorio de Bitwarden; solo cambias la dirección del servidor por tu propio dominio.
Escenarios adecuados:
- Quieres autohospedar un servicio de sincronización de contraseñas y no quieres alojar tu bóveda en una nube de terceros.
- Tienes un VPS que permanece en línea a largo plazo y un dominio.
- Necesitas ofrecer uso compartido de contraseñas a tu familia o a un equipo pequeño.
- Quieres operar a bajo coste con recursos de máquina limitados.
- Estás dispuesto a hacer copias de seguridad y simulacros de restauración con seriedad.
Escenarios no adecuados:
- No estás dispuesto a mantener las actualizaciones de seguridad del servidor.
- No tienes una segunda copia de seguridad y solo quieres guardar tu bóveda en un único VPS.
- Vas a exponer juntos a internet el panel de administración, la entrada de registro y contraseñas débiles.
- Esperas que el servidor te ayude a recuperar la contraseña maestra si la olvidas.
El principio central de un gestor de contraseñas es: aunque el servidor sea comprometido, las contraseñas en texto plano no deberían obtenerse fácilmente; pero el servidor sigue siendo muy importante, porque afecta a la sincronización, el inicio de sesión, las invitaciones, el uso compartido de organizaciones y la disponibilidad de los datos.
Vaultwarden tiene requisitos de recursos muy bajos:
| Uso | Configuración recomendada |
|---|---|
| Uso personal | 1 vCPU / 512MB-1GB RAM / 10GB SSD |
| Familia o equipo pequeño | 1-2 vCPU / 1GB RAM / 20GB SSD |
| Muchos usuarios y más adjuntos | 2 vCPU / 2GB RAM / 40GB+ SSD |
Lo que realmente importa no es la CPU, sino:
- Si el directorio de datos es persistente.
- Si el dominio usa HTTPS.
- Si el registro está desactivado.
- Si SMTP puede enviar correctamente los correos de invitación y verificación.
- Si las copias de seguridad incluyen la base de datos, los adjuntos y los archivos de claves.
Si tu VPS ejecuta muchos servicios Docker a la vez, se recomienda leer primero los fundamentos de Docker y proxy inverso. Para ampliar, consulta: Guía completa del proxy inverso Caddy en un VPS y Instalar el panel de gestión Docker Portainer en un VPS.
Antes de empezar, prepara:
- Un VPS con Ubuntu 22.04 / 24.04 o Debian 12.
- Docker Engine y el plugin Docker Compose instalados.
- Un dominio, por ejemplo
vault.example.com. - Los puertos 80/443 abiertos.
- Cortafuegos básico y seguridad SSH configurados.
Confirma que Docker está disponible:
docker version
docker compose version
Confirma que el dominio ya resuelve al VPS:
dig vault.example.com +short
Si el dominio aún no resuelve, no te apresures a solicitar certificados. Caddy, Nginx o Let's Encrypt necesitan que DNS y los puertos 80/443 funcionen correctamente.
Se recomienda colocar Vaultwarden en /opt/vaultwarden:
sudo mkdir -p /opt/vaultwarden
sudo chown -R "$USER":"$USER" /opt/vaultwarden
cd /opt/vaultwarden
Crea el directorio de datos:
mkdir -p vw-data
Por defecto Vaultwarden guarda los datos importantes en /data dentro del contenedor, así que debemos montarlo en un directorio del host; de lo contrario, los datos podrían perderse al eliminar el contenedor.
Crea .env:
nano .env
Escribe el siguiente contenido, modificándolo para tu propio dominio:
VAULTWARDEN_DOMAIN=https://vault.example.com
VAULTWARDEN_ADMIN_TOKEN=换成一串很长的随机值
VAULTWARDEN_SMTP_HOST=smtp.example.com
VAULTWARDEN_SMTP_PORT=587
[email protected]
[email protected]
VAULTWARDEN_SMTP_PASSWORD=换成邮箱授权码
Genera un token de administrador aleatorio:
openssl rand -base64 48
ADMIN_TOKEN se usa para acceder a la página de administración /admin de Vaultwarden. Este valor es muy sensible; no lo escribas en un repositorio público ni lo envíes a otras personas.
Si por ahora no quieres habilitar el panel de administración, puedes no definir ADMIN_TOKEN, o desactivar la entrada de administración tras el despliegue una vez confirmes que la configuración es correcta. Para usuarios personales, usa la página de administración lo menos posible.
Crea docker-compose.yml:
nano docker-compose.yml
Escribe:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file:
- .env
environment:
DOMAIN: ${VAULTWARDEN_DOMAIN}
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "true"
WEBSOCKET_ENABLED: "true"
ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN}
SMTP_HOST: ${VAULTWARDEN_SMTP_HOST}
SMTP_PORT: ${VAULTWARDEN_SMTP_PORT}
SMTP_FROM: ${VAULTWARDEN_SMTP_FROM}
SMTP_USERNAME: ${VAULTWARDEN_SMTP_USERNAME}
SMTP_PASSWORD: ${VAULTWARDEN_SMTP_PASSWORD}
SMTP_SECURITY: starttls
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8000:80"
Aquí hay varios puntos clave:
vaultwarden/server:latestes la imagen oficial de uso común../vw-data:/dataguarda la base de datos, los adjuntos, las claves y la configuración.127.0.0.1:8000:80significa que solo se permite el acceso local al puerto del contenedor.SIGNUPS_ALLOWED: "false"desactiva el registro público.INVITATIONS_ALLOWED: "true"permite al administrador invitar usuarios.DOMAINdebe rellenarse con el dominio HTTPS final; de lo contrario, los adjuntos, los enlaces de correo y la sincronización de clientes pueden comportarse de forma anómala.
Si aún no has configurado SMTP, puedes eliminar primero las variables de entorno relacionadas con SMTP y añadirlas cuando la página web abra. Pero antes del uso formal se recomienda configurar el correo; de lo contrario, las invitaciones, la verificación y algunas notificaciones tendrán una peor experiencia.
En /opt/vaultwarden, ejecuta:
docker compose up -d
Comprueba el estado:
docker compose ps
Ver los registros:
docker compose logs -f --tail=100
Prueba local:
curl -I http://127.0.0.1:8000
Si devuelve HTTP/1.1 200 OK, 301 o una respuesta similar, el contenedor es accesible localmente.
Nota: como solo hemos vinculado 127.0.0.1, el acceso público a http://服务器IP:8000 no funcionará; este es el comportamiento esperado. El siguiente paso es hacer proxy inverso desde el 443 con Caddy o Nginx.
Suponiendo que tu dominio es vault.example.com, el Caddyfile puede escribirse así:
vault.example.com {
encode zstd gzip
header {
X-Content-Type-Options nosniff
Referrer-Policy strict-origin-when-cross-origin
X-Robots-Tag "noindex, nofollow"
}
reverse_proxy 127.0.0.1:8000 {
header_up X-Real-IP {remote_host}
}
}
Tras guardar, ejecuta:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Visita:
https://vault.example.com
La documentación oficial de Vaultwarden también recomienda usar un proxy inverso para terminar TLS, en lugar de exponer directamente el puerto HTTP del contenedor a internet. Así solo se expone públicamente el 443, y el puerto del contenedor sigue siendo visible solo en local.
Si aún no tienes Caddy, consulta: Guía completa del proxy inverso Caddy en un VPS.
Tras abrir la página web por primera vez, crea tu cuenta principal.
Una vez creada, confirma de nuevo que el registro público está desactivado:
docker compose exec vaultwarden printenv SIGNUPS_ALLOWED
Debería mostrar:
false
¿Por qué desactivar el registro? Porque Vaultwarden es un servicio de gestión de contraseñas; si la entrada de registro permanece abierta a largo plazo, los escáneres públicos, las cuentas de spam y los ataques de relleno de credenciales aumentarán tu carga de mantenimiento.
Para añadir usuarios se recomienda usar el flujo de invitación: el administrador invita a familiares o miembros del equipo, y ellos crean la cuenta por correo. Esto es más controlable que el registro público.
SMTP se usa principalmente para:
- Invitar a nuevos usuarios.
- Verificación de correo.
- Ciertas notificaciones de seguridad.
- Correos relacionados con organizaciones.
Enfoque común de configuración de correo:
VAULTWARDEN_SMTP_HOST=smtp.qq.com
VAULTWARDEN_SMTP_PORT=587
[email protected]
[email protected]
VAULTWARDEN_SMTP_PASSWORD=邮箱授权码
Tras modificar .env, reinicia:
docker compose up -d
Luego entra en la página de administración o en la configuración de la cuenta para probar el correo.
Nota: muchos proveedores de correo no permiten usar la contraseña de inicio de sesión directamente para SMTP; necesitas generar un "código de autorización" o una "contraseña específica de aplicación" por separado. Si usas correo corporativo, confirma también SPF, DKIM, DMARC y los límites de envío; de lo contrario, los correos pueden acabar en spam.
Vaultwarden admite la verificación en dos pasos de los clientes habituales de Bitwarden. Se recomienda encarecidamente activar TOTP al menos para la cuenta de administrador.
Enfoque recomendado:
- Inicia sesión en el Web Vault.
- Entra en la configuración de seguridad de la cuenta.
- Activa el inicio de sesión en dos pasos.
- Usa una herramienta TOTP como Aegis, 1Password, Bitwarden Authenticator o Google Authenticator para guardar los códigos de verificación.
- Guarda los códigos de recuperación en una ubicación sin conexión.
No guardes el TOTP solo en la misma cuenta de Vaultwarden. De lo contrario, si no puedes iniciar sesión en Vaultwarden y tampoco puedes obtener el TOTP, te quedarás fuera.
Un enfoque más seguro es: memorizar la contraseña maestra, guardar los códigos de recuperación sin conexión y almacenar el TOTP en un dispositivo o una app independiente.
La página /admin de Vaultwarden es cómoda; permite ver usuarios, invitaciones, configuración y estado. Pero también es una entrada de alto valor.
Si activas ADMIN_TOKEN, como mínimo debes:
- Usar un token aleatorio suficientemente largo.
- No escribir el token en un repositorio público.
- No guardarlo en un entorno de navegador compartido.
- Restringir lo máximo posible el origen de acceso a
/admin.
Una forma más conservadora es restringir la ruta de administración en Caddy. Por ejemplo, permitir solo IP específicas:
vault.example.com {
@admin path /admin*
@not_allowed_admin {
path /admin*
not remote_ip 你的固定IP/32
}
respond @not_allowed_admin "admin access denied" 403
reverse_proxy 127.0.0.1:8000
}
Si no tienes IP fija, puedes considerar acceder al panel de administración mediante WireGuard, Tailscale, Cloudflare Zero Trust, etc. Cuanto menos se exponga la entrada de administración, menor será el riesgo.
Vaultwarden usa SQLite por defecto, y el directorio de datos suele ser vw-data. La documentación oficial de copias de seguridad indica claramente que los datos importantes incluyen:
db.sqlite3: la base de datos principal.attachments/: adjuntos.sends/: archivos Send, respaldar según necesidad.config.json: si guardas la configuración desde la página de administración.rsa_key*: se usa para firmar los tokens de inicio de sesión.
El comando de copia de seguridad más sencillo:
cd /opt/vaultwarden
mkdir -p /opt/backups/vaultwarden
docker exec vaultwarden /vaultwarden backup
tar czf /opt/backups/vaultwarden/vw-data-$(date +%F-%H%M).tar.gz vw-data
Desde Vaultwarden 1.32.1, la imagen incluye un comando de copia de seguridad SQLite integrado:
docker exec -it vaultwarden /vaultwarden backup
No dejes los archivos de copia de seguridad solo en el mismo VPS. Se recomienda sincronizarlos también a:
- Otro VPS.
- Almacenamiento de objetos.
- Un NAS doméstico.
- Un directorio de nube cifrado.
Si ya tienes una solución de copias de seguridad, puedes añadir Vaultwarden a ella. Lectura adicional: Diferencias entre instantáneas, copias de seguridad e imágenes de VPS.
Antes de restaurar, detén el servicio:
cd /opt/vaultwarden
docker compose down
Conserva el directorio actual:
mv vw-data vw-data.broken.$(date +%F-%H%M)
Descomprime la copia de seguridad:
tar xzf /opt/backups/vaultwarden/vw-data-你的日期.tar.gz -C /opt/vaultwarden
Inicia:
docker compose up -d
docker compose logs -f --tail=100
Luego comprueba:
- Si puedes iniciar sesión.
- Si existen las entradas de contraseñas.
- Si los adjuntos se pueden descargar.
- Si el uso compartido de la organización funciona correctamente.
- Si el móvil y la extensión del navegador pueden sincronizar.
Una copia de seguridad no es "correcta solo porque el archivo existe"; solo es fiable después de un simulacro de restauración. Esto es especialmente cierto en los gestores de contraseñas, porque lo último que quieres es intentar restaurar por primera vez durante un fallo real.
Si usas latest, el proceso de actualización es sencillo:
cd /opt/vaultwarden
cp docker-compose.yml docker-compose.yml.bak.$(date +%F)
cp .env .env.bak.$(date +%F)
docker compose pull
docker compose up -d
Tras actualizar, revisa los registros:
docker compose logs -f --tail=100
Un enfoque más prudente es fijar la etiqueta de versión, por ejemplo:
image: vaultwarden/server:1.36.0
Los usuarios personales pueden usar latest por comodidad, pero en producción o en equipos se recomienda más fijar versiones y actualizar tras probar. En cualquier caso, haz una copia de seguridad de vw-data antes de actualizar.
Primero revisa el contenedor:
docker compose ps
docker compose logs --tail=100
Luego revisa el puerto local:
ss -lntp | grep 8000
curl -I http://127.0.0.1:8000
Si curl local no funciona, el problema está en el contenedor; si local funciona pero el dominio no, el problema suele estar en Caddy, DNS, el cortafuegos o el grupo de seguridad.
Comprueba si la dirección del proxy inverso de Caddy coincide con el puerto de Compose:
Compose: 127.0.0.1:8000:80
Caddy: reverse_proxy 127.0.0.1:8000
Los puertos de ambos lados deben corresponder. Tras modificarlo, ejecuta:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Revisa especialmente DOMAIN:
docker compose exec vaultwarden printenv DOMAIN
Debe ser una dirección HTTPS completa:
https://vault.example.com
No escribas solo el dominio, ni escribas HTTP.
Revisa la configuración SMTP:
docker compose logs --tail=200 | grep -i smtp
Causas habituales:
- La contraseña SMTP no es un código de autorización.
- El puerto y el método de cifrado no coinciden.
- El proveedor de correo restringe clientes de terceros.
- El SMTP saliente del VPS está restringido por el proveedor de nube.
- La dirección del remitente y la cuenta no coinciden.
Si el puerto 25 está bloqueado, usa preferentemente 587 + STARTTLS o 465 + SSL.
Usa la función de invitación. Puedes invitar a nuevos usuarios desde la página de administración o desde una organización. No abras temporalmente el registro público a largo plazo solo para invitar a una persona.
Si debes activarlo temporalmente:
SIGNUPS_ALLOWED: "true"
Cámbialo de nuevo inmediatamente después de crear la cuenta:
SIGNUPS_ALLOWED: "false"
Luego:
docker compose up -d
Antes de publicar, confirma punto por punto:
- El dominio usa HTTPS.
- El puerto del contenedor está vinculado solo a
127.0.0.1. -
SIGNUPS_ALLOWED=false. - La cuenta de administrador usa una contraseña maestra fuerte.
- El administrador ha activado TOTP.
- SMTP está disponible.
-
/adminestá restringido o no está activado. -
vw-datase ha respaldado en una segunda ubicación. - Se ha realizado un simulacro de restauración.
- El sistema del VPS se actualiza periódicamente.
- SSH no usa contraseñas débiles.
Un gestor de contraseñas no es un blog cualquiera. Aunque Vaultwarden sea suficientemente ligero, los hábitos de despliegue deben ser más prudentes.
Los pasos principales para instalar Vaultwarden en un VPS no son complicados: crear el directorio de datos, escribir el Docker Compose, persistir /data, usar 127.0.0.1:8000:80 para evitar exponer directamente el puerto del contenedor y luego hacer proxy inverso de https://vault.example.com con Caddy.
Lo que realmente determina la seguridad son estos detalles posteriores: desactivar el registro público, configurar SMTP para invitar usuarios, activar la verificación en dos pasos para el administrador, restringir /admin, hacer copias de seguridad periódicas de vw-data y probar de verdad la restauración.
Si solo tienes un VPS de bajas prestaciones, Vaultwarden es un servicio autohospedado que merece mucho la pena desplegar; pero si no estás dispuesto a mantener copias de seguridad y actualizaciones de seguridad, el servicio en la nube oficial de Bitwarden puede resultar más cómodo. La libertad del autohospedaje debe ir acompañada de la responsabilidad del autohospedaje.