Det här sätter du upp
Stalwart är en mailserver i ett enda program: den tar emot och skickar e-post, låter mailappar läsa den över IMAP, POP3 och JMAP, filtrerar spam, signerar utgående e-post med DKIM och har ett webbgränssnitt för att hantera domäner och brevlådor. Den kan också hantera kalendrar och kontakter.
Här körs den som en container, under en egen användare som heter stalwart. Mailportarna är öppna direkt mot internet, så att Stalwart ser varje avsändares riktiga adress, som dess spamkontroller bygger på. Webbgränssnittet ligger bakom Caddy från Podman-guiden.
Varje steg nedan har körts på en nyinstallerad VC-P Alloy (2 vCPU, 8 GB) hos Melonslab med Debian 13. Försök från internet att skicka e-post vidare via servern nekades. Ett testmail klarade SPF, omvänd DNS och DKIM hos en extern kontrolltjänst, vars svar kom fram över IPv6. IMAP, POP3 och utgående e-post använde alla ett certifikat från Let's Encrypt, och både säkerhetskopieringen och en omstart av servern testades. Stalwart använde omkring 160 MB minne.
Vill du hellre bygga en mailserver av Postfix och Dovecot själv, se Postfix-guiden.
Innan du börjar
Du behöver:
- en server uppsatt som i Podman-guiden, med Caddy igång;
- en domän, till exempel
example.com, med en A-post och en AAAA-post förmail.example.comsom pekar på din server; - omvänd DNS satt till
mail.example.comför serverns båda adresser, som i steg 2 i Postfix-guiden.
Port 25 är öppen på varje server hos Melonslab från första uppstarten. Exemplen använder example.com, mail.example.com och 203.0.113.10 som din servers IPv4-adress. Byt ut dem mot dina egna genomgående.
1. Tillåt mailportarna
Som root tillåter du vanliga användare att använda portar från 25 och uppåt, vilket täcker mailportarna och Caddys 80 och 443:
sed -i 's/ip_unprivileged_port_start = .*/ip_unprivileged_port_start = 25/' /etc/sysctl.d/50-unprivileged-ports.conf
sysctl --system
Använder du ufw som i säkerhetsguiden, öppna också mailportarna:
ufw allow 25,465,993,995/tcp
2. Skapa användaren
useradd -m -s /bin/bash stalwart
loginctl enable-linger stalwart
machinectl shell stalwart@
3. Definiera containern
mkdir -p ~/.config/containers/systemd
Skapa ~/.config/containers/systemd/stalwart.container:
[Unit]
Description=Stalwart, a mail server
[Container]
ContainerName=stalwart
Image=docker.io/stalwartlabs/stalwart:v0.16
Volume=stalwart-etc:/etc/stalwart
Volume=stalwart-data:/var/lib/stalwart
# Mail ports, open to the internet
PublishPort=25:25
PublishPort=465:465
PublishPort=993:993
PublishPort=995:995
# Web interface, reached through Caddy only
PublishPort=127.0.0.1:8085:8080
Environment=STALWART_PUBLIC_URL=https://mail.example.com
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
Port 25 tar emot e-post från andra servrar. Dina mailappar använder 465 för att skicka och 993 (IMAP) eller 995 (POP3) för att läsa, alla krypterade från början. Webbgränssnittet publiceras bara på serverns loopback-adress, för Caddy.
Starta den och visa dess logg:
systemctl --user daemon-reload
systemctl --user start stalwart
podman logs stalwart
Loggen visar ett tillfälligt lösenord för admin, till installationen i steg 5.
4. Sätt Caddy framför
Gå tillbaka till root med exit och byt till Caddys användare med machinectl shell caddy@. Lägg till det här blocket sist i ~/Caddyfile:
mail.example.com {
reverse_proxy 127.0.0.1:8085
}
Och starta om Caddy, vilket kort avbryter alla webbplatser bakom Caddy:
systemctl --user restart caddy
5. Kör installationsguiden
Öppna https://mail.example.com/admin och logga in som admin med det tillfälliga lösenordet. Installationsguiden har fem steg:
- Server identity. Ange
mail.example.comochexample.com. Stäng av "Automatically obtain TLS certificate": den skulle använda port 443, som Caddy har. I steg 8 i den här guiden hämtar du certifikatet på ett annat sätt. Låt "Generate email signing keys" vara på. - Storage. Behåll standardvärdena.
- Directory. Behåll den interna katalogen.
- Logging. Ändra loggens mål till Console, så att loggen syns i
podman logs. - DNS. Behåll manuell DNS-hantering och välj sedan Finish setup.
Sista sidan visar administratörens adress och lösenord en gång. Skriv upp dem och starta sedan om Stalwart som användaren stalwart:
systemctl --user restart stalwart
Logga in på https://mail.example.com/admin med det nya administratörskontot.
6. Berätta för Stalwart om Caddy
Gör det här direkt. Stalwart spärrar adresser som misslyckas med för många inloggningar eller letar efter sidor som WordPress-inloggningar, och varje webbförfrågan når den via Caddy, från serverns egen IPv4-adress. Tills Stalwart vet om det kan en enda skanner på internet få serverns egen adress spärrad, och med den varje besökare till webbgränssnittet. I vårt test hände det inom några minuter.
- Slå på Obtain remote IP from Forwarded header under Settings → HTTP Server och spara. Stalwart spärrar då besökarens riktiga adress, som Caddy skickar vidare.
- Välj Create address under Settings → Security → Allowed IPs, ange
203.0.113.10och skapa den. Serverns egen adress kan då aldrig spärras. - Kör Server settings i avsnittet Reload under Actions.
7. Publicera DNS-posterna
Öppna menyn för example.com under Management → Domains och välj View Zone File. Den listar varje post din domän behöver: MX, SPF, två DKIM-nycklar, DMARC och posterna som mailappar använder för att hitta sina inställningar. Skapa dem hos din DNS-leverantör. Om du öppnar zonfilen igen efter steg 8 listar den också CAA-poster och en _validation-persist-post: hoppa över dem. CAA-poster som de här skulle innebära att bara Stalwarts certifikatkonto får utfärda certifikat för hela din domän, och då skulle Caddy inte längre kunna förnya certifikaten för dina andra webbplatser.
DMARC-posten ber mottagare att avvisa e-post som inte klarar SPF och DKIM, vilket passar en domän vars e-post bara kommer från den här servern.
Ge sedan Caddy de andra namnen från zonfilen. Som caddy ändrar du blocket från steg 4 till:
mail.example.com, autoconfig.example.com, autodiscover.example.com, mta-sts.example.com, ua-auto-config.example.com {
reverse_proxy 127.0.0.1:8085
}
Och starta om Caddy. Mailappar hämtar sina inställningar från autoconfig och autodiscover, och andra mailservrar läser din MTA-STS-policy från mta-sts.
8. Skaffa ett certifikat
Stalwart behöver ett eget certifikat för mailportarna. Den hämtar ett från Let's Encrypt via Caddy, som skickar vidare kontrollen på port 80 till den.
- Välj Create provider under Settings → TLS → ACME Providers. Sätt kontrolltypen till HTTP-01, skriv en kontaktadress som
postmaster@example.comoch tryck på Enter för att lägga till den, och skapa sedan leverantören. - Öppna
example.comunder Management → Domains. Sätt Certificate Management till ACME TLS certificate management, välj leverantören du just skapade och spara.
Inom en minut visar podman logs stalwart raden ACME order completed, och mailportarna använder det nya certifikatet. Stalwart förnyar det själv.
9. Skapa en brevlåda
Välj Create user under Directory → Accounts. Ange ett användarnamn som anna, välj example.com som domän, välj Add item under Credentials och sätt ett lösenord. Skapa kontot: dess adress är anna@example.com.
10. Anslut din mailapp
De flesta mailappar ställer in sig själva utifrån bara adressen och lösenordet. Om din frågar:
| Server | Port | Säkerhet | |
|---|---|---|---|
| Inkommande (IMAP) | mail.example.com | 993 | SSL/TLS |
| Utgående (SMTP) | mail.example.com | 465 | SSL/TLS |
Användarnamnet är hela adressen, anna@example.com.
11. Kontrollera att det fungerar
Skicka ett e-postmeddelande från din mailapp till check-auth@verifier.port25.com. Dess rapport kommer inom en minut och ska visa SPF check: pass, "iprev" check: pass och DKIM check: pass. Den kan också lista ett DKIM-resultat permerror med "unsupported signature algorithm": Stalwart signerar med två nycklar, och den kontrolltjänsten kan inte läsa den nyare Ed25519-nyckeln. Mottagare använder den signatur de kan kontrollera.
12. Håll den uppdaterad
Slå på Podmans dagliga uppdateringar för den här användaren:
systemctl --user enable --now podman-auto-update.timer
Med taggen v0.16 får du alla buggfixar inom 0.16. Uppgraderingen till en nyare version, som 0.17, gör du själv genom att ändra taggen, efter att ha läst Stalwarts uppgraderingsanvisningar: versionerna före 1.0 har ändrat hur Stalwart lagrar sina inställningar.
13. Säkerhetskopiera
mkdir -p ~/backup
systemctl --user stop stalwart
podman volume export stalwart-data --output ~/backup/stalwart-data.tar
podman volume export stalwart-etc --output ~/backup/stalwart-etc.tar
systemctl --user start stalwart
Det sparar alla brevlådor, inställningarna och DKIM-nycklarna. Kopiera sedan ~/backup till en annan maskin och förvara den säkert.
Felsökning
Webbgränssnittet svarar "403 Forbidden" för alla. Serverns egen adress spärrades före steg 6. Kör det här som användaren stalwart för att ta bort alla spärrar; b är det id Stalwart ger administratörskontot på en ny server:
podman exec stalwart curl -s -u 'admin@example.com:ADMIN_PASSWORD' http://127.0.0.1:8080/jmap/ -H 'Content-Type: application/json' -d '{"using":["urn:ietf:params:jmap:core","urn:stalwart:jmap"],"methodCalls":[["x:BlockedIp/query",{"accountId":"b"},"0"],["x:BlockedIp/set",{"accountId":"b","#destroy":{"resultOf":"0","name":"x:BlockedIp/query","path":"/ids"}},"1"],["x:Action/set",{"accountId":"b","create":{"r":{"@type":"ReloadBlockedIps"}}},"2"]]}'
Gör sedan steg 6.
Certifikatet utfärdas inte. Kontrollera att varje namn i Caddy-blocket har en DNS-post som pekar på servern, och leta i podman logs stalwart efter rader som börjar med ACME.
Andra mailservrar avvisar din e-post. Kontrollera omvänd DNS för båda adresserna, och att DNS-posterna från steg 7 är publicerade, med dig TXT example.com och dig MX example.com.
Skickar du e-post i stora volymer?
De här stegen gäller din egen e-post, ditt företags e-post och transaktionsmail från dina applikationer. Nyhetsbrev och andra stora utskick kräver en överenskommelse med vårt säljteam först, så att vi kan skydda ryktet för de adresser alla kunder är beroende av.