Visão geral do self hosting
Pré-requisitos
1. Variáveis de ambiente
O Madmail depende do AWS SES para enviar emails e do SNS para receber o status de cada envio. Além disso, usa Postgres como banco e Redis como fila. Copie o arquivo .env.selfhost.example para .env e preencha os valores.
Credenciais AWS
Resumo: entre no console da AWS e crie um usuário com acesso programático. Anexe as políticas AmazonSNSFullAccess e AmazonSESFullAccess a esse usuário e gere uma access key.
Adicione as variáveis de ambiente abaixo.
AWS_ACCESS_KEY_ID=<access-key-id>
AWS_SECRET_ACCESS_KEY=<secret-access-key>
O passo a passo detalhado está em Criar credenciais AWS.
Credenciais do GitHub App para login
A instância aceita login por GitHub, Google ou link por email. Este passo cobre o GitHub.
Use este link para criar um GitHub App.
Callback URL: https://<sua-instancia>/api/auth/callback/github
Em Permissions & events, deixe Account permissions → Email addresses como Read-only. O Madmail precisa do email do usuário autenticado para casar contas novas com convites de equipe.

Adicione as variáveis de ambiente abaixo.
GITHUB_ID="<seu-github-client-id>"
GITHUB_SECRET="<seu-github-client-secret>"
Banco de dados e Redis
O Madmail usa Postgres como banco e Redis como fila. Crie um banco novo e adicione as variáveis abaixo.
Se você for usar docker-compose, isso já vem pronto.
DATABASE_URL="postgres://<usuario>:<senha>@<host>:<porta>/<nome-do-banco>"
REDIS_URL="redis://<usuario>:<senha>@<host>:<porta>"
Se você compartilha a mesma instância de Redis entre vários aplicativos e usa Redis ACL para isolá-los, defina REDIS_KEY_PREFIX para dar um namespace às chaves (por exemplo, REDIS_KEY_PREFIX="usesend" prefixa todas as chaves com usesend:).
URL e segredo do NextAuth
A URL é o endereço em que a aplicação vai responder; o segredo é uma string aleatória. Gere o segredo com o comando abaixo.
openssl rand -base64 32
Adicione as variáveis de ambiente abaixo.
NEXTAUTH_URL="https://<sua-instancia>"
NEXTAUTH_SECRET="<seu-segredo>"
2. Subir a aplicação
Qualquer plataforma que rode Docker serve para hospedar a sua instância.
Docker
Siga este guia para preparar a sua instância: Configurar o Docker.
A imagem oficial do projeto open-source está publicada em usesend/usesend no Docker Hub.
3. Escolher a região
Para enviar emails você precisa escolher uma região na AWS. Use a região onde estão os seus destinatários ou onde a instância está hospedada. Na dúvida, use us-east-1.
As regiões disponíveis estão nesta lista da AWS.
No primeiro login, a instância pede a configuração do SES:
- informe a região;
- informe a callback URL, que é a própria URL da aplicação. Ela precisa ser acessível pela Internet: é por ela que chega o status de entrega dos emails;
- não mexa na taxa de envio, ela acompanha automaticamente a da sua conta.

4. Sair do modo sandbox

5. Proxy SMTP (opcional)
O proxy SMTP é um componente opcional que deixa outras aplicações enviarem emails pela sua instância usando SMTP padrão, em vez da API REST. É útil para sistemas legados, clientes de email e qualquer software que só saiba falar SMTP.
O código-fonte completo do proxy SMTP está em usesend/usesend/tree/main/apps/smtp-server.
Quando usar o proxy SMTP
- sistemas legados que só suportam SMTP;
- clientes de email como Thunderbird, Outlook e Apple Mail;
- aplicações que não têm como integrar com APIs REST;
- softwares de terceiros que exigem configuração SMTP.
Docker Compose
Crie um docker-compose.yml para o servidor SMTP:
name: usesend-smtp-server
services:
smtp-server:
container_name: usesend-smtp-server
image: usesend/smtp-proxy:latest
environment:
SMTP_AUTH_USERNAME: "usesend" # usuário da autenticação SMTP
USESEND_BASE_URL: "https://sua-instancia.exemplo.com" # URL da sua instância
# Opcional: caminhos dos certificados SSL
# USESEND_API_KEY_PATH: "/certs/server.key"
# USESEND_API_CERT_PATH: "/certs/server.crt"
# Opcional: montar os certificados SSL
# volumes:
# - ./certs/server.key:/certs/server.key:ro
# - ./certs/server.crt:/certs/server.crt:ro
ports:
- "25:25" # SMTP padrão
- "587:587" # SMTP com STARTTLS
- "2587:2587" # porta SMTP alternativa
- "465:465" # SMTP sobre SSL/TLS
- "2465:2465" # porta SMTPS alternativa
restart: unless-stopped
Suba o servidor SMTP:
docker-compose up -d
Configuração SMTP
Para enviar pelo proxy, configure a sua aplicação assim:
- Host: o IP ou domínio do seu servidor;
- Portas: 25, 587 (STARTTLS), 465 (SSL/TLS), 2587 ou 2465;
- Usuário:
usesend(ou o valor que você definiu emSMTP_AUTH_USERNAME); - Senha: a sua chave de API;
- Criptografia: STARTTLS (portas 25, 587, 2587) ou SSL/TLS (portas 465, 2465).
O proxy SMTP encaminha tudo para a sua instância, então ela precisa estar no ar e acessível.
Confira se o firewall libera as portas SMTP que você escolheu. Em produção, considere usar as portas não padrão (2587, 2465) para evitar conflitos.
Próximos passos
Está tudo pronto. A partir daqui:
- configure um domínio de envio;
- crie uma chave de API;
- comece a enviar.
Dúvidas sobre self-host são respondidas na comunidade do projeto open-source — canal #self-host no Discord. Não é o suporte da Madmail.
Um membro da comunidade publicou um relato curto sobre hospedar o projeto com Coolify. Vale a leitura se você quiser outra referência.