# Edições e perfis de superfície

> Compare as edições Community, Business e Cloud, mude um Nodaro self-hosted para a Business e restrinja a interface dele com um NODARO_SURFACE_PROFILE.

Source: https://nodaro.ai/pt-BR/docs/self-hosting/editions-and-profiles

O Nodaro tem três **edições** — Community, Business e Cloud —, feitas a partir do mesmo código e escolhidas com a variável `EDITION`. Na Business edition, um **perfil de superfície** restringe, então, o que a instalação mostra, sem recompilar. Ele pode ocultar partes da interface, remover nós e modelos, renomear o produto e restringir o login. Esta página trata dos dois.

## As três edições
| | Community | Business | Cloud |
| --- | --- | --- | --- |
| **Pode ser self-hosted** | Sim | Sim | Não, gerenciada pelo Nodaro |
| **Painel de administração** | Não | Sim | Sim |
| **Gerenciamento de usuários** | Não | Sim | Sim |
| **Registro de créditos** | Não | Não | Sim |
| **Cobrança** | Não | Não | Sim |
| **Preços de crédito definidos por administradores** | Não | Não | Sim |
| **Perfil de superfície** | Ignorado | Sim | Sim |

- **Community** (`EDITION=community`, o padrão) é a edição self-hosted gratuita. Qualquer pessoa que cria uma conta se torna um usuário comum.
- **Business** (`EDITION=business`) acrescenta o painel de administração e o gerenciamento de usuários. Ela continua self-hosted e continua sem cobrança.
- **Cloud** (`EDITION=cloud`) acrescenta créditos e cobrança. Ela é a base do app.nodaro.ai e não é feita para self-hosting.

O painel de administração e o gerenciamento de usuários da Business edition são recursos Enterprise. Você pode rodá-los para desenvolvimento e testes, mas usá-los em produção exige uma assinatura do Nodaro Enterprise. Veja [Licença](https://nodaro.ai/docs/self-hosting/license).

## Mudar uma instalação self-hosted para a Business
A API lê `EDITION` na inicialização. O editor no navegador lê a edição dele de `VITE_EDITION` quando a imagem é compilada. A imagem publicada é compilada como Community Edition, então uma instalação Business é compilada a partir do código-fonte.

Passar da Community para a Business não tem custo no banco de dados: o esquema é o mesmo.

### Mudar os dois valores no arquivo do Compose
No `docker-compose.community.yml`, no serviço `nodaro`, mude as duas linhas que dizem `community`:

```yaml
nodaro:
build:
args:
VITE_EDITION: business      # was: community
environment:
EDITION: business             # was: community
```

As duas linhas são fixas no arquivo do Compose, então definir `EDITION` no `.env` não tem efeito.

### Compilar e iniciar
```bash
docker compose -f docker-compose.community.yml build --no-cache nodaro
docker compose -f docker-compose.community.yml up -d
```

### Promover o seu primeiro administrador
Veja [Primeiro usuário e administrador](https://nodaro.ai/docs/self-hosting/first-admin).

Atualize uma instalação compilada a partir do código-fonte com `git pull` e `build`. O `docker compose pull` baixaria de novo a imagem Community publicada.

A build recusa um `VITE_EDITION` vazio ou desconhecido. Sem essa verificação, um valor não definido compilaria sem erros e voltaria a `community`, e uma imagem Business sairia sem o painel de administração. O arquivo do Compose passa o valor para você. Um `docker build` escrito à mão precisa de `--build-arg VITE_EDITION=community`, `business` ou `cloud`.

### O que é fixado na build e o que não é
Três configurações do navegador **não** são fixadas na build: o endereço da API, o endereço de login do navegador e a chave anon. Na inicialização, o contêiner as grava em `/config.js` a partir de `PUBLIC_URL`, `FRONTEND_SUPABASE_URL` e `SUPABASE_ANON_KEY`, e o navegador lê esse arquivo antes de o app iniciar. Assim, a imagem publicada serve qualquer porta ou domínio depois de uma reinicialização. Os argumentos de build `VITE_*` são só alternativas para valores de tempo de execução não definidos.

Outras configurações do navegador fixadas na build:

| Argumento de build | O que faz | Padrão |
| --- | --- | --- |
| `VITE_STUDIO_URL` | O endereço do app Studio, para os links **Abrir no Studio** | `https://studio.nodaro.ai` |
| `VITE_PERSON_URL` | O endereço do app Person, para o cartão **Abrir Person** da tela inicial | `https://person.nodaro.ai` |

## Perfis de superfície
`NODARO_SURFACE_PROFILE` restringe a interface de uma instalação **Business** ou **Cloud** sem recompilar. A Community Edition ignora essa variável e sempre mostra a interface completa.

- **Formato.** JSON inline, ou `@/path/to/profile.json` para ler um arquivo. Para usar um arquivo na stack do Compose, monte-o no contêiner e informe o caminho dele dentro do contêiner.
- **Só restringe.** Um perfil pode ocultar e remover. Ele nunca ativa algo que a edição desativa.
- **Todos os campos são opcionais.** Uma lista vazia significa “manter o padrão”. Sem a variável, a instalação mostra a interface completa.
- **Erros.** Um campo malformado volta ao padrão desse campo, com um aviso no log. Um perfil que não carrega de jeito nenhum impede a inicialização de uma instalação Business ou Cloud, com `[surface-profile] FATAL … Refusing to boot a narrowing deployment mainline-open`. Isso acontece com um arquivo ilegível, um JSON inválido ou um valor que falha na validação como um todo. Uma instalação com restrições nunca deve subir mostrando tudo.
- **Aplicar.** Reinicie o app. O perfil chega ao navegador pelo `/config.js`.

### Exemplo
```bash
NODARO_SURFACE_PROFILE={"nav":{"hide":["gallery"]},"brand":{"productName":"Studio"},"outputs":{"allowPublic":false},"voice":{"allowedGenders":["male"]}}
```

Isso oculta a galeria, renomeia o produto para Studio, mantém todas as saídas privadas e oferece só vozes masculinas.

### Campos
| Campo | O que faz |
| --- | --- |
| `nav.hide` | Oculta itens da barra lateral. Valores: `gallery`, `explore`, `pricing`, `templates`, `apps`, `community`, `integrations`. |
| `dashboard.tabs` | Uma única lista de permissões ordenada das seções da tela inicial. Veja [Seções da tela inicial](#home-screen-sections). |
| `nodes.deny`, `models.deny` | Tipos de nó e IDs de modelo a remover em todos os lugares: no menu **Adicionar nó**, em `GET /v1/nodes`, em `GET /v1/models`, nas ferramentas MCP e na hora da execução. Um nó removido falha com `node_not_available`. |
| `nodes.allow`, `models.allow` | Listas de permissões. Quando uma lista não está vazia, só os tipos de nó ou os IDs de modelo listados são oferecidos, e `deny` ainda retira itens deles. Veja [Listas de permissões](#allow-lists). |
| `auth.methods`, `auth.ssoLabel` | Os métodos de login a oferecer: `email`, `google`, `sso`. `sso` é descartado, a menos que `auth.ssoLabel` esteja definido. Veja [Métodos de login](#sign-in-methods). |
| `siblings.apps` | Substitui os links do Nodaro no seletor de produtos: `[{ "label": "...", "url": "..." }]`. |
| `brand.productName` | Substitui o logotipo tipográfico e o título da página. Sem ele, o título da página fica como veio. |
| `brand.wordmark` | Texto curto mostrado ao lado do seu próprio logo no cabeçalho da barra lateral, para uma instalação que tem os próprios arquivos de logo. Por exemplo, o nome de produto `Acme Studio` com o logotipo tipográfico `Studio`. |
| `brand.description` | Substitui a meta description da página. |
| `brand.platformLinks` | `false` oculta os links da própria plataforma para avisos legais, documentação, notas de versão e promoção de produtos. Os links que você define em `siblings.apps` continuam. |
| `locale.default` | O idioma em que um novo visitante começa. |
| `locale.picker` | `false` oculta o seletor de idioma. O padrão é `true`. |
| `outputs.allowPublic` | `false` torna todas as saídas privadas, seja qual for a escolha do usuário. |
| `voice.allowedGenders` | Restringe as vozes a qualquer subconjunto de `male`, `female` e `neutral`. Vazio significa todos os gêneros. Veja [Gêneros de voz](#voice-genders). |
| `features.hide` | Desativa recursos inteiros: `copilot` remove o Workflow Copilot, e `presentation` oculta a aba **Apresentar** do canvas. |
| `catalogs` | `{ "required": true, "factoryPresets": false }` para instalações que precisam de conteúdo revisado nos seletores. Veja [Catálogos de seletores](#picker-catalogs). |

Os logos e o favicon não fazem parte do perfil. Substitua-os por uma camada de arquivos estáticos na sua imagem Docker.

### Seções da tela inicial
`dashboard.tabs` é uma única lista de permissões ordenada. O conjunto completo de chaves é `workflows`, `projects`, `apps`, `miniapps`, `templates`, `tutorials`, `statistics`, `gallery`, `studio` e `mcp`.

- **`workflows`, `projects`, `studio`** — as listas do filtro de espaço de trabalho da aba **Continuar**, na ordem da sua lista. Se a sua lista não citar nenhuma das três, as três aparecem, para que a lista principal nunca fique vazia.
- **`apps`** — a faixa de apps do Nodaro na aba **Continuar**.
- **`templates`** — a linha “Comece com um template” da aba **Explorar** e o item Templates da barra lateral.
- **`tutorials`** — os tutoriais da seção **Suba de nível** na aba **Explorar** e o item Tutoriais da barra lateral. Sem `templates` e `tutorials`, a aba Explorar não aparece.
- **`miniapps`** — o item Miniapps da barra lateral.
- **`statistics`** — o resumo de estatísticas da página Execuções.
- **`mcp`** — a quarta lista de “Continue de onde parou”: os workflows que um cliente MCP criou no projeto automático `mcp` dele.

Liste todas as seções que você quer manter. Por exemplo, `["workflows","projects","statistics","tutorials"]` mantém as listas de workflows e de projetos, os tutoriais e as estatísticas. Essa lista remove a lista do Studio, a faixa de apps, a linha de templates e os itens Templates e Miniapps da barra lateral. `nav.hide` continua valendo por cima disso.

### Listas de permissões
Uma lista de permissões é o formato mais seguro para uma instalação com curadoria. Um nó ou um modelo novo fica, então, indisponível até você listá-lo, em vez de aparecer porque você não o bloqueou.

- Os nós utilitários, como `sticky-note` e `preview`, nunca são removidos por ficarem de fora de uma lista de permissões. Só um `deny` explícito os remove.
- Os administradores podem alterar a disponibilidade de nós e modelos em tempo de execução, no painel de administração. Uma configuração de tempo de execução salva substitui as listas do perfil até ser redefinida para o estado de fábrica.
- Um nó que um administrador desativa no painel de administração continua utilizável pelos administradores. Um nó removido pelo perfil também é removido para os administradores. Mas um administrador que reativa no painel de administração um nó removido pelo perfil o libera para todos, então dê a função de administrador só a pessoas em quem você confia para isso.
- Um modelo desativado também fica desativado para os administradores.
- Uma execução é verificada como o usuário em nome de quem ela roda. Uma execução de app ou de apresentação roda como a pessoa que a executa. Uma execução agendada ou disparada por webhook roda como o proprietário do workflow, e um token de API ou um app conectado age como o proprietário dele. Quando esse proprietário é um administrador, a execução pode usar um nó oculto para os usuários, então trate com cuidado a URL de webhook de um workflow assim.
- Um app, um componente ou um template que contém um nó oculto não pode ser publicado: a requisição falha com `node_not_available`.
- Uma mudança de função chega a essas verificações em cerca de 5 minutos.

### Métodos de login
`auth.methods` restringe os métodos de login da página de login, entre `email`, `google` e `sso`. Mantenha `sso` na lista só junto com `auth.ssoLabel`, o texto do botão de SSO.

Uma lista que cita **só** `sso` também ativa uma regra no servidor: toda conta logada precisa ter sido criada ou vinculada por login único (SSO). Qualquer outra sessão é recusada na primeira chamada à API com `403 sso_required`, então uma conta registrada diretamente no serviço de login não pode usar a instalação. Adicionar `email` à lista desativa a regra. Veja [Login único (SSO)](https://nodaro.ai/docs/self-hosting/sso).

### Gêneros de voz
`voice.allowedGenders` é aplicado no servidor:

- A lista de vozes e a biblioteca compartilhada de vozes mostram só vozes dos gêneros permitidos.
- Uma requisição com uma voz nativa de outro gênero é recusada com `voice_not_available`.
- Toda voz padrão e toda voz alternativa passam a ser a primeira voz de um gênero permitido.
- O editor oculta as tags de gênero vocal dos outros gêneros nos nós do Suno.

O gênero da saída dos nós de criação de voz não pode ser conhecido com antecedência. Para removê-los, adicione `"nodes":{"deny":["voice-design","voice-remix"]}`.

### Catálogos de seletores
Para instalações que só podem oferecer conteúdo revisado nos seletores, defina `"catalogs":{"required":true,"factoryPresets":false}`.

- Com `required: true`, o editor só oferece opções nos seletores depois de receber do servidor o catálogo completo com curadoria, e não oferece nenhuma se essa requisição falhar. Os nós novos e as redefinições de fábrica usam só valores oferecidos.
- Com `factoryPresets: false`, as predefinições incluídas ficam ocultas no editor e na API. As predefinições dos próprios usuários continuam.
- O servidor também rejeita opções excluídas do catálogo em workflows importados ou salvos anteriormente.

## Frequently asked questions

### Como mudo um Nodaro self-hosted da Community para a Business?

Defina EDITION como business e o argumento de build VITE_EDITION como business no serviço nodaro do docker-compose.community.yml. Depois, compile a imagem a partir do código-fonte e inicie-a. O banco de dados não precisa de nenhuma alteração.

### Por que preciso recompilar a imagem para mudar a edição?

O editor lê a edição dele quando a imagem é compilada, e a imagem publicada é compilada como Community Edition. A API lê EDITION na inicialização, mas o app no navegador só mostra o painel de administração em uma build Business.

### O que é um perfil de superfície?

Uma configuração em JSON, NODARO_SURFACE_PROFILE, que restringe o que uma instalação Business ou Cloud mostra, sem recompilar. Ela pode ocultar itens da barra lateral e seções da tela inicial, remover nós e modelos, renomear o produto, restringir os métodos de login e forçar as saídas a serem privadas.

### A Community Edition lê NODARO_SURFACE_PROFILE?

Não. A Community Edition ignora a variável e sempre mostra a interface completa. Defina EDITION=business para usar um perfil de superfície.

### Um perfil de superfície pode ativar um recurso que a edição não tem?

Não. Um perfil só pode restringir. Ele nunca ativa algo que a edição desativa.
