Vaultwarden emerge como una alternativa eficiente y liviana al servidor oficial de Bitwarden, escrita en Rust y perfecta para despliegues auto-hospedados. Esta guía detallada cubre la instalación completa en Ubuntu 24.04 utilizando Docker y Caddy para un setup seguro y mantenible.
Arquitectura de la Solución
Componentes Clave:
-
Vaultwarden: Servidor de contraseñas compatible con clientes Bitwarden
-
Caddy: Servidor web con HTTPS automático via Let’s Encrypt
-
Docker: Contenerización para aislamiento y fácil mantenimiento
-
Ubuntu 24.04: Sistema base estable y de largo soporte
Preparación del Sistema
Actualización Inicial:
sudo apt update && sudo apt upgrade -y sudo reboot
Instalación de Dependencias:
sudo apt install ca-certificates curl gnupg lsb-release -y
Instalación de Docker desde Repositorios Oficiales
Configuración de Repositorio:
# Crear directorio para llaves GPG sudo install -m 0755 -d /etc/apt/keyrings # Descargar e instalar llave GPG oficial curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Agregar repositorio Docker echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Actualizar lista de paquetes sudo apt update
Instalación de Docker Engine:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y # Verificar instalación sudo docker --version # Debe mostrar: Docker version 28.3.3 o superior
Configuración Post-Instalación:
# Habilitar Docker en el arranque sudo systemctl enable docker sudo systemctl start docker # Agregar usuario actual al grupo docker sudo usermod -aG docker $USER # Recargar grupos (requiere re-login) newgrp docker
Creación de Usuario Dedicado para Vaultwarden
Configuración de Usuario Seguro:
# Crear usuario dedicado sudo useradd -G docker -s /bin/bash -m -d /opt/vaultwarden-user vaultwarden-user # Establecer contraseña segura sudo passwd vaultwarden-user # Cambiar al usuario dedicado sudo su - vaultwarden-user
Configuración de Vaultwarden con Docker Compose
Estructura de Directorios:
# Crear estructura de directorios organizada mkdir -p ~/vaultwarden/{vw-data,caddy,caddy-config,caddy-data,backups} # Navegar al directorio principal cd ~/vaultwarden
Archivo docker-compose.yaml:
version: '3.8' services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: - WEBSOCKET_ENABLED=true - SIGNUPS_ALLOWED=true - INVITATIONS_ALLOWED=true - ADMIN_TOKEN=${ADMIN_TOKEN:-} volumes: - ./vw-data:/data - ./backups:/backups networks: - vaultwarden-net caddy: image: caddy:2-alpine container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - ./caddy-config:/config - ./caddy-data:/data environment: - DOMAIN=${DOMAIN} - EMAIL=${EMAIL} depends_on: - vaultwarden networks: - vaultwarden-net networks: vaultwarden-net: driver: bridge
Archivo de Variables de Entorno (.env):
# Crear archivo de configuración cat > .env << EOF DOMAIN=vaultwarden.tudominio.com [email protected] ADMIN_TOKEN=$(openssl rand -base64 48) EOF # Proteger archivo de configuración chmod 600 .env
Configuración Avanzada de Caddy
Archivo Caddyfile Optimizado:
{$DOMAIN} {
# Logging configuration
log {
level INFO
output file /data/access.log {
roll_size 10MB
roll_keep 10
}
}
# Automatic HTTPS with Let's Encrypt
tls {$EMAIL}
# Security headers
header {
# Enable HSTS
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Enable cross-site filter (XSS)
X-XSS-Protection "1; mode=block"
# Disallow the site to be rendered within a frame
X-Frame-Options "DENY"
# Prevent MIME type sniffing
X-Content-Type-Options "nosniff"
# Referrer policy
Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:"
# Remove server identification
-Server
}
# Enable compression
encode gzip
# WebSocket endpoint for real-time notifications
reverse_proxy /notifications/hub vaultwarden:3012 {
header_up X-Real-IP {remote_host}
}
# Main application
reverse_proxy vaultwarden:80 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
header_up Host {host}
}
# Health check endpoint
@health {
path /alive
method GET
}
respond @health 200
}
Despliegue y Verificación
Inicio de los Servicios:
# Levantar los contenedores docker compose up -d # Verificar estado docker compose ps docker compose logs -f # Verificar que los servicios están escuchando ss -tulpn | grep -E '(80|443)'
Verificación de SSL Automático:
# Verificar certificado SSL curl -I https://${DOMAIN} # Probar endpoint de salud curl https://${DOMAIN}/alive
Configuración Inicial de Vaultwarden
Creación de Cuenta Administrativa:
-
Acceder a la Interfaz Web:
https://vaultwarden.tudominio.com -
Crear Cuenta: Usar email administrativo y contraseña fuerte
-
Verificar Cuenta: Confirmar via email si está configurado
Configuración de Panel de Administración:
# Generar token administrativo ADMIN_TOKEN=$(openssl rand -base64 48) echo "ADMIN_TOKEN=${ADMIN_TOKEN}" >> .env # Recargar configuración docker compose down docker compose up -d
Acceso al Panel Admin:
-
URL:
https://vaultwarden.tudominio.com/admin -
Token: Usar el token generado en el paso anterior
Configuración de Clientes Bitwarden
Extensión Navegador:
-
Instalar extensión Bitwarden desde Chrome Web Store
-
Configurar servidor personalizado:
https://vaultwarden.tudominio.com -
Iniciar sesión con credenciales creadas
Aplicación Móvil:
-
Descargar app Bitwarden desde tienda oficial
-
Configurar servidor en Settings → Self-hosted environment
-
Usar la URL de tu instancia Vaultwarden
Hardening de Seguridad
Deshabilitar Registros Públicos:
# En docker-compose.yaml, agregar: environment: - SIGNUPS_ALLOWED=false - INVITATIONS_ALLOWED=false
Configuración de Backup Automático:
# Script de backup cat > /opt/vaultwarden-user/backup.sh << 'EOF' #!/bin/bash BACKUP_DIR="/opt/vaultwarden-user/vaultwarden/backups" DATE=$(date +%Y%m%d_%H%M%S) docker compose exec -T vaultwarden sqlite3 /data/db.sqlite3 ".backup '/backups/db_backup_${DATE}.sqlite3'" tar -czf "${BACKUP_DIR}/vaultwarden_backup_${DATE}.tar.gz" -C /opt/vaultwarden-user/vaultwarden vw-data # Rotación: mantener últimos 30 días find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +30 -delete echo "Backup completado: ${BACKUP_DIR}/vaultwarden_backup_${DATE}.tar.gz" EOF chmod +x /opt/vaultwarden-user/backup.sh # Agregar a cron para backups diarios (crontab -l ; echo "0 2 * * * /opt/vaultwarden-user/backup.sh") | crontab -
Monitoreo y Mantenimiento
Comandos de Administración:
# Ver logs en tiempo real docker compose logs -f vaultwarden # Ver estado de recursos docker stats # Actualizar contenedores docker compose pull docker compose up -d # Backup de base de datos docker compose exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '/backups/db_backup_$(date +%Y%m%d).sqlite3'"
Script de Health Check:
cat > /opt/vaultwarden-user/health-check.sh << 'EOF' #!/bin/bash RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" https://${DOMAIN}/alive) if [ "$RESPONSE" != "200" ]; then echo "ALERTA: Vaultwarden no responde. Reiniciando..." docker compose restart # Aquí puedes agregar notificación por email fi EOF
Solución de Problemas Comunes
Problemas de Certificado SSL:
# Verificar configuración Caddy docker compose logs caddy # Forzar renovación de certificado docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
Problemas de Conexión a Base de Datos:
# Verificar permisos de volumen sudo chown -R 1000:1000 /opt/vaultwarden-user/vaultwarden/vw-data # Verificar integridad de base de datos docker compose exec vaultwarden sqlite3 /data/db.sqlite3 "PRAGMA integrity_check;"
Problemas de Memoria:
# Monitorear uso de recursos docker stats vaultwarden # Optimizar base de datos docker compose exec vaultwarden sqlite3 /data/db.sqlite3 "VACUUM;"
Conclusión
Con esta implementación, has desplegado un gestor de contraseñas auto-hospedado completo y seguro que ofrece:
-
✅ Alto Rendimiento: Implementación en Rust con baja huella de memoria
-
✅ Seguridad Automática: Caddy con HTTPS y renovación automática
-
✅ Alta Disponibilidad: Contenerización con reinicio automático
-
✅ Backups Automáticos: Sistema de respaldo y rotación
-
✅ Compatibilidad Total: Clients oficiales de Bitwarden soportados
-
✅ Fácil Mantenimiento: Docker Compose para gestión simplificada
Próximos Pasos Recomendados:
-
Configurar DNS para tu dominio
-
Establecer políticas de backup y recovery
-
Implementar monitoreo adicional (Prometheus, Grafana)
-
Configurar autenticación adicional si se expone a internet
Esta solución provee una alternativa privada y controlada a servicios cloud de gestión de contraseñas, manteniendo toda tu información segura bajo tu control directo.






