Cos'è Agorà
Nelle riunioni online circolano informazioni riservate: decisioni, documenti, dati dei clienti. Su una piattaforma esterna tutto questo è gestito da terzi, con regole che non decidiamo noi.
Per questo abbiamo realizzato Agorà: una piattaforma di videoconferenza in esercizio sul nostro cluster, descritta interamente in IaC, in cui ogni modifica passa da una pipeline. Oggi la offriamo anche ai clienti che vogliono una piattaforma propria.
I componenti
Agorà non reinventa nulla: integra componenti open source consolidati, ciascuno con un ruolo preciso, e li rende riproducibili.
- BigBlueButton 3.0Videoconferenza
- Proxmox VEVirtualizzazione
- OpenTofuInfrastruttura come codice
- Ansible e MoleculeConfigurazione
- OPNsense in HAPerimetro
- Django e CeleryApplicazione
- GitLab CIRilascio
- Let's EncryptCertificati
Infrastruttura come codice
In produzione non si interviene manualmente. La macchina virtuale è definita in OpenTofu, lo stato è conservato in GitLab e il repository contiene 0 secret. Anche le regole del firewall sono codice: il plan mostra ogni modifica prima che venga applicata.
$ tofu plan # opnsense_firewall_filter.this["lan_turn"] will be createdPlan: 3 to add, 0 to change, 0 to destroy.$ tofu apply plan.cacheApply complete! Resources: 3 added.$ sh ci/ha-sync.sh✓ configurazione sincronizzata sul nodo di riservaTutte le 18 merge request del progetto hanno seguito lo stesso percorso:
- 1Merge requestrevisione del codice
- 2Lint e testtofu test, Molecule, pytest
- 3Plananteprima delle modifiche
- 4Applyapprovazione manuale
- 5Configureconfigurazione con Ansible
Configurazione e test
Ansible configura il resto del sistema: prerequisiti, installazione di BigBlueButton con verifica dell'hash, secret delle API, media server e pagina iniziale. Una seconda esecuzione non deve modificare nulla: se qualcosa cambia, il test fallisce.
I test girano con Molecule su un container Ubuntu. Per il proxy degli inviti viene avviato un nginx reale, verificato anche sui casi limite: percorsi non consentiti, richieste POST, backend non disponibile.
La pagina di benvenuto e la favicon personalizzate sono protette con dpkg-divert, così gli aggiornamenti di BigBlueButton non le sovrascrivono.
Diagnosi di un problema audio
Nel primo test reale video e condivisione dello schermo funzionavano, l'audio no: il microfono non si connetteva e restituiva errorCode 2003.
Abbiamo inoltre introdotto un DNS split-horizon: dall'interno il nome di Agorà risolve sull'IP privato, così i client in ufficio usano il TURN sulla rete interna senza attraversare il NAT.
Gestione delle stanze
BigBlueButton espone solo delle API, senza un'interfaccia per gestire le stanze. Abbiamo quindi sviluppato un'app Django riutilizzabile, con 282 test automatici e il 99% di copertura del codice, distribuita come pacchetto Python nel nostro registry privato. Le funzionalità principali:
- Più server BigBlueButton, con i secret cifrati e mai visibili nell'amministrazione.
- Chiamate firmate: checksum SHA-256 verso le API, token e JWT verificati su callback e notifiche.
- Stato coerente: signal Django emessi solo dopo il commit e task Celery di riallineamento.
- Amministrazione a moduli: le opzioni della stanza sono campi da compilare, non JSON da scrivere a mano.
- Chiusura definitiva delle riunioni terminate, salvo nelle stanze configurate come riutilizzabili.
- Link d'invito revocabili e con scadenza, validi anche senza account.
Accesso degli ospiti
L'app delle stanze risiede nella nostra intranet, non raggiungibile da Internet. Alle riunioni partecipano però anche clienti e partner, che devono poter accedere senza che la intranet venga esposta.
Il server di videoconferenza, già pubblico, fa da reverse proxy per un solo percorso: la pagina d'invito. nginx accetta solo chiavi UUID e richieste GET, verifica il certificato della intranet e limita le richieste per IP, con una soglia che tollera più ospiti dietro lo stesso NAT aziendale. Ogni altro percorso restituisce 404.
Se la intranet non risponde, solo gli inviti restituiscono 502: le riunioni in corso non si interrompono.
Scalabilità
L'app Django gestisce già più server BigBlueButton. Un nuovo ambiente è una nuova configurazione per OpenTofu e Ansible, con le stesse pipeline e gli stessi test; per aumentare la capacità basta aggiungere un nodo.


