No description
  • Go 55.9%
  • HTML 44.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-19 16:42:17 +02:00
static Add new table. 2026-07-19 16:42:17 +02:00
.gitignore Remove binary from repo. 2026-06-23 16:29:26 +02:00
auth.go Initial commit 2026-06-23 16:26:13 +02:00
config.go Initial commit 2026-06-23 16:26:13 +02:00
db.go Fix insert bug, fix missing row in DB. 2026-06-23 18:01:23 +02:00
go.mod Initial commit 2026-06-23 16:26:13 +02:00
go.sum Initial commit 2026-06-23 16:26:13 +02:00
handlers.go Fix program quit if there's an SQL error. 2026-06-23 16:59:00 +02:00
main.go Disable frontend if not primary node. 2026-06-26 19:14:13 +02:00
middleware.go Initial commit 2026-06-23 16:26:13 +02:00
models.go Add new table. 2026-07-19 16:42:17 +02:00
oauth.go Initial commit 2026-06-23 16:26:13 +02:00
oauth_setup.md Initial commit 2026-06-23 16:26:13 +02:00
README.md Initial commit 2026-06-23 16:26:13 +02:00

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.

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).