Přeskočit obsah
V
Pro vývojáře
Architektura, konvence, jádro systému a bezpečnost
Začínáme / Checklist nasazení

Nasazení#

Naplánované úlohy#

Bez nich systém nefunguje správně. Úlohy jsou presentery v app/UI/Cron/, spouštějí se HTTP požadavkem s tokenem.

Skupina Co dělá Jak často
Fronta e-mailů rozesílá každých pár minut
Expirace upozornění a mazání prošlých inzerátů a zápisů denně
Přepočty počty v kategoriích, ceny 10–15 min
Hlídací psi rozesílá upozornění průběžně nebo denně
Platby dofakturace, vyhodnocení průběžně
Plánovač faktur opakovaná fakturace denně
Elasticsearch synchronizace a noční reindex 10 min / denně
Sitemapy generování dle potřeby

Bez naplánovaných úloh se problémy projeví až za týdny

Inzeráty nevyprší, počty přestanou sedět, e-maily se hromadí. Nic to nehlásí. Po nasazení zkontrolujte, že úlohy skutečně běží.

Souběh úloh je ošetřený zámkem

Dvě instance téže úlohy se nespustí. Nespouštějte je ale zbytečně často — dlouhá úloha zablokuje tu následující.

Produkční nastavení#

Věc Nastavení
Ladicí režim vypnutý
Zobrazování chyb vypnuté, logovat
Mezipaměť zapnutá
docs/sql/ nedostupné zvenčí
Přístupy k branám jen v local.neon
www/uploads/ bez spouštění skriptů

Ladicí panel vypisuje konfiguraci včetně přístupových údajů

Zapnutý na produkci znamená, že klíče k platebním branám a dalším službám jsou ve zdroji stránky. Ověřte, že je vypnutý.

V www/uploads/ se nikdy nespouští kód

Nahrané soubory leží ve veřejném stromu a názvy si zachovávají příponu. Aplikace odmítá nebezpečné přípony (php, phtml, phar, cgi, sh, .htaccess …) v kterékoli části názvu, ale webový server je druhá pojistka.

Apache čte verzovaný soubor www/uploads/.htaccess (vypnutý PHP engine, odmítnuté skriptové přípony). Vyžaduje AllowOverride All (nebo alespoň FileInfo Options Limit) pro adresář webu.

nginx .htaccess nečte. Do bloku server doplňte před obecné location ~ \.php$:

location ~* ^/uploads/.*\.(php[0-9]?|phtml|phar|pht|phps|cgi|pl|py|sh)(\.|$) {
    deny all;
}

Po nasazení ověřte: nahraný test.php.txt v uploads/ se vrátí jako text, ne jako výstup skriptu.

Jak se rozhoduje o ladicím režimu#

Produkční výchozí stav je vypnuto; zapíná se explicitně. Rozhoduje App\Bootstrap::resolveDebugMode() v tomhle pořadí:

  1. proměnná prostředí NETTE_DEBUG1, true, on, yes zapnou, cokoli jiného včetně 0 a false vypne,
  2. existence souboru config/debug-mode.flag (v repu není; na dev serveru ho vytvoříte touchem),
  3. jinak vypnuto.

Proměnná prostředí přebíjí flag soubor

Když je NETTE_DEBUG nastavená na cokoli mimo povolenou čtveřici, flag soubor už se nečte. Na stroji, kde je proměnná nastavená omylem, proto touch nepomůže.

Sestavení assetů#

npm run build:admin:css
npm run build:admin:js

Používejte globální sass, ne npx sass

Jsou to jiné verze a produkují jiný výstup. Rozdíl se projeví jako drobné posuny v rozvržení, které nikdo nespojí s nasazením.

Nasazení na existující databázi#

Když se povyšuje starší instalace, nedědí se jen data, ale i vady schématu, které v ní léta nikdo neviděl. Projděte proto před nasazením Kontrolu databáze — jsou to samé SELECTy, dají se pustit i na produkci.

Nejdůležitější je první dotaz: vypíše překladové tabulky *_texts, kterým chybí složený primární klíč. Bez něj databáze pouští duplicitní překlady a každý další běh seedu je přidává.

Automatické kontroly tuhle vadu nenajdou

SchemaValidator::validateClass porovnává sloupce a typy, ne indexy — chybějící primární klíč mu projde. Zjistí se to jedině tímhle dotazem, nebo až tím, že se na webu ukazuje jiný text než v administraci.

Postup, když audit něco najde, i vzorové opravné skripty jsou v té kapitole.

Kontrola po nasazení#

  1. Titulní stránka a přihlášení.
  2. Jeden výpis v administraci a jeden formulář.
  3. Zkušební objednávka až po odeslání.
  4. Fronta e-mailů — odchází?
  5. Log chyb — přibylo něco?
  6. Kontrola databáze — u nasazení na existující databázi znovu, ať se ověří, že migrace nezavedly duplicitní překlady.

Zkušební objednávka je nejlepší test

Projde přes košík, platbu, sklad, fakturaci a e-maily naráz. Jeden průchod otestuje víc než hodina klikání po obrazovkách.