licence-server/docs/ARCHITECTURE.md
Nenad Djukic 1abe7176ec Preimenovanje: dal-license-server -> licence-server (+ debrendiranje)
Vlasnik izlazi iz DAL price za ovaj projekat - postaje samostalan proizvod.
Preimenovanje je mehanicko (import putanje, imena fajlova/baze/UI naslova),
NIJEDNA linija poslovne logike u internal/handler ili internal/service nije
dirana - go build, go vet i go test ./... prolaze cisto pod novim imenom.

- go.mod: module dal-license-server -> licence-server; 28 import linija u
  13 .go fajlova usaglaseno
- internal/config/config.go (+test): default DB_NAME licence_db
- HTML sabloni (7 stranica) + 7 Playwright e2e spec fajlova: "DAL License
  Server" -> "Licence Server" u title/nav-brand, testovi usaglaseni u istom
  prolazu (nista ne moze da se razdvoji)
- package.json/package-lock.json/.gitignore/.claude/project.json: ime
  projekta/binarnog fajla/work_dir
- Usput: package.json je u repository.url nosio OTVORENU Gitea lozinku u
  cistom tekstu - uklonjena (URL sad bez kredencijala). Lozinka je i dalje
  u staroj git istoriji - preporuka: rotirati je posebno.
- CLAUDE.md/README/API/TESTING/docs/SPEC/ARCHITECTURE/SETUP: naslovi, ASCII
  dijagrami, git clone URL, mysqldump primer, systemd predlozak u SETUP.md
  zamenjen stvarnim (obrazac terminia.service - journal log + graceful
  shutdown, ne stari minimalni predlozak)
- Debrendiranje: "Univerzalni licencni server za sve DAL proizvode" ->
  "za vise proizvoda i klijenata"; potpis "Nenad Djukic / DAL d.o.o." ->
  "Nenad Djukic". NE dirano: nazivi ESIR/ARV/LIGHT_TICKET (tudji proizvodi,
  ne DAL brend), "DAL" kao stvaran naziv org-a u RBAC modelu
  (docs/loggerservice/README.md) - to je podatak, ne branding ovog servera.
- docs/asp-terminia/, docs/loggerservice/: prozni pomeni imena servera

Baza (dal_license_db -> licence_db) i deploy na 151 idu u posebnom koraku,
posle preimenovanja Gitea repoa - vidi CLAUDE.md istorijsku belesku na dnu.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-25 07:55:26 +02:00

7.0 KiB

Licence Server — Arhitektura

Dijagram sistema

┌─────────────────────────────────────────────────────┐
│                   LICENCE SERVER                       │
│                 port: 8090                            │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────────────┐  │
│  │ Admin API │  │ Klijent  │  │ Admin Dashboard  │  │
│  │ (CRUD)   │  │ API      │  │ (htmx)           │  │
│  └──────────┘  └──────────┘  └──────────────────┘  │
│        │              │               │              │
│        └──────────────┼───────────────┘              │
│                       │                              │
│              ┌────────┴────────┐                     │
│              │   MySQL baza    │                     │
│              │    licence_db   │                     │
│              └─────────────────┘                     │
│                                                      │
│  RSA-2048 Private Key (samo ovde, nikad ne izlazi)  │
└─────────────────────────────────────────────────────┘
        ▲               ▲               ▲
        │               │               │
   ┌────┴────┐    ┌────┴────┐    ┌────┴────────┐
   │  ESIR   │    │   ARV   │    │ Light-Ticket │
   │ klijent │    │ klijent │    │   klijent    │
   └─────────┘    └─────────┘    └──────────────┘
   Svaki ima RSA public key ugrađen u binary

Struktura projekta

licence-server/
├── cmd/server/main.go              — Entry point, MySQL konekcija, migracije
├── internal/
│   ├── config/config.go            — .env loading, DSN builder
│   ├── model/
│   │   ├── license.go              — Product, License, LicenseWithActivation
│   │   ├── activation.go           — Activation model
│   │   ├── audit.go                — AuditEntry model
│   │   └── request.go              — Request/Response strukture
│   ├── repository/
│   │   ├── license_repo.go         — License CRUD, product queries, stats
│   │   ├── activation_repo.go      — Activation CRUD, deactivate, force release
│   │   └── audit_repo.go           — Audit log insert/list
│   ├── service/
│   │   ├── license_service.go      — License CRUD biznis logika
│   │   ├── activation_service.go   — Activate, Deactivate, Validate, ForceRelease
│   │   ├── crypto_service.go       — RSA-2048 potpisivanje (SHA-256, PKCS1v15)
│   │   └── keygen.go               — Generisanje ključeva
│   ├── handler/
│   │   ├── client_handler.go       — POST /api/v1/activate, deactivate, validate
│   │   ├── admin_handler.go        — Admin CRUD API
│   │   ├── dashboard_handler.go    — Dashboard stranice, in-memory sesije
│   │   └── helpers.go              — writeJSON, writeError, clientIP
│   ├── middleware/
│   │   ├── auth.go                 — API key auth (X-API-Key header)
│   │   └── ratelimit.go            — In-memory sliding window rate limiter
│   └── router/router.go           — Sve rute
├── templates/
│   ├── layout/base.html            — Glavni layout sa navbar-om
│   └── pages/                      — login, dashboard, licenses, audit...
├── static/
│   ├── css/style.css               — CSS
│   └── js/htmx.min.js             — htmx biblioteka
├── crypto/
│   ├── private.pem                 — RSA-2048 privatni ključ (ne u git-u!)
│   └── public.pem                  — RSA javni ključ
├── migrations/
│   ├── 001_create_tables.sql       — products, licenses, activations, audit_log
│   └── 002_seed_products.sql       — ESIR, ARV, LIGHT_TICKET seed
└── .env                            — Konfiguracija (ne u git-u!)

Slojevi

1. Handler (HTTP)

Prima HTTP zahteve, parsira input, poziva servis, vraca JSON ili HTML response. Tri grupe:

  • ClientHandler — API za klijentske aplikacije (activate, deactivate, validate)
  • AdminHandler — REST API za admin operacije (CRUD licence, stats, audit)
  • DashboardHandler — htmx stranice za admin dashboard

2. Service (biznis logika)

  • LicenseService — Kreiranje licenci, keygen, validacija tipova, expiry kalkulacija
  • ActivationService — Aktivacija sa RSA potpisom, deaktivacija, online validacija, force release
  • CryptoService — RSA-SHA256 potpisivanje licencnog JSON-a

3. Repository (baza)

  • LicenseRepo — License i Product CRUD, filteri, statistike
  • ActivationRepo — Activation CRUD, deaktivacija, force release
  • AuditRepo — Insert i listanje audit log-a

4. Middleware

  • APIKeyAuth — Provera X-API-Key header-a za admin API
  • RateLimit — In-memory sliding window, per-IP, konfigurisani limiti

Baza podataka (MySQL)

Tabele

products          — Definicija proizvoda (ESIR, ARV, LIGHT_TICKET)
licenses          — Izdate licence sa limitima i feature-ima
activations       — Aktivacije licenci (machine fingerprint, hostname, OS)
audit_log         — Log svih akcija

Relacije

products 1 ──── N licenses
licenses 1 ──── N activations
licenses 1 ──── N audit_log

Kljucni indeksi

  • licenses.license_key — UNIQUE
  • activations (license_id, is_active) — Brza provera aktivnih aktivacija
  • audit_log (created_at) — Sortiranje po vremenu

Autentifikacija

Admin API

  • X-API-Key header sa API kljucem iz .env
  • Minimum 32 karaktera

Admin Dashboard

  • Username/password login (password iz .env)
  • In-memory session (cookie-based)

Klijentski API

  • Bez autentifikacije (javni endpointi)
  • Zastiteni rate limiting-om

Kripto

  • RSA-2048 — Potpisivanje licencnih podataka pri aktivaciji
  • SHA-256 — Hash za machine fingerprint
  • PKCS1v15 — Shema potpisa
  • Isti par kljuceva za sve proizvode
  • Private key samo na serveru, public key ugrađen u klijentske binary-je

Migracije

Pokrecu se automatski pri startu servera (runMigrations u main.go). DSN koristi multiStatements=true za izvrsavanje SQL fajlova sa vise naredbi.


Mart 2026