From 28296b390c7c03b5bb906653cd0af4b7d5f8834d Mon Sep 17 00:00:00 2001 From: Nenad Djukic Date: Sat, 25 Jul 2026 07:10:37 +0200 Subject: [PATCH] Preuzet radni paket LoggerService (RBAC kontrolna ravan) iz firmverskog repoa Paket je nastao u asp-terminia/serviseri/ ali je sav posao serverski (isti backend i baza kao ASP-Terminia licenciranje), pa se seli ovde - isto obrazlozenje i put kao docs/asp-terminia/. - docs/loggerservice/ - 7 dokumenata: vizija/MVP (merodavan dokument), ZAKLJUCEN RBAC model (stablo orgs, 4 role, invarijante, seme tabela), heartbeat/discovery formati koje uredjaj vec salje, provisioning i katalog firmvera, zadaci S1-S7, pravila rada na produkciji - reference prepravljene: "ASP repo" = https://git.terminia.net/djuka/asp-terminia, link ka docs/asp-terminia/ unutar istog repoa umesto stare "dal-license-server repo:" oznake - CLAUDE.md: sekcija LoggerService + koordinacija sa docs/asp-terminia/ (S1-S2 idu POSLE Z1 da se migracije ne sudare) Firmverska strana (svc.cpp, discovery/heartbeat) ostaje u ASP repou i ne dira se. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 26 ++++++ docs/loggerservice/00-vizija-i-mvp.md | 63 ++++++++++++++ docs/loggerservice/01-rbac-model.md | 81 ++++++++++++++++++ .../02-uredjaji-heartbeat-discovery.md | 60 ++++++++++++++ .../03-provisioning-i-fw-katalog.md | 62 ++++++++++++++ docs/loggerservice/04-zadaci.md | 82 +++++++++++++++++++ docs/loggerservice/05-pravila-rada.md | 33 ++++++++ docs/loggerservice/README.md | 61 ++++++++++++++ 8 files changed, 468 insertions(+) create mode 100644 docs/loggerservice/00-vizija-i-mvp.md create mode 100644 docs/loggerservice/01-rbac-model.md create mode 100644 docs/loggerservice/02-uredjaji-heartbeat-discovery.md create mode 100644 docs/loggerservice/03-provisioning-i-fw-katalog.md create mode 100644 docs/loggerservice/04-zadaci.md create mode 100644 docs/loggerservice/05-pravila-rada.md create mode 100644 docs/loggerservice/README.md diff --git a/CLAUDE.md b/CLAUDE.md index d8f7298..41e6b7a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -762,6 +762,32 @@ Razlika u odnosu na ESIR/ARV/LIGHT_TICKET koja se mora poštovati: --- +## Radni paket: LoggerService (kontrolna ravan za flote terminala) + +**Proširenje ovog servera**, ne novi projekat — RBAC stablo organizacija +(vendor → kupac → objekat, proizvoljna dubina), uređaji + heartbeat, servisni +grantovi, provisioning i katalog firmvera za ASP liniju terminala. Jedan Go +backend + baza, **dva lica** po hostu: `terminia.net` (vendor pogled) i +`loggerservice.com` (serviserski brend — kasnije samostalna aplikacija za +servisne firme, uređaji su joj samo modul). + +RBAC model je **ZAKLJUČEN** sa vlasnikom (2026-07-24) — nije predlog za +raspravu, implementacione odluke (kolone/indeksi/Go slojevi) su slobodne. + +Kompletan paket (vizija/MVP, RBAC šema i invarijante, heartbeat/discovery +formati koje uređaj već šalje, provisioning i katalog `.bin`-ova, zadaci +S1–S7, pravila rada na produkciji): + +**[`docs/loggerservice/README.md`](docs/loggerservice/README.md)** — čitati prvo, +pa **[`docs/loggerservice/00-vizija-i-mvp.md`](docs/loggerservice/00-vizija-i-mvp.md)** +(merodavan nad ostalim fajlovima u paketu gde se razlikuju). + +**Koordinacija sa `docs/asp-terminia/`:** isti backend, ista baza — zadaci S1–S2 +(migracije RBAC šeme) idu POSLE Z1 (ASP proizvod na licenci) da se migracije ne +sudare; `devices.license_id` referencira licencu iz tog paketa. + +--- + *Kreirano: mart 2026* *Ažurirano: 04.03.2026 — Kompletna implementacija, 22/22 testova* *Autor: Nenad Đukić / DAL d.o.o.* diff --git a/docs/loggerservice/00-vizija-i-mvp.md b/docs/loggerservice/00-vizija-i-mvp.md new file mode 100644 index 0000000..a0fbe9e --- /dev/null +++ b/docs/loggerservice/00-vizija-i-mvp.md @@ -0,0 +1,63 @@ +# LoggerService — vizija i MVP (DOGOVORENO sa vlasnikom, 2026-07-24 uveče) + +> Ovaj dokument je ISPRED svih ostalih u folderu: definiše ŠTA se gradi. +> Ostali fajlovi (01–05) opisuju delove; gde se razlikuju, ovaj je merodavan. + +## Vizija + +**LoggerService je samostalna aplikacija za servisne firme** — praćenje opreme, +ljudi i posla. **Kreće interno (vlasnikova firma), kasnije se PRODAJE drugim +servisnim firmama** (od prvog dana više-firmi u bazi — RBAC stablo iz 01). + +Naši pametni terminali su **MODUL „Uređaji"** koji se **uključuje u opcijama** +po firmi — nisu centar aplikacije. + +## Jezgro (uvek prisutno) + +| # | Celina | Dogovor | +|---|---|---| +| 1 | **Firme/nalozi** | vlasnikova firma prva; multi-tenant od starta (orgs stablo + 4 role iz `01-rbac-model.md`) | +| 2 | **Oprema — KIČMA aplikacije** | tačno se prati **SVAKI komad** (serijalizovan): identitet, istorija, kod kog klijenta je ugrađen. Zalihe/delovi (količine) takođe postoje, ali serijalizovana oprema je suština | +| 3 | **Klijenti** | zavode se **pri otvaranju PRVOG naloga** za tog klijenta; uz klijenta se vezuju oprema, reklamacije i servisi | +| 4 | **Nalozi za posao** | tipovi: **ugradnja / servis / reklamacija** → dodeljen serviseru → ishod se upisuje u ISTORIJU OPREME | +| 5 | **Zaduženja** | ko je od servisera šta poneo/vratio (naslanja se na opremu/robu) | +| — | Evidencija rada (sati/obračun) | **KASNIJE** — vlasnik već ima softver za to | + +## Modul „Uređaji" (uključiv u opcijama) — MVP obim + +Za sada **najosnovnije**, sa dve tvrde odrednice od vlasnika: + +1. **Upravljanje firmverom**: biće **VIŠE firmvera** (linija ASP: ASP-Terminia, + parking, garderoba…) — modul zna koji proizvod/verzija ide na koji uređaj i + omogućava podešavanje/dodelu FW (naslanja se na katalog `fw.terminia.net`, + vidi `03-provisioning-i-fw-katalog.md`). +2. **Direktno vezan za licencni server** (`dal-license-server`): modul + komunicira sa njim (proizvodi, licence po MAC-u, entitlements) — NE gradi + svoju paralelnu evidenciju licenci. Vidi paket [`docs/asp-terminia/`](../asp-terminia/README.md). + +Uz to iz postojećeg: uređaji se sami javljaju (heartbeat/discovery formati u +`02-uredjaji-heartbeat-discovery.md`) → status u modulu. + +**Prirodna sprega sa jezgrom:** terminal JE serijalizovana oprema (celina 2) — +modul „Uređaji" je specijalizacija komada opreme koji se uz to i sam javlja. + +## Šta ovo menja u zadacima (04-zadaci.md) + +- S1 (šema) se PROŠIRUJE jezgrom: `oprema` (serijalizovana, istorija), + `klijenti`, `nalozi` (ugradnja/servis/reklamacija), `zaduzenja`, `zalihe` — + pored već dogovorenih orgs/users/devices/entitlements/grants. +- „Dashboard" (S4) = MVP LoggerService aplikacije (jezgro), ne samo pregled + uređaja; modul „Uređaji" = toggle po firmi (entitlements). +- Infrastruktura je POSTAVLJENA 2026-07-24: `loggerservice.com` (+www) služi sa + 151 (`/var/www/loggerservice`, nginx sajt `loggerservice`, Let's Encrypt); + `licenca.terminia.net` → backend 8090; `fw.terminia.net` → `/var/www/fw`. + +## Redosled gradnje (predlog za agenta) + +1. Šema jezgra (migracije, multi-tenant od starta) — uz postojeći MySQL. +2. Minimalni tok koji vlasnikova firma odmah koristi: **klijent (pri prvom + nalogu) → nalog (ugradnja) → komad opreme zaveden kod klijenta → istorija**. +3. Zaduženja. +4. Modul „Uređaji" (toggle): lista terminala + status + dodela FW + veza na + licencni server. +5. Prodajna spremnost (onboarding drugih firmi) — tek kad interno proradi. diff --git a/docs/loggerservice/01-rbac-model.md b/docs/loggerservice/01-rbac-model.md new file mode 100644 index 0000000..47a9c63 --- /dev/null +++ b/docs/loggerservice/01-rbac-model.md @@ -0,0 +1,81 @@ +# RBAC model — ZAKLJUČENO sa vlasnikom 2026-07-24 + +> Ovo NIJE predlog za raspravu — model je dogovoren. Slobodne su implementacione +> odluke (imena kolona, indeksi, Go slojevi), ne semantika. + +## 1. Stablo organizacija + +Hijerarhijsko stablo proizvoljne dubine; **koren = Terminia (vendor)**. Primer: + +``` +Terminia (vendor, koren) +├─ DAL (kupac) ← DAL je KUPAC, ne vendor! +│ ├─ Bazen Gradski (objekat/pod-firma) +│ └─ Spa Centar X +├─ Distributer Jug +│ └─ Firma Y +│ └─ Bazen Z +└─ ServisPlus (org tipa "serviser") ← eksterni serviseri kao zaseban org +``` + +### Tabele (dogovorene; tipove/indekse odrediti po MySQL praksi projekta) + +```sql +orgs(id, parent_id NULL za koren, tip ENUM('vendor','distributer','firma','objekat','serviser',...), + naziv, status) + +users(id, org_id, rola ENUM('owner','admin','operator','viewer'), ime, email, auth...) + +devices(id, org_id, mac UNIQUE, product_code, fw_verzija, status, license_id NULL, + naziv, poslednji_heartbeat, ip) + +entitlements(id, org_id, product_code, max_uredjaja, fw_kanal, vazi_do) + +service_grants(id, serviser_org_id, ciljni_org_id NULL / ciljni_device_id NULL, + dozvole SET('registruj','flesuj_fw','odrzavanje'), vazi_do) + +sale_grants(id, prodavac_user_id ili org_id, plan/proizvod opseg, vazi_do) +``` + +## 2. Role (iste na SVAKOM čvoru stabla) + +| Rola | Prava | +|---|---| +| **Owner** | pun vlasnik org-a i CELOG podstabla | +| **Admin** | upravljanje unutar org-a | +| **Operator** | operativni rad (kasir na terminalu / interni serviser) | +| **Viewer** | samo pregled | + +## 3. Invarijante (moraju biti sprovedene u kodu, ne samo dogovoru) + +1. **Delegacija sa podskupom:** dete-org dobija PODSKUP prava roditelja; zbir + entitlements dece ≤ roditeljev max (`max_uredjaja` itd.). +2. **Vidljivost (row-level):** org vidi SEBE + celo svoje PODSTABLO. Ništa iznad, + ništa bočno. Svaki upit ide kroz filter podstabla (CTE po `parent_id` ili + materijalizovana putanja — implementaciona odluka). +3. **Serviser ≠ vlasnik:** service_grant daje PRISTUP (registruj/flešuj/održavaj) + nad tuđim org-om/uređajima, sa rokom — NE daje vlasništvo ni uvid u naplatu. +4. **Prodavac ne kreira** zone/cenovnik (to su entiteti objekta na uređaju) — + `sale_grants` samo kaže KOJE planove sme da prodaje. + +## 4. Odnos sa licencama + +- `devices.license_id` → licenca iz postojećeg licencnog sistema ([`docs/asp-terminia/`](../asp-terminia/README.md)). +- `entitlements` je „koliko čega sme org" — licencni server pri izdavanju ključa + proverava entitlement (npr. max_uredjaja). +- **Kill-switch lanac:** opoziv licence (revoked) + istek + offline grejs na + uređaju + sigurno stanje — mehanika na uređaju, okidač na serveru. + +## 5. Dva lica, jedan mozak + +- **Terminia lice** (`terminia.net`): vendor pogled — proizvodi, licence, katalog FW. +- **LoggerService lice** (`loggerservice.com`): serviserski pogled — moji grantovi, + uređaji do kojih smem, registracija/flešovanje/održavanje, nalozi servisera. +- Tehnički: isti Go backend + baza; lice se bira po hostu (nginx `server_name`) i/ili + po tipu org-a prijavljenog korisnika. Brendiranje (logo/boje/naziv) po licu. + +## 6. Pristup „sve odmah / UI inkrementalno" + +Dogovor: **pun MODEL/šema odmah** (migracije za sve tabele iznad), a **UI dashboard +inkrementalno** (prvo orgs+devices+users, pa grantovi). Uređaji teku paralelno — +heartbeat prijem (02) može i pre punog UI-ja. diff --git a/docs/loggerservice/02-uredjaji-heartbeat-discovery.md b/docs/loggerservice/02-uredjaji-heartbeat-discovery.md new file mode 100644 index 0000000..bc8d928 --- /dev/null +++ b/docs/loggerservice/02-uredjaji-heartbeat-discovery.md @@ -0,0 +1,60 @@ +# Uređaji: šta terminal VEĆ šalje (formati) i šta server treba da primi + +> Firmware strana je GOTOVA (FW 0.10.0+, modul `firmware/10_terminia/svc.cpp`). +> Server strana (prijemnik) NE postoji — to je zadatak u 04. + +## 1. LAN discovery (za servisera na licu mesta / PC alat) + +- Uređaj UVEK sluša **UDP port 46464**. +- Upit: paket čiji sadržaj počinje ASCII stringom `TERMINIA?` (može broadcast). +- Odgovor (unicast pošiljaocu), JSON u jednom paketu: + +```json +{"app":"TERMINIA","name":"TERM-001","mac":"1C:DB:D4:A6:A4:60", + "ip":"192.168.123.1","fw":"0.11.0","serial":"1CDBD4A6A460"} +``` + +- `serial` = korisnički serijski broj ili MAC bez dvotačaka ako serijski nije zadat. +- `ip` = adresa interfejsa (ETH ima prednost nad WiFi ako je povezan). +- Provereno uživo 2026-07-24 (PowerShell UDP upit → odgovor za <100 ms). + +**Upotreba:** serviserski PC/telefon alat „nađi sve uređaje na mreži" — +broadcast `TERMINIA?` na 255.255.255.255:46464 i skupi odgovore. + +## 2. Heartbeat (za `devices.status` / `poslednji_heartbeat`) + +- Uređaj šalje na **`cfg.svcLogHost` (`ip:port`, UDP)** na **`cfg.svcHbSeconds`** + sekundi (0 = isključeno). Podešava se u SPA: Podešavanja → Servis. +- Format = isti identitet kao discovery + oznaka: + +```json +{"app":"TERMINIA","name":"...","mac":"...","ip":"...","fw":"...","serial":"...","hb":1} +``` + +**Server treba:** UDP prijemnik (port po dogovoru, npr. 46465 javno) koji: +1. parsira JSON, ključ = `mac`; +2. upsert u `devices` (`fw_verzija`, `ip`, `poslednji_heartbeat = NOW()`); +3. status: `online` ako je heartbeat mlađi od 3×interval, inače `offline` + (interval po uređaju čuvati ili pretpostaviti default). + +⚠️ Heartbeat trenutno gađa LOKALNI prijemnik (LAN). Za javni server preko +interneta: NAT izlaz radi (UDP out), ali treba javna IP/port + odluka da li UDP +ili prelazak na HTTPS POST uz sync (v. „Zahtevi ka firmveru" u 04 ako se menja). + +## 3. Dnevnik rada (dbg) na server + +- Isti `cfg.svcLogHost` prima i tok dbg linija (tekst, UDP, više linija po paketu, + do ~1 KB) kada je uključeno „Šalji dnevnik rada na server". +- Namena: teren-dijagnostika („šta se dešava kad pravi problem"). +- **Server treba:** isti prijemnik upisuje sirove linije u fajl po MAC-u/danu + (rotacija!) — NE u bazu (obim). Toggle je na uređaju, podrazumevano isključen — + server ne sme pretpostaviti da tok uvek stiže. + +## 4. Identitet uređaja — izvor istine + +- **MAC iz eFuse** (`1C:DB:D4:A6:A4:60` je razvojni uređaj) — nepromenljiv, + ključ za `devices.mac` i za licencu. +- `serial` je korisnički (promenljiv) — samo za prikaz. +- Registracija uređaja u org (ko ga poseduje) ide kroz RBAC/provisioning (03), + ne kroz heartbeat — heartbeat samo ažurira POZNATE uređaje (nepoznat MAC: + zabeleži u „neregistrovani" listu za kasnije usvajanje, ne pravi org sam). diff --git a/docs/loggerservice/03-provisioning-i-fw-katalog.md b/docs/loggerservice/03-provisioning-i-fw-katalog.md new file mode 100644 index 0000000..bab6f3f --- /dev/null +++ b/docs/loggerservice/03-provisioning-i-fw-katalog.md @@ -0,0 +1,62 @@ +# Provisioning i katalog firmvera + +## 1. Dvofazni dogovor (ASP repo `docs/21-platforma-i-provisioning.md` §4) + +| Faza | Model | Stanje | +|---|---|---| +| MVP | **Model B** — USB flešer alat na PC-u | alat ne postoji (zadatak); bootstrap FW postoji i pokriva veći deo potrebe | +| Kasnije | **Model A** — bootstrap FW + mrežni OTA sa kataloga | bootstrap URAĐEN (lokalni upload); auto-download čeka domen | + +## 2. Šta VEĆ postoji u firmware repou + +### Inicijalni (bootstrap) FW — `firmware/00_inicijalni/` + +- Flešuje se USB-om JEDNOM na novu ploču (isti fqbn/particije kao pun FW: + `app3M_fat9M_16MB` → ota_0 + ota_1 + ffat). +- Ponašanje: digne otvoren AP **`terminia-setup`** → `http://10.10.10.10` → + stranica prikaže **MAC** (identitet za licencu/registraciju) i primi PUN firmware + kao `.bin` (OTA upload) → restart u TERMINIA. +- BEZ interneta/domena/prijave (fizički pristup = servisni pristup; AP živi samo + dok je bootstrap aktivan). +- **Model A dorada (kad proradi `fw.terminia.net`):** bootstrap dobija i opciju + „preuzmi sa kataloga" — javi se mozgu sa MAC-om, dobije potpisan URL, skine, + verifikuje potpis, upiše. (Zahtev ka firmveru — zapisati u 04 kad server bude spreman.) + +### Pun FW — OTA upload već radi + +- SPA → Podešavanja → Uređaj → „Nadogradnja firmvera": upload `.bin` + (ruta `/api/ota`, samo admin). `.bin` artefakt: `build/ota/10_terminia.ino.bin`. + +## 3. Katalog firmvera — dogovorena arhitektura („opcija C — sredina") + +- **Mozak = licencni/entitlement server:** na zahtev uređaja (MAC + licenca + + entitlement `fw_kanal`) izdaje **kratkotrajni potpisani download URL**. +- **Mišić = statični nginx** na `fw.terminia.net`: servira **RSA-potpisane `.bin`** + artefakte. Kasnije `CNAME → CDN` bez izmene na uređaju. +- **Uređaj UVEK verifikuje RSA potpis slike** — URL/kanal je samo usmeravanje. +- **Pravilo (tvrdo):** FW potpisivanje je OBAVEZNO PRE puštanja kataloga/auto-OTA. + Potpisni deo je u paketu [`docs/asp-terminia/03-zadaci.md`](../asp-terminia/03-zadaci.md) §Z6 (isti kripto-lanac tim). + +### Predlog rasporeda kataloga (implementaciona sloboda) + +``` +fw.terminia.net/ + asp-terminia/ + stable/ 10_terminia-0.11.0.bin 10_terminia-0.11.0.sig manifest.json + beta/ ... + /... +``` + +`manifest.json`: verzija, sha256, potpis, min-bootstrap, changelog — tačan format +uskladiti sa firmware stranom pre implementacije (zapisati u 04 „Zahtevi ka firmveru"). + +## 4. Model B alat (USB flešer) — obim + +PC alat (može PowerShell/Python skript u prvoj verziji) koji: +1. detektuje COM port ploče, +2. flešuje **inicijalni FW** (`esptool`/`arduino-cli upload`), +3. ispiše MAC (čita ga sa serijskog boot ispisa) za registraciju/licencu, +4. (opciono) odmah otpremi i pun `.bin` kroz `terminia-setup` AP. + +Prihvatanje: nova ploča od kutije do „terminia" AP-a za < 5 minuta bez ručnih koraka +osim kablova. diff --git a/docs/loggerservice/04-zadaci.md b/docs/loggerservice/04-zadaci.md new file mode 100644 index 0000000..37c82ff --- /dev/null +++ b/docs/loggerservice/04-zadaci.md @@ -0,0 +1,82 @@ +# Zadaci (redom; svaki sa kriterijumom prihvatanja) + +> ⚠️ **AŽURIRANO 2026-07-24 uveče:** vizija je proširena — LoggerService je +> aplikacija za servisne firme (vidi `00-vizija-i-mvp.md`, MERODAVNO). Zadaci +> ispod važe uz izmene: S1 šema se širi jezgrom (oprema/klijenti/nalozi/ +> zaduženja/zalihe), S4 „dashboard" = MVP aplikacije (jezgro + tok +> klijent→nalog→oprema→istorija), modul „Uređaji" = toggle po firmi, minimalno: +> lista+status+dodela FW (više FW proizvoda!) + direktna veza na licencni server. + +> Koordinacija: zadaci S1–S2 (šema) idu POSLE [`docs/asp-terminia/03-zadaci.md`](../asp-terminia/03-zadaci.md) Z1 +> (ASP proizvod) da se ne sudaraju migracije — ili u dogovoru sa tim agentom +> (isti `migrations/` folder, numeracija se nastavlja). +> **Svaki write na produkciju: backup + izričita dozvola (05-pravila-rada.md).** + +## S1 — Migracije RBAC šeme (pun model odmah) + +**Šta:** migracije za tabele iz `01-rbac-model.md`: `orgs`, `users` (proširenje ili +nova, zavisno od postojeće admin auth šeme — PROVERITI šta postoji), `devices`, +`entitlements`, `service_grants`, `sale_grants`. Seed: koren `Terminia (vendor)` + +org `DAL (kupac)` pod njim. + +**Prihvatanje:** migracije prolaze na kopiji baze pa na produkciji; postojeće +tabele/podaci netaknuti; ER skica (tekstualna) u ovom folderu. + +## S2 — Registracija razvojnog uređaja + +**Šta:** ubaciti razvojni terminal u `devices`: MAC `1C:DB:D4:A6:A4:60`, +product_code ASP-Terminia, org DAL (ili test org), fw_verzija tekuća. + +**Prihvatanje:** red postoji; vidljiv u (privremenom) pregledu/upitu po podstablu. + +## S3 — Heartbeat prijemnik + +**Šta:** UDP servis (Go, deo istog procesa ili poseban systemd unit) po +`02-uredjaji-heartbeat-discovery.md` §2: prima JSON, upsert `devices` +(fw/ip/poslednji_heartbeat), nepoznat MAC → tabela/lista „neregistrovani". +Dbg tok (§3): upis u fajlove po MAC/danu sa rotacijom (logrotate ili u kodu). + +**Prihvatanje:** sa razvojnog uređaja (vlasnik podesi Podešavanja → Servis na +javnu adresu:port) stiže heartbeat i `devices.poslednji_heartbeat` se pomera; +status online/offline izračunljiv. + +## S4 — Minimalni dashboard (LoggerService lice, inkrement 1) + +**Šta:** na postojeći htmx admin sloj dodati: lista org-stabla, lista uređaja +(status/fw/heartbeat), lista neregistrovanih + dugme „usvoji u org". +Vidljivost striktno po podstablu prijavljenog (invarijanta 2 iz 01). + +**Prihvatanje:** vlasnik (koren) vidi sve; test user u DAL vidi samo DAL podstablo. + +## S5 — Service grants (inkrement 2) + +**Šta:** CRUD za `service_grants` + provera u middleware-u (serviser vidi/dira +samo ciljeve granta, u roku važenja). Org tipa „serviser" + test serviser nalog. + +**Prihvatanje:** serviser nalog vidi TAČNO grantovane uređaje; posle isteka +`vazi_do` — ništa. + +## S6 — Katalog firmvera (posle Z6 potpisa) + +**Šta:** nginx `fw.terminia.net` statika (ili do domena: putanja na postojećem +sajtu) + mozak-endpoint „daj mi URL za moju verziju" (MAC+licenca → potpisan +kratkotrajni URL). Format manifesta USKLADITI sa firmware stranom pre implementacije. + +**Prihvatanje:** curl tok: uređaj-identitet → URL → download `.bin` + `.sig`; +verifikacija potpisa javnim ključem prolazi. + +## S7 — Model B alat (USB flešer) + +Po `03-provisioning-i-fw-katalog.md` §4. Može i ranije (nezavisan od servera). + +**Prihvatanje:** nova ploča → `terminia-setup` AP za <5 min, MAC ispisan. + +--- + +## Zahtevi ka firmveru (dopisivati; radi firmware strana, ne ovaj agent) + +| # | Zahtev | Status | +|---|---|---| +| F1 | Heartbeat na JAVNU adresu: potvrditi UDP kroz NAT u realnom okruženju ili preći na HTTPS POST (upisati odluku) | ⬜ | +| F2 | Manifest format za auto-OTA (bootstrap Model A) — dogovoriti polja | ⬜ | +| F3 | (po potrebi) registracioni token pri prvom javljanju uređaja | ⬜ | diff --git a/docs/loggerservice/05-pravila-rada.md b/docs/loggerservice/05-pravila-rada.md new file mode 100644 index 0000000..c30c74f --- /dev/null +++ b/docs/loggerservice/05-pravila-rada.md @@ -0,0 +1,33 @@ +# Pravila rada — PROČITATI PRE PRVOG SSH-a + +> Server 151 (`157.180.119.151`, SSH `root@`, ključ `~/.ssh/id_ed25519`) je +> **PRODUKCIJA**: dal-license-server (3 proizvoda, ~140 licenci), terminia SaaS +> (8091/8092), ESIR, Gitea. Greška košta prave korisnike. + +## Tvrda pravila (identična paketu [`docs/asp-terminia/04-pravila-rada.md`](../asp-terminia/04-pravila-rada.md)) + +1. **Read-only dok se ne odobri write.** Svaki write (SQL/fajl/nginx/systemd) + traži izričito DA vlasnika za taj konkretan korak. +2. **Backup pre izmene:** `mysqldump` u `/root/backup/` sa datumom; fajlovi kao + `.bak-YYYYMMDD`. Putanju backupa navesti u izveštaju. +3. **Migracije, ne ad-hoc SQL** — numerisano u `migrations/`, uskladiti brojeve sa + agentom paketa paket `docs/asp-terminia/` (isti repo, drugi folder). +4. **Tajne:** `.env`, privatni ključevi, lozinke — ne čitati, ne ispisivati. + Admin API ključ tražiti od vlasnika. +5. **Ne dirati:** terminia SaaS, ESIR, Gitea, postojeći nginx `arv` sajt + (samo DODAVATI nove server blokove). +6. **Nikad destruktivno**; bez restartovanja tuđih servisa. +7. **Kompatibilnost:** postojeći licencni API i serijalizacija se ne menjaju. + +## Specifično za ovaj paket + +- RBAC middleware NE sme da zaključa postojeći admin dashboard (vendor koren mora + uvek moći da uđe) — dodavati permisivno pa stezati. +- UDP prijemnik: otvoriti port kroz firewall SAMO za potreban port; ne otvarati + opsege. +- Fajlovi dbg dnevnika: rotacija obavezna (ne pustiti da napune disk). + +## Izveštavanje + +Posle sesije: šta je čitano/menjano (putanje/tabele), backup putanje, sledeći korak, +pitanja za vlasnika. Odluke upisivati u odgovarajući md ovde (ne ostavljati u ćaskanju). diff --git a/docs/loggerservice/README.md b/docs/loggerservice/README.md new file mode 100644 index 0000000..cafbe30 --- /dev/null +++ b/docs/loggerservice/README.md @@ -0,0 +1,61 @@ +# LoggerService — radni paket za agenta (kontrolna ravan) + +> **Misija:** izgraditi serversku kontrolnu ravan za flote terminala — RBAC stablo +> organizacija, uređaji + heartbeat, servisni grantovi, provisioning i katalog +> firmvera — kao **proširenje postojećeg `dal-license-server`-a** (server 151). +> Jedan backend, **dva lica**: `terminia.net` = vendor (licence/fw), +> **`loggerservice.com` = serviserski brend** (isti mozak, drugi izgled). +> +> **Jezik projekta:** srpski (ekavica), latinica; Go komentari srpski ASCII. + +> **Poreklo:** paket je nastao u firmverskom repou (`asp-terminia/serviseri/`) i +> prebačen ovde 2026-07-25 — isti backend/baza kao paket `docs/asp-terminia/` +> (licenciranje), koordinacija migracija mora ići kroz jedan repo. Firmverska +> strana (`svc.cpp`, discovery/heartbeat) je gotova i ostaje u firmverskom repou. +> „**ASP repo**" u tekstu znači . + +## Sadržaj foldera + +| Fajl | Šta je unutra | +|---|---| +| [00-vizija-i-mvp.md](00-vizija-i-mvp.md) | **ČITATI PRVO** — LoggerService je aplikacija za servisne firme (oprema/klijenti/nalozi/zaduženja); uređaji su MODUL; MVP obim (dogovor 2026-07-24 uveče) | +| [01-rbac-model.md](01-rbac-model.md) | ZAKLJUČEN model: stablo orgs, 4 role, grantovi, invarijante, šeme tabela | +| [02-uredjaji-heartbeat-discovery.md](02-uredjaji-heartbeat-discovery.md) | šta uređaj VEĆ šalje (UDP formati) i šta server treba da primi | +| [03-provisioning-i-fw-katalog.md](03-provisioning-i-fw-katalog.md) | Model B/A, postojeći bootstrap FW, katalog `.bin`-ova, potpisani URL | +| [04-zadaci.md](04-zadaci.md) | zadaci redom sa kriterijumima prihvatanja | +| [05-pravila-rada.md](05-pravila-rada.md) | **OBAVEZNO prvo** — produkcija, backup, granice | + +## Kontekst u 6 redova + +1. **Proizvod:** ESP32‑S3 terminali (linija ASP; prvi proizvod ASP‑Terminia — + kontrola prolaza za bazene/spa). Terminal je autonoman i radi offline; + platforma je **opcioni sloj** za flote (više vlasnika, servis, prodaja, OTA). +2. **Hijerarhija:** **Terminia = vendor/koren stabla** (vlasnik svega); + **DAL = KUPAC** (org pod Terminijom) — ne vendor. +3. **Serviseri NISU nivo u stablu** nego **grant preko stabla** (razdvaja + vlasništvo od servisnog pristupa) — detalji u 01. +4. **Server:** isti `dal-license-server` (Go/MySQL, produkcija!) — RBAC se DODAJE + migracijama; koordinacija sa paketom [`docs/asp-terminia/`](../asp-terminia/README.md) (deli bazu i admin sloj). +5. **Uređaj već emituje:** LAN discovery (UDP 46464, upit `TERMINIA?` → JSON + identitet), heartbeat (UDP JSON na podesiv interval), dbg dnevnik (UDP) — + formati u 02. `devices.status` na serveru se hrani iz heartbeat-a. +6. **Brend:** `loggerservice.com` domen kupuje vlasnik (kredencijali kod njega); + do tada se sve gradi i testira na IP-u / internim rutama. + +## Šta agent NE radi + +- Ne kupuje/podešava domene (vlasnik) — ali priprema nginx blokove da se uključe. +- Ne dira postojeće proizvode/licence, `terminia` SaaS, ESIR, Gitea-u. +- Ne implementira ništa na SAMOM uređaju (firmware) — uređaj je gotov za ovaj obim; + ako zatreba izmena FW, zapisati ZAHTEV u 04 (sekcija „Zahtevi ka firmveru"). + +## Veze + +- **Firmware repo (ASP repo):** + (servisni kanal: `firmware/10_terminia/svc.cpp`; bootstrap: `firmware/00_inicijalni/`). + Firmverska strana je GOTOVA za ovaj obim — ovaj paket je ne dira. +- Istorijat odluka: ASP repo `docs/21-platforma-i-provisioning.md` (dogovor 2026-07-24). +- Licencna strana: [`docs/asp-terminia/`](../asp-terminia/README.md) (isti server; Z-zadaci tamo idu PRE RBAC UI-ja + jer odblokiraju uređaje na terenu). +- Serverski kod i konvencije: [../../CLAUDE.md](../../CLAUDE.md), + [../ARCHITECTURE.md](../ARCHITECTURE.md), [../../API.md](../../API.md).