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

Naplánované úlohy#

Všechno, co se v systému děje samo od sebe. Seznam se generuje z kódu, takže vyjmenovává přesně ty úlohy, které v repozitáři opravdu jsou.

Jak se úloha volá#

GET /cron/<modul>/<presenter>/<akce>?token=<cronToken>
Věc Jak to funguje
Ověření dotaz musí nést ?token= shodný s nastavením cronToken (skupina 1)
Odpověď vždy JSON — {"status":"ok",…}, {"status":"error",…} nebo {"status":"skipped"}
Souběh druhá instance téže úlohy skončí skipped, nečeká se

Bez tokenu vrací 403 — a prázdný token nepustí NIKOHO

Kontrola porovnává očekávanou a poslanou hodnotu; když cronToken v nastavení chybí, neprojde ani prázdný dotaz. Po nasazení na nový server je to první věc k vyplnění, jinak neběží vůbec nic a nikde to nekřičí.

Zámek souběhu je fail-open

Dokud tabulka zámků neexistuje, skipped se nikdy nevrátí a úlohy se můžou překrývat. Je to schválně — chybějící tabulka nemá zastavit provoz — ale znamená to, že „nikdy jsem skipped neviděl“ není důkaz, že zámek funguje.

Jak poznat, že úloha běžela

Podle odpovědi, ne podle toho, že „nic nespadlo“. {"status":"ok"} vrací i úloha, která neudělala nic — počty jsou v dalších klíčích odpovědi.

Nasazení#

Sloupec Doporučený interval je návrh ze zdrojového kódu — z něj se skládá crontab. Například:

*/1  * * * *  curl -s "https://web.cz/cron/system/email-queue/send?token=TOKEN"
*/5  * * * *  curl -s "https://web.cz/cron/store/reservation/expire?token=TOKEN"
15   3 * * *  curl -s "https://web.cz/cron/blog/sitemap/article?token=TOKEN"

Nezapojená úloha NIKDY neběží — a nic se nerozbije

Nespuštěná úloha nevyhodí chybu. Jen se přestane dít to, co měla dělat: nevyprší košíky, nevygenerují se faktury, neuklidí se data. Odhalí se to obvykle až tím, že něco „nějak narostlo“. Proto po instalaci projděte celý seznam níž, ne jen to, co zrovna používáte.

Ne všechno je periodické

Několik úloh je opravných nebo jednorázových — mají v intervalu napsané „ručně“. Do crontabu nepatří; pustí se, když je potřeba.

Sitemap index až po ostatních sitemapách

Skládá rozcestník z už vygenerovaných souborů. Když poběží první, sestaví ho z toho, co zbylo po minulém běhu.

Přehled úloh#

Sdílené#

Endpoint Co dělá Doporučený interval
/cron/base/rating/recalc Self-heal přepočet agregátu rating threadů (Fáze 6) periodicky, např. jednou denně (drift je výjimečný, ne hot-path)

Inzerce#

Endpoint Co dělá Doporučený interval
/cron/bazaar/advert/notice-expiration Pošle BZ_ADVERT_EXPIRATION_NOTICE inzerátům, kterým do N dní vyprší expirace (N = setting 5/expirationNoticeDays) denně (např. v noci)
/cron/bazaar/advert/delete-expired Tiše označí deleted=1 inzeráty, jimž od expirace uplynulo víc než M dní (M = setting 5/expirationDeleteDays) denně
/cron/bazaar/advert/recount-prices Přepočítá denormalizovaný sloupec price u všech inzerátů z parametru price periodicky, např. každých 10–15 minut
/cron/bazaar/category/recount Přepočítá denormalizovaný advert_count u všech kategorií periodicky, např. každých 10–15 minut
/cron/bazaar/elastic/reindex Full reindex inzerátů do nové verze indexů + atomický alias swap (bezvýpadkově, Redis lock proti souběhu) 1× denně v noci
/cron/bazaar/elastic/sync Inkrementální sync: doindexuje inzeráty vložené od watermarku (Redis es::watermark:bazaar_advert, 5 min překryv) + orphan cleanup (dokumenty bez DB řádku) každých 10 minut
/cron/bazaar/sitemap/category Sitemapa všech aktivních kategorií Bazaaru s hreflang variantami denně v noci
/cron/bazaar/sitemap/advert Sitemapa aktivních inzerátů, automaticky rozdělená na soubory po 50k podle rozsahů ID denně v noci
/cron/bazaar/watchdog-email/send Mód 1 — okamžité posílání průběžně, např. každých 5–10 minut
/cron/bazaar/watchdog-email/digest Mód 2 — denní digest jednou denně, např. ve 23:00

Blog#

Endpoint Co dělá Doporučený interval
/cron/blog/elastic/reindex Full reindex článků do nové verze indexů + atomický alias swap (bezvýpadkově, Redis lock proti souběhu) 1× denně v noci
/cron/blog/elastic/sync Inkrementální sync: doindexuje články změněné od watermarku (Redis es::watermark:blog_article, 5 min překryv) + orphan cleanup (dokumenty bez DB řádku) každých 10 minut
/cron/blog/sitemap/article denně v noci
/cron/blog/sitemap/event denně v noci
/cron/blog/sitemap/news denně v noci
/cron/blog/sitemap/article-category denně v noci
/cron/blog/sitemap/event-category denně v noci
/cron/blog/sitemap/news-category denně v noci

Katalog firem#

Endpoint Co dělá Doporučený interval
/cron/comcat/advert/notice-expiration Pošle CC_ADVERT_EXPIRATION_NOTICE inzerátům, kterým do N dní vyprší expirace (N = setting 5/expirationNoticeDays) denně (např. v noci)
/cron/comcat/advert/delete-expired Tiše označí deleted=1 inzeráty, jimž od expirace uplynulo víc než M dní (M = setting 5/expirationDeleteDays) denně
/cron/comcat/category/recount Přepočítá denormalizovaný advert_count u všech kategorií periodicky, např. každých 10–15 minut
/cron/comcat/elastic/reindex Full reindex firemních profilů (Comcat Advert) do nové verze indexů + atomický alias swap (bezvýpadkově, Redis lock proti souběhu) 1× denně v noci
/cron/comcat/elastic/sync Inkrementální sync: doindexuje inzeráty vložené od watermarku (Redis es::watermark:comcat_advert, 5 min překryv) + orphan cleanup (dokumenty bez DB řádku) každých 10 minut
/cron/comcat/sitemap/category Sitemapa všech aktivních kategorií Comcatu s hreflang variantami denně v noci
/cron/comcat/sitemap/advert Sitemapa aktivních inzerátů, automaticky rozdělená na soubory po 50k podle rozsahů ID denně v noci
/cron/comcat/watchdog-email/send Mód 1 — okamžité posílání průběžně, např. každých 5–10 minut
/cron/comcat/watchdog-email/digest Mód 2 — denní digest jednou denně, např. ve 23:00

Diskuze#

Endpoint Co dělá Doporučený interval
/cron/discussion/elastic/reindex Full reindex kořenů vláken (level=1) do nové verze indexu + atomický alias swap 1× denně v noci
/cron/discussion/elastic/sync Inkrementální sync: doindexuje nová vlákna od watermarku (Redis es::watermark:discussion_message, 5 min překryv) + orphan cleanup každých 10 minut
/cron/discussion/sitemap/message Sitemapa top-level (level=1) aktivních zpráv, automaticky rozdělená po 50k podle rozsahů ID denně v noci
/cron/discussion/sitemap/category Sitemapa všech kategorií Diskuze denně v noci

E-shop#

Endpoint Co dělá Doporučený interval
/cron/eshop/cart/cleanup Maže opuštěné košíky, kterým vypršela retenční lhůta denně v noci
/cron/eshop/complaint/expire Uzavírá reklamace, kterým vypršela lhůta na vyřízení denně (lhůty se počítají ve dnech)
/cron/eshop/elastic/reindex Full reindex prodejních karet do nové verze indexů + atomický alias swap (bezvýpadkově, Redis lock proti souběhu) 1× denně v noci
/cron/eshop/elastic/sync Inkrementální sync: doindexuje karty změněné od watermarku (Redis es::watermark:eshop_product_set, 5 min překryv) + orphan cleanup (dokumenty bez DB řádku) každých 10 minut
/cron/eshop/feed/generate Generuje XML feedy pro srovnávače zboží à hodinu (nebo dle požadavku srovnávače)
/cron/eshop/order/expire Ruší nezaplacené objednávky a dogeneruje chybějící doklady à hodinu
/cron/eshop/order/invoice Ruší nezaplacené objednávky a dogeneruje chybějící doklady à 15 minut
/cron/eshop/price/recalc Aktivuje naplánované ceny a srovná denormalizovaný sloupec ceny à 15 minut (aktivuje naplánované ceny — delší interval je oddálí)
/cron/eshop/product-import/run Spustí nejstarší job ve frontě každou minutu

Fakturace#

Endpoint Co dělá Doporučený interval
/cron/invoicer/payment/generate Vystavuje doklady k zaplaceným platbám podle pravidel modulu často (např. každých 15 min) — doklady vzniknou krátce po změně stavu platby, ale MIMO
/cron/invoicer/schedule/generate Vystavuje opakované faktury podle rozvrhů, kterým nastalo datum denně. Zpracuje max 7/scheduleBatchSize splatných rozvrhů (default 10);

Sklad#

Endpoint Co dělá Doporučený interval
/cron/store/batch/expiry-alert Upozorňuje na šarže, kterým se blíží expirace denně ráno
/cron/store/reservation/expire Uvolňuje skladové rezervace, kterým vypršela platnost à 5 minut
/cron/store/stock/recount Noční přepočet skladu — srovná rezervovaná množství, šarže a ceny karet denně v noci

Systém#

Endpoint Co dělá Doporučený interval
/cron/system/asset-thumbnail-catchup/generate Doplní image varianty (poster z prvního framu) pro video Assety, kterým varianty zatím nebyly fyzicky vygenerovány — typicky když v době uploadu ffmpeg chyběl nebo selhal denně v noci
/cron/system/asset-thumbnail-catchup/backfill-meta Doplní Asset.meta (reálné rozměry variant) assetům, kterým chybí (meta IS NULL) — tj jednorázově po nasazení, pak už netřeba
/cron/system/auth-log/purge-old Periodický cleanup persistentního audit logu (cms_system_auth_log) denně —
/cron/system/elastic/status Health ES clusteru + počty dokumentů per index — monitoring / smoke check ručně (kontrola stavu)
/cron/system/elastic/watch Hlídá dostupnost vyhledávání a hlásí problémy e-mailem à 15 minut
/cron/system/email-queue/send Postupné odeslání emailů z fronty à minutu
/cron/system/file-system/sanitize Cron pro sanitizaci názvů souborů/složek v uploads adresáři — projde celý strom a přejmenuje položky s nevyhovujícím názvem (diakritika, mezery, nepovolené znaky) na bezpečný tvar ručně, po hromadném nahrání souborů (není periodická)
/cron/system/jwt-deny-list/cleanup-expired Cleanup expirovaných řádků z cms_system_jwt_denylist (DB-backed JtiDenyList) denně v noci (při useRedis: true je to no-op)
/cron/system/page-tree/rebuild Regeneruje nested-set indexy (lft, rgt, level) stromu stránek v cms_system_pages z adjacency (parent_id) ručně, po hromadné změně stromu stránek (není periodická)
/cron/system/rate-limit/purge-old Cleanup expirovaných řádků z cms_system_rate_limit (DB-backed RateLimit) denně v noci (při useRedis: true je to no-op)
/cron/system/sitemap/generate Vygeneruje XML sitemapu pro System stránky se všemi jazykovými variantami (hreflang) denně v noci
/cron/system/sitemap/index Vygeneruje sitemap index (rozcestník) odkazující na všechny vygenerované sitemap- .xml soubory v adresáři denně v noci, AŽ PO ostatních sitemapách
/cron/system/user-refresh-token/purge-old Periodický cleanup expirovaných refresh tokenů (cms_system_user_refresh_tokens) denně