Vaultwarden — inštalácia a nastavenie

Kompletný návod od Docker Compose stacku cez reverse proxy (alebo Cloudflare Tunnel), Gmail SMTP, vygenerovanie admin tokenu a Argon2 zabezpečenie až po vypnutie registrácií. Postup funguje na Synology NAS, Linuxe aj Windowse.

Vaultwarden

Ak si čítal môj článok o Vaultwarden, vieš prečo to chceš. Tu je kompletný postup — od reverse proxy cez ADMIN_TOKEN po Argon2 zabezpečenie. Vaultwarden nie je úplne triviálna inštalácia kvôli emailom a admin panelu, ale ak postupuješ krok za krokom, za hodinu máš vlastný Bitwarden server bežiaci doma.

Čo potrebuješ

Predpoklady

Docker a Portainer nainštalované. Prístup zvonka — buď reverse proxy s vlastným HTTPS certifikátom (Synology má vstavané, inak Nginx/Caddy/Traefik) alebo Cloudflare Tunnel — tá druhá možnosť je jednoduchšia a bez otvárania portov. Email — Gmail alebo vlastný SMTP server (pre verifikáciu účtov a pozvánky). Možnosť upraviť súbory v /volume1/docker alebo ekvivalente.

⚠️ Heslo manažér = citlivé dáta

Vaultwarden drží všetky tvoje heslá. Berieš na seba zodpovednosť za zálohu a zabezpečenie. Odporúčam pravidelné zálohy priečinka /volume1/docker/vaultwarden, HTTPS povinne a v admin paneli po prvom prihlásení vypnúť registrácie.

1. Reverse Proxy alebo Cloudflare Tunnel

Vaultwarden beží na HTTP internom porte — pre prístup zvonka musí byť za HTTPS. Dve možnosti:

Možnosť A — Reverse Proxy (Synology príklad)

Na Synology NAS máš wildcard certifikát z synology.me DDNS automaticky. Postup:

  • Control Panel → Login Portal → Advanced → Reverse Proxy → Create
  • Source: Protocol HTTPS, Hostname vaultwarden.tvojemeno.synology.me, Port 443, zaškrtni Enable HSTS
  • Destination: Protocol HTTP, Hostname localhost, Port 4080
  • V Custom Header tab klikni Create → WebSocket (automaticky sa doplnia dva headery)
  • Control Panel → Network → Connectivity — zaškrtni Enable HTTP/2
  • Control Panel → Security → Advanced — zaškrtni Enable HTTP Compression

Na Linuxe/Windowse použi Nginx, Caddy alebo Traefik — princíp rovnaký: HTTPS → localhost:4080 s WebSocket podporou.

Možnosť B — Cloudflare Tunnel

Jednoduchšia cesta — žiadne otváranie portov, žiadny vlastný certifikát. Kompletný postup je v mojom článku o Cloudflare Tunnel. Stručne: v Cloudflare Zero Trust vytvor nový tunel, pridaj public hostname vaultwarden.tvojadomena.skhttp://localhost:4080, v Additional settings zapni No TLS Verify a zaškrtni WebSocket.

Kedy si vybrať ktorú možnosť

Ak máš Synology alebo už beží reverse proxy — ideálne je ostať pri nej (menej pohyblivých častí). Cloudflare Tunnel je skvelá voľba ak nechceš otvárať porty v routeri alebo chceš DDoS ochranu a filtrovanie priamo z Cloudflare.

2. Vytvor priečinky

Vaultwarden potrebuje dva priečinky — data pre vaultwarden samotný a db pre Postgres databázu.

mkdir -p /volume1/docker/vaultwarden/data
mkdir -p /volume1/docker/vaultwarden/db

3. Zisti UID a GID (len Synology/Linux)

Vaultwarden kontajner beží pod tvojím používateľom — treba zistiť jeho UID a GID. V SSH spusti:

id tvoje_meno

Výstup vyzerá takto: uid=1026(tvoje_meno) gid=100(users). Hodnoty 1026 a 100 si zapamätaj — použiješ ich v compose v poli user: 1026:100.

4. SMTP email — Gmail alebo vlastný server

Vaultwarden potrebuje SMTP pre verifikačné emaily a pozvánky do organizácií. Dve možnosti:

Možnosť A — Gmail s App Password

Postup pre Gmail

1. Ísť na myaccount.google.com/security a zapnúť 2-Step Verification (bez toho App Password nefunguje)
2. Po zapnutí 2FA ísť na myaccount.google.com/apppasswords
3. Vygenerovať nový App Password — pomenovať ho napr. "Vaultwarden"
4. Google zobrazí 16-znakový kód (bez medzier) — toto je tvoj SMTP_PASSWORD
5. Uložiť si ho hneď — Google ho druhýkrát neukáže

Možnosť B — Vlastný SMTP server

Ak používaš iný email (ProtonMail, Fastmail, vlastná doména cez iCloud, Office 365, alebo vlastný mailserver), budeš potrebovať tieto údaje:

  • SMTP host — napr. smtp.office365.com, smtp.mail.me.com, mail.tvojadomena.sk
  • SMTP port587 pre STARTTLS alebo 465 pre implicit TLS
  • Username — zvyčajne tvoja celá emailová adresa
  • Password — buď štandardné heslo alebo app-specific password (Office 365, iCloud)

Hodnoty zadáš v compose súbore v ďalšom kroku. Pre STARTTLS použi SMTP_SECURITY: starttls, pre implicit TLS SMTP_SECURITY: force_tls.

5. Vygeneruj ADMIN_TOKEN

ADMIN_TOKEN je 64-znakový náhodný reťazec ktorým sa neskôr prihlásiš do admin panela. Vygeneruj ho:

  • Online: lab.jurek.xyz/tools/token-generator (nastav dĺžku 64)
  • Linux/Synology SSH: openssl rand -base64 48
  • Windows PowerShell: -join ((48..57) + (65..90) + (97..122) | Get-Random -Count 64 | %{[char]$_})

Výsledok bude niečo ako dOxZYTTZgXKMHkqLBIQVImayQXAVWdzGBPuFJKggzcgvgPJPXpWzqzKaUOIOGGIr. Ulož si ho — bez neho sa nedostaneš do admin panela.

6. Docker Compose stack

V Portainer: Stacks → Add stack → Web editor. Vyber platformu:

services:
  db:
    image: postgres:18
    container_name: Vaultwarden-DB
    hostname: vaultwarden-db
    security_opt:
      - no-new-privileges:true
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-d", "vaultwarden", "-U", "vaultwardenuser"]
      timeout: 45s
      interval: 10s
      retries: 10
    volumes:
      - /volume1/docker/vaultwarden/db:/var/lib/postgresql:rw
    environment:
      POSTGRES_DB: vaultwarden
      POSTGRES_USER: vaultwardenuser
      POSTGRES_PASSWORD: SEM_VLOZ_SILNE_HESLO_DB
    restart: on-failure:5

  vaultwarden:
    image: vaultwarden/server:latest
    container_name: Vaultwarden
    hostname: vaultwarden
    security_opt:
      - no-new-privileges:true
    user: 1026:100
    ports:
      - 4080:4020
    volumes:
      - /volume1/docker/vaultwarden/data:/data:rw
    environment:
      ROCKET_PORT: 4020
      DATABASE_URL: postgresql://vaultwardenuser:SEM_VLOZ_SILNE_HESLO_DB@vaultwarden-db:5432/vaultwarden
      ADMIN_TOKEN: SEM_VLOZ_64_ZNAKOVY_TOKEN_Z_KROKU_5
      DISABLE_ADMIN_TOKEN: false
      DOMAIN: https://vaultwarden.tvojemeno.synology.me
      SMTP_HOST: smtp.gmail.com
      SMTP_FROM: tvoj@gmail.com
      SMTP_PORT: 587
      SMTP_SECURITY: starttls
      SMTP_USERNAME: tvoj@gmail.com
      SMTP_PASSWORD: tvoj_16_znakovy_app_password
    restart: on-failure:5
    depends_on:
      db:
        condition: service_started
⚠️ Čo musíš nahradiť v stacku

POSTGRES_PASSWORD a v DATABASE_URL — vymysli silné heslo pre DB (rovnaké na oboch miestach)
ADMIN_TOKEN — 64-znakový token z kroku 5
DOMAIN — tvoja doména s https:// na začiatku (zo kroku 1)
user (len Synology) — UID a GID z kroku 3
SMTP_* — údaje z kroku 4 (Gmail alebo vlastný server)

Klikni Deploy the stack a počkaj na "Success Stack successfully deployed".

7. Vytvor prvý účet

Otvor v prehliadači svoju doménu, napríklad https://vaultwarden.tvojemeno.synology.me. Uvidíš Vaultwarden welcome screen.

  • Klikni Create account
  • Zadaj email a meno → Continue
  • Vytvor silné Master password (ideálne passphrase, min 16 znakov) — toto heslo si zapamätaj, nedá sa resetovať
  • Klikni Create account → prihlás sa
  • V dashboarde klikni Send email pre overenie adresy
⚠️ Master password sa nedá resetovať

Ak Master password zabudneš, tvoje dáta vo vaulte sú nenávratne stratené. Vaultwarden ho nepozná — všetko je šifrované lokálne v prehliadači. Odporúčam passphrase z 5-6 náhodných slov (napr. pomocou Diceware) — ľahké zapamätať, ťažké prelomiť.

8. Argon2 hash — zabezpečenie ADMIN_TOKEN

Aktuálne máš ADMIN_TOKEN uložený ako plain text v docker-compose súbore. Keď sa prihlásiš do admin panela na /admin, Vaultwarden ti ukáže varovanie o nebezpečnej konfigurácii. Fix: vygeneruj Argon2 PHC hash.

Krok 1 — v Portaineri choď do Containers → Vaultwarden → Console → Connect.

Krok 2 — v terminále spusti:

/vaultwarden hash

Krok 3 — systém vyzve na heslo. Pozor — toto NIE JE tvoj ADMIN_TOKEN z compose, toto je nové heslo ktorým sa budeš odteraz prihlasovať do admin panela. Zadaj heslo (min 8 znakov), potvrď ho.

Krok 4 — výstup bude dlhý reťazec začínajúci $argon2id$v=19$.... Skopíruj ho bez úvodných a koncových apostrofov.

Krok 5 — prihlás sa do admin panela: https://vaultwarden.tvojadomena.sk/admin → zadaj pôvodný ADMIN_TOKEN zo compose.

Krok 6General settings → nájdi pole Admin page token/Argon2 PHC → vlož Argon2 hash z kroku 4 → Save.

⚠️ Dôležité — dve rôzne heslá

Od tejto chvíle sa do admin panela prihlasuješ heslom z kroku 3 (to čo si zadával do terminálu), NIE 64-znakovým ADMIN_TOKEN z compose. Ten už slúži len ako "fallback" v compose súbore. Plain text varovanie zmizne.

9. Vypni registrácie (dôležité)

Po vytvorení svojho účtu vypni možnosť že si ktokoľvek cudzí vytvorí účet na tvojom servery.

  • Prihlás sa do admin panela: https://vaultwarden.tvojadomena.sk/admin
  • Klikni General settings
  • Odškrtni Allow new signups
  • Klikni Save

Od teraz si nikto cudzí nevytvorí účet. Ak chceš pozvať rodinu alebo priateľov, použi Organizations → Invite — pozvánky fungujú cez email.

10. Nainštaluj klientov

Vaultwarden je kompatibilný s oficiálnymi Bitwarden klientmi. Pri nastavení servera zadaj svoju doménu:

  • Prehliadač: Bitwarden extension pre Chrome, Firefox, Edge, Safari
  • Mobil: Bitwarden app v Google Play / App Store
  • Desktop: Bitwarden aplikácia pre Windows, macOS, Linux

V nastaveniach klienta: Server URL → zadaj svoju doménu (napr. https://vaultwarden.tvojadomena.sk) → prihlás sa svojím účtom.

Troubleshooting

⚠️ Emaily nechodia

Skontroluj v Portaineri Containers → Vaultwarden → Logs. Časté problémy: nesprávny SMTP_PASSWORD (pri Gmaile použiť App Password, nie bežné heslo), blokovaný port 587 providerom, alebo nesprávny SMTP_SECURITY (starttls vs force_tls).

⚠️ Permission denied na /data

Zlé UID/GID v user: field. Spusti id tvoje_meno a zadaj správne hodnoty. Potom zmaž obsah /volume1/docker/vaultwarden/data a redeploy stack.

⚠️ "Login with device" alebo "send invitation" nefunguje

Chýba WebSocket podpora v reverse proxy. Na Synology skontroluj že v Reverse Proxy → Custom Header máš Upgrade a Connection headery. Na Cloudflare Tunnel zaškrtni WebSocket v public hostname settings.

⚠️ Strata Master password

Nedá sa obnoviť. Ak máš v admin paneli zapnuté Account Deletion, môžeš zmazať účet a vytvoriť nový — ale stratíš všetky heslá. Prevencia: passphrase zapísaný v bezpečnom fyzickom mieste (sejf, obálka u niekoho dôveryhodného).