S3 Backup & Sync — Specifikace aplikace¶
Aplikace dostupná v záložce Software launcheru. Navazuje na:
user-data-sharing.md,sync-backup.md,auth-organization.md
1. Multi-firma uživatelský model¶
1.1 Jeden uživatel, více firem¶
Uživatel má jeden účet (e-mail + heslo) a může být členem více firem. V každé firmě může mít jinou roli. Inspirace: Slack workspace switching.
Příklad: Jan Novák
Firma A: Novák s.r.o. → role: company_owner (majitel)
Firma B: ABC Účetnictví → role: user (zaměstnanec)
Firma C: XYZ Trade → role: company_admin (IT správce)
1.2 Databázový model — multi-firma¶
-- Stávající users.company_id zůstane jako "primární firma" pro zpětnou
-- kompatibilitu, ale přístup ke firmám jde výhradně přes memberships.
user_company_memberships (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) NOT NULL,
company_id UUID REFERENCES companies(id) NOT NULL,
role VARCHAR(50) NOT NULL,
-- 'company_owner' | 'company_admin' | 'user'
is_active BOOLEAN DEFAULT true,
invited_by UUID REFERENCES users(id),
joined_at TIMESTAMPTZ DEFAULT now(),
UNIQUE (user_id, company_id)
)
Migrace: Stávající users.company_id + users.system_role se přemigrují
do user_company_memberships jako jeden záznam per uživatel.
1.3 Role v rámci firmy¶
| Role | Kdo | Co může |
|---|---|---|
company_owner |
Majitel / jednatel | Vše jako admin + schvaluje mazání dat, přidává/odebírá adminy, vidí billing |
company_admin |
IT admin, ředitel | Spravuje uživatele, role, sdílení, zálohy, přiděluje aplikace |
user |
Zaměstnanec | Přidělené aplikace, vlastní zálohy, sdílené adresáře dle ACL |
Jeden company_owner per firma. Při registraci firmy je zakladatel automaticky owner. Owner může jmenovat dalšího ownera (přenesení) nebo přidat adminy.
1.4 Context switcher v launcheru¶
Menu lišta [vlevo]:
▼ Novák s.r.o. ← aktuální firma (kliknutelný dropdown)
────────────────
Novák s.r.o. ● ← aktivní
ABC Účetnictví
XYZ Trade
────────────────
+ Přidat firmu
Po přepnutí firmy se změní: - Knihovna — software přidělený v dané firmě - Chat — kanály a konverzace dané firmy - Zálohy — data a adresáře dané firmy - Nastavení — role, uživatelé dané firmy
Volitelné nastavení — sloučená knihovna:
Nastavení → Zobrazení → Knihovna
☑ Zobrazovat software ze všech firem v jedné knihovně
(každá aplikace bude označena názvem firmy)
Výsledek v Knihovně:
[A] Fakturace Pro Novák s.r.o. v2.1.4
[M] Mzdový systém Novák s.r.o. v1.5.0
[C] CRM Lite ABC Účetnictví v3.0.0
[S] Sklad Manager XYZ Trade v2.2.1
2. Evidence zařízení (Device Registry)¶
2.1 Model¶
user_devices (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) NOT NULL,
device_name VARCHAR(255) NOT NULL, -- "Notebook doma", "PC kancelář"
device_type VARCHAR(20) NOT NULL, -- 'windows' | 'linux' | 'mac'
device_uid VARCHAR(255) NOT NULL UNIQUE, -- hw fingerprint (MAC + hostname hash)
last_seen_at TIMESTAMPTZ,
last_ip VARCHAR(45), -- pro audit
is_active BOOLEAN DEFAULT true,
registered_at TIMESTAMPTZ DEFAULT now()
)
-- Adresáře synchronizované na daném zařízení
device_sync_dirs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
device_id UUID REFERENCES user_devices(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id) NOT NULL,
company_id UUID REFERENCES companies(id) NOT NULL,
local_path VARCHAR(1000) NOT NULL, -- C:\Users\jan\Dokumenty\Faktury
s3_prefix VARCHAR(500) NOT NULL, -- users/{uid}/sync/faktury/
label VARCHAR(255), -- "Faktury 2025"
sync_enabled BOOLEAN DEFAULT true,
sync_mode VARCHAR(20) DEFAULT 'sync',-- 'sync' | 'backup_only' | 'readonly'
last_sync_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now()
)
2.2 Limity zařízení dle tarifu¶
| Tarif | Zařízení per uživatel |
|---|---|
| Basic | 2 |
| Standard | 5 |
| Premium | neomezeno |
2.3 Správa zařízení v launcheru¶
Nastavení → Moje zařízení:
💻 PC kancelář Windows • naposledy viděno: dnes 14:23 [aktivní]
💻 Notebook doma Windows • naposledy viděno: včera 22:10 [aktivní]
💻 Starý laptop Windows • naposledy viděno: před 3 měs. [neaktivní]
[Odebrat zařízení]
[+ Přidat zařízení] (limit: 5/5 u Standard tarifu)
3. Sync protokol — Smart Sync¶
3.1 Režimy synchronizace¶
| Režim | Popis | Kdy použít |
|---|---|---|
sync |
Obousměrná synchronizace | Práce na více počítačích |
backup_only |
Jen nahrávat nahoru, nestahovat | Záloha archivních dat |
readonly |
Jen stahovat dolů | Sdílená data jen ke čtení |
3.2 Sync algoritmus — Smart Sync¶
Hlavní bezpečnostní pravidlo: před přepisem vždy záloha starší verze.
Sync cyklus pro adresář (spouštěn při startu, každých N minut, nebo manuálně):
PRO KAŽDÝ SOUBOR v lokálním adresáři:
1. Načti lokální metadata: path, size, mtime, checksum (SHA-256)
2. Načti remote metadata z S3 manifestu: path, size, mtime, checksum
3. Porovnej:
┌─────────────────────────────────────────────────────────────────┐
│ Scénář │ Akce │
├─────────────────────────────────────────────────────────────────┤
│ Lokál = Remote │ Nic — soubor je synchronizovaný │
│ (checksum shodný) │ │
├─────────────────────────────────────────────────────────────────┤
│ Lokál novější │ Upload lokálního souboru → Remote │
│ Remote neexistuje │ (nový soubor) │
├─────────────────────────────────────────────────────────────────┤
│ Remote novější │ a) Záloha lokálního souboru do history/ │
│ │ b) Download remote → přepis lokálního │
├─────────────────────────────────────────────────────────────────┤
│ KONFLIKT: │ a) Záloha OBOU verzí do history/ │
│ obě strany změněny │ b) Lokální přejmenovat: file.conflict.NNN │
│ od posledního sync │ c) Stáhnout remote jako hlavní verzi │
│ │ d) Uživatel dostane notifikaci │
└─────────────────────────────────────────────────────────────────┘
4. Aktualizuj lokální manifest (path, checksum, mtime, sync_at)
5. Aktualizuj remote manifest v S3
3.3 Záloha před přepisem (Pre-overwrite Backup)¶
Před každým přepisem lokálního souboru:
S3 target: users/{uid}/sync/{dir_label}/history/{YYYY-MM-DD}/{HH-MM-SS}_{filename}
Příklad:
Původní: users/abc/sync/faktury/faktura-001.pdf
Záloha: users/abc/sync/faktury/history/2026-04-26/14-23-05_faktura-001.pdf
Rotace history:
Uchovávat posledních N verzí (nastavitelné, default 30)
Starší verze → označit jako expired → GC po retention_years
3.4 Full Restore (obnova zničeného zařízení)¶
1. Uživatel se přihlásí na novém počítači
2. Launcher → Zálohy → [Obnovit zařízení]
3. Vybere:
Obnovit z zařízení: "PC kancelář" ▾
Stav k datu: [Nejnovější ▾] nebo [vybrat datum]
4. Launcher:
a. Stáhne manifest — seznam všech souborů a cest
b. Zobrazí přehled: "celkem 2 450 souborů, 12,4 GB"
c. Uživatel potvrdí cílovou složku
d. Launcher stáhne vše ze S3 → lokální adresářová struktura
e. Zapíše nové zařízení do device_sync_dirs
5. Po dokončení: normální sync provoz
4. Monetizace — Tarify per firma¶
4.1 Plány¶
| Plán | Úložiště | Uživatelé | Zařízení/uživatel | Zálohy | Cena/měsíc |
|---|---|---|---|---|---|
| Free | 1 GB | 1 | 1 | 30 dní | zdarma |
| Basic | 20 GB | 5 | 2 | 90 dní | 299 Kč |
| Standard | 100 GB | 20 | 5 | 365 dní | 990 Kč |
| Premium | 1 TB | neomezeno | neomezeno | 10 let | 2 990 Kč |
| Business | vlastní | vlastní | neomezeno | vlastní | na dotaz |
Doplňkové úložiště: +10 GB / 49 Kč / měsíc (Standard+)
Fair-use princip: - Firma platí za celý tým dohromady (ne per uživatel) - Pokud účetní pracuje pro 3 firmy → každá firma platí svůj vlastní tarif - Sdílená data se počítají do kvóty firmy, ne uživatele
4.2 Přehled využití v launcheru (company_owner / company_admin)¶
Správa → Tarif a úložiště:
Aktuální plán: Standard (100 GB / 20 uživatelů)
Cena: 990 Kč / měsíc • Obnovení: 1.5.2026
[Změnit plán]
Využití úložiště:
████████████░░░░░░░ 62 GB / 100 GB (62 %)
[Dokoupit +10 GB]
Rozpad dle uživatelů:
Jan Novák 18,4 GB ████░░░
Jana Krásná 14,1 GB ███░░░░
Petr Mlynář 9,8 GB ██░░░░░
Sdílené adresáře 12,5 GB ██░░░░░
AVAX aplikace 7,2 GB █░░░░░░
4.3 Upozornění při překročení¶
70 % kvóty → info banner v launcheru, e-mail adminovi
90 % kvóty → varování v launcheru, e-mail adminovi + ownerovi
100 % kvóty → zálohy nových dat zastaveny (existující čitelné)
červený banner v launcheru, opakovaný e-mail
> 100 % → pouze po ručním navýšení super adminem (přechodný stav)
5. Bezpečnostní model mazání dat¶
5.1 Zásady¶
PRAVIDLO: Nikdo nemůže data fyzicky smazat okamžitě.
Každé smazání prochází schválením a 30denní lhůtou.
5.2 Kdo může označit soubory ke smazání¶
| Kdo | Co může označit |
|---|---|
user |
Vlastní soukromé soubory (ve svém adresáři) |
company_admin |
Jakékoliv soubory v rámci firmy |
company_owner |
Jakékoliv soubory + schvaluje mazání |
super_admin (Avaxis) |
Vše (technická nutnost, audit log povinný) |
5.3 Flow mazání¶
KROK 1 — Označení ke smazání:
Uživatel / admin označí soubory v UI
→ Stav: pending_approval
→ Systém zapíše: {označil: user_id, kdy: now(), soubory: [...]}
KROK 2 — Notifikace ownera:
company_owner dostane e-mail + in-app notifikaci:
"Jan Novák označil 24 souborů (1,2 GB) ke smazání. Vyžaduje vaše schválení."
→ Odkaz na přehled označených souborů
KROK 3 — Review ownera:
Owner vidí:
📁 Označené ke smazání — Jan Novák — 2026-04-26
┌─────────────────────────────────────────────────┐
│ faktura-2024-001.pdf 234 KB Fakturace Pro │
│ faktura-2024-002.pdf 189 KB Fakturace Pro │
│ priloha-smlouva.docx 456 KB Obecné │
│ ... (21 dalších) │
└─────────────────────────────────────────────────┘
[Zobrazit vše] [Stáhnout přehled PDF]
[✓ Schválit smazání] [✗ Zamítnout]
KROK 4 — Schválení:
→ Stav: approved_for_deletion
→ Lhůta: 30 dní od schválení
→ Banner v launcheru: "Soubory budou smazány za 30 dní. [Zrušit]"
KROK 5 — Grace period (30 dní):
Owner nebo admin může mazání ZRUŠIT do konce lhůty
→ Stav zpět: active
KROK 6 — Garbage Collector:
Po uplynutí 30 dní → GC fyzicky smaže ze S3
→ Stav: deleted (s3_key = NULL, deleted_at = timestamp)
→ Aktualizace kvóty firmy
→ Audit log: {gc_deleted, soubory, bytes_freed, schválil: owner_id}
→ Shrnutí e-mail ownerovi
5.4 Databázové rozšíření¶
-- Rozšíření backup_snapshots / obecný deletion request
storage_deletion_requests (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
company_id UUID REFERENCES companies(id),
requested_by UUID REFERENCES users(id),
approved_by UUID REFERENCES users(id), -- company_owner
rejected_by UUID REFERENCES users(id),
status VARCHAR(30) DEFAULT 'pending_approval',
-- 'pending_approval' | 'approved' | 'rejected' | 'cancelled' | 'completed'
approve_deadline TIMESTAMPTZ, -- owner musí reagovat do N dní (default 14)
delete_after TIMESTAMPTZ, -- 30 dní od schválení
reason TEXT, -- volitelný komentář
file_count INTEGER,
total_bytes BIGINT,
s3_keys JSONB, -- seznam S3 klíčů ke smazání
created_at TIMESTAMPTZ DEFAULT now(),
completed_at TIMESTAMPTZ
)
6. Sdílení souborů a adresářů¶
6.1 Model sdílení¶
Uživatel sdílí vlastní podadresáře (granularita: složka). Admin sdílí adresáře v rootu firemního bucketu. Soubor lze sdílet přes shareable link (veřejná URL s TTL).
Adresářová struktura z pohledu uživatele Jana:
Moje soubory/
├── Faktury/ [jen já]
│ ├── 2024/
│ └── 2025/ [sdíleno s rolí Účetní — čtení+zápis]
├── Smlouvy/ [sdíleno s Jana Krásná — jen čtení]
├── Osobní/ [jen já]
└── Projekt XYZ/ [sdíleno s firmou B (cross-firma) — čtení]
Firemní adresáře (admin spravuje v rootu):
Firma/
├── HR dokumenty/ [role Mzdový účetní — čtení+zápis]
├── Celopodnikové/ [všichni — jen čtení]
└── Vedení/ [role Ředitel — čtení+zápis]
6.2 ACL datový model¶
-- Sdílení adresáře (platí pro celou složku včetně podadresářů)
storage_shares (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
company_id UUID REFERENCES companies(id) NOT NULL,
owner_user_id UUID REFERENCES users(id), -- NULL = firemní adresář (admin)
s3_prefix VARCHAR(500) NOT NULL, -- cesta v S3
label VARCHAR(255) NOT NULL, -- "Faktury 2025"
is_company_dir BOOLEAN DEFAULT false, -- firemní vs. uživatelský
created_at TIMESTAMPTZ DEFAULT now()
)
-- ACL záznamy per sdílení
storage_share_access (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
share_id UUID REFERENCES storage_shares(id) ON DELETE CASCADE,
-- JEDEN z těchto čtyř:
grantee_user_id UUID REFERENCES users(id),
grantee_role_id UUID REFERENCES company_roles(id),
grantee_company_id UUID REFERENCES companies(id), -- cross-firma sdílení
all_company BOOLEAN DEFAULT false,
can_read BOOLEAN NOT NULL DEFAULT true,
can_write BOOLEAN NOT NULL DEFAULT false,
granted_by UUID REFERENCES users(id),
granted_at TIMESTAMPTZ DEFAULT now(),
expires_at TIMESTAMPTZ, -- volitelná expirace přístupu
CONSTRAINT one_grantee CHECK (
(grantee_user_id IS NOT NULL)::int +
(grantee_role_id IS NOT NULL)::int +
(grantee_company_id IS NOT NULL)::int +
(all_company = true)::int = 1
)
)
-- Shareable linky (pro jednotlivé soubory)
storage_share_links (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
company_id UUID REFERENCES companies(id),
created_by UUID REFERENCES users(id),
s3_key VARCHAR(500) NOT NULL, -- konkrétní soubor
label VARCHAR(255),
token VARCHAR(64) UNIQUE NOT NULL, -- náhodný token v URL
can_write BOOLEAN DEFAULT false,
max_downloads INTEGER, -- NULL = neomezeno
downloads INTEGER DEFAULT 0,
expires_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT now(),
last_used_at TIMESTAMPTZ
)
6.3 Cross-firma sdílení¶
Jan z Novák s.r.o. chce sdílet složku „Projekt XYZ" s firmou ABC Účetnictví:
1. Jan v S3 Backup → Moje soubory → Projekt XYZ → [Sdílet]
2. Vybere: "Jiná firma na platformě AVAX"
3. Zadá IČO nebo název firmy: "ABC Účetnictví"
4. Nastaví: jen čtení / čtení+zápis
5. Volitelně: expirace přístupu
Výsledek:
Členové ABC Účetnictví vidí „Projekt XYZ / od Novák s.r.o."
ve svém S3 Backup pod záložkou „Sdíleno se mnou"
6.4 Shareable link (soubor)¶
URL: https://api.avaxis.cz/storage/share/{token}
Chování:
• Bez přihlášení: stáhnout soubor (veřejný link)
• S přihlášením: stáhnout + zobrazit v prohlížeči
• Expirace, limit stažení, volitelné heslo
Launcher UI:
Pravý klik na soubor → [Vytvořit sdílený link]
→ zobrazí URL + možnosti:
Platnost: [7 dní ▾]
Max stažení: [bez limitu ▾]
Heslo: [nepovinné]
→ [Kopírovat link] [Odeslat e-mailem]
6.5 Sledovaná složka — Subscribed Folder Sync¶
Scénář: Jan zálohuje složku Faktury/2025/ na S3. Účetní Jana chce tuto
složku mít automaticky synchronizovanou na svém disku — kdykoli Jan přidá
novou fakturu, Jana ji dostane lokálně bez jakékoliv akce.
Jak to funguje¶
JAN (vlastník) S3 JANA (účetní)
───────────────── ───────── ─────────────────
Uloží faktura-010.pdf ──sync──► Faktury/2025/ ◄──sync── C:\Účetnictví\Novák\
faktura-001.pdf faktura-001.pdf ✓
... ...
faktura-010.pdf ──nová── faktura-010.pdf ↓ stahuje
Technicky jde o rozšíření device_sync_dirs — Jana si přidá cizí sdílenou
složku jako sync dir na svém zařízení. Launcher ji synchronizuje stejným
algoritmem jako vlastní složky, ale zdroj je Janův S3 prefix.
Rozšíření datového modelu¶
-- Rozšíření device_sync_dirs o volitelný odkaz na sdílenou složku
ALTER TABLE device_sync_dirs
ADD COLUMN share_id UUID REFERENCES storage_shares(id),
-- NULL = vlastní složka, NOT NULL = sledovaná cizí složka
ADD COLUMN source_user_id UUID REFERENCES users(id);
-- kdo je vlastník zdroje (pro zobrazení "Sleduje: Jan Novák")
-- Pokud share_id IS NOT NULL:
-- s3_prefix = share.s3_prefix (cesta Janovy složky)
-- sync_mode = dle share ACL (readonly nebo sync)
-- source_user_id = Jan's user_id
Sync pravidla pro sledovanou složku¶
Readonly (Jana má jen čtení):
sync_mode = 'readonly'
Launcher: stahuje nové/změněné soubory od vlastníka
Jana nemůže nahrávat zpět → lokální změny se NEODESÍLAJÍ
Konflikt nenastane (Jana nepíše do S3)
Read-write (Jana může i přidávat/měnit):
sync_mode = 'sync'
Obě strany mohou zapisovat → může nastat konflikt
Konflikt: záloha obou verzí + přejmenování na .conflict
"Kdo vyhraje": novější timestamp → vítěz (stejná logika jako vlastní sync)
Flow — jak Jana přihlásí sledovanou složku¶
KROK 1 — Jan sdílí složku (UI nebo ACL):
Jan → S3 Backup → Faktury/2025/ → [Sdílet] → Jana Krásná (jen čtení)
→ Vznikne storage_shares záznam + storage_share_access pro Janu
KROK 2 — Jana vidí sdílenou složku:
Jana → S3 Backup → záložka „Sdíleno se mnou"
→ Faktury 2025 (od: Jan Novák, Novák s.r.o.) [Jen čtení]
[Procházet] [Synchronizovat na disk]
KROK 3 — Jana přihlásí k synchronizaci:
[Synchronizovat na disk] → dialog:
Lokální cesta: C:\Účetnictví\Novák\Faktury2025 [Procházet]
Zařízení: ☑ PC kancelář ☐ Notebook doma
[Zahájit první sync]
→ Vznikne device_sync_dirs s share_id = Janův share záznam
KROK 4 — Automatická synchronizace:
Launcher Jany synchronizuje každých N minut (dle nastavení)
→ Při detekci nového souboru u Jana: tray notifikace:
"Jan Novák přidal 2 soubory do Faktury 2025"
Notifikace¶
Tray notifikace (launcher Jany):
"📁 Faktury 2025 — 3 nové soubory od Jan Novák"
[Zobrazit]
Nastavení notifikací per sledovaná složka:
○ Okamžitě při každé změně
○ Shrnutí jednou denně
○ Vypnout
UI v pohledu uživatele — rozšíření¶
S3 Backup — Moje zálohy
Moje synchronizované složky:
📁 Dokumenty/Faktury 15,4 GB Synchronizováno [↑↓] [...]
📁 Dokumenty/Smlouvy 3,2 GB Synchronizováno [↑↓] [...]
Sledované složky (od ostatních):
📁 C:\Účetnictví\Novák\ Faktury 2025 Zdroj: Jan Novák
2,1 GB ↓ Jen čtení poslední sync: 14:25 [...]
📁 C:\Klienti\XYZ\ Sklad dokumenty Zdroj: XYZ Trade
0,8 GB ↕ Čtení+zápis poslední sync: včera [...]
[+ Sledovat sdílenou složku]
Ukončení sledování¶
Jana → [...] → [Přestat sledovat]
→ Odstraní device_sync_dirs záznam
→ Lokální soubory Jana zůstanou (nestáhne nic zpět na Jana)
→ Jan dostane notifikaci: "Jana Krásná přestala sledovat Faktury 2025"
(volitelné — nastavitelné kdo dostane notifikaci)
7. S3 Backup — aplikace¶
7.1 Umístění a charakter¶
- Dostupná v záložce Software launcheru (stejně jako Fakturace Pro atd.)
- Poběží v launcheru (ne jako samostatný proces) — launcher2 obsahuje celou logiku, aplikace je jen UI vrstva
- Pracuje s daty AVAX aplikací i obecnými složkami z počítače
7.2 Dva pohledy¶
Pohled uživatele¶
S3 Backup — Moje zálohy
[Zařízení: PC kancelář ▾] [Poslední sync: dnes 14:25 ✓]
Synchronizované složky:
📁 Dokumenty/Faktury 15,4 GB ████░ Synchronizováno [↑↓] [...]
📁 Dokumenty/Smlouvy 3,2 GB █░░░░ Synchronizováno [↑↓] [...]
📁 Plocha 0,8 GB ░░░░░ Synchronizováno [↑↓] [...]
──────────────────────────────────────────────────────────────
[+ Přidat složku]
AVAX aplikace (automatické zálohy):
[F] Fakturace Pro Záloha: dnes 09:01 45 MB ✓ OK
[M] Mzdový systém Záloha: dnes 09:05 32 MB ✓ OK
Sdílené se mnou:
📁 Projekt XYZ od Novák s.r.o. [Jen čtení]
📁 HR dokumenty firemní [Čtení+zápis]
Pohled company_admin / company_owner¶
S3 Backup — Správa firmy
Přehled uživatelů:
Uživatel Zařízení Zálohy Úložiště Stav
──────────────────────────────────────────────────────────
Jan Novák 2 poslední: dnes 18,4 GB ✓ OK
Jana Krásná 3 poslední: dnes 14,1 GB ✓ OK
Petr Mlynář 1 poslední: včera 9,8 GB ⚠ Upozornění
[klik na uživatele → detail: zálohy, sdílení, zařízení, požadavky na smazání]
Čekající na schválení smazání: [2] ← badge
→ Petr Mlynář označil 24 souborů (1,2 GB) [Zkontrolovat]
→ Jana Krásná označila 8 souborů (450 MB) [Zkontrolovat]
Sdílené adresáře (firemní):
📁 HR dokumenty Účetní (čtení+zápis) [Spravovat]
📁 Celopodnikové Všichni (čtení) [Spravovat]
[+ Nový firemní adresář]
7.3 AVAX aplikace a jejich zálohy¶
Každá distribuovaná AVAX aplikace zálohuje do speciální složky:
S3 klíč: companies/{cid}/users/{uid}/avax-apps/{app-slug}/
├── data/
│ └── latest/ ← aktuální stav (sync target)
│ └── db.sqlite, files/, ...
├── backups/
│ └── {YYYY-MM-DD}/ ← denní snapshoty
│ └── db.sqlite, files/, ...
└── settings.json ← nastavení aplikace
Aplikace neřeší zálohy sama — volá app.sync.request() přes SDK
a launcher provede sync + snapshot.
7.4 Obecné složky (arbitrary backup)¶
Uživatel přidá libovolnou složku z počítače:
[+ Přidat složku] → dialog:
Lokální cesta: C:\Users\jan\Dokumenty\Faktury [Procházet]
Název: Faktury
Firma: Novák s.r.o. ▾
Sync mód: ○ Sync (obousměrný)
○ Backup only (jen nahrávat)
○ Read-only (jen stahovat)
Zařízení: ☑ PC kancelář ☑ Notebook doma
Exkluzní: *.tmp *.log (ignorovat tyto vzory)
[Zahájit první sync]
7.5 Spuštění synchronizace¶
Triggery syncu:
• Automaticky: každých N minut (nastavitelné: 5 / 15 / 30 / 60 min)
• Při startu launcheru
• Po spuštění AVAX aplikace (sync před spuštěním)
• Po zavření AVAX aplikace (sync po zavření)
• Manuálně: tlačítko [Synchronizovat nyní]
• SDK: app.sync.request() z aplikace
Tray ikona signalizuje stav:
Modrá (pulzující) = sync probíhá
Zelená = vše OK
Žlutá = čeká se na sync (offline nebo throttle)
Červená = chyba posledního syncu
8. API endpointy — S3 Backup¶
# Storage tokeny
GET /storage/token?scope={scope}&[dir_id=]&[app_slug=]
GET /storage/usage
GET /storage/usage/company → jen admin/owner
# Zařízení
GET /storage/devices
POST /storage/devices → registrace nového zařízení
PUT /storage/devices/{id} → přejmenování, deaktivace
DELETE /storage/devices/{id}
# Sync adresáře (vlastní i sledované)
GET /storage/sync-dirs?device_id={id}
POST /storage/sync-dirs # own dir nebo subscribe (share_id)
PUT /storage/sync-dirs/{id}
DELETE /storage/sync-dirs/{id} # unsubscribe nebo odebrat vlastní
# Sledované složky
GET /storage/shares/subscribed # složky sdílené SE MNOU (kandidáti)
POST /storage/sync-dirs/subscribe # přihlásit sledování: { share_id, local_path, device_id }
# Sdílení
GET /storage/shares → moje + sdílené se mnou
POST /storage/shares → nové sdílení
GET /storage/shares/{id}/access
POST /storage/shares/{id}/access
DELETE /storage/shares/{id}/access/{aid}
# Shareable linky
POST /storage/share-links → vytvořit link
GET /storage/share-links → moje linky
DELETE /storage/share-links/{id}
GET /storage/share/{token} → veřejné stažení (bez auth)
# Mazání
GET /storage/deletion-requests → čekající na schválení (admin/owner)
POST /storage/deletion-requests → označit ke smazání
POST /storage/deletion-requests/{id}/approve → owner schválí
POST /storage/deletion-requests/{id}/reject
POST /storage/deletion-requests/{id}/cancel → zrušit do konce lhůty
# Cross-firma (sdílení)
GET /storage/company-search?q={name_or_ico} → hledání firem na platformě
9. S3 bucket struktura — finální¶
s3://avaxis/
├── companies/
│ └── {company-id}/
│ ├── users/
│ │ └── {user-id}/
│ │ ├── identity.json ← GDPR
│ │ ├── license.jwt
│ │ ├── avax-apps/
│ │ │ └── {app-slug}/
│ │ │ ├── data/latest/ ← sync target AVAX aplikací
│ │ │ ├── backups/ ← denní snapshoty
│ │ │ └── settings.json
│ │ └── sync/
│ │ └── {dir-label}/ ← obecné složky uživatele
│ │ ├── .manifest.json ← sync metadata
│ │ ├── {soubory...} ← aktuální stav
│ │ └── history/ ← verze před přepisem
│ │ └── YYYY-MM-DD/
│ │
│ └── shared/
│ ├── company/ ← firemní adresáře (admin)
│ │ └── {share-label}/
│ └── cross/ ← cross-firma sdílení (read-only pro příjemce)
│ └── {share-id}/
│
└── apps/ ← katalog aplikací
└── catalog/{app-slug}/...
10. Implementační fáze¶
| Fáze | Co | Závislost |
|---|---|---|
| DB-01 | Migrace: user_company_memberships, user_devices, device_sync_dirs |
F1 hotovo |
| DB-02 | Migrace: storage_shares, storage_share_access, storage_share_links, storage_deletion_requests |
DB-01 |
| BE-01 | /storage/token + STS politiky (MinIO AssumeRole) |
DB-01 |
| BE-02 | /storage/devices CRUD |
DB-01 |
| BE-03 | /storage/shares + ACL + cross-firma |
DB-02 |
| BE-04 | /storage/deletion-requests flow |
DB-02 |
| BE-05 | /storage/share-links veřejné stahování |
DB-02 |
| L-01 | Launcher: context switcher (multi-firma) | BE-01 |
| L-02 | S3 Backup obrazovka — uživatelský pohled | BE-01, BE-02 |
| L-03 | S3 Backup obrazovka — admin pohled | BE-01, BE-03, BE-04 |
| L-04 | Sync agent: smart sync, device sync dirs | BE-01, BE-02 |
| L-05 | Full restore, conflict handling | L-04 |
| L-06 | Shareable linky, cross-firma sdílení | BE-03, BE-05 |
11. Otevřené otázky¶
| Otázka | Doporučení | Stav |
|---|---|---|
| MinIO STS AssumeRole — funguje na našem stacku? | Ověřit na avaxdev; alternativa: presigned URL s condition keys | ❓ |
| Multi-firma login — přihlašuje se uživatel vždy do "výchozí" firmy, nebo vybírá? | Doporučuji: výchozí = poslední použitá firma | ❓ |
| Owner approval timeout — co pokud owner 14 dní nereaguje? | Reminder e-mail + eskalace na super_admin, nebo auto-zamítnutí | ❓ |
| Cross-firma sdílení — obě firmy musí být na platformě? | Ano — pro anonymní přístup slouží shareable link | rozhodnuto ✓ |
| Šifrování — sdílené adresáře cross-firma šifrovat E2E? | Doporučuji AES-256 SSE-S3 pro standard, E2E jen Premium | ❓ |
| Sloučená knihovna — výchozí stav zapnuto nebo vypnuto? | Doporučuji: výchozí vypnuto, uživatel zapne | ❓ |
Vytvořeno: 2026-04-26 | Verze: 1.0 Navazuje na: auth-organization.md, sync-backup.md, user-data-sharing.md, s3development.md