Pour cette instance, le document ci-dessous liste à la fois les dépendances logicielles (DEV) et les services opérationnels (OPS) qui composent la plateforme. Il est publié au format CycloneDX 1.6, une norme ouverte de l'OWASP qui décrit dans un même document les bibliothèques de code et les services gérés par des tiers.
Bibliothèques, conteneurs et paquets système qui composent l'application. Lié à la version du code ; reproductible par quiconque a accès aux sources.
| Nom | Type | Version | Licence |
|---|---|---|---|
| pa-webinar Portale PA Webinar (Next.js 15 su Node.js 20, Alpine). Build del ramo dev, 158 commit dopo v0.13.0 (commit c0f267d, compilata il 2026-10-13 alle 09:19 UTC, confermata da /api/health). Le build :dev non hanno SBOM pubblicato: il più vicino è quello del rilascio v0.13.0. | container | dev-c0f267d | EUPL-1.2 |
| pa-webinar (migrazioni) Immagine delle migrazioni del database (prisma migrate deploy), eseguita dall'initContainer db-migrate a ogni avvio del portale. Stesso commit del portale; contiene anche le dipendenze di sviluppo. | container | dev-migrate-c0f267d | EUPL-1.2 |
| pa-webinar-recorder-controller Controller riconciliante che avvia e ferma i Job del registratore per partecipante (ADR-013). Build del ramo dev del 2026-10-01 (commit 84cb378). | container | dev-84cb378 | EUPL-1.2 |
| pa-webinar-recorder Bot che registra una traccia audio per partecipante (Puppeteer + lib-jitsi-meet, con Chrome for Testing: termini di ridistribuzione da verificare). Gira come Job creato dal controller da un CronJob modello; pullPolicy Always, quindi il prossimo Job usa il :dev corrente (commit 3ce17bc). | container | dev-3ce17bc | EUPL-1.2 |
| pa-webinar-captions-gateway Gateway dei sottotitoli in diretta (TypeScript, Node.js 22): riceve dal bridge l'audio Opus di ogni oratore, lo passa al motore locale e rimanda il testo alla sala. Dipendenze npm: ws e opus-decoder (MIT). Deployment a zero repliche fuori dagli eventi: lo accende lo scaler dei bridge. | container | dev-f8d9514 | EUPL-1.2 |
| pa-webinar-captions-engine Motore di riconoscimento vocale in streaming su CPU (NeMo-Speech.cpp su debian:bookworm-slim). Componenti inclusi con licenza propria: NeMo-Speech.cpp Apache-2.0, llama.cpp/ggml MIT, runtime GCC/OpenMP GPL con GCC Runtime Library Exception. Il modello non è nell'immagine: lo scarica l'initContainer fetch-model all'avvio del pod e ne verifica lo SHA-256. | container | dev-9090096 | EUPL-1.2 |
| pa-webinar-postprod-worker Worker AI con GPU per trascrizione (WhisperX), diarizzazione (pyannote.audio), doppiaggio (Piper TTS) e filigrana audio (AudioSeal). Base nvcr.io/nvidia/pytorch con CUDA e cuDNN (termini NVIDIA da verificare per la ridistribuzione); include componenti GPL (espeak-ng tramite piper-phonemize, gender-guesser). Gira come Job creato dall'orchestratore sul pool GPU a scalabilità da zero. | container | dev-7becf47 | EUPL-1.2 |
| pa-webinar-postprod-worker-cpu Worker AI senza GPU (riassunti e traduzioni tramite vLLM, sottotitoli, archivio, resoconto dell'evento). Base python:3.13-alpine; ffmpeg di Alpine include componenti GPL. Gira come Job sui nodi del portale. | container | dev-7becf47 | EUPL-1.2 |
| pa-webinar-jitsi-web Jitsi Meet web stable-11031 con correzioni applicate al bundle in fase di build (ADR-017): unico punto in cui PA Webinar modifica codice di terzi. Il pod in esecuzione usa la build del 2026-09-25; il tag è stato ricostruito il 2026-10-13 e verrà usato al prossimo riavvio del pod. | container | stable-11031-rnnoise | Apache-2.0 |
| jitsi/prosody Server XMPP di Jitsi (Prosody, MIT; ricetta dell'immagine Apache-2.0). Con autenticazione JWT; carica i moduli Prosody di PA Webinar (EUPL-1.2) montati da ConfigMap. | container | stable-11031 | MIT AND Apache-2.0 |
| jitsi/jicofo Jicofo, il focus delle conferenze: assegna i bridge e, per i sottotitoli, apre la trascrizione verso il gateway. | container | stable-11031 | Apache-2.0 |
| jitsi/jvb Jitsi Videobridge (SFU). Deployment a zero repliche fuori dagli eventi: lo accende lo scaler, con al massimo un bridge (JVB_MAX_REPLICAS=1), su un pool di nodi dedicato. Digest dell'indice multi-architettura. | container | stable-11031 | Apache-2.0 |
| jitsi/jibri Jibri, registrazione composita della sala (video MP4). Include Google Chrome (termini Google da verificare per la ridistribuzione) e ffmpeg. Deployment a zero repliche: si accende solo quando un evento registra, su un pool di nodi dedicato. | container | stable-11031 | Apache-2.0 |
| jitsi/excalidraw-backend Backend della lavagna condivisa di Jitsi (Excalidraw): sincronizza in tempo reale i disegni tra i partecipanti. | container | 2025.8.2 | MIT |
| coturn/coturn Server TURN/STUN (coturn 4.9.0) per i partecipanti dietro NAT o firewall restrittivi. | container | 4.9 | BSD-3-Clause |
| nginx initContainer acme-proxy del pod coturn: inoltra la sfida ACME HTTP-01 all'ingress per ottenere il certificato TLS del TURN. | container | alpine | BSD-2-Clause |
| busybox initContainer init-coturn: prepara la configurazione di coturn. | container | 1.36 | GPL-2.0-only |
| bitnami/redis Redis 8.10.2 (etichetta dell'immagine, base Photon 5.0). Da Redis 8 il server è disponibile sotto RSALv2, SSPLv1 o AGPLv3, nessuna delle quali permissiva. Il tag latest con pullPolicy Always cambia digest al riavvio. | container | latest | LicenseRef-RSALv2 OR SSPL-1.0 OR AGPL-3.0-only |
| bitnami/redis-exporter Esportatore Prometheus delle metriche di Redis (redis_exporter 1.93.0), sidecar del pod Redis. | container | latest | MIT |
| bitnami/kubectl kubectl 1.37.1 (etichetta dell'immagine). Usato dallo scaler dei bridge (ogni 2 minuti), dall'orchestratore della post-produzione (ogni minuto) e dal Job di ricarica della configurazione web dopo ogni aggiornamento. Tag latest con pullPolicy Always: il digest è quello dell'esecuzione in corso alla generazione. | container | latest | Apache-2.0 |
| curlimages/curl Client HTTP dei CronJob che chiamano le rotte cron del portale: coda email (ogni minuto), promemoria, pulizia GDPR, riconciliazione delle registrazioni, conservazione della rubrica. | container | 8.11.1 | curl |
| curlimages/curl Client HTTP dei CronJob della post-produzione e delle tracce audio: recupero dei lavori bloccati, conservazione degli output AI, eliminazione delle tracce per partecipante. | container | 8.10.1 | curl |
| vllm/vllm-openai Server di inferenza vLLM (API compatibile OpenAI) per riassunti, traduzioni e resoconti, raggiungibile solo dentro il cluster. Deployment pa-webinar-vllm installato a mano, fuori dalla release Helm; a zero repliche, lo accende l'orchestratore sul pool GPU quando ci sono lavori. | container | v0.9.2 | Apache-2.0 |
| ingress-nginx/controller Ingress controller condiviso dal cluster (chart ingress-nginx 4.8.3): termina TLS per portale e Jitsi web. | container | v1.9.4 | Apache-2.0 |
| jetstack/cert-manager-controller cert-manager condiviso dal cluster: emette e rinnova i certificati Let's Encrypt (con webhook e cainjector della stessa versione). | container | v1.13.3 | Apache-2.0 |
| nvidia/gpu-operator NVIDIA GPU Operator condiviso dal cluster: quando il pool GPU si accende installa driver, container toolkit e device plugin (immagini NVIDIA con termini propri, da verificare). | container | v24.9.2 | Apache-2.0 |
| Node.js Runtime del portale, dall'immagine di base node:20-alpine (tramite mirror.gcr.io). | platform | 20.20.2 | MIT |
| next | framework | 15.5.25 | MIT |
| react | library | 19.3.0 | MIT |
| next-intl | library | 4.14.6 | MIT |
| @prisma/client | library | 6.19.3 | Apache-2.0 |
| bootstrap-italia | library | 2.18.3 | BSD-3-Clause |
| design-react-kit | library | 5.10.0 | BSD-3-Clause |
| ioredis | library | 5.11.1 | MIT |
| nvidia/nemotron-3.5-asr-streaming-0.6b (Q8_0 GGUF) Riconoscimento vocale multilingue in streaming per i sottotitoli in diretta (lingua configurata it-IT). Scaricato da Hugging Face a ogni avvio del pod dei sottotitoli, alla revisione fissata, e verificato con lo SHA-256. | machine-learning-model | ea30d66debe3740a08b573244286791d423d6b3e | OpenMDW-1.1 |
| mistralai/Mistral-Small-3.2-24B-Instruct-2506 Modello linguistico servito da vLLM (bfloat16, contesto 32768 token) per riassunti, traduzioni e resoconti. Scaricato da Hugging Face all'avvio di vLLM in una cache temporanea del pod. | machine-learning-model | 2506 | Apache-2.0 |
| Systran/faster-whisper-large-v3 Pesi di riconoscimento vocale della trascrizione post-evento (WhisperX), convertiti da openai/whisper-large-v3 (Apache-2.0). Scaricati da Hugging Face all'avvio di ogni Job GPU: su questa installazione il volume dei modelli è temporaneo (HF_HUB_OFFLINE=0). | machine-learning-model | large-v3 | MIT |
| Modelli pyannote per la diarizzazione speaker-diarization-3.1 e segmentation-3.0 (MIT), wespeaker-voxceleb-resnet34-LM e i file PLDA di speaker-diarization-community-1 (CC-BY-4.0, attribuzione). Modelli ad accesso condizionato: scaricati da Hugging Face con un token all'avvio dei Job GPU. Nessuna impronta vocale conservata. | machine-learning-model | — | MIT, CC-BY-4.0 |
| Modelli di allineamento parola per parola (WhisperX) torchaudio WAV2VEC2_ASR_BASE_960H per l'inglese (MIT) e VOXPOPULI_ASR_BASE_10K per italiano, francese, tedesco e spagnolo (CC BY-NC 4.0: termini non commerciali, da verificare). Scaricati all'avvio dei Job GPU. | machine-learning-model | — | MIT, CC-BY-NC-4.0 |
| Voci Piper per il doppiaggio Voci incluse nell'immagine del worker GPU: it_IT-paola-medium, en_US-lessac-medium, en_US-amy-medium, fr_FR-siwis-medium, fr_FR-tom-medium. Il repository dichiara MIT; i dataset di addestramento hanno licenze proprie (lessac: licenza di ricerca; fr_FR-tom: AGPLv3; siwis: CC-BY 4.0; paola: CC0), da verificare. Solo voci di catalogo, nessuna clonazione della voce. | machine-learning-model | — | MIT |
| AudioSeal audioseal_wm_16bits Generatore di filigrana non udibile per l'audio doppiato. Scaricato da huggingface.co tramite torch.hub durante i Job di doppiaggio. | machine-learning-model | — | MIT |
| Certificati TLS di portale, Jitsi e TURN Certificati X.509 RSA 2048 per pa-webinar-test.developers.italia.it, pa-webinar-test-jitsi.developers.italia.it e pa-webinar-test-turn.developers.italia.it, emessi da Let's Encrypt (intermedi YR1/YR2) via cert-manager con sfida ACME HTTP-01. Validità 90 giorni, rinnovo automatico 30 giorni prima della scadenza. Chiavi private in Secret Kubernetes. | cryptographic-asset | — | — |
| Chiave di firma JWT per Jitsi Chiave simmetrica HS256 condivisa tra portale e Prosody per autenticare chi entra in sala. Il token porta nome, hash dell'email (mai l'email), ruolo, stanza e scadenza. Conservata in un Secret Kubernetes, mai esposta al browser. | cryptographic-asset | — | — |
| Chiave di firma delle sessioni dello staff Chiave simmetrica HS256 (APP_SECRET) che firma il cookie HTTP-only delle sessioni di amministratori e organizzatori. Conservata in un Secret Kubernetes. | cryptographic-asset | — | — |
| Chiave di cifratura dei dati personali a riposo AES-256-GCM applicata dal portale ai campi personali prima della scrittura su PostgreSQL (PII_ENCRYPTION_KEY). La chiave sta in un Secret Kubernetes: il servizio database non la vede. | cryptographic-asset | — | — |
Services gérés par des tiers dont dépend cette instance. Information liée au locataire, qui change lorsque l'exploitant modifie la configuration ou change de fournisseur.
Zona DNS developers.italia.it, delegata dal dominio italia.it e ospitata su Azure DNS: risolve i nomi del portale, di Jitsi e del TURN.
Bilanciatore Standard del cluster con gli indirizzi pubblici dell'ingress HTTPS (porta 443), del bridge video (UDP 10000) e del TURN (3478 e 443). Trasporta traffico cifrato (TLS, DTLS-SRTP).
Ingress controller condiviso dal cluster (progetto Kubernetes): termina TLS per portale e Jitsi web e instrada verso i servizi interni.
Emissione e rinnovo automatico dei certificati TLS di portale, Jitsi e TURN tramite Let's Encrypt (ACME HTTP-01). Componente condiviso dal cluster.
Une vue synthétique des quatre couches qui composent la plateforme : de l'accès utilisateur jusqu'à la plateforme d'exécution.
Autorità di certificazione pubblica che firma i certificati TLS della piattaforma.
Server STUN/TURN nel cluster, per i partecipanti dietro NAT o firewall che non raggiungono il bridge. Credenziali temporanee firmate con un segreto condiviso; TURNS con certificato Let's Encrypt.
Il bridge invia l'audio di ogni oratore al gateway, che lo fa trascrivere su CPU da un modello locale; il testo torna alla sala. Nessun audio né testo esce dal cluster e per impostazione predefinita nessun testo è conservato; un evento può tenere una trascrizione con le frasi di chi ha acconsentito. Il pod si accende solo durante gli eventi.
Il controller avvia un bot che registra una traccia audio per ciascun oratore, per attribuire la trascrizione a chi parla (ADR-013). Serve un consenso distinto da quello alla registrazione video. Le tracce vanno nell'object storage e sono eliminate dopo la trascrizione (controllo ogni 15 minuti).
Trascrizione, diarizzazione, sottotitoli, traduzioni, riassunti, doppiaggio con voci sintetiche e resoconto dell'evento, eseguiti da Job nel cluster: worker GPU e vLLM su un pool di nodi A100 spot a scalabilità da zero, worker CPU sui nodi del portale. Nessuna API AI esterna: i dati non escono dal cluster; dall'esterno arrivano solo i pesi dei modelli.
Database dedicato a questa installazione, su un server flessibile gestito. Contiene eventi, iscrizioni, consensi, chat, sondaggi, questionari e risultati della post-produzione; i campi personali sono cifrati AES-256-GCM dal portale prima della scrittura.
Storage account developersitaliarec. Per questa installazione: container recordings (registrazioni video, tracce audio per partecipante, output della post-produzione) e event-assets-test (materiali e immagini degli eventi). Accesso pubblico ai blob disattivato: upload e download con URL firmati a breve scadenza.
Volume condiviso da 32 GiB (azurefile-csi) dove Jibri scrive la registrazione prima di caricarla nel Blob Storage. Lo storage account lo crea AKS nel resource group dei nodi.
Redis 8 standalone nel cluster, senza persistenza su disco: distribuisce in tempo reale chat, comandi della sala e stato dei bridge. Lo stato canonico è in PostgreSQL. Protetto da password.
Backup giornaliero (conservato 30 giorni) e mensile (90 giorni) degli oggetti Kubernetes di tutti i namespace, Secret compresi, con snapshot dei volumi, in uno storage account dedicato (Azure Blob, ZRS, Italy North).
Dump giornaliero di tutti i database del server PostgreSQL, quello di questa installazione compreso, in uno storage account dedicato (Azure Blob, ZRS, Italy North). I campi personali restano cifrati come nel database.
Cluster AKS gestito; questa installazione occupa un proprio namespace. Pool usati: test (spot, portale e servizi), jvb (bridge), jibri (registrazione) e aigpu (A100 spot), gli ultimi tre a scalabilità da zero.
L'add-on di monitoraggio di AKS invia i log stdout/stderr dei container e l'inventario del cluster a un workspace Log Analytics in Italy North, conservati 30 giorni. Nessuna personalizzazione della raccolta nel cluster: si applica la configurazione predefinita, che esclude solo kube-system.
Raccolta centralizzata dei log del cluster (Loki 3.1, Promtail 2.8), conservati in uno storage account dedicato (Azure Blob, LRS, Italy North). Promtail, nella configurazione predefinita, raccoglie i log di tutti i pod.
Metriche di piattaforma: metriche del portale (/api/metrics), di Redis e del cluster, regole di allarme e dashboard Grafana. Dati aggregati.
Relay SMTP delle email transazionali: conferme d'iscrizione, link personali di accesso, promemoria, comunicazioni post-evento. Mittente no-reply@developers.italia.it, con un'utenza SMTP dedicata a questo ambiente.
Registro delle immagini PA Webinar (portale, migrazioni, Jitsi web modificato, registratore e controller, sottotitoli, worker AI). Il cluster le scarica con un pull secret.
Registro delle immagini di terze parti: Jitsi (Prosody, Jicofo, bridge, Jibri, lavagna), coturn, Redis, kubectl, curl, nginx, busybox, vLLM. I componenti condivisi del cluster arrivano anche da registry.k8s.io e quay.io.
Registro delle immagini NVIDIA: GPU Operator, driver e container toolkit scaricati quando il pool GPU si accende; base dell'immagine del worker GPU (in fase di build).
Fonte dei pesi dei modelli, scaricati all'avvio: modello dei sottotitoli (revisione e SHA-256 fissati), modello linguistico di vLLM, modelli di trascrizione e diarizzazione (con token per quelli ad accesso condizionato), filigrana AudioSeal. Nessun dato dei partecipanti viene inviato.
Fonte dei pesi torchaudio usati da WhisperX per l'allineamento delle parole (inglese, italiano, francese, tedesco, spagnolo), scaricati all'avvio dei Job GPU.
Repository italia/pa-webinar e GitHub Actions: a ogni push sul ramo dev costruiscono le immagini :dev e :dev-<commit> su un runner self-hosted (Actions Runner Controller) dentro lo stesso cluster AKS; le pull request girano su runner ospitati da GitHub. I rilasci pubblicano SBOM.
La liste complète des composants et des services, avec les versions, les empreintes et les propriétés techniques, est disponible dans les sections ci-dessus et dans le JSON téléchargeable.