licence-server/docs/SETUP.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

3.5 KiB

Licence Server — Setup i Deployment

Preduslovi

  • Go 1.22+
  • MySQL 8.0
  • OpenSSL (za generisanje RSA kljuceva)

Instalacija

1. Kloniraj projekat

cd /root/projects
git clone https://git.terminia.net/djuka/licence-server.git
cd licence-server

2. Instaliraj Go zavisnosti

go mod download

3. Kreiraj MySQL bazu

CREATE DATABASE licence_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'license'@'localhost' IDENTIFIED BY 'TVOJA_LOZINKA';
GRANT ALL PRIVILEGES ON licence_db.* TO 'license'@'localhost';
FLUSH PRIVILEGES;

4. Generiši RSA kljuceve

mkdir -p crypto
openssl genrsa -out crypto/private.pem 2048
openssl rsa -in crypto/private.pem -pubout -out crypto/public.pem
chmod 600 crypto/private.pem

Vazno: private.pem nikad ne sme uci u git. public.pem se deli sa klijentskim aplikacijama.

5. Konfiguracija

cp .env.example .env

Uredi .env:

APP_PORT=8090
APP_ENV=production

DB_HOST=localhost
DB_PORT=3306
DB_NAME=licence_db
DB_USER=license
DB_PASS=tvoja_lozinka

ADMIN_API_KEY=generisi-min-32-char-kljuc
ADMIN_PASSWORD=jaka_lozinka
SESSION_SECRET=random-32-char-string

RSA_PRIVATE_KEY_PATH=./crypto/private.pem

RATE_LIMIT_ACTIVATE=10
RATE_LIMIT_VALIDATE=60

LOG_LEVEL=info

6. Pokretanje

go run cmd/server/main.go

Server se pokrece na http://localhost:8090. Migracije se izvrsavaju automatski pri prvom pokretanju.

Produkcijski deployment

Build

go build -o licence-server cmd/server/main.go

Systemd servis

Kreiraj /etc/systemd/system/licence-server.service (obrazac po terminia.service na 151 — journal log + graceful shutdown, ne stariji minimalni predložak):

[Unit]
Description=Licence Server
After=network.target mysql.service
Wants=mysql.service

[Service]
Type=simple
User=root
WorkingDirectory=/root/projects/licence-server
ExecStart=/root/projects/licence-server/licence-server
EnvironmentFile=/root/projects/licence-server/.env
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=licence-server
KillMode=mixed
KillSignal=SIGTERM
TimeoutStopSec=15

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now licence-server
journalctl -u licence-server -f

HTTPS (reverse proxy)

Nginx kao reverse proxy sa TLS (Let's Encrypt/Certbot) — primer sa produkcije:

# licenca.terminia.net -> licence-server (127.0.0.1:8090)
server {
    server_name licenca.terminia.net;
    location / {
        proxy_pass http://127.0.0.1:8090/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    listen 443 ssl; # managed by Certbot
}

Backup

MySQL backup

mysqldump -u license -p licence_db > backup_$(date +%Y%m%d).sql

RSA kljucevi

Obavezno backup-ovati crypto/private.pem na sigurno mesto. Gubitak private key-a znaci da nijedna postojeca licenca ne moze biti verifikovana.

Testiranje

# Svi testovi
go test ./... -v -count=1

# Health check
curl http://localhost:8090/api/v1/health

Pristup

Interfejs URL Auth
Dashboard http://localhost:8090/dashboard Username + password iz .env
Admin API http://localhost:8090/api/v1/admin/* X-API-Key header
Klijentski API http://localhost:8090/api/v1/* Bez auth-a

Mart 2026