# Rollback

Escopo: `deploy`. O rollback é **por serviço**: volta ao deployment anterior do serviço, **com as variáveis resolvidas daquela versão** (não as atuais).

## 1. Escolher o deploy de destino

Liste os deploys do serviço e pegue o `id` de um que esteja `ready` e seja anterior ao problema.

```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: rb-proj-$SUF" -d "{\"name\": \"rb-$SUF\"}" | jq -r .id)
S=$(curl -sS -X POST "$NEBULAR_API/v1/projects/$P/services" -H "$H" -H "Content-Type: application/json" \
  -H "Idempotency-Key: rb-svc-$SUF" \
  -d '{"name": "app", "kind": "app", "visibility": "private", "source": {"type": "image", "ref": "ghcr.io/org/app:1.0"}}' | jq -r .id)
curl -sS "$NEBULAR_API/v1/projects/$P/services/$S/deployments" -H "$H"
```
```json
{"items": [], "next_cursor": null, "has_more": false}
```

Em um serviço com histórico, extraia os pares com `jq -r '.items[] | "\(.id)\t\(.status)"'`.

## 2. Reverter

```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" \
  -d "{\"name\": \"rb2-$SUF\"}" | jq -r .id)
S=$(curl -sS -X PATCH "$NEBULAR_API/v1/projects/$P/services/web" -H "$H" -H "Content-Type: application/json" \
  -d '{"source": {"type": "image", "ref": "ghcr.io/org/app:1.0"}}' | jq -r .id)
D=$(curl -sS -X POST "$NEBULAR_API/v1/projects/$P/services/$S/deployments" -H "$H" \
  -H "Content-Type: application/json" -d '{}' | jq -r .id)

# o destino do rollback precisa ter terminado com sucesso (ready)
delay=2
for i in $(seq 1 40); do
  st=$(curl -sS "$NEBULAR_API/v1/projects/$P/services/$S/deployments/$D" -H "$H" | jq -r .status)
  echo "tentativa $i: $st"
  case "$st" in
    ready) break ;;
    failed|blocked|canceled|superseded) echo "deploy terminou em $st" >&2; exit 1 ;;
  esac
  sleep "$delay"; delay=$(( delay * 2 > 30 ? 30 : delay * 2 ))
done
[ "$st" = ready ]

curl -sS -X POST "$NEBULAR_API/v1/projects/$P/services/$S/deployments/$D/rollback" \
  -H "$H" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: rollback-$D" -d '{}'
```
```json
{"id": "01j9zkbssrj776q2jrwy8cf13v", "status": "queued"}
```

Acompanhe o novo deploy com [polling](/operacao/deploys-e-status/) até `ready`.

## Se algo falhar

| Resposta | O que fazer |
|---|---|
| `403 forbidden` | Falta o escopo `deploy`. |
| `404 not_found` | Deploy, serviço ou projeto inexistente ou fora do seu acesso. |
| `409 nothing_to_rollback` | O deploy de destino não terminou com sucesso (`ready`). Escolha outro ou espere. |
| `409 deploy_in_progress` | Há um deploy em andamento; espere terminar e tente de novo. |
| deploy do rollback `failed` | Leia o [log de build](/operacao/logs/); se o problema era dado e não código, o rollback não o desfaz (migrations: veja [Migrações](/bancos/migracoes/)). |
