Inclui console handoff Desk↔Console (Spec 019), melhorias DNS Viewer (037), OpenPanel/Nextcloud/VM116 deploy notes, contracts stack e sidebar actualizado. Co-authored-by: Cursor <cursoragent@cursor.com>
327 lines
12 KiB
Markdown
327 lines
12 KiB
Markdown
# Spec 034 — Nextcloud + E-mail VM112 (ampliar capacidade Carbonio)
|
||
|
||
**Criado:** 2026-06-20
|
||
**Solicitado por:** Roger
|
||
**Status:** 📋 Draft — aguarda validação arquitectura
|
||
**Prioridade:** P1 (capacidade mail tenants + produto Ligbox Mail)
|
||
**Sistema:** VM112 (Carbonio) + **VM124** (Nextcloud) + CT114 (Traefik) + Desk VM122
|
||
**Relacionado:** Spec **017** (purge domínio) · **022** (Carbonio release) · **013/019** (migração mail) · **027** (RBAC) · **033** (Infra stack health)
|
||
|
||
---
|
||
|
||
## Resumo
|
||
|
||
Integrar **Nextcloud Hub** ao ecossistema **Ligbox Mail (VM112)** para **ampliar a capacidade efectiva de e-mail e ficheiros** dos tenants Carbonio, sem substituir o motor de mail.
|
||
|
||
**Problema:** a VM112 tem disco limitado (~96 GB) e o Carbonio CE guarda mail + blobs localmente. Quotas altas por domínio esgotam o volume rapidamente.
|
||
|
||
**Solução proposta:** modelo **híbrido em camadas**:
|
||
|
||
| Camada | Produto | Função | Quota típica |
|
||
|--------|---------|--------|--------------|
|
||
| **Hot** | Carbonio VM112 | SMTP/IMAP, webmail, calendário, contactos | 5–10 GB / caixa |
|
||
| **Warm** | Nextcloud Files VM124 | Anexos grandes, documentos, partilha | 50–500 GB / utilizador |
|
||
| **Cold** (fase 2) | Carbonio → S3 secundário | Arquivo IMAP antigo, blobs offload | Configurável |
|
||
|
||
O Carbonio **permanece autoridade** para `@dominio` (MX, DKIM, LMTP). Nextcloud **complementa** capacidade de armazenamento e UX unificada (Mail app + Files).
|
||
|
||
---
|
||
|
||
## Problema
|
||
|
||
### Limitações actuais (VM112)
|
||
|
||
| Item | Estado |
|
||
|------|--------|
|
||
| Disco VM112 | `/dev/sda1` ~96 GB (~20 GB usados hoje — cresce com tenants) |
|
||
| Storage Carbonio | Volumes **locais** (Primary + Index) |
|
||
| Quota domínio/conta | `zmprov` / Domain Admin — sem offload automático |
|
||
| Integração nativa Nextcloud | **Inexistente** no Carbonio CE (Zextras: sem roadmap oficial) |
|
||
| ManageSieve (4190) | **Não disponível** — filtros Nextcloud Mail não funcionam nativamente |
|
||
|
||
### Impacto operacional
|
||
|
||
1. Onboarding cria contas com quota default alta → risco de encher disco.
|
||
2. Anexos grandes (PST import, ficheiros 25 MB+) pressionam o mesmo volume do mailstore.
|
||
3. Clientes pedem «mais espaço de e-mail» — hoje só há aumento de quota Carbonio (mesmo disco).
|
||
4. Purge domínio (Spec 017) remove Carbonio mas **não** limpa workspace Nextcloud (futuro).
|
||
|
||
---
|
||
|
||
## Decisões de arquitectura (propostas — Roger valida)
|
||
|
||
| # | Tema | Decisão proposta |
|
||
|---|------|------------------|
|
||
| 1 | Motor de mail | **Carbonio VM112** — inalterado como MTA/MUA principal |
|
||
| 2 | Armazenamento expandido | **Nextcloud Hub** em VM dedicada com disco ampliado |
|
||
| 3 | VM alvo Nextcloud | **VM124** `10.10.10.124` — **2 vCPU**, **4 GB RAM**, **500 GB** disco |
|
||
| 4 | Identidade | Conta Nextcloud = **mesmo e-mail** `@dominio` (provisionamento paralelo ao Carbonio) |
|
||
| 5 | Autenticação | Fase 1: **senha sincronizada** no wizard · Fase 2: **OIDC/SAML** ou LDAP Carbonio |
|
||
| 6 | URL tenant | `files.{dominio}` (SNI CT114) · hub Ligbox: `cloud.ligbox.com.br` |
|
||
| 7 | Mail Nextcloud | App **Mail** → IMAP/SMTP Carbonio (`mail.{dominio}`) — **opcional** na UI |
|
||
| 8 | Offload Carbonio | Fase 2: volume **S3 secundário** (MinIO na VM124) via Carbonio Storage |
|
||
| 9 | Orquestração | Wizard VM112 API + Desk VM122 (monitorização, purge, RBAC) |
|
||
| 10 | Produto comercial | Pacote **Ligbox Mail Plus** = Carbonio + Nextcloud — **Spec 035** (bundles FOSS/OpenPanel, preços, gerente domínio) |
|
||
|
||
---
|
||
|
||
## Arquitectura
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph Internet
|
||
Users[Utilizadores / Browser]
|
||
CF[Cloudflare DNS]
|
||
end
|
||
|
||
subgraph CT114["CT114 Traefik + SNI"]
|
||
TR[Traefik :443]
|
||
end
|
||
|
||
subgraph VM112["VM112 — Carbonio + Wizard"]
|
||
WZ[Wizard API :8090]
|
||
CB[Carbonio CE<br/>SMTP :25 · IMAP :993 · LMTP :7025]
|
||
DA[Domain Admin]
|
||
end
|
||
|
||
subgraph VM124["VM124 — Nextcloud Hub"]
|
||
NC[Nextcloud :443]
|
||
NCMAIL[App Mail → IMAP Carbonio]
|
||
NCFiles[App Files — quota ampliada]
|
||
S3[MinIO S3 :9000<br/>fase 2]
|
||
end
|
||
|
||
subgraph VM122["VM122 — Desk"]
|
||
DS[Ops Desk API]
|
||
end
|
||
|
||
Users --> CF
|
||
CF --> TR
|
||
TR -->|mail.{dom}| CB
|
||
TR -->|onboard.ligbox| WZ
|
||
TR -->|files.{dom}| NC
|
||
NCMAIL -->|IMAP/SMTP| CB
|
||
CB -.->|volume secundário fase 2| S3
|
||
WZ -->|provision user| NC
|
||
WZ -->|webhooks| DS
|
||
DS -->|stack health / purge| NC
|
||
DS -->|proxy status| WZ
|
||
```
|
||
|
||
---
|
||
|
||
## Modelo de capacidade (quotas)
|
||
|
||
### Política Ligbox Mail (default proposto)
|
||
|
||
| Plano | Quota Carbonio (hot) | Quota Nextcloud Files | Notas |
|
||
|-------|----------------------|------------------------|-------|
|
||
| **Starter** | 5 GB | 25 GB | Wizard default |
|
||
| **Business** | 10 GB | 100 GB | FOSSBilling add-on |
|
||
| **Enterprise** | 20 GB | 500 GB | Negociado |
|
||
|
||
**Regra:** quota Carbonio **sempre ≤** hot tier; crescimento comercial → Nextcloud Files, não aumento cego no mailstore local.
|
||
|
||
### Fluxos de offload (UX)
|
||
|
||
1. **Anexo grande no webmail Carbonio** — aviso «Guarde em Files» + link `files.{dominio}`.
|
||
2. **Nextcloud Mail** — utilizador lê mail via IMAP; anexos > N MB → «Guardar no Files» (manual fase 1).
|
||
3. **Fase 2 — Archive** — job `carbonio powerstore` move mensagens > 90 dias para volume S3; stub no IMAP.
|
||
|
||
---
|
||
|
||
## Integração VM112 (Wizard + Domain Admin)
|
||
|
||
### Provisionamento no onboarding
|
||
|
||
Após `POST /api/onboarding/account/create` (Carbonio OK):
|
||
|
||
| Passo | Acção |
|
||
|-------|--------|
|
||
| NC-1 | Criar utilizador Nextcloud via **OCS Provisioning API** |
|
||
| NC-2 | Definir quota Files conforme plano |
|
||
| NC-3 | Pré-configurar conta Mail app (IMAP host, SSL, e-mail) — **só se** `nextcloud_mail_enabled=1` no domínio |
|
||
| NC-4 | Registar `nextcloud_user_id` + `files_url` no estado do domínio |
|
||
| NC-5 | Webhook Desk `onboarding.nextcloud.provisioned` |
|
||
|
||
**Feature flag wizard:** `NEXTCLOUD_INTEGRATION=0|1` (default **0** até piloto).
|
||
|
||
### Domain Admin (`/admin`)
|
||
|
||
UI detalhada: [034-console-process-ui.md](./034-console-process-ui.md) · Shell: [035-UX](../035-ligbox-mail-bundles-foss-openpanel/ligbox-console-shell.md)
|
||
|
||
| Funcionalidade | Descrição |
|
||
|----------------|-----------|
|
||
| Ver quota Carbonio + Files | Painel unificado |
|
||
| **Toggle Mail Nextcloud** | Activar/desactivar Mail app **por domínio** (default OFF — Spec 035 §2.2.1) |
|
||
| Link «Abrir Files» | Redirect `files.{dominio}` |
|
||
| Link «Abrir webmail» | Redirect `mail.{dominio}` (sempre) |
|
||
| Reset senha | Sincroniza Carbonio + Nextcloud (fase 1) |
|
||
|
||
---
|
||
|
||
## Integração Desk VM122
|
||
|
||
### Módulo Desk (Spec 015)
|
||
|
||
| Campo | Valor |
|
||
|-------|--------|
|
||
| `id` | `nextcloud-storage` |
|
||
| `label` | Nextcloud Storage |
|
||
| `default_enabled` | `false` (piloto) |
|
||
| `nav_views` | _(vazio — tile em Serviços / Infra)_ |
|
||
|
||
### API Desk (novos endpoints)
|
||
|
||
| Método | Path | Descrição |
|
||
|--------|------|-----------|
|
||
| GET | `/api/v1/nextcloud/domains/{domain}/status` | Quota, users, health |
|
||
| GET | `/api/v1/nextcloud/domains/{domain}/users` | Lista utilizadores tenant |
|
||
| POST | `/api/v1/nextcloud/domains/{domain}/users` | Provision manual (ops) |
|
||
| DELETE | `/api/v1/nextcloud/domains/{domain}/users/{email}` | Remover user |
|
||
| GET | `/api/v1/nextcloud/health` | Probe VM124 |
|
||
|
||
Ver contrato: [contracts/nextcloud-provisioning-api.md](./contracts/nextcloud-provisioning-api.md).
|
||
|
||
### Stack health (Spec 033)
|
||
|
||
Adicionar probe VM124 em `stack_health.py`:
|
||
|
||
| Serviço | URL | VM |
|
||
|---------|-----|-----|
|
||
| Nextcloud Hub | `https://cloud.ligbox.com.br/status.php` | 116 |
|
||
| Nextcloud OCS | `https://10.10.10.124/ocs/v2.php/cloud/capabilities` | 124 |
|
||
|
||
### Purge domínio (extensão Spec 017)
|
||
|
||
Ordem **após** purge Carbonio:
|
||
|
||
1. Listar users Nextcloud com e-mail `@dominio`
|
||
2. Apagar utilizadores via OCS API
|
||
3. Apagar grupo tenant (se existir)
|
||
4. Registar passo na timeline purge
|
||
|
||
---
|
||
|
||
## Infraestrutura VM124
|
||
|
||
Detalhe: [infrastructure.md](./infrastructure.md)
|
||
|
||
| Item | Valor |
|
||
|------|-------|
|
||
| VMID | 124 |
|
||
| IP LAN | `10.10.10.124/24` |
|
||
| SSH WAN | `95.216.14.146:2524` (reservar no pfSense) |
|
||
| vCPU / RAM / disco | **2** / **4 GB** / **500 GB** |
|
||
| Hostname | `cloud.ligbox.com.br` |
|
||
| SO | Ubuntu 24.04 LTS |
|
||
| Stack | Nextcloud 30+ (snap ou Docker), PostgreSQL, Redis |
|
||
| TLS | Let's Encrypt via Traefik CT114 |
|
||
| Backup | Proxmox snapshot + Nextcloud `occ` backup diário |
|
||
|
||
---
|
||
|
||
## RBAC (Spec 027)
|
||
|
||
| Acção | Perfis |
|
||
|-------|--------|
|
||
| Ver status Nextcloud (Desk) | `super_admin`, `ops_lead`, `technician` |
|
||
| Provision manual user | `super_admin`, `ops_lead` |
|
||
| Alterar quotas tenant | `super_admin`, `ops_lead` |
|
||
| Purge users Nextcloud | `super_admin`, `ops_lead` (com purge domínio) |
|
||
| Cliente Domain Admin | Gerente domínio — só o seu tenant |
|
||
|
||
Binding software (matriz RBAC):
|
||
|
||
```yaml
|
||
software_group: vm112-nextcloud
|
||
host: VM124
|
||
roles:
|
||
nextcloud_admin: [super_admin, ops_lead]
|
||
nextcloud_read: [technician, noc]
|
||
```
|
||
|
||
---
|
||
|
||
## Fases de implementação
|
||
|
||
### Fase 0 — Piloto infra (sem wizard)
|
||
|
||
- [ ] Provisionar VM124 + Nextcloud + TLS
|
||
- [ ] Conta manual `admin@ligbox.com.br` + teste Mail app → Carbonio VM112
|
||
- [ ] Documentar quotas e limites IMAP
|
||
|
||
### Fase 1 — Provisionamento wizard + Desk read-only
|
||
|
||
- [ ] API Nextcloud provisioning no wizard (flag OFF default)
|
||
- [ ] Endpoints Desk status/health
|
||
- [ ] Traefik `files.{dom}` template (CT114)
|
||
- [ ] Stack health card Infra
|
||
|
||
### Fase 2 — Purge + quotas comerciais
|
||
|
||
- [ ] Purge Nextcloud no fluxo Spec 017
|
||
- [ ] FOSSBilling add-on «Mail Plus» → ver **Spec 035** (bundles completos)
|
||
- [ ] Domain Admin painel unificado quota
|
||
|
||
### Fase 3 — Offload S3 Carbonio
|
||
|
||
- [ ] MinIO VM124
|
||
- [ ] Volume secundário Carbonio → S3
|
||
- [ ] Política retenção / archive IMAP
|
||
|
||
---
|
||
|
||
## Fora de escopo (v1)
|
||
|
||
- Substituir webmail Carbonio por Nextcloud Mail como única UI
|
||
- ManageSieve / filtros Nextcloud nativos (requer bridge custom — backlog)
|
||
- Integração nativa Carbonio Files ↔ Nextcloud (inexistente no CE)
|
||
- Nextcloud Talk / Office (avaliar Spec separada)
|
||
- Multi-tenant Nextcloud federado (um hub Ligbox basta no piloto)
|
||
|
||
---
|
||
|
||
## Riscos e mitigações
|
||
|
||
| Risco | Mitigação |
|
||
|-------|-----------|
|
||
| Duplicar senhas (Carbonio + NC) | Fase 2 OIDC; rotação via Domain Admin |
|
||
| IMAP Nextcloud Mail sobrecarrega VM112 | Rate limit; quota hot baixa; monitor CPU |
|
||
| Purge incompleto (dados órfãos NC) | Passo obrigatório Spec 017 + audit |
|
||
| Disco VM112 enche antes do piloto | Alertas quota 80% + política quota default 5 GB |
|
||
| S3 MinIO single point | Replicação fase 3; backup S3 |
|
||
|
||
---
|
||
|
||
## Critérios de aceitação (Fase 1)
|
||
|
||
1. VM124 Nextcloud acessível em `https://cloud.ligbox.com.br` com TLS válido.
|
||
2. Utilizador `admin@ligbox.com.br` lê/envia mail via Nextcloud Mail → Carbonio VM112.
|
||
3. Wizard com flag ON cria user Nextcloud após conta Carbonio.
|
||
4. Desk exibe quota Carbonio + Nextcloud no tile domínio (read-only).
|
||
5. Documentação quickstart validada por ops_lead.
|
||
|
||
---
|
||
|
||
## Documentos relacionados
|
||
|
||
| Documento | Conteúdo |
|
||
|-----------|----------|
|
||
| [infrastructure.md](./infrastructure.md) | VM116, rede, Traefik, disco |
|
||
| [quickstart.md](./quickstart.md) | Piloto manual ops |
|
||
| [tasks.md](./tasks.md) | Checklist implementação |
|
||
| [034-console-process-ui.md](./034-console-process-ui.md) | **Visão processo Console** (UI Spec 030 + componentes 034) |
|
||
| [contracts/nextcloud-provisioning-api.md](./contracts/nextcloud-provisioning-api.md) | OCS + Desk API |
|
||
| `docs/EMAIL_LIGBOX_VM112.md` | Arquitectura mail actual |
|
||
| `docs/vms/VM112.md` | Ficha VM112 |
|
||
| [Spec 035 — Bundles FOSS/OpenPanel](../035-ligbox-mail-bundles-foss-openpanel/spec.md) | Preços, FOSS, login gerente domínio |
|
||
|
||
---
|
||
|
||
## Referências externas
|
||
|
||
- [Carbonio CE Storage](https://docs.zextras.com/carbonio-ce/html/adminpanel/storage.html)
|
||
- [Carbonio S3 volumes](https://docs.zextras.com/carbonio/html/admincli/storages.html)
|
||
- [Nextcloud OCS Provisioning API](https://docs.nextcloud.com/server/latest/admin_manual/configuration_user/user_provisioning_api.html)
|
||
- [Zextras Forum — Nextcloud integration](https://community.zextras.com/forum/carbonio-general-thread/nextcloud-for-carbonio-ce/) — sem integração nativa CE
|