Panoramica
Il tuo CRM contiene i tuoi clienti, le tue trattative, le tue e-mail e il tuo calendario. Quando una correzione di sicurezza viene distribuita in una release di Twenty, la correzione stessa indica agli aggressori dove cercare e ogni istanza che non è ancora stata aggiornata è un bersaglio. L’aggiornamento rapido è la vera soluzione, ma la maggior parte delle istanze self-hosted è indietro di alcune versioni. La migliore protezione mentre recuperi il ritardo è semplice: assicurati innanzitutto che nessuno su Internet possa raggiungere la tua istanza. Questa pagina mostra come farlo con Tailscale, Cloudflare o il tuo reverse proxy.Privata per impostazione predefinita
Suddividi la tua istanza in tre zone:
Ogni percorso copre tutto ciò che si trova al suo interno. Apri le zone pubbliche e AI cloud solo se utilizzi le funzionalità che vi si trovano, vedi Percorsi pubblici. Altrimenti, mantieni privata l’intera istanza. Gli assistenti AI eseguiti sui computer del tuo team, come Claude Code, non richiedono alcuna apertura, vedi Client AI.
A cosa rinunci: gli strumenti di automazione ospitati che chiamano l’API di Twenty dal proprio cloud (Zapier, Make, n8n Cloud) non possono raggiungere un’istanza privata. Eseguili invece all’interno della tua rete (n8n self-hosted funziona bene) oppure utilizza i workflow di Twenty. Non rendere pubblici
/graphql o /rest per aggirare il problema: l’app stessa viene eseguita su questi endpoint, quindi esporli espone tutto.Scegli una configurazione
Scala
Completamente privato. La configurazione più semplice, ideale per piccoli team.Cloudflare
Nessuna porta aperta, accedi con il tuo provider di identità, percorsi pubblici dove necessario.Inverti proxy
Caddy o Nginx con IP allowlists. Nessun servizio di terze parti.Opzione 1: Tailscale
Tailscale inserisce il tuo server e i dispositivi del tuo team in una rete privata. Twenty ottiene un indirizzo HTTPS che funziona solo per le persone in quella rete.1
Associa Twenty a localhost
In
docker-compose.yml, modifica la mappatura della porta di server in modo che il container sia raggiungibile solo dal server stesso:2
Collega il server alla tua tailnet
Installa Tailscale sul server, quindi:
3
Servi Twenty tramite HTTPS
https://twenty.\<your-tailnet>.ts.net, con un certificato gestito da Tailscale. Se il comando te lo chiede, abilita i certificati HTTPS per la tua tailnet nella console di amministrazione.4
Aggiorna SERVER_URL
docker compose up -d.Opzione 2: Cloudflare Tunnel e Access
Un Cloudflare Tunnel collega il tuo server a Cloudflare con una connessione in uscita, quindi nessuna porta è aperta sul server. Cloudflare Access chiede quindi al tuo team di accedere con il tuo provider di identità prima che qualsiasi richiesta raggiunga Twenty.1
Proteggi il nome host con Access
Fallo prima di creare il tunnel, in modo che il nome host non sia mai raggiungibile senza un accesso. Crea applicazioni Access self-hosted. Access applica il percorso più specifico, quindi le regole sui percorsi seguenti prevalgono sulla regola del nome host.
Crea un’applicazione per ogni percorso. Aggiungi le regole di bypass solo per le funzionalità che usi.I client AI locali come Claude Code non possono completare un accesso nel browser, quindi si basano sugli IP dell’ufficio o della VPN nell’ultima regola. Se il tuo team lavora da ovunque, aggiungi invece una policy Consenti per il tuo team a quell’applicazione, abilita l’autenticazione WARP in Access e chiedi loro di eseguire il client Cloudflare WARP.
2
Crea un tunnel
Nella dashboard Cloudflare Zero Trust, crea un tunnel, scegli Docker come ambiente e copia il token. Aggiungi un nome host pubblico,
crm.example.com, che punta a http://server:3000.3
Esegui cloudflared accanto a Twenty
Aggiungi questo servizio a Aggiungi
docker-compose.yml e rimuovi la sezione ports da server. cloudflared raggiunge Twenty tramite la rete Docker, quindi il server non deve pubblicare alcuna porta.CLOUDFLARE_TUNNEL_TOKEN al tuo .env.4
Aggiorna SERVER_URL
docker compose up -d.Opzione 3: Il tuo proxy inverso
Se esegui già un proxy inverso, inserisci nella allowlist gli indirizzi IP del tuo ufficio o VPN per l’app e apri solo i percorsi pubblici. Associa prima Twenty a localhost, come nell’opzione 1, in modo che nulla aggiri il proxy.- Caddy
- Nginx
203.0.113.0/24 con gli indirizzi del tuo ufficio o VPN. CHATGPT_CONNECTOR_IPS contiene gli intervalli di OpenAI; consulta client AI. Lascialo vuoto se non usi ChatGPT. Se il tuo proxy si trova dietro un bilanciatore di carico, esegui la corrispondenza sull’IP client che inoltra (client_ip con trusted_proxies in Caddy, set_real_ip_from in Nginx), non sull’indirizzo del bilanciatore di carico.
Percorsi pubblici
Questi sono i percorsi chiamati dai servizi esterni alla tua rete. Apri solo quelli di cui hai bisogno.
Per impostazione predefinita Twenty interroga caselle email e calendari, quindi Google e Microsoft non chiamano mai la tua istanza. Lo fanno solo se imposti
IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true.
Come viene protetto ogni percorso pubblico:
- I webhook dei workflow verificano solo che lo spazio di lavoro e il workflow esistano. Chiunque conosca l’URL può attivare il workflow, quindi tratta l’URL come un segreto e convalida il payload nel workflow prima di intervenire su di esso.
- Le route di app e funzioni logiche sono pubbliche, a meno che la route non richieda l’autenticazione (
isAuthRequired). Per le route pubbliche, verifica il chiamante nel tuo codice, ad esempio con la firma del servizio mittente. - I webhook di Google, Microsoft, SES e Resend vengono verificati da Twenty, usando la firma o il token del provider.
- I link email possono registrare solo un’apertura, un clic o un annullamento dell’iscrizione per il destinatario a cui sono stati inviati.
Client AI (MCP)
Gli assistenti AI sono uno dei modi principali in cui il tuo team utilizzerà Twenty, tramite il suo server MCP. Ciò che devi aprire dipende da dove viene eseguito l’assistente, non da quale assistente sia.Client locali: nulla da aprire
Claude Code, Codex CLI, Cursor e altri strumenti eseguiti sul tuo computer si connettono a Twenty da quel computer. Se si trova nella tua tailnet o VPN, raggiungono/mcp nello stesso modo in cui il browser raggiunge l’app. Questa è la configurazione più sicura, quindi preferiscila quando possibile.
Claude Desktop è l’eccezione: i connettori aggiunti in Impostazioni → Connettori vengono eseguiti nel cloud di Anthropic, anche nell’app desktop. Per mantenere locale la connessione, aggiungi invece Twenty come server MCP locale in claude_desktop_config.json:
Connettori cloud: apri con cautela
Claude (web, mobile e connettori nell’app desktop) e ChatGPT chiamano il tuo server dall’infrastruttura di Anthropic e OpenAI, non dal tuo dispositivo. Non possono raggiungere un’istanza privata, quindi devi aprire/mcp, /oauth e /.well-known ai loro intervalli IP.
Ciò che li tiene fuori è l’accesso. Per ottenere un token, un utente deve accedere alla pagina /authorize di Twenty, che rimane nella zona privata. Una persona esterna alla tua rete può avviare il flusso di connessione ma non può completarlo, e /mcp rifiuta ogni richiesta senza un token valido.
Ciò che resta esposto è il codice eseguito prima dell’accesso: rilevamento OAuth, registrazione del client (/oauth/register) e l’endpoint del token. La allowlist limita questo aspetto: gli scanner dell’intera Internet non possono raggiungere direttamente questi percorsi e le richieste devono passare attraverso l’infrastruttura di Claude o ChatGPT. Questo non rende quel codice sicuro da solo, quindi gli aggiornamenti restano importanti.
Se usi connettori cloud:
- Apri solo
/mcp,/oauthe/.well-known. Non aprire mai/authorizené il resto dell’app. - Consenti solo i fornitori che usi:
-
Anthropic:
160.79.104.0/21, dalla pagina degli indirizzi IP di Anthropic. -
OpenAI: l’elenco in chatgpt-connectors.json. OpenAI lo descrive come non garantito e cambia nel tempo, quindi aggiornalo a intervalli programmati:
-
Anthropic:
- Aggiorna rapidamente quando le note di rilascio menzionano correzioni MCP o OAuth.
Verifica la configurazione
Esegui test da entrambi i lati della rete dopo ogni modifica:https://crm.example.com/.well-known/.... Se mostra http:// o 127.0.0.1, il tuo proxy non inoltra le intestazioni Host e X-Forwarded-Proto.
Checklist di base
Postgres e Redis non sono pubblicati. Il file
docker-compose.yml predefinito non li pubblica; mantienilo così se lo modifichi.Niente aggira il tuo proxy o tunnel. Con un proxy sull’host, la porta di Twenty è associata a
127.0.0.1. Con cloudflared in Docker, il servizio server non pubblica alcuna porta. Docker scrive le proprie regole firewall, quindi le porte che pubblica ignorano ufw e firewall host simili.I segreti sono lunghi e casuali e sai come ruotarli.
I membri dello spazio di lavoro usano SSO o l’autenticazione a due fattori.
Il database viene sottoposto a backup secondo una pianificazione e hai testato un ripristino.
TAG è fissato a una versione e aggiorni intenzionalmente.Resta aggiornato
Niente di quanto sopra sostituisce gli aggiornamenti. Ti fa guadagnare tempo.- Segui le release su GitHub: Segui → Personalizzato → Release.
- Quando una release include una correzione di sicurezza, aggiorna non appena indicato dal relativo avviso: lo stesso giorno per i problemi critici. Segui la guida all’aggiornamento.
- Segnala le vulnerabilità a security@twenty.com, non nelle issue pubbliche.