Pose una domanda e ottieni un riassunto del documento facendo riferimento a questa pagina e al provider AI di tua scelta
Questo documento non è aggiornato, la versione base è stata aggiornata il 2 luglio 2026.
Vai alla documentazione in ingleseCronologia delle versioni
Il contenuto di questa pagina è stato tradotto con un'IA.
Vedi l'ultima versione del contenuto originale in ingleseIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Self-Hosting Intlayer
Intlayer può essere eseguito interamente sulla tua infrastruttura — non è richiesto alcun account Intlayer Cloud. Un singolo comando avvia uno stack pronto per la produzione:
Copiare il codice nella clipboard
curl -fsSL https://intlayer.org/install.sh | shL'installer scarica un docker-compose.yml e un .env, genera automaticamente i segreti richiesti e avvia tutti i container con docker compose up -d.
Indice dei Contenuti
Architettura
Copiare il codice nella clipboard
┌─────────────────────────────┐ browser ──────▶ │ app (TanStack Start) :3000│ ──┐ └─────────────────────────────┘ │ VITE_BACKEND_URL ┌─────────────────────────────┐ │ │ backend (Fastify/Bun) :3100│ ◀─┘ └──────────────┬──────────────┘ ┌──────────┬─────────┼──────────┬───────────┐ ▼ ▼ ▼ ▼ ▼ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium (1-node RS) (S3 API) (SMTP) (in-image) minio:9001 mailpit:8025 (console) (web UI)Chromium (utilizzato per la generazione di screenshot con Puppeteer) è incluso nell'immagine del backend — non è necessario un container separato.
Prerequisiti
- Docker ≥ 24 e Docker Compose ≥ v2. Se uno dei due manca, l'installer stampa il link di installazione ed esce.
- Porte
3000,3100,8025,9000e9001disponibili sull'host. - Un host Linux o macOS (o WSL2 su Windows).
Avvio rapido
Scarica ed esegui l'immagine pubblicata, fornendo le tue credenziali e i segreti di MongoDB Atlas:
Copiare il codice nella clipboard
docker run -d --name intlayer \ -p 3000:3000 \ -p 3100:3100 \ -p 9000:9000 \ -p 9001:9001 \ -v intlayer-data:/data \ -e DB_ID="<atlas-user>" \ -e DB_MDP="<atlas-password>" \ -e DB_CLUSTER="<cluster>.xxxxx.mongodb.net" \ -e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \ -e S3_SECRET_ACCESS_KEY="$(openssl rand -hex 16)" \ -e RESEND_API_KEY="<your-resend-key>" \ aymericzip/intlayer-selfhostQuindi apri http://localhost:3000.
La dashboard è servita su localhost. Vedi Limitazioni — i domini personalizzati non sono supportati dall'immagine pubblicata.
Avvio rapido
Copiare il codice nella clipboard
curl -fsSL https://intlayer.org/install.sh | shCosa fa l'installer:
- Verifica che
dockeredocker composesiano presenti. - Scarica
docker-compose.ymle.env.examplein./intlayer/. - Se non esiste un
.env, copia l'esempio e genera segreti casuali perBETTER_AUTH_SECRET,S3_ACCESS_KEY_IDeS3_SECRET_ACCESS_KEYtramiteopenssl rand. - Esegue
docker compose pull+docker compose up -d. - Stampa gli URL: dashboard
:3000, API:3100, interfaccia utente email:8025, console MinIO:9001.
Dopo che lo stack è attivo, apri http://localhost:3000 e crea il tuo primo account.
Servizi
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Servizio | Immagine | Porta/e host | Scopo |
|---|---|---|---|
| app | built from apps/app/Dockerfile | 3000 | Dashboard TanStack Start (UI del CMS) |
| backend | built from apps/backend/Dockerfile | 3100 | API REST Fastify (endpoint /health) |
| mongo | mongo:7 | internal | Replica set a nodo singolo (rs0) |
| redis | redis:7-alpine | internal | Code di lavoro (BullMQ) e caching (ioredis) |
| minio | minio/minio | 9000 (S3), 9001 (console) | Storage di oggetti compatibile con S3 per avatar e screenshot |
| mailpit | axllent/mailpit | 1025 (SMTP), 8025 (web UI) | Sink di email transazionali locale |
Le porte interne (mongo, redis) non sono esposte all'host per impostazione predefinita.
La porta9000di MinIO deve essere raggiungibile dal browser perché gli asset caricati (avatar, screenshot) vengono caricati direttamente daS3_PUBLIC_URL=http://localhost:9000/intlayer.
Variabili d'ambiente
Obbligatorio
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Variabile | Esempio | Descrizione |
|---|---|---|
DB_ID | intlayer | Utente MongoDB Atlas |
DB_MDP | (la tua password) | Password MongoDB Atlas |
DB_CLUSTER | cluster0.xxxxx.mongodb.net | Host del cluster MongoDB Atlas (utilizzato nell'URI mongodb+srv://) |
BETTER_AUTH_SECRET | (generato) | Secret a 32 byte per la firma delle sessioni |
S3_SECRET_ACCESS_KEY | (generato) | Secret per il MinIO bundle |
RESEND_API_KEY | (la tua chiave) | Email transazionale via Resend. Obbligatorio per la configurazione iniziale a meno che non configuri un mailer SMTP globale (vedi Mailer globale) |
Obbligatorie (generate automaticamente o richieste)
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Variabile | Esempio | Descrizione |
|---|---|---|
NODE_ENV | production | Ambiente di runtime |
PORT | 3100 | Porta di ascolto del backend |
BACKEND_URL | http://localhost:3100 | URL pubblico dell'API del backend |
APP_URL | http://localhost:3000 | URL pubblico della dashboard |
DOMAIN | localhost | Dominio del cookie |
MONGODB_URI | mongodb://mongo:27017/intlayer?replicaSet=rs0 | URI di connessione completo di MongoDB |
REDIS_URL | redis://redis:6379 | URL di connessione di Redis |
BETTER_AUTH_SECRET | (generated) | Segreto di 32 byte per la firma della sessione |
MAIL_PROVIDER | smtp | Trasporto email: smtp o resend |
MAIL_SMTP_HOST | mailpit | Hostname SMTP (nome del container Mailpit) |
MAIL_SMTP_PORT | 1025 | Porta SMTP |
MAIL_FROM | Intlayer <no-reply@localhost> | Indirizzo del mittente |
S3_ENDPOINT | http://minio:9000 | Endpoint compatibile con S3 |
S3_PUBLIC_URL | http://localhost:9000/intlayer | URL pubblico per il caricamento degli asset del browser |
S3_BUCKET_NAME | intlayer | Nome del bucket |
S3_ACCESS_KEY_ID | (generated) | Chiave di accesso MinIO |
S3_SECRET_ACCESS_KEY | (generated) | Chiave segreta MinIO |
VITE_BACKEND_URL | http://localhost:3100 | URL del backend integrato nella dashboard al momento della compilazione |
VITE_DOMAIN | localhost | Dominio integrato nella dashboard al momento della compilazione |
Opzionali (le funzionalità degradano elegantemente se assenti)
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Variabile | Funzionalità |
|---|---|
OPENAI_API_KEY | Traduzione assistita da AI e audit del contenuto |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_* | Gestione della fatturazione e degli abbonamenti |
RESEND_API_KEY | Email transazionali tramite Resend (sostituisce Mailpit quando impostato) |
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET | Accesso OAuth di GitHub |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Accesso OAuth di Google |
GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET | Accesso OAuth di GitLab |
MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET | Accesso OAuth di Microsoft |
LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET | Accesso OAuth di LinkedIn |
ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET | Accesso OAuth di Atlassian |
Mailer globale
Per impostazione predefinita, tutti i messaggi email transazionali vengono inviati tramite Resend utilizzando RESEND_API_KEY. I deploy self-hosted possono invece instradare ogni email — incluse le email non organizzative come i reset delle password e i magic link — attraverso un mailer globale configurato con variabili di ambiente.
Imposta MAIL_PROVIDER per attivarlo. Quando non impostato, viene utilizzato il mailer predefinito di Resend.
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Variabile | Esempio | Descrizione |
|---|---|---|
MAIL_PROVIDER | smtp | Trasporto globale: smtp o resend. Lascia non impostato per usare i default |
MAIL_FROM | Intlayer <no-reply@acme.com> | Intestazione del mittente. Accetta un indirizzo bare o il formato Name <email> |
MAIL_SMTP_HOST | smtp.acme.com | Host SMTP (obbligatorio quando MAIL_PROVIDER=smtp) |
MAIL_SMTP_PORT | 587 | Porta SMTP (per impostazione predefinita 587) |
MAIL_SMTP_SECURE | false | TLS implicito. Imposta true per la porta 465 |
MAIL_SMTP_USER | (il tuo utente) | Nome utente SMTP (opzionale; ometti per relay non autenticati) |
MAIL_SMTP_PASSWORD | (la tua password) | Password SMTP |
Precedenza: il mailer personalizzato di un'organizzazione (configurato dal dashboard Organization) ha priorità rispetto al mailer globale, che a sua volta ha priorità rispetto alla chiave Resend predefinita.
Collegamento del tuo progetto Intlayer
Una volta che lo stack è in esecuzione, punta il tuo progetto al backend e alla dashboard self-hosted invece di intlayer.org.
Configurazione del progetto
Copiare il codice nella clipboard
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* URL della dashboard CMS self-hosted.
* Predefinito: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
/**
* URL dell'API del backend self-hosted.
* Predefinito: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
},
};
export default config;Imposta le variabili d'ambiente nel .env del tuo progetto:
Copiare il codice nella clipboard
INTLAYER_CMS_URL=http://localhost:3000INTLAYER_BACKEND_URL=http://localhost:3100INTLAYER_CLIENT_ID=<your-client-id>INTLAYER_CLIENT_SECRET=<your-client-secret>Crea le credenziali di accesso nella tua dashboard self-hosted sotto Progetti → Chiavi di accesso all'indirizzo http://localhost:3000/projects.
SDK @intlayer/api
Quando si utilizza l'SDK @intlayer/api in modo programmatico, passa backendURL esplicitamente:
Copiare il codice nella clipboard
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";const cms = createIntlayerCMS({ editor: { clientId: process.env.INTLAYER_CLIENT_ID, clientSecret: process.env.INTLAYER_CLIENT_SECRET, backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100 },});const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();Aggiornamento
Eseguire nuovamente l'installer su un'implementazione esistente esegue un aggiornamento rolling:
Copiare il codice nella clipboard
curl -fsSL https://intlayer.org/install.sh | shQuesto scarica le immagini più recenti e riavvia i container con docker compose pull && docker compose up -d. I volumi esistenti (mongo-data, redis-data, minio-data) vengono preservati — nessuna perdita di dati.
Per aggiornare manualmente dalla directory ./intlayer/:
Copiare il codice nella clipboard
docker compose pulldocker compose up -dBackup e ripristino
Tutti i dati persistenti risiedono in tre volumi Docker nominati.
Backup
Copiare il codice nella clipboard
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/mongo-data.tar.gz /datadocker run --rm \ -v intlayer_redis-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/redis-data.tar.gz /datadocker run --rm \ -v intlayer_minio-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/minio-data.tar.gz /dataRipristino
Copiare il codice nella clipboard
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar xzf /backup/mongo-data.tar.gz -C /# Ripetere per redis-data e minio-dataLimitazioni
- MongoDB deve essere esterno (Atlas). Il backend si connette solo su
mongodb+srv://(costruito daDB_ID/DB_MDP/DB_CLUSTER), quindi un semplicemongodb://host:27017— incluso ilmongodincluso nel container — non può essere utilizzato. Fornire un cluster MongoDB Atlas. - Nessun dominio personalizzato. Tutti gli URL
VITE_*rivolti al browser sono inline nell'app al momento della compilazione, e l'immagine pubblicata contiene valorilocalhost. Il dashboard deve essere accessibile suhttp://localhost:3000; servarlo su un dominio pubblico richiederebbe di ricompilare l'immagine con gli URL di destinazione incorporati e non è supportato out of the box. - Email richiede un mailer funzionante. La configurazione al primo avvio applica la verifica email, quindi
RESEND_API_KEYo un mailer SMTP globale (MAIL_PROVIDER=smtp+MAIL_SMTP_*) deve essere configurato. Dopo che il primo amministratore ha effettuato l'accesso, ogni organizzazione può anche configurare il proprio mailer SMTP o Resend dal dashboard.
Risoluzione dei problemi
Il backend si riavvia in loop al primo avvio
MongoDB e Redis devono essere sani prima che il backend si avvii. Il file compose utilizza depends_on con condition: service_healthy. Se vedi ripetuti riavvii del backend, verifica che i controlli di integrità di mongo e redis passino:
Copiare il codice nella clipboard
docker compose psdocker compose logs mongodocker compose logs redisLa dashboard non riesce a raggiungere l'API
Verifica che VITE_BACKEND_URL corrisponda all'URL dove il backend è raggiungibile dal browser (non dalla rete Docker). Se hai cambiato la porta del backend o aggiunto un reverse proxy, ricostruisci l'immagine della dashboard:
Copiare il codice nella clipboard
docker compose build appdocker compose up -d appBucket MinIO mancante
Se il servizio one-shot minio-init non è stato eseguito (o è stato eseguito prima che MinIO fosse pronto), crea il bucket manualmente:
Copiare il codice nella clipboard
docker compose run --rm minio-init