Vaultwarden self-hosted na VPS

Vaultwarden é uma implementação leve e open-source do servidor Bitwarden, compatível com todos os clientes oficiais (extensão de browser, app mobile, desktop). Self-hosteado na VPS, suas senhas ficam exclusivamente na sua infraestrutura, com criptografia end-to-end que nem você consegue quebrar sem a master password.

Instalar Vaultwarden com Docker Compose

Configuração mínima segura para produção:

yaml
# docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    restart: always
    ports:
      - "127.0.0.1:8080:80"
    environment:
      DOMAIN: "https://vault.seudominio.com.br"
      SIGNUPS_ALLOWED: "false"        # desabilitar cadastros públicos
      INVITATIONS_ALLOWED: "true"     # permitir convites por email
      ADMIN_TOKEN: "${ADMIN_TOKEN}"  # token para /admin (gerar com: openssl rand -hex 32)
      WEBSOCKET_ENABLED: "true"       # notificações em tempo real
      LOG_LEVEL: "warn"
      # Configuração de email (necessário para verificação):
      SMTP_HOST: "smtp.gmail.com"
      SMTP_PORT: "587"
      SMTP_FROM: "vault@seudominio.com.br"
      SMTP_USERNAME: "${SMTP_USER}"
      SMTP_PASSWORD: "${SMTP_PASS}"
    volumes:
      - vaultwarden_data:/data

volumes:
  vaultwarden_data:

Configurar Nginx com HTTPS

Vaultwarden requer HTTPS, os clientes Bitwarden recusam conexão sem SSL:

nginx
# /etc/nginx/conf.d/vaultwarden.conf
server {
    listen 80;
    server_name vault.seudominio.com.br;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name vault.seudominio.com.br;

    ssl_certificate     /etc/letsencrypt/live/vault.seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vault.seudominio.com.br/privkey.pem;

    client_max_body_size 128M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # WebSocket para notificações em tempo real
    location /notifications/hub {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

Criar usuários e configurar o admin

Gerenciar usuários e acessar o painel administrativo:

bash
# Acessar painel admin:
# https://vault.seudominio.com.br/admin
# Login com o ADMIN_TOKEN configurado no .env

# No painel admin você pode:
# - Criar convites para novos usuários
# - Ver todos os usuários cadastrados
# - Desabilitar/habilitar contas
# - Ver logs de acesso

# Criar usuário via API (quando SIGNUPS_ALLOWED=false):
# 1. Acessar /admin → Invite User → inserir email
# 2. Usuário receberá email para criar conta

# Configurar 2FA obrigatório para todos os usuários:
# REQUIRE_DEVICE_EMAIL=true  (exige verificação por email em novos dispositivos)

# Restringir por IP (acesso apenas da rede interna):
# No nginx: allow 177.10.0.1; deny all;

# Gerar token admin seguro:
openssl rand -hex 32

Backup automático do vault

Backup crítico, perder o banco do Vaultwarden significa perder todas as senhas:

bash
#!/bin/bash
# /opt/scripts/backup-vaultwarden.sh
set -euo pipefail

DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/var/backups/vaultwarden"
mkdir -p "$BACKUP_DIR"

# O Vaultwarden usa SQLite por padrão
# Backup do banco com SQLite CLI (para evitar corrupção):
docker compose exec -T vaultwarden sqlite3 /data/db.sqlite3 \
  ".backup '/data/backup_${DATE}.sqlite3'"

# Copiar o backup para fora do container
docker compose cp vaultwarden:/data/backup_${DATE}.sqlite3 \
  "$BACKUP_DIR/vault_db_${DATE}.sqlite3"

# Comprimir
gzip "$BACKUP_DIR/vault_db_${DATE}.sqlite3"

# Backup completo do volume (inclui attachments, config)
docker run --rm \
  -v vaultwarden_data:/data \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/vault_volume_${DATE}.tar.gz" /data

# Upload para S3/MinIO
aws s3 cp "$BACKUP_DIR/" s3://meu-bucket/vaultwarden/ --recursive \
  --include "*${DATE}*"

# Limpar backups locais com mais de 30 dias
find "$BACKUP_DIR" -mtime +30 -delete

echo "Backup Vaultwarden concluído: $DATE"

Conectar clientes Bitwarden ao servidor self-hosted

Configurar os clientes oficiais para usar o servidor Vaultwarden:

bash
# Extensão de browser (Chrome, Firefox, Edge):
# 1. Clicar em "Criar conta" ou "Log in"
# 2. Clicar no ícone de engrenagem (Self-hosted Environment)
# 3. Server URL: https://vault.seudominio.com.br
# 4. Criar conta ou fazer login

# App mobile (iOS/Android):
# Bitwarden → Settings → Self-hosted Environment
# Server URL: https://vault.seudominio.com.br

# App desktop (Windows/macOS/Linux):
# Settings → Self-hosted Environment
# Server URL: https://vault.seudominio.com.br

# CLI do Bitwarden:
npm install -g @bitwarden/cli
bw config server https://vault.seudominio.com.br
bw login usuario@email.com
bw sync

# Exportar vault inteiro como backup adicional:
bw export --format json --output vault_backup.json

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Bitwarden oficial: implementação oficial em .NET, requer muitos recursos (4+ GB RAM), todos os recursos do plano Business. Vaultwarden: re-implementação não oficial em Rust, extremamente leve (~50 MB RAM), compatível com todos os clientes Bitwarden, gratuito e open-source. Para self-hosting pessoal ou de pequena equipe: Vaultwarden é sempre a escolha.

Sim, as senhas são criptografadas localmente no cliente com a master password antes de serem enviadas ao servidor. O servidor armazena apenas dados já criptografados. Sem a master password, os dados no servidor são inúteis para um atacante. Essa arquitetura é chamada de "zero-knowledge", nem o servidor (nem você) consegue ler as senhas sem a master password.

Você perde acesso ao vault. Por isso: (1) configure backup automático diário como descrito acima; (2) exporte o vault periodicamente via interface web como arquivo JSON criptografado; (3) armazene o export em local seguro offline. A master password não está no backup, nunca a perca.

Não há limite definido, depende dos recursos da VPS. Para uso pessoal e familiar (2-10 usuários): qualquer VPS com 512 MB RAM é suficiente. Para equipes maiores (100+ usuários): VPS com 1-2 GB RAM. O Vaultwarden é extremamente eficiente em recursos comparado ao Bitwarden oficial.

Sim, via Organizations (organizações). Crie uma organização no Vaultwarden, convide membros e crie Collections (coleções) com senhas compartilhadas. Membros da organização podem acessar as senhas das collections às quais têm acesso, com controles de permissão (can view, can edit). Disponível gratuitamente no Vaultwarden (no Bitwarden cloud, precisa do plano Teams).