Bezpečnost

Jak Volnio chrání tvoje obchodní data.

Bezpečnost beru vážně, protože moje vlastní obchodní data jsou ve Volniu. Tohle je stav k dnešnímu dni — technicky, ověřitelně, bez marketingového balastu. Co chybí, najdeš na konci stránky honestly označené.

Co a kde

Co se ukládá a kde

Volnio ukládá ta data, která potřebuje k tomu, aby fungovalo — a nic víc. Žádný tracking „pro jistotu\u001c, žádné analytics cookies bez souhlasu, žádné skryté data pipelines.

Ukládaná data

  • Kontakty klientů — jméno, IČO, DIČ, adresa, email, telefon (tebou zadané)
  • Faktury — hlavičky, položky, splatnosti, stav plateb, PDF soubory
  • SMTP konfigurace — host, port, username, heslo (šifrované)
  • Uživatelské nastavení — firemní údaje, číslování faktur, daňový režim, email šablony
  • Finanční přehled — výnosy, výdaje, plánovaná fakturace, reminders
  • Authentication data — email, hash hesla (nikdy plain text), session tokens

Kde jsou data fyzicky

Supabase PostgreSQL v EU region Frankfurt (eu-central-1). Data neopouštějí Evropskou unii. Infrastruktura je postavená na AWS pod Supabase správou. PDF faktury jsou v Supabase Storage (bucket: invoices).

Šifrování

Jak jsou tvoje data šifrovaná

SMTP hesla — AES-256-GCM

Když nastavíš SMTP pro odesílání faktur, tvoje heslo se šifruje algoritmem AES-256-GCM (Advanced Encryption Standard, 256-bit key, Galois/Counter Mode). GCM je authenticated encryption — kromě šifrování ověřuje i integritu, takže nikdo nemůže heslo potají upravit.

Každé heslo má vlastní random IV (initialization vector, 12 bytes) a auth tag. Výsledek ukládáme jako iv:tag:ciphertext hex string. Implementace v src/lib/crypto.ts.

Session cookies

Supabase Auth používá httpOnly + secure + sameSite strict cookies. httpOnly znamená, že JavaScript je nemůže přečíst (ochrana proti XSS). secure znamená, že se posílají jen přes HTTPS. sameSite strict znamená, že se neposílají při cross-site requestech (ochrana proti CSRF).

Transport — TLS 1.3

Veškerá komunikace mezi prohlížečem a Volniem je přes HTTPS (TLS 1.3) s automatickým HSTS od Vercelu. Žádný HTTP fallback. Certifikáty spravuje Let's Encrypt přes Vercel automaticky.

At-rest encryption

PostgreSQL databáze i Storage jsou šifrované at rest přes AWS KMS (Supabase default). Fyzické disky obsahují jen šifrovaná data.

Izolace dat

Row-Level Security — data jsou fyzicky izolovaná per uživatel

Row-Level Security (RLS) je nejsilnější signál bezpečnostní hygieny pro multi-tenant SaaS. Volnio ho má zapnutý na všech tabulkách s uživatelskými daty (faktury, klienti, kontakty, plány, upomínky, nastavení, SMTP hesla, import credentials, pozorování plateb).

Jak to funguje

RLS je pravidlo na úrovni PostgreSQL, které říká: „při dotazu na tabulku invoices vrať jen řádky, kde user_id = auth.uid()\u001c. To je enforced databází, ne aplikací. I kdyby aplikační kód měl bug a zapomněl přidat WHERE user_id = …, databáze to stejně zajistí.

Ukázka z supabase/migrations/008_multi_user.sql:

CREATE POLICY "users_own_invoices"
ON invoices
FOR ALL
USING (auth.uid() = user_id);

Storage RLS

PDF faktury jsou uložené v Supabase Storage v path {user_id}/filename.pdf. Storage RLS pravidlo kontroluje, že první segment cesty odpovídá auth.uid(). Uživatel fyzicky nemůže stáhnout PDF jiného uživatele, ani kdyby odhadl URL.

Rate limiting

Ochrana proti zneužití a DDoS

Kritické endpointy mají rate limit — brute force password guessing, spam batch submissions, neautorizované API requesty jsou omezené počtem requestů za časovou okno.

  • Webhook endpoints (GoPay payment callbacks) — rate limit s signature verification
  • Batch invoice creation — limit na počet faktur najednou
  • Search a ARES lookup — limit na počet dotazů per uživatel
  • Client enrichment — limit na external API calls

Rate limit implementace: src/lib/rate-limit.ts. Překročení vrací HTTP 429 s Retry-After headerem. Plánovaná migrace na Upstash Redis pro distribuované tracking (současná in-memory verze má omezení v Vercel serverless prostředí).

GDPR — právo na přenositelnost

Export všech tvých dat jedním klikem

GDPR ti dává právo kdykoli získat všechna svoje data. Volnio to implementuje doslovně: endpoint GET /api/user/export-data vrátí JSON soubor se všemi tvými daty napříč 23 tabulkami — klienti, faktury, plány, upomínky, nastavení, recenze, obligations, quick notes, vše.

Co je v exportu

  • Kompletní data ze všech tabulek (user metadata, clients, contacts, items, invoices, plans, reminders, subscriptions, feedback, obligations, expenses, incomes, signatures, consents, reviews, recurring invoicing, client reliability…)
  • Export timestamp pro tracking
  • User ID + email + created_at

Co v exportu NENÍ

  • Heslo ke Volniu — ukládáme hash, ne plain text
  • SMTP heslo — redacted na ***REDACTED*** (bezpečnost)
  • API keys pro import (Fakturoid, iDoklad, Vyfakturuj) — redacted

PDF faktury ze storage si stáhneš samostatně přes app UI (jsou v bucket-uinvoices, path {user_id}/…).

GDPR — právo na smazání

Smazání účtu = kaskádní, nevratné, okamžité

Pokud chceš účet smazat, jde to jedním klikem v nastavení. Endpoint POST /api/user/delete-account vymaže všechna tvoje data z 23 tabulek v správném pořadí (children before parents, kvůli foreign keys), plus všechny PDF soubory ze Storage, plus tvůj auth record v Supabase Auth.

Co se smaže

  • Všechna data ze všech 23 tabulek (kaskádně)
  • Všechny PDF faktury ve Storage (bucket invoices/{user_id}/)
  • Tvůj auth record (email, password hash, session)
  • Aktivní sessions (okamžité logout)

Co zůstává

  • Backup databáze — Supabase Pro má point-in-time recovery s 30-day retention. Tvoje data v backupech zmizí automaticky po 30 dnech.
  • Anonymizovaná analytics (Vercel Analytics) — neobsahuje personally identifiable information.

Potvrzení: smazání vyžaduje explicitní confirm: true v POST body (prevence proti nechtěnému triggrování).

Transparentně

Co ještě chybí (a je na roadmapě)

Nemá smysl předstírat, že Volnio je enterprise-grade. Tohle jsou věci, které vědomě řeším, ale zatím nejsou hotové:

Third-party security audit

Do konce 2026

Nezávislý audit od CZ security firmy (odhad 40-80 tis. Kč). Odemkne corporate klienty, kteří formální audit vyžadují.

Two-factor authentication (2FA)

Q2/Q3 2026

Supabase Auth podporuje TOTP a email OTP. Implementace je pár řádků kódu — čekám na critical mass uživatelů a jejich feedback.

Password strength requirements

Q1 2026 (fix brzy)

Supabase default je 6 znaků — to je málo. Zvýším na min 10 znaků a blacklist top 1000 common passwords.

Public status page / uptime monitoring

Q2 2026

Veřejný status page přes Betterstack nebo Statuspage. Dnes vidím uptime já, ty ne — to chci změnit.

Distributed rate limiting

Q1 2026

Migrace z in-memory na Upstash Redis. Rate limit bude konzistentní napříč Vercel serverless instancemi.

Incident response playbook

Q2 2026

Interní playbook + veřejný commitment „jak se dozvíš o incidentu. Zatím je to ad-hoc podle situace.

Závazek

Co slibuju, pokud dojde k incidentu

Incident (data breach, unauthorized access, service outage s dopadem na data) se může stát i tomu nejlepšímu. Pokud se stane, tady je co slibuju:

  1. Notifikace do 72 hodin — email všem dotčeným uživatelům s popisem toho, co se stalo, co je ovlivněno, a co dělám.
  2. Transparent write-up na blogu — do 7 dnů post-incident publish article s timeline, root cause, fix, lessons learned. Žádné „no further comment\u001c.
  3. Public commit — fix (nebo mitigation) bude viditelný v git logu. Repo plánuji udělat public, až bude mature. Dnes mohu sdílet git diff na vyžádání.
  4. Žádné NDA — nezavazuji tě, abys o incidentu mlčel. Můžeš o tom mluvit veřejně.
Časté otázky

Security FAQ

Je Volnio certifikované ISO 27001 nebo SOC 2?

Ne. Formální audit je na roadmapě do konce 2026. Současný stav je „best effort security hygiene — veškerá hardening je v kódu, veřejně ověřitelná. Pokud potřebuješ formální certifikaci kvůli corporate compliance, Volnio zatím není vhodné.

Kde jsou moje data fyzicky uložená?

V Supabase EU region (Frankfurt, eu-central-1). Data neopouštějí EU. Hostitel Supabase je postavený na AWS. PDF faktury jsou v Supabase Storage, databáze v PostgreSQL 15+.

Má někdo kromě mě přístup k mým fakturám?

Běžně ne. Matouš (zakladatel) má technicky přístup k databázi přes Supabase admin kvůli incident response, ale bez tvého svolení data nečte. Každá diagnostika je na žádost a s tvým souhlasem. Logy jsou audited přes Supabase dashboard.

Co když najdu bezpečnostní chybu?

Napiš mi na matous@volnio.cz. Slibuji: (1) odpověď do 24 hodin, (2) fix nebo mitigation do 72 hodin podle závažnosti, (3) transparent write-up na /blog s poděkováním (pokud si přeješ). Žádné NDA, žádné právní kličky.

Je tam 2FA / MFA?

Zatím ne. Email + password přes Supabase Auth. 2FA (TOTP nebo email OTP) je na roadmapě do Q2/Q3 2026. Pokud to pro tebe je blocker, napiš — posunu prioritu.

Máš bezpečnostní otázku, která tady není?

Napiš mi přímo. Odpovídám do 24 hodin osobně. Žádné formuláře, žádné helpdesk tikety, žádné automatické odpovědi.

Nebo si přečti o tom, kdo za Volniem stojí.