Kenapa Self-Hosted Mail Server
Untuk kebutuhan email profesional seperti hello@akaxia.id dan hello@rikystudio.id, ada dua pilihan: pakai layanan pihak ketiga seperti Brevo atau Google Workspace, atau bangun sendiri. Saya pilih self-hosted karena:
- Kontrol penuh atas data dan konfigurasi
- Tidak bergantung pada layanan berbayar pihak ketiga
- Bisa handle multiple domain dalam satu instance
- Stalwart sangat ringan — cukup 256MB RAM
Kenapa Stalwart
Stalwart adalah mail server modern berbasis Rust yang menawarkan SMTP, IMAP, JMAP, dan webmail dalam satu binary. Berbeda dengan stack tradisional Postfix + Dovecot yang kompleks, Stalwart jauh lebih mudah dikonfigurasi via web UI.
Keunggulan Stalwart:
- Native ARM64 support
- Web UI modern untuk manajemen
- Built-in spam filter
- Support multiple domain
- Docker image resmi tersedia
Prasyarat
Sebelum mulai, pastikan:
- VPS dengan Ubuntu 22.04, minimal 1 vCPU dan 512MB RAM
- Docker sudah terinstall
- Domain sudah pointing ke IP VPS
- Port 25 tidak diblokir ISP/provider VPS — test dengan
nc -zv smtp.gmail.com 25 - PTR/Reverse DNS sudah diset ke hostname mail server (minta ke provider VPS)
Install Stalwart via Docker
Buat folder dan docker-compose:
mkdir -p /opt/stalwart nano /opt/stalwart/docker-compose.yml
Isi konfigurasi:
services:
stalwart:
image: stalwartlabs/stalwart:latest
container_name: stalwart
restart: unless-stopped
ports:
- "25:25"
- "587:587"
- "465:465"
- "143:143"
- "993:993"
- "4190:4190"
- "8081:8080"
volumes:
- /opt/stalwart/data:/opt/stalwart
environment:
- TZ=Asia/Jakarta
networks:
- coolify
- default
networks:
coolify:
external: true
Jalankan tanpa -d dulu untuk melihat password admin yang hanya muncul sekali:
cd /opt/stalwart docker compose up
Output yang akan muncul:
username: admin password: xxxxxxxxxxxx
Catat password tersebut, lalu Ctrl+C dan jalankan background:
docker compose up -d
Setup Wizard
Buka http://IP_VPS:8081/admin dan ikuti wizard 5 langkah:
Step 1 — Server Identity:
- Server Hostname:
mail.domainpertama.id - Default Email Domain:
domainpertama.id - Automatically Obtain TLS: matikan (pakai Traefik)
- Generate Email Signing Keys: aktifkan
Step 2 — Storage: biarkan default RocksDB
Step 3 — Account Directory: Internal directory
Step 4 — Logging: ganti ke Console (penting untuk Docker)
Step 5 — DNS Management: Manual
Setelah wizard selesai, catat email dan password admin baru yang di-generate.
Setup Reverse Proxy dengan Traefik
Jika menggunakan Coolify dengan Traefik, hubungkan Stalwart ke network Coolify:
docker network connect coolify stalwart docker inspect stalwart | grep IPAddress
Tambah Dynamic Configuration di Coolify:
http:
routers:
stalwart:
rule: "Host(`mail.domainpertama.id`)"
service: stalwart
entryPoints:
- https
tls:
certResolver: letsencrypt
services:
stalwart:
loadBalancer:
servers:
- url: "http://IP_CONTAINER:8080"
DNS Records di Cloudflare
Setelah Stalwart setup, buka admin → Domains → nama domain → View Zone File. Semua record yang dibutuhkan sudah di-generate otomatis.
Tambahkan ke Cloudflare DNS:
Record wajib:
| Type | Name | Content |
|---|---|---|
| A | IP VPS (DNS only) | |
| MX | @ | mail.domainpertama.id (priority 10) |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=reject; rua=mailto:admin@domainpertama.id |
| TXT | v1-ed25519-TANGGAL._domainkey | nilai dari zone file |
| TXT | v1-rsa-TANGGAL._domainkey | nilai dari zone file (gabungkan 2 string) |
Perhatian penting tentang DKIM RSA key: Di zone file, RSA key dibagi dalam 2 string terpisah di dalam tanda kurung. Di Cloudflare, keduanya harus digabung menjadi 1 string tanpa spasi. Kalau terpotong, DKIM akan invalid dan email masuk spam.
Verifikasi panjang key — harusnya 400+ karakter:
dig TXT v1-rsa-TANGGAL._domainkey.domainpertama.id +short | wc -c
Buat Email Account
Stalwart admin → Directory → Accounts → Create user:
- Username:
hello - Domain:
domainpertama.id - Full Name: nama lengkap
- Authentication: tambah Password
- Timezone: Asia/Jakarta
Ulangi untuk domain lain (misal domainkedua.id).
Tambah Domain Kedua
Stalwart bisa handle multiple domain dalam 1 instance. Buka Domains → Create domain → isi domainkedua.id. Stalwart akan generate DKIM key baru untuk domain ini. Tambahkan DNS records yang sama ke Cloudflare DNS domainkedua.id.
Test Kirim Email
Test via curl dari VPS:
Gunakan curl dengan flag --insecure dan protocol smtps via port 465. Pastikan isi email menyertakan header From, To, dan Subject sebelum body. Jika berhasil akan muncul response 250 2.0.0 Message queued.
Verifikasi Deliverability
Setelah email dikirim, buka email di Gmail → klik titik tiga → Show original. Cek bagian Authentication-Results:
dkim=pass spf=pass dmarc=pass
Jika ketiga pass, email akan masuk inbox. Jika DKIM neutral atau fail, kemungkinan:
- DNS record DKIM belum propagasi — tunggu 15 menit
- RSA key terpotong di Cloudflare — gabungkan 2 string menjadi 1
Akses Webmail
Stalwart menyediakan webmail built-in yang bisa diakses di https://mail.domainpertama.id. Login dengan email dan password yang sudah dibuat.
Untuk webmail yang lebih lengkap, bisa install Snappymail atau Roundcube sebagai tambahan via Docker.
Checklist Deliverability
| Item | Cara Cek |
|---|---|
| SPF pass | Show original di Gmail |
| DKIM pass | Show original di Gmail |
| DMARC pass | Show original di Gmail |
| PTR/rDNS | mxtoolbox.com/ReverseLookup |
| Tidak di blacklist | mxtoolbox.com/blacklists |
| SSL valid | ssl-checker.online |
Kesimpulan
Stalwart adalah pilihan terbaik untuk self-hosted mail server di VPS kecil. Setup relatif mudah dibanding stack tradisional, dan web UI memudahkan manajemen domain dan akun email.
Dua hal yang paling sering jadi masalah: DKIM RSA key terpotong di DNS, dan IP Traefik yang diblokir oleh fitur keamanan Stalwart. Keduanya bisa diatasi dengan whitelist IP di settings Stalwart dan memastikan key DKIM lengkap di Cloudflare.