¿Por qué Vaultwarden con Tailscale?
Vaultwarden es una implementación alternativa del servidor de Bitwarden, escrita en Rust y mucho más liviana. Tus contraseñas se quedan en tu NAS, cifradas, sin pasar por servidores de terceros. Tailscale maneja el acceso externo seguro usando un sidecar — sin tener que abrir ningún puerto en el router.
Paso 1: Configurar la consola de Tailscale
Este paso se hace una sola vez y te sirve para todos los servicios que instales en el futuro.
- Ve a
https://login.tailscale.com/admin/dns - Activa Enable MagicDNS → On
- Activa Enable HTTPS Certificates → On
- Ve a
https://login.tailscale.com/admin/settings/keys - Clic en Generate auth key → marca Reusable → deja Ephemeral desactivado → Generate
- Copia y guarda la clave (
tskey-auth-xxxxx) — la vas a necesitar en el Paso 4
Paso 2: Crear las carpetas en el NAS
Desde el Administrador de Archivos de UGOS, crea esta estructura dentro de tu carpeta docker:
/docker/vaultwarden/data
/docker/vaultwarden/tailscale/state
/docker/vaultwarden/tailscale/configPaso 3: Crear el archivo serve.json
Dentro de la carpeta /docker/vaultwarden/tailscale/config/, crea un archivo nuevo llamado serve.json con este contenido:
{
"TCP": {
"443": {
"HTTPS": true
}
},
"Web": {
"${TS_CERT_DOMAIN}:443": {
"Handlers": {
"/": {
"Proxy": "http://127.0.0.1:80"
}
}
}
}
}Paso 4: Crear el Stack en Portainer
Ve a Portainer → Stacks → Add Stack. Ponle el nombre vaultwarden. Antes de darle Deploy, reemplaza TU_CLAVE_AQUI con la clave que generaste en el Paso 1, y TU-TAILNET con el nombre de tu red en Tailscale:
version: '3.9'
services:
tailscale:
image: tailscale/tailscale:latest
container_name: vaultwarden-tailscale
hostname: bitwarden
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TS_AUTHKEY=tskey-auth-TU_CLAVE_AQUI
- TS_STATE_DIR=/var/lib/tailscale
- TS_SERVE_CONFIG=/config/serve.json
- TS_EXTRA_ARGS=--accept-dns=true
volumes:
- /docker/vaultwarden/tailscale/state:/var/lib/tailscale
- /docker/vaultwarden/tailscale/config/serve.json:/config/serve.json:ro
- /dev/net/tun:/dev/net/tun
devices:
- /dev/net/tun:/dev/net/tun
restart: unless-stopped
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
network_mode: service:tailscale
environment:
- DOMAIN=https://bitwarden.TU-TAILNET.ts.net
- ROCKET_PORT=80
- WEBSOCKET_ENABLED=true
- SIGNUPS_ALLOWED=true
- LOG_LEVEL=warn
- TZ=America/Puerto_Rico
volumes:
- /docker/vaultwarden/data:/data
restart: unless-stopped
depends_on:
- tailscaleZonas horarias
Cambia el valor de TZ según donde estés:
- Puerto Rico / República Dominicana:
America/Puerto_Rico - Cuba:
America/Havana - México (CDMX):
America/Mexico_City - Colombia / Perú / Ecuador:
America/Bogota - Argentina / Uruguay:
America/Argentina/Buenos_Aires - Chile:
America/Santiago - Venezuela:
America/Caracas - EE.UU. Este:
America/New_York - EE.UU. Oeste:
America/Los_Angeles
Paso 5: Verificar y asegurar
- Portainer → Stacks → vaultwarden → verifica que ambos contenedores estén en running
- Tailscale admin → Machines → debe aparecer
bitwardenen la lista - Abre
https://bitwarden.TU-TAILNET.ts.neten el navegador y crea tu cuenta de administrador - Una vez creada la cuenta, vuelve a Portainer → cambia
SIGNUPS_ALLOWED=trueaSIGNUPS_ALLOWED=false→ Update the stack
Ese último paso es importante — si dejas los registros abiertos cualquiera que llegue a la URL puede crearse una cuenta en tu Vaultwarden.
Conectar los clientes Bitwarden
En la extensión del navegador o la app móvil de Bitwarden, ve a Configuración → Servidor y pon tu URL de Tailscale:
https://bitwarden.TU-TAILNET.ts.netDespués inicia sesión con la cuenta que creaste. Funciona igual que Bitwarden en la nube — la diferencia es que todo está corriendo en tu NAS.
Mi experiencia personal
Vaultwarden lleva meses corriendo sin interrupciones en mi Ugreen NAS. Consume menos de 50 MB de RAM y la sincronización es instantánea en todos mis dispositivos. Migrar desde Bitwarden en la nube fue bien sencillo: exportas tu vault, importas en Vaultwarden, y listo en diez minutos. Desde entonces mis contraseñas no pasan por ningún servidor que no sea el mío.