‹ BLOG rikystudio.id

Infra · Jul 2026

Membangun Self-Hosted Email dengan Stalwart Mail Server di VPS

Panduan lengkap membangun mail server sendiri menggunakan Stalwart di Docker, konfigurasi DNS SPF DKIM DMARC di Cloudflare, dan cara supaya email masuk inbox bukan spam.

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:

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:

Prasyarat

Sebelum mulai, pastikan:

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:

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:

TypeNameContent
AmailIP VPS (DNS only)
MX@mail.domainpertama.id (priority 10)
TXT@v=spf1 mx -all
TXT_dmarcv=DMARC1; p=reject; rua=mailto:admin@domainpertama.id
TXTv1-ed25519-TANGGAL._domainkeynilai dari zone file
TXTv1-rsa-TANGGAL._domainkeynilai 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:

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:

  1. DNS record DKIM belum propagasi — tunggu 15 menit
  2. 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

ItemCara Cek
SPF passShow original di Gmail
DKIM passShow original di Gmail
DMARC passShow original di Gmail
PTR/rDNSmxtoolbox.com/ReverseLookup
Tidak di blacklistmxtoolbox.com/blacklists
SSL validssl-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.