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>
179 lines
3.5 KiB
Markdown
179 lines
3.5 KiB
Markdown
# Licence Server — Setup i Deployment
|
|
|
|
## Preduslovi
|
|
|
|
- Go 1.22+
|
|
- MySQL 8.0
|
|
- OpenSSL (za generisanje RSA kljuceva)
|
|
|
|
## Instalacija
|
|
|
|
### 1. Kloniraj projekat
|
|
|
|
```bash
|
|
cd /root/projects
|
|
git clone https://git.terminia.net/djuka/licence-server.git
|
|
cd licence-server
|
|
```
|
|
|
|
### 2. Instaliraj Go zavisnosti
|
|
|
|
```bash
|
|
go mod download
|
|
```
|
|
|
|
### 3. Kreiraj MySQL bazu
|
|
|
|
```sql
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Uredi `.env`:
|
|
|
|
```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
|
|
|
|
```bash
|
|
go run cmd/server/main.go
|
|
```
|
|
|
|
Server se pokrece na `http://localhost:8090`. Migracije se izvrsavaju automatski pri prvom pokretanju.
|
|
|
|
## Produkcijski deployment
|
|
|
|
### Build
|
|
|
|
```bash
|
|
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):
|
|
|
|
```ini
|
|
[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
|
|
```
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
# 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*
|