Nuovo modulo guidato in 6 step (cl. 4-10 + Statement of Applicability): - migration 037 (isms_models/roles/soa/documents) + 038 (dataset 111 controlli: 93 Annex A:2022 + 7 CLD/27017 + 11 PII/27018) + runner scripts/migrate-isms.php - IsmsModelController (16 endpoint) registrato in index.php - SoA pre-popolato dalle risposte Gap Analysis NIS2 (mapping iso27001_control) - estensioni cloud condizionali 27017/27018 via flag uses_public_cloud/ is_cloud_provider/processes_pii_in_cloud - AIService::generateIsmsDocument + fonti ISO in nis2_sources.php - frontend isms.html/isms.js + api client + sidebar + help + i18n IT/EN - ingest KB ISO (scope SYSTEM, solo titoli/sintesi: no testo coperto da copyright) - version.json 1.14.0; doc studio + deploy handoff Strumento di supporto/pre-audit (non certificazione). Migration DA APPLICARE su host. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.0 KiB
Deploy — Modulo Modello Organizzativo SGSI (ISO 27001) — v1.14.0
Implementazione completata 2026-06-11. Tutto il codice (backend, frontend, help, i18n, AI, KB) è scritto e committato. I passi seguenti richiedono privilegi host (DB + docker) e vanno eseguiti su Hetzner.
Cosa è stato realizzato (già nel repo, files live via bind-mount)
| Area | File |
|---|---|
| Migration schema | docs/sql/037_isms_model.sql (4 tabelle SGSI), docs/sql/038_iso27001_annex_controls.sql (dataset 111 controlli: 93 Annex A:2022 + 7 CLD/27017 + 11 PII/27018) |
| Runner migrazioni | scripts/migrate-isms.php |
| Backend | application/controllers/IsmsModelController.php (16 endpoint) + registrazione in public/index.php |
| AI | application/services/AIService.php::generateIsmsDocument() + fonti ISO in application/config/nis2_sources.php |
| Frontend | public/isms.html, public/js/isms.js, metodi isms* in public/js/api.js, voce sidebar in public/js/common.js |
| Help + i18n | topic isms in public/js/help.js, stringhe isms.*/nav.isms IT/EN in public/js/i18n.js |
| KB / RAG | scripts/ingest-iso-sources.php (catalogo controlli + fonti ISO, scope SYSTEM) |
| Versione | public/version.json → 1.14.0 |
Passi di deploy (HOST Hetzner)
1. Applicare le migrazioni al DB di produzione
Il DB servito dall'app è il MySQL host (via socket), NON il container nis2-db. Usare il runner con la connessione dell'app:
docker exec nis2-app php /var/www/nis2-agile/scripts/migrate-isms.php
Atteso: iso27001_annex_controls: 111 controlli (iso27001:93, iso27017:7, iso27018:11) + 4 tabelle SGSI create. Idempotente (CREATE TABLE IF NOT EXISTS + INSERT IGNORE).
Alternativa SQL diretta:
mysql -h localhost nis2_agile_db < /var/www/nis2-agile/docs/sql/037_isms_model.sql
mysql -h localhost nis2_agile_db < /var/www/nis2-agile/docs/sql/038_iso27001_annex_controls.sql
2. Hot-reload PHP-FPM (opcache)
Dopo ogni edit .php il bytecode in cache va ricaricato:
docker exec nis2-app kill -USR2 1
(HTML/JS sono già live via nginx, non serve reload.)
3. Smoke test
# con un JWT valido + X-Organization-Id:
curl -s https://nis2.agile.software/api/isms/model -H "Authorization: Bearer <JWT>" -H "X-Organization-Id: <ORG>"
curl -s https://nis2.agile.software/api/isms/annex-controls -H "Authorization: Bearer <JWT>" -H "X-Organization-Id: <ORG>"
# UI: aprire https://nis2.agile.software/isms.html → step 1, salvare, andare al SoA (auto-derive dal NIS2)
Verifica chiave: con un assessment NIS2 esistente, GET /api/isms/soa deve restituire controlli con derived_from_nis2=1 e uno stato pre-compilato.
4. (Opzionale) Ingest KB ISO per il grounding AI
Richiede Qdrant + Voyage attivi e migration 038 applicata:
docker exec nis2-app php /var/www/nis2-agile/scripts/ingest-iso-sources.php
# anteprima senza scrivere: aggiungere --dry-run
5. Push del codice (se non già fatto dal container)
Il container NIS2 è legacy: dopo reboot la git credential-cache è vuota. Se il push da devenv non funziona, chiedere all'host (helper vault):
"NIS2 ha N commit su main da pushare, fallo tu dall'host"
Note / vincoli rispettati
- Additivo: nessuna tabella esistente modificata; nessun controller esistente alterato nella logica (solo registrazione del nuovo).
- Copyright ISO: indicizzati solo titoli/sintesi proprietari + riferimenti, mai il testo letterale delle norme.
- Disclaimer: il modulo è strumento di supporto/pre-audit, non certificazione ISO; l'UI e l'AI lo dichiarano. Gli obblighi normativi italiani restano NIS2 / D.Lgs. 138/2024 / ACN.
- 27017:2015 / 27018:2019: versioni attuali (nessuna revisione più recente). 27017 numerata su 27002:2013 →
iso27002_refconserva il cross-reference.
Rollback
DROP TABLE IF EXISTS isms_soa, isms_roles, isms_documents, isms_models, iso27001_annex_controls;
- rimuovere la riga
'isms'da controllerMap/actionMap inpublic/index.php, USR2. Il frontendisms.htmlresta inerte senza backend.