Docs do Nodaro
DocumentaçãoReferência de nósModelosAgentes de IA (MCP)DesenvolvedoresSelf-hostingPesquisa

Proxy reverso e HTTPS

Sirva o Nodaro self-hosted no seu domínio por HTTPS, com nginx ou Caddy na frente da porta 3000, defina PUBLIC_URL e CORS_ORIGIN e reinicie o app.

Um proxy reverso coloca o seu Nodaro self-hosted em um domínio real, com HTTPS. O contêiner do Nodaro já roda um servidor web, o Caddy, na porta 3000, então você adiciona um proxy que faz a terminação TLS na frente dessa porta e informa ao Nodaro o endereço público dele. Tanto o nginx quanto o Caddy funcionam.

O que a porta 3000 serve

O servidor web dentro do contêiner coloca tudo em uma única origem:

CaminhoO que responde
/O editor e os apps, como arquivos estáticos
/v1/*A API, que escuta na porta 9000 dentro do contêiner
/storage/*A mídia no MinIO incluído
/supabase/*O login e a API de dados incluídos
/config.jsAs configurações de tempo de execução que o navegador lê antes de o app iniciar

O seu proxy só precisa encaminhar todas as requisições para a porta 3000.

Opção A: nginx

Use esta opção quando você já roda o nginx ou outro proxy.

server {
  listen 443 ssl http2;
  server_name nodaro.example.com;
  ssl_certificate     /etc/letsencrypt/live/nodaro.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/nodaro.example.com/privkey.pem;

  client_max_body_size 100M;
  proxy_buffering off;          # important for SSE

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}
  • client_max_body_size 100M deixa os uploads passarem.
  • proxy_buffering off mantém os Server-Sent Events fluindo. O Nodaro transmite com eles a saída de texto e o progresso das execuções.

Opção B: Caddy no host

O Caddy obtém um certificado Let's Encrypt para você:

nodaro.example.com {
  reverse_proxy 127.0.0.1:3000 {
    flush_interval -1
  }
}

Abra as portas 80 e 443 e aponte os registros A ou AAAA do domínio para o host. flush_interval -1 mantém os Server-Sent Events fluindo.

Informar ao Nodaro o endereço público

Depois de qualquer uma das opções, defina estas variáveis no .env:

PUBLIC_URL=https://nodaro.example.com
CORS_ORIGIN=https://nodaro.example.com
# On the bundled MinIO, serve the media from the same domain:
R2_PUBLIC_URL=https://nodaro.example.com/storage/nodaro-assets

Depois, aplique-as:

docker compose -f docker-compose.community.yml up -d

Não é preciso recompilar. Na inicialização, o contêiner grava a URL pública, o endereço de login do navegador e a chave anon em /config.js, e o navegador lê esse arquivo antes de o app iniciar.

PUBLIC_URL é o endereço da instalação em todos os lugares: nos callbacks de login e de OAuth, nas URLs de mídia e na verificação de CORS. http://localhost:3000 e PUBLIC_URL são sempre permitidos como origens do navegador.

Servir mais de um nome de host

  • Origens extras. Liste-as em CORS_ORIGIN, separadas por vírgula, por exemplo CORS_ORIGIN=https://nodaro.example.com,http://192.168.1.20:3000.
  • Streams no nome de host do visitante. Quando a API compartilha a origem do app, como no contêiner padrão, defina PUBLIC_URL_SAME_ORIGIN=true. O /config.js passa, então, ao navegador o endereço de API / em vez de PUBLIC_URL, de modo que os streams ficam no nome de host que o visitante abriu. Só o valor exato true ativa esse comportamento. Deixe a variável sem definir quando a API realmente fica em outro host.

O arquivo do Compose não repassa PUBLIC_URL_SAME_ORIGIN do .env. Adicione-a em environment: do serviço nodaro. Veja Configuração.

Mudar a porta

Para servir o app em outra porta do host, mude o lado do host do mapeamento no docker-compose.community.yml, por exemplo "3001:3000". Depois, defina PUBLIC_URL de acordo, como http://localhost:3001.

Como os endereços dos clientes são registrados

O servidor web do contêiner só aceita cabeçalhos X-Forwarded-* de proxies em endereços privados: 127.0.0.1/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fd00::/8 e ::1.

  • Vindo de um proxy confiável, ele reduz o X-Forwarded-For a um único endereço de cliente: a entrada mais à direita que não seja, ela própria, um proxy confiável. Um endereço que um cliente escreveu no cabeçalho é ignorado.
  • Vindo de um proxy em um endereço público, ele substitui esses cabeçalhos pelos valores que ele mesmo observou.

Em uma intranet, a mesma regra ignora os endereços dos próprios usuários quando eles também são privados. Um cliente na LAN pode, então, escolher o endereço que a API registra, por exemplo para os limites de taxa.

Os editores incorporados no seu domínio

Editar no NodarCut, ou Editar em um resultado de vídeo de um app, abre o editor de vídeo hospedado em freecut.nodaro.ai, que só permite ser incorporado a partir de http://localhost:3000. Em qualquer outra origem, como um domínio ou um endereço da LAN, o navegador se recusa a incorporá-lo, e o painel explica o motivo. Abra uma issue no GitHub com a URL que você serve ou rode o seu próprio editor e defina FREECUT_URL. Veja Configuração.

O MCP precisa de um nome de host próprio

Os clientes MCP precisam alcançar a API na porta 9000 diretamente: o servidor web na porta 3000 recusa requisições MCP. Veja MCP.

Perguntas frequentes

Última atualização

Nesta página