VPS पर Mailcow setup कैसे करें
Gmail rejection से बचने के लिए outbound port 25 check करें और DNS setup करें। Gmail 550 5.7.25 PTR error को ठीक करने का सही तरीका यहाँ सीखें।
आप क्या बना रहे हैं
आपके अपने सर्वर पर एक पूर्ण mail server: संदेश भेजने और प्राप्त करने के लिए SMTP, आपके phone और laptop को sync रखने के लिए IMAP, एक webmail client, और एक spam filter जो दोनों दिशाओं में हर message को score करता है। mailcow-dockerized में Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis और एक ACME client को एक Docker Compose stack में bundle किया गया है, इसलिए software सबसे कठिन हिस्सा नहीं है। यह आधे घंटे में चालू हो जाएगा।
कठिन हिस्सा इसके आस-पास की चीजें हैं। Email एकमात्र ऐसी service है जहाँ इंटरनेट के बाकी हिस्से एक नए server पर भरोसा नहीं करते। "यह काम कर रहा है" और "Gmail चुपचाप हर message को खा जाता है" के बीच का अंतर चार DNS records और एक IP-reputation setting पर निर्भर करता है जिसे आप पूरी तरह control नहीं कर सकते। कुछ भी rent करने से पहले नीचे दिए गए prerequisites पढ़ें। यदि इन्हें पढ़ने के बाद आप तय करते हैं कि reputation का काम करना सार्थक नहीं है, तो यह एक वैध उत्तर है — 2026 में वास्तव में self-hosting करने लायक क्या है में "only if you mean it" के अंतर्गत ठीक इन्हीं कारणों से email का विवरण दिया गया है।
Prerequisites ही प्रोजेक्ट हैं
इनमें से एक भी चीज़ छूट जाने पर आपके ईमेल कभी नहीं पहुँचेंगे। यहाँ सबसे आम समस्याओं का क्रम दिया गया है:
Outbound port 25 खुला होना चाहिए। आपका server TCP port 25 के माध्यम से Gmail और Microsoft को ईमेल भेजता है। Spam रोकने के लिए कई VPS और cloud providers डिफ़ॉल्ट रूप से outbound 25 को block कर देते हैं। यह block होने पर कोई error नहीं दिखता; सब कुछ सही लगता है, लेकिन mail हमेशा के लिए queue में पड़ा रहता है। कुछ भी install करने से पहले इसे test करें। यदि यह block है, तो एकमात्र समाधान अपने provider को support ticket भेजकर इसे खोलने के लिए कहना है; कुछ providers पुराने accounts के लिए ऐसा करते हैं, जबकि कुछ कभी नहीं करते।
एक clean IP और अच्छी reputation। Recycled VPS IPs अक्सर पिछले tenant के spam के कारण पहले से ही blocklists पर होते हैं। काम शुरू करने से पहले Spamhaus lookup या mxtoolbox जैसी service से अपना IP check करें। यदि IP listed है, तो आप code के ज़रिए इसे ठीक नहीं कर सकते।
DNS का नियंत्रण और सही PTR record। आपको अपने domain के zone में records जोड़ने होंगे। साथ ही, server के IP के लिए reverse DNS (PTR) होना चाहिए जो आपके mail hostname को point करे। PTR आमतौर पर DNS panel में set नहीं होता है — यह IP के owner के पास होता है, इसलिए इसे आपके VPS provider के control panel में या ticket के माध्यम से set किया जाता है।
6 GiB RAM और 2 vCPU न्यूनतम आवश्यकता है। private install के लिए mailcow की अपनी minimum requirement 6 GiB RAM और 1 GiB swap है। जब कुछ users इसका उपयोग करने लगें, तो 8 GiB की सलाह दी जाती है। 2.5 GiB से कम होने पर, generate_config.sh ClamAV virus scanner को disable करने का विकल्प देता है ताकि kernel containers को kill करना शुरू न कर दे। शुरुआत के लिए 20 GB SSD दें।
एक DNS name, न कि केवल IP। mail.example.com जैसा hostname चुनें। वही single name आपका MAILCOW_HOSTNAME, आपका TLS certificate subject, आपका PTR target, और आपका SMTP banner बनेगा। इसे हर जगह एक समान रखें।
Step 1 — यह जांचें कि outbound port 25 खुला है या नहीं
इसे सबसे पहले करें। यदि यह विफल हो जाता है, तो अन्य सभी प्रयास व्यर्थ हैं। अपने नए VPS से, एक वास्तविक mail server के साथ SMTP conversation खोलने का प्रयास करें:
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25यदि पोर्ट खुला है, तो परिणाम तुरंत प्राप्त होगा:
Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!यदि पोर्ट ब्लॉक है, तो यह पूरे पांच सेकंड तक रुकता है और फिर विफल हो जाता है:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressयह timeout ही ब्लॉक होने का संकेत है। यह provider-side network filter है, आपका firewall नहीं, इसलिए local बदलाव से इसे ठीक नहीं किया जा सकता। एक ticket खोलें: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." जब तक यह "succeeded" न हो जाए, तब तक mailcow install न करें। ध्यान दें कि inbound 25 (अन्य servers का आपसे जुड़ना) एक अलग path है और आमतौर पर खुला होता है — providers केवल outbound side को throttle करते हैं।
Step 2 — अब DNS records सेट करें
DNS changes को propagate होने में समय लगता है, इसलिए installation से पहले ही सभी संभव records publish कर दें। मान लें कि आपका domain example.com है, आपका mail host mail.example.com है, और IP 10.0.0.10 है। अपने zone में, ये बनाएँ:
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"SPF record का अर्थ है "केवल मेरा MX ही इस domain के लिए mail भेज सकता है, बाकी सभी को reject करें"। DMARC को p=none पर शुरू करें ताकि आप अपने ही mail को bounce किए बिना reports देख सकें; alignment सिद्ध होने के बाद इसे p=quarantine और फिर p=reject पर सेट करें। दो records जानबूझकर अभी भी गायब हैं: DKIM, जिसे mailcow Step 6 में आपके लिए generate करेगा, और PTR, जिसे आप अभी अपने provider के panel में सेट करेंगे।
10.0.0.10 के लिए PTR (reverse DNS) को mail.example.com पर सेट करें — जो कि MAILCOW_HOSTNAME का सटीक value है। यह वह single record है जिसे अधिकतर लोग भूल जाते हैं, और बड़े providers इसके अभाव में mail reject कर देते हैं। यदि आपके panel में rDNS field नहीं है, तो एक ticket raise करें।
Step 3 — Docker Install करें
mailcow को Docker Engine और Compose v2 plugin की आवश्यकता होती है। Ubuntu के docker.io package का उपयोग न करें क्योंकि उसमें Compose plugin नहीं होता है। इसके बजाय Docker के official convenience script का उपयोग करें:
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose versionआपको एक Docker Compose version v2.x line दिखाई देनी चाहिए। यदि docker compose version docker: 'compose' is not a docker command प्रिंट करता है, तो इसका मतलब है कि Docker Engine इंस्टॉल है लेकिन Compose plugin नहीं है। Plugin को Docker के repository से इंस्टॉल करें — ऊपर दिए गए script को फिर से चलाएं, या हमारे Docker Compose basics guide का पालन करें, जो Docker के अपने apt repository से दोनों को setup करता है।
Step 4 — Clone mailcow and generate the config
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shCheck umask prints 0022 first — mailcow refuses to build with an odd file mask, and a fresh Ubuntu 24.04 root shell already gives you 0022. The script then asks the one thing that matters: the fully qualified hostname. Enter mail.example.com — the value must match your A record and PTR exactly. It writes mailcow.conf, the single environment file the whole stack reads. Open it if you need to change the web ports (HTTP_PORT, HTTPS_PORT) or disable ClamAV on a small box:
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 boxSKIP_FTS=y is the other lever on a low-RAM box: full-text search is the second memory hog mailcow's docs name, and skipping it only costs you body-text search in webmail.
Leave HTTP_PORT=80 and HTTPS_PORT=443 unless something else on the host already owns them — mailcow's built-in ACME client needs port 80 reachable from the internet to obtain the certificate. This is why you do not run a separate nginx-plus-Certbot setup on the same box; mailcow issues and renews its own TLS internally, and a second service squatting on 80/443 breaks that.
Step 5 — Stack शुरू करें और log in करें
sudo docker compose pull
sudo docker compose up -d
sudo docker compose psPull प्रक्रिया में लगभग दो दर्जन images डाउनलोड होती हैं; इसके लिए कुछ मिनट प्रतीक्षा करें। जब docker compose ps सभी container running (या healthy) दिखा दे, तब browser में https://mail.example.com खोलें। Default admin login username admin और password moohoo है। Admin UI में Access → Administrators के अंतर्गत इस password को तुरंत बदल दें। यदि browser NET::ERR_CERT_AUTHORITY_INVALID की चेतावनी देता है, तो इसका अर्थ है कि ACME certificate अभी जारी नहीं हुआ है — इसे खराब मानने से पहले नीचे दिए गए ACME failure को देखें; पहले एक या दो मिनट के लिए self-signed placeholder का होना सामान्य है।
Step 6 — डोमेन, मेलबॉक्स जोड़ें और DKIM पब्लिश करें
Admin UI में, Mail Setup पेज खोलें (Configuration → Mail Setup), और Domains टैब के अंतर्गत Add domain पर क्लिक करके example.com दर्ज करें। फिर, Mailboxes के अंतर्गत, पासवर्ड के साथ you@example.com बनाने के लिए Add mailbox पर क्लिक करें। यह एक चालू मेलबॉक्स है जिसे IMAP के माध्यम से एक्सेस किया जा सकता है।
अब DKIM key के लिए। Configuration → ARC/DKIM keys पर जाएँ; डोमेन जोड़ते समय mailcow पहले से ही key जनरेट कर चुका हो सकता है, यदि नहीं, तो वहां एक नई key जनरेट करें — डोमेन चुनें, selector dkim रखें, 2048-bit चुनें, और Add पर क्लिक करें। दिखाई देने वाले लंबे TXT value को कॉपी करें और इसे इस प्रकार पब्लिश करें:
dkim._domainkey.example.com. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"mailcow के Domains पेज पर एक DNS बटन होता है जो सभी आवश्यक records की सूची दिखाता है। यह पब्लिश किए गए records के सामने हरा टिक (green tick) या लाल क्रॉस (red cross) दिखाता है। इसे अपनी checklist के रूप में उपयोग करें — deliverability टेस्ट करने से पहले सुनिश्चित करें कि हर row हरी (green) हो। पब्लिश करने के बाद DKIM row का लाल होना आमतौर पर यह दर्शाता है कि key को TXT chunks में गलत तरीके से विभाजित किया गया है; 2048-bit key एक single TXT string की 255-character सीमा से अधिक लंबी होती है, इसलिए इसे एक logical value के रूप में पेस्ट करें और अपने DNS host को इसे chunks में विभाजित करने दें।
Step 7 — Deliverability test karein aur 10/10 score prapt karein
mail-tester.com par jayein, wahan dikhaye gaye random address ko copy karein, aur apne naye mailbox se us par ek message bhejein — https://mail.example.com/SOGo par SOGo webmail mein log in karein aur wahan se email bhejein. Phir "Then check your score" par click karein.
10/10 score ka lakshya rakhein. Score kam hone ke mukhya karan:
- SPF not aligned — aapka
MX/SPF record missing hai ya sending IP cover nahi hai. SPF TXT record ko phir se check karein. - DKIM signature does not verify —
dkim._domainkeyTXT missing hai, abhi propagate ho raha hai, ya corrupt hai. Yeh sabse aam samasya hai. - No PTR / PTR mismatch — reverse DNS,
mail.example.compar resolve nahi ho raha hai. Isse provider ke paas fix karein. - Listed on a blocklist — aapke IP ki purani reputation. Delisting ke liye request karein ya naya clean IP maangein.
Jab tak score 10/10 na ho jaye, Gmail ya Outlook par real mail na bhejein. Low score aur naya IP milne se aapka domain pehle hi din flag ho sakta hai.
Step 8 — एक real mail client को कनेक्ट करें
Thunderbird, Apple Mail, या अपने phone को इन settings के साथ server पर point करें। सभी के लिए server host mail.example.com है:
- IMAP: port 993, SSL/TLS (या STARTTLS के साथ 143)
- SMTP submission: port 465, SSL/TLS (या STARTTLS के साथ 587)
- Username: पूरा address,
you@example.com - Password: आपके द्वारा सेट किया गया mailbox password
Port 25 के माध्यम से client mail कभी न भेजें — यह port केवल server-to-server के लिए है, mailcow वहां authenticated submission की सुविधा नहीं देता है, और client को refuse कर दिया जाएगा। यदि client Relay access denied report करता है, तो वह port 25 पर या बिना authentication के भेजने की कोशिश कर रहा है; इसे अपने mailbox credentials के साथ 465 या 587 पर switch करें।
Step 9 — महत्वपूर्ण डेटा का बैकअप लें
mailcow एक backup script प्रदान करता है जो सभी stateful volumes का snapshot लेता है। इसे किसी external disk या mounted remote पर चलाएँ:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall छह चीज़ों को कैप्चर करता है, और इनमें से किसी एक के भी खो जाने पर डेटा का नुकसान होगा: vmail (वास्तविक mailboxes), crypt (वे keys जो vmail को decrypt करती हैं — इनके बिना vmail बेकार है), mysql (MariaDB जिसमें domains, users, aliases और settings होती हैं), redis (queue और cache state), rspamd (learned spam/ham), और postfix (mail queue)। यह एक helper container के अंदर चलता है जो compressed archives लिखता है, इसलिए stack के live होने पर भी backups consistent रहते हैं। इसे nightly cron job के साथ automate करें, और पुराने sets को हटाने के लिए --delete-days 14 का उपयोग करें। Restore करने के लिए वही script restore के साथ चलाएँ, जो snapshots की सूची दिखाता है और आपको चुनने की अनुमति देता है कि क्या वापस लाना है। जिस backup का आपने कभी test-restore नहीं किया है, वह केवल एक उम्मीद है, backup नहीं — किसी scratch VPS पर एक dry run ज़रूर करें।
Step 10 — एक schedule पर update करें
mailcow अपने स्वयं के script के माध्यम से update करता है। यह script नए code को pull करता है, mailcow.conf को migrate करता है, images को prefetch करता है, और containers को इस क्रम में restart करता है:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itपहले backup लें (Step 9), क्योंकि schema migration को reverse करना कठिन होता है। Updates अक्सर आते हैं और इनमें internet-facing daemons के लिए security fixes शामिल होते हैं। इसलिए, mail server को महीनों तक बिना update के न छोड़ें। यदि कोई update किसी container को unhealthy छोड़ देता है, तो sudo docker compose logs --tail=50 <service>-mailcow उस daemon का नाम बताता है जो वापस start होने में विफल रहा।
Hardening पर एक नोट
mailcow अपना स्वयं का netfilter service (netfilter-mailcow) चलाता है। यह mail और webmail ports पर हमला करने वाले IPs को ban कर देता है, इसलिए mail side डिफ़ॉल्ट रूप से सुरक्षित है। यह host पर मौजूद SSH को सुरक्षित नहीं करता है। SSH अभी भी खुला है और उस पर brute-force हमले हो रहे हैं। इस setup के साथ Fail2ban का उपयोग SSH auth log मॉनिटर करने के लिए और key-only login का उपयोग करें। mailcow admin UI के लिए एक मजबूत password रखें। आदर्श रूप से, इसे public internet से दूर या VPN के पीछे रखें।
Failure modes, exact strings के साथ
Mail queues और delivery fail होना। sudo docker compose exec postfix-mailcow postqueue -p चलाएँ, या admin UI में mail queue देखें; entries इस error के साथ deferred रहती हैं:
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)इसका अर्थ है कि आपके provider द्वारा outbound port 25 block किया गया है (Step 1)। कोई भी config इसे ठीक नहीं कर सकता — एक ticket open करें। यह DNS या TLS की समस्या नहीं है; port 25 पर remote MX के विरुद्ध timed out शब्द से इसका पता चलता है।
Gmail सब कुछ spam मार्क करता है, या bounce कर देता है। Gmail में message खोलें, "Show original" चुनें, और auth results पढ़ें। dkim=fail या dkim=none का अर्थ है कि आपका dkim._domainkey TXT record missing, mangled, या अभी तक propagate नहीं हुआ है — ARC/DKIM page पर जैसा दिखाया गया है वैसा ही republish करें और TTL का इंतज़ार करें। spf=fail का अर्थ है कि SPF/MX records आपके IP को cover नहीं करते हैं। Alignment सबसे महत्वपूर्ण है; एक check का fail होना भी spam में जाने के लिए काफी है।
Connect करते समय बड़े providers द्वारा reject किया जाना। Bounces या Postfix logs में Gmail का PTR rejection मिलता है:
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.550 5.7.25 code का अर्थ है missing या mismatched reverse DNS। अपने provider के पास अपने IP के लिए PTR को mail.example.com पर सेट करें (Step 2)। Forward (A) और reverse (PTR) records एक समान होने चाहिए, और दोनों में वही host name होना चाहिए जिससे mailcow अन्य servers से बात करता है।
Browser में certificate warning दिखना जो कभी ठीक नहीं होती। acme-mailcow container real cert प्राप्त करने में fail हो गया है। इसका log चेक करें:
sudo docker compose logs acme-mailcow | tail -n 40Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. जैसी line या challenge failure का अर्थ है कि internet से port 80 reachable नहीं है, या A record इस server की ओर point नहीं कर रहा है। Confirm करें कि mail.example.com इस box को resolve करता है, host firewall में 80 और 443 ports open करें, और सुनिश्चित करें कि कोई अन्य service इन ports को bind नहीं कर रही है। Cause ठीक करने के बाद, एक घंटे के back-off का इंतज़ार करने के बजाय sudo docker compose restart acme-mailcow के साथ client को restart करें।
FAQ
क्या self-hosting email वास्तव में फायदेमंद है?
यदि आप data ownership, unlimited aliases, और पूर्ण नियंत्रण चाहते हैं, तो हाँ — mailcow आपको VPS की कीमत पर एक professional stack प्रदान करता है। लेकिन deliverability एक निरंतर काम है: IP reputation, DNS alignment, और blocklist monitoring कभी समाप्त नहीं होते। यदि आपका business address mission-critical है और spam folder में एक दिन का नुकसान भी भारी पड़ता है, तो managed provider चुनना ही व्यावहारिक है। self-host तभी करें जब आप convenience के बजाय control को महत्व देते हों और आप इसकी देखभाल कर सकें।
मुझे कैसे पता चलेगा कि outbound port 25 blocked है?
Server से nc -vz -w 5 gmail-smtp-in.l.google.com 25 चलाएँ। "succeeded!" का अर्थ है कि यह open है; pause के बाद timed out का अर्थ है कि आपका provider इसे block करता है। self-hosted server द्वारा mail प्राप्त करने में सक्षम होना लेकिन send न कर पाने का यह सबसे सामान्य कारण है। इसका एकमात्र समाधान आपके provider द्वारा port को open करना है — कोई भी local setting इसे ठीक नहीं कर सकती।
मेरा mail अभी भी Gmail के spam folder में क्यों जा रहा है?
लगभग हमेशा यह authentication chain के टूटने के कारण होता है। Gmail में "Show original" का उपयोग करें और spf=pass, dkim=pass, और dmarc=pass देखें। dkim=fail का अर्थ है कि dkim._domainkey TXT record गायब है या गलत है; PTR mismatch या बिना sending history वाला नया IP भी समस्या पैदा करता है। पहले mail-tester.com पर 10/10 स्कोर प्राप्त करें, फिर IP को धीरे-धीरे warm करें — पहले दिन भारी मात्रा में mail भेजने के बजाय, प्रतिदिन कुछ messages से शुरुआत करें।
मुझे वास्तव में क्या backup करना चाहिए?
backup_and_restore.sh backup all चलाएँ और पूरे set को server से बाहर रखें। यह vmail (mailboxes), crypt (keys जो उन्हें decrypt करती हैं), MariaDB database (domains, users, aliases, settings), Redis, Rspamd का learned data, और Postfix queue को सुरक्षित करता है। लोग अक्सर crypt volume को भूल जाते हैं — इसके बिना vmail backup unreadable ciphertext होगा। कम से कम एक बार किसी scratch box पर restore करके test जरूर करें।
क्या मैं 2 GB VPS पर mailcow चला सकता हूँ?
आराम से नहीं। generate_config.sh लगभग 2.5 GiB से कम memory होने पर ClamAV को disable करने का विकल्प देता है, फिर भी Rspamd, ClamAV, Dovecot और MariaDB memory के लिए compete करते हैं। वास्तविक load के दौरान आप swap और OOM kills का सामना करेंगे। एक stable single-user install के लिए 6 GiB plus 1 GiB swap को minimum मानकर चलें, और जैसे ही दो से अधिक लोग इसका उपयोग करने लगें, 8 GiB पर स्विच करें।