Piattaforma

Self-hosting

La stessa immagine funziona sul vostro host o sul nostro. Questa pagina è la vista dell'operatore: cosa impostare, cosa mettergli davanti e come tenerlo in funzione senza che nulla esca dall'edificio.

Struttura

  • Un solo processo Python esegue l'ascoltatore della chat, lo scheduler e l'API con la dashboard in un unico event loop.
  • Il container ascolta solo sull'interfaccia di loopback; un reverse proxy (Nginx o Caddy) termina il TLS e inoltra a esso.
  • Lo stato vive in una directory dati: il database SQLite, i caricamenti, i dati GeoIP, le chiavi generate e i pesi del modello. Puntate DATABASE_URL a Postgres per le installazioni multi-host; il set di migrazioni additive funziona su entrambi.
  • Il server di chat (Synapse o un altro homeserver Matrix) può trovarsi ovunque sia raggiungibile.

Ambiente

MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKENl'account del bot
MATRIX_STANDUP_ROOM_IDla stanza standup predefinita
MATRIX_ADMIN_TOKENtoken admin dell'homeserver per provisioning e ricerche; solo ambiente, mai persistito
SECRET_KEYuna stringa casuale di 64+ caratteri che firma le sessioni della dashboard
DATABASE_URLsqlite per impostazione predefinita, oppure un URL Postgres
BOOTSTRAP_ADMIN_MATRIX_IDil primo admin, promosso all'avvio
AI_PROVIDER e la chiave del providersi veda Provider di IA
INTEGRATION_VAULT_KEYla chiave che cifra le credenziali delle integrazioni conservate
TZ, MAX_BODY_BYTES, AI_REASONING_MODELfacoltativi

Reverse proxy

  • Inoltrate X-Forwarded-For e X-Forwarded-Proto; senza il secondo il prodotto non distingue HTTP da HTTPS e omette l'header HSTS.
  • Abilitate la compressione per le risposte inoltrate e HTTP/2; la dashboard carica decine di asset a freddo.
  • Non comprimete né bufferizzate mai l'endpoint del flusso di eventi; gli aggiornamenti live sono server-sent event.
  • Il rate limiting per IP è compito del proxy; il prodotto limita da sé le richieste di codice e gli accessi.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
gzip_proxied any;
http2 on;

Header di sicurezza e limiti

Ogni risposta porta nosniff, negazione dei frame, una policy no-referrer, una permissions policy restrittiva, un HSTS di due anni su TLS e una content-security policy. I corpi delle richieste hanno un tetto di 5 MiB per impostazione predefinita. Ogni input viene validato tramite schema prima che un handler venga eseguito; gli ID di chat vengono verificati con espressioni regolari prima di qualsiasi chiamata all'homeserver; l'HTTP in uscita è vincolato all'homeserver e all'host del provider configurato.

Gestione

  • Aggiornamento: pull, rebuild, riavvio. Le migrazioni girano all'avvio e saltano ciò che esiste già.
  • Fate il backup della directory dati ogni notte; per Postgres usate pg_dump.
  • Salute: un endpoint di liveness veloce e non autenticato per il controllo del container e uno dettagliato riservato agli admin con uptime, dimensione del database e stato del provider.
  • GeoIP: eseguite lo script di aggiornamento ogni settimana (db-ip Lite senza chiave, oppure MaxMind con una chiave gratuita); una copia nel volume dati viene rilevata al riavvio senza configurazione.
  • Lo scheduler gestisce la giornata lavorativa: campionamenti di presenza ogni cinque minuti, controlli di assenza ogni quindici, aggregazioni notturne e materializzazione dei punteggi, riepiloghi e report alle loro cadenze.
docker compose up -d --build
docker exec inroots sqlite3 /app/data/standup.db ".backup /tmp/backup.db"
GEO_DATA_DIR=/app/data/geo scripts/update_geoip.sh

Air-gapped

Con un server Matrix self-hosted, Ollama come provider, un database IP locale sull'host, le risposte vocali disattivate e nessuna integrazione abilitata, il prodotto non ha alcun bisogno di internet. Non ci sono telemetria, beacon di utilizzo né crash reporter verso l'esterno; zero byte in uscita, a meno che non configuriate una destinazione.