Přeskočit na obsah
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, popsaný technicky. Co zatím chybí, najdeš dole.

Row-Level Security

Databáze každý dotaz omezí na řádky tvého účtu (Row-Level Security). 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)

Databáze a soubory jsou v EU region Supabase (eu-central-1), aplikace na Vercelu ve Frankfurtu. Výjimka: když necháš AI přečíst nahranou přijatou fakturu, PDF se pošle ke zpracování do Anthropic API v USA.

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 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“, žá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). Výjimka: když necháš AI přečíst nahranou přijatou fakturu, PDF se pošle ke zpracování do Anthropic API v USA. Infrastruktura běží 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 + 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.

Izolace dat

Row-Level Security: každý vidí jen svoje data

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 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.

  • Notifikace o platbách z GoPay: omezený počet požadavků a stav platby si Volnio vždy ověří dotazem přímo u GoPay
  • 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.

GDPR — 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
  • Data ze všech 23 tabulek
  • Export timestamp pro tracking
  • User ID, email, created_at
Co v exportu NENÍ (záměrně)
  • Heslo ke Volniu (jen hash)
  • SMTP heslo (redacted)
  • Import API keys (redacted)
GDPR — 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
  • • Data ze všech 23 tabulek (kaskádně)
  • • Všechny PDF faktury ve Storage
  • • Auth record (email, hash, session)
  • • Aktivní sessions (okamžité logout)
Co zůstává dočasně
  • • Backup databáze — 30-day retention (PITR)

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ě)

Volnio není velká firemní platforma. Tohle zatím hotové není a vím o tom:

Nezávislý bezpečnostní audit

Plánuji

Nezávislý audit od CZ security firmy. Odemkne corporate klienty, kteří formální audit vyžadují.

Dvoufázové ověření (2FA)

Plánuji

Supabase Auth podporuje TOTP i kód e-mailem. Zapnu ho, až o něj budou uživatelé stát.

Silnější požadavky na heslo

Plánuji

Dnes stačí 6 znaků. Chci minimum 10 znaků a zákaz nejčastějších hesel.

Veřejná stránka o dostupnosti

Plánuji

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

Sdílené omezení počtu požadavků

Plánuji

Dnes si limit počítá každá instance serveru zvlášť. Chci jeden společný limit pro všechny.

Postup při bezpečnostním incidentu

Plánuji

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

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. 01
    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. 02
    Transparent write-up na blogu

    Do 7 dnů post-incident publish článek s timeline, root cause, fix, lessons learned. Žádné „no further comment“.

  3. 03
    Public 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í.

  4. 04
    Žá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. Nezávislý audit plánuji, termín zatím nemám. Ochranu, kterou Volnio má, popisuju na této stránce konkrétně a na videohovoru ti ji ukážu v kódu. 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), aplikace běží na Vercelu taky ve Frankfurtu. Výjimka: když necháš AI přečíst nahranou přijatou fakturu, PDF se pošle ke zpracování do Anthropic API v USA. 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 info@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. Dvoufázové ověření (TOTP nebo kód e-mailem) je na roadmapě. 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.