{"id":405,"date":"2026-09-05T21:23:09","date_gmt":"2026-09-06T00:23:09","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/vaultwarden-bitwarden-self-hosted\/"},"modified":"2026-10-05T14:08:28","modified_gmt":"2026-10-05T17:08:28","slug":"vaultwarden-bitwarden-self-hosted","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/vaultwarden-bitwarden-self-hosted\/","title":{"rendered":"Vaultwarden: Bitwarden self-hosted en Linux"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro girando o volante de um cofre com o emblema do Vaultwarden, com notebook e celular sincronizando senhas e o cachorro caramelo deitado de guarda\" src=\"\/wp-content\/uploads\/2026\/10\/vaultwarden-v5.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<div style=\"background:#fff8e1;border-left:4px solid #8b1a1a;padding:.8em 1em;margin:1em 0\"><strong>Actualizaci\u00f3n (05\/10\/2026):<\/strong> gu\u00eda revisada para la <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\/releases\/tag\/1.37.3\">versi\u00f3n 1.37.3<\/a>, de 13\/09\/2026. Entraron el comando de copia de seguridad integrado, el requisito de volumen persistente, el SSO nativo, las correcciones de seguridad de 1.37.0 y un diagrama de la instalaci\u00f3n.<\/div>\n<p>O <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\">Vaultwarden<\/a> es un servidor <strong>compatible con los clientes oficiales de Bitwarden<\/strong>, escrito en Rust. Cabe en una Raspberry Pi, consume muy poca memoria y ofrece en el autoalojamiento funciones que en Bitwarden oficial requieren plan de pago, como el autenticador TOTP integrado y el acceso de emergencia. No es Bitwarden Inc.: es el proyecto de la comunidad (antes<em>bitwarden_rs<\/em>), bajo licencia AGPL-3.0, actualmente en la <strong>1.37.3<\/strong>.<\/p>\n<p><!-- more --><\/p>\n<p>Si ya tienes un Linux en Internet y no quieres enviar la caja fuerte a la nube de nadie, este es el camino corto: un contenedor, HTTPS delante y las aplicaciones oficiales apuntando a tu dominio.<\/p>\n<h2>Qu\u00e9 es (y qu\u00e9 no es)<\/h2>\n<p>Las aplicaciones (Android, iOS, escritorio, extensi\u00f3n, CLI) hablan la API de Bitwarden, y Vaultwarden implementa esa API. La caja fuerte sigue <strong>cifrada en el cliente<\/strong> (zero-knowledge): los elementos llegan al servidor ya cifrados con una clave derivada de la contrase\u00f1a maestra, y el servidor no puede leerlos.<\/p>\n<ul>\n<li><strong>Sirve para<\/strong> ] a ti, a la familia, al homelab, a un equipo peque\u00f1o. Funciona con SQLite (por defecto), MySQL o PostgreSQL. En nuestra prueba, el contenedor reci\u00e9n iniciado y sin usuarios ocup\u00f3 unos 10 MiB de RAM.<\/li>\n<li><strong>No es adecuado para<\/strong> una empresa que necesita SOC 2, SLA y soporte de Bitwarden Inc. El proyecto <em>no tiene una auditor\u00eda formal equivalente<\/em>. Usted es el backup, el parche y el cortafuegos.<\/li>\n<\/ul>\n<p>Sigue las versiones, porque los clientes oficiales evolucionan r\u00e1pido: la 1.37.0 es necesaria para los clientes 2026.7.0 en adelante, y la 1.37.2 para los 2026.8.0 en adelante. La 1.37.0, de julio de 2026, tambi\u00e9n corrigi\u00f3 un paquete de fallos de seguridad (SSRF en el endpoint de iconos, acceso a elementos entre organizaciones, inundaci\u00f3n de WebSocket sin autenticaci\u00f3n, entre otros), y la 1.37.3 pas\u00f3 a revocar los tokens de \u201crecordar este dispositivo\u201d del 2FA cuando la contrase\u00f1a o el 2FA cambian. Desde la 1.35.0 (diciembre de 2025), el inicio de sesi\u00f3n \u00fanico (SSO) mediante OpenID Connect es nativo, activado con <code data-no-translation=\"\">SSO_ENABLED<\/code>. SCIM y Secrets Manager siguen siendo exclusivos de Bitwarden oficial.<\/p>\n<h2>Levantar con Docker y Caddy<\/h2>\n<p>La v\u00eda recomendada por el proyecto es el contenedor. HTTPS es obligatorio: el web vault utiliza la Web Crypto API, que el navegador solo habilita en un contexto seguro. El <a href=\"\/es\/2026\/10\/caddy-no-linux-servidor-web-com-https-automatico\/\">Caddy<\/a> obtiene y renueva el certificado por s\u00ed solo. (Si Docker a\u00fan es algo nuevo, existe el <a href=\"\/es\/2017\/08\/curso-de-docker-gratis\/\">curso de Docker<\/a>.)<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/vaultwarden-docker-compose-caddy.webp\" alt=\"Diagrama: clientes Bitwarden acessam por HTTPS o container do Caddy, que encaminha para o container do Vaultwarden; os dados ficam no volume vw-data, com db.sqlite3, rsa_key.pem, anexos, sends e config.json; o comando vaultwarden backup gera uma c\u00f3pia do banco, que segue com o tar para uma c\u00f3pia externa\" width=\"1200\" height=\"640\" \/><figcaption>Caddy termina el TLS y solo \u00e9l publica puertos; Vaultwarden queda en la red interna del Compose; el volumen de datos es lo que necesita copia de seguridad.<\/figcaption><\/figure>\n<p>Genere el token del panel de administraci\u00f3n (Argon2) <em>antes<\/em> del compose. El comando pide la contrase\u00f1a dos veces e imprime el hash:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker run --rm -it vaultwarden\/server:1.37.3 \/vaultwarden hash\n<\/code><\/pre>\n<p>Pegue la cadena <code data-no-translation=\"\">$argon2id$...<\/code> en el YAML. En Compose, cada <code data-no-translation=\"\">$<\/code> se convierte en <code data-no-translation=\"\">$$<\/code>.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">mkdir -p \/opt\/vaultwarden &amp;&amp; cd \/opt\/vaultwarden\n<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-yaml\" data-no-translation=\"\"># \/opt\/vaultwarden\/compose.yaml\nservices:\n  vaultwarden:\n    image: vaultwarden\/server:1.37.3\n    container_name: vaultwarden\n    restart: unless-stopped\n    environment:\n      DOMAIN: \"https:\/\/vault.exemplo.com.br\"\n      SIGNUPS_ALLOWED: \"true\"\n      ADMIN_TOKEN: \"$$argon2id$$v=19$$m=65540,t=3,p=4$$COLE_O_HASH\"\n    volumes:\n      - .\/vw-data:\/data\n\n  caddy:\n    image: caddy:2\n    container_name: vw-caddy\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n      - \"443:443\/udp\"\n    volumes:\n      - .\/Caddyfile:\/etc\/caddy\/Caddyfile:ro\n      - caddy_data:\/data\n      - caddy_config:\/config\n    depends_on:\n      - vaultwarden\n\nvolumes:\n  caddy_data:\n  caddy_config:\n<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\"># \/opt\/vaultwarden\/Caddyfile\nvault.exemplo.com.br {\n\tencode zstd gzip\n\treverse_proxy vaultwarden:80\n}\n<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># DNS do dom\u00ednio \u2192 IP desta m\u00e1quina, depois:\ndocker compose up -d\ndocker compose logs -f\ncurl -s https:\/\/vault.exemplo.com.br\/alive<\/code><\/pre>\n<p>O <code data-no-translation=\"\">\/alive<\/code> responde con la fecha y hora del servidor cuando todo est\u00e1 en marcha. No olvides el volumen <code data-no-translation=\"\">.\/vw-data:\/data<\/code>: sin un volumen persistente, la versi\u00f3n actual de Vaultwarden se niega a iniciar y muestra <em>\u00a1No hay volumen persistente!<\/em> en el registro. Es una protecci\u00f3n para que no pierdas la b\u00f3veda al recrear el contenedor.<\/p>\n<p>Quien ya tiene nginx (ISPConfig, por ejemplo) prescinde del servicio Caddy: publique Vaultwarden solo en <code data-no-translation=\"\">127.0.0.1:8000<\/code> y haga proxy con Let's Encrypt en nginx. El WebSocket utiliza el mismo puerto 80 del contenedor; el antiguo puerto 3012 ya no es necesario.<\/p>\n<h2>Primer inicio de sesi\u00f3n y bloquear el registro<\/h2>\n<p>Abre <code data-no-translation=\"\">https:\/\/vault.exemplo.com.br<\/code> y cree <strong>su<\/strong> cuenta. Despu\u00e9s cierre el puerto:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-yaml\" data-no-translation=\"\">SIGNUPS_ALLOWED: \"false\"\n<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker compose up -d\n<\/code><\/pre>\n<p>Las invitaciones posteriores salen del panel <code data-no-translation=\"\">\/admin<\/code>, con el token que generaste. Sin <code data-no-translation=\"\">ADMIN_TOKEN<\/code>, el panel ni siquiera existe \u2014 y as\u00ed debe quedarse si no vas a usarlo. Si usas SSO, la 1.37.3 trajo el <code data-no-translation=\"\">SSO_SIGNUPS_ALLOWED<\/code> para controlar aparte el registro por esa v\u00eda.<\/p>\n<p>Activa el 2FA en la caja fuerte (TOTP o FIDO2) el primer d\u00eda. Es la misma app de Bitwarden; la diferencia es solo el servidor.<\/p>\n<h2>Apuntar los clientes oficiales<\/h2>\n<p>En cualquier app de Bitwarden, en la pantalla de inicio de sesi\u00f3n: <strong>Self-hosted<\/strong> \u2192 pegue <code data-no-translation=\"\">https:\/\/vault.exemplo.com.br<\/code>. Inicia sesi\u00f3n con el correo electr\u00f3nico de la cuenta que creaste. Extensi\u00f3n del navegador, m\u00f3vil y CLI (<code data-no-translation=\"\">bw config server<\/code>) usan la misma URL.<\/p>\n<p>No reportes bugs de Vaultwarden al soporte de Bitwarden Inc. El README es expl\u00edcito: las issues y discusiones van al GitHub y al Matrix del proyecto.<\/p>\n<h2>Backup \u2014 si no tienes, no tienes b\u00f3veda<\/h2>\n<p>El volumen <code data-no-translation=\"\">.\/vw-data<\/code> es la b\u00f3veda: <code data-no-translation=\"\">db.sqlite3<\/code>, <code data-no-translation=\"\">rsa_key.pem<\/code> (firma los tokens de inicio de sesi\u00f3n), adjuntos, Sends y el <code data-no-translation=\"\">config.json<\/code> del panel admin. Copiar el archivo de SQLite con el servicio en ejecuci\u00f3n puede generar una copia incoherente; el propio binario tiene un comando que realiza la copia segura de la base de datos, sin detener nada:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker compose exec vaultwarden \/vaultwarden backup\n# Backup to 'data\/db_20261005_170645.sqlite3' was successful<\/code><\/pre>\n<p>Un script diario que genera esa copia, empaqueta el volumen sin la base de datos \u201cviva\u201d y limpia el temporal:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">#!\/bin\/sh\n# \/usr\/local\/sbin\/vw-backup\nset -eu\ncd \/opt\/vaultwarden\ndocker compose exec -T vaultwarden \/vaultwarden backup\ntar -czf \"\/backup\/vw-$(date +%F).tar.gz\" -C vw-data \\\n  --exclude='db.sqlite3*' --exclude='icon_cache' .\nrm -f vw-data\/db_*.sqlite3<\/code><\/pre>\n<p>Para restaurar, extrae el paquete en un <code data-no-translation=\"\">vw-data<\/code> vac\u00edo, ren\u00f3mbrelo <code data-no-translation=\"\">db_AAAAMMDD_HHMMSS.sqlite3<\/code> para <code data-no-translation=\"\">db.sqlite3<\/code> y levante el Compose. Guarde la copia <em>fuera<\/em> de la m\u00e1quina \u2014 otro disco, otro VPS, un bucket mediante <a href=\"\/es\/2026\/09\/rclone-no-linux-sync-backup-criptografado-mount-e-serve-em-qualquer-nuvem\/\">rclone<\/a> \u2014 y pruebe la restauraci\u00f3n al menos una vez. El <code data-no-translation=\"\">OnCalendar=<\/code> del <a href=\"\/es\/2026\/09\/dominando-o-systemd-comandos-essenciais\/\">systemd<\/a> se encarga de la programaci\u00f3n si no quieres usar cron.<\/p>\n<h2>Actualizando<\/h2>\n<p>Cambie la etiqueta de la imagen en el <code data-no-translation=\"\">compose.yaml<\/code> por la nueva versi\u00f3n, haga la copia de seguridad y vuelva a crear el contenedor:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">\/usr\/local\/sbin\/vw-backup\ndocker compose pull\ndocker compose up -d\ndocker compose logs --tail=30 vaultwarden<\/code><\/pre>\n<p>Fijar la versi\u00f3n (en lugar de <code data-no-translation=\"\">latest<\/code>) deja la actualizaci\u00f3n bajo su control y la reversi\u00f3n sencilla: basta con volver a la etiqueta. Lea las notas de la release antes, sobre todo cuando mencionen compatibilidad con una nueva versi\u00f3n de los clientes.<\/p>\n<h2>Referencias<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\">github.com\/dani-garcia\/vaultwarden<\/a> (AGPL-3.0, v1.37.3)<\/li>\n<li><a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\/wiki\">Wiki<\/a> \u2014 proxy, token de admin, <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\/wiki\/Backing-up-your-vault\">backup<\/a>, <a href=\"https:\/\/github.com\/dani-garcia\/vaultwarden\/wiki\/Enabling-SSO-support-using-OpenId-Connect\">SSO con OpenID Connect<\/a><\/li>\n<li><a href=\"https:\/\/bitwarden.com\/download\/\">Clientes oficiales de Bitwarden<\/a><\/li>\n<\/ul>\n<p>Un binario Rust, un volumen y HTTPS. La b\u00f3veda permanece en el hardware que t\u00fa controlas \u2014 y la aplicaci\u00f3n en el bolsillo sigue siendo la misma.<\/p>","protected":false},"excerpt":{"rendered":"<p>Vaultwarden es un servidor compatible con los clientes oficiales de Bitwarden, escrito en Rust. Gu\u00eda actualizada para la 1.37.3: Docker Compose con Caddy, registro bloqueado, SSO nativo, copia de seguridad con el comando integrado y actualizaci\u00f3n segura.<\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,2,120],"tags":[155,156,158,157,154],"class_list":["post-405","post","type-post","status-publish","format-standard","hentry","category-howtos","category-linux","category-servidores","tag-bitwarden","tag-docker","tag-rust","tag-senhas","tag-vaultwarden"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=405"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/405\/revisions"}],"predecessor-version":[{"id":1799,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/405\/revisions\/1799"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}