ligbox-ops-platform/specs/037-dns-multi-cloudflare-orchestration/project-email-identity.md
Ligbox Spec Hub 038fb8f7ce feat(dns): Spec 037 DNS Viewer — Desk, Console e patches Wizard V4
Entrega read-only de apontamentos DNS (Cloudflare, OpenPanel BIND, público)
no Desk e Console /admin/dominio, com spec, scripts de rollback e patches
VM112 para painel lateral no passo DNS do onboarding (deploy wizard pendente).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-25 16:36:25 +00:00

118 lines
4.5 KiB
Markdown

# Anexo 037-C — E-mail projeto `proj_*@ligbox.com.br` (agente Ligbox)
**Parent:** [spec.md](./spec.md) · [037-B client-cf-account-lifecycle.md](./client-cf-account-lifecycle.md)
**Solicitado por:** Roger · **2026-06-22**
**Status:** 📋 Regra definida — implementação Fase 2
---
## Regra (Roger)
O **agente Ligbox** deve, para cada cliente em onboarding Cloudflare:
1. **Criar caixa real** `proj_{id}@ligbox.com.br` no Carbonio (domínio `ligbox.com.br`).
2. **Gerar senha** segura e **entregar ao cliente** (uma vez, no wizard / e-mail de boas-vindas).
3. **Referenciar este e-mail em todos os processos** ligados à nova conta e à administração dos apontamentos de email da plataforma.
Não é alias passivo — é **identidade operacional do projeto** até handoff ao `admin@{dominio_cliente}`.
---
## Ordem no fluxo (antes de CF + DNS cliente)
```mermaid
flowchart LR
A[validate-domain] --> B[provision-project-email]
B --> C[Entrega senha ao cliente]
C --> D[provision-client-account CF]
D --> E[provision-zone + apply DNS]
E --> F[account/create admin@cliente]
F --> G[handoff CF gestor]
```
| Passo | Acção | E-mail usado |
|-------|--------|--------------|
| 1 | `POST /project/provision-email` | Cria `proj_005@ligbox.com.br` |
| 2 | Resposta wizard | Senha + credenciais webmail `mail.ligbox.com.br` |
| 3 | `POST /dns/cloudflare/provision-client-account` | Membro CF = `proj_005@ligbox.com.br` |
| 4 | `POST /dns/cloudflare/apply` | `activity_log` + webhook com `ligbox_project_email` |
| 5 | `POST /account/create` | `admin@cliente.com.br` (domínio cliente) — **distinto** do proj |
| 6 | Handoff | Convite `admin@cliente` na CF; `proj_*` mantém-se suporte |
---
## Entrega da senha ao cliente
| Canal | Quando |
|-------|--------|
| **Wizard (primário)** | Painel «Credenciais do projeto» após criar `proj_*` — copiar uma vez |
| **E-mail** | Opcional: `notify_email` do wizard → template com link onboard (senha só no painel, não no email por segurança) |
| **Vault servidor** | `onboard_handoff` / vault projeto — TTL 24h; nunca logar senha em `activity_log` |
Texto sugerido no wizard:
> Use `proj_005@ligbox.com.br` para aceder à Cloudflare e acompanhar o setup.
> Webmail: https://mail.ligbox.com.br/
> Guarde a senha — não voltará a ser mostrada.
---
## Onde referenciar `ligbox_project_email`
| Sistema | Campo / uso |
|---------|-------------|
| `domain_registry` | `project_id`, `ligbox_project_email`, `ligbox_project_password_delivered_at` |
| Conta Cloudflare | Membro inicial + login convite |
| `POST /dns/cloudflare/apply` | Header interno / payload webhook `project_email` |
| `POST /account/create` | Body metadata `ligbox_project_email` (auditoria) |
| Ops webhook VM122 | `onboard.project_email` no funil 004 |
| `activity_log` | Tag `project:proj_005@ligbox.com.br` em passos DNS/CF |
| Purge / Spec 017 | Não apagar `proj_*` sem confirmação ops |
---
## Registo `domain_registry` (extensão)
```json
{
"domain": "empresa.com.br",
"project_id": "005",
"ligbox_project_email": "proj_005@ligbox.com.br",
"ligbox_project_display_name": "Projeto Empresa — empresa.com.br",
"ligbox_project_created_at": "2026-06-22T14:00:00Z",
"ligbox_project_password_delivered": true,
"portal_admin_email": "admin@empresa.com.br",
"cf_account_id": "…",
"handoff_status": "pending"
}
```
---
## API planeadas (VM112)
| Método | Path | Descrição |
|--------|------|-----------|
| POST | `/api/onboarding/project/provision-email` | Aloca `project_id`, cria `proj_*@ligbox.com.br`, regista domínio |
| GET | `/api/onboarding/project/{domain}` | Estado identidade projeto (sem senha) |
| POST | `/api/onboarding/project/reveal-password` | Uma vez por sessão — devolve senha do vault |
**Implementação Carbonio:** reutilizar `carbonio.create_account_full()` no domínio `ligbox.com.br` (já existe em VM112).
---
## Código (monorepo)
| Ficheiro | Função |
|----------|--------|
| `projects/wizard/backend/app/services/project_identity.py` | Aloca ID, cria caixa, vault senha, registo |
| `deploy/vm112-wizard/project-counter.txt` | Contador sequencial (ou SQLite futuro) |
---
## Critérios de aceitação
1. Cliente recebe `proj_{id}@ligbox.com.br` + senha antes do passo DNS Cloudflare.
2. Mesmo e-mail aparece em CF, registry, webhooks e logs de DNS.
3. `admin@{dominio}` criado no passo 5 permanece e-mail principal do **mail do cliente**.
4. BYO / registrador externo **não** criam `proj_*` (só caminho Cloudflare Ligbox).