// DevOps

Vaultwarden: autoalojamiento de un gestor de contraseñas en 30 minutos

Publicado el 02.06.2026

Vaultwarden — es una implementación ligera del servidor Bitwarden, escrita en Rust. Consume alrededor de 30 MB de RAM (en lugar de gigabytes con el servidor oficial), es compatible con todos los clientes oficiales de Bitwarden y ofrece acceso a gran parte de las funciones premium. Solución ideal para uso personal o un pequeño equipo.

Qué se necesitará

  • VPS con Ubuntu 22.04/24.04 (suficiente 1 vCPU y 1 GB de RAM).
  • Docker y Docker Compose instalados.
  • Dominio con un registro A apuntando a la dirección IP de tu servidor.
  • Servicio SMTP para enviar correos del sistema (invitaciones, confirmaciones de inicio de sesión).

1. Configuración de docker-compose.yaml

Desplegaremos una pila completamente aislada: Vaultwarden y Nginx con obtención automática de certificados Let’s Encrypt como proxy inverso.

Crea un directorio de trabajo y el archivo docker-compose.yaml:

yaml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      - WEBSOCKET_ENABLED=true
      - 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:
      - vaultwarden

Importante: La variable ADMIN_TOKEN abre el acceso al panel de administración web en /admin. Tras completar la configuración básica se recomienda eliminar este token de la configuración.


2. Variables de entorno (.env)

Junto a docker-compose.yaml crea el archivo .env:

env
# Ajustes básicos
VAULTWARDEN_DOMAIN=vault.yourdomain.com
NGINX_IMAGE=your-preferred-nginx-image:latest

# Ajustes de Vaultwarden
VAULTWARDEN_SIGNUPS_ALLOWED=false
VAULTWARDEN_ADMIN_TOKEN=your_secure_generated_token

Generar un token seguro para el administrador:

bash
openssl rand -base64 48

3. Configuración de Nginx

Crea el directorio ./nginx-templates y dentro el archivo vaultwarden.conf.template:

nginx
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 (desde Vaultwarden 1.29+ utiliza 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 la sustitución automática de variables — reemplaza __VAULTWARDEN_DOMAIN__ por el dominio real manualmente y renombra el archivo a .conf.


4. Ejecución

bash
docker compose up -d

5. Configuración SMTP

Vaultwarden guarda la configuración SMTP en el archivo data/config.json. Este archivo tiene prioridad sobre las variables de entorno en .env.

Para configurar rápidamente el correo:

python
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:

bash
docker compose restart vaultwarden

Advertencia: Los puertos 25 y 587 a menudo están bloqueados por los proveedores cloud. Si el correo no sale — prueba 2525 o 8025.


6. Gestión de inscripciones

Por defecto la inscripción está desactivada (SIGNUPS_ALLOWED=false). Ábrela solo cuando necesites añadir un nuevo usuario:

bash
# Abrir inscripciones
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 vaultwarden

Si el registro no se activa vía .env — verifica el valor de "signups_allowed" dentro de config.json: tiene prioridad.


7. ¿Qué respaldar?

ArchivoImportanciaDescripción
db.sqlite3CríticoBase de datos principal con todas las contraseñas cifradas
rsa_key.pemCríticoClaves de cifrado
config.jsonImportanteConfiguración del servidor (SMTP y otros)
attachments/ImportanteArchivos adjuntos a las notas

Nunca copies db.sqlite3 directamente mientras el servidor está en funcionamiento — usa el comando integrado:

bash
sqlite3 ./vaultwarden-data/db.sqlite3 ".backup /backup/db.sqlite3"

Clientes

Todos los clientes oficiales de Bitwarden funcionan con tu servidor. Al iniciar por primera vez, haz clic en el engranaje (configuración del servidor) y en el campo Self-hosted URL introduce https://vault.yourdomain.com.

Disponible para: Chrome, Firefox, Safari, iOS, Android, macOS, Windows, Linux y CLI.


Resumen

El despliegue de Vaultwarden no lleva más de media hora con recursos mínimos. Puntos clave: disponibilidad de los puertos SMTP, la prioridad de config.json sobre .env y que, a partir de la versión 1.29, WebSocket funciona en el puerto principal 80 en lugar del 3012 separado.

// Reviews

Reseñas relacionadas

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!

christ_media

Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram

24.09.2025 · ★ 5/5

Comprador experimentado

ladohinpy

Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram

25.08.2025 · ★ 5/5

// Contact

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Escribir en Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Enviar solicitud
Escribir y recibir una respuesta rápida