Tutoriais de VPS
Instalar o Vaultwarden em uma VPS (2026): guia completo de Docker Compose, HTTPS com Caddy, backup e reforço de segurança
Este tutorial é para usuários que querem auto-hospedar um serviço de gerenciamento de senhas compatível com o Bitwarden em uma VPS de baixo custo. Você vai aprender a implantar o Vaultwarden com Docker Compose, vincular o serviço apenas a uma porta local, fornecer HTTPS com o Caddy, desativar o cadastro público, configurar convites por SMTP, ativar a verificação em duas etapas e, principalmente, dominar backup, restauração, atualização e solução de problemas comuns.
Instalar o Vaultwarden em uma VPS (2026): guia completo de Docker Compose, HTTPS com Caddy, backup e reforço de segurança
Um gerenciador de senhas é um dos melhores serviços para auto-hospedar a longo prazo em uma VPS. Ele não consome disco como álbuns de fotos, drives na nuvem ou bibliotecas de mídia, nem consome GPU e RAM como serviços de IA; mas seu valor é alto: extensões de navegador, apps para celular, clientes desktop, compartilhamento em equipe, senhas aleatórias, verificação em duas etapas e sincronização entre dispositivos afetam diretamente sua segurança diária.
O Vaultwarden é um servidor compatível com o Bitwarden implementado em Rust. Não é o serviço oficial do Bitwarden, mas é compatível com a maioria dos clientes Bitwarden, usa pouquíssimos recursos e é muito adequado para VPS pessoais, equipes pequenas e cenários domésticos. Muitas VPS de 1C1G ou até menores conseguem executá-lo.
Mas justamente porque ele armazena senhas, a implantação não pode se limitar a "a página abre". Este artigo explica as coisas com mentalidade de produção: como implantar o Vaultwarden com Docker Compose, como obter HTTPS automático com o Caddy, por que o cadastro público deve ser desativado, como configurar o SMTP, quais diretórios precisam de backup, o que observar ao restaurar e como reduzir o risco de exposição pública.
Sim.
As vantagens do Vaultwarden são ser leve, estável e ter um ecossistema de clientes maduro. Você pode continuar usando a extensão de navegador, o app para celular e o cliente desktop do Bitwarden; basta trocar o endereço do servidor pelo seu próprio domínio.
Cenários adequados:
- Você quer auto-hospedar um serviço de sincronização de senhas e não quer seu cofre hospedado em uma nuvem de terceiros.
- Você tem uma VPS que fica online a longo prazo e um domínio.
- Você precisa oferecer compartilhamento de senhas para a família ou uma equipe pequena.
- Você quer operar com baixo custo e recursos de máquina limitados.
- Você está disposto a fazer backups e simulações de restauração com seriedade.
Cenários não adequados:
- Você não está disposto a manter as atualizações de segurança do servidor.
- Você não tem um segundo backup e só quer guardar seu cofre em uma única VPS.
- Você vai expor juntos à internet o painel administrativo, a entrada de cadastro e senhas fracas.
- Você espera que o servidor ajude a recuperar a senha mestra caso você a esqueça.
O princípio central de um gerenciador de senhas é: mesmo que o servidor seja comprometido, as senhas em texto puro não devem ser obtidas facilmente; mas o servidor continua muito importante, porque afeta sincronização, login, convites, compartilhamento de organizações e disponibilidade dos dados.
O Vaultwarden tem requisitos de recursos muito baixos:
| Uso | Configuração recomendada |
|---|---|
| Uso pessoal | 1 vCPU / 512MB-1GB RAM / 10GB SSD |
| Família ou equipe pequena | 1-2 vCPU / 1GB RAM / 20GB SSD |
| Muitos usuários e mais anexos | 2 vCPU / 2GB RAM / 40GB+ SSD |
O que realmente importa não é a CPU, mas:
- Se o diretório de dados é persistente.
- Se o domínio usa HTTPS.
- Se o cadastro está desativado.
- Se o SMTP consegue enviar corretamente os e-mails de convite e verificação.
- Se os backups incluem o banco de dados, os anexos e os arquivos de chave.
Se sua VPS executa muitos serviços Docker ao mesmo tempo, recomenda-se ler primeiro os fundamentos de Docker e proxy reverso. Para leitura adicional, veja: Guia completo do proxy reverso Caddy em uma VPS e Instalar o painel de gerenciamento Docker Portainer em uma VPS.
Antes de começar, prepare:
- Uma VPS com Ubuntu 22.04 / 24.04 ou Debian 12.
- Docker Engine e o plugin Docker Compose instalados.
- Um domínio, por exemplo
vault.example.com. - Portas 80/443 abertas.
- Firewall básico e segurança de SSH configurados.
Confirme que o Docker está disponível:
docker version
docker compose version
Confirme que o domínio já resolve para a VPS:
dig vault.example.com +short
Se o domínio ainda não resolve, não se apresse em solicitar certificados. Caddy, Nginx ou Let's Encrypt precisam que o DNS e as portas 80/443 funcionem corretamente.
Recomenda-se colocar o Vaultwarden em /opt/vaultwarden:
sudo mkdir -p /opt/vaultwarden
sudo chown -R "$USER":"$USER" /opt/vaultwarden
cd /opt/vaultwarden
Crie o diretório de dados:
mkdir -p vw-data
Por padrão, o Vaultwarden guarda os dados importantes em /data dentro do contêiner, então precisamos montá-lo em um diretório do host; caso contrário, os dados podem ser perdidos ao excluir o contêiner.
Crie .env:
nano .env
Escreva o conteúdo abaixo, ajustando para o seu próprio domínio:
VAULTWARDEN_DOMAIN=https://vault.example.com
VAULTWARDEN_ADMIN_TOKEN=换成一串很长的随机值
VAULTWARDEN_SMTP_HOST=smtp.example.com
VAULTWARDEN_SMTP_PORT=587
[email protected]
[email protected]
VAULTWARDEN_SMTP_PASSWORD=换成邮箱授权码
Gere um token de administrador aleatório:
openssl rand -base64 48
ADMIN_TOKEN é usado para acessar a página de administração /admin do Vaultwarden. Esse valor é muito sensível; não o escreva em um repositório público nem o envie para outras pessoas.
Se por enquanto você não quiser habilitar o painel administrativo, pode deixar ADMIN_TOKEN sem definir, ou desativar a entrada de administração após a implantação, depois de confirmar que a configuração está correta. Para usuários pessoais, use a página de administração o mínimo possível.
Crie docker-compose.yml:
nano docker-compose.yml
Escreva:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file:
- .env
environment:
DOMAIN: ${VAULTWARDEN_DOMAIN}
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "true"
WEBSOCKET_ENABLED: "true"
ADMIN_TOKEN: ${VAULTWARDEN_ADMIN_TOKEN}
SMTP_HOST: ${VAULTWARDEN_SMTP_HOST}
SMTP_PORT: ${VAULTWARDEN_SMTP_PORT}
SMTP_FROM: ${VAULTWARDEN_SMTP_FROM}
SMTP_USERNAME: ${VAULTWARDEN_SMTP_USERNAME}
SMTP_PASSWORD: ${VAULTWARDEN_SMTP_PASSWORD}
SMTP_SECURITY: starttls
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8000:80"
Aqui há vários pontos-chave:
vaultwarden/server:latesté a imagem oficial de uso comum../vw-data:/dataguarda o banco de dados, os anexos, as chaves e a configuração.127.0.0.1:8000:80significa que apenas o acesso local à porta do contêiner é permitido.SIGNUPS_ALLOWED: "false"desativa o cadastro público.INVITATIONS_ALLOWED: "true"permite que o administrador convide usuários.DOMAINdeve ser preenchido com o domínio HTTPS final; caso contrário, anexos, links de e-mail e sincronização de clientes podem apresentar comportamento anormal.
Se você ainda não configurou o SMTP, pode remover primeiro as variáveis de ambiente relacionadas ao SMTP e adicioná-las depois que a página web abrir. Mas antes do uso formal, recomenda-se configurar o e-mail; caso contrário, convites, verificação e algumas notificações terão uma experiência pior.
Em /opt/vaultwarden, execute:
docker compose up -d
Verifique o status:
docker compose ps
Ver os logs:
docker compose logs -f --tail=100
Teste local:
curl -I http://127.0.0.1:8000
Se retornar HTTP/1.1 200 OK, 301 ou uma resposta semelhante, o contêiner está acessível localmente.
Observação: como vinculamos apenas 127.0.0.1, o acesso público a http://服务器IP:8000 não funcionará; esse é o comportamento esperado. O próximo passo é fazer proxy reverso a partir da 443 com Caddy ou Nginx.
Supondo que seu domínio seja vault.example.com, o Caddyfile pode ser escrito assim:
vault.example.com {
encode zstd gzip
header {
X-Content-Type-Options nosniff
Referrer-Policy strict-origin-when-cross-origin
X-Robots-Tag "noindex, nofollow"
}
reverse_proxy 127.0.0.1:8000 {
header_up X-Real-IP {remote_host}
}
}
Após salvar, execute:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Acesse:
https://vault.example.com
A documentação oficial do Vaultwarden também recomenda usar um proxy reverso para terminar o TLS, em vez de expor diretamente a porta HTTP do contêiner à internet. Assim, apenas a 443 fica exposta publicamente, e a porta do contêiner continua visível apenas localmente.
Se você ainda não tem o Caddy, veja: Guia completo do proxy reverso Caddy em uma VPS.
Após abrir a página web pela primeira vez, crie sua conta principal.
Depois de criada, confirme novamente que o cadastro público está desativado:
docker compose exec vaultwarden printenv SIGNUPS_ALLOWED
Deve exibir:
false
Por que desativar o cadastro? Porque o Vaultwarden é um serviço de gerenciamento de senhas; se a entrada de cadastro ficar aberta a longo prazo, scanners públicos, contas de spam e ataques de credential stuffing aumentarão sua carga de manutenção.
Para adicionar usuários, recomenda-se usar o fluxo de convite: o administrador convida familiares ou membros da equipe, e eles criam a conta por e-mail. Isso é mais controlável do que o cadastro público.
O SMTP é usado principalmente para:
- Convidar novos usuários.
- Verificação de e-mail.
- Algumas notificações de segurança.
- E-mails relacionados a organizações.
Abordagem comum de configuração de e-mail:
VAULTWARDEN_SMTP_HOST=smtp.qq.com
VAULTWARDEN_SMTP_PORT=587
[email protected]
[email protected]
VAULTWARDEN_SMTP_PASSWORD=邮箱授权码
Após modificar .env, reinicie:
docker compose up -d
Depois entre na página de administração ou nas configurações da conta para testar o e-mail.
Observação: muitos provedores de e-mail não permitem usar a senha de login diretamente para SMTP; é preciso gerar separadamente um "código de autorização" ou uma "senha específica de aplicativo". Se você usa e-mail corporativo, confirme também SPF, DKIM, DMARC e os limites de envio; caso contrário, os e-mails podem ir para a caixa de spam.
O Vaultwarden oferece suporte à verificação em duas etapas dos clientes Bitwarden comuns. Recomenda-se fortemente ativar o TOTP pelo menos para a conta de administrador.
Abordagem recomendada:
- Faça login no Web Vault.
- Entre nas configurações de segurança da conta.
- Ative o login em duas etapas.
- Use uma ferramenta TOTP como Aegis, 1Password, Bitwarden Authenticator ou Google Authenticator para guardar os códigos de verificação.
- Salve os códigos de recuperação em um local offline.
Não guarde o TOTP apenas na mesma conta do Vaultwarden. Caso contrário, se você não conseguir fazer login no Vaultwarden e também não conseguir obter o TOTP, ficará trancado para fora.
Uma abordagem mais segura é: memorizar a senha mestra, guardar os códigos de recuperação offline e armazenar o TOTP em um dispositivo ou app separado.
A página /admin do Vaultwarden é prática; permite ver usuários, convites, configuração e status. Mas também é uma entrada de alto valor.
Se você ativar ADMIN_TOKEN, no mínimo deve:
- Usar um token aleatório suficientemente longo.
- Não escrever o token em um repositório público.
- Não salvá-lo em um ambiente de navegador compartilhado.
- Restringir ao máximo a origem de acesso a
/admin.
Uma forma mais conservadora é restringir o caminho de administração no Caddy. Por exemplo, permitir apenas IPs específicos:
vault.example.com {
@admin path /admin*
@not_allowed_admin {
path /admin*
not remote_ip 你的固定IP/32
}
respond @not_allowed_admin "admin access denied" 403
reverse_proxy 127.0.0.1:8000
}
Se você não tem IP fixo, pode considerar acessar o painel administrativo via WireGuard, Tailscale, Cloudflare Zero Trust etc. Quanto menos a entrada de administração for exposta, menor o risco.
O Vaultwarden usa SQLite por padrão, e o diretório de dados geralmente é vw-data. A documentação oficial de backup afirma claramente que os dados importantes incluem:
db.sqlite3: o banco de dados principal.attachments/: anexos.sends/: arquivos Send, faça backup conforme a necessidade.config.json: se você salva a configuração pela página de administração.rsa_key*: usado para assinar tokens de login.
O comando de backup mais simples:
cd /opt/vaultwarden
mkdir -p /opt/backups/vaultwarden
docker exec vaultwarden /vaultwarden backup
tar czf /opt/backups/vaultwarden/vw-data-$(date +%F-%H%M).tar.gz vw-data
A partir do Vaultwarden 1.32.1, a imagem oferece um comando de backup SQLite integrado:
docker exec -it vaultwarden /vaultwarden backup
Não deixe os arquivos de backup apenas na mesma VPS. Recomenda-se sincronizá-los também para:
- Outra VPS.
- Armazenamento de objetos.
- Um NAS doméstico.
- Um diretório de nuvem criptografado.
Se você já tem uma solução de backup, pode adicionar o Vaultwarden a ela. Leitura adicional: Qual é a diferença entre snapshots, backups e imagens de VPS.
Antes de restaurar, pare o serviço:
cd /opt/vaultwarden
docker compose down
Preserve o diretório atual:
mv vw-data vw-data.broken.$(date +%F-%H%M)
Descompacte o backup:
tar xzf /opt/backups/vaultwarden/vw-data-你的日期.tar.gz -C /opt/vaultwarden
Inicie:
docker compose up -d
docker compose logs -f --tail=100
Depois verifique:
- Se consegue fazer login.
- Se as entradas de senha existem.
- Se os anexos podem ser baixados.
- Se o compartilhamento da organização funciona normalmente.
- Se o celular e a extensão do navegador conseguem sincronizar.
Um backup não é "bem-sucedido só porque o arquivo existe"; ele só é confiável após uma simulação de restauração. Isso vale especialmente para gerenciadores de senhas, porque a última coisa que você quer é tentar restaurar pela primeira vez durante uma falha real.
Se você usa latest, o processo de atualização é simples:
cd /opt/vaultwarden
cp docker-compose.yml docker-compose.yml.bak.$(date +%F)
cp .env .env.bak.$(date +%F)
docker compose pull
docker compose up -d
Após atualizar, verifique os logs:
docker compose logs -f --tail=100
Uma abordagem mais cautelosa é fixar a tag de versão, por exemplo:
image: vaultwarden/server:1.36.0
Usuários pessoais podem usar latest por conveniência, mas em produção ou em equipes recomenda-se mais fixar versões e atualizar após testar. De qualquer forma, faça backup de vw-data antes de atualizar.
Primeiro verifique o contêiner:
docker compose ps
docker compose logs --tail=100
Depois verifique a porta local:
ss -lntp | grep 8000
curl -I http://127.0.0.1:8000
Se o curl local não funcionar, o problema está no contêiner; se o local funcionar mas o domínio não, o problema geralmente está no Caddy, no DNS, no firewall ou no grupo de segurança.
Verifique se o endereço do proxy reverso do Caddy corresponde à porta do Compose:
Compose: 127.0.0.1:8000:80
Caddy: reverse_proxy 127.0.0.1:8000
As portas dos dois lados devem corresponder. Após modificar, execute:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Verifique especialmente DOMAIN:
docker compose exec vaultwarden printenv DOMAIN
Deve ser um endereço HTTPS completo:
https://vault.example.com
Não escreva apenas o domínio, nem escreva HTTP.
Verifique a configuração SMTP:
docker compose logs --tail=200 | grep -i smtp
Causas comuns:
- A senha SMTP não é um código de autorização.
- A porta e o método de criptografia não correspondem.
- O provedor de e-mail restringe clientes de terceiros.
- O SMTP de saída da VPS é restrito pelo provedor de nuvem.
- O endereço do remetente e a conta não correspondem.
Se a porta 25 estiver bloqueada, prefira 587 + STARTTLS ou 465 + SSL.
Use o recurso de convite. Você pode convidar novos usuários pela página de administração ou por uma organização. Não abra temporariamente o cadastro público a longo prazo só para convidar uma pessoa.
Se precisar ativá-lo temporariamente:
SIGNUPS_ALLOWED: "true"
Volte imediatamente após criar a conta:
SIGNUPS_ALLOWED: "false"
Depois:
docker compose up -d
Antes de publicar, confirme item por item:
- O domínio usa HTTPS.
- A porta do contêiner está vinculada apenas a
127.0.0.1. -
SIGNUPS_ALLOWED=false. - A conta de administrador usa uma senha mestra forte.
- O administrador ativou o TOTP.
- O SMTP está disponível.
-
/adminestá restrito ou não está ativado. -
vw-datafoi copiado para um segundo local. - Uma simulação de restauração foi realizada.
- O sistema da VPS é atualizado periodicamente.
- O SSH não usa senhas fracas.
Um gerenciador de senhas não é um blog comum. Mesmo que o Vaultwarden seja suficientemente leve, os hábitos de implantação precisam ser mais cautelosos.
Os passos principais para instalar o Vaultwarden em uma VPS não são complicados: criar o diretório de dados, escrever o Docker Compose, persistir /data, usar 127.0.0.1:8000:80 para evitar expor diretamente a porta do contêiner e depois fazer proxy reverso de https://vault.example.com com o Caddy.
O que realmente determina a segurança são estes detalhes posteriores: desativar o cadastro público, configurar o SMTP para convidar usuários, ativar a verificação em duas etapas para o administrador, restringir /admin, fazer backups periódicos de vw-data e realmente testar a restauração.
Se você tem apenas uma VPS de baixa configuração, o Vaultwarden é um serviço auto-hospedado que vale muito a pena implantar; mas se você não está disposto a manter backups e atualizações de segurança, o serviço de nuvem oficial do Bitwarden pode ser mais tranquilo. A liberdade do auto-hospedagem precisa vir acompanhada da responsabilidade do auto-hospedagem.