ligbox-ops-platform/specs/013-email-server-migration/research.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

186 lines
8 KiB
Markdown

# Research: Ferramentas de Migração de E-mail (013)
**Data:** 2026-06-10
**Autor:** Cursor Agent (para Roger)
**Objetivo:** Seleccionar stack open-source com precisão, suporte a múltiplos formatos e operação **antes** do cutover DNS.
---
## Critérios de avaliação
| Critério | Peso | Descrição |
|----------|------|-----------|
| **Integridade** | P0 | Sem perda de mensagens; sem duplicatas; preservar pastas |
| **Retomável** | P0 | Sync incremental; reinício após falha |
| **Formatos** | P0 | IMAP, PST, mbox, EML, TGZ (Zimbra/Carbonio) |
| **Verificação** | P0 | Contagens, logs, comparadores |
| **Produção** | P1 | Usado em migrações reais; manutenção activa |
| **OAuth/M365** | P1 | Office 365 / Google modernos |
| **Licença** | P1 | Open source ou uso comercial permitido |
---
## Matriz de ferramentas (decisão)
### 1. IMAP → IMAP (servidor a servidor) — **PRIMÁRIO**
| Ferramenta | Repo / URL | Stars | Veredito |
|------------|------------|-------|----------|
| **imapsync** | https://github.com/imapsync/imapsync | ~4k | ✅ **Escolhido — motor principal** |
| doveadm backup/sync | https://doc.dovecot.org/latest/core/admin/migration.html | — | ✅ Secundário se origem/destino Dovecot |
| offlineimap / mbsync | vários | — | ❌ Menos adequado a migração one-way em massa |
**Porquê imapsync:**
- Padrão de facto para migração IMAP entre fornecedores (cPanel, Zimbra, O365, Gmail → Carbonio).
- Sync **incremental e recursivo** — pode correr dias antes do DNS.
- Evita duplicatas; retomável.
- Suporte OAuth2 via `oauth2_imap` (site oficial imapsync.lamiral.info).
- Documentação extensa (FAQ, casos Exchange/Gmail).
**Quando doveadm:**
- Ambos os lados Dovecot/Carbonio com acesso admin.
- Verificação UIDL mais rigorosa (documentação Dovecot recomenda `diff` manual).
---
### 2. PST / OST (Microsoft Outlook) — **PIPELINE OFICIAL**
| Etapa | Ferramenta | Repo / pacote | Veredito |
|-------|------------|---------------|----------|
| PST → mbox | **readpst** (libpst) | `pst-utils` / https://www.five-ten-sg.com/libpst/ | ✅ Extracção battle-tested |
| mbox → IMAP | **imap-upload** | https://github.com/rgladwell/imap-upload (~148⭐) | ✅ Upload para Carbonio via IMAP |
| Wrapper moderno | **pst2mbox** | https://github.com/beaufour/pst2mbox | ✅ Progress bar, resumível, arquitectura modular |
**Pipeline Ligbox (PST):**
```
.pst → readpst -o mbox -r arquivo.pst
→ imap-upload.py --ssl --host mail.destino --user conta@dominio ...
→ validação contagem + amostra
```
**Riscos PST (mitigação na spec):**
- PST corrompido → `readpst` com log; quarentena em `ERR_MBOX` (flag `--error` do imap-upload).
- RTF vs HTML → não usar `-b` em PST antigos (pré-2010).
- Pastas Outlook → mapear estrutura `readpst` para IMAP com prefixo `INBOX.`.
- **Não** depender só de drag-and-drop Outlook (manual, não auditável).
**pst2mbox** recomendado como wrapper futuro (Fase B) — encapsula readpst + upload com progresso.
---
### 3. Zimbra / Carbonio (mesma família) — **NATIVO**
| Método | Comando | Veredito |
|--------|---------|----------|
| Export TGZ | `zmmailbox -z -m user getRestURL '/?fmt=tgz'` | ✅ Bulk, preserva metadados |
| Import TGZ | `zmmailbox -z -m user postRestURL "/?fmt=tgz&resolve=skip" ficheiro.tgz` | ✅ Destino Carbonio |
| IMAP fallback | imapsync | ✅ Zimbra antigo → Carbonio novo |
**Ordem Zextras Community (referência):**
1. Criar contas no destino
2. **Migrar dados (TGZ ou imapsync)**
3. **Só depois** alterar MX/DNS
4. Sync final pós-DNS
Fonte: [Zimbra → Carbonio CE migration](https://community.zextras.com/how-to-use-script-to-migrate-zimbra-to-carbonio-carbonio-ce/)
---
### 4. mbox / EML avulso
| Ferramenta | Uso |
|------------|-----|
| imap-upload | mbox → IMAP Carbonio |
| `zmmailbox addMessage` | EML individual no Carbonio (admin) |
| ImportExportTools NG (Thunderbird) | Fallback manual auditado |
---
### 5. Office 365 / Gmail
| Ferramenta | Notas |
|------------|-------|
| imapsync + oauth2_imap | O365 exige OAuth; não usar password básica |
| imap-upload `--office365` / `--gmail` | Upload mbox para destinos cloud |
---
### 6. Ferramentas comerciais (referência — **fora do MVP**)
| Ferramenta | Motivo exclusão MVP |
|------------|---------------------|
| BitRecover / Advik / TrustVare | Fechadas; sem API; sem integração Desk |
| MailStore | Trial; possível Fase C para auditoria legal |
---
## Stack aprovada para Spec 013
```
┌─────────────────────────────────────────────────────────────────┐
│ Ligbox Ops — Migration Orchestrator │
│ (VM122 API + Worker) │
└────────────────────────────┬────────────────────────────────────┘
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────────┐ ┌──────────────┐
│ imapsync│ │ readpst │ │ zmmailbox │
│ (IMAP) │ │ + imap-upload│ │ tgz export/ │
│ │ │ (PST/mbox) │ │ import │
└────┬────┘ └──────┬──────┘ └──────┬───────┘
│ │ │
└──────────────────────┼───────────────────────┘
┌─────────────────┐
│ Carbonio VM112 │
│ (destino IMAP) │
└─────────────────┘
┌────────▼────────┐
│ GATE: DNS OK │ ← só após migration_gate=ready
└─────────────────┘
```
---
## Verificação de integridade (obrigatória)
| Check | Ferramenta / método |
|-------|---------------------|
| Contagem mensagens por pasta | imapsync log + IMAP `STATUS` / `SEARCH ALL` |
| Contagem global | Script Python `migration_verify.py` (a criar) |
| Amostra corpo/anexos | 5 msgs aleatórias por pasta crítica |
| UIDL (Dovecot) | `doveadm fetch -u user uidl` + diff |
| PST | `readpst -S` stats vs destino |
| Falhas upload | `ERR_MBOX` do imap-upload preservado |
**Regra:** `migration_gate` **bloqueia** cutover DNS se `messages_dest < messages_source * 0.99` ou checks críticos falharem.
---
## Dependências de sistema (worker VM122 ou jump host)
```bash
# Debian/Ubuntu
apt-get install -y imapsync pst-utils python3 python3-pip
pip3 install pst2mbox # Fase B opcional
# imap-upload
git clone https://github.com/rgladwell/imap-upload.git /opt/migration-tools/imap-upload
```
**Carbonio (VM112):** `zmmailbox`, `zmprov` — já presentes.
---
## Referências
- imapsync: https://github.com/imapsync/imapsync · https://imapsync.lamiral.info/
- Dovecot migration: https://doc.dovecot.org/latest/core/admin/migration.html
- imap-upload: https://github.com/rgladwell/imap-upload
- pst2mbox: https://github.com/beaufour/pst2mbox
- libpst/readpst: https://www.five-ten-sg.com/libpst/
- Carbonio PST forum: https://community.zextras.com/forum/carbonio-general-thread/importing-outlook-pst-files-into-carbonio/
- Zimbra→Carbonio SOP: https://community.zextras.com/how-to-use-script-to-migrate-zimbra-to-carbonio-carbonio-ce/