# Licence (https://docs.vitrinka.ai/cs/security/licensing)



## Co je licence [#what]

Licence je malý JSON soubor podepsaný Ed25519 klíčem dodavatele a vydaný na zákazníka. Každé oficiální vydání má veřejný klíč dodavatele zakompilovaný a věří právě tomuto jedinému klíči, takže se soubor ověřuje offline přímo v procesu serveru — žádné aktivační volání, žádný licenční server, žádné volání domů, nic, co by se rozbilo v air-gapped síti. Nese jméno zákazníka, tier, počet míst (0 = neomezeně), zda jsou povolené air-gap balíky, a datum vydání a expirace. Počet míst se zapíše do logu při startu kvůli pozdějšímu vyúčtování; za běhu se nevynucuje a nikam se nehlásí.

Samoobslužný kanál neexistuje: licence podepisuje dodavatel. O vydání i obnovu požádejte svého dodavatele — váš balík typicky dorazí s licencí už na místě.

## Instalace [#install]

Vložte `license.json` do adresáře `./license/` v balíku; Compose ho připojí jen pro čtení na `/run/license` a nasměruje na něj `LICENSE_FILE` (mimo balík je výchozí `DATA_DIR/license.json`). Umístění a zrádnost záloh (licence *není* v `/data`) pokrývá [Provoz](/cs/operator/operations#licensing).

* **Žádný soubor** — vitrinka běží v neomezeném vyhodnocovacím režimu; licenční mašinerie nedělá nic. Takhle běží hostovaná služba.
* **Platný soubor** — log při startu hlásí `license active` se zákazníkem, tierem, počtem míst a expirací.
* **Soubor, který server nedokáže použít** — start se odmítne a proces skončí s `license file <path> refused: <cause>. Fix: <fix>`. Rozbitá licence nikdy tiše nedegraduje na nelicencovanou.

| Příčina v odmítnutí                                              | Co udělat                                                                                                                                                         |
| ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `its signature does not verify against this build's license key` | Soubor byl upravený, poškozený při přenosu nebo ho nepodepsal dodavatel: vraťte `license.json` přesně tak, jak ho dodavatel vydal, nebo si ho nechte vydat znovu. |
| `not a well-formed license file`                                 | Nahraďte ho souborem od dodavatele bajt po bajtu — licence se ručně upravovat nedá.                                                                               |
| `issued in the future — the server clock is behind`              | Seřiďte hodiny hostitele (NTP) a restartujte; licence sama je v pořádku.                                                                                          |
| `cannot read it`                                                 | Zpřístupněte soubor procesu serveru pro čtení.                                                                                                                    |
| `this build carries no license public key`                       | Spusťte oficiální vydání vitrinky; tento build žádnou licenci ověřit neumí.                                                                                       |

Každé odmítnutí kromě toho kvůli hodinám jmenuje i vyhodnocovací východisko: soubor odstraňte a server poběží bez omezení.

Nainstalovaný soubor ověřte offline samotnou serverovou binárkou — kontroluje proti klíči, který má zabudovaný, a vypíše obsah licence s `expired` a `inGrace`, nebo odmítnutí, které by dal start. Když server start odmítl, provede stejnou kontrolu bez něj `docker compose run --rm --no-deps vitrinka license-inspect /run/license/license.json`:

```bash
docker compose exec vitrinka /vitrinka license-inspect /run/license/license.json
```

## Co omezuje [#gates]

Expirace je měkké zmrazení, nikdy vypnutí. Licencovaná instalace posílá `X-License-Status` na každé odpovědi — jen slovo stavu, nikdy údaje o držiteli licence:

| Stav                       | Chování                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Aktivní                    | Všechno funguje. `X-License-Status: active`.                                                                                                                                                                                                                                                                                                                                                                                             |
| Propadlá, v ochranné lhůtě | Všechno dál funguje **14 dní** po expiraci; aplikace ukazuje banner s výzvou k obnově a log při startu varuje `license expired — grace period running` (`X-License-Status: grace`).                                                                                                                                                                                                                                                      |
| Propadlá po lhůtě          | Každý zápis — jakákoli metoda kromě `GET`, `HEAD` a `OPTIONS` — dostane `403` s tím, že zápisy stojí až do obnovy; **čtení funguje vždy** a banner to oznamuje (`X-License-Status: expired`). Přihlášení, obnova účtu, health checky, tunel pro chyby z prohlížeče a endpoint stavu licence zůstávají otevřené, takže administrátor se vždy dostane dovnitř a obnoví; registrace, přidání passkey a připojení GitHubu počkají na obnovu. |

Přechod se děje živě — dlouho běžící proces překročí expiraci i lhůtu bez restartu.

`GET /api/v1/license` vždy odpoví `200`, zmrazená instalace nebo ne, a nikdy se neukládá do cache (`Cache-Control: private, no-store`). Volající bez přihlášené session v prohlížeči — včetně volajících s tokenem — dostane jen `licensed` a `status`, totéž slovo jako v hlavičce a vše, co čte banner. Přihlášená session v prohlížeči dostane navíc `customer`, `tier`, `expiry`, `expired` a `inGrace`. Na hostiteli přečte celý soubor bez session `license-inspect`.

<Callout type="warn">
  Nikdy tvrdé vypnutí a nikdy ztráta dat — zmrazení existuje proto, aby se z něj obnovou vystoupilo, ne aby trestalo.
</Callout>

## Obnova [#renew]

Vyměňte soubor a restartujte kontejner; licence se čte při startu, takže zmrazení zmizí, jakmile server nastartuje s obnoveným souborem:

```bash
cp new-license.json ./license/license.json
docker compose restart vitrinka
```
