SSD Nodes Learn
Guias Matt ConnorPor Matt Connor · Atualizado 2026-07-24

Como instalar mailcow em VPS para o Gmail

Evite erros de entrega no Gmail. Verifique a porta 25 antes de instalar o mailcow e configure o DNS para evitar o erro 550 5.7.25 PTR ao enviar e-mails.

O que você está construindo

Um servidor de e-mail completo em um servidor próprio: SMTP para envio e recebimento, IMAP para sincronização entre celular e laptop, um cliente webmail e um filtro de spam que avalia cada mensagem em ambos os sentidos. O mailcow-dockerized agrupa Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis e um cliente ACME em um único stack Docker Compose, portanto o software não é a parte difícil. Você o terá funcionando em meia hora.

A parte difícil é tudo o que envolve o servidor. O e-mail é o único serviço no qual o restante da internet desconfia ativamente de um servidor novo, e a diferença entre "funciona" e "o Gmail descarta silenciosamente cada mensagem" depende de quatro registros DNS e uma configuração de reputação de IP que você pode não controlar totalmente. Leia os pré-requisitos abaixo antes de contratar qualquer serviço. Se, após lê-los, você decidir que o trabalho de reputação não vale a pena, essa é uma resposta legítima — nossa análise sobre o que realmente vale a pena hospedar por conta própria em 2026 lista e-mails sob "apenas se você estiver falando sério" exatamente por esses motivos.

Os pré-requisitos SÃO o projeto

Se faltar qualquer um destes itens, você enviará e-mails que nunca chegarão. Abaixo, em ordem aproximada de frequência de erro:

A porta de saída 25 deve estar aberta. Seu servidor entrega e-mails para Gmail e Microsoft via TCP porta 25. Muitos provedores de VPS e cloud bloqueiam a porta 25 de saída por padrão para combater spam. O bloqueio é silencioso — nenhum erro aparece no boot, tudo parece normal, mas o e-mail fica parado na fila para sempre. Teste antes de instalar qualquer coisa. Se estiver bloqueada, a única solução é abrir um ticket de suporte solicitando a abertura; alguns provedores liberam para contas antigas, outros nunca liberam.

Um IP limpo com reputação utilizável. IPs de VPS reciclados frequentemente já estão em blocklists devido ao spam de usuários anteriores. Verifique o seu em serviços como Spamhaus lookup ou mxtoolbox antes de começar. Um IP em blocklist causará rejeições que não podem ser resolvidas via código.

Controle de DNS e um registro PTR correto. Você precisa adicionar registros à zona do seu domínio e precisa de DNS reverso (PTR) para o IP do servidor apontando para o seu hostname de e-mail. O PTR quase nunca é configurado no seu painel de DNS — ele é gerenciado por quem detém o IP, portanto, deve ser configurado no painel de controle do seu provedor de VPS ou via ticket.

6 GiB de RAM e 2 vCPU é o mínimo confortável. O mínimo do próprio mailcow é 6 GiB de RAM mais 1 GiB de swap para instalações privadas; recomenda-se 8 GiB assim que houver vários usuários. Abaixo de aproximadamente 2.5 GiB, o generate_config.sh oferece a opção de desativar o scanner de vírus ClamAV para evitar que o kernel encerre os containers. Reserve 20 GB de SSD para começar.

Um nome de DNS, não apenas um IP. Escolha um hostname como mail.example.com. Esse nome único será o seu MAILCOW_HOSTNAME, o subject do seu certificado TLS, o alvo do seu PTR e o seu banner SMTP. Mantenha-o consistente em todos os lugares.

Passo 1 — Verifique se a porta 25 de saída está aberta

Faça isso primeiro. Qualquer outra ação será perda de tempo se este teste falhar. A partir da VPS recém-instalada, tente abrir uma conexão SMTP com um servidor de e-mail real:

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25

Um resultado bem-sucedido é imediato:

Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!

Uma porta bloqueada aguarda os cinco segundos completos e depois falha:

nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress

Esse timeout indica o bloqueio. Trata-se de um filtro de rede do provedor, não do seu firewall; portanto, nenhuma alteração local resolverá o problema. Abra um chamado: "Por favor, habilitem a porta TCP 25 de saída para minha VPS no IP <IP>; estou operando um servidor de e-mail legítimo." Não instale o mailcow até que este teste retorne "succeeded". Note que a porta 25 de entrada (outros servidores conectando-se a você) é um caminho separado e geralmente está aberta — o que os provedores limitam é o tráfego de saída.

Passo 2 — Configure os registros DNS agora

Alterações de DNS levam tempo para propagar. Publique tudo o que for possível antes da instalação. Considere que seu domínio é example.com, seu host de e-mail é mail.example.com e o IP é 10.0.0.10. Em sua zona, crie:

mail.example.com.        A      10.0.0.10
mail.example.com.        AAAA   2001:db8::10          ; only if you have IPv6
example.com.             MX  10 mail.example.com.
example.com.             TXT    "v=spf1 mx -all"
_dmarc.example.com.      TXT    "v=DMARC1; p=none; rua=mailto:postmaster@example.com"

O registro SPF define que "apenas meu MX pode enviar e-mails para este domínio; rejeite o restante". Inicie o DMARC em p=none para monitorar os relatórios sem rejeitar seus próprios e-mails; mude para p=quarantine e depois para p=reject assim que o alinhamento for comprovado. Dois registros ainda estão faltando propositalmente: DKIM, que o mailcow gera no Passo 6, e PTR, que você deve configurar agora no painel do seu provedor.

Configure o PTR (DNS reverso) para 10.0.0.10 como mail.example.com — o valor exato de MAILCOW_HOSTNAME. Este é o registro que a maioria das pessoas esquece e grandes provedores o rejeitam. Se o seu painel não possuir um campo de rDNS, abra um chamado.

Passo 3 — Instalar Docker

o mailcow precisa do Docker Engine com o plugin Compose v2. Use o script de conveniência oficial do Docker em vez do pacote docker.io do Ubuntu, que não inclui o plugin Compose:

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

Você deve ver uma linha Docker Compose version v2.x. Se docker compose version imprimir docker: 'compose' is not a docker command, o Docker Engine está instalado, mas o plugin Compose não. Instale o plugin a partir do repositório do Docker — execute o script acima novamente ou siga o nosso guia de conceitos básicos do Docker Compose, que configura ambos a partir do repositório apt do próprio Docker.

Passo 4 — Clone o mailcow e gere a configuração

cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.sh

Verifique se umask exibe 0022 primeiro — o mailcow falha na build se a máscara de arquivos estiver incorreta, e um shell root limpo no Ubuntu 24.04 já fornece 0022. O script então solicitará o único dado essencial: o hostname totalmente qualificado (FQDN). Digite mail.example.com — o valor deve ser idêntico ao seu registro A e ao seu PTR. O processo criará o mailcow.conf, o único arquivo de ambiente que toda a stack utiliza. Abra-o se precisar alterar as portas web (HTTP_PORT, HTTPS_PORT) ou desativar o ClamAV em máquinas com poucos recursos:

MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n          # set to y to drop the virus scanner on a <2.5 GiB box

SKIP_FTS=y é outra opção para máquinas com pouca RAM: a busca de texto completo é o segundo maior consumo de memória mencionado na documentação do mailcow, e desativá-la apenas remove a busca por corpo de texto no webmail.

Mantenha HTTP_PORT=80 e HTTPS_PORT=443 como estão, a menos que outro serviço no host já os utilize — o cliente ACME nativo do mailcow precisa da porta 80 acessível pela internet para obter o certificado. É por isso que você não deve rodar uma configuração separada de nginx-plus-Certbot na mesma máquina; o mailcow emite e renova seu próprio TLS internamente, e um segundo serviço ocupando as portas 80/443 impede esse funcionamento.

Passo 5 — Iniciar o stack e fazer login

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

O pull baixa aproximadamente duas dezenas de imagens; aguarde alguns minutos. Quando docker compose ps mostrar todos os containers running (ou healthy), abra https://mail.example.com no navegador. O login padrão do admin é o usuário admin e a senha moohoo. Altere essa senha imediatamente na interface administrativa em Access → Administrators. Se o navegador exibir o aviso NET::ERR_CERT_AUTHORITY_INVALID, o certificado ACME ainda não foi emitido — verifique a falha do ACME abaixo antes de assumir que o sistema está quebrado; um placeholder autoassinado é normal nos primeiros um ou dois minutos.

Passo 6 — Adicionar um domínio, uma caixa de e-mail e publicar o DKIM

Na interface de administração, abra a página Mail Setup (Configuration → Mail Setup). Na aba Domains, clique em Add domain e insira example.com. Em seguida, em Mailboxes, clique em Add mailbox para criar you@example.com com uma senha. Esta caixa de e-mail já estará funcional e acessível via IMAP.

Agora o DKIM. Vá em Configuration → ARC/DKIM keys; o mailcow pode já ter gerado uma chave ao adicionar o domínio. Se não, gere uma nova: selecione o domínio, mantenha o selector dkim, escolha 2048-bit e clique em Add. Copie o valor TXT longo exibido e publique-o como:

dkim._domainkey.example.com.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"

A página Domains do mailcow possui um botão DNS que lista todos os registros esperados e mostra um check verde ou um X vermelho para o que está publicado. Use-o como checklist — garanta que todas as linhas estejam verdes antes de testar a entrega. Uma linha DKIM vermelha após a publicação geralmente significa que a chave foi dividida incorretamente em fragmentos TXT; uma chave de 2048-bit é maior que o limite de 255 caracteres para uma única string TXT, portanto, cole-a como um único valor lógico e deixe que seu host de DNS a divida em fragmentos automaticamente.

Passo 7 — Teste a entregabilidade e busque 10/10

Acesse mail-tester.com, copie o endereço aleatório exibido e envie uma mensagem para ele a partir da sua nova conta — faça login no webmail SOGo em https://mail.example.com/SOGo e envie por lá. Em seguida, clique em "Then check your score".

Busque a pontuação 10/10. Deduções comuns e suas causas:

  • SPF not aligned — o registro MX/SPF está ausente ou o IP de envio não está coberto. Verifique novamente o TXT do SPF.
  • DKIM signature does not verify — o TXT dkim._domainkey está ausente, ainda em propagação ou corrompido. Este é o erro mais comum.
  • No PTR / PTR mismatch — o DNS reverso não resolve para mail.example.com. Corrija no provedor.
  • Listed on a blocklist — reputação anterior do seu IP. Solicite o delisting ou peça um IP limpo.

Não envie e-mails reais para Gmail ou Outlook até que a pontuação seja 10/10. Uma pontuação baixa somada a um IP novo fará seu domínio ser marcado no primeiro dia.

Passo 8 — Conectar um cliente de e-mail real

Configure o Thunderbird, Apple Mail ou seu celular para usar o servidor com estas configurações. O host do servidor é mail.example.com para todos eles:

  • IMAP: porta 993, SSL/TLS (ou 143 com STARTTLS)
  • SMTP submission: porta 465, SSL/TLS (ou 587 com STARTTLS)
  • Username: o endereço completo, you@example.com
  • Password: a senha da caixa de correio que você definiu

Nunca envie e-mails de clientes pela porta 25 — essa porta é apenas para comunicação server-to-server. O mailcow não oferece submission autenticado nela, e conexões de clientes serão recusadas. Se o cliente reportar Relay access denied, ele está tentando enviar pela porta 25 ou sem autenticação; altere para 465 ou 587 usando suas credenciais de e-mail.

Passo 9 — Faça backup do que realmente importa

O mailcow inclui um script de backup que tira snapshots de todos os volumes com estado (stateful). Execute-o para um disco externo ou um ponto de montagem remoto:

sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
  ./helper-scripts/backup_and_restore.sh backup all

O all captura seis itens, e a perda de qualquer um deles resulta em perda de dados: vmail (as caixas de e-mail), crypt (as chaves para descriptografar o vmail — inútil sem elas), mysql (o MariaDB que contém domínios, usuários, aliases e configurações), redis (estado de fila e cache), rspamd (aprendizado de spam/ham) e postfix (a fila de e-mail). O script roda dentro de um container auxiliar que gera arquivos compactados, garantindo a consistência dos backups mesmo com o stack em execução. Automatize o processo com um cron job diário e adicione --delete-days 14 para remover conjuntos antigos. O processo de restauração utiliza o mesmo script com o flag restore, que lista os snapshots e permite selecionar o que restaurar. Um backup que nunca foi testado não é um backup, é apenas uma esperança — realize um teste em um VPS limpo.

Passo 10 — Atualização agendada

O mailcow atualiza através de seu próprio script, que baixa o novo código, migra o mailcow.conf, faz o prefetch de imagens e reinicia os containers na seguinte ordem:

cd /opt/mailcow-dockerized
sudo ./update.sh --check   # reports whether an update exists, changes nothing
sudo ./update.sh           # applies it

Faça o backup primeiro (Passo 9), pois uma migração de schema é difícil de reverter. Atualizações ocorrem com frequência e incluem correções de segurança para daemons expostos à internet; portanto, não deixe um servidor de e-mail desatualizado por meses. Se uma atualização deixar um container em estado unhealthy, o sudo docker compose logs --tail=50 <service>-mailcow indica o daemon que falhou ao reiniciar.

Uma nota sobre hardening

O mailcow executa seu próprio serviço netfilter (netfilter-mailcow) que bane IPs que realizam ataques de força bruta nas portas de mail e webmail; portanto, a parte de mail está protegida por padrão. Isso não cobre o SSH no host, que continua exposto e sujeito a brute-force — combine esta instalação com Fail2ban monitorando o log de autenticação do SSH e login apenas por chave. Mantenha a UI de administração do mailcow com uma senha forte e, idealmente, fora da internet pública ou atrás de uma VPN.

Modos de falha e as strings exatas

Filas de e-mail e falha na entrega. Execute sudo docker compose exec postfix-mailcow postqueue -p ou verifique a fila de e-mail na interface de administração; as entradas ficam como deferred com:

status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)

Isso indica que a porta 25 de saída está bloqueada pelo seu provedor (Passo 1). Nenhuma configuração resolve isso — abra um chamado. Não é problema de DNS ou TLS; o indício é a palavra timed out contra um MX remoto na porta 25.

Gmail marca tudo como spam ou rejeita a mensagem. Abra a mensagem no Gmail, clique em "Show original" e leia os resultados de autenticação. dkim=fail ou dkim=none significa que seu registro TXT dkim._domainkey está ausente, corrompido ou ainda não propagou — republique exatamente o que a página ARC/DKIM mostra e aguarde o TTL. spf=fail significa que os registros SPF/MX não cobrem seu IP. O alinhamento é fundamental; uma única verificação falha é suficiente para cair no spam.

Rejeição por grandes provedores na conexão. Bounces ou logs do Postfix apresentam a rejeição de PTR do Gmail:

550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.

O código 550 5.7.25 indica ausência ou incompatibilidade de DNS reverso. Configure o PTR para o seu IP como mail.example.com no provedor (Passo 2). O registro Forward (A) e o reverse (PTR) devem coincidir, e ambos devem apontar para o mesmo hostname que o mailcow utiliza para se comunicar com outros servidores.

O navegador exibe um aviso de certificado que não desaparece. O container acme-mailcow falhou ao obter um certificado real. Verifique o log:

sudo docker compose logs acme-mailcow | tail -n 40

Uma linha como Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. ou uma falha de challenge significa que a porta 80 não é acessível pela internet ou o registro A não aponta para este servidor. Confirme se mail.example.com resolve para a máquina, libere as portas 80 e 443 no firewall do host e certifique-se de que nenhum outro serviço esteja utilizando essas portas. Após corrigir a causa, reinicie o client com sudo docker compose restart acme-mailcow em vez de aguardar o intervalo de uma hora.

FAQ

Vale a pena fazer self-hosting de e-mail?

Se você busca propriedade dos dados, aliases ilimitados e controle total, sim — o mailcow oferece uma stack profissional pelo preço de um VPS. Porém, a entregabilidade exige manutenção constante: reputação de IP, alinhamento de DNS e monitoramento de blocklists são tarefas contínuas. Para endereços comerciais críticos, onde um único dia na pasta de spam causa prejuízo, um provedor gerenciado é a escolha pragmática. Faça self-host apenas se priorizar o controle sobre a conveniência e se você realmente for realizar a manutenção.

Como saber se a porta 25 de saída está bloqueada?

Execute nc -vz -w 5 gmail-smtp-in.l.google.com 25 a partir do servidor. "succeeded!" significa que a porta está aberta; um timed out após a pausa indica que seu provedor a bloqueia. Este é o motivo mais comum para um servidor self-hosted conseguir receber e-mails, mas nunca enviá-los. A única solução é o provedor liberar a porta — nenhuma configuração local resolve isso.

Por que meus e-mails ainda caem no spam do Gmail?

Quase sempre é uma falha na cadeia de autenticação. Use "Show original" no Gmail e procure por spf=pass, dkim=pass e dmarc=pass. Um dkim=fail indica um registro dkim._domainkey TXT ausente ou incorreto; uma divergência de PTR ou um IP novo sem histórico de envio também prejudicam a entrega. Consiga uma nota 10/10 no mail-tester.com primeiro e depois faça o warm-up do IP lentamente — enviando algumas mensagens por dia e aumentando gradualmente — em vez de disparar grandes volumes no primeiro dia.

O que exatamente eu preciso fazer backup?

Execute backup_and_restore.sh backup all e mantenha todo o conjunto fora do servidor. Ele captura o vmail (as caixas de e-mail), o crypt (as chaves de descriptografia), o banco de dados MariaDB (domínios, usuários, aliases, configurações), o Redis, os dados aprendidos do Rspamd e a fila do Postfix. O volume crypt é o que as pessoas costumam esquecer — sem ele, o backup do vmail será um texto criptografado ilegível. Teste a restauração em uma máquina temporária pelo menos uma vez.

Posso rodar o mailcow em um VPS de 2 GB?

Não de forma estável. O generate_config.sh sugere desativar o ClamAV se o disco estiver abaixo de aproximadamente 2.5 GiB, mas mesmo assim Rspamd, ClamAV, Dovecot e MariaDB competirão por memória. Você atingirá o swap e sofrerá OOM kills sob qualquer carga real. Considere 6 GiB de RAM mais 1 GiB de swap como o mínimo para uma instalação estável de usuário único; mude para 8 GiB assim que mais de duas pessoas dependerem do serviço.

#mailcow#email#self-hosting#docker#dns