Panoramica
Twenty offre due modalità di configurazione per soddisfare diverse esigenze di distribuzione: Accesso al pannello di amministrazione: Solo gli utenti con privilegi di amministrazione (canAccessFullAdminPanel: true) possono accedere all’interfaccia di configurazione.
1. Configurazione del Pannello di Amministrazione (Predefinito)
- Accedi alla tua istanza Twenty (solitamente
http://localhost:3000) - Vai a Impostazioni / Pannello di Amministrazione / Variabili di Configurazione
- Configura integrazioni, email, storage e altro
- Le modifiche hanno effetto immediato (entro 15 secondi per distribuzioni multi-container)
- Autenticazione - Google/Microsoft OAuth, impostazioni della password
- Email - Impostazioni SMTP, modelli, verifica
- Storage - Configurazione S3, percorsi storage locale
- Integrazioni - Gmail, Google Calendar, servizi Microsoft
- Workflow e limitazione della frequenza - Limiti di esecuzione, throttling delle API
- E molto altro ancora…

Chiavi di crittografia
Twenty utilizza due chiavi di crittografia disponibili solo tramite variabili d’ambiente:
Per garantire la retrocompatibilità, se
ENCRYPTION_KEY non è impostata, Twenty torna a utilizzare APP_SECRET per la crittografia a riposo, in modo da rispecchiare il comportamento legacy delle distribuzioni meno recenti. Le nuove installazioni dovrebbero sempre impostare una ENCRYPTION_KEY dedicata.
Genera i valori con openssl rand -base64 32 e conservali in un luogo sicuro (un secrets manager, configurazioni sigillate, ecc.). Perdere ENCRYPTION_KEY significa perdere l’accesso a ogni segreto memorizzato nel database.
Per ruotare ENCRYPTION_KEY senza tempi di inattività, consulta la guida alla rotazione delle chiavi.
2. Configurazione Solo-Ambiente
.env:
- Imposta
IS_CONFIG_VARIABLES_IN_DB_ENABLED=falsenel tuo file.env - Aggiungi tutte le variabili di configurazione nel tuo file
.env - Riavvia i container per applicare le modifiche
- Il pannello di amministrazione mostrerà i valori attuali ma non potrà modificarli
Modalità multi-workspace
Per impostazione predefinita, Twenty viene eseguito in modalità a workspace singolo — ideale per la maggior parte delle distribuzioni self-hosted in cui è necessaria un’istanza di CRM per la tua organizzazione.Modalità a workspace singolo (predefinita)
- Un workspace per istanza di Twenty
- Il primo utente diventa automaticamente amministratore con privilegi completi (
canImpersonateecanAccessFullAdminPanel) - Le nuove registrazioni sono disabilitate dopo la creazione del primo workspace
- Struttura URL semplice:
https://your-domain.com
Abilitare la modalità multi-workspace
- È possibile creare più workspace sulla stessa istanza
- Ogni workspace ottiene il proprio sottodominio (ad es.,
sales.your-domain.com,marketing.your-domain.com) - Gli utenti si registrano e accedono su
{DEFAULT_SUBDOMAIN}.your-domain.com(ad es.,app.your-domain.com) - Nessun privilegio amministrativo automatico — il primo utente in ogni workspace è un utente normale
- Le impostazioni specifiche del workspace, come sottodominio e dominio personalizzato, diventano disponibili nelle impostazioni del workspace
Configurazione DNS per la modalità multi-workspace
Quando si utilizza la modalità multi-workspace, configura il DNS con un record wildcard per consentire la creazione dinamica dei sottodomini:Limitare la creazione di workspace
In modalità multi-workspace, potresti voler limitare chi può creare nuovi workspace:canAccessFullAdminPanel possono creare workspace aggiuntivi. Gli utenti possono comunque creare il loro primo workspace durante la registrazione iniziale.
Integrazione Gmail & Google Calendar
Crea Progetto nel Google Cloud
- Vai a Google Cloud Console
- Crea un nuovo progetto o seleziona uno esistente
- Abilita queste API:
Configura OAuth
- Vai a Credenziali
- Crea ID client OAuth 2.0
- Aggiungi questi URI di reindirizzamento:
https://{your-domain}/auth/google/redirect(per SSO)https://{your-domain}/auth/google-apis/get-access-token(per integrazioni)
Configura in Twenty
- Vai a Impostazioni → Pannello di Amministrazione → Variabili di Configurazione
- Trova la sezione Google Auth
- Imposta queste variabili:
MESSAGING_PROVIDER_GMAIL_ENABLED=trueCALENDAR_PROVIDER_GOOGLE_ENABLED=trueAUTH_GOOGLE_CLIENT_ID={client-id}AUTH_GOOGLE_CLIENT_SECRET={client-secret}AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirectAUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token
https://www.googleapis.com/auth/calendar.eventshttps://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/profile.emails.read
Se la tua app è in modalità di test
Se la tua app è in modalità di test, dovrai aggiungere utenti di prova al tuo progetto. Sotto Schermo di Consenso OAuth, aggiungi i tuoi utenti di prova nella sezione “Utenti di Prova”.Integrazione Microsoft 365
Crea un progetto in Microsoft Azure
Avrai bisogno di creare un progetto in Microsoft Azure e ottenere le credenziali.Abilita API
Nel Microsoft Azure Console abilita le seguenti API in “Permessi”:- Microsoft Graph: Mail.ReadWrite
- Microsoft Graph: Mail.Send
- Microsoft Graph: Calendars.ReadWrite
- Microsoft Graph: User.Read
- Microsoft Graph: openid
- Microsoft Graph: email
- Microsoft Graph: profile
- Microsoft Graph: offline_access
Tutte queste autorizzazioni sono necessarie, anche se vuoi solo sincronizzare le email e gli eventi del calendario. Twenty richiede sempre “Mail.ReadWrite”, “Mail.Send” e “Calendars.ReadWrite” quando un utente collega il proprio account, quindi le autorizzazioni di sola lettura come “Mail.Read” o “Calendars.Read” non sono sufficienti.
Se il tuo tenant non consente agli utenti regolari di acconsentire a queste autorizzazioni, visualizzeranno l’errore AADSTS90094 quando collegano il proprio account. Un amministratore può risolvere il problema facendo clic su “Concedi il consenso dell’amministratore per ” nella pagina “Autorizzazioni API” della registrazione dell’app.
URI di Riindirizzamento Autorizzati
Devi aggiungere i seguenti URI di reindirizzamento al tuo progetto:https://{your-domain}/auth/microsoft/redirectse vuoi usare Microsoft SSOhttps://{your-domain}/auth/microsoft-apis/get-access-token
Configura in Twenty
- Vai a Impostazioni → Pannello di Amministrazione → Variabili di Configurazione
- Trova la sezione Microsoft Auth
- Imposta queste variabili:
MESSAGING_PROVIDER_MICROSOFT_ENABLED=trueCALENDAR_PROVIDER_MICROSOFT_ENABLED=trueAUTH_MICROSOFT_ENABLED=trueAUTH_MICROSOFT_CLIENT_ID={client-id}AUTH_MICROSOFT_CLIENT_SECRET={client-secret}AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirectAUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token
Configura scope
Vedi il codice sorgente pertinente- ‘openid’
- ‘email’
- ‘profilo’
- ‘offline_access’
- ‘Mail.ReadWrite’
- ‘Mail.Send’
- ‘Calendars.ReadWrite’
- ‘User.Read’
Se la tua app è in modalità di test
Se la tua app è in modalità di test, dovrai aggiungere utenti di prova al tuo progetto. Aggiungi i tuoi utenti di prova nella sezione “Utenti e gruppi”.Lavori in Background per Calendario & Messaggistica
Dopo aver configurato le integrazioni di Gmail, Google Calendar o Microsoft 365, devi avviare i lavori in background che sincronizzano i dati. Registrare i seguenti lavori ricorrenti nel tuo container worker:Connessioni in uscita verso host interni
Per impostazione predefinita, Twenty rifiuta le connessioni in uscita verso indirizzi IP privati/interni (protezione SSRF). Ciò copre le azioni dei flussi di lavoro HTTP, i webhook, i provider di identità SSO e le connessioni IMAP/SMTP/CalDAV. Se il provider di identità, il server di posta o il server di calendario viene eseguito su una rete privata, elencane il nome host o il letterale IP:http://keycloak:8080/realms/twenty, elenca keycloak. Ogni altro indirizzo privato rimane bloccato e persino un host consentito non può mai raggiungere l’intervallo di indirizzi dei metadati cloud. Imposta la variabile su * per disabilitare completamente la protezione, operazione appropriata solo su reti affidabili e isolate.
OUTBOUND_HTTP_SAFE_MODE_ENABLED è deprecata. Finché è impostata su false, la protezione rimane completamente disattivata e OUTBOUND_HTTP_ALLOWED_INTERNAL_HOSTS viene ignorata, quindi rimuovila quando esegui la migrazione all’elenco.
Questo elenco non include gli allegati di file IA: immagini e PDF raggiungono il modello come link creati da SERVER_URL, recuperati dal provider di IA o dall’AI SDK nel worker, che rifiuta gli indirizzi privati. Affinché gli allegati funzionino, SERVER_URL deve essere pubblico; con un SERVER_URL localhost o privato, le chat e gli agenti IA funzionano solo con il testo.
Configurazione Email
- Vai a Impostazioni → Pannello di Amministrazione → Variabili di Configurazione
- Trova la sezione Email
- Configura le impostazioni SMTP:
- Gmail
- Office365
- smtp4dev
Avrai bisogno di provvedere una Password per l’App.
- EMAIL_DRIVER=smtp
- EMAIL_SMTP_HOST=smtp.gmail.com
- EMAIL_SMTP_PORT=465
- EMAIL_SMTP_USER=indirizzo_email_gmail
- EMAIL_SMTP_PASSWORD=‘password_app_gmail’
Archiviazione S3
ImpostaSTORAGE_TYPE=S_3 e configura le variabili STORAGE_S3_* tramite il pannello di amministrazione o .env.
Un file
.env minimo per AWS S3 con un utente IAM:
Il file Docker Compose inoltra
STORAGE_TYPE, STORAGE_S3_REGION, STORAGE_S3_NAME, STORAGE_S3_ENDPOINT e le due variabili delle credenziali da .env. Impostare le variabili degli URL prefirmati nel pannello di amministrazione oppure aggiungerle al blocco environment dei servizi server e worker.Credenziali
QuandoSTORAGE_S3_ACCESS_KEY_ID non è impostato, il server risolve le credenziali tramite la catena predefinita dell’SDK AWS: le variabili d’ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY, un file di credenziali condiviso, un ruolo di attività ECS, un ruolo di account di servizio EKS (IRSA) o un profilo di istanza EC2.
CredentialsProviderError: Could not load credentials from any providers al primo caricamento, mentre l’interfaccia utente mostra solo un errore generico.
Autorizzazioni del bucket
Un caricamento viene prima scritto in un percorso in attesa, convalidato, quindi copiato nel percorso finale e l’oggetto in attesa viene eliminato. La policy necessita quindi di più dis3:PutObject:
s3:ListBucket viene usato per eliminare cartelle, ad esempio quando viene eliminato uno spazio di lavoro. Senza di esso, S3 risponde alle richieste di oggetti mancanti con accesso negato anziché oggetto non trovato, quindi il server non può distinguere un file mancante da un problema di autorizzazioni.
Endpoint e indirizzamento
Twenty utilizza sempre l’indirizzamento in stile percorso, pertanto le richieste vanno ahttps://endpoint/bucket/key. Per S3 AWS nativo, lasciare STORAGE_S3_ENDPOINT non impostato: l’SDK costruisce https://s3.{region}.amazonaws.com da STORAGE_S3_REGION, motivo per cui una regione digitata erroneamente si manifesta come errore DNS anziché come errore S3. Impostare l’endpoint solo per i servizi compatibili con S3 oppure quando il server raggiunge S3 tramite un endpoint di interfaccia VPC.
CORS
QuandoSTORAGE_S3_PRESIGNED_URL_ENABLED è true, i browser comunicano direttamente con il bucket. I download sono richieste GET e i caricamenti sono richieste PUT che includono un’intestazione Content-Type, facendo sì che il browser invii prima una richiesta di preflight. La policy CORS del bucket deve quindi consentire la tua origine Twenty, entrambi i metodi e tale intestazione:
Risoluzione dei problemi
Gli errori di caricamento raggiungono l’interfaccia utente come errore generico. L’errore S3 sottostante si trova nei log del server (docker compose logs server) e nella risposta GraphQL visibile nella scheda di rete del browser.
Funzioni logiche & interprete del codice
Twenty supporta le funzioni logiche per i workflow e l’interprete del codice per l’analisi dei dati con IA. Entrambi eseguono codice fornito dall’utente e richiedono una configurazione esplicita per motivi di sicurezza.Impostazioni di sicurezza predefinite
In produzione (NODE_ENV=production): Sia le funzioni logiche sia l’interprete del codice hanno come impostazione predefinita Disabilitato. È necessario abilitarli esplicitamente conLOGIC_FUNCTION_TYPE e CODE_INTERPRETER_TYPE se queste funzionalità sono necessarie.
In sviluppo (NODE_ENV=development): Entrambi sono impostati su LOCAL per comodità quando vengono eseguiti in locale.
Funzioni logiche - Driver disponibili
Funzioni logiche - Configurazione consigliata
Per lo sviluppo:LOGIC_FUNCTION_LAMBDA_LAYER_BUCKET, un bucket di tua proprietà nella stessa regione delle tue funzioni. Quando non è impostato, il driver utilizza il bucket di archiviazione (STORAGE_S3_NAME). Se nessuno dei due è impostato, le funzioni logiche hanno esito negativo con un errore di configurazione.
Per disabilitare le funzioni logiche:
Interprete del codice - Driver disponibili
Quando si utilizza
LOGIC_FUNCTION_TYPE=DISABLED o CODE_INTERPRETER_TYPE=DISABLED, qualsiasi tentativo di esecuzione restituirà un errore. Ciò è utile se si desidera eseguire Twenty senza queste funzionalità.API e front-end su host separati
Rilevante solo se il back-end non serve il front-end. Le distribuzioni con la stessa origine non richiedono nulla qui. Dichiara tutte le origini del browser che comunicano con l’API, separate da virgole.SERVER_URL
e FRONTEND_URL sono già considerate attendibili. Il server registra un avviso quando un browser
lo chiama da origine non dichiarata.
AUTH_COOKIE_SAME_SITE=none, che richiede HTTPS.
Con multi-workspace abilitato, non elencare ogni sottodominio workspace qui.
Invece, percorsi percorsi API (/graphql, /metadata, /rest, /auth/,
/client-config, /file) al back-end su ogni hostname di workspace, quindi ogni workspace
rimane la stessa origine — così funziona Twenty Cloud.