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>
118 lines
4.5 KiB
Markdown
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).
|