Dengan meng-host sendiri, Listmonk berjalan di VPS yang sudah Anda bayar. Biaya pengiriman adalah tarif yang dikenakan relay SMTP Anda per seribu email. Jumlah pelanggan tidak mengubah kedua angka tersebut. Itulah pergeseran struktural yang membuat meng-host sendiri sepadan dengan waktu penyiapan begitu Anda melampaui paket gratis terkelola.
Listmonk adalah pengelola newsletter sumber terbuka berbasis Go. Anda mendapatkan pelanggan, daftar, dan kampanye tanpa batas dengan biaya sebuah VPS ditambah akun relay SMTP. Satu hal harus jelas sebelum Anda menyentuh sebuah perintah: Listmonk menangani semuanya kecuali pengiriman itu sendiri. Apakah email Anda masuk ke kotak masuk atau folder spam ditentukan oleh relay SMTP yang Anda konfigurasikan dan rekaman DNS yang Anda atur di domain pengirim Anda.
Apa yang Dibahas Panduan Ini
- Deploy Listmonk dan PostgreSQL dengan Docker Compose di belakang reverse proxy Nginx (atau Caddy) dengan HTTPS
- Pilih relay SMTP yang tepat untuk volume dan anggaran Anda (Amazon SES, Postmark, Brevo, atau lainnya)
- Konfigurasikan SPF, DKIM, dan DMARC di domain pengirim Anda
- Hindari empat mode kegagalan produksi yang sering tidak memunculkan error yang jelas
- Perkiraan waktu: 30 menit jika Anda sudah punya VPS dan domain yang siap
- Di luar cakupan: otomatisasi drip, email transaksional, penyiapan multi-instance (lihat FAQ)
Kapan Listmonk Bukan Alat yang Tepat
Listmonk adalah jawaban yang tepat untuk situasi tertentu. Jika situasi Anda berbeda, ada jawaban yang lebih baik.
Volume di bawah ~10K email per bulan. Paket gratis terkelola di Brevo atau Mailchimp bisa jadi lebih murah secara keseluruhan dibandingkan VPS ditambah relay SMTP pada skala ini. Meng-host sendiri mulai menguntungkan begitu Anda melewati kisaran itu. Periksa angkanya terhadap jumlah pelanggan dan frekuensi pengiriman Anda yang sebenarnya sebelum melakukan deploy.
Tim non-teknis. Mailchimp dan Brevo memiliki UI yang benar-benar lebih baik untuk orang yang tidak bekerja di terminal. Listmonk mengasumsikan ada orang di tim yang bisa SSH ke server, membaca log Docker, dan menafsirkan propagasi DNS. Jika orang itu tidak ada, layanan terkelola adalah pilihan yang tepat.
Membutuhkan alur kerja otomatisasi. Listmonk mengirim kampanye. Listmonk tidak mendukung rangkaian drip, email yang dipicu oleh perilaku, atau pembuat alur kerja visual. Jika Anda membutuhkan itu, jalankan Mautic atau hubungkan Listmonk ke n8n untuk lapisan otomatisasi.
Daftar pelanggan yang sensitif terhadap GDPR. Jika pelanggan Anda sebagian besar berada di UE atau daftar Anda tunduk pada aturan residensi data GDPR, jalankan Listmonk di pusat data Eropa. Kami menawarkan lokasi Frankfurt dan London yang memenuhi persyaratan residensi UE.
Apa yang Anda Butuhkan Sebelum Memulai
Listmonk ditambah PostgreSQL ditambah beban antrean yang moderat membutuhkan minimal 2 GB RAM. 4 GB adalah target produksi yang nyaman.
Perangkat keras. Untuk daftar pribadi di bawah 50K email per bulan, VPS dengan 2 vCPU, 4 GB RAM, dan penyimpanan NVMe 120 GB sudah cukup. Daftar yang berkembang pada 200K+ per bulan membutuhkan 4 vCPU dan 8 GB RAM. Kami menjalankan penyiapan Compose ini di VPS 4 GB di Frankfurt. Pilih lokasi yang dekat dengan pelanggan Anda jika bisa. Latensi pengiriman tidak terlalu penting; responsivitas panel admin penting.
Domain. Sebuah domain yang diarahkan ke VPS Anda melalui rekaman A. Gunakan subdomain untuk antarmuka admin, misalnya mail.example.com. Domain pengirim dan subdomain admin bisa berupa domain root yang sama.
Akun relay SMTP. Jangan buat satu pun dulu. Pilihan relay adalah keputusan paling berpengaruh dalam panduan ini dan bergantung pada volume Anda. Lewati ke bagian "Memilih Relay SMTP Anda", pilih penyedia, lalu kembali ke sini dengan host SMTP, port, nama pengguna, dan kata sandi di tangan.
Perangkat lunak di VPS. Ubuntu 22.04 LTS atau 24.04 LTS. Docker Engine 24.0 atau lebih tinggi dengan plugin Docker Compose. UFW atau firewall setara dengan port 22, 80, dan 443 terbuka. Akses SSH sebagai pengguna sudo non-root.
Deploy Listmonk Dengan Docker Compose

Buat sebuah direktori untuk deployment, lalu letakkan sebuah docker-compose.yml berkas dengan dua layanan: postgres untuk basis data dan listmonk untuk aplikasi. Keduanya restart saat gagal. Listmonk mengikat ke 127.0.0.1 sehingga reverse proxy adalah satu-satunya yang bisa menjangkaunya.
Berkas Docker Compose
I'm ready to translate to Indonesian, but I notice your message appears incomplete. You wrote "Here is the" but didn't include the text you'd like me to translate.
Please provide the full English text you'd like translated to Indonesian, and I'll return only the translation. docker-compose.yml. Verifikasi tag image dan nama variabel lingkungan yang tepat terhadap dokumentasi instalasi Listmonk resmi. Mereka diperbarui di setiap rilis.
# docker-compose.yml
services:
postgres:
image: postgres:16-alpine
container_name: listmonk-postgres
restart: unless-stopped
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: listmonk
volumes:
- listmonk-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
app:
image: listmonk/listmonk:latest
container_name: listmonk-app
restart: unless-stopped
# Bind to loopback only. The reverse proxy is the public entrypoint.
ports:
- "127.0.0.1:9000:9000"
depends_on:
postgres:
condition: service_healthy
environment:
LISTMONK_app__address: "0.0.0.0:9000"
LISTMONK_db__host: postgres
LISTMONK_db__port: 5432
LISTMONK_db__user: listmonk
LISTMONK_db__password: ${POSTGRES_PASSWORD}
LISTMONK_db__database: listmonk
volumes:
listmonk-postgres:
Buat .env file dengan POSTGRES_PASSWORD= disetel ke string acak yang panjang. Lalu jalankan stack dan jalankan instalasi basis data satu kali:
# Pull images and start the database first
docker compose up -d postgres
# Run the install step (creates schema and the first admin user)
docker compose run --rm app ./listmonk --install --idempotent --yes
# Start the application
docker compose up -d
Adapun --install perintah meminta email dan kata sandi admin. Simpan keduanya. Verifikasi kedua kontainer berjalan:
docker compose ps
Output yang diharapkan: dua layanan tercantum, keduanya dengan status Up. Baris postgres seharusnya menunjukkan (healthy).
Adapun 127.0.0.1:9000 pengikatan ini disengaja. Listmonk tidak punya pembatas laju autentikasi bawaan dan tidak punya daftar izin IP. Mengekspos port 9000 ke internet publik berarti siapa pun di planet ini bisa mengakses login admin Anda. Reverse proxy adalah yang membuat login itu hanya dapat dijangkau melalui HTTPS.
Reverse Proxy Nginx dan SSL
Instal Nginx dan Certbot dari repositori Ubuntu. Buat sebuah konfigurasi situs di /etc/nginx/sites-available/listmonk dengan header proxy yang dibutuhkan Listmonk untuk menghasilkan tautan kampanye yang benar:
# /etc/nginx/sites-available/listmonk
server {
listen 80;
server_name mail.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Listmonk streams campaign progress over WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Symlink ke sites-enabled, uji konfigurasinya, muat ulang Nginx, lalu terbitkan sertifikat:
sudo ln -s /etc/nginx/sites-available/listmonk /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d mail.example.com
Certbot menulis ulang blok server agar mendengarkan di 443 dengan sertifikat baru dan menambahkan pengalihan HTTP-ke-HTTPS. Verifikasi:
curl -I https://mail.example.com
Output yang diharapkan: HTTP/2 200 dengan header strict-transport-security yang valid. Jika Anda mendapatkan loop pengalihan, periksa bahwa header X-Forwarded-Proto disetel di konfigurasi Nginx di atas. Sembilan dari sepuluh kali, loop itu adalah header tersebut.
Jika Listmonk adalah satu-satunya hal di VPS ini, gunakan Caddy sebagai gantinya. Caddyfile-nya tiga baris dan menangani pembaruan sertifikat tanpa cron job:
mail.example.com {
reverse_proxy 127.0.0.1:9000
}
Perbaiki Header Message-ID
Secara default, Listmonk menggunakan hostname sistem dalam header Message-ID keluar. Jika hostname VPS Anda adalah localhost atau apa pun yang bukan FQDN yang valid, Listmonk mengirim Message-ID: <[email protected]>. Filter spam di Gmail dan Outlook menandai ini dengan segera. Ini didokumentasikan di utas Cloudron Forum 15410.
Perbaikannya adalah satu baris di dalam berkas Listmonk config.toml. Untuk instalasi baru, hasilkan berkas melalui docker compose run --rm app ./listmonk --new-config. Lalu setel:
[app]
hostname = "mail.example.com"
Restart kontainer aplikasi setelah mengedit:
docker compose restart app
Lakukan ini sebelum Anda mengirim satu kampanye pun. Daftar yang terkontaminasi dengan localhost.localdomain Message-ID lebih sulit dipulihkan daripada daftar yang dimulai dengan bersih.
Tip Profesional
Jika Anda lebih suka melewati penyiapan Compose, lihat VPS Listmonk sekali klik kami untuk men-deploy Listmonk dalam beberapa menit dengan satu klik. Instance ini sudah dikonfigurasi sebelumnya dengan PostgreSQL. Anda tetap perlu mengonfigurasi relay SMTP dan menambahkan rekaman DNS Anda. Langkah-langkah itu tidak opsional terlepas dari bagaimana Anda men-deploy.
Memilih Relay SMTP Anda

Semua pengiriman terjadi melalui relay yang Anda konfigurasikan. Reputasi IP relay, batas laju, dan penanganan bounce adalah yang menentukan apakah email Anda masuk ke kotak masuk atau folder spam.
Berikut perbandingan fungsionalnya. Harga dan batas paket gratis berubah. Verifikasi masing-masing di halaman harga resmi penyedia sebelum berkomitmen.
| Penyedia | Struktur biaya | Webhook bounce | Terbaik untuk |
|---|---|---|---|
| Amazon SES | Per email, sangat rendah pada volume | Ya, melalui SNS | Biaya pada volume; sudah di AWS |
| Postmark | Biaya dasar bulanan ditambah per email | Ya, native | Mengutamakan deliverabilitas; reputasi transaksional |
| Brevo | Paket gratis untuk volume rendah, paket berbayar di atasnya | Ya | Volume rendah dengan jalur peningkatan |
| Mailgun | Harga per email | Tidak ada endpoint webhook native; gunakan API bounce generik jika diperlukan. | Familiar bagi para developer |
Itu baru sekilas pandang setiap relay SMTP. Sekarang, kami akan membahas masing-masing secara mendalam.
Amazon SES (Titik Awal yang Direkomendasikan)
SES adalah opsi termurah pada volume dan paling banyak dibahas di komunitas Listmonk. Penyiapannya punya lebih banyak langkah dibandingkan Postmark atau Brevo tetapi selisih biaya per email cukup besar pada volume nyata mana pun untuk membenarkan upayanya.
Siapkan dalam tiga tahap. Pertama, buat pengguna IAM dengan kebijakan AmazonSESFullAccess (atau kebijakan kustom yang lebih ketat hanya dengan ses:SendRawEmail dan ses:GetSendQuota). Kedua, verifikasi domain pengirim Anda di konsol SES. SES memandu Anda melalui CNAME DKIM yang harus ditambahkan. Ketiga, hasilkan kredensial SMTP dari panel pengaturan SMTP SES. Ini bukan kunci akses AWS Anda; SES menghasilkan nama pengguna dan kata sandi khusus SMTP yang terpisah saat Anda mengklik "Create SMTP credentials."
Di admin Listmonk pada Settings → SMTP, tambahkan server baru dengan:
- Host:
email-smtp.<region>.amazonaws.com(gunakan region SES tempat Anda memverifikasi domain) - Port: 587
- Protokol auth: LOGIN
- TLS: STARTTLS
- Nama pengguna dan kata sandi: kredensial SMTP yang dihasilkan SES
SES memerlukan STARTTLS di port 587. Jika Anda membiarkan TLS disetel ke none atau memilih port 465, Listmonk terhubung, SES mengembalikan 530 Must issue a STARTTLS command first, dan uji kredensial SMTP di panel admin mungkin tetap menunjukkan sukses. Kirim email uji nyata ke kotak masuk pribadi yang Anda kendalikan sebelum menjalankan kampanye apa pun.
Akun SES baru dimulai dalam mode sandbox. Dalam sandbox Anda hanya bisa mengirim ke alamat email yang terverifikasi, yang tidak berguna untuk daftar pelanggan. Buka tiket dukungan dari konsol SES untuk meminta akses produksi. Persetujuan biasanya memakan waktu satu hari kerja.
Postmark (Alternatif yang Mengutamakan Deliverabilitas)
Postmark berbiaya lebih mahal per email dibandingkan SES tetapi memiliki dukungan webhook bounce native dan reputasi untuk tingkat inbox tinggi dengan kebijakan pengirim yang ketat. Sepadan jika newsletter Anda kritikal untuk bisnis atau Anda tidak ingin mengelola persetujuan sandbox-ke-produksi SES.
Konfigurasi Listmonk memiliki bentuk yang sama dengan SES: host, port 587, STARTTLS, kredensial dari panel token API server Postmark. Verifikasi domain pengirim Anda di penyiapan signature Postmark, tambahkan rekaman DKIM yang dihasilkan Postmark, dan Anda siap mengirim.
Pilih Postmark ketika deliverabilitas lebih penting daripada biaya per email. Pilih SES ketika volume lebih penting daripada bimbingan ekstra.
Peringatan tentang uji kredensial SMTP. Uji koneksi di admin Listmonk selalu melaporkan sukses, bahkan dengan kredensial yang tidak valid. Ini didokumentasikan dalam beberapa isu GitHub. Jangan percayai itu. Setelah mengonfigurasi relay apa pun, kirim kampanye ke satu pelanggan uji dan konfirmasi penerimaan di kotak masuk tujuan sebelum mengirim ke seluruh daftar Anda.
Hindari Mailersend untuk pengiriman kampanye massal. Batas 5-email-per-koneksi-nya menghasilkan error 421 Service not available yang dicatat Listmonk sebagai terkirim padahal pengiriman gagal. Kampanye tampak sukses di Listmonk dan kehilangan sebagian besar pesannya tanpa peringatan.
Membuat Email Benar-Benar Sampai: SPF, DKIM, dan DMARC

Ini adalah tiga rekaman DNS di domain pengirim Anda yang memberi tahu server mail penerima bahwa domain Anda mengizinkan relay ini mengirim atas nama Anda. Lewatkan salah satunya dan sebagian besar pengiriman Anda akan masuk spam pada skala besar, tidak peduli seberapa bersih relay atau salinan Anda. Tambahkan semuanya di penyedia DNS Anda sebelum mengirim kampanye pertama.
Rekaman SPF
SPF mengizinkan IP atau layanan pengirim tertentu untuk mengirim email bagi domain Anda. Tambahkan satu rekaman TXT di root domain pengirim Anda dengan include untuk relay Anda. Untuk SES rekamannya terlihat seperti:
v=spf1 include:amazonses.com ~all
Untuk Postmark, ganti include dengan include:spf.mtasv.net. Selalu periksa dokumentasi SPF resmi relay Anda untuk nilai include yang tepat. Nilainya berubah menurut penyedia dan terkadang menurut region.
Sebuah domain hanya bisa memiliki satu rekaman SPF. Jika Anda sudah memilikinya untuk layanan lain (Google Workspace, Microsoft 365), gabungkan include ke dalam rekaman yang ada alih-alih menambahkan yang kedua.
DKIM
DKIM melampirkan tanda tangan kriptografis ke email keluar yang diverifikasi server penerima terhadap kunci publik di DNS Anda. Relay Anda menghasilkan pasangan kunci. Anda menambahkan kunci publik sebagai rekaman TXT di subdomain selektor (misalnya, sel1._domainkey.example.com) dengan nilai persis yang diberikan relay.
Listmonk tidak menangani penandatanganan DKIM. Relay yang menanganinya. Tidak ada konfigurasi DKIM khusus Listmonk. Ikuti wizard penyiapan DKIM relay Anda, tambahkan rekaman yang diberikannya, dan tunggu propagasi DNS (biasanya di bawah 30 menit; kadang beberapa jam).
DMARC
DMARC memberi tahu server penerima apa yang harus dilakukan dengan email yang gagal pemeriksaan SPF atau DKIM. Mulai dalam mode pemantauan dengan p=none sehingga Anda bisa melihat kegagalan dalam laporan agregat tanpa memengaruhi deliverabilitas saat Anda membenahi kesalahan konfigurasi. Tambahkan rekaman TXT di _dmarc.example.com:
v=DMARC1; p=none; rua=mailto:[email protected]
Setelah dua atau tiga minggu laporan yang bersih, perketat kebijakan menjadi p=quarantine or p=reject. Jangan lewati fase pemantauan. Salah ketik di include SPF Anda dikombinasikan dengan p=reject pada hari pertama akan menghapus email sah Anda sendiri tanpa sinyal bahwa ada yang salah.
Header List-Unsubscribe (RFC 8058) dihasilkan secara otomatis oleh Listmonk. Konfirmasikan bahwa header itu diaktifkan di Settings → General. Gmail dan Apple Mail memunculkan header ini sebagai opsi berhenti berlangganan sekali klik, yang melindungi reputasi pengirim.
Apa yang Sebenarnya Bermasalah di Produksi
Empat mode kegagalan yang tidak muncul hingga Anda mengirim kampanye nyata pertama Anda. Tangkap sebelum pelanggan Anda yang menemukannya.
Masalah 1: Tingkat bounce tidak cocok dengan angka relay Anda. Listmonk memproses bounce dengan membaca alamat email bounce yang ditunjuk melalui POP3 dan menghapus setiap pesan yang dibacanya. Itu termasuk balasan liburan, tanda terima pengiriman, dan notifikasi tidak di kantor, semuanya diklasifikasikan sebagai bounce. Relay Anda hanya menghitung kegagalan pengiriman asli yang dikembalikan oleh server mail penerima. Jika SES melaporkan 0.6% dan Listmonk melaporkan 4%, inilah celahnya. Perbaikannya adalah mengonfigurasi callback webhook bounce alih-alih POP3. Untuk SES, gunakan SNS untuk mengirimkan notifikasi bounce ke endpoint webhook Listmonk. Untuk Postmark, arahkan webhook native-nya ke endpoint yang sama. Bounce webhook akurat; bounce POP3 menggelembungkan angka.
Masalah 2: Uji kredensial SMTP mengatakan sukses padahal salah. Seperti dicatat di bagian relay, uji koneksi selalu melaporkan sukses terlepas dari validitas kredensial. Jangan percayai itu. Selalu kirim email uji nyata setelah mengonfigurasi atau mengubah pengaturan SMTP apa pun.
Masalah 3: Kampanye berhenti di tengah pengiriman tanpa error. Listmonk menandai kampanye sebagai Finished bahkan saat hanya 60% pelanggan yang menerima email. Sisa pengiriman ditolak oleh relay atau di-throttle pada lapisan jaringan VPS, dan Listmonk tidak memunculkan keduanya sebagai error tingkat kampanye (utas Cloudron Forum 13165). Jika sebuah kampanye menunjukkan pengiriman lebih sedikit daripada pelanggan, buka dashboard relay Anda untuk jendela waktu pengiriman dan bandingkan jumlah yang diterima relay dengan jumlah Listmonk. Kebenarannya ada di relay.
Masalah 4: Tidak ada yang mencadangkan PostgreSQL. Volume Compose mempertahankan data antar restart. Itu tidak melindungi dari kegagalan host, docker volume rm yang tidak sengaja, atau upgrade yang rusak. Tambahkan pg_dump harian:
0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql
Jalankan baris itu sekali secara manual terlebih dahulu. Verifikasi berkas output tidak kosong sebelum Anda mempercayai entri cron. Skrip cadangan yang menulis berkas nol byte tanpa memunculkan error lebih buruk daripada tidak ada cadangan sama sekali, karena Anda berhenti memikirkannya.
Sebelum Anda mempercayai semua ini di produksi, kirim kampanye uji ke satu pelanggan dan konfirmasi penerimaan di kotak masuk tujuan. Jika satu email itu sampai dengan bersih, sepuluh ribu berikutnya juga akan sampai.
Pertanyaan yang Sering Diajukan
Mengapa Tingkat Bounce Listmonk Saya Lebih Tinggi Daripada yang Dilaporkan Amazon SES?
Pemrosesan bounce POP3 Listmonk menggelembungkan jumlah dengan membaca balasan tidak di kantor dan auto-responder liburan sebagai bounce. Konfigurasikan callback webhook SNS SES untuk jumlah yang akurat.
Apakah Listmonk Mendukung Email Transaksional?
Listmonk adalah alat newsletter dan kampanye siaran. Listmonk tidak secara native menangani email transaksional (reset kata sandi, konfirmasi pesanan, email yang dipicu satu per satu). Untuk email transaksional dari domain pengirim yang sama, konfigurasikan endpoint transaksional relay Anda secara terpisah atau gunakan alat khusus seperti Postal atau API transaksional Postmark bersama Listmonk.
Bagaimana Cara Mengimpor Pelanggan Mailchimp Saya Ke Listmonk?
Ekspor daftar Mailchimp Anda sebagai CSV dari Audience → Export Audience. Di Listmonk, buka Subscribers → Import dan unggah CSV-nya. Petakan kolom email dan nama saat diminta. Listmonk menerima ekspor CSV standar dari Mailchimp, ConvertKit, dan sebagian besar platform newsletter tanpa konversi format.
Apa yang Terjadi Saat Seseorang Berhenti Berlangganan Dari Kampanye Listmonk?
Listmonk menambahkan tautan berhenti berlangganan ke setiap email kampanye secara default. Saat seorang pelanggan mengkliknya, mereka ditambahkan ke blocklist dan dihapus dari semua kampanye mendatang. Header List-Unsubscribe (RFC 8058) disertakan secara otomatis, sehingga klien mail yang mendukung berhenti berlangganan sekali klik (Gmail, Apple Mail) memunculkannya secara native. Rekaman pelanggan tetap ada di basis data untuk tujuan audit tetapi tidak ada kampanye lagi yang akan dikirim ke mereka.