# Quickstart: Migração de E-mail (013)

**Público:** Técnicos Ligbox (ops_lead, technician)  
**Pré-requisito:** Conta destino já criada no Carbonio (wizard VM112 ou zmprov)

---

## Regra operacional

> **Nunca alterar MX/DNS até `migration_gate = ready_for_dns`.**  
> Sync inicial e deltas correm **com MX ainda no servidor antigo**.

---

## 1. Instalar ferramentas (uma vez por host worker)

```bash
cd /opt/ligbox-ops-platform
sudo ./scripts/install-migration-tools.sh
```

Conteúdo esperado:
- `/usr/bin/imapsync`
- `/usr/bin/readpst`
- `/opt/migration-tools/imap-upload/imap_upload.py`

---

## 2. Criar job no Desk

1. Login Desk → **Email Migration** → **Novo job**
2. Preencher:
   - Domínio: `cliente.com.br`
   - Tenant: VM112
   - Ticket: #123 (onboarding ou migração dedicado)
   - Servidor origem: label descritivo
3. Adicionar mailboxes:

| E-mail | Tipo origem | Host origem |
|--------|-------------|-------------|
| admin@cliente.com.br | imap | imap.hostantigo.com |
| vendas@cliente.com.br | pst | (upload ficheiro) |

---

## 3. Preflight

```bash
# API
curl -s -X POST "http://10.10.10.122:8080/api/v1/migration/jobs/1/preflight" \
  -H "Authorization: Bearer $TOKEN"
```

Ou botão **Preflight** na UI.

Verificar: credenciais OK, pastas listadas, destino acessível.

---

## 4. Sync inicial (SEM DNS)

**IMAP:**
```bash
curl -s -X POST "http://10.10.10.122:8080/api/v1/migration/jobs/1/sync" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"run_type":"initial"}'
```

**PST (após upload na UI):**
- Worker executa automaticamente: `readpst` → `imap-upload`
- Erros em **Quarentena** — rever antes do gate

Repetir **delta** a cada 6–24h até contagem estabilizar.

---

## 5. Verificação

```bash
curl -s "http://10.10.10.122:8080/api/v1/migration/jobs/1/verify" \
  -H "Authorization: Bearer $TOKEN" | python3 -m json.tool
```

Critérios:
- Ratio mensagens ≥ **99%**
- Inbox e Sent = **100%**
- PST: 0 erros críticos em quarentena

---

## 6. Aprovar gate (ops_lead)

```bash
curl -s -X POST "http://10.10.10.122:8080/api/v1/migration/jobs/1/approve-gate" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"comment":"Cliente validou amostra 10/06"}'
```

Estado passa a `ready_for_dns`.

---

## 7. Cutover DNS (só agora)

1. Baixar TTL MX (se possível, 24h antes)
2. Alterar MX no Cloudflare / pfSense
3. Sync **final** no Desk
4. Validar recepção no Carbonio
5. Fechar ticket + fase `closed`

---

## Comandos manuais (debug)

### imapsync directo

```bash
imapsync \
  --host1 imap.origem.com --user1 user@dominio.com --password1 '***' \
  --host2 mail.destino.com --user2 user@dominio.com --password2 '***' \
  --ssl1 --ssl2 --automap --dry
```

### PST manual

```bash
mkdir -p /tmp/mbox
readpst -o /tmp/mbox -r arquivo.pst
python3 /opt/migration-tools/imap-upload/imap_upload.py \
  --ssl --host mail.destino.com --user user@dominio.com --password '***' \
  --error /tmp/errors.mbox -r /tmp/mbox
```

### TGZ Zimbra→Carbonio

```bash
su - zextras -c "zmmailbox -z -m user@dominio.com getRestURL '/?fmt=tgz'" > user.tgz
# transferir para destino
su - zextras -c "zmmailbox -z -m user@dominio.com postRestURL '/?fmt=tgz&resolve=skip' /path/user.tgz"
```

---

## Troubleshooting

| Sintoma | Acção |
|---------|-------|
| Gate blocked, ratio 95% | Correr delta; verificar pasta com erro no log imapsync |
| PST partial | Abrir quarentena ERR_MBOX; re-upload pasta falhada |
| O365 auth fail | Usar OAuth2 (oauth2_imap), não password |
| Duplicatas | imapsync usa Message-Id; não misturar upload manual + imapsync mesma pasta |
| DNS virado cedo | Sync final + contactar origem forwarding |

---

## Referências

- [spec.md](./spec.md)
- [research.md](./research.md) — ferramentas avaliadas
- imapsync FAQ: https://imapsync.lamiral.info/FAQ.d/FAQ.Folders_Mapping.txt
