Guía Completa: Instalación de Vaultwarden con Caddy en Ubuntu 24.04 – Gestor de Contraseñas Auto-hospedado

Published:

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:

  1. Acceder a la Interfaz Web: https://vaultwarden.tudominio.com

  2. Crear Cuenta: Usar email administrativo y contraseña fuerte

  3. 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:

  1. Instalar extensión Bitwarden desde Chrome Web Store

  2. Configurar servidor personalizado: https://vaultwarden.tudominio.com

  3. Iniciar sesión con credenciales creadas

Aplicación Móvil:

  1. Descargar app Bitwarden desde tienda oficial

  2. Configurar servidor en Settings → Self-hosted environment

  3. 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:

  1. Configurar DNS para tu dominio

  2. Establecer políticas de backup y recovery

  3. Implementar monitoreo adicional (Prometheus, Grafana)

  4. 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.

- Advertisement -
Jorge
Jorgehttps://nksistemas.com
Soy Jorge, Sr Sysadmin Linux/DevOps/SRE y creador de NKSistemas.com Trabajo con plataformas: Linux, Windows, AWS, GCP, VMware, Helm, kubernetes, Docker, etc.

Related articles