netgescon-day0/docs/RUNBOOK-DISTRIBUZIONE-REMOTA-NETGESCON.md

423 lines
11 KiB
Markdown
Executable File

# NetGescon - Runbook Distribuzione Remota
Documento operativo unico per uscire dalla macchina locale e gestire NetGescon in rete con:
- macchina Git self-hosted,
- distribuzione aggiornamenti,
- canali `free` e `licensed`.
Questo runbook e pensato per essere eseguito sulla macchina remota dove stai preparando l'ambiente.
## Macchine da non confondere
Prima di tutto fissare il perimetro corretto:
1. `192.168.0.157` (`svr-netgescon`) e il nodo produzione Docker per `www.netgescon.it`, `app.netgescon.it`, `demo.netgescon.it`
2. `.200` resta macchina di sviluppo (`:8000`) e staging (`:80/:443`)
3. non usare `.200` per portare online la stack Docker multisito di produzione
Verifica operativa confermata il `2026-05-18`:
- sul nodo `192.168.0.157` Traefik pubblica `80/443`
- `195.110.133.78` inoltra correttamente verso quel nodo
- `www/app/demo` rispondono con `307` su HTTP e `200` su HTTPS
## Stato operativo reale da usare oggi
Prima di ogni altra sezione, vale questa regola pratica:
1. il codice si aggiorna nel repository locale `netgescon-day0`
2. si esegue commit Git e push su Gitea interno
3. staging e gli altri nodi si allineano dal repository Gitea
Quindi il runbook remoto non sostituisce il flusso Git, ma lo completa.
Il deploy manuale diretto verso staging non e il percorso standard da descrivere come primario.
## Stato Aggiornato (10-03-2026)
Modifiche gia implementate nel progetto per distribuzione/update:
1. Config distribuzione: `config/distribution.php`
2. Comando client update: `app/Console/Commands/NetgesconDistributionPullCommand.php`
3. Registrazione comando: `bootstrap/app.php`
4. Endpoint API update in `app/Http/Controllers/Api/DistributionController.php` e `routes/api.php`.
- `GET /api/v1/distribution/updates/manifest`
- `GET /api/v1/distribution/updates/package`
1. Script operativi:
- `scripts/ops/netgescon-baseline-freeze.sh`
- `scripts/ops/netgescon-publish-manifest.sh`
- stack git: `scripts/ops/git-stack/*`
1. Manuale architettura: `docs/01-git-machine-blueprint-2026.md`
1. Baseline creato: `storage/backups/netgescon-baselines/0.8.0-baseline_20260310-095558/`
Nota tecnica verificata:
- era presente un errore sintassi che bloccava `php artisan` in `app/Providers/Filament/AdminFilamentPanelProvider.php`;
- il file e stato corretto, e ora `php artisan list` risponde regolarmente.
## Ordine Manuali Per Riavvio Lavoro
Quando riparti dopo stop chat/agent, usa questo ordine:
1. `docs/RUNBOOK-DISTRIBUZIONE-REMOTA-NETGESCON.md` (questo file)
2. `docs/01-git-machine-blueprint-2026.md` (scelte architetturali)
3. `docs/distribuzione-update-netgescon.md` (focus update pipeline)
4. `docs/ai/SESSION_HANDOFF.md` (stato ultima sessione)
5. `docs/ai/TOPICS_INDEX.md` e topic corrente in `docs/ai/topics/*.md`
## 1. Obiettivo
Portare NetGescon in produzione di distribuzione con:
1. Server Git multi-progetto.
2. Server update (manifest + pacchetti).
3. Aggiornamento automatico nodi (staging e poi altri nodi).
4. Base pronta per licensing con scadenza e moduli premium.
Nota attuale:
- il punto 1 oggi e gia sostanzialmente rappresentato dal repository Gitea interno `origin`
- i punti 2, 3 e 4 restano parzialmente predisposti ma non sono il flusso principale gia in esercizio
## 2. Architettura consigliata
Domini consigliati:
- `git.netgescon.it` -> Forgejo/Gitea
- `updates.netgescon.it` -> API update/licensing
- `storage.netgescon.it` -> MinIO (opzionale ma consigliato)
Servizi:
1. Forgejo (o Gitea)
2. PostgreSQL (Forgejo)
3. MinIO
4. API update/licensing (puo essere il tuo Laravel NetGescon)
5. Reverse proxy TLS (Nginx/Caddy)
## 3. Prerequisiti macchina remota
Pacchetti base:
```bash
sudo apt update
sudo apt install -y docker.io docker-compose-plugin curl jq unzip
sudo systemctl enable --now docker
```
Firewall (esempio):
```bash
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp
sudo ufw --force enable
```
## 4. Bootstrap stack Git/Distribuzione
Nel repo NetGescon hai gia i file base:
- `scripts/ops/git-stack/docker-compose.yml`
- `scripts/ops/git-stack/.env.example`
### 4.1 Copia stack su macchina remota
```bash
mkdir -p /opt/netgescon-git-stack
cd /opt/netgescon-git-stack
# Copia i file dal tuo repo locale/remoto
after_copy=true
```
Copia dentro `/opt/netgescon-git-stack` almeno:
- `docker-compose.yml`
- `.env.example`
- `placeholder-nginx.conf`
### 4.2 Configura `.env`
```bash
cd /opt/netgescon-git-stack
cp .env.example .env
nano .env
```
Imposta obbligatoriamente:
- `GIT_DOMAIN`
- `SSH_DOMAIN`
- password DB
- secret Forgejo
- credenziali MinIO
- SMTP
### 4.3 Avvio servizi
```bash
cd /opt/netgescon-git-stack
docker compose --env-file .env up -d
docker compose ps
```
## 5. Reverse proxy e TLS
Configura Nginx/Caddy davanti ai servizi docker.
Minimo indispensabile:
1. HTTPS valido su `git.netgescon.it`
2. HTTPS valido su `updates.netgescon.it`
3. SSH Git pubblicato su `:2222`
Verifica endpoint:
```bash
curl -I https://git.netgescon.it
curl -I https://updates.netgescon.it
```
## 6. Punto zero (baseline stabile)
Hai gia creato baseline locale:
- `storage/backups/netgescon-baselines/0.8.0-baseline_20260310-095558`
Copialo su remoto (archivio storico):
```bash
# Esempio
scp -r storage/backups/netgescon-baselines/0.8.0-baseline_20260310-095558 user@REMOTE:/var/backups/netgescon-baselines/
```
Questo e il tuo punto di ritorno sicuro.
## 7. Setup update API su remoto
Questa sezione va considerata secondaria rispetto al flusso Git/Gitea corrente.
Prima di usarla, assicurarsi che:
- il commit corretto sia gia stato pubblicato su Gitea
- staging abbia gia riallineato quel commit dal repository
Nel progetto Laravel (istanza update server) devi avere:
- endpoint manifest/package
- config `distribution.php`
Variabili `.env` lato update server:
```env
NETGESCON_UPDATE_URL=https://updates.netgescon.it
NETGESCON_UPDATE_CHANNEL=free
NETGESCON_LICENSED_PAIRS="CLIENTA:tokenA,CLIENTB:tokenB"
```
Il valore `free` qui va letto come valore tecnico corrente di configurazione. Non dimostra da solo che il modello commerciale attivo sia gia definitivamente separato in canali.
Poi:
```bash
php artisan optimize:clear
php artisan route:clear
php artisan config:clear
```
Test endpoint update:
```bash
curl -sS "https://updates.netgescon.it/api/v1/distribution/updates/manifest?channel=free" | jq
curl -I -sS "https://updates.netgescon.it/api/v1/distribution/updates/package?channel=free&file=netgescon-0.8.1.zip"
```
## 8. Pubblicare il primo aggiornamento
### 8.1 Crea pacchetto zip release
Genera un file zip release (es. `netgescon-0.8.1.zip`) contenente solo codice applicativo da distribuire.
Nota: non includere `.env`, `storage/`, `.git/`.
### 8.2 Pubblica manifest
Script disponibile:
- `scripts/ops/netgescon-publish-manifest.sh`
Esecuzione canale free:
```bash
bash scripts/ops/netgescon-publish-manifest.sh \
--channel free \
--version 0.8.1 \
--package /var/www/netgescon/storage/app/distribution/free/netgescon-0.8.1.zip \
--base-url https://updates.netgescon.it
```
Esecuzione canale licensed:
```bash
bash scripts/ops/netgescon-publish-manifest.sh \
--channel licensed \
--version 0.8.1 \
--package /var/www/netgescon/storage/app/distribution/licensed/netgescon-0.8.1.zip \
--base-url https://updates.netgescon.it
```
## 9. Aggiornare staging
Flusso corretto oggi:
1. sviluppare e testare in `netgescon-day0`
2. fare commit e push su Gitea
3. su staging, eseguire allineamento del repository dal remoto Gitea
4. solo dopo l'allineamento, eseguire eventuali comandi Laravel necessari
Questa resta la procedura preferita anche quando esistono script o comandi di update applicativo.
## 10. Nota sui canali distribuzione
Nel codice esiste gia il supporto ai canali `free` e `licensed`, ma operativamente oggi il progetto va trattato come distribuzione unica fino a conferma di una reale attivazione commerciale differenziata.
La documentazione deve quindi:
- descrivere prima il flusso Git/Gitea reale
- marcare i canali distinti come infrastruttura pronta o parzialmente pronta
- evitare di presentare come attiva una segmentazione commerciale non ancora formalizzata
Sul nodo staging configura `.env`:
```env
NETGESCON_UPDATE_URL=https://updates.netgescon.it
NETGESCON_UPDATE_CHANNEL=free
# per licensed:
# NETGESCON_LICENSED_CODE=CLIENTA
# NETGESCON_LICENSED_AUTH=tokenA
```
Check update:
```bash
php artisan netgescon:update --channel=free
```
Apply update:
```bash
php artisan netgescon:update --channel=free --apply
```
Per licensed:
```bash
php artisan netgescon:update --channel=licensed --apply --code=CLIENTA --auth=tokenA
```
## 10. Verifica finale rete
Dopo update staging:
```bash
curl -I -sS "https://staging.netgescon.it/up"
curl -I -sS "https://staging.netgescon.it/fornitore/tickets?fornitore=1"
```
Verifica app:
1. Login
2. Upload allegati
3. Camera/webapp allegati
4. Area fornitori nuova UI
5. Import e TAG legacy
## 11. Policy accessi utenti selezionati e scadenza
Raccomandazione implementativa lato update/licensing:
1. Tabella `licenses`: `code`, `auth`, `expires_at`, `revoked_at`.
2. Tabella `license_modules`: moduli abilitati per licenza.
3. Tabella `license_nodes`: numero nodi autorizzati.
4. Endpoint `license/check` prima del download package.
## 12. Pagamento moduli premium (fase successiva)
Consigliato:
1. Stripe subscription + webhook.
2. Webhook aggiorna `licenses` e `license_modules`.
3. Feature gate lato app in base all'entitlement attivo.
## 13. Rollback rapido
Se update fallisce:
1. Ripristina baseline da `/var/backups/netgescon-baselines/...`
2. Ripristina `.env`
3. Ripristina DB dal dump piu recente
4. `php artisan optimize:clear`
## 14. Checklist go-live
- [ ] TLS valido su `git.` e `updates.`
- [ ] Backup automatici giornalieri (DB + package + config)
- [ ] Accesso admin con 2FA
- [ ] Primo aggiornamento staging riuscito
- [ ] Test allegati/camera ok
- [ ] Canale free e licensed verificati
## 15. Comandi Riavvio Rapido (Verificati)
Questi comandi sono allineati allo stato attuale del progetto.
### 15.1 Verifica ambiente prima di lavorare
```bash
cd /home/michele/netgescon/netgescon-laravel
php -l app/Providers/Filament/AdminFilamentPanelProvider.php
php artisan list | head -n 40
php artisan list | grep -E "netgescon:update|distribution|gescon:|import:" | head -n 60
```
### 15.2 Riavvio continuita AI (facoltativo ma consigliato)
```bash
cd /home/michele/netgescon/netgescon-laravel
bash scripts/ai/restart_brief.sh "Distribuzione Netgescon"
bash scripts/ai/continuity_auto.sh --threshold=150 --topic="Distribuzione Netgescon" --note="Ripartenza operativa"
```
### 15.3 Verifica update API da rete
```bash
curl -sS "https://updates.netgescon.it/api/v1/distribution/updates/manifest?channel=free" | jq
curl -I -sS "https://updates.netgescon.it/api/v1/distribution/updates/package?channel=free&file=netgescon-0.8.1.zip"
```
### 15.4 Check/apply update su nodo staging
```bash
cd /var/www/netgescon
php artisan netgescon:update --channel=free
php artisan netgescon:update --channel=free --apply
```
### 15.5 Smoke test rete staging
```bash
curl -I -sS "https://staging.netgescon.it/up"
curl -I -sS "https://staging.netgescon.it/fornitore/tickets?fornitore=1"
```
---
Se segui questo runbook, chiudi il ciclo locale e passi a una distribuzione reale in rete, pronta a scalare anche su altri progetti.