Configuração
O mxout lê a configuração de um arquivo JSON e de variáveis de ambiente. Segredos (token de auth) e chaves DKIM nunca ficam embutidos no binário — chegam via variável de ambiente e arquivos montados externamente.
Arquivo de configuração (mxout.json)
O caminho do arquivo é definido pela variável MXOUT_CONFIG. O valor padrão é mxout.json no diretório de trabalho. Em container, o caminho convencional é /etc/mxout/mxout.json.
Campos
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
listen |
string | "0.0.0.0:8080" |
Endereço e porta em que a API HTTP escuta. |
helo_hostname |
string | — | Hostname enviado no EHLO/HELO SMTP. Deve coincidir com o PTR/rDNS do IP de saída. |
smtp_timeout_secs |
int | 30 |
Timeout em segundos por etapa do diálogo SMTP. |
domains |
objeto | — | Mapa de domínio para configuração DKIM. Veja estrutura abaixo. |
kits_dir |
string | derivado | Diretório onde as chaves geradas por POST /domains são gravadas. Defina explicitamente: sem ele, o cadastro do primeiro domínio de uma instância nova falha. |
smtp_listen |
string | ausente | Porta de submissão SMTP (ex.: "0.0.0.0:2525"). Ausente = listener desligado. |
smtp_max_size |
int | 5242880 |
Tamanho máximo aceito pelo listener SMTP. |
smtp_tls_cert |
string | ausente | Certificado do STARTTLS. Ausente = auto-assinado gerado no boot. |
smtp_tls_key |
string | ausente | Chave do certificado acima. |
smtp_require_tls |
bool | false |
Exige STARTTLS antes do AUTH. Ligue depois que todas as aplicações já falarem TLS. |
retention_days |
int | 7 |
Dias que uma entrega terminada fica consultável antes de sair do banco. |
require_tls |
bool | false |
Exige TLS na entrega. Destino sem STARTTLS vira erro temporário em vez de sair em claro. Pode ser sobreposto por domínio. |
ledger_file |
string | ausente | Caminho do ledger em arquivo. Coloque no volume persistente, senão o histórico morre no redeploy. |
ledger_max_bytes |
int | 52428800 |
Tamanho antes de rotacionar. 0 = sem limite. |
mx_override |
objeto | {} |
Só para teste: domínio → ["host:porta"], entrega sem consultar DNS. Vazio em produção. |
Estrutura de `domains`
Cada chave do objeto domains é o domínio do remetente (deve corresponder ao domínio do campo from no /send).
| Campo | Tipo | Descrição |
|---|---|---|
selector |
string | Seletor DKIM publicado no DNS (ex.: "mail"). |
key_path |
string | Caminho absoluto para a chave privada DKIM em formato PEM. |
status |
string | active ou pending. Domínio novo nasce pending e só envia após o GET /check passar. |
limits |
objeto | Cota própria (per_hour, per_day), sobrepondo o padrão global. |
require_tls |
bool | Política de TLS deste domínio remetente, sobrepondo a global. |
Exemplo completo
{
"listen": "0.0.0.0:8080",
"helo_hostname": "mail.exemplo.com",
"smtp_timeout_secs": 30,
"domains": {
"exemplo.com": {
"selector": "mail",
"key_path": "/etc/mxout/keys/exemplo.com.pem"
},
"outro-dominio.com": {
"selector": "mxout",
"key_path": "/etc/mxout/keys/outro-dominio.com.pem"
}
}
}Segredos não ficam neste arquivo. O token de administração vem da variável
MXOUT_AUTH_TOKEN; as credenciais de cliente são criadas pela API e guardadas como bcrypt
no banco de estado — ver Clientes.
A configuração é reescrita pelo próprio serviço. Endpoints como
POST /domainsePUT /ratelimitpersistem no arquivo. Para editar à mão, pare o container antes — com ele no ar, a alteração é sobrescrita a partir da memória.
Variáveis de ambiente
| Variável | Descrição | Padrão | Exemplo |
|---|---|---|---|
MXOUT_CONFIG |
Caminho para o arquivo mxout.json. |
mxout.json |
/etc/mxout/mxout.json |
MXOUT_AUTH_TOKEN |
Token de administração. Ausente ou vazio = endpoints de gestão abertos (registra aviso no boot). Não envia e-mail. | — (sem auth) | s3cr3t-t0ken-aqui |
MXOUT_DB |
Diretório do banco de estado (clientes e fila). | <dir da config>/state |
/etc/mxout/state |
MXOUT_REDIS |
Presente = modo assíncrono: aceita, persiste e entrega no tick. Ausente = síncrono. | ausente (síncrono) | 1 |
MXOUT_LEDGER_FILE |
Sobrepõe ledger_file da configuração. |
— | /etc/mxout/ledger.jsonl |
MXOUT_DNS |
IP do resolver DNS upstream para resolução de MX. Necessário em containers scratch sem /etc/resolv.conf. |
Resolver do sistema | 1.1.1.1 |
RUST_LOG |
Nível de log do serviço. | info |
debug |
Sobre `MXOUT_AUTH_TOKEN`
Se a variável estiver ausente ou vazia, o endpoint /send fica acessível sem autenticação. O mxout registra um aviso visível nos logs na inicialização. Use somente em rede privada com controle de acesso na camada de rede.
Sobre `MXOUT_DNS`
Imagens baseadas em scratch não possuem /etc/resolv.conf. Sem MXOUT_DNS, o mxout não consegue resolver registros MX. Defina esta variável sempre que rodar o container a partir de uma imagem mínima.
Chaves DKIM
As chaves privadas DKIM são arquivos PEM referenciados por key_path no mxout.json. Elas devem ser montadas no container como volumes somente-leitura. Nunca inclua chaves privadas em imagens Docker ou repositórios.
Para gerar um par de chaves, consulte mxout-keygen.
Para publicar o registro DNS correspondente, consulte Configurar DNS.