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

159 lines
7.0 KiB
Markdown

# 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*