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š dole honestly označené.
Row-Level Security
Tvoje data jsou fyzicky izolovaná na úrovni PostgreSQL. I kdyby aplikace měla bug, databáze stejně nevrátí cizí řádky.
AES-256-GCM šifrování
SMTP hesla, API keys a další citlivá data jsou šifrovaná authenticated encryption algoritmem — nikdo je nemůže přečíst ani upravit.
EU hosting (Frankfurt)
Všechna data zůstávají v EU region Supabase (eu-central-1). Žádný transfer mimo EU, TLS 1.3 transport, HSTS enforced.
GDPR one-click export
Jeden endpoint vrátí JSON se všemi tvými daty napříč 23 tabulkami. Smazání účtu je kaskádní a nevratné — bez čekání na support.
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", žá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é AES-256-GCM)
- Uživatelské nastavení — firemní údaje, číslování, daňový režim, email šablony
- Finanční přehled — výnosy, výdaje, plánovaná fakturace, reminders
- Authentication — 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í EU. Infrastruktura běží 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 + Transport
Supabase Auth používá httpOnly + secure + sameSite strict cookies. httpOnly znamená, že JavaScript je nemůže přečíst (ochrana proti XSS). 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.
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()". 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í.
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 napříč Vercel serverless instancemi.
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.
- Data ze všech 23 tabulek
- Export timestamp pro tracking
- User ID, email, created_at
- Heslo ke Volniu (jen hash)
- SMTP heslo (redacted)
- Import API keys (redacted)
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.
- • Data ze všech 23 tabulek (kaskádně)
- • Všechny PDF faktury ve Storage
- • Auth record (email, hash, session)
- • Aktivní sessions (okamžité logout)
- • Backup databáze — 30-day retention (PITR)
- • Anonymizovaná Vercel Analytics (bez PII)
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. Odemkne corporate klienty, kteří formální audit vyžadují.
Two-factor authentication (2FA)
Q2/Q3 2026Supabase Auth podporuje TOTP a email OTP. Čekám na critical mass uživatelů a jejich feedback.
Password strength requirements
Q1 2026Supabase default je 6 znaků — zvýším na min 10 znaků a blacklist top 1000 common passwords.
Public status page
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 pro konzistentní rate limit napříč serverless instancemi.
Incident response playbook
Q2 2026Interní playbook + veřejný commitment „jak se dozvíš o incidentu“. Zatím je to ad-hoc.
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:
- 01Notifikace 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.
- 02Transparent write-up na blogu
Do 7 dnů post-incident publish článek s timeline, root cause, fix, lessons learned. Žádné „no further comment“.
- 03Public commit s fixem
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í.
- 04Žá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.