# 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.

Source: https://nodaro.ai/pt-BR/docs/self-hosting/reverse-proxy

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:

| Caminho | O 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.js` | As 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.

```nginx
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ê:

```text
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`:

```bash
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:

```bash
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](https://nodaro.ai/docs/self-hosting/configuration#how-to-set-a-variable).

## 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](https://nodaro.ai/docs/self-hosting/configuration#video-and-audio-editors).

## 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](https://nodaro.ai/docs/self-hosting/mcp).

## Frequently asked questions

### O contêiner do Nodaro já inclui um servidor web?

Sim. O contêiner roda o Caddy na porta 3000. Ele serve o editor, encaminha /v1 para a API na porta 9000 e serve a mídia e o login incluído na mesma origem. Para HTTPS, coloque na frente da porta 3000 um proxy que faça a terminação TLS.

### O que preciso mudar depois de colocar o Nodaro atrás de um domínio?

Defina PUBLIC_URL e CORS_ORIGIN com o seu endereço https e, no MinIO incluído, defina R2_PUBLIC_URL como https://your-domain/storage/nodaro-assets. Depois, rode docker compose up -d. Não é preciso recompilar.

### Por que o meu proxy nginx quebra a saída em streaming?

Por padrão, o nginx armazena as respostas em buffer, o que retém os Server-Sent Events. Defina proxy_buffering off. Com o Caddy no host, defina flush_interval -1 no bloco reverse_proxy.

### O Nodaro pode responder em mais de um nome de host?

Sim. Liste as origens extras em CORS_ORIGIN, separadas por vírgula. Se a API compartilha a origem do app, como no contêiner padrão, defina também PUBLIC_URL_SAME_ORIGIN=true para que os streams fiquem no nome de host que o visitante usa.
