# Quickstart: Webhook VM112 → Ops ## Pré-requisitos - VM112 portal activo: `curl http://10.10.10.112:8090/api/onboarding/health` - VM122 ops activo: `curl http://10.10.10.122:8080/health` - Secret igual em ambos `.env` ## 1. Teste manual do receptor (sem portal) ```bash curl -sf -X POST "http://10.10.10.122:8080/api/v1/webhooks/onboard" \ -H "Content-Type: application/json" \ -H "X-Webhook-Secret: ligbox-ops-dev-secret" \ -d '{"event":"account.created","domain":"teste.manual.ligbox","session_id":"qs-001","data":{"email":"admin@teste.manual.ligbox","account_verified":true,"needs_review":false}}' curl -sf "http://10.10.10.122:8080/api/v1/desk/tickets" | python3 -m json.tool ``` ## 2. Teste idempotência Repetir o mesmo curl — deve aceitar mas não duplicar ticket (após implementação Phase A). ## 3. Teste auth failure ```bash curl -sf -X POST "http://10.10.10.122:8080/api/v1/webhooks/onboard" \ -H "Content-Type: application/json" \ -H "X-Webhook-Secret: wrong-secret" \ -d '{"event":"account.created","domain":"x.com","session_id":"x"}' # Esperado: HTTP 401 ``` ## 4. Teste E2E (após Phase B) 1. Abrir portal onboarding VM112 2. Completar criação de conta de teste 3. Verificar ticket em `http://10.10.10.122:8091` ou API tickets 4. Verificar activity log portal: entrada webhook OK ou warn ## 5. Teste Ops offline ```bash # Na VM122: docker-compose stop api # Completar onboarding no portal # Portal deve retornar sucesso ao cliente # Activity log: warn "ops webhook failed" # Restaurar: docker-compose start api ``` ## 6. Deploy checklist **VM122** (`/opt/ligbox-ops-platform/`): - [ ] `WEBHOOK_SECRET` definido - [ ] `docker-compose up -d --build api` - [ ] fail2ban active **VM112** (`/opt/ibytera-mail-portal/`): - [ ] `OPS_WEBHOOK_URL`, `OPS_WEBHOOK_SECRET`, `OPS_WEBHOOK_ENABLED=true` - [ ] Restart backend portal - [ ] Sem alteração Carbonio ## 7. Rotação secret (produção) ```bash NEW=$(openssl rand -hex 32) # Actualizar .env VM122 WEBHOOK_SECRET=$NEW # Actualizar .env VM112 OPS_WEBHOOK_SECRET=$NEW # Restart ambos no mesmo maintenance window ```