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_TOKEN | l'account del bot |
|---|---|
| MATRIX_STANDUP_ROOM_ID | la stanza standup predefinita |
| MATRIX_ADMIN_TOKEN | token admin dell'homeserver per provisioning e ricerche; solo ambiente, mai persistito |
| SECRET_KEY | una stringa casuale di 64+ caratteri che firma le sessioni della dashboard |
| DATABASE_URL | sqlite per impostazione predefinita, oppure un URL Postgres |
| BOOTSTRAP_ADMIN_MATRIX_ID | il primo admin, promosso all'avvio |
| AI_PROVIDER e la chiave del provider | si veda Provider di IA |
| INTEGRATION_VAULT_KEY | la chiave che cifra le credenziali delle integrazioni conservate |
| TZ, MAX_BODY_BYTES, AI_REASONING_MODEL | facoltativi |
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.