Licence
Získání, instalace a obnova enterprise licence — souboru podepsaného dodavatelem a ověřovaného offline proti klíči zabudovanému do serveru.
Co je licence
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
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.
- Žá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 activese 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:
docker compose exec vitrinka /vitrinka license-inspect /run/license/license.jsonCo omezuje
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.
Nikdy tvrdé vypnutí a nikdy ztráta dat — zmrazení existuje proto, aby se z něj obnovou vystoupilo, ne aby trestalo.
Obnova
Vyměňte soubor a restartujte kontejner; licence se čte při startu, takže zmrazení zmizí, jakmile server nastartuje s obnoveným souborem:
cp new-license.json ./license/license.json
docker compose restart vitrinka