SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-07-24

cara install mailcow di vps agar lolos gmail

Pastikan port 25 terbuka sebelum instalasi mailcow. Pelajari cara setting DNS agar email Anda tidak ditolak Gmail dengan error 550 5.7.25 PTR rejection.

Apa yang Anda bangun

Sebuah server email lengkap pada perangkat milik Anda sendiri: SMTP untuk mengirim dan menerima pesan, IMAP agar ponsel dan laptop tetap sinkron, klien webmail, dan filter spam yang memberikan skor pada setiap pesan di kedua arah. mailcow-dockerized menggabungkan Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis, dan klien ACME ke dalam satu stack Docker Compose, sehingga perangkat lunak bukan bagian yang sulit. Anda dapat menjalankannya dalam waktu setengah jam.

Bagian yang sulit adalah segala hal di sekitarnya. Email adalah satu-satunya layanan di mana internet secara aktif tidak mempercayai server yang benar-benar baru, dan perbedaan antara "berhasil berfungsi" dengan "Gmail mengabaikan setiap pesan secara diam-diam" bergantung pada empat catatan DNS dan satu pengaturan reputasi IP yang mungkin tidak sepenuhnya Anda kendalikan. Baca prasyarat di bawah ini sebelum Anda menyewa layanan apa pun. Jika setelah membacanya Anda memutuskan bahwa proses membangun reputasi tidak sepadan, itu adalah jawaban yang valid — ulasan kami tentang apa yang layak di-self-host pada 2026 mengelompokkan email di bawah kategori "hanya jika Anda serius" karena alasan-alasan tersebut.

Prasyarat ADALAH proyek ini

Melewatkan salah satu poin ini akan menyebabkan email tidak pernah terkirim. Berikut adalah urutan berdasarkan frekuensi kegagalan:

Port outbound 25 harus terbuka. Server Anda mengirim email ke Gmail dan Microsoft melalui TCP port 25. Banyak penyedia VPS dan cloud memblokir port 25 outbound secara default untuk mencegah spam. Pemblokiran ini bersifat senyap — tidak ada error saat boot, sistem terlihat normal, namun email hanya tertahan di antrean selamanya. Lakukan pengujian sebelum Anda menginstal apa pun. Jika terblokir, satu-satunya solusi adalah mengirim tiket dukungan ke penyedia layanan untuk membukanya; beberapa penyedia akan membukanya untuk akun lama, beberapa lainnya tidak akan pernah melakukannya.

IP bersih dengan reputasi yang baik. IP VPS yang digunakan kembali sering kali sudah masuk dalam daftar blokir akibat spam dari penyewa sebelumnya. Periksa IP Anda melalui layanan seperti Spamhaus lookup atau mxtoolbox sebelum memulai. IP yang masuk daftar blokir akan menyebabkan penolakan yang tidak bisa diatasi hanya dengan konfigurasi kode.

Kontrol DNS dan catatan PTR yang benar. Anda harus menambahkan catatan ke zone domain Anda, dan Anda memerlukan reverse DNS (PTR) agar IP server mengarah kembali ke hostname email Anda. PTR hampir tidak pernah diatur di panel DNS Anda — pengaturan ini dikelola oleh pemilik IP, sehingga harus diatur melalui panel kontrol penyedia VPS atau melalui tiket dukungan.

6 GiB RAM dan 2 vCPU adalah batas minimum yang nyaman. Spesifikasi minimum mailcow adalah 6 GiB RAM ditambah 1 GiB swap untuk instalasi privat, dengan saran 8 GiB jika sudah digunakan oleh beberapa pengguna. Di bawah 2.5 GiB, generate_config.sh menawarkan opsi untuk menonaktifkan pemindai virus ClamAV agar kernel tidak mematikan container secara paksa. Sediakan 20 GB SSD untuk memulai.

Nama DNS, bukan sekadar IP. Pilih hostname seperti mail.example.com. Nama tersebut akan menjadi MAILCOW_HOSTNAME Anda, subjek sertifikat TLS Anda, target PTR Anda, dan banner SMTP Anda. Gunakan nama yang konsisten di seluruh konfigurasi.

Langkah 1 — Buktikan port outbound 25 terbuka

Lakukan ini terlebih dahulu. Langkah lain akan sia-sia jika ini gagal. Dari VPS baru, coba buka koneksi SMTP dengan server email asli:

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25

Hasil yang berhasil akan muncul seketika:

Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!

Port yang terblokir akan tertahan selama lima detik penuh, lalu gagal:

nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress

Timeout tersebut menandakan adanya pemblokiran. Ini adalah filter jaringan dari sisi penyedia layanan, bukan firewall Anda, sehingga perubahan lokal tidak akan memperbaikinya. Kirimkan tiket bantuan: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." Jangan menginstal mailcow sampai proses ini menghasilkan status "succeeded". Perlu dicatat bahwa port 25 inbound (server lain menghubungi Anda) adalah jalur terpisah dan biasanya terbuka — penyedia layanan biasanya membatasi sisi outbound.

Step 2 — Atur rekaman DNS sekarang

Perubahan DNS membutuhkan waktu propagasi, jadi publikasikan semua data sebelum melakukan instalasi. Asumsikan domain Anda adalah example.com, host email Anda adalah mail.example.com, dan IP adalah 10.0.0.10. Di dalam zone Anda, buat:

mail.example.com.        A      10.0.0.10
mail.example.com.        AAAA   2001:db8::10          ; only if you have IPv6
example.com.             MX  10 mail.example.com.
example.com.             TXT    "v=spf1 mx -all"
_dmarc.example.com.      TXT    "v=DMARC1; p=none; rua=mailto:postmaster@example.com"

Rekaman SPF menyatakan "hanya MX saya yang boleh mengirim untuk domain ini, tolak sisanya". Mulai DMARC pada p=none agar Anda dapat memantau laporan tanpa memantulkan email Anda sendiri; tingkatkan ke p=quarantine lalu p=reject setelah penyelarasan terbukti. Dua rekaman sengaja belum disertakan: DKIM, yang dibuatkan oleh mailcow untuk Anda pada Step 6, dan PTR, yang harus Anda atur sekarang di panel penyedia layanan Anda.

Atur PTR (reverse DNS) untuk 10.0.0.10 ke mail.example.com — nilai eksak dari MAILCOW_HOSTNAME. Ini adalah satu rekaman yang paling sering dilupakan orang, dan penyedia besar akan menolak email karena hal ini. Jika panel Anda tidak memiliki kolom rDNS, ajukan tiket bantuan.

Step 3 — Install Docker

mailcow membutuhkan Docker Engine dengan plugin Compose v2. Gunakan skrip praktis resmi Docker daripada paket docker.io milik Ubuntu, karena paket tersebut tidak menyertakan plugin Compose sama sekali:

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

Anda seharusnya melihat baris Docker Compose version v2.x. Jika docker compose version mencetak docker: 'compose' is not a docker command, Docker Engine sudah terinstal tetapi plugin Compose belum terinstal. Instal plugin tersebut dari repositori Docker — jalankan ulang skrip di atas, atau ikuti panduan dasar Docker Compose kami, yang menginstal keduanya dari repositori apt milik Docker sendiri.

Step 4 — Clone mailcow dan buat konfigurasi

cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.sh

Periksa apakah umask mencetak 0022 terlebih dahulu — mailcow akan gagal saat proses build jika file mask tidak sesuai, dan shell root Ubuntu 24.04 yang baru sudah menyediakan 0022. Skrip kemudian akan menanyakan satu hal penting: fully qualified hostname. Masukkan mail.example.com — nilainya harus sama persis dengan A record dan PTR Anda. Skrip akan menulis mailcow.conf, yaitu satu-satunya file environment yang dibaca oleh seluruh stack. Buka file tersebut jika Anda perlu mengubah port web (HTTP_PORT, HTTPS_PORT) atau menonaktifkan ClamAV pada server dengan spesifikasi rendah:

MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n          # set to y to drop the virus scanner on a <2.5 GiB box

SKIP_FTS=y adalah opsi lain untuk server dengan RAM rendah: full-text search adalah penggunaan memori besar kedua menurut dokumentasi mailcow, dan menonaktifkannya hanya akan menghilangkan fitur pencarian isi pesan pada webmail.

Biarkan HTTP_PORT=80 dan HTTPS_PORT=443 tetap terbuka kecuali jika ada layanan lain di host yang sudah menggunakannya — client ACME bawaan mailcow memerlukan port 80 yang dapat diakses dari internet untuk mendapatkan sertifikat. Inilah alasan mengapa Anda tidak boleh menjalankan setup nginx-plus-Certbot terpisah pada server yang sama; mailcow menerbitkan dan memperbarui TLS sendiri secara internal, dan layanan kedua yang menggunakan port 80/443 akan merusak proses tersebut.

Step 5 — Jalankan stack dan login

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

Proses pull akan mengambil sekitar dua lusin image; tunggu beberapa menit. Saat docker compose ps menunjukkan semua container dalam status running (atau healthy), buka https://mail.example.com di browser. Login admin default adalah username admin dan password moohoo. Segera ubah password tersebut di UI admin pada menu Access → Administrators. Jika browser memberikan peringatan NET::ERR_CERT_AUTHORITY_INVALID, sertifikat ACME belum diterbitkan — periksa kegagalan ACME di bawah sebelum menyimpulkan bahwa sistem rusak; penggunaan placeholder self-signed adalah hal normal pada satu atau dua menit pertama.

Step 6 — Tambahkan domain, mailbox, dan publikasikan DKIM

Di UI admin, buka halaman Mail Setup (Configuration → Mail Setup), lalu di bawah tab Domains klik Add domain dan masukkan example.com. Kemudian, di bawah Mailboxes, klik Add mailbox untuk membuat you@example.com dengan kata sandi. Mailbox tersebut sudah aktif dan dapat diakses melalui IMAP.

Sekarang bagian DKIM key. Buka Configuration → ARC/DKIM keys; mailcow mungkin sudah membuatkan key saat Anda menambahkan domain, jika belum, buatlah key baru di sana — pilih domain, gunakan selector dkim, pilih 2048-bit, dan klik Add. Salin nilai TXT panjang yang muncul dan publikasikan sebagai:

dkim._domainkey.example.com.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"

Halaman Domains pada mailcow memiliki tombol DNS yang menampilkan daftar semua record yang dibutuhkan serta statusnya berupa tanda centang hijau atau silang merah sesuai dengan apa yang telah dipublikasikan. Gunakan ini sebagai daftar periksa — pastikan semua baris berwarna hijau sebelum menguji deliverability. Baris DKIM berwarna merah setelah publikasi biasanya berarti key terbagi ke dalam potongan TXT secara tidak tepat; key 2048-bit lebih panjang dari batas 255 karakter untuk satu string TXT tunggal, jadi tempelkan sebagai satu nilai logis dan biarkan host DNS Anda membaginya menjadi beberapa potongan secara otomatis.

Step 7 — Test deliverability and chase 10/10

Buka mail-tester.com, salin alamat acak yang ditampilkan, lalu kirim pesan ke alamat tersebut dari kotak surat baru Anda — masuk ke SOGo webmail di https://mail.example.com/SOGo dan kirim dari sana. Kemudian klik "Then check your score".

Targetkan skor 10/10. Pengurangan skor yang umum dan penyebabnya:

  • SPF not aligned — rekaman MX/SPF hilang atau IP pengirim tidak terdaftar. Periksa kembali SPF TXT.
  • DKIM signature does not verifydkim._domainkey TXT hilang, masih dalam proses propagasi, atau rusak. Ini adalah kesalahan yang paling umum.
  • No PTR / PTR mismatch — reverse DNS tidak mengarah ke mail.example.com. Perbaiki di sisi penyedia layanan.
  • Listed on a blocklist — reputasi IP Anda sebelumnya. Ajukan permintaan penghapusan daftar (delisting) atau minta IP yang lebih bersih.

Jangan mengirim email asli ke Gmail atau Outlook sebelum skor mencapai 10/10. Skor rendah ditambah IP baru akan menyebabkan domain Anda ditandai (flagged) pada hari pertama.

Langkah 8 — Hubungkan klien email asli

Arahkan Thunderbird, Apple Mail, atau ponsel Anda ke server dengan pengaturan berikut. Host server untuk semua layanan adalah mail.example.com:

  • IMAP: port 993, SSL/TLS (atau 143 dengan STARTTLS)
  • SMTP submission: port 465, SSL/TLS (atau 587 dengan STARTTLS)
  • Username: alamat lengkap, you@example.com
  • Password: kata sandi kotak surat yang Anda tetapkan

Jangan pernah mengirim email klien melalui port 25 — port tersebut hanya untuk komunikasi server-ke-server. mailcow tidak menyediakan fitur submission terautentikasi di port tersebut, sehingga koneksi klien akan ditolak. Jika klien melaporkan Relay access denied, berarti klien mencoba mengirim melalui port 25 atau tanpa autentikasi; ubah pengaturan ke 465 atau 587 menggunakan kredensial kotak surat Anda.

Step 9 — Cadangkan data yang penting

mailcow menyediakan skrip cadangan yang mengambil snapshot dari setiap volume stateful. Jalankan skrip tersebut ke disk eksternal atau mount remote:

sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
  ./helper-scripts/backup_and_restore.sh backup all

all mengambil enam hal, dan kehilangan salah satunya akan menyebabkan kehilangan data: vmail (kotak surat asli), crypt (kunci untuk dekripsi vmail — tidak berguna tanpanya), mysql (MariaDB yang menyimpan domain, pengguna, alias, dan pengaturan), redis (status antrean dan cache), rspamd (data spam/ham yang telah dipelajari), dan postfix (antrean email). Skrip ini berjalan di dalam container pembantu yang menulis arsip terkompresi, sehingga cadangan tetap konsisten meskipun stack sedang berjalan. Otomatiskan dengan cron job setiap malam, dan tambahkan --delete-days 14 untuk menghapus set cadangan lama. Proses pemulihan menggunakan skrip yang sama dengan restore, yang menampilkan daftar snapshot dan memungkinkan Anda memilih data yang ingin dipulihkan. Cadangan yang belum pernah diuji pemulihannya hanyalah sebuah harapan, bukan cadangan — lakukan uji coba pada VPS kosong.

Step 10 — Update on a schedule

mailcow melakukan pembaruan melalui skrip internalnya. Skrip ini mengambil kode baru, melakukan migrasi pada mailcow.conf, melakukan prefetch pada image, dan memulai ulang container dengan urutan berikut:

cd /opt/mailcow-dockerized
sudo ./update.sh --check   # reports whether an update exists, changes nothing
sudo ./update.sh           # applies it

Lakukan pencadangan terlebih dahulu (Step 9), karena migrasi skema sulit untuk dibatalkan. Pembaruan sering dirilis dan mencakup perbaikan keamanan untuk daemon yang terhubung ke internet. Jangan biarkan mail server tidak diperbarui selama berbulan-bulan. Jika pembaruan menyebabkan container menjadi unhealthy, sudo docker compose logs --tail=50 <service>-mailcow akan menyebutkan nama daemon yang gagal berjalan kembali.

Catatan tentang hardening

mailcow menjalankan layanan netfilter sendiri (netfilter-mailcow) yang memblokir IP yang melakukan serangan brute-force pada port mail dan webmail, sehingga sisi mail sudah terlindungi secara default. Hal ini tidak mencakup SSH pada host itu sendiri, yang masih terbuka dan masih menjadi target brute-force — kombinasikan instalasi ini dengan Fail2ban yang memantau log autentikasi SSH dan login hanya menggunakan kunci (key-only login). Gunakan kata sandi yang kuat untuk UI admin mailcow dan, idealnya, jangan ekspos ke internet publik atau gunakan VPN.

Mode kegagalan, dengan string yang tepat

Antrean email dan tidak pernah terkirim. Jalankan sudo docker compose exec postfix-mailcow postqueue -p, atau baca antrean email pada UI admin; entri tertunda dengan pesan:

status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)

Hal ini disebabkan oleh port 25 outbound diblokir oleh penyedia layanan Anda (Langkah 1). Konfigurasi tidak dapat memperbaikinya — buka tiket dukungan. Ini bukan masalah DNS atau TLS; tandanya adalah kata timed out terhadap MX jarak jauh pada port 25.

Gmail menandai semua pesan sebagai spam, atau membalikkannya (bounce). Buka pesan di Gmail, pilih "Show original", dan baca hasil autentikasi. dkim=fail atau dkim=none berarti dkim._domainkey TXT Anda hilang, rusak, atau belum terpropagasi — publikasikan ulang persis seperti yang ditunjukkan pada halaman ARC/DKIM dan tunggu hingga TTL selesai. spf=fail berarti rekaman SPF/MX tidak mencakup IP Anda. Keselarasan adalah hal utama; satu pemeriksaan yang gagal sudah cukup untuk masuk ke spam.

Ditolak oleh penyedia besar saat koneksi. Pesan bounce atau log Postfix menunjukkan penolakan PTR dari Gmail:

550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.

Kode 550 5.7.25 berarti reverse DNS hilang atau tidak cocok. Atur PTR untuk IP Anda ke mail.example.com pada penyedia layanan (Langkah 2). Rekaman Forward (A) dan reverse (PTR) harus sesuai, dan keduanya harus menggunakan nama host yang sama saat mailcow menyapa server lain.

Browser menampilkan peringatan sertifikat yang tidak kunjung hilang. Kontainer acme-mailcow gagal mendapatkan sertifikat asli. Periksa lognya:

sudo docker compose logs acme-mailcow | tail -n 40

Baris seperti Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. atau kegagalan tantangan (challenge) berarti port 80 tidak dapat dijangkau dari internet, atau rekaman A tidak mengarah ke server ini. Pastikan mail.example.com mengarah ke server ini, buka port 80 dan 443 pada firewall host, dan pastikan tidak ada layanan lain yang menggunakan port tersebut. Setelah memperbaiki penyebabnya, jalankan ulang klien dengan sudo docker compose restart acme-mailcow daripada menunggu waktu jeda selama satu jam.

FAQ

Apakah self-hosting email benar-benar sepadan?

Jika Anda menginginkan kepemilikan data, alias tanpa batas, dan kontrol penuh, maka ya — mailcow menyediakan tumpukan teknologi profesional dengan harga VPS. Namun, masalah pengiriman (deliverability) adalah tugas berkelanjutan: reputasi IP, penyelarasan DNS, dan pemantauan daftar blokir tidak pernah benar-benar selesai. Untuk alamat bisnis yang kritikal di mana satu hari berada di folder spam dapat merugikan Anda, menggunakan penyedia layanan terkelola adalah pilihan yang pragmatis. Lakukan self-host jika Anda lebih mengutamakan kontrol daripada kenyamanan dan bersedia mengelolanya.

Bagaimana cara mengetahui jika port outbound 25 diblokir?

Jalankan nc -vz -w 5 gmail-smtp-in.l.google.com 25 dari server. Pesan "succeeded!" berarti port terbuka; pesan timed out setelah jeda berarti penyedia layanan Anda memblokirnya. Ini adalah alasan paling umum mengapa server self-hosted dapat menerima email tetapi tidak pernah dapat mengirimnya, dan satu-satunya solusi adalah penyedia layanan Anda membuka port tersebut — tidak ada pengaturan lokal yang dapat mengubahnya.

Mengapa email saya masih masuk ke folder spam Gmail?

Hampir selalu disebabkan oleh rantai autentikasi yang rusak. Gunakan "Show original" di Gmail dan periksa spf=pass, dkim=pass, dan dmarc=pass. Pesan dkim=fail menunjukkan adanya dkim._domainkey record TXT yang hilang atau rusak; ketidakcocokan PTR atau IP baru tanpa riwayat pengiriman juga berpengaruh. Dapatkan skor 10/10 di mail-tester.com terlebih dahulu, lalu lakukan pemanasan IP secara perlahan — mulai dengan beberapa pesan per hari hingga jumlahnya meningkat — daripada mengirim volume besar pada hari pertama.

Apa saja yang perlu saya cadangkan (backup)?

Jalankan backup_and_restore.sh backup all dan simpan seluruh set data di luar server. Perintah ini mencakup vmail (kotak surat), crypt (kunci untuk dekripsi), database MariaDB (domain, pengguna, alias, pengaturan), Redis, data pembelajaran Rspamd, dan antrean Postfix. Volume crypt adalah bagian yang sering diabaikan — tanpa volume ini, cadangan vmail hanyalah ciphertext yang tidak dapat dibaca. Lakukan uji pemulihan (restore) pada mesin percobaan setidaknya satu kali.

Bisakah saya menjalankan mailcow pada VPS 2 GB?

Tidak secara nyaman. generate_config.sh akan menyarankan untuk menonaktifkan ClamAV jika memori di bawah sekitar 2.5 GiB, dan meskipun demikian Rspamd, ClamAV, Dovecot, dan MariaDB akan berebut memori, sehingga Anda akan mengalami penggunaan swap dan OOM kills di bawah beban kerja nyata. Gunakan 6 GiB ditambah 1 GiB swap sebagai batas minimum untuk instalasi satu pengguna yang stabil, dan beralihlah ke 8 GiB segera setelah lebih dari dua orang menggunakannya.

#mailcow#email#self-hosting#docker#dns