# Úložiště a nájemci (https://docs.vitrinka.ai/cs/security/storage)



## Jeden workspace, jeden soubor, jeden prefix [#tenancy]

Každý workspace je vlastní SQLite databáze pod `DATA_DIR` a vlastní prefix klíčů v úložišti blobů. Oddělení je fyzické, ne klauzule `WHERE`: neexistuje sdílená tabulka, kterou by dotaz překročil. Řídicí databáze drží organizace, členství, tokeny, zabalené klíče workspaců a auditní stopu — nikdy obsah workspace.

Servisní nebo agentní token se razí pro jeden workspace a při předložení jinému je odmítnutý. Osobní token a OAuth oprávnění AI klienta naopak jednají za svou osobu: každý požadavek se přepíše na rozsah workspace, kterému je určený, ověří proti aktuálnímu členství té osoby v něm a stropuje na roli člena, takže token nikdy nenese víc, než by neslo členství dané osoby.

Server drží fond otevřených handlerů nájemců (`VITRINKA_TENANT_POOL_MAX`, výchozí 64); workspace se otevírá při prvním použití a jeho klíč se v tu chvíli rozbalí.

## Backendy pro bloby [#backends]

| `BLOB_BACKEND` | Kde bloby leží                                  | Poznámky                                                                                         |
| -------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `fs` (výchozí) | `DATA_DIR/blobs`                                | Jeden svazek drží všechno; zálohujte ho spolu s databázemi.                                      |
| `s3`           | Bucket pojmenovaný `S3_BUCKET` na `S3_ENDPOINT` | Všech pět proměnných `S3_*` je povinných a ověřují se při startu; bucket se založí, pokud chybí. |

V obou případech se každý objekt zapisuje zapečetěný klíčem workspace ([Šifrování](/cs/security/encryption#sealed)). U S3 je průchozí cache pod `DATA_DIR/blobcache` (`BLOB_CACHE_MAX_GB`, výchozí 20, `0` vypíná) předehřátá při startu a mazaná od nejstaršího; její položky jsou stejný šifrovaný text, jaký drží bucket.

## Limity velikosti [#limits]

`MAX_SET_MB` (výchozí 200) stropuje tělo požadavku i rozbalenou velikost publikované sady. Dekódování obrázků a dokumentů je hlídané limitem, takže dekompresní bomba je odmítnutá, ne rozbalená.

## Kontrola malwaru [#malware]

S nastaveným `CLAMD_ADDR` se každý zápis blobu před uložením kontroluje pomocí clamd. Pokud skener neodpoví, zápis se odmítne. `CLAMD_MAX_MB` (výchozí 100) omezuje velikost kontrolovaného souboru; větší soubory se odmítají. Bez `CLAMD_ADDR` se kontrola neprovádí.

<Callout type="warn">
  Hostovaná služba má sidecar clamd napevno v compose. Vlastní instalace, která chce stejný postoj, provozuje vlastního démona ve stejné síti — adresa je jediná konfigurace.
</Callout>
