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.

1

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>
Dica

O passo a passo detalhado está em Criar credenciais AWS.

2

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.

GitHub App

Adicione as variáveis de ambiente abaixo.

GITHUB_ID="<seu-github-client-id>"
GITHUB_SECRET="<seu-github-client-secret>"
Informação
Login com senha ainda não existe — o login por email é por link mágico. Se quiser implementar, o código é aberto.
3

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:).

4

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.

Configuração do SES

4. Sair do modo sandbox

Atenção
Não esqueça de tirar a conta do SES do modo sandbox.

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.

Dica

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 em SMTP_AUTH_USERNAME);
  • Senha: a sua chave de API;
  • Criptografia: STARTTLS (portas 25, 587, 2587) ou SSL/TLS (portas 465, 2465).
Dica

O proxy SMTP encaminha tudo para a sua instância, então ela precisa estar no ar e acessível.

Atenção

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.

Dica

Um membro da comunidade publicou um relato curto sobre hospedar o projeto com Coolify. Vale a leitura se você quiser outra referência.