// DevOps
Vaultwarden: autoalojamiento de un gestor de contraseñas en 30 minutos
Publicado el 22.09.2026
Vaultwarden — implementación no oficial del servidor Bitwarden en Rust (licencia AGPL-3.0, a septiembre de 2026 la versión vigente es 1.37.3). Requiere notablemente menos recursos que el servidor oficial, funciona con todos los clientes oficiales de Bitwarden y soporta la mayor parte de las funciones de pago. Es una opción cómoda para uso personal y equipos pequeños. En el artículo «Gestores de contraseñas: Parte 3 — Bitwarden y Vaultwarden» se explica en qué se diferencian Vaultwarden y Bitwarden y cuándo elegir cada uno.
Qué se necesita
- VPS con Ubuntu 22.04/24.04 (suficiente 1 vCPU y 1 GB de RAM).
- Docker y Docker Compose instalados.
- Un dominio con un registro A apuntando a la IP de tu servidor.
- Servicio SMTP para enviar correos del sistema (invitaciones, confirmaciones de acceso).
1. Configuración de docker-compose.yaml
Desplegamos dos contenedores: Vaultwarden y Nginx como proxy inverso con certificados Let’s Encrypt. HTTPS es obligatorio: sin él los clientes en navegador de Bitwarden no funcionan con el servidor, ya que la criptografía web en el navegador solo está disponible en un contexto seguro.
Cree un directorio de trabajo y el archivo docker-compose.yaml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- SIGNUPS_ALLOWED=${VAULTWARDEN_SIGNUPS_ALLOWED}
- ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}
volumes:
- ./vaultwarden-data:/data
nginx:
image: ${NGINX_IMAGE}
container_name: nginx-proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=${VAULTWARDEN_DOMAIN}
volumes:
- ./nginx-templates:/opt/nginx-templates:ro
- ./letsencrypt:/etc/letsencrypt
depends_on:
- vaultwardenImportante:
ADMIN_TOKENabre el panel de administración en/admin. Establézcalo como hash Argon2 (sección 2), no en texto plano, y elimínelo de la configuración cuando ya no necesite el panel. La variable separadaWEBSOCKET_ENABLEDya no es necesaria: desde la versión 1.29 WebSocket funciona en el puerto principal.
2. Variables de entorno (.env)
Junto a docker-compose.yaml cree el archivo .env:
# Configuración básica
VAULTWARDEN_DOMAIN=vault.yourdomain.com
NGINX_IMAGE=your-preferred-nginx-image:latest
# Configuración de Vaultwarden
VAULTWARDEN_SIGNUPS_ALLOWED=false
# hash Argon2 entre comillas simples, los signos $ no se escapan
VAULTWARDEN_ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'El token se define no como texto plano, sino como un hash Argon2id en formato PHC. Vaultwarden generará el hash por sí mismo: el comando pedirá una contraseña, que luego introducirás en la página /admin.
docker run --rm -it vaultwarden/server /vaultwarden hash
# parámetros reducidos según la recomendación de OWASP:
docker run --rm -it vaultwarden/server /vaultwarden hash --preset owaspCómo escribir el hash depende del lugar:
- en el archivo
.env— tal cual, entre comillas simples; - directamente en
environmentdel archivodocker-compose.yaml— cada signo$se duplica ($$argon2id$$v=19$$...), de lo contrario Compose lo interpretará como variable.
Si dejas el token en texto plano, Vaultwarden registrará una advertencia «You are using a plain text ADMIN_TOKEN which is insecure».
3. Configuración de Nginx
Cree el directorio ./nginx-templates y dentro el archivo vaultwarden.conf.template:
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name __VAULTWARDEN_DOMAIN__;
ssl_certificate /etc/letsencrypt/live/__VAULTWARDEN_DOMAIN__/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/__VAULTWARDEN_DOMAIN__/privkey.pem;
client_max_body_size 128m;
# WebSocket para live-sync (con Vaultwarden 1.29+ usa el mismo puerto 80)
location /notifications/hub {
proxy_pass http://vaultwarden:80;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://vaultwarden:80;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}Si la imagen de Nginx no soporta sustitución automática de variables — reemplace __VAULTWARDEN_DOMAIN__ por el dominio real manualmente y renombre el archivo a .conf.
4. Ejecución
docker compose up -d5. Configuración SMTP
Las configuraciones guardadas desde el panel /admin las escribe Vaultwarden en el archivo data/config.json, y para la mayoría de parámetros ese archivo tiene prioridad sobre las variables de entorno. Lo más sencillo es configurar SMTP desde el propio panel; a continuación se muestra cómo hacerlo sin él, editando el archivo directamente.
Rápidamente establecer la configuración de correo:
python3 -c "
import json
with open('./vaultwarden-data/config.json') as f:
c = json.load(f)
c.update({
'smtp_host': 'mail.your-provider.com',
'smtp_port': 587,
'smtp_security': 'starttls',
'smtp_username': 'your-username',
'smtp_password': 'your-password',
'smtp_from': 'no-reply@yourdomain.com',
'smtp_from_name': 'Vaultwarden',
'_enable_smtp': True,
})
with open('./vaultwarden-data/config.json', 'w') as f:
json.dump(c, f, indent=2)
"Después de cambiar la configuración:
docker compose restart vaultwardenAdvertencia: Los puertos
25y587a menudo están bloqueados por proveedores en la nube. Si el correo no se envía — pruebe2525o8025.
6. Gestión de registros
Por defecto Vaultwarden permite el registro (SIGNUPS_ALLOWED=true), por eso en .env lo cerramos. Ábralo solo mientras añada un nuevo usuario (o invite usuarios desde el panel /admin`):
# Abrir el registro
sed -i 's/VAULTWARDEN_SIGNUPS_ALLOWED=false/VAULTWARDEN_SIGNUPS_ALLOWED=true/' .env
docker compose up -d --force-recreate vaultwarden
# Cerrar después de que el usuario haya creado la cuenta
sed -i 's/VAULTWARDEN_SIGNUPS_ALLOWED=true/VAULTWARDEN_SIGNUPS_ALLOWED=false/' .env
docker compose up -d --force-recreate vaultwardenSi el registro no se activa mediante
.env— compruebe el valor"signups_allowed"dentro deconfig.json: tiene prioridad.
7. ¿Qué respaldar?
| Archivo | Importancia | Descripción |
|---|---|---|
db.sqlite3 | Crítico | Base de datos principal con todas las contraseñas cifradas |
rsa_key.pem | Crítico | Claves de cifrado |
config.json | Importante | Configuración del servidor (SMTP y otros) |
attachments/ | Importante | Archivos adjuntos a notas |
Nunca copie db.sqlite3 directamente mientras el servidor está en funcionamiento — use el comando integrado:
sqlite3 ./vaultwarden-data/db.sqlite3 ".backup /backup/db.sqlite3"Clientes
Todos los clientes oficiales de Bitwarden funcionan con su servidor. En el primer inicio haga clic en el engranaje (configuración del servidor) y en el campo Self-hosted URL indique https://vault.yourdomain.com.
Disponible para: Chrome, Firefox, Safari, iOS, Android, macOS, Windows, Linux y CLI.
Resumen
Desplegar Vaultwarden lleva alrededor de media hora y no requiere un servidor potente. Los puntos clave: token de administrador — solo como hash Argon2, HTTPS obligatorio, disponibilidad de los puertos SMTP, prioridad de config.json sobre .env y que desde la versión 1.29 WebSocket funciona en el puerto principal 80 y no en el 3012.
Siguiente: Bitwarden CLI — gestión de contraseñas desde la terminal y automatización CI/CD.
// Reviews
Reseñas relacionadas
La experiencia de colaboración dejó una impresión sumamente positiva, principalmente por el profesionalismo y el enfoque para resolver los problemas que surgieron.
La experiencia de colaboración dejó una impresión sumamente positiva, principalmente por el profesionalismo y el enfoque para resolver los problemas que surgieron.
Jitsi Meet: Zoom personal, configuración de Jitsi Meet en Docker y en VPS
11.11.2025 · ★ 5/5
Había que hacer funcionar n8n, Redis y la base de datos. Lo había encargado antes a otro proveedor; todo se rompía constantemente. Se lo encargué a Mijaíl y al día siguiente todo funcionó rápido, ¡como un reloj!
Había que poner en marcha n8n, redis y la base de datos. Contraté antes a otro proveedor, y todo se rompía constantemente. Lo encargué a Mikhail, y al día siguiente ¡todo empezó a funcionar rápido, como un reloj!
Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
24.09.2025 · ★ 5/5
Gracias por el trabajo rápido y bien hecho. Todo se hizo de manera ágil y como debía ser!
Gracias por el trabajo rápido y bien hecho. Todo se hizo con prontitud y tal como se necesitaba!
Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
06.09.2025 · ★ 5/5
Solución rápida al problema, ¡recomiendo a Mijaíl como profesional a todo el mundo! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de IA, y acabé gastando mucho tiempo y dinero (por el tiempo de inactividad del servidor). Así que mi consejo final: acudan a profesionales, sale más barato =) Gracias a Mijaíl por su profesionalidad.
Solución rápida al problema, ¡recomiendo a Mikhail como profesional! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de redes neuronales, y acabó siendo una pérdida de mucho esfuerzo y dinero …
Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
25.08.2025 · ★ 5/5
Mijaíl configuró otro VPS. Rápida y profesionalmente sorteó ciertas limitaciones de los proveedores de hosting.
Mijaíl completó la configuración de otro VPS. De forma rápida y profesional, sorteando ciertas limitaciones impuestas por los proveedores de hosting.
Instalación de N8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
12.08.2025 · ★ 5/5
¡Excelente trabajo, gracias! ¡Mijaíl es un profesional, lo recomiendo!
¡Excelente trabajo, gracias! Mikhail es un profesional en lo suyo, ¡lo recomiendo!
Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
03.07.2025 · ★ 5/5
// Contact
¿Necesitas ayuda?
Escríbeme y te ayudaré a resolver el problema
Respondo en un día laborable (03:00-13:00 GMT)
Или оставьте заявку здесь:
// Related