# Escala e recursos

Escopo: `projects:write` (alterar) e `deploy` (aplicar).

## O que se configura

| Campo (dentro de `resources`) | Padrão | Observação |
|---|---|---|
| `resources.memory_mb` | 512 | máximo definido pelo plano do time (`GET /v1/limits`) |
| `resources.cpus` | 0.5 | |

`memory_mb` e `cpus` ficam **dentro de `"resources"`**, nunca soltos no topo do corpo. Enviar `{"memory_mb": 1024}` é recusado com `400 invalid_request` (a mensagem diz o formato certo); a API não ignora campo desconhecido em silêncio.

O serviço roda com limite de memória, sem swap extra, de CPU e de processos. Estourar a memória encerra o processo do container. Réplicas não fazem parte deste ciclo; para escrever o app já preparado para elas, veja [App pronto para a Nebular e para escalar](/operacao/app-pronto-para-escalar/).

## Alterar

```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: esc-proj-$SUF" -d "{\"name\": \"esc-$SUF\"}" | jq -r .id)
S=$(curl -sS -X PATCH "$NEBULAR_API/v1/projects/$P/services/web" -H "$H" -H "Content-Type: application/json" \
  -d '{"visibility": "private", "source": {"type": "image", "ref": "ghcr.io/org/app:1.0"}}' | jq -r .id)
curl -sS -X PATCH "$NEBULAR_API/v1/projects/$P/services/$S" -H "$H" \
  -H "Content-Type: application/json" -d '{"resources": {"memory_mb": 1024, "cpus": 1}}'
```
```json
{"id": "01j9zkwf4q15w38y0taf680jvv", "name": "web", "kind": "app", "visibility": "private", "port": 3000}
```

A mudança vale a partir do próximo deploy do serviço: dispare um ([Deploys e status](/operacao/deploys-e-status/)).

## Se algo falhar

| Resposta | O que fazer |
|---|---|
| `400 invalid_request` | Valor fora do máximo do plano, campo desconhecido (ex.: `memory_mb` fora de `resources`) ou valor inválido: consulte `GET /v1/limits`, reduza e confira o formato `{"resources": {...}}`. |
| `403 forbidden` | Falta `projects:write`. |
| `404 not_found` | Projeto ou serviço inexistente ou fora do seu acesso. |
| `quota_exceeded` | Limite do time atingido: veja [Limites e cotas](/operacao/limites-e-cotas/). |
