- Go 55.9%
- HTML 44.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| static | ||
| .gitignore | ||
| auth.go | ||
| config.go | ||
| db.go | ||
| go.mod | ||
| go.sum | ||
| handlers.go | ||
| main.go | ||
| middleware.go | ||
| models.go | ||
| oauth.go | ||
| oauth_setup.md | ||
| README.md | ||
FleetDB — backend
API REST in Go (stdlib net/http, Go 1.22+) per le tabelle
mezzi_start, mezzi_seta, mezzi_tper. Un'unica istanza di questo
backend va eseguita su ciascuno dei 3 nodi, ognuna connessa alla propria
istanza locale di MariaDB (primario su un nodo, repliche sugli altri due —
vedi ../replica.md).
Build
go mod tidy
go build -o fleetdb-backend .
Variabili d'ambiente
| Variabile | Descrizione |
|---|---|
DB_DSN |
DSN MariaDB, es. fleetapp:password@tcp(127.0.0.1:3306)/fleetdb |
PORT |
Porta HTTP (default 8080) |
FRONTEND_ORIGIN |
Origin del frontend Cloudflare Pages, es. https://flotta.miosito.it |
GITHUB_CLIENT_ID |
Client ID della OAuth App (vedi oauth_setup.md) |
GITHUB_CLIENT_SECRET |
Client secret della OAuth App |
GITHUB_PAT |
Personal access token con accesso in lettura alla repo |
GITHUB_REPO |
owner/repo della repository |
OAUTH_REDIRECT_URL |
URL di callback registrato su GitHub, es. https://api.miosito.it/auth/callback |
SESSION_SECRET |
Stringa casuale per firmare i cookie di sessione (openssl rand -hex 32) |
Importante: GITHUB_*, OAUTH_REDIRECT_URL e SESSION_SECRET devono
essere identici sui 3 nodi — vedi oauth_setup.md.
DB_DSN invece e' specifico per nodo (ognuno punta al proprio MariaDB
locale).
Avvio
export DB_DSN="fleetapp:PASSWORD_SICURA@tcp(127.0.0.1:3306)/fleetdb"
export FRONTEND_ORIGIN="https://flotta.miosito.it"
export GITHUB_CLIENT_ID="..."
export GITHUB_CLIENT_SECRET="..."
export GITHUB_PAT="github_pat_..."
export GITHUB_REPO="utente/repo"
export OAUTH_REDIRECT_URL="https://api.miosito.it/auth/callback"
export SESSION_SECRET="..."
./fleetdb-backend
Endpoint
Pubblici (nessuna autenticazione)
GET /api/{operatore}/mezzi -> [ {matricola, targa, modello, settore, vettore, provincia, path_html, link, stato, updated_at}, ... ]
GET /api/{operatore}/mezzi/{matricola} -> singolo oggetto, 404 se non esiste
GET /health -> {"status":"ok","primary":true|false}
{operatore} deve essere uno tra start, seta, tper.
link e' calcolato lato server come path_html + "#" + matricola.
Admin (richiedono cookie di sessione valido + nodo primario)
POST /api/{operatore}/mezzi body: oggetto singolo o array (bulk insert)
PUT /api/{operatore}/mezzi/{matricola} body: campi da modificare (aggiornamento parziale)
DELETE /api/{operatore}/mezzi/{matricola}
Esempio body POST (bulk insert per matricole progressive, stesso modello):
[
{"matricola": "21070", "modello": "BredaMenarinibus Vivacity+ C CNG", "settore": "Urbano", "path_html": "/start_bus/urbano/bmbvivacitypcng.html", "stato": ""},
{"matricola": "21071", "modello": "BredaMenarinibus Vivacity+ C CNG", "settore": "Urbano", "path_html": "/start_bus/urbano/bmbvivacitypcng.html", "stato": ""}
]
Esempio body PUT (cambio stato e targa):
{"stato": "fermo", "targa": "EE 123 AB"}
Se questo nodo e' una replica (non primario), le richieste di scrittura
ritornano 503 con messaggio esplicativo. La matricola non e' modificabile
tramite PUT — per "rinominare" una matricola, eliminare e ricreare la riga.
Autenticazione
GET /auth/login -> redirect a GitHub OAuth
GET /auth/callback -> gestisce il redirect da GitHub, imposta il cookie di sessione
POST /auth/logout -> invalida il cookie
GET /auth/me -> {"authenticated": true, "username": "..."} oppure {"authenticated": false}
Il frontend deve chiamare questi endpoint con credentials: 'include'
(fetch) perche' il cookie di sessione e' cross-origin (SameSite=None; Secure).
Esecuzione come servizio (systemd)
[Unit]
Description=FleetDB backend
After=network.target mariadb.service
[Service]
EnvironmentFile=/etc/fleetdb/backend.env
ExecStart=/opt/fleetdb/fleetdb-backend
Restart=always
User=fleetdb
[Install]
WantedBy=multi-user.target
/etc/fleetdb/backend.env contiene le variabili d'ambiente elencate sopra
(una per riga, VAR=valore).