Vaultwarden
Interní týmový password manager (Bitwarden-kompatibilní, Rust). Nativní auth + Organization, invite-only.
| Owner | sentinel (deploy/container/provoz) |
| Status | running |
| Spec | REQ-002 (catalog/specs/REQ-002.md) |
| Image | vaultwarden/server:latest (oficiální, žádný build) |
| Deploy config | /root/projects/vaultwarden/ (deploy.yml + docker-compose.yml + DEPLOY.md), non-git |
| Prod URL | https://pass.studio60.cz |
| Admin | https://pass.studio60.cz/admin (ADMIN_TOKEN) |
| Catalog | catalog/services/vaultwarden.yaml |
⚠️ Single-env: prod-only single-instance interní služba — NEMÁ hub instanci. Deploy přeskakuje hub-before-prod gate (deploy.yml bez
domains.staging, viz ADR-009).
Komponenta
| Container | Port | Role |
|---|---|---|
s60-vaultwarden |
80 interní (ROCKET_PORT), 127.0.0.1:8222→80 |
Vaultwarden server |
DB
| Env | DB | User | Server | Port |
|---|---|---|---|---|
| Prod | s60_vault_prod |
s60_vault_prod_user |
pg-alfa (100.125.3.121) | 5432 DIRECT |
⚠️ Port 5432 direct (ne 6432 pgBouncer) — Diesel prepared statements se s transaction poolingem tlučou (stejný důvod jako n8n). Vaultwarden si schema tvoří sám při startu (Diesel embedded migrations → 29 tabulek). public schema owned vault userem (jinak boot migrace selžou).
Auth model — NATIVNÍ (bez SSO)
- Per-user master heslo (E2E — server nikdy nevidí plaintext; master heslo = šifrovací klíč na klientu).
- Sdílení přes Organization → Collections (+ Groups,
ORG_GROUPS_ENABLED=true). - Invite-only (
SIGNUPS_ALLOWED=false) — admin zve členy. - Odříznutí uživatele přímo v admin panelu / Organization (žádné SSO — REQ-002 Zamítnuto).
- Master heslo min 12 znaků = built-in Bitwarden web vault floor, nejde snížit.
Admin
- Server admin (
/admin): token-based (ADMIN_TOKEN), správa celé instance (všichni users, SMTP, diagnostika). Není vázané na účet. - Org role: kdo vytvoří Organization = automaticky
Owner(plná správa members/collections/groups/policies). Role: Owner → Admin → User.
SMTP (pozvánky)
Přes Resend (stejně jako n8n): smtp.resend.com:587 STARTTLS, from vault@studio60.cz (studio60.cz verified v Resendu), user resend, password = RESEND_API_KEY.
nginx / cert
- Vhost
pass.studio60.czna prod-alfa, proxy na127.0.0.1:8222. - WebSocket live sync: location
/notifications/hubs upgrade headers. - LE cert HTTP-01 (auto-renew),
client_max_body_size 128Mpro attachmenty.
Backup
- DB
s60_vault_prod→/usr/local/bin/s60-backup.sh(daily 4:30) → storagebox sync. - Volume
vaultwarden_vaultwarden-data→deploy/docker-volume-backup.sh(daily 4:00, auto-detect na prod-alfa). - ⚠️ Kritické — ztráta DB+volume = ztráta všech týmových hesel.
Secrets
/root/secrets/vaultwarden/.env.prod— DATABASE_URL, ADMIN_TOKEN, SMTP_*, SIGNUPS_ALLOWED, ORG_GROUPS_ENABLED
Deploy
Známé / follow-up
- ADMIN_TOKEN je plain (root-only secrets) — argon2 upgrade je follow-up hardening (
/vaultwarden hashvyžaduje TTY host; argon2 CLI/python na sentinelu chybí).
Health check
curl https://pass.studio60.cz/alive→ 200
Související
deploy/DECISIONS.mdADR-009 — single-env + non-git deploy podporainfra/postgres.md— pg-alfa detailycatalog/specs/REQ-002.md— spec