Stalwart: Servidor de Email All-in-One Self-Hosted
✎ Duarte Spínola |
Montar um servidor de correio sempre foi montar vários: Postfix para SMTP, Dovecot para IMAP, OpenDKIM, SpamAssassin, e as peças todas a conversar. O Stalwart junta tudo num único binário em Rust: SMTP com SPF, DKIM, DMARC e ARC integrados, IMAP4rev2, POP3 e JMAP, calendários CalDAV, contactos CardDAV e ficheiros WebDAV, filtro de spam embutido, e uma interface web de administração com wizard de setup que, quando se escolhe um provider DNS no passo 5, publica os registos sozinho. Dual-licensed (AGPL-3.0 e Stalwart Enterprise License v2), e a v0.16.23 é a última release de Setembro de 2026.
O guia instala o Stalwart em Linux, passa o wizard, publica o DNS e valida a entrega.
Neste artigo
- O que o Stalwart junta num binário
- Instalar em Linux
- O wizard de configuração
- DNS: SPF, DKIM, DMARC e MTA-STS
- Contas e clientes
- Stalwart ou Mailcow?
1. O que o Stalwart junta num binário
O servidor cobre todo o ciclo do correio num processo: SMTP com DMARC, DKIM (v1 e a v2 em draft), SPF e ARC para autenticação de mensagens, e transporte seguro por DANE, MTA-STS e TLS-RPT. IMAP4rev2 e POP3 servem os clientes clássicos, e JMAP — o protocolo moderno do correio, com extensões WebSocket e quotas — para os clientes novos. A colaboração vem com CalDAV (agendas e scheduling), CardDAV (contactos) e WebDAV (ficheiros) com partilha e ACLs.
O filtro de spam vem embutido: regras comparáveis às soluções populares, classificador estatístico com treino automático e integração com a agenda de endereços, DNS blocklists, Pyzor, e detecção de phishing por homografia de URLs e spoofing. Os Sieve scripts filtram do lado do servidor, com ManageSieve para os utilizadores editarem regras.
2. Instalar em Linux
O instalador oficial descarrega a última release, cria a conta de serviço stalwart, e segue o Filesystem Hierarchy Standard:
sudo sh install.sh
Os caminhos ficam assim: binário em /usr/local/bin/stalwart, configuração em /etc/stalwart/config.json, variáveis de ambiente em /etc/stalwart/stalwart.env, dados em /var/lib/stalwart/ e logs em /var/log/stalwart/. Em hosts com /opt em volume separado, sudo sh install.sh /opt/stalwart desloca tudo para esse prefixo. O build por omissão traz suporte a SQLite, PostgreSQL, MySQL, RocksDB, S3, Azure Blob, Redis e NATS.
⚠ ⚠️ Atenção
O servidor precisa de saída HTTPS na altura da instalação — o script descarrega a release do GitHub — e das portas de correio abertas no firewall: 25/TCP (SMTP entre servidores), 465/TCP (submission implicit TLS) e 587/TCP (submission STARTTLS) para enviar, e 143/TCP com 993/TCP (IMAP) para os clientes receberem; a 8080 serve a admin durante o setup e a 443 é o HTTPS público.
3. O wizard de configuração
No arranque inicial o Stalwart entra em bootstrap mode: gera uma conta de administrador temporária com password aleatória, mostrada uma única vez em stderr:
Com a password em mão, o wizard abre em http://<host>:8080/admin (login admin), e são cinco ecrãs:
- Server identity — hostname público (
mail.empresa.pt), domínio de email por omissão (empresa.pt), pedido de certificado Let’s Encrypt por ACME e geração das chaves DKIM, todos activos por omissão e recomendados - Storage — quatro lojas independentes (dados, anexos, índice de pesquisa, cache), todas em RocksDB local por omissão, com PostgreSQL, MySQL, SQLite, S3/Azure, Elasticsearch, Meilisearch e Redis para escala
- Account directory — directório interno (o mais simples) ou OIDC/LDAP/SQL para SSO com a identidade existente
- Logging — destino dos logs e tracing
- DNS — gestão manual dos registos ou integração automática com o provider (Cloudflare, AWS Route 53, Google e outros)
No fim do wizard, o último ecrã mostra o endereço de email e a password do administrador permanente — aparece uma única vez e não fica nos logs depois. Aplicar o ecrã pede sudo systemctl restart stalwart para a configuração nova entrar em vigor, e só depois do restart a admin responde em https://<hostname>/admin (enquanto o TLS ou o DNS do hostname não estiverem em posição, em http://<host>:8080/admin).
Assim que a admin HTTPS responder, fechar a porta de gestão: na WebUI, desactivar o listener HTTP da 8080 e remover a variável STALWART_RECOVERY_ADMIN de /etc/stalwart/stalwart.env, com um restart ao serviço. A doc oficial inclui este passo no checklist de segurança — sem ele, a admin HTTP continua a aceitar logins.
4. DNS: SPF, DKIM, DMARC e MTA-STS
Com a gestão automática de DNS activada (passo 5 do wizard), o Stalwart publica e mantém sozinho o conjunto completo: MX, SPF, DKIM, DMARC, SRV, MTA-STS, TLS-RPT, autoconfig e autodiscover — a integração usa a API do provider (Cloudflare, Route 53, entre outros) e re-sincroniza as alterações de configuração.
Em gestão manual, o conjunto completo sai como zone file pronto a importar: na admin UI, Management → Domains → Domains → (domínio) → zone file — ou via CLI:
stalwart-cli get domain <id> --fields dnsZoneFile
A rotação das chaves DKIM é automática, e os relatórios DMARC recebidos leem-se na secção Reports da admin UI. A secção de segurança do dashboard resume as métricas de autenticação das mensagens que entram e saem.

Dashboard Overview do Stalwart: utilizadores, domínios, memória e tráfego de mensagens recebidas (verde) e enviadas (azul) nas últimas 24 horas (imagem oficial do projecto).
5. Contas e clientes
Com o directório interno, as contas criam-se na admin UI (Directory → Accounts): endereço, quotas, aliases e grupos. Os clientes ligam-se por IMAP/SMTP com os hosts standard — os registos autoconfig/autodiscover publicados fazem o Thunderbird e os Outlook novos descobrir os servidores sozinhos —, ou por JMAP nos clientes que o suportam. As agendas e os contactos aparecem nos clientes CalDAV/CardDAV (o Apple Calendar e o DAVx⁵ no Android ligam sem configuração extra).
Para testar a entrega de ponta a ponta: enviar de e para fora, e confirmar no cabeçalho Authentication-Results da mensagem recebida os resultados spf=pass, dkim=pass e dmarc=pass — os três verdes são o critério de sucesso da secção de DNS.
6. Stalwart ou Mailcow?
O Mailcow empacota o stack clássico (SOGo, Dovecot, Postfix, Rspamd) em Docker com uma UI madura. Pesa mais e depende de vários containers. O Stalwart é um binário único em Rust com footprint mínimo, JMAP nativo e a camada de colaboração incluída — a escolha mais moderna para instalações novas, com o trade-off de uma comunidade mais jovem. Ambos cobrem o mesmo protocolo-base, e a decisão cai no peso e no ecossistema.
Erros Comuns
| Erro | Causa provável | Correcção |
|---|---|---|
| A password de bootstrap não aparece | O log já rodou | Definir credenciais fixas em /etc/stalwart/stalwart.env — descomentar STALWART_RECOVERY_ADMIN com user:password — e reiniciar; se a admin HTTP estiver desactivada, arrancar em recovery mode com STALWART_RECOVERY_MODE=1 |
| O wizard não abre na 8080 | Firewall local | Abrir a 8080/TCP (ou usar 127.0.0.1:8080 por SSH tunnel) |
| Admin dá 404 após upgrade para a 0.16 | A WebUI nova descarrega-se do GitHub em tempo de execução (relatos em Docker e upgrades 0.15→0.16) | Verificar a saída HTTPS do servidor para github.com e reiniciar; em último caso arrancar com STALWART_RECOVERY_MODE=1 para recuperar o acesso |
| Emails a cair no spam | DKIM/DMARC não publicados | Gerar o zone file (stalwart-cli get domain …) e publicar os registos |
| Certificado TLS não sai | Sem provider DNS no passo 5, a challenge TLS-ALPN-01 exige a 443/TCP acessível e sem proxy interposto; com provider configurado, a DNS-01 não precisa de portas abertas | Abrir a 443/TCP directamente ao Let’s Encrypt durante a emissão, ou escolher um provider DNS no passo 5 do wizard |
| Entrega falha a servidores externos | IP do VPS em blocklist | Verificar DNSBL no filtro e pedir remoção ao operador |
Checklist
- [ ] Servidor com IP público e portas 25, 465, 587, 143 e 993 abertas (443 para o HTTPS público)
- [ ] Hostname
mail.empresa.ptcom DNS apontado - [ ] Instalador oficial executado e serviço activo
- [ ] Password de bootstrap obtida e wizard concluído
- [ ] TLS ACME e chaves DKIM geradas
- [ ] Zone file publicado (MX, SPF, DKIM, DMARC, MTA-STS)
- [ ] Contas criadas e clientes ligados
- [ ] Entrega validada (
spf=pass dkim=pass dmarc=pass) - [ ] Backup de
/var/lib/stalwart/agendado
Artigos Relacionados
- SPF, DKIM e DMARC: Configurar em 3 Passos — o fundamento de autenticação de email
- MTA-STS e TLS-RPT: Forçar TLS no Email — o transporte seguro que o Stalwart implementa
- Postfix: Relay Autenticado para Envio de Email — o servidor de envio clássico
- Mattermost: Chat Self-Hosted para Equipas — o chat que complementa o correio