ligbox-ops-platform/specs/010-admin-domain-validation/correcao-vm112.md
Ligbox Spec Hub 3a2c64834b Initial import: ligbox-ops-platform + specs + LAPTOP + obsidian merge (CT130)
Source: VM122 /opt + obsidian-infra + LAPTOP
Hub: CT130 spec-hub 10.10.10.130
2026-06-19 17:26:41 +00:00

217 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPEC — Correcção Admin Domínios Virtuais (VM112)
**Versão:** 1.0
**Data:** 2026-06-12
**Autor:** Roger / Cursor DevOps
**Estado:****IMPLEMENTADO**
**Servidor:** VM112 (`10.10.10.112`) — Carbonio Advanced
---
## 1. Resumo executivo
Correcção completa do **Admin Console Carbonio** para **9 domínios virtuais** na VM112, em três camadas:
| Camada | Problema | Correcção |
|--------|----------|-----------|
| **`:6071` SSL** | 4 domínios ERR_CERT no browser | Certs LE exportados Traefik → nginx admin |
| **`/admin` :443** | Timeout/504 nos 4 domínios | Redirect nginx 443 → `:6071/static/login/` |
| **diarissima :6071** | 504 (bloco ausente) | Bloco em `.custom` + blindagem zmproxyconfgen |
| **ligbox :6071** | Fixes manuais apagados por zmproxyconfgen | Script idempotente + wrapper |
**URL admin canónica (sempre válida):**
```
https://mail.ligbox.com.br:6071/static/login/
```
Domain admin entra com `admin@{dominio}` na mesma URL ou na URL branded do domínio.
---
## 2. Mapa final por domínio (pós-correcção)
| Domínio | `/admin` :443 | `:6071` cert | `:6071` login |
|---------|---------------|--------------|---------------|
| ligbox.com.br | ✅ 302 → :6071 | ✅ LE próprio | ✅ |
| diarissima.com | ✅ 302 | ✅ SAN multi | ✅ |
| dratcoin.com | ✅ 302 | ✅ SAN multi | ✅ |
| ibytera.com | ✅ 302 | ✅ SAN multi | ✅ |
| myvexx.com | ✅ 302 | ✅ SAN multi | ✅ |
| betinplace.com | ✅ 302 | ✅ Traefik export | ✅ |
| betinsport.com | ✅ 302 | ✅ Traefik export | ✅ |
| eplacebets.com | ✅ 302 | ✅ Traefik export | ✅ |
| iofficebooks.com | ✅ 302 | ✅ Traefik export | ✅ |
---
## 3. Problemas identificados
### 3.1 Dois URLs diferentes (confusão operacional)
| URL | Porta | Função |
|-----|-------|--------|
| `https://mail.{dominio}/admin` | **443** | Atalho — deve redirecionar |
| `https://mail.{dominio}:6071/static/login/` | **6071** | Admin Console Carbonio (real) |
O wizard `/admin` (SPA painel delegado) **≠** Carbonio admin.
### 3.2 ERR_CERT nos 4 domínios (betinplace, betinsport, eplacebets, iofficebooks)
- Bloco nginx `:6071` **existia**
- Cert partilhado `nginx.crt` (SAN multi) **não incluía** estes hostnames
- Browser: `NET::ERR_CERT_COMMON_NAME_INVALID` + HSTS impede bypass
**Causa:** domínios em conta Cloudflare diferente — certbot DNS VM112 não consegue expandir `mail-vm112-multi`.
**Solução:** certs LE **já existentes no Traefik (CT114)** exportados para VM112.
### 3.3 `/admin` :443 → 504/timeout (4 domínios)
- `mail.ligbox.com.br` funcionava via `https.default` (include `backend-admin-redirect.conf`)
- Domínios tenant tinham bloco `location = //` **corrupto** (admin quebrado)
- Falta `include backend-admin-redirect.conf` nos blocos `nginx.conf.web.https`
### 3.4 diarissima :6071 → 504
- Bloco admin removido em cleanup 2026-06-08
- Recriado em ficheiro `.custom` (fora do zmproxyconfgen)
### 3.5 zmproxyconfgen apaga fixes ligbox
- Regenera `nginx.conf.web.carbonio.admin` → perde patches manuais ligbox
---
## 4. Correcções aplicadas
### 4.1 Certs Traefik → admin :6071 (4 domínios)
**Origem:** `/root/traefik/letsencrypt/acme.json` (CT114)
**Destino:**
```
/opt/zextras/ssl/letsencrypt/traefik-export/mail-{dominio}.fullchain.pem
/opt/zextras/ssl/letsencrypt/traefik-export/mail-{dominio}.privkey.pem
```
**Patch nginx:** blocos admin `:6071` apontam para certs exportados (não `nginx.crt` partilhado).
**Script sync:**
```bash
/opt/ligbox-deploy/scripts/admin-login-check/sync-traefik-admin-certs.sh
```
### 4.2 Redirect `/admin` :443 → :6071 (7+ domínios)
**Ficheiro:**
```nginx
# /opt/zextras/conf/nginx/extensions/backend-admin-redirect.conf
location ~* ^/admin/?$ {
return 302 https://$host:6071/static/login/;
}
```
**Aplicação:** `apply-admin-nginx-overrides.py` injecta include em cada bloco `server_name mail.*` em `nginx.conf.web.https`.
**Removido:** blocos corruptos `location = //`.
### 4.3 diarissima — bloco admin isolado
```
/opt/zextras/conf/nginx/includes/nginx.conf.web.carbonio.admin.custom
```
Include em `nginx.conf.web` (zmproxyconfgen não toca).
### 4.4 Blindagem zmproxyconfgen
| Script | Função |
|--------|--------|
| `apply-admin-nginx-overrides.py` | Re-aplica: ligbox fixes, redirect /admin, certs tenant, diarissima custom |
| `zmproxyconfgen-ligbox.sh` | Wrapper seguro: zmproxyconfgen + apply --reload |
| `/usr/local/bin/zmproxyconfgen-ligbox` | Symlink |
**Regra:** nunca correr `zmproxyconfgen` directo em produção.
### 4.5 Fixes ligbox :6071 (mantidos)
- `server_name mail.ligbox.com.br 10.10.10.112`
- Cert LE: `/opt/zextras/ssl/letsencrypt/mail.ligbox.fullchain.pem`
- Remove redirect E4 `/zx/login/supported`
- Rewrite IP → domínio em `/zx/login/v3/config`
- `Host mail.ligbox.com.br` em auth locations
- `blank.html` → 404
---
## 5. Arquitectura
```
Browser
├─ https://mail.{dominio}/admin (:443)
│ └─ nginx backend-admin-redirect.conf
│ └─ 302 → https://mail.{dominio}:6071/static/login/
└─ https://mail.{dominio}:6071/static/login/
└─ nginx carbonio.admin (+ .custom diarissima)
└─ carbonio-auth / catalog
└─ LDAP (zimbraReverseProxyAdminEnabled: TRUE no servidor)
```
**Nota LDAP:** admin activo **uma vez** no servidor `mail.ligbox.com.br` — não por domínio virtual.
---
## 6. Validação
```bash
# Redirect /admin :443
curl -skI https://mail.iofficebooks.com/admin | grep -i location
# → https://mail.iofficebooks.com:6071/static/login/
# Cert :6071
echo | openssl s_client -connect mail.betinplace.com:6071 -servername mail.betinplace.com 2>/dev/null | openssl x509 -noout -subject
# Fluxo E1E8 ligbox
cd /opt/ligbox-deploy/scripts/admin-login-check && npm run check:flow:ligbox
# Overrides pendentes
python3 apply-admin-nginx-overrides.py --check
```
---
## 7. Ficheiros alterados/criados
| Caminho | Descrição |
|---------|-----------|
| `/opt/zextras/conf/nginx/extensions/backend-admin-redirect.conf` | Redirect /admin |
| `/opt/zextras/conf/nginx/includes/nginx.conf.web.carbonio.admin.custom` | Bloco diarissima |
| `/opt/zextras/ssl/letsencrypt/traefik-export/*` | Certs 4 domínios |
| `/opt/ligbox-deploy/scripts/admin-login-check/apply-admin-nginx-overrides.py` | Patcher idempotente |
| `/opt/ligbox-deploy/scripts/admin-login-check/sync-traefik-admin-certs.sh` | Sync certs Traefik |
| `/opt/ligbox-deploy/scripts/admin-login-check/zmproxyconfgen-ligbox.sh` | Wrapper zmproxyconfgen |
---
## 8. Documentação relacionada
- `SPEC-SOLUCAO-ADMIN-LOGIN-6071.md` — admin login ligbox (NAT + nginx E1E8)
- `SPEC-ADMIN-DOMINIO-BLINDAGEM-NGINX.md` — blindagem + mapa domínios
- `ADMIN-NGINX-OVERrides-BLINDAGEM.md` — procedimento ops
- `SPEC-CARBONIO-ADMIN-LOGIN-FLOW-VALIDATION.md` — validação fluxo E1E8
---
## 9. Critérios de aceitação
- [x] 9/9 domínios: `/admin` :443 → 302 :6071
- [x] 9/9 domínios: `:6071` cert CN correcto no browser
- [x] 9/9 domínios: `:6071/static/login/` HTTP 200
- [x] diarissima bloco `.custom` activo
- [x] Script blindagem zmproxyconfgen instalado
- [x] Sync Traefik certs documentado
---
*Roger / VM112 — 2026-06-12*