# Rede privada

## Regras

- Serviços do **mesmo projeto** ficam numa rede própria e se resolvem pelo `name` do serviço (DNS interno). O serviço `api` é alcançável por `api`, na porta do serviço.
- Serviços de **projetos diferentes nunca se alcançam**.
- `visibility: "private"` = **sem rota pública**: o proxy não publica e o serviço não recebe `slug`. Só os outros serviços do projeto o alcançam.
- Use as variáveis automáticas em vez de montar a URL: `${{api.PRIVATE_URL}}` (`http://api:8080`) ou `${{api.PRIVATE_HOST}}` + `${{api.PORT}}`. Veja [Variáveis e referências](/conectados/variaveis-e-referencias/).
- **Bancos gerenciados não ficam na rede do projeto**: moram num nó de banco e são acessados pela URL das variáveis (`DATABASE_URL` etc.), com TLS. Veja [Conexão e referências](/bancos/conexao-e-referencias/).
- Tráfego do serviço para a internet segue as regras de [Isolamento](/seguranca/isolamento/).

## Criar um serviço privado

```bash
SUF=$(date +%s)-$RANDOM
H="Authorization: Bearer $NEBULAR_TOKEN"
P=$(curl -sS -X POST "$NEBULAR_API/v1/projects" -H "$H" -H "Content-Type: application/json" \
  -H "Idempotency-Key: rp-proj-$SUF" -d "{\"name\": \"rede-$SUF\"}" | jq -r .id)
curl -sS -X POST "$NEBULAR_API/v1/projects/$P/services" -H "$H" -H "Content-Type: application/json" \
  -H "Idempotency-Key: rp-api-$SUF" \
  -d '{"name": "api", "kind": "app", "visibility": "private", "port": 8080, "source": {"type": "image", "ref": "ghcr.io/org/api:1.0"}}'
```
```json
{"id": "01j9zkjxrzywfreswk9kf9r1z7", "name": "api", "kind": "app", "visibility": "private", "port": 8080}
```

No outro serviço do projeto, defina `API_URL` como `${{api.PRIVATE_URL}}` e chame `$API_URL/...` do código. Receita completa: [Front, back e banco](/conectados/front-back-db/).

## Se algo falhar

| Sintoma | O que fazer |
|---|---|
| O front não alcança o back | Confira o `port` do back (precisa bater com a porta em que o processo escuta), o `name` usado no hostname e se ambos estão no mesmo projeto. |
| `422 unresolved_reference` no deploy | O serviço referenciado não existe no projeto ou o nome está errado. |
| Quer acessar o serviço privado de fora | Não é possível; torne-o `public` (com `slug`) via `PATCH`, ou exponha só o front. |
