# Ce rulează în fundal

Sarcinile care rulează fără un om în pagină: cele pornite din procesul API, worker-ul cozii de ieșire, executorii și unitățile programate pe serverul firmei, cu orele lor.

## Pe scurt

| Unde rulează | Ce e acolo |
| --- | --- |
| Procesul API | sarcinile periodice ale API-ului |
| Worker-ul (`aplicatii/worker`) | livrarea cozii de ieșire `evenimente_iesire` |
| Executorii | programe de pe serverul firmei care iau lucru din API, cu rolul `executor` |
| Unități programate | timere pe serverul firmei: verificarea canalelor, SPV, evidența, statisticile și altele |

## Tabelul orelor

Orele fixe sunt date cu fusul lor. Intervalele „la fiecare” nu depind de fus: se socotesc de la ultima rulare.

Coloana „În cod” spune ce scrie în unitățile din codul platformei. Coloana „Pe server” spune ce rulează de fapt pe serverul platformei, citit cu `systemctl` pe 12.11.2026. Unde cele două diferă, contează coloana „Pe server”: acolo programul a fost schimbat după nevoile restaurantului.

| Sarcină | În cod | Pe server | Ce face |
| --- | --- | --- | --- |
| Statistici social, rularea completă | zilnic, 03:20, plus până la 2 min, ora României | instalată, dar oprită | citește Facebook, Instagram, TikTok, cu 28 de zile înapoi |
| Statistici social, rularea ușoară | la 30 min | zilnic, 03:30, ora României | contul, seriile și postările din ultimele 7 zile |
| Facturi primite din SPV | luni–sâmbătă, 08:30, plus până la 2 min, ora României | unitatea din cod nu e instalată; rulează în locul ei o sincronizare SPV zilnică, la 03:00, ora României, cu un program din afara codului platformei | aduce facturile primite din ANAF e-Factura |
| Evidența, jobul zilnic | zilnic, 06:10, ora României | nu e instalată | import FGO și legarea automată a recurențelor |
| Registru ← FGO | la minutul 07 și 37 al fiecărei ore, plus până la 1 min | nu e instalată | se amână singur când serverul e încărcat peste 6 |
| Specificațiile calculatoarelor | zilnic, 03:00, ora PC 1, ca sarcină programată pe PC 1, nu pe server | nu rulează pe server: serverul doar primește fișierul scris de PC 1 | model, procesor, RAM, disc și sistem pentru fișa tehnică, doar citire, fără stare live |
| Verificarea canalelor | la 3 min | la 5 min | citește canalele și scrie bifele din tabelul Produse |
| Pinterest | la 5 min | o dată pe oră, la minutul 20, ora României | citește pinii și scrie bifa Pinterest în tabel |
| Colectorul Jurnal live | la 30 s | nu e instalată | ce au făcut timerele și executorii, spre `POST /v1/jurnal-live` |
| Oglinda pe NAS | la 2 min | nu e instalată | copiază codul pe NAS, doar fast-forward |
| Finder, anunțuri | la 30 min | zilnic, 03:30, ora României | colectorul de anunțuri: Storia, OLX, Publi24, Imobiliare, Anunțul |
| Finder, joburi | la 6 h | instalată, dar oprită | colectorul de anunțuri de joburi |

„Nu e instalată” înseamnă că unitatea nu există pe serverul platformei; dacă rulează pe altă mașină nu se poate vedea din cloud, deci acolo e **neverificat**. Ultimele trei rânduri rulează în procesul API și pornesc doar cu variabile din fișierul de setări al serverului, care nu se poate citi fără drept de administrator: de aceea sunt marcate „neverificat”.

Serverul rulează pe UTC (citit pe server: `Etc/UTC`). De aceea timerele cu oră fixă își scriu fusul `Europe/Bucharest`, iar trecerea la ora de vară sau de iarnă se face singură.

## Sarcinile din procesul API

Cele trei pornesc după ce API-ul începe să asculte. Fiecare e **oprită** până primește lista de firme din mediu. Trecerile nu se suprapun: dacă una încă rulează, următoarea e sărită.

| Sarcină | Pornită de | Interval implicit | Condiții |
| --- | --- | --- | --- |

- **Completarea** scrie doar ce lipsește. Alergenii se scriu numai unde sunt „necompletați”, deci ce a declarat omul nu se suprascrie. Schimbările apar în `events` pe un cont tehnic, nu pe un om.
- **Pozele lipsă** nu dublează o generare: un produs cu job activ sau cu o generare în ultimele 6 ore e sărit.

> [!NOTE]
> O firmă care eșuează nu le oprește pe celelalte: eroarea se scrie în jurnalul API-ului, iar trecerea continuă.

## Worker-ul: coada de ieșire

Worker-ul livrează evenimentele din tabelul `evenimente_iesire` (outbox) către o adresă dată în `TINTA_URL`.

| Pas | Ce face |
| --- | --- |
| La pornire | numără firmele vizibile; iese cu codul `2` dacă vede 0 firme (RLS), `3` dacă nu are drept de citire, `1` la altă eroare |
| O trecere | pentru fiecare firmă ia cel mult 20 de evenimente și le livrează pe rând |
| Livrarea | `POST` cu `Idempotency-Key` = id-ul evenimentului; 2xx = `livrata`, altfel reîncercare |
| Eșecul | după 5 încercări evenimentul devine `esuata` și nu se mai reia |
| Blocajul | un eveniment rămas `in_lucru` peste 10 minute redevine eligibil |
| Oprirea | la `SIGTERM` termină evenimentul în curs și iese |

Pauza dintre treceri e `INTERVAL_MS`, de cel puțin 100 ms. Timpul de livrare, `TIMEOUT_MS`, e implicit 10 secunde și trebuie să fie sub cele 10 minute de expirare, altfel worker-ul nu pornește.

## Executorii

Un executor este un program de pe serverul firmei care vorbește cu platforma **doar prin API**, cu un jeton de serviciu cu rolul `executor`. Jetoanele se citesc din `JETOANE_SERVICIU` și dintr-un dosar de jetoane. Un fișier stricat e sărit, ca să nu oprească API-ul.

| Rută | Cine o folosește |
| --- | --- |
| `POST /v1/spv/sincronizeaza` | timerul SPV |
| `POST /v1/jurnal-live` | colectorul Jurnal live |
| `POST /v1/executori/social-statistici` | colectorul de statistici social |
| `POST /v1/wtso/proiecte`, `…/rulare/preia`, `…/rulare/{id}/log` | worker-ul de traducere și SEO al site-urilor |
| `POST /v1/flux-lant/stare` | starea lanțului de produse |
| `POST /v1/agentie/scraper/stare` | starea scraperului agenției |

O cerere trece dacă **oricare** identitate a ei are rolul cerut: un jeton de executor valid nu e umbrit de un cookie de om. Modelul cozii este descris în [Sisteme externe și executori](#sisteme-externe).

## Pornite la cerere, nu la oră

| Unitate | Pornește când |
| --- | --- |
| Puntea asistentului | rulează mereu și repornește la 3 s după o cădere; cel mult 2 cereri în paralel, 55 s pe cerere |
| Puntea imaginilor | rulează mereu și repornește la 3 s; o cerere odată, 180 s pe cerere |

Pe serverul platformei, niciuna dintre aceste trei unități nu e instalată cu numele din cod (citit 12.11.2026). Unde rulează: **neverificat**.

> [!WARNING]
