Como criar servidor de email com Mailcow em VPS Linux
Guia técnico pra criar servidor email Mailcow em VPS Linux com Postfix, Dovecot, SOGo, DKIM, SPF, DMARC e painel web em menos de 1 hora.
Rodar seu próprio servidor de email deixou de ser tabu — Mailcow empacota Postfix, Dovecot, SOGo, Rspamd, ClickHouse e administração web em containers Docker isolados, eliminando 90% do trabalho de configuração manual que antigamente consumia dias. Você sobe o stack completo num VPS Linux em menos de uma hora.
Este tutorial é pra desenvolvedor ou sysadmin que precisa de email profissional sob controle próprio — sem depender de Workspace, Microsoft 365 ou Zoho. Aplicações típicas: empresa que quer caixas postais ilimitadas sem custo por usuário, SaaS que precisa de servidor SMTP transacional com reputação isolada, ou profissional técnico que valoriza privacidade de correspondência.
Tempo estimado de execução: 45-60 minutos, dos quais 15-20 minutos são propagação de DNS. O resto é instalação automatizada e configuração do domínio no painel.
Pré-requisitos
Antes de começar, você precisa ter os recursos alinhados. Email é sensível a IP, DNS reverso e portas — pular qualquer um desses pontos significa mensagens caindo em spam mesmo com TLS válido.
Mailcow recomenda 6 GB de RAM, 20 GB de disco e 2 vCPU pra operação confortável. Sistema operacional: Ubuntu 22.04/24.04 LTS ou Debian 12. Acesso root via SSH. Domínio próprio com controle de DNS (Cloudflare, Registro.br, etc).
mail.seudominio.com 25, 465, 587 143, 993, 110, 995 443 (HTTPS) 4190 Configure o registro PTR (DNS reverso) do IP do VPS apontando pro hostname escolhido antes de continuar. Em painel de provedor de VPS você encontra isso normalmente em “Rede” ou “IP reverso”. Sem PTR válido, a entrega pra Gmail e Outlook degrada drasticamente.
Confirme também que a porta 25 outbound está aberta — muitos provedores
bloqueiam SMTP saída por padrão. Teste com telnet smtp.gmail.com 25 ou
nc -vz smtp.gmail.com 25 a partir do VPS. Se der timeout, abra ticket no
suporte do provedor antes de prosseguir.
Preparar o sistema base
A primeira fase deixa o servidor pronto pra Docker e Mailcow. Trabalhamos com pacotes oficiais de cada projeto, evitando repos de terceiros.
Atualize o sistema e instale dependências básicas:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git ca-certificates gnupg lsb-releaseAtualização completa do sistema garante kernel e bibliotecas TLS recentes — crítico pra negociação de certificados Let’s Encrypt e cipher suites modernas no Postfix/Dovecot.
Instale Docker Engine seguindo o método oficial:
curl -fsSL https://get.docker.com | sudo bash
sudo systemctl enable --now dockerO script oficial detecta a distro, configura o repo apt e instala
docker-ce + docker-compose-plugin. Confirme com docker --version e
docker compose version (note: subcomando compose, sem hífen — é o
plugin v2).
Defina o hostname FQDN do servidor:
sudo hostnamectl set-hostname mail.seudominio.comEdite /etc/hosts adicionando a linha:
127.0.1.1 mail.seudominio.com mailPostfix usa o hostname do sistema pra apresentar-se em EHLO durante handshake SMTP. Hostname errado quebra rDNS check de servidores remotos.
Configure o firewall liberando as portas necessárias:
sudo ufw allow 22/tcp
sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
sudo ufw enableAntes de ativar o UFW, confirme que você consegue reconectar em outra sessão SSH. Ativar firewall sem liberar a porta 22 trava você fora do VPS.
Instalar Mailcow
Com o sistema pronto, clonamos o repositório oficial e geramos a configuração base. O setup interativo pergunta o hostname e gera as senhas aleatórias dos serviços internos.
Clone o repositório oficial em /opt:
sudo git clone https://github.com/mailcow/mailcow-dockerized /opt/mailcow-dockerized
cd /opt/mailcow-dockerizedO diretório /opt é a convenção pro stack — scripts oficiais de backup e
update assumem esse caminho. Não use /root nem /home.
Gere o arquivo de configuração:
sudo ./generate_config.shQuando perguntar pelo hostname FQDN, digite mail.seudominio.com (o mesmo
do passo 03). O script gera mailcow.conf com senhas aleatórias pro MySQL,
Redis e API. Não edite as senhas manualmente — backups dependem desses
valores.
Suba o stack completo:
sudo docker compose pull
sudo docker compose up -dO pull baixa ~3 GB de imagens (Postfix, Dovecot, SOGo, Rspamd, MySQL, Redis, ClickHouse, Nginx, ACME, Watchdog, Netfilter). O up cria todos os containers em background. Primeiro boot leva 2-3 minutos pra MySQL inicializar schemas.
Verifique que todos os containers subiram:
sudo docker compose psVocê deve ver ~15 containers com status running ou healthy. Se algum
aparecer restarting, rode sudo docker compose logs <nome-do-container>
pra investigar — comum no primeiro boot quando MySQL ainda está populando.
Configurar DNS do domínio
Mailcow está rodando, mas o domínio não chega lá ainda. Precisamos publicar 6 registros DNS: MX, A, SPF, DKIM, DMARC e autodiscover. Esses registros são o que torna o servidor confiável pros grandes provedores.
Acesse o painel pela primeira vez:
https://mail.seudominio.comLogin default: usuário admin, senha moohoo. Troque imediatamente em
Sistema → Administradores. O Mailcow já gerou certificado Let’s Encrypt
automaticamente se as portas 80 e 443 estavam acessíveis quando subiu.
Adicione o domínio em Configuração → Domínios → Adicionar domínio. Preencha:
seudominio.com 3072 MB 10 1000 Após criar o domínio, vá em Configuração → Configuração → ARC/DKIM. O Mailcow gera o par de chaves automaticamente — copie o registro TXT mostrado.
Publique os registros DNS no seu provedor (exemplo pra Cloudflare):
seudominio.com. IN A 203.0.113.10
mail.seudominio.com. IN A 203.0.113.10
seudominio.com. IN MX 10 mail.seudominio.com.
seudominio.com. IN TXT "v=spf1 mx -all"
dkim._domainkey.seudominio.com. IN TXT "v=DKIM1; k=rsa; p=MIIBI..."
_dmarc.seudominio.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
autodiscover.seudominio.com. IN CNAME mail.seudominio.com.
autoconfig.seudominio.com. IN CNAME mail.seudominio.com.Substitua 203.0.113.10 pelo IP do seu VPS e a chave DKIM pelo valor real
gerado no passo 10. Propagação leva de 5 a 30 minutos dependendo do TTL.
Comece DMARC com p=none por 1-2 semanas e monitore os relatórios em
rua=. Depois escale pra quarantine e finalmente reject quando tiver
certeza que SPF e DKIM passam pra 100% dos seus envios legítimos.
Criar caixas postais e testar
Domínio adicionado e DNS propagado, agora criamos a primeira caixa postal real e validamos o envio bidirecional.
Em Email → Caixas postais → Adicionar caixa postal, preencha usuário, domínio, nome completo, senha e quota. Repita pra cada usuário.
Acesse o webmail em https://mail.seudominio.com/SOGo/. Login com email
completo ([email protected]) + senha definida. SOGo entrega
calendário, contatos e ActiveSync pra clientes móveis sem configuração
extra.
Configure cliente desktop (Thunderbird, Outlook, Apple Mail) com auto-discovery:
os registros autodiscover e autoconfig que você publicou no DNS fazem o
cliente preencher servidores e portas sozinho. Caso configure manual:
mail.seudominio.com:993 (SSL/TLS) mail.seudominio.com:587 (STARTTLS) mail.seudominio.com:4190 (STARTTLS) Verificação
Confirme que entregabilidade está saudável antes de migrar caixas postais reais ou rotear domínio em produção.
Envie email de teste pra um endereço Gmail e cheque o cabeçalho da mensagem recebida (no Gmail: três pontos → “Mostrar original”). Procure as linhas:
spf=pass
dkim=pass
dmarc=pass
Se algum aparecer fail ou neutral, há erro de DNS — revise SPF, DKIM e
PTR. Uma alternativa rápida é mandar email pra [email protected],
que retorna relatório detalhado em segundos.
Teste recepção mandando do Gmail pro endereço no seudominio.com. Confira se chega na inbox (não em spam). Se cair em spam, o problema costuma ser PTR ausente ou IP do VPS em blocklist — verifique em mxtoolbox.com/blacklists.
Resolução de problemas
Containers ficam reiniciando
Causa comum: MySQL não conseguiu inicializar por falta de RAM. Rode
free -h e confirme que tem ao menos 4 GB livres. Se o VPS tem 4 GB total
e memória já foi consumida, aumente swap:
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
Adicione /swapfile none swap sw 0 0 em /etc/fstab pra persistir.
Let’s Encrypt não emite certificado
Verifique no log do container ACME:
sudo docker compose logs acme-mailcow
Causas frequentes: porta 80 bloqueada por firewall externo, registro A de
mail.seudominio.com ainda não propagado, ou rate limit do Let’s Encrypt
(50 emissões/semana por domínio raiz).
Emails saem mas caem em spam
Cheque o PTR com dig -x SEU_IP +short. Resultado precisa retornar
mail.seudominio.com. exatamente — não o hostname genérico do provedor.
Se estiver errado, ajuste no painel do provedor de VPS. Propagação leva
até 24h.
Próximos passos
Com o servidor rodando, considere:
- Configurar backup automatizado com
helper-scripts/backup_and_restore.shdo próprio repositório Mailcow, agendado via cron diário pra um destino externo (S3 compatível ou outro VPS). - Habilitar 2FA no painel admin em Configuração → Administradores → Editar → Two-factor authentication (suporta TOTP e Yubikey).
- Migrar caixas postais antigas via Sync Jobs (Email → Configuração → Sync jobs) — conecta no IMAP origem e replica preservando flags.
- Ajustar limites de envio por domínio conforme reputação cresce — começar com 500/dia e subir gradualmente até 5000/dia.
Se você está colocando isso em produção e quer porta 25 já liberada, PTR configurável pelo painel e suporte técnico em português, uma VPS Hostini entrega o ambiente Linux pronto pra rodar Mailcow sem fricção com bloqueios de provedor.
Perguntas frequentes
Mailcow funciona em VPS de 2 GB de RAM?
Tecnicamente sobe, mas o Rspamd e o ClickHouse engasgam sob carga real. O mínimo recomendado oficial é 6 GB de RAM e 20 GB de disco. Pra produção com 5+ caixas postais ativas, considere 8 GB e SSD NVMe — o ClickHouse faz I/O intensivo de logs.
Posso instalar Mailcow ao lado de outros serviços no mesmo VPS?
Não recomendado. Mailcow ocupa portas 25, 465, 587, 110, 143, 993, 995, 80, 443 e 4190, além de assumir o Docker daemon. Conflitos com Nginx/Apache locais são frequentes. Use VPS dedicado pro stack de email.
Por que minha porta 25 está bloqueada e como libero?
Provedores de nuvem bloqueiam SMTP outbound (porta 25) por padrão pra mitigar spam. Você precisa abrir ticket no provedor pedindo desbloqueio, justificando o uso (servidor de email transacional próprio). Sem isso, Mailcow recebe mas não envia.
Mailcow gera os registros DKIM automaticamente?
Sim. Após adicionar o domínio no painel (Configuração → Domínios), o Mailcow gera o par de chaves DKIM e mostra o registro TXT pra publicar no DNS. O seletor padrão é dkim. Você só copia e cola no seu provedor de DNS.
Como migrar caixas postais existentes pro Mailcow?
Use a função Sync Jobs do painel (Email → Configuração → Sync jobs). Mailcow conecta no IMAP origem e replica mensagens preservando flags e estrutura de pastas. Funciona com Gmail, Outlook, qualquer servidor IMAP — desde que você tenha senha de app/IMAP habilitado.
Preciso de IP reverso (PTR) configurado?
Sim, obrigatório. Sem PTR válido apontando pro hostname do servidor (mail.seudominio.com), Gmail, Outlook e a maioria dos grandes provedores rejeitam ou marcam como spam. Configure o PTR no painel do provedor de VPS antes de enviar o primeiro email.