Vaultwarden — self-hosted menedżer haseł Bitwarden na VPS
Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo
Menedżer haseł to jedno z najważniejszych narzędzi bezpieczeństwa — ale czy musisz ufać vendorowi z wszystkimi swoimi hasłami? Vaultwarden to lekka, self-hosted implementacja API Bitwarden napisana w Rust. Działa na VPS za 20 PLN/msc, zużywa zaledwie 20–50 MB RAM i obsługuje wszystkie oficjalne klienty Bitwarden. Hasła szyfrowane są lokalnie w przeglądarce — serwer nigdy nie widzi ich niezaszyfrowanej wersji. Ten artykuł pokazuje pełną instalację przez Docker, konfigurację HTTPS i zarządzanie organizacjami dla zespołów.
Instalacja Docker
Vaultwarden wymaga HTTPS — przeglądarka odmówi połączenia przez HTTP (Web Crypto API wymaga bezpiecznego kontekstu). Potrzebujesz domeny z certyfikatem SSL przed pierwszym uruchomieniem:
# Utwórz katalog danych
mkdir -p /opt/vaultwarden/vw-data
# docker-compose.yml
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
ADMIN_TOKEN: "" # wygeneruj: openssl rand -base64 48
SIGNUPS_ALLOWED: "false" # wylacz po utworzeniu kont
INVITATIONS_ALLOWED: "true"
SMTP_HOST: "smtp.example.com"
SMTP_PORT: "587"
SMTP_SECURITY: "starttls"
SMTP_USERNAME: "[email protected]"
SMTP_PASSWORD: "smtp_password"
SMTP_FROM: "[email protected]"
SMTP_FROM_NAME: "Vaultwarden"
LOG_FILE: "/data/vaultwarden.log"
LOG_LEVEL: "warn"
volumes:
- /opt/vaultwarden/vw-data:/data
ports:
- "127.0.0.1:8080:80" # tylko localhost — Nginx proxuje
docker compose up -d
docker compose logs -f vaultwarden Konfiguracja Nginx i Let's Encrypt
Vaultwarden nie ma wbudowanego TLS — Nginx obsługuje HTTPS i przekazuje ruch do kontenera. Możesz też użyć Caddy — automatycznie zarządza certyfikatami Let's Encrypt:
# Certbot - generuj certyfikat przed uruchomieniem Nginx
certbot certonly --standalone -d vault.example.com
# /etc/nginx/sites-available/vaultwarden
server {
listen 443 ssl http2;
server_name vault.example.com;
ssl_certificate /etc/letsencrypt/live/vault.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vault.example.com/privkey.pem;
# Naglowki bezpieczenstwa
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
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 dla live-sync
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";
}
}
# Alternatywa: Caddy (automatyczny TLS)
# vault.example.com {
# reverse_proxy 127.0.0.1:8080
# } Admin panel — konfiguracja i zarządzanie użytkownikami
Panel administracyjny dostępny jest pod adresem /admin. Wymaga tokenu
ADMIN_TOKEN ustawionego w zmiennych środowiskowych. Przez panel możesz zapraszać
użytkowników, zarządzać 2FA i monitorować stan serwera:
# Generowanie bezpiecznego ADMIN_TOKEN openssl rand -base64 48 # Wynik (przykład): y8Kq3PqFcJ4...Xz9 (64 znaki) # Wklej do ADMIN_TOKEN w docker-compose.yml # Dostep do panelu admina # https://vault.example.com/admin # Wpisz ADMIN_TOKEN w formularzu # Konfiguracja przez panel admina (/admin/settings): # - SMTP: weryfikacja konfiguracji emaila # - Signups allowed: false (po utworzeniu kont) # - Require email verification: true # - 2FA enforcement: opcjonalne (wymus 2FA dla wszystkich) # - Organization creation: all | only_admin | users (lista) # Zapraszanie uzytkownika (bez wlaczonej rejestracji): # /admin/users → "Invite user" → wpisz email # Uzytkownik otrzymuje email z linkiem rejestracyjnym (ważny 5 dni) # Lista uzytkownikow i ich status # /admin/users → tabela z email, 2FA status, last login
Backup bazy i pliki attachmentów
Backup Vaultwarden wymaga skopiowania bazy SQLite i katalogu z załącznikami. Kluczowe jest wykonanie backupu w momencie gdy SQLite nie pisze (WAL checkpoint):
# Skrypt backup SQLite - /opt/vaultwarden/backup.sh
#!/bin/bash
BACKUP_DIR="/opt/vaultwarden/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DATA_DIR="/opt/vaultwarden/vw-data"
mkdir -p "${BACKUP_DIR}"
# WAL checkpoint przed kopią
sqlite3 "${DATA_DIR}/db.sqlite3" "PRAGMA wal_checkpoint(FULL);"
# Kopia bazy
cp "${DATA_DIR}/db.sqlite3" "${BACKUP_DIR}/db_${TIMESTAMP}.sqlite3"
# Kopia załączników i ikony
tar -czf "${BACKUP_DIR}/attachments_${TIMESTAMP}.tar.gz" \
"${DATA_DIR}/attachments" \
"${DATA_DIR}/icon_cache" \
"${DATA_DIR}/config.json" 2>/dev/null
# Usuń kopie starsze niż 30 dni
find "${BACKUP_DIR}" -name "*.sqlite3" -mtime +30 -delete
find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +30 -delete
echo "Backup done: ${TIMESTAMP}"
# Cron - codzienny backup o 02:00
# 0 2 * * * /opt/vaultwarden/backup.sh >> /var/log/vaultwarden-backup.log Klienty Bitwarden i konfiguracja serwera
Wszystkie oficjalne klienty Bitwarden obsługują własny serwer — wystarczy podać URL w ustawieniach. Poniżej tabela klientów i ich możliwości:
| Klient | Platforma | Konfiguracja serwera | Autouzupełnianie |
|---|---|---|---|
| Web Vault | Przeglądarka (https://vault.example.com) | Automatycznie | Nie |
| Browser Extension | Chrome, Firefox, Safari, Edge | Settings → Server URL | Tak (auto-fill) |
| Desktop App | Windows, macOS, Linux | Settings → Server URL | Tak (TOTP, SSH keys) |
| Mobile App | iOS, Android | Settings → Server URL | Tak (biometria) |
| CLI | Linux, macOS, Windows | BW_SERVER env var | Skrypty automatyzacji |