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 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).
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.
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.
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í).
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}/…).
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í).
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 2026Nezá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 2026Supabase 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 2026Veřejný status page přes Betterstack nebo Statuspage. Dnes vidím uptime já, ty ne — to chci změnit.
Distributed rate limiting
Q1 2026Migrace z in-memory na Upstash Redis. Rate limit bude konzistentní napříč Vercel serverless instancemi.
Incident response playbook
Q2 2026Interní playbook + veřejný commitment „jak se dozvíš o incidentu. Zatím je to ad-hoc podle situace.
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:
- 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.
- Transparent write-up na blogu — do 7 dnů post-incident publish article s timeline, root cause, fix, lessons learned. Žádné „no further comment\u001c.
- 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í.
- Žádné NDA — nezavazuji tě, abys o incidentu mlčel. Můžeš o tom mluvit veřejně.
Security FAQ
Je Volnio certifikované ISO 27001 nebo SOC 2?
Kde jsou moje data fyzicky uložená?
Má někdo kromě mě přístup k mým fakturám?
Co když najdu bezpečnostní chybu?
Je tam 2FA / MFA?
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í.