From f6cf9f8e1c8045f1f5025273636eb0783ee807fc Mon Sep 17 00:00:00 2001 From: Ligbox Spec Hub Date: Sat, 20 Jun 2026 22:07:00 +0000 Subject: [PATCH] Add Spec 034 Nextcloud integration with VM112 Carbonio mail. Defines hybrid hot/warm storage to expand tenant mail capacity via Nextcloud Hub on proposed VM116. --- docs/vms/README.md | 2 + docs/vms/VM112.md | 4 +- docs/vms/VM116.md | 32 ++ .../contracts/nextcloud-provisioning-api.md | 173 ++++++++++ .../infrastructure.md | 172 ++++++++++ .../quickstart.md | 126 +++++++ .../spec.md | 320 ++++++++++++++++++ .../tasks.md | 47 +++ 8 files changed, 875 insertions(+), 1 deletion(-) create mode 100644 docs/vms/VM116.md create mode 100644 specs/034-nextcloud-carbonio-vm112-integration/contracts/nextcloud-provisioning-api.md create mode 100644 specs/034-nextcloud-carbonio-vm112-integration/infrastructure.md create mode 100644 specs/034-nextcloud-carbonio-vm112-integration/quickstart.md create mode 100644 specs/034-nextcloud-carbonio-vm112-integration/spec.md create mode 100644 specs/034-nextcloud-carbonio-vm112-integration/tasks.md diff --git a/docs/vms/README.md b/docs/vms/README.md index d7ae2f6..e99cf5e 100644 --- a/docs/vms/README.md +++ b/docs/vms/README.md @@ -30,6 +30,7 @@ ligbox-ops-platform/ | **123** | 10.10.10.123 | :2523 | FOSSBilling + Odoo + OpenPanel + Console UI | `projects/finance/` | | **104** | 10.10.10.104 | :2504 | Wazuh SIEM | integração Spec 002, 019 | | **114** | 10.10.10.114 | — | Traefik (CT) | `docs/network/TRAEFIK_*` | +| **116** | 10.10.10.116 | :2516 | Nextcloud Hub — ampliar storage mail (Spec 034) | `deploy/vm116-nextcloud/` | | **130** | 10.10.10.130 | :2530 | **Spec Hub** Git + Obsidian + Portal | CT130 local | --- @@ -44,6 +45,7 @@ ligbox-ops-platform/ | 022 | carbonio-account-exists-release | | 025 | wizard-onboarding-continuity | | 026 | purge-traefik-validation | +| 034 | nextcloud-carbonio-vm112-integration | | 010 | desk-assist-takeover (fases VM112) | → [Ficha VM112](VM112.md) diff --git a/docs/vms/VM112.md b/docs/vms/VM112.md index 3909200..552192b 100644 --- a/docs/vms/VM112.md +++ b/docs/vms/VM112.md @@ -25,6 +25,7 @@ specs/017-vm112-domain-orchestration/ specs/022-carbonio-account-exists-release/ specs/025-wizard-onboarding-continuity/ specs/026-purge-traefik-validation/ +specs/034-nextcloud-carbonio-vm112-integration/ ``` ## Deploy na VM112 @@ -37,5 +38,6 @@ git clone https://git.spec.ligbox.com.br/ligbox/ligbox-ops-platform.git ## Integração - **→ VM122:** webhooks `onboarding.*` · Assist/takeover API -- **→ CT114:** Traefik routers mail/onboard +- **→ CT114:** Traefik routers mail/onboard · `files.{dom}` (Spec 034) +- **→ VM116:** IMAP/SMTP (Nextcloud Mail app) · OCS provisioning (Spec 034) - **← Desk:** purge, DNS revalidate, assist actions diff --git a/docs/vms/VM116.md b/docs/vms/VM116.md new file mode 100644 index 0000000..85dacd1 --- /dev/null +++ b/docs/vms/VM116.md @@ -0,0 +1,32 @@ +# VM116 — Nextcloud Hub (Spec 034) + +| Item | Valor | +|------|-------| +| **IP LAN** | `10.10.10.116` (proposto) | +| **SSH WAN** | `95.216.14.146:2516` (reservar pfSense) | +| **Hostname** | `cloud.ligbox.com.br` | +| **URLs tenant** | `files.{dominio}` | + +## Papel + +- Armazenamento **Files** ampliado para tenants Ligbox Mail (VM112) +- App **Mail** opcional → IMAP/SMTP Carbonio VM112 +- MinIO S3 (fase 2) — volume secundário Carbonio + +## No repo Git (CT130) + +``` +deploy/vm116-nextcloud/ # (a criar — Fase 0) +specs/034-nextcloud-carbonio-vm112-integration/ +``` + +## Integração + +- **← VM112:** Wizard provisiona users OCS após conta Carbonio +- **→ VM112:** Mail app IMAP `:993` · SMTP `:587` +- **→ CT114:** Traefik `files.{dom}` + `cloud.ligbox.com.br` +- **← Desk VM122:** health, status quota, purge users (Spec 017 ext.) + +## Estado + +📋 **Não provisionada** — Spec 034 Fase 0 pendente aprovação Roger. diff --git a/specs/034-nextcloud-carbonio-vm112-integration/contracts/nextcloud-provisioning-api.md b/specs/034-nextcloud-carbonio-vm112-integration/contracts/nextcloud-provisioning-api.md new file mode 100644 index 0000000..5aa66b9 --- /dev/null +++ b/specs/034-nextcloud-carbonio-vm112-integration/contracts/nextcloud-provisioning-api.md @@ -0,0 +1,173 @@ +# Contrato — Nextcloud Provisioning + Desk API (Spec 034) + +**Versão:** 0.1 draft +**Auth Nextcloud OCS:** Basic (admin app password) ou token de serviço +**Auth Desk:** Bearer session (RBAC Spec 027) + +--- + +## 1. Nextcloud OCS — utilizador (Wizard VM112) + +### Criar utilizador + +```http +POST /ocs/v1.php/cloud/users +Authorization: Basic {admin}:{app_password} +OCS-APIRequest: true +Content-Type: application/x-www-form-urlencoded + +userid=admin%40empresa.com.br&password=***&displayName=Admin+Empresa +``` + +**Resposta 200:** + +```xml + + ok + + +``` + +### Definir quota Files + +```http +PUT /ocs/v1.php/cloud/users/{userid} +Content-Type: application/x-www-form-urlencoded + +key=quota&value=25GB +``` + +### Apagar utilizador (purge) + +```http +DELETE /ocs/v1.php/cloud/users/{userid} +``` + +--- + +## 2. Wizard VM112 — evento interno + +Após provision OK: + +```json +{ + "event": "onboarding.nextcloud.provisioned", + "domain": "empresa.com.br", + "email": "admin@empresa.com.br", + "nextcloud_userid": "admin@empresa.com.br", + "files_url": "https://files.empresa.com.br", + "quota_files": "25GB", + "carbonio_quota_gb": 5, + "session_id": "uuid" +} +``` + +--- + +## 3. Desk API — health + +### GET `/api/v1/nextcloud/health` + +**Roles:** `super_admin`, `ops_lead`, `technician`, `noc` + +**Resposta 200:** + +```json +{ + "status": "ok", + "vm116": { + "reachable": true, + "nextcloud_version": "30.0.0", + "disk_used_pct": 12, + "url": "https://cloud.ligbox.com.br" + }, + "carbonio_vm112": { + "reachable": true, + "disk_used_pct": 22 + } +} +``` + +--- + +## 4. Desk API — status domínio + +### GET `/api/v1/nextcloud/domains/{domain}/status` + +**Roles:** `super_admin`, `ops_lead`, `technician` + +**Resposta 200:** + +```json +{ + "domain": "empresa.com.br", + "carbonio": { + "accounts": 3, + "domain_quota_gb": 30, + "domain_used_gb": 8.2, + "mail_host": "mail.empresa.com.br" + }, + "nextcloud": { + "enabled": true, + "users": 3, + "files_url": "https://files.empresa.com.br", + "total_quota_gb": 75, + "total_used_gb": 12.1 + } +} +``` + +--- + +## 5. Desk API — provision manual + +### POST `/api/v1/nextcloud/domains/{domain}/users` + +**Roles:** `super_admin`, `ops_lead` + +**Body:** + +```json +{ + "email": "vendas@empresa.com.br", + "display_name": "Vendas", + "quota_files": "25GB", + "sync_password": true, + "password": "********" +} +``` + +**Resposta 201:** + +```json +{ + "userid": "vendas@empresa.com.br", + "files_url": "https://files.empresa.com.br", + "provisioned_at": "2026-06-20T22:00:00Z" +} +``` + +--- + +## 6. Erros standard + +| HTTP | code | Descrição | +|------|------|-----------| +| 404 | `domain_not_found` | Domínio não orquestrado VM112 | +| 409 | `user_exists` | User NC ou Carbonio já existe | +| 502 | `nextcloud_unreachable` | VM116 down | +| 503 | `feature_disabled` | `NEXTCLOUD_INTEGRATION=0` | + +--- + +## 7. Variáveis ambiente (Wizard VM112) + +```env +NEXTCLOUD_INTEGRATION=0 +NEXTCLOUD_OCS_URL=https://10.10.10.116 +NEXTCLOUD_ADMIN_USER=ligbox-provisioner +NEXTCLOUD_ADMIN_APP_PASSWORD=*** +NEXTCLOUD_DEFAULT_QUOTA=25GB +NEXTCLOUD_FILES_URL_TEMPLATE=https://files.{domain} +CARBONIO_DEFAULT_QUOTA_GB=5 +``` diff --git a/specs/034-nextcloud-carbonio-vm112-integration/infrastructure.md b/specs/034-nextcloud-carbonio-vm112-integration/infrastructure.md new file mode 100644 index 0000000..887e8b6 --- /dev/null +++ b/specs/034-nextcloud-carbonio-vm112-integration/infrastructure.md @@ -0,0 +1,172 @@ +# Spec 034 — Infraestrutura Nextcloud + VM112 + +**Actualizado:** 2026-06-20 + +--- + +## Topologia proposta + +``` +Internet (95.216.14.146) + │ + ├── pfSense NAT + │ ├── :2512 → VM112:22 (mail/wizard) + │ ├── :2516 → VM116:22 (nextcloud) ← reservar + │ └── :443 → CT114 Traefik + │ + └── CT114 (10.10.10.114) + ├── mail.{dominio} → VM112:443 + ├── onboard.ligbox.com.br → VM112:8090 + ├── files.{dominio} → VM116:443 ← novo router + └── cloud.ligbox.com.br → VM116:443 ← hub Ligbox +``` + +--- + +## VM116 — Nextcloud Hub (nova) + +| Parâmetro | Valor proposto | +|-----------|----------------| +| **VMID** | 116 | +| **Nome** | `vm116-nextcloud-ligbox` | +| **IP LAN** | `10.10.10.116/24` | +| **Gateway** | `10.10.10.1` (pfSense) | +| **SSH WAN** | `95.216.14.146:2516` | +| **vCPU** | 4 | +| **RAM** | 8192 MB | +| **Disco** | 500 GB (`local-lvm` ou volume dedicado) | +| **SO** | Ubuntu 24.04 LTS | + +### Serviços + +| Serviço | Porta | Notas | +|---------|-------|-------| +| Nextcloud (Apache/nginx) | 443 | Behind Traefik ou direct SNI | +| PostgreSQL | 5432 | localhost only | +| Redis | 6379 | localhost — locking/sessions | +| MinIO (fase 2) | 9000 | S3 API — localhost + VM112 ACL | + +### Instalação recomendada + +**Opção A — Docker Compose** (preferida para IaC no repo): + +``` +deploy/vm116-nextcloud/ +├── docker-compose.yml +├── .env.example +├── traefik/dynamic-files.yml.snippet +└── scripts/ + ├── install.sh + ├── occ-provision-user.sh + └── backup-occ.sh +``` + +**Opção B — Nextcloud snap** — mais rápido para piloto manual. + +--- + +## VM112 — ligação existente (sem alterar mail) + +| Parâmetro | Valor actual | +|-----------|--------------| +| IP | `10.10.10.112` | +| Carbonio LMTP | `:7025` (Desk transport) | +| Carbonio IMAP | `:993` | +| Carbonio SMTP | `:25` / submission | +| Wizard API | `:8090` | + +### Conectividade VM116 → VM112 + +| Origem | Destino | Porta | Uso | +|--------|---------|-------|-----| +| VM116 (Mail app users) | VM112 | 993 | IMAP SSL | +| VM116 (Mail app users) | VM112 | 587/465 | SMTP submission | +| VM116 (provision script) | VM112 | 8090 | Opcional — estado domínio | +| VM112 (wizard worker) | VM116 | 443 | OCS Provisioning API | + +**Firewall pfSense:** permitir LAN `10.10.10.116 → 10.10.10.112:993,587,8090`. + +--- + +## CT114 — Traefik / SNI + +### Novo router `files.{domain}` + +Seguir padrão Spec 017 (`mail.{domain}`): + +1. Adicionar `files.{dom}` em `sni_vm112.lst` → **renomear** para `sni_tenant_apps.lst` (mail + files) +2. Router Traefik `files-*-Router` → backend `http://10.10.10.116:443` +3. Certbot SAN multi-dom ou cert por domínio (mesmo fluxo mail) + +### Router hub + +```yaml +# cloud.ligbox.com.br → VM116 +http: + routers: + nextcloud-hub: + rule: Host(`cloud.ligbox.com.br`) + service: nextcloud-vm116 + tls: + certResolver: letsencrypt +``` + +--- + +## DNS Cloudflare (por tenant) + +| Registo | Tipo | Valor | +|---------|------|-------| +| `files.{dominio}` | A | IP público (via Traefik) | +| `_carddav._tcp.{dominio}` | SRV | opcional — CalDAV/CardDAV NC | + +**Nota:** MX continua `mail.{dominio}` → Carbonio. Nextcloud **não** recebe mail directo. + +--- + +## Storage — fase 2 (Carbonio S3 offload) + +``` +VM112 Carbonio + └── volume secondary (Custom S3) + └── MinIO VM116 :9000 + bucket: carbonio-archive-{tenant} +``` + +Credenciais S3 em `/opt/zextras/conf/` (VM112) — **nunca** no repo Git. + +--- + +## Backup & DR + +| Componente | Método | Frequência | +|------------|--------|------------| +| VM116 snapshot | Proxmox | diário | +| Nextcloud data | `occ files:scan` + rsync/borg | diário | +| PostgreSQL NC | `pg_dump` | diário | +| MinIO (fase 2) | replica ou snapshot volume | diário | + +**RPO alvo:** 24 h · **RTO alvo:** 4 h (restaurar VM116 + re-ligar Traefik). + +--- + +## Monitorização + +| Métrica | Alerta | +|---------|--------| +| Disco VM116 > 80% | ops_lead email | +| Disco VM112 > 85% | crítico — revisar quotas hot | +| Nextcloud status.php != 200 | Infra stack health Desk | +| IMAP latency VM112 > 2s | investigar carga Mail app | + +--- + +## Decisão pendente (Roger) + +| Opção | Prós | Contras | +|-------|------|---------| +| **VM116 dedicada** (proposto) | Disco isolado, escala independente | Nova VM para gerir | +| Nextcloud na VM112 | Menos VMs | Piora problema de disco | +| Nextcloud na VM123 | Já tem stack Docker | Mistura finance/hosting com mail | + +**Recomendação Spec 034:** VM116 dedicada. diff --git a/specs/034-nextcloud-carbonio-vm112-integration/quickstart.md b/specs/034-nextcloud-carbonio-vm112-integration/quickstart.md new file mode 100644 index 0000000..184a6c1 --- /dev/null +++ b/specs/034-nextcloud-carbonio-vm112-integration/quickstart.md @@ -0,0 +1,126 @@ +# Quickstart — Piloto Nextcloud + Carbonio VM112 (Spec 034) + +**Público:** ops_lead, super_admin +**Pré-requisito:** VM116 provisionada · Carbonio VM112 operacional · acesso CT114 + +--- + +## Regra operacional + +> **Carbonio continua MTA.** Nextcloud **não** altera MX/DKIM. +> Piloto começa com **1 domínio de teste** (não `ligbox.com.br` produção até validar). + +--- + +## 1. Verificar Carbonio VM112 + +```bash +ssh root@10.10.10.112 -p 2512 # via Proxmox jump se necessário + +# Conta teste +zmprov ga admin@DOMINIO-TESTE.com zimbraMailQuota 2>/dev/null | head -5 + +# IMAP local +openssl s_client -connect 127.0.0.1:993 -quiet &1 | head -3 +``` + +--- + +## 2. Instalar Nextcloud VM116 (piloto) + +```bash +ssh root@10.10.10.116 + +# Após clone repo + deploy/vm116-nextcloud/ +cd /opt/ligbox-ops-platform/deploy/vm116-nextcloud +cp .env.example .env +# Editar: NC_DOMAIN=cloud.ligbox.com.br, ADMIN_PASS=*** +docker compose up -d + +docker exec -u www-data nextcloud occ status +``` + +URL piloto: `https://cloud.ligbox.com.br` + +--- + +## 3. Criar utilizador Nextcloud (= e-mail Carbonio) + +```bash +docker exec -u www-data nextcloud occ user:add \ + --display-name="Admin Teste" \ + --password-from-env \ + admin@DOMINIO-TESTE.com + +docker exec -u www-data nextcloud occ user:setting \ + admin@DOMINIO-TESTE.com files quota 25GB +``` + +**Importante:** usar o **mesmo e-mail** que existe no Carbonio. + +--- + +## 4. Configurar Mail app (Nextcloud → Carbonio) + +No browser, login Nextcloud como `admin@DOMINIO-TESTE.com`: + +1. Activar app **Mail** +2. Nova conta: + - E-mail: `admin@DOMINIO-TESTE.com` + - IMAP: `mail.DOMINIO-TESTE.com` · port **993** · SSL + - SMTP: `mail.DOMINIO-TESTE.com` · port **587** · STARTTLS + - Utilizador/senha: credenciais Carbonio + +3. Enviar e-mail teste → verificar recepção no webmail Carbonio. + +--- + +## 5. Teste capacidade (Files vs Mail) + +```bash +# Upload ficheiro 50 MB no Files — deve funcionar +# Verificar quota Carbonio não aumentou: +ssh root@10.10.10.112 "zmprov gq admin@DOMINIO-TESTE.com" +``` + +--- + +## 6. Traefik — files.{dominio} (opcional piloto) + +No CT114, seguir template Spec 017 para `mail.{dom}` substituindo backend por `10.10.10.116:443`. + +Teste: + +```bash +curl -sI "https://files.DOMINIO-TESTE.com/status.php" | head -5 +``` + +--- + +## 7. Desk — health (após implementação API) + +```bash +curl -s -u root:805353 \ + "http://10.10.10.122:8180/api/v1/nextcloud/health" | jq . +``` + +--- + +## Checklist piloto OK + +- [ ] Nextcloud status 200 +- [ ] User NC criado com e-mail `@dominio` +- [ ] Mail app lê Inbox Carbonio +- [ ] Envio SMTP funciona +- [ ] Upload 50 MB em Files OK +- [ ] Quota Carbonio inalterada após upload Files +- [ ] ops_lead aprova continuar Fase 1 (wizard) + +--- + +## Rollback piloto + +```bash +docker exec -u www-data nextcloud occ user:delete admin@DOMINIO-TESTE.com +# Remover router Traefik files.{dom} se criado +``` diff --git a/specs/034-nextcloud-carbonio-vm112-integration/spec.md b/specs/034-nextcloud-carbonio-vm112-integration/spec.md new file mode 100644 index 0000000..bf9f41e --- /dev/null +++ b/specs/034-nextcloud-carbonio-vm112-integration/spec.md @@ -0,0 +1,320 @@ +# 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) + **VM116** (Nextcloud — proposto) + 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 VM116 | 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 | **VM116** `10.10.10.116` (nova) — 4 vCPU, 8 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 VM116) via Carbonio Storage | +| 9 | Orquestração | Wizard VM112 API + Desk VM122 (monitorização, purge, RBAC) | +| 10 | Produto comercial | Pacote **Ligbox Mail Plus** = Carbonio base + Nextcloud Files quota | + +--- + +## 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
SMTP :25 · IMAP :993 · LMTP :7025] + DA[Domain Admin] + end + + subgraph VM116["VM116 — Nextcloud Hub (proposto)"] + NC[Nextcloud :443] + NCMAIL[App Mail → IMAP Carbonio] + NCFiles[App Files — quota ampliada] + S3[MinIO S3 :9000
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) — **opcional** | +| 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`) + +| Funcionalidade | Descrição | +|----------------|-----------| +| Ver quota Carbonio + Files | Painel unificado | +| Link «Abrir Files» | Redirect `files.{dominio}` | +| 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 VM116 | + +Ver contrato: [contracts/nextcloud-provisioning-api.md](./contracts/nextcloud-provisioning-api.md). + +### Stack health (Spec 033) + +Adicionar probe VM116 em `stack_health.py`: + +| Serviço | URL | VM | +|---------|-----|-----| +| Nextcloud Hub | `https://cloud.ligbox.com.br/status.php` | 116 | +| Nextcloud OCS | `https://10.10.10.116/ocs/v2.php/cloud/capabilities` | 116 | + +### 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 VM116 + +Detalhe: [infrastructure.md](./infrastructure.md) + +| Item | Valor proposto | +|------|----------------| +| VMID | 116 | +| IP LAN | `10.10.10.116/24` | +| SSH WAN | `95.216.14.146:2516` (reservar no pfSense) | +| 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: VM116 +roles: + nextcloud_admin: [super_admin, ops_lead] + nextcloud_read: [technician, noc] +``` + +--- + +## Fases de implementação + +### Fase 0 — Piloto infra (sem wizard) + +- [ ] Provisionar VM116 + 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» +- [ ] Domain Admin painel unificado quota + +### Fase 3 — Offload S3 Carbonio + +- [ ] MinIO VM116 +- [ ] 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. VM116 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 | +| [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 | + +--- + +## 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 diff --git a/specs/034-nextcloud-carbonio-vm112-integration/tasks.md b/specs/034-nextcloud-carbonio-vm112-integration/tasks.md new file mode 100644 index 0000000..8a80563 --- /dev/null +++ b/specs/034-nextcloud-carbonio-vm112-integration/tasks.md @@ -0,0 +1,47 @@ +# Spec 034 — Tasks + +**Status:** Draft · **Início:** 2026-06-20 + +--- + +## Fase 0 — Piloto infra + +- [ ] Roger aprovar VM116 (recursos Proxmox + porta SSH 2516) +- [ ] Criar VM116 Ubuntu 24.04 · 500 GB disco +- [ ] `deploy/vm116-nextcloud/` — docker-compose + scripts +- [ ] TLS `cloud.ligbox.com.br` via Traefik CT114 +- [ ] Teste Mail app → Carbonio (domínio teste) +- [ ] Documentar resultados no quickstart + +## Fase 1 — Wizard + Desk + +- [ ] `NEXTCLOUD_API_URL` + credenciais admin OCS (secrets VM112) +- [ ] Serviço wizard `nextcloud_provision.py` +- [ ] Hook pós `account/create` (flag `NEXTCLOUD_INTEGRATION`) +- [ ] Webhook Desk `onboarding.nextcloud.provisioned` +- [ ] API Desk: `/api/v1/nextcloud/health`, `.../domains/{domain}/status` +- [ ] Stack health VM116 em `stack_health.py` (Spec 033) +- [ ] Traefik template `files.{domain}` (CT114) +- [ ] Módulo Desk `nextcloud-storage` (Spec 015) + +## Fase 2 — Operações + +- [ ] Extensão purge Spec 017 — apagar users Nextcloud +- [ ] Domain Admin — painel quota unificado +- [ ] FOSSBilling produto «Ligbox Mail Plus» +- [ ] Alertas disco VM112/VM116 + +## Fase 3 — Offload S3 + +- [ ] MinIO VM116 +- [ ] Volume secundário Carbonio → S3 +- [ ] Política archive + runbook ops + +## Documentação + +- [x] Spec 034 `spec.md` +- [x] `infrastructure.md` +- [x] `quickstart.md` +- [x] `contracts/nextcloud-provisioning-api.md` +- [ ] Actualizar `docs/vms/README.md` + `VM112.md` +- [ ] Publicar no Spec Hub Portal (Spec 031)