Sari la conținut
servervps.roPanou client

Ghid · 30 de minute · Debian · Ubuntu

Manager de parole propriu, cu Vaultwarden

Vaultwarden este o reimplementare în Rust a serverului Bitwarden. Aplicațiile și extensiile oficiale Bitwarden se conectează la el fără modificări, dar consumă câteva zeci de MB de memorie în loc de câțiva GB, fiindcă nu are nevoie de MSSQL și de restul serviciilor din varianta oficială.

Ai nevoie de

  • Un VPS securizat, cu porturile 80 și 443 deschise
  • Un domeniu cu înregistrare A către IP-ul serverului
  • Docker și Docker Compose instalate
  1. 01

    Înțelege ce ai de protejat

    Serverul ăsta va ține toate parolele tale. Două lucruri nu sunt opționale și nu se amână: HTTPS valid și backup extern. Fără primul, clienții refuză să se conecteze. Fără al doilea, o singură ștergere greșită îți pierde arhiva de parole.

    Restul ghidului presupune că ai citit fraza de mai sus.

    AtențieNu porni Vaultwarden pe HTTP „doar ca să testez". Clienții Bitwarden refuză conexiunile necriptate, iar dacă ocolești asta pentru test, riști să rămână așa.

  2. 02

    Generează token-ul de administrare

    Panoul de administrare se protejează cu un token. Vaultwarden acceptă și un token în clar, dar forma corectă e un hash Argon2: chiar dacă cineva citește fișierul de configurare, nu obține token-ul.

    Comanda de mai jos îți cere token-ul și îți dă hash-ul. Salvează token-ul în clar în managerul tău de parole actual, iar hash-ul îl pui în configurație.

    docker run --rm -it vaultwarden/server /vaultwarden hash
  3. 03

    Scrie configurația

    SIGNUPS_ALLOWED=false închide înregistrările publice. Fără el, oricine îți găsește domeniul își face cont pe serverul tău.

    Îți creezi propriul cont înainte de a închide înregistrările, sau folosești invitații din panoul de administrare.

    .env
    DOMENIU=parole.domeniul-tau.ro
    ADMIN_TOKEN='$argon2id$v=19$...'   # hash-ul de la pasul anterior, între apostrofuri
    SIGNUPS_ALLOWED=false
    INVITATIONS_ALLOWED=true

    AtențiePune hash-ul între apostrofuri simple. Conține caractere $ pe care shell-ul le-ar interpreta ca variabile, iar rezultatul ar fi un token gol, adică panou de administrare fără parolă.

  4. 04

    Pornește serviciile

    Vaultwarden ascultă doar pe rețeaua internă a containerelor. Caddy face reverse proxy și obține certificatul singur.

    Datele stau într-un volum: baza de date SQLite, atașamentele și cheile RSA folosite pentru sesiuni.

    docker-compose.yml
    services:
      vaultwarden:
        image: vaultwarden/server:latest
        restart: unless-stopped
        environment:
          DOMAIN: https://${DOMENIU}
          ADMIN_TOKEN: ${ADMIN_TOKEN}
          SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED}
          INVITATIONS_ALLOWED: ${INVITATIONS_ALLOWED}
        volumes:
          - vw-data:/data
    
      caddy:
        image: caddy:alpine
        restart: unless-stopped
        ports: ["80:80", "443:443"]
        volumes:
          - ./Caddyfile:/etc/caddy/Caddyfile:ro
          - caddy:/data
        depends_on: [vaultwarden]
    
    volumes:
      vw-data:
      caddy:
  5. 05

    Configurează reverse proxy-ul

    Caddy cere certificatul la prima pornire și îl reînnoiește singur.

    Caddyfile
    {$DOMENIU} {
    	reverse_proxy vaultwarden:80
    }
  6. 06

    Pornește, creează-ți contul, închide ușa

    Ordinea contează: pornești, îți faci contul cât timp înregistrările sunt deschise, apoi le închizi.

    După ce ai contul, verifică din panoul de administrare că înregistrările publice sunt oprite.

    docker compose up -d
    docker compose logs -f caddy    # urmărește emiterea certificatului
    
    # deschide https://parole.domeniul-tau.ro, creează-ți contul, apoi:
    sed -i 's/SIGNUPS_ALLOWED=true/SIGNUPS_ALLOWED=false/' .env
    docker compose up -d
  7. 07

    Pornește backup-ul înainte să pui prima parolă

    Baza SQLite se copiază cu .backup, nu cu cp. O copie făcută în timp ce serverul scrie în ea poate fi coruptă exact atunci când ai nevoie de ea.

    Trebuie salvate trei lucruri: baza de date, atașamentele și cheile RSA din /data. Fără chei, sesiunile existente devin invalide după restaurare.

    /usr/local/bin/backup-vaultwarden.sh
    #!/usr/bin/env bash
    set -euo pipefail
    DEST=/var/backups/vaultwarden
    install -d -m 700 "$DEST"
    
    # .backup, nu cp: copie consistentă cât timp serverul scrie.
    docker compose exec -T vaultwarden \
      sqlite3 /data/db.sqlite3 ".backup '/data/backup.sqlite3'"
    
    docker compose cp vaultwarden:/data/backup.sqlite3 "$DEST/db.sqlite3"
    docker compose cp vaultwarden:/data/attachments "$DEST/attachments" 2>/dev/null || true
    docker compose cp vaultwarden:/data/rsa_key.pem "$DEST/rsa_key.pem"
    docker compose exec -T vaultwarden rm -f /data/backup.sqlite3
    
    tar czf "$DEST/../vaultwarden-$(date +%F).tar.gz" -C "$DEST" .

    AtențieTrimite arhiva în afara serverului și testează o restaurare acum, nu în ziua în care ai nevoie de ea. Vezi ghidul de backup cu restic.

Întrebări frecvente

+De ce Vaultwarden și nu serverul oficial Bitwarden?

Serverul oficial rulează mai multe servicii și o bază MSSQL, ceea ce înseamnă câțiva GB de memorie. Vaultwarden e o reimplementare în Rust cu același protocol: aceleași aplicații și extensii se conectează la el, dar încape confortabil pe cel mai mic plan din catalog.

+Ce VPS îmi trebuie?

Vaultwarden singur consumă zeci de MB. Planul de 2 GB acoperă serverul, reverse proxy-ul și sistemul, cu marjă. Nu ai nevoie de mai mult decât dacă pui alte servicii pe aceeași mașină.

+Aplicațiile oficiale Bitwarden funcționează cu el?

Da. În aplicație sau în extensie alegi „self-hosted" și introduci adresa serverului tău înainte de autentificare. Restul funcționează la fel.

+Ce se întâmplă dacă pierd serverul?

Aplicațiile păstrează o copie locală criptată a seifului, deci nu rămâi pe loc imediat. Dar fără backup nu poți reconstrui serverul, iar la următoarea reinstalare a aplicației pierzi accesul. De asta backup-ul se configurează înainte de prima parolă introdusă.