Vaultwarden je v Rustu napisana ponovna implementacija strežnika Bitwarden, API-kompatibilna z vsemi uradnimi Bitwarden odjemalci (razširitve za brskalnik, mobilne aplikacije, namizne odjemalce, CLI), pri čemer udobno teče na 1 vCPU VPS z 1 GB RAM. Lastno gostovanje vam daje popoln nadzor nad vaultom gesel, odpravi vsako odvisnost od tretje strani za shrambo poverilnic in podatke obdrži znotraj EU jurisdikcije, ki jo izberete. Ta vodnik prikazuje produkcijsko postavitev z Docker Compose, samodejnim HTTPS reverznim proxyjem (najprej Caddy, alternativa Nginx), admin ploščo in strategijo varnostnega kopiranja, ki ji lahko dejansko zaupate.
Kaj boste zgradili
Na koncu boste imeli:
- Vaultwarden v Dockerju s trajno shrambo
- Samodejen HTTPS preko Let's Encrypt
- Dostop do admin plošče, zaščiten z Argon2 žetonom
- Fail2ban zaščito pred poskusi grobe sile
- Šifrirane dnevne varnostne kopije, naložene na zunanjo shrambo
Predpogoji
- VPS z Debian 12 ali Ubuntu 24.04 (na našem Cloud VPS privzeto uporabljamo Debian)
- Registrirana domena z A/AAAA zapisom, usmerjenim na javni IP VPS-ja
- Odprta TCP vrata 80 in 443 v požarnem zidu
- SSH dostop kot root
Dimenzioniranje: za družino ali manjšo ekipo (pod 25 uporabnikov) sta 1 vCPU in 1 GB RAM povsem dovolj. SQLite je privzeti backend in brez težav prenese tisoče vnosov.
Korak 1: Namestite Docker in Docker Compose
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg ufw fail2ban
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" \
> /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker
Preverite z docker compose version.
Korak 2: Ustvarite admin žeton
Vaultwarden admin plošča mora biti zaščitena z Argon2-šifriranim žetonom, ne z navadnim nizom:
docker run --rm -it vaultwarden/server:latest /vaultwarden hash
Vnesite močno geslo (vsaj 32 znakov) dvakrat. Izpis se začne z $argon2id$.... Shranite celoten hash; vstavili ga boste v okoljsko datoteko. Navadno geslo shranite v obstoječi upravljalnik gesel ali v zapečateno offline opombo.
Korak 3: Ustvarite strukturo imenikov
mkdir -p /opt/vaultwarden/{data,backups}
mkdir -p /opt/caddy/{data,config}
cd /opt/vaultwarden
Korak 4: Napišite Compose datoteko
Ustvarite /opt/vaultwarden/docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
volumes:
- ./data:/data
networks:
- web
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- /opt/caddy/data:/data
- /opt/caddy/config:/config
networks:
- web
networks:
web:
driver: bridge
Korak 5: Napišite okoljsko datoteko
Ustvarite /opt/vaultwarden/.env:
DOMAIN=https://vault.example.com
SIGNUPS_ALLOWED=false
INVITATIONS_ALLOWED=true
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...vaš_celoten_hash...'
SENDS_ALLOWED=true
EMERGENCY_ACCESS_ALLOWED=true
WEB_VAULT_ENABLED=true
LOG_FILE=/data/vaultwarden.log
LOG_LEVEL=warn
SMTP_HOST=smtp.example.com
SMTP_FROM=vault@example.com
SMTP_PORT=587
SMTP_SECURITY=starttls
SMTP_USERNAME=vault@example.com
SMTP_PASSWORD=vaše_smtp_geslo
Enojni narekovaji okoli ADMIN_TOKEN so pomembni: Argon2 hash vsebuje znake $, ki bi jih lupina sicer interpretirala.
Nastavitev SIGNUPS_ALLOWED=false po prvi registraciji prepreči naključnim obiskovalcem ustvarjanje računov. Najprej ustvarite admin račun, nato registracije onemogočite.
Korak 6: Napišite Caddyfile
Ustvarite /opt/vaultwarden/Caddyfile:
vault.example.com {
encode gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "no-referrer"
}
reverse_proxy /notifications/hub vaultwarden:3012
reverse_proxy vaultwarden:80
}
Caddy samodejno pridobi in podaljša Let's Encrypt certifikate. Ročno postavljanje certbota ni potrebno.
Korak 7: Zaženite sklad
cd /opt/vaultwarden
docker compose up -d
docker compose logs -f
Spremljajte vrstico, ki potrjuje, da Vaultwarden posluša na vratih 80, in Caddy dnevnike z uspešno izdajo certifikata. Če certifikat ne uspe, je najpogostejši razlog, da se domena še ne razrešuje na VPS, ali da so vrata 80 in 443 blokirana.
Korak 8: Prva prijava in zaklepanje
- Obiščite
https://vault.example.com - Registrirajte prvi račun (ta postane lastniški)
- Preverite e-pošto preko povezave, dostavljene v vaš nabiralnik
- V
.envnastaviteSIGNUPS_ALLOWED=false - Ponovno zaženite:
docker compose restart vaultwarden
Za povabilo dodatnih članov družine ali ekipe obiščite https://vault.example.com/admin, se overite z navadnim admin geslom (Vaultwarden ga zgosti in primerja z Argon2 žetonom) in uporabite funkcijo povabila.
Nginx Alternativa
Če imate raje Nginx, zamenjajte Caddy storitev z:
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
networks:
- web
Na gostitelju uporabite certbot --nginx za pridobitev certifikatov, nato proxy na vaultwarden:80 in vaultwarden:3012 za WebSocket končno točko. Za prav ta scenarij je Caddy enostavnejši, zato ga predstavljamo prvega.
Korak 9: Pravila požarnega zidu
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 443/udp
ufw enable
Korak 10: Fail2ban za Vaultwarden
Vaultwarden v dnevnik zapisuje neuspešne poskuse overitve. Ustvarite /etc/fail2ban/filter.d/vaultwarden.conf:
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\..*$
ignoreregex =
Ustvarite /etc/fail2ban/jail.d/vaultwarden.conf:
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
logpath = /opt/vaultwarden/data/vaultwarden.log
maxretry = 5
bantime = 86400
findtime = 600
Naložite z systemctl reload fail2ban. Pet neuspešnih prijav z istega IP-ja v desetih minutah prinese 24-urno prepoved.
Isti vzorec uporabite za ločen jail za admin končno točko z bolj strogim maxretry = 3.
Strategija varnostnega kopiranja
Imenik /data vsebuje vse: SQLite bazo, priloge, sende, ikone in konfiguracijo. Pravilno varnostno kopiranje pomeni uporabo SQLite online backup API-ja (kopiranje datoteke aktivne SQLite baze je lahko nedosledno).
Ustvarite /opt/vaultwarden/backup.sh:
#!/bin/bash
set -euo pipefail
BACKUP_DIR=/opt/vaultwarden/backups
DATE=$(date +%Y%m%d-%H%M%S)
DATA_DIR=/opt/vaultwarden/data
mkdir -p "$BACKUP_DIR"
# Online SQLite backup
docker exec vaultwarden sqlite3 /data/db.sqlite3 \
".backup '/data/db-backup.sqlite3'"
# Tar imenika data brez aktivne SQLite
tar --exclude='db.sqlite3' \
--exclude='db.sqlite3-wal' \
--exclude='db.sqlite3-shm' \
--exclude='icon_cache' \
-czf "$BACKUP_DIR/vw-$DATE.tar.gz" \
-C "$DATA_DIR" .
# Šifriranje
gpg --batch --yes --passphrase-file /root/.backup-pass \
--symmetric --cipher-algo AES256 \
-o "$BACKUP_DIR/vw-$DATE.tar.gz.gpg" \
"$BACKUP_DIR/vw-$DATE.tar.gz"
rm "$BACKUP_DIR/vw-$DATE.tar.gz"
# Lokalno ohranite 14 dni
find "$BACKUP_DIR" -name "vw-*.tar.gz.gpg" -mtime +14 -delete
# Naložite na zunanjo shrambo (rclone, restic ali rsync)
rclone copy "$BACKUP_DIR/vw-$DATE.tar.gz.gpg" remote:vaultwarden-backups/
Načrtujte dnevno:
chmod +x /opt/vaultwarden/backup.sh
echo "0 3 * * * root /opt/vaultwarden/backup.sh >> /var/log/vw-backup.log 2>&1" \
> /etc/cron.d/vaultwarden-backup
Vsaj enkrat preizkusite obnovitev na drugem gostitelju, preden temu sistemu zaupate. Varnostna kopija, ki je niste nikoli obnovili, je ugibanje, ne varnostna kopija.
Posodabljanje Vaultwardna
cd /opt/vaultwarden
docker compose pull
docker compose up -d
Posodobitve Vaultwardna so običajno neproblematične. V opombah izdaje spremljajte morebitne prekinitvene spremembe okoljskih spremenljivk.
FAQ
Ali je Vaultwarden združljiv z uradnimi Bitwarden odjemalci? Da. API je v celoti združljiv z uradnimi razširitvami za brskalnik, mobilnimi aplikacijami, namiznimi odjemalci in CLI. Odjemalca pred prijavo v nastavitvah usmerite na vaš samogostujoči URL.
Koliko RAM-a Vaultwarden dejansko porabi? Tipična mirujoča instanca uporablja okrog 30 do 50 MB RAM. Tudi s stotinami uporabnikov redko preseže 200 MB.
Lahko namesto SQLite uporabim MariaDB ali PostgreSQL? Da, z nastavitvijo DATABASE_URL v okolju. Za večino samogostiteljev je SQLite hitrejši in enostavnejši, brez operativnih slabosti, dokler ne pridete do tisočev aktivnih uporabnikov.
Kaj se zgodi, če Vaultwarden pade? Bitwarden odjemalci ohranijo lokalni šifriran predpomnilnik in še naprej delujejo za branje gesel. Sinhronizacija, novi vnosi in posodobitve med napravami počakajo, dokler strežnik ni nazaj. To je razlog, zakaj je redundantna varnostna kopija za male postavitve pomembnejša od redundance instance.
Ali potrebujem admin ploščo? Potrebujete jo za začetno postavitev in občasno administracijo (povabila, diagnostika). Po nastavitvi jo lahko onemogočite z odstranitvijo ADMIN_TOKEN iz .env in ponovnim zagonom.
Kje jo gostiti
Vaultwarden ima skromne računske zahteve, vendar latenca med vašimi napravami in strežnikom vpliva na dnevno uporabo. EU VPS večini evropskih uporabnikov daje odzivne čase v enomestnih milisekundah. Naš Cloud VPS deluje na Ceph shrambi z vključenim Proxmox Backup Server, ki zgornji lokalni skript dopolnjuje z dedupliciranimi zunajgručnimi posnetki. Za vault, na katerega se boste zanašali leta, predvidljiva infrastruktura in hiter odziv operaterjev pomenita več kot oglaševane meritve.