# Vaultwarden Servidor de gestión de contraseñas compatible con Bitwarden, escrito en Rust. Implementación ligera y eficiente que permite autoalojar tu propio gestor de contraseñas con todas las características de Bitwarden. ## Características - 🔐 **Compatible con Bitwarden**: Funciona con todas las aplicaciones oficiales de Bitwarden - 🚀 **Ligero y rápido**: Escrito en Rust, consume menos recursos que Bitwarden oficial - 📱 **Multiplataforma**: Clientes para móvil, escritorio, navegador y CLI - 🔄 **Sincronización en tiempo real**: WebSocket para actualizaciones instantáneas - 🔒 **Cifrado de extremo a extremo**: Tus contraseñas están cifradas localmente - 👥 **Organizaciones**: Comparte contraseñas de forma segura con equipos - 🌐 **Autoalojado**: Control total sobre tus datos ## Requisitos Previos - Docker Engine instalado - Portainer configurado (recomendado) - **Para Traefik o NPM**: Red Docker `proxy` creada - **Dominio configurado**: Vaultwarden requiere HTTPS para funcionar correctamente - **ADMIN_TOKEN generado**: Token seguro para acceder al panel de administración ⚠️ **IMPORTANTE - Seguridad**: Vaultwarden requiere HTTPS en producción. Los clientes de Bitwarden no funcionarán correctamente con HTTP. ## Despliegue con Portainer ### Opción A: Git Repository (Recomendada) Permite mantener la configuración actualizada automáticamente desde Git. 1. En Portainer, ve a **Stacks** → **Add stack** 2. Nombra el stack: `vaultwarden` 3. Selecciona **Git Repository** 4. Configura: - **Repository URL**: `https://git.ictiberia.com/groales/vaultwarden` - **Repository reference**: `refs/heads/main` - **Compose path**: `docker-compose.yml` - **Additional paths**: Elige según tu proxy: - Para Traefik: `docker-compose.override.traefik.yml.example` - Para NPM: `docker-compose.override.npm.yml.example` - Para Standalone: `docker-compose.override.standalone.yml.example` (⚠️ no recomendado) 5. En **Environment variables**, añade: **Para Traefik o NPM**: ``` DOMAIN=https://vaultwarden.tudominio.com DOMAIN_HOST=vaultwarden.tudominio.com ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` **Para Standalone** (solo testing): ``` DOMAIN=http://IP-DEL-SERVIDOR:8080 ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` 6. Haz clic en **Deploy the stack** #### Generar ADMIN_TOKEN Es **crítico** generar un token fuerte para proteger el panel de administración: ```bash openssl rand -base64 48 ``` O usa cualquier generador de contraseñas seguro con mínimo 32 caracteres. #### Configuración de WebSocket - **Traefik**: Ya configurado en el override - **NPM**: Debes habilitar **WebSocket Support** en la configuración del Proxy Host desde la interfaz de NPM ### Opción B: Web Editor Copia y pega el contenido consolidado según tu configuración de proxy. 1. En Portainer, ve a **Stacks** → **Add stack** 2. Nombra el stack: `vaultwarden` 3. Selecciona **Web editor** 4. Copia el contenido según tu entorno:
📋 Despliegue con Traefik ```yaml services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest restart: unless-stopped environment: DOMAIN: ${DOMAIN} SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED:-false} ADMIN_TOKEN: ${ADMIN_TOKEN} WEBSOCKET_ENABLED: true LOG_FILE: /data/vaultwarden.log LOG_LEVEL: warn TZ: Europe/Madrid volumes: - vaultwarden_data:/data networks: - proxy labels: # HTTP → HTTPS redirect - "traefik.enable=true" - "traefik.http.routers.vaultwarden-http.rule=Host(`${DOMAIN_HOST}`)" - "traefik.http.routers.vaultwarden-http.entrypoints=web" - "traefik.http.routers.vaultwarden-http.middlewares=redirect-to-https@docker" # HTTPS router for main service - "traefik.http.routers.vaultwarden.rule=Host(`${DOMAIN_HOST}`)" - "traefik.http.routers.vaultwarden.entrypoints=websecure" - "traefik.http.routers.vaultwarden.tls=true" - "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt" - "traefik.http.routers.vaultwarden.service=vaultwarden-svc" - "traefik.http.services.vaultwarden-svc.loadbalancer.server.port=80" # WebSocket support for /notifications/hub - "traefik.http.routers.vaultwarden-ws.rule=Host(`${DOMAIN_HOST}`) && Path(`/notifications/hub`)" - "traefik.http.routers.vaultwarden-ws.entrypoints=websecure" - "traefik.http.routers.vaultwarden-ws.tls=true" - "traefik.http.routers.vaultwarden-ws.tls.certresolver=letsencrypt" - "traefik.http.routers.vaultwarden-ws.service=vaultwarden-ws-svc" - "traefik.http.services.vaultwarden-ws-svc.loadbalancer.server.port=3012" # Redirect middleware - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true" networks: proxy: external: true volumes: vaultwarden_data: driver: local ``` **Variables de entorno necesarias**: ``` DOMAIN=https://vaultwarden.tudominio.com DOMAIN_HOST=vaultwarden.tudominio.com ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ```
📋 Despliegue con Nginx Proxy Manager ```yaml services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest restart: unless-stopped environment: DOMAIN: ${DOMAIN} SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED:-false} ADMIN_TOKEN: ${ADMIN_TOKEN} WEBSOCKET_ENABLED: true LOG_FILE: /data/vaultwarden.log LOG_LEVEL: warn TZ: Europe/Madrid volumes: - vaultwarden_data:/data networks: - proxy networks: proxy: external: true volumes: vaultwarden_data: driver: local ``` **Variables de entorno necesarias**: ``` DOMAIN=https://vaultwarden.tudominio.com ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` **⚠️ IMPORTANTE**: Debes configurar en NPM: 1. Crea un Proxy Host apuntando a `vaultwarden:80` 2. **Habilita "WebSocket Support"** en la pestaña Advanced 3. Configura SSL con Let's Encrypt
📋 Despliegue Standalone (Solo Testing) ⚠️ **NO RECOMENDADO**: Vaultwarden requiere HTTPS para funcionar correctamente con los clientes oficiales de Bitwarden. ```yaml services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest restart: unless-stopped environment: DOMAIN: ${DOMAIN} SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED:-false} ADMIN_TOKEN: ${ADMIN_TOKEN} WEBSOCKET_ENABLED: true LOG_FILE: /data/vaultwarden.log LOG_LEVEL: warn TZ: Europe/Madrid volumes: - vaultwarden_data:/data ports: - "8080:80" - "3012:3012" volumes: vaultwarden_data: driver: local ``` **Variables de entorno necesarias**: ``` DOMAIN=http://IP-DEL-SERVIDOR:8080 ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` **Acceso**: - HTTP: `http://IP-DEL-SERVIDOR:8080` - WebSocket: `ws://IP-DEL-SERVIDOR:3012`
5. En **Environment variables**, añade las variables correspondientes 6. Haz clic en **Deploy the stack** ## Despliegue con Docker CLI ### 1. Clonar el repositorio ```bash git clone https://git.ictiberia.com/groales/vaultwarden.git cd vaultwarden ``` ### 2. Elegir modo de despliegue #### Opción A: Traefik ```bash cp docker-compose.override.traefik.yml.example docker-compose.override.yml ``` Crear archivo `.env`: ```env DOMAIN=https://vaultwarden.tudominio.com DOMAIN_HOST=vaultwarden.tudominio.com ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` #### Opción B: Nginx Proxy Manager ```bash cp docker-compose.override.npm.yml.example docker-compose.override.yml ``` Crear archivo `.env`: ```env DOMAIN=https://vaultwarden.tudominio.com ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` ⚠️ No olvides habilitar **WebSocket Support** en la configuración del Proxy Host en NPM. #### Opción C: Standalone (solo testing) ```bash cp docker-compose.override.standalone.yml.example docker-compose.override.yml ``` Crear archivo `.env`: ```env DOMAIN=http://IP-DEL-SERVIDOR:8080 ADMIN_TOKEN=tu_token_admin_seguro_generado SIGNUPS_ALLOWED=false ``` ### 3. Generar ADMIN_TOKEN ```bash openssl rand -base64 48 ``` Añade el resultado a tu archivo `.env`. ### 4. Iniciar el servicio ```bash docker compose up -d ``` ### 5. Verificar el despliegue ```bash docker compose logs -f vaultwarden ``` ## Configuración Inicial ### 1. Acceder al Panel de Administración Visita `https://vaultwarden.tudominio.com/admin` e introduce tu `ADMIN_TOKEN`. ### 2. Configuración Recomendada En el panel de administración: - **General Settings**: - `Domain URL`: `https://vaultwarden.tudominio.com` - `Require Email Verification`: Activar si tienes SMTP - `Show password hints`: Desactivar por seguridad - **User Settings**: - `Allow new signups`: `false` (salvo que lo necesites) - `Invitation Organization Name`: Tu organización - **Advanced Settings**: - `Enable WebSocket`: `true` (ya configurado) - `Enable Admin Interface`: `true` ### 3. Configurar SMTP (Opcional pero Recomendado) Para recuperación de contraseñas y verificación de email: ```env SMTP_HOST=smtp.tudominio.com SMTP_PORT=587 SMTP_SECURITY=starttls SMTP_USERNAME=vaultwarden@tudominio.com SMTP_PASSWORD=tu_password_smtp SMTP_FROM=vaultwarden@tudominio.com ``` ### 4. Crear tu Primera Cuenta 1. Ve a `https://vaultwarden.tudominio.com` 2. Haz clic en **Create Account** 3. Introduce tu email y una contraseña maestra **fuerte** 4. Verifica tu email (si configuraste SMTP) ⚠️ **La contraseña maestra NO se puede recuperar**. Guárdala de forma segura. ## Clientes de Bitwarden Vaultwarden es compatible con todos los clientes oficiales de Bitwarden: - **Navegador**: Extensiones para Chrome, Firefox, Edge, Safari - **Escritorio**: Windows, macOS, Linux - **Móvil**: iOS, Android - **CLI**: `bw` (para scripts y automatización) ### Configurar Cliente Al crear cuenta o iniciar sesión: 1. Haz clic en el ⚙️ en la pantalla de login 2. En **Server URL** introduce: `https://vaultwarden.tudominio.com` 3. Inicia sesión con tu email y contraseña maestra ## Integración con Traefik El archivo `docker-compose.override.traefik.yml.example` incluye: - ✅ Redirección automática HTTP → HTTPS - ✅ Certificados SSL con Let's Encrypt - ✅ Soporte completo para WebSocket (`/notifications/hub`) - ✅ Headers de seguridad Requiere: - Red Docker `proxy` existente - Traefik configurado con certificados Let's Encrypt - Variables: `DOMAIN` (con protocolo) y `DOMAIN_HOST` (solo dominio) ## Integración con Nginx Proxy Manager El archivo `docker-compose.override.npm.yml.example` es minimalista. **Configuración en NPM**: 1. **Proxy Hosts** → **Add Proxy Host** 2. **Details**: - Domain Names: `vaultwarden.tudominio.com` - Scheme: `http` - Forward Hostname / IP: `vaultwarden` - Forward Port: `80` - ✅ **Websockets Support**: **ACTIVAR** - ✅ Block Common Exploits 3. **SSL**: - ✅ Force SSL - SSL Certificate: Request a new SSL Certificate (Let's Encrypt) ## Backup y Restauración ### Backup Manual ```bash # Detener el contenedor docker compose stop vaultwarden # Backup del volumen docker run --rm -v vaultwarden_data:/data -v $(pwd):/backup alpine \ tar czf /backup/vaultwarden-backup-$(date +%Y%m%d).tar.gz -C /data . # Reiniciar el contenedor docker compose start vaultwarden ``` ### Restauración ```bash # Detener el contenedor docker compose stop vaultwarden # Restaurar desde backup docker run --rm -v vaultwarden_data:/data -v $(pwd):/backup alpine \ sh -c "cd /data && tar xzf /backup/vaultwarden-backup-20240101.tar.gz" # Reiniciar el contenedor docker compose start vaultwarden ``` ### Backup Automático Considera usar una solución de backup automático como: - [docker-volume-backup](https://github.com/offen/docker-volume-backup) - Cron job con el script de backup manual - Duplicati configurado para el directorio de datos ⚠️ **CRÍTICO**: Un gestor de contraseñas requiere backups regulares y probados. ## Actualización ### Desde Portainer (Git Repository) 1. Ve a tu stack `vaultwarden` 2. Haz clic en **Pull and redeploy** ### Desde CLI ```bash docker compose pull docker compose up -d ``` Docker Compose recreará automáticamente el contenedor con la nueva imagen manteniendo tus datos intactos. ## Solución de Problemas ### El cliente no puede conectar **Síntomas**: Error de conexión en la app móvil o extensión del navegador **Soluciones**: 1. Verifica que usas HTTPS (los clientes requieren conexión segura) 2. Comprueba que el certificado SSL es válido 3. Revisa que la variable `DOMAIN` incluye el protocolo completo 4. Verifica acceso desde navegador: `https://vaultwarden.tudominio.com` ### WebSocket no funciona **Síntomas**: Las contraseñas no se sincronizan en tiempo real **Soluciones**: **Para Traefik**: ```bash # Verificar que existen los routers de WebSocket docker compose logs vaultwarden | grep websocket ``` **Para NPM**: 1. Edita el Proxy Host 2. Pestaña **Advanced** 3. ✅ Activa **Websockets Support** **Para Standalone**: - Verifica que el puerto 3012 está publicado y accesible ### Error de ADMIN_TOKEN **Síntomas**: No puedes acceder a `/admin` **Soluciones**: ```bash # Verificar que la variable está configurada docker compose exec vaultwarden env | grep ADMIN_TOKEN # Regenerar token openssl rand -base64 48 # Actualizar .env o variables de Portainer y redesplegar ``` ### Problemas de rendimiento **Síntomas**: Aplicación lenta **Soluciones**: 1. Vaultwarden usa SQLite por defecto, que es eficiente para < 1000 usuarios 2. Para instalaciones grandes, considera migrar a PostgreSQL 3. Revisa los logs: `docker compose logs vaultwarden` ### Ver logs detallados ```bash # Logs en tiempo real docker compose logs -f vaultwarden # Logs dentro del contenedor docker compose exec vaultwarden cat /data/vaultwarden.log ``` ### Reiniciar completamente ```bash # Cuidado: esto eliminará TODOS tus datos docker compose down -v docker compose up -d ``` ## Recursos Adicionales - [Documentación Oficial de Vaultwarden](https://github.com/dani-garcia/vaultwarden/wiki) - [Clientes de Bitwarden](https://bitwarden.com/download/) - [Wiki de este repositorio](https://git.ictiberia.com/groales/vaultwarden/wiki) - [Repositorio en Gitea](https://git.ictiberia.com/groales/vaultwarden) ## Seguridad - ⚠️ **Nunca** compartas tu ADMIN_TOKEN - ⚠️ Usa una contraseña maestra fuerte y única - ⚠️ Habilita 2FA en tu cuenta de Vaultwarden - ⚠️ Realiza backups regulares y pruébalos - ⚠️ Mantén actualizado el contenedor - ⚠️ Usa HTTPS en producción (obligatorio) ## Licencia Este repositorio de configuración está bajo licencia MIT. Vaultwarden es software libre bajo licencia GPL-3.0.