Documento 9 di 13
Gestione e manutenzione
Controlli, aggiornamenti, backup e ripristino, incidenti, supporto agli utenti.
Per chi: IT, operatore
Questo documento riguarda chi gestisce un'installazione di Orafila: controlli, aggiornamenti, backup e ripristino, incidenti, e le attività di supporto agli utenti. I comandi deploy/... si scrivono sul server, dalla cartella nova-psa.
Chi fa cosa
| Attività | Servizio gestito | Installazione dedicata |
|---|---|---|
| Server, sistema operativo, Docker, certificati HTTPS | Fornitore | Chi gestisce il server |
| Aggiornamenti di Orafila | Fornitore | Chi gestisce il server (deploy/nova.sh update) |
| Backup, prova di ripristino, custodia delle chiavi | Fornitore | Chi gestisce il server |
| Controllo esterno del sito e dei backup | Fornitore | Chi gestisce il server |
| Attivazione di nuove aziende, indirizzi delle code per il gateway | Fornitore (operatore della piattaforma) | Chi gestisce il server |
| Chiavi dei fornitori AI | Secondo il contratto | Chi gestisce il server, con le chiavi dell'azienda |
| Utenti, ruoli, impostazioni, caselle di posta, Fatture in Cloud, budget AI | Amministratori dell'azienda, dall'applicazione | Amministratori dell'azienda, dall'applicazione |
| Sblocco degli accessi, azzeramento della verifica in due passaggi, nuovi inviti | Amministratori dell'azienda | Amministratori dell'azienda |
Controlli
| Cosa | Come |
|---|---|
| Stato generale | deploy/nova.sh status: servizi, database esterno, spazio su disco, memoria, ultimo backup, email in uscita (porte SMTP raggiungibili o bloccate) |
| Messaggi dei servizi | deploy/nova.sh logs app, logs worker (posta), logs caddy (HTTPS), logs db, logs migrate; con -f in tempo reale |
| Disponibilità dall'esterno | Controllo HTTPS su /api/health ogni 5 minuti da un servizio di uptime: risponde {"status":"ok"} se app e database funzionano |
| Backup notturni | Healthchecks.io (o simile) con BACKUP_PING_URL; storico con journalctl -u nova-backup -n 50 |
| Dentro l'applicazione | Assistente › Controllo dello stato e numeri nel menu: caselle che non leggono o non inviano, processo della posta fermo, email non partite, AI che non risponde o a budget finito |
Docker riavvia da solo un servizio che si ferma; i controlli di salute di app (ogni 30 secondi) e processo della posta (segnale ogni 15 secondi) lo segnalano come "unhealthy" se non risponde.
Aggiornamenti
Orafila:
deploy/nova.sh update
Il comando controlla la memoria, fa un backup di sicurezza, scarica la nuova versione con git, ricostruisce l'immagine e riavvia; le migrazioni del database si applicano da sole all'avvio. Si rifiuta di partire se qualcuno ha modificato a mano i file del repository sul server (li elenca). L'interruzione del servizio è di pochi istanti al riavvio dei contenitori.
Sistema operativo e Docker: gli aggiornamenti di sicurezza si installano da soli ogni giorno. Se al login compare *** System restart required ***, riavviate (sudo reboot): dopo un paio di minuti tutto riparte da solo; controllate con deploy/nova.sh status.
Una volta al mese, le immagini di base (database, Caddy, Node.js), che contengono correzioni di sicurezza:
cd deploy && docker compose pull db caddy && docker compose build --pull && cd ..
deploy/nova.sh up
Spazio su disco: up (e quindi update) cancella ogni volta la versione precedente dell'immagine, e la cache di costruzione quando restano meno di 4 GB liberi. Per liberare spazio prima: docker builder prune -af.
Mai usare
docker compose down -v,docker volume rmodocker system prune --volumes: cancellano il database.
Backup
- Automatico ogni notte alle 02:30 (ora italiana, più al massimo 15 minuti casuali), dopo
deploy/nova.sh install-timer; se il server era spento, parte alla riaccensione. - A mano in qualunque momento:
deploy/nova.sh backup. Elenco:deploy/nova.sh backups. - Ogni backup è il database completo (tutte le aziende), cifrato con age, verificato e poi copiato nel bucket se configurato. Restano gli ultimi 7 sul server e 30 giorni nel bucket (valori modificabili).
- I nomi sono data e ora UTC:
nova-20261020T013000Z.dump.age. - I backup contengono i dati; gli utenti del database no: dopo un ripristino su un server nuovo le password del database possono essere nuove.
Custodia delle chiavi (nel gestore di password, fuori dal server):
- la chiave privata dei backup (
deploy/secrets/backup.agekey); APP_ENCRYPTION_KEY;- consigliato: tutto
deploy/.env, aggiornato a ogni modifica.
Ripristino
Sullo stesso server (per esempio per tornare a uno stato precedente):
deploy/nova.sh restore nova-AAAAMMGGTHHMMSSZ.dump.age --yes [--key ~/chiave-salvata.txt]
Il ripristino fa prima un backup di sicurezza dello stato attuale, ferma app e processo della posta, carica il backup in un database temporaneo che sostituisce quello attuale solo se il caricamento riesce (con un database esterno, in una sola transazione), applica le migrazioni più recenti del backup, riavvia e aspetta che i servizi siano in salute. Se la chiave non apre il backup si ferma prima di cambiare qualunque cosa. Tutte le aziende dell'installazione tornano allo stato del backup.
Su un server nuovo (server perso o guasto):
- nuovo server, record DNS aggiornato al nuovo IP, pacchetto scaricato,
sudo deploy/setup-host.sh; - chiave privata dei backup rimessa in
deploy/secrets/backup.agekeyedeploy/.envricreato dal gestore di password (almenoAPP_ENCRYPTION_KEYe i dati del bucket); deploy/nova.sh init --domain ... --email ...per completare i valori mancanti, poideploy/nova.sh up;deploy/nova.sh backupsedeploy/nova.sh restore <ultimo file del bucket> --yes: il file viene scaricato dal bucket, controllato e ripristinato;deploy/nova.sh install-timer.
Gli utenti entrano con la loro password e il loro codice di verifica, come prima. Se nessuno riesce a completare la verifica in due passaggi, APP_ENCRYPTION_KEY non è quella del server di origine. I passi dettagliati sono nelle guide Oracle e DigitalOcean.
Provate il ripristino all'avvio del servizio, con la copia della chiave custodita nel gestore di password: un backup mai ripristinato non dà garanzie.
Se si sospetta un'intrusione nel server
Considerate compromesso tutto ciò che era sul server: deploy/.env (password del database, chiavi del bucket e dell'AI, APP_ENCRYPTION_KEY) e la chiave dei backup.
- Fermate il server dalla console del fornitore, senza cancellarlo.
- Revocate la deploy key del repository, la chiave di accesso al bucket e le chiavi dei fornitori AI; createne di nuove.
- Ricostruite su un server nuovo con password del database, segreto del gateway e chiave dei backup nuovi (tenendo
APP_ENCRYPTION_KEY, che serve a leggere i dati) e ripristinate l'ultimo backup precedente all'intrusione, aperto con la vecchia chiave dei backup. - Nell'applicazione: cambiate le password delle caselle di posta (prima presso il fornitore di posta, poi in Code e posta) e fate azzerare la verifica in due passaggi a tutti gli utenti (Impostazioni › Utenti), eventualmente anche l'accesso.
- Valutate con il consulente privacy la notifica della violazione (art. 33-34 GDPR).
Attività dell'operatore della piattaforma
| Cosa | Comando |
|---|---|
| Attivare un'azienda | deploy/nova.sh tenant-create --name "..." --slug codice --admin-email ... --admin-name "..." [--lingua en] |
| Nuovo invito per il primo amministratore | deploy/nova.sh tenant-create --reinvite --slug codice [--admin-email ...] |
| Indirizzo di una coda per il gateway di inoltro | deploy/nova.sh queue-address --company codice --queue Assistenza --address [email protected] (--clear per toglierlo) |
| Dati di esempio | deploy/nova.sh sample-data --slug codice / --remove |
Queste operazioni compaiono nel registro attività dell'azienda con l'autore «Sistema».
Supporto agli utenti (amministratori dell'azienda)
| Situazione | Cosa fa l'amministratore in Impostazioni › Utenti |
|---|---|
| Bloccato dopo 5 tentativi | «Sblocca l'accesso» (oppure si sblocca da solo dopo 15 minuti) |
| Telefono cambiato o perso | «Azzera la verifica in due passaggi»: al prossimo accesso la riconfigura |
| Password dimenticata | «Azzera l'accesso», poi «Crea un nuovo link di invito» |
| Invito scaduto o perso | «Crea un nuovo link di invito» (il precedente smette di funzionare) |
| Persona che lascia l'azienda | «Sospendi l'utente» (le sue sessioni si chiudono), poi riassegnare i suoi ticket |
| Unico amministratore non raggiungibile | tenant-create --reinvite dell'operatore funziona solo finché l'azienda non ha un amministratore attivo; dopo, gli inviti si creano dall'applicazione. Per questo conviene avere almeno due amministratori; altrimenti serve un intervento tecnico dell'operatore |
Problemi frequenti
| Sintomo | Causa probabile | Cosa fare |
|---|---|---|
| Il sito non si apre o il certificato non è valido | DNS non propagato, porte 80/443 chiuse | Controllare DNS e firewall, deploy/nova.sh logs caddy, poi deploy/nova.sh up |
| "502" o "Bad Gateway" | L'app non è partita o si sta riavviando | deploy/nova.sh status, deploy/nova.sh logs app migrate |
app o worker "unhealthy" |
Database fermo, errore nelle migrazioni o configurazione sbagliata | deploy/nova.sh logs app worker db migrate; corretto l'errore, deploy/nova.sh up |
up dice che manca un valore in deploy/.env |
Configurazione incompleta | Prima installazione: deploy/nova.sh init; server avviato: rimettere il valore dal gestore di password (APP_ENCRYPTION_KEY mai rigenerata) |
| Le email dei clienti non diventano ticket | Casella non collegata, password sbagliata, fornitore che richiede OAuth, mittente non riconosciuto | Code e posta › «Prova la connessione»; Posta in arrivo; deploy/nova.sh logs worker |
| Le risposte non partono | Dati SMTP, porte bloccate dal fornitore del server | Code e posta › email non inviate; deploy/nova.sh status (sezione email in uscita); porta 2525 con un servizio di invio |
| Il backup non arriva nel bucket | Dati del bucket sbagliati in deploy/.env |
Ricontrollare endpoint, regione, chiavi e nome; deploy/nova.sh backup |
| Dopo un ripristino la verifica in due passaggi non funziona | APP_ENCRYPTION_KEY diversa |
Rimettere la chiave salvata, deploy/nova.sh up |
update si rifiuta di partire |
File del repository modificati a mano | git status, annullare le modifiche, riprovare |
| Disco quasi pieno | Cache di costruzione, immagini vecchie, troppi backup locali | docker builder prune -af, docker image prune -f, ridurre BACKUP_KEEP_LOCAL |
| La costruzione si interrompe per memoria | Server con poca RAM | sudo deploy/setup-host.sh --swap-only, oppure un server più grande |