Autor:
    Criação:2026-06-30Última atualização:2026-09-27

    Auto-hospedagem do Intlayer

    O Intlayer pode ser executado em sua própria infraestrutura, sem necessidade de conta no Intlayer Cloud. Três configurações estão disponíveis, todas gerenciadas pelo mesmo instalador (install.sh, install.ps1 no Windows ou npx intlayer init infra):

    SetupWhat it isPick it for
    Aplicativo desktopPainel nativo para macOS, Linux e WindowsUm cliente local, nada para hospedar
    Docker tudo-em-umPainel, API, MongoDB, Redis e MinIO em um único contêinerTestes e instalações pequenas em máquina única
    Docker ComposeUm contêiner por serviço, cada armazenamento de dados substituível por serviço gerenciadoProdução, escalabilidade, bancos de dados gerenciados

    Table of Contents

    Imagens e pacotes publicados

    ArtifactDocker HubGHCR mirrorContents
    All-in-one containerintlayer/cms-allghcr.io/aymericzip/intlayer/cms-allapp + backend + MongoDB 8 + Redis + MinIO + Chromium
    Dashboard (frontend)intlayer/cms-frontendghcr.io/aymericzip/intlayer/cms-frontendTanStack Start dashboard on Bun
    API (backend)intlayer/cms-backendghcr.io/aymericzip/intlayer/cms-backendFastify REST API on Bun + Chromium
    Desktop appGitHub releasesn/a.dmg (macOS), .deb / .rpm / .AppImage (Linux), .exe / .msi (Windows)

    Todas as três imagens são construídas a partir do mesmo docker/selfhost/Dockerfile e publicadas a cada versão. A stack do Compose também baixa as imagens oficiais mongo:8, redis:8-alpine e quay.io/minio/minio.

    Configuração

    O instalador pergunta qual configuração você deseja, verifica os pré-requisitos (oferecendo a instalação do Docker), grava o arquivo de ambiente com os segredos já gerados e baixa as imagens. Ele nunca inicia nada por conta própria: os modos Docker precisam primeiro de um serviço de e-mail, portanto ele termina imprimindo o comando a ser executado. Executá-lo novamente é seguro: um arquivo de ambiente existente nunca é sobrescrito, servindo também como caminho de atualização.

    O painel do Intlayer como aplicativo nativo, construído com Tauri. Faz login no Intlayer Cloud (https://app.intlayer.org), portanto não há nada para hospedar. É a escolha certa quando você prefere um cliente local em vez de uma aba do navegador.

    Instalação

    O instalador baixa o pacote para seu SO e CPU e, em seguida, o abre (macOS), instala (dpkg / rpm no Linux) ou executa o assistente de instalação (Windows). Você também pode baixá-lo manualmente na página de releases.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
    
    bash
    npx intlayer init infra --mode desktop
    

    Requisitos

    • Node.js: o aplicativo incorpora o servidor do painel e o inicia com o binário node da máquina. Instale-o a partir de nodejs.org se o aplicativo não iniciar.
    A versão desktop publicada comunica-se com o backend Intlayer Cloud. Apontá-la para um backend auto-hospedado requer a reconstrução do aplicativo com VITE_BACKEND_URL definido para sua API, consulte Limitações.

    Tudo é executado dentro do contêiner único intlayer/cms-all, supervisionado pelo s6-overlay, com cada armazenamento persistido em um único volume.

    plaintext
                    ┌─────────────────────────────┐
     browser ──────▶ │  app  (TanStack Start)  :3000│ ──┐
     (localhost)    └─────────────────────────────┘   │ VITE_BACKEND_URL (baked at build)
                    ┌─────────────────────────────┐   │
                    │  backend (Fastify/Bun)  :3100│ ◀─┘
                    └──────────────┬──────────────┘
              ┌──────────┬─────────┼──────────────┐
              ▼          ▼         ▼               ▼
          mongo:27017  redis:6379  minio:9000   Chromium
          /data/mongo  /data/redis /data/minio  (in-image)
          (1-node RS)              minio:9001
    
    ServiçoPorta(s) do hostFinalidade
    app3000Painel (interface do usuário do CMS)
    backend3100API REST (endpoint /health)
    mongointernoMongoDB 8, conjunto de réplicas de nó único rs0
    redisinternoFilas de tarefas (BullMQ) e cache
    minio9000 (S3), 9001 (console)Armazenamento de objetos compatível com S3 para avatares e capturas

    A ordem de inicialização é gerenciada pelas dependências s6 (mongod → início do replica-set, minio → criação do bucket, depois backend, depois app), e os serviços são reiniciados ao encerrar, para que a primeira inicialização se recupere sozinha.

    Pré-requisitos

    • Docker ≥ 24: o instalador oferece instalá-lo (via get.docker.com no Linux, Homebrew no macOS). No Windows, instale primeiro o Docker Desktop (backend WSL 2).
    • Portas 3000, 3100, 9000 e 9001 livres no host. MinIO 9000 deve permanecer acessível pelo navegador, que carrega ativos diretamente de S3_PUBLIC_URL.
    • Um serviço de envio de e-mails: uma chave de API do Resend ou um relay SMTP.

    1. Instalação

    Grava ./intlayer.env com BETTER_AUTH_SECRET e S3_SECRET_ACCESS_KEY gerados, faz algumas perguntas para preencher o restante, e baixa intlayer/cms-all:latest.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
    
    bash
    npx intlayer init infra --mode docker
    

    2. Responder às perguntas de configuração

    O instalador pergunta (pressione Enter para aceitar uma sugestão; cada resposta pode ser alterada no arquivo depois):

    • O domínio em que o Intlayer é servido. Deixe vazio para permanecer em localhost. Com um domínio como example.org, ele sugere https://cms.example.org para o painel, https://back.example.org para a API e https://s3.example.org/intlayer para o armazenamento de objetos, e grava DOMAIN, APP_URL, BACKEND_URL e S3_PUBLIC_URL. Consulte Domínio personalizado para os próximos passos.
    • O serviço de e-mail: Resend (chave de API) ou um relay SMTP (host, porta, credenciais), além do endereço do remetente. Esta etapa pode ser pulada e feita manualmente depois.
    • Uma chave de API da OpenAI opcional para os recursos de IA.

    Sem um terminal (por exemplo, quando o script é executado a partir da CI), as perguntas são puladas e apenas os segredos são gerados. Abra intlayer.env e preencha Resend ou SMTP manualmente (detalhes em Mailer global):

    intlayer.env
    # Option A: Resend
    RESEND_API_KEY=<your-resend-key>
    
    # Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
    MAIL_SMTP_HOST=smtp.example.com
    MAIL_SMTP_PORT=587
    MAIL_SMTP_USER=<user>
    MAIL_SMTP_PASSWORD=<password>
    MAIL_FROM=Intlayer <no-reply@example.com>
    

    3. Iniciar

    Este é o comando que o instalador imprime (com um domínio personalizado, ele é precedido pelo docker build que produz intlayer/cms-all:custom, consulte Domínio personalizado):

    sh
    docker run -d --name intlayer \
      --restart unless-stopped \
      -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
      -v intlayer-data:/data \
      --env-file ./intlayer.env \
      intlayer/cms-all:latest
    
    powershell
    docker run -d --name intlayer `
      --restart unless-stopped `
      -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
      -v intlayer-data:/data `
      --env-file ./intlayer.env `
      intlayer/cms-all:latest
    

    A CLI executa o instalador, que imprime o comando docker run … mostrado nas outras abas. Copie-o no terminal depois de configurar o serviço de e-mail.

    Abra http://localhost:3000 (ou a URL do seu painel) e siga a Configuração inicial. A primeira inicialização inicializa o conjunto de réplicas e o bucket, aguarde um minuto.

    Backup e atualização

    Todo o estado reside no volume intlayer-data (/data/mongo, /data/redis, /data/minio).

    sh
    # Backup (stop the container first so MongoDB's files are consistent)
    docker stop intlayer
    docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
    docker start intlayer
    
    # Restore
    docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
    

    Para atualizar, execute o instalador novamente (ele baixa a imagem mais recente e mantém intlayer.env), execute docker rm -f intlayer e execute novamente o comando de inicialização. Para usar um MongoDB gerenciado em vez do integrado, defina MONGODB_URI no intlayer.env.

    Um contêiner por serviço em uma rede Compose privada. O painel e a API usam as imagens publicadas intlayer/cms-frontend e intlayer/cms-backend; os armazenamentos usam as imagens oficiais mongo, redis e minio.

    plaintext
                    ┌───────────────────┐
     browser ──────▶ │  app        :3000 │ ── SSR ──▶ http://backend:3100
     (localhost)    └───────────────────┘
                    ┌───────────────────┐
     browser ──────▶ │  backend    :3100 │
     (localhost)    └─────────┬─────────┘
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
         mongo:27017     redis:6379      minio:9000 ◀── browser (assets)
         (1-node RS)                     minio:9001
    
    ServiçoImagemPapel
    appintlayer/cms-frontendPainel em :3000; aguarda o backend ficar saudável
    backendintlayer/cms-backendAPI em :3100 com Chromium; aguarda Mongo, Redis e o bucket MinIO
    mongomongo:8Conjunto de réplicas de nó único rs0, iniciado por seu próprio healthcheck
    redisredis:8-alpineFilas e cache, persistência append-only
    minioquay.io/minio/minioArmazenamento S3 em :9000, console em :9001
    minio-initquay.io/minio/mcExecução única: cria o bucket e sua política de download anônimo

    Os dados são mantidos nos volumes intlayer_mongo-data, intlayer_redis-data e intlayer_minio-data. As conexões dos serviços (MONGODB_URI, REDIS_URL, S3_ENDPOINT, a URL interna de backend usada pela renderização no servidor) são fixas no arquivo compose e têm precedência sobre o .env, que transporta apenas segredos e integrações opcionais.

    Pré-requisitos

    • Docker ≥ 24 com o plugin Compose: o instalador oferece instalá-lo no Linux e macOS. No Windows, instale primeiro o Docker Desktop (backend WSL 2).
    • Portas 3000, 3100, 9000 e 9001 livres no host.
    • Um serviço de envio de e-mails: uma chave de API do Resend ou um relay SMTP.

    1. Instalação

    Grava docker-compose.yml e um .env com os segredos gerados em ./intlayer/, faz as mesmas perguntas de configuração do modo tudo-em-um (domínio, serviço de e-mail, chave da OpenAI), e baixa as imagens.

    sh
    curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
    

    Or by hand:

    sh
    mkdir intlayer && cd intlayer
    curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
    curl -fsSL  https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
    # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
    

    In PowerShell:

    powershell
    $env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
    

    Or by hand:

    powershell
    mkdir intlayer; cd intlayer
    irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
    irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
    # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
    
    bash
    npx intlayer init infra --mode compose
    

    2. Configurar um serviço de e-mail

    Se você pulou a pergunta sobre o serviço de e-mail, preencha Resend ou SMTP em intlayer/.env, exatamente como para o contêiner tudo-em-um (consulte Mailer global).

    3. Iniciar

    sh
    cd intlayer && docker compose up -d
    

    Com um domínio personalizado, o instalador também baixa docker-compose.build.yml e o comando de inicialização passa a ser docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build (consulte Domínio personalizado).

    Abra http://localhost:3000 (ou a URL do seu painel) e siga a Configuração inicial.

    Bancos de dados gerenciados

    Exclua o serviço que está substituindo do arquivo compose (e sua entrada depends_on em backend), e substitua a variável correspondente:

    docker-compose.yml
    services:
      backend:
        environment:
          MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
          REDIS_URL: rediss://default:password@redis.example.com:6380
          S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
          S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
    

    S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY / S3_BUCKET_NAME mantêm seu significado com qualquer provedor compatível com S3.

    Escalabilidade

    app e backend são stateless (sem estado). Atrás de um balanceador de carga, docker compose up -d --scale backend=3 funciona após remover os mapeamentos fixos de portas do host e quando o proxy acessa os serviços pelo nome. As tarefas em segundo plano são coordenadas através do Redis (BullMQ), permitindo que várias réplicas do backend compartilhem a fila com segurança.

    Construindo a partir do código-fonte

    Uma substituição altera os dois serviços Intlayer de image: para build:. A partir de uma cópia do repositório:

    sh
    cd docker/selfhost
    docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
    

    Sem uma cópia, aponte o contexto de build para o próprio repositório definindo INTLAYER_BUILD_CONTEXT=https://github.com/aymericzip/intlayer.git#main em .env. Os build args VITE_* do painel seguem DOMAIN, APP_URL e BACKEND_URL do mesmo arquivo, e é assim que um domínio personalizado é aplicado.

    Backup e atualização

    sh
    # Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
    docker compose stop
    docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
    docker compose start
    
    # Upgrade, volumes are kept
    docker compose pull && docker compose up -d
    

    Configurações do instalador

    Sem --mode (ou INTLAYER_MODE), o instalador exibe um menu: desktop, docker (tudo-em-um) ou compose. Ele também lê algumas variáveis de ambiente. Como é passado via pipe para a shell, passe-as para a shell em vez do curl:

    sh
    curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
    
    powershell
    $env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
    
    VariableDefaultApplies toDescription
    INTLAYER_MODE(asked)alldesktop, docker or compose, same as --mode
    INTLAYER_DOWNLOAD_DIR~/DownloadsdesktopWhere the app installer is saved
    INTLAYER_IMAGEintlayer/cms-all:latestdockerAll-in-one image to pull
    INTLAYER_ENV_FILE./intlayer.envdockerWhere to write the environment file
    INTLAYER_CONTAINER_NAMEintlayerdockerContainer name
    INTLAYER_DATA_VOLUMEintlayer-datadockerNamed volume mounted at /data
    INTLAYER_APP_PORT3000dockerHost port for the dashboard
    INTLAYER_API_PORT3100dockerHost port for the API
    INTLAYER_S3_PORT9000dockerHost port for the MinIO S3 API
    INTLAYER_CONSOLE_PORT9001dockerHost port for the MinIO console
    INTLAYER_COMPOSE_DIR./intlayercomposeWhere docker-compose.yml and .env are written
    INTLAYER_SELFHOST_REFmainbothGit ref the compose file and env template are fetched from
    INTLAYER_BUILD_CONTEXT…/intlayer.git#mainbothBuild context used when a custom domain requires a rebuild
    INTLAYER_CUSTOM_IMAGEintlayer/cms-all:customdockerTag of the all-in-one image built for a custom domain
    As variáveis de porta alteram apenas o lado do host do mapeamento. As imagens publicadas possuem http://localhost:3000, http://localhost:3100 e http://localhost:9000 compiladas no pacote do painel, portanto mantenha os padrões a menos que construa suas próprias imagens, consulte Limitações.

    Configuração inicial

    Em uma nova instância (banco de dados vazio), a abertura do painel redireciona você para a página /init:

    1. Crie a primeira conta. Como a coleção de usuários está vazia, esta conta é automaticamente promovida a super admin.
    2. Um e-mail de verificação é enviado pelo Resend ou relay SMTP. A verificação do e-mail é obrigatória, por isso um serviço de e-mail deve ser configurado antes de iniciar.
    3. Clique no link no e-mail e depois faça login.

    Quando um administrador já existir, /init redireciona para a página de login padrão.

    Variáveis de ambiente

    Ambos os modos Docker leem o mesmo arquivo (intlayer.env para o contêiner, .env para Compose), gerado a partir de docker/selfhost/.env.template.

    Obrigatórias

    VariableExampleDescription
    BETTER_AUTH_SECRET(generated)32-byte secret for session signing
    S3_SECRET_ACCESS_KEY(generated)Secret for the bundled MinIO
    RESEND_API_KEY(your key)Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see Global mailer)

    Fixadas pela implantação

    Estas são definidas pela imagem (tudo-em-um) ou pelo arquivo compose, e só precisam ser sobrescritas para uma topologia fora do padrão. DOMAIN, APP_URL, BACKEND_URL e S3_PUBLIC_URL são a exceção: definidas no arquivo env, elas têm precedência em ambos os modos (consulte Domínio personalizado).

    VariableAll-in-oneDocker ComposeDescription
    PORT31003100Backend listening port
    APP_URLhttp://localhost:3000http://localhost:3000Public URL of the dashboard
    BACKEND_URLhttp://localhost:3100http://localhost:3100Public URL of the backend API
    DOMAINlocalhostlocalhostCookie domain
    SELF_HOSTEDtruetrueDisables the cloud-only API endpoints (billing, subscriptions, marketplace)
    MONGODB_URImongodb://127.0.0.1:27017/intlayer?replicaSet=rs0mongodb://mongo:27017/…MongoDB connection string, any mongodb:// or mongodb+srv:// cluster works
    REDIS_URLredis://127.0.0.1:6379redis://redis:6379Redis
    S3_ENDPOINThttp://127.0.0.1:9000http://minio:9000MinIO (server-to-server)
    S3_PUBLIC_URLhttp://localhost:9000/intlayerhttp://localhost:9000/intlayerPublic URL for browser asset loading
    S3_BUCKET_NAMEintlayerintlayerBucket name
    S3_ACCESS_KEY_IDintlayerintlayerMinIO access key

    O serviço Compose app recebe adicionalmente INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100: o navegador acessa a API em localhost:3100, mas a renderização do lado do servidor é executada dentro da rede Compose e deve usar o nome do serviço.

    Domínio personalizado

    O backend lê suas URLs públicas em tempo de execução, mas o painel as tem compiladas: as imagens publicadas intlayer/cms-frontend e intlayer/cms-all só funcionam em http://localhost:3000. Servir o Intlayer no seu próprio domínio exige, portanto, duas coisas, ambas preparadas pelo instalador quando você responde à pergunta do domínio:

    1. Quatro variáveis no arquivo env, lidas pelo backend (cookies, links de e-mail, callbacks OAuth, URLs de recursos) e usadas como build args pelo docker-compose.build.yml:

      intlayer.env
      DOMAIN=example.org                          # cookie domain, parent of the hosts below
      APP_URL=https://cms.example.org
      BACKEND_URL=https://back.example.org
      S3_PUBLIC_URL=https://s3.example.org/intlayer
      
    2. Uma imagem do painel compilada com essas URLs. O Docker a compila diretamente a partir do repositório, sem necessidade de cópia local:

      sh
      # Docker Compose: the override reads the build args from .env
      docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
      
      # All-in-one
      docker build -f docker/selfhost/Dockerfile \
        --build-arg VITE_DOMAIN=example.org \
        --build-arg VITE_SITE_URL=https://cms.example.org \
        --build-arg VITE_IDE_URL=https://cms.example.org \
        --build-arg VITE_BACKEND_URL=https://back.example.org \
        -t intlayer/cms-all:custom \
        https://github.com/aymericzip/intlayer.git#main
      

    Em seguida, coloque um reverse proxy com TLS na frente do contêiner: cms.example.org → porta 3000, back.example.org → 3100, s3.example.org → 9000. Os três hosts devem compartilhar o sufixo DOMAIN, já que o cookie de sessão é restrito a ele.

    Opcionais (as funcionalidades degradam graciosamente quando ausentes)

    VariableFeature
    OPENAI_API_KEYAI-assisted translation and content audit
    GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRETGitHub OAuth login
    GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETGoogle OAuth login
    GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRETGitLab OAuth login
    MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRETMicrosoft OAuth login

    Mailer global

    Cada e-mail transacional, incluindo e-mails fora da organização como redefinições de senha e links mágicos, passa por um dos dois transportes globais:

    • Resend, usando RESEND_API_KEY.
    • SMTP, usando as variáveis MAIL_SMTP_*. Assim que MAIL_SMTP_HOST for definido, o SMTP será usado e RESEND_API_KEY será ignorado.

    MAIL_PROVIDER só é necessário para forçar um transporte quando ambos estiverem configurados (por exemplo, MAIL_PROVIDER=resend para manter o Resend enquanto um host SMTP estiver presente).

    VariableExampleDescription
    MAIL_FROMIntlayer <no-reply@acme.com>Sender header for either transport. Accepts a bare address or Name <email>
    MAIL_SMTP_HOSTsmtp.acme.comSMTP host. Setting it selects the SMTP transport
    MAIL_SMTP_PORT587SMTP port (defaults to 587)
    MAIL_SMTP_SECUREfalseImplicit TLS. Set true for port 465
    MAIL_SMTP_USER(your user)SMTP username (optional; omit for unauthenticated relays)
    MAIL_SMTP_PASSWORD(your password)SMTP password
    MAIL_PROVIDERresendOptional override: smtp or resend. Leave unset to auto-select
    Precedência: o mailer da própria organização (configurado no painel da Organização) tem prioridade sobre o mailer global, que por sua vez tem prioridade sobre a chave padrão do Resend.

    Conectando seu projeto Intlayer

    Assim que a stack estiver em execução, aponte seu projeto para o backend e painel auto-hospedados em vez de intlayer.org.

    Configuração do projeto

    intlayer.config.ts
    import type { IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      editor: {
        clientId: process.env.INTLAYER_CLIENT_ID,
        clientSecret: process.env.INTLAYER_CLIENT_SECRET,
    
        /**
         * URL of the self-hosted CMS dashboard.
         * Default: https://app.intlayer.org
         */
        cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
    
        /**
         * URL of the self-hosted backend API.
         * Default: https://back.intlayer.org
         */
        backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
      },
    };
    
    export default config;
    

    Set the environment variables in your project's .env:

    sh
    INTLAYER_CMS_URL=http://localhost:3000
    INTLAYER_BACKEND_URL=http://localhost:3100
    INTLAYER_CLIENT_ID=<your-client-id>
    INTLAYER_CLIENT_SECRET=<your-client-secret>
    

    Crie credenciais de acesso em seu painel auto-hospedado em Projetos → Chaves de acesso em http://localhost:3000/projects.

    SDK @intlayer/api

    Ao usar o SDK @intlayer/api programaticamente, passe backendURL explicitamente:

    cms.ts
    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();
    

    Limitações

    • Um domínio personalizado exige recompilar. Todas as URLs VITE_* voltadas para o navegador são embutidas no painel no momento da compilação, e as imagens publicadas (e o aplicativo desktop) vêm com valores de localhost / Intlayer Cloud. Por padrão, o painel deve ser acessado em http://localhost:3000, a API em :3100 e o MinIO em :9000; remapear as portas do host tem o mesmo efeito. O instalador prepara tudo para uma recompilação a partir do repositório quando você informa um domínio (consulte Domínio personalizado), mas a compilação em si leva vários minutos. Apontar o aplicativo desktop para um backend auto-hospedado não é suportado.
    • O e-mail requer um serviço funcional. A configuração inicial impõe a verificação de e-mail, portanto RESEND_API_KEY ou um relay SMTP (MAIL_SMTP_*) deve ser configurado. Depois que o primeiro administrador faz login, cada organização também pode configurar seu próprio serviço SMTP ou Resend a partir do painel.
    • O aplicativo desktop precisa de Node.js na máquina para iniciar seu servidor embutido.
    • Sem assistente de documentação. O assistente de documentação com IA do intlayer.org (/api/ai/ask, /api/search/doc) depende de cerca de 130 MB de embeddings de documentação pré-calculados que as imagens auto-hospedadas não incluem; essas duas rotas não são registradas no modo auto-hospedado. Os recursos de IA próprios do painel (tradução, auditoria, autocompletar, chat) não são afetados e só precisam de OPENAI_API_KEY.