217 lines
7.1 KiB
Markdown
217 lines
7.1 KiB
Markdown
# 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 E1–E8 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 E1–E8)
|
||
- `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 E1–E8
|
||
|
||
---
|
||
|
||
## 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*
|