VPS-এ mailcow: Gmail গ্রহণ করে এমন email server
mailcow ইনস্টল করার আগে outbound port 25 পরীক্ষা করুন। Block থাকলে mail queue ছাড়বে না। তারপর Gmail-এর 550 5.7.25 PTR rejection ঠেকাতে DNS সেট করুন।
আপনি যা তৈরি করবেন
আপনার মালিকানাধীন একটি সার্ভারে একটি সম্পূর্ণ mail server: বার্তা পাঠানো ও গ্রহণের জন্য SMTP, ফোন ও ল্যাপটপের মধ্যে সমন্বয় রাখার জন্য IMAP, একটি webmail client এবং উভয় দিকের প্রতিটি বার্তার স্কোর নির্ধারণের জন্য একটি spam filter। mailcow-dockerized Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis এবং একটি ACME client-কে একটি Docker Compose stack-এ একত্র করে। তাই software-ই মূল কঠিন অংশ নয়। আধা ঘণ্টার মধ্যে এটি চালু করতে পারবেন।
মূল কঠিন অংশ হলো এর চারপাশের সবকিছু। Email এমন একটি service, যেখানে Internet-এর বাকি অংশ নতুন server-কে সক্রিয়ভাবে অবিশ্বস্ত হিসেবে বিবেচনা করে। "এটি কাজ করছে" এবং "Gmail নীরবে প্রতিটি message বাতিল করে"—এই দুই অবস্থার পার্থক্য চারটি DNS record এবং একটি IP reputation setting-এর ওপর নির্ভর করে, যার ওপর আপনার সম্পূর্ণ নিয়ন্ত্রণ নাও থাকতে পারে। কোনো কিছু rent করার আগে নিচের prerequisites পড়ুন। এগুলো পড়ার পরে যদি reputation গড়ে তোলার প্রক্রিয়াটি আপনার কাছে সময়সাপেক্ষ বলে মনে হয়, সেটিও একটি গ্রহণযোগ্য সিদ্ধান্ত। 2026 সালে self-hosting করার মতো বিষয়গুলোর আমাদের সংক্ষিপ্ত তালিকা এই কারণেই email-কে "শুধু সত্যিই চাইলে" বিভাগে রেখেছে।
Prerequisite-ই আসল প্রকল্প
এর যেকোনো একটি বাদ পড়লে এমন mail পাঠাবেন, যা কখনও গন্তব্যে পৌঁছাবে না। কোন বিষয়টি কত ঘন ঘন সমস্যা তৈরি করে, তার আনুমানিক ক্রমে:
Outbound port 25 অবশ্যই খোলা থাকতে হবে। আপনার server TCP port 25 ব্যবহার করে Gmail ও Microsoft-এ mail deliver করে। Spam দমন করতে অনেক VPS ও cloud provider ডিফল্টভাবে outbound port 25 block করে। এই block নীরবে কার্যকর থাকে। Boot-এর সময় কোনো error দেখা যায় না, সবকিছু স্বাভাবিক মনে হয়, কিন্তু mail কেবল queue-তে চিরকাল পড়ে থাকে। কিছু install করার আগে এটি test করুন। Block করা থাকলে একমাত্র সমাধান হলো support ticket খুলে provider-কে এটি খুলে দিতে বলা। কিছু provider পুরোনো account-এর জন্য এটি খুলে দেয়, আবার কিছু provider কখনও খুলবে না।
ব্যবহারযোগ্য reputation-সহ পরিষ্কার IP। Recycled VPS IP আগের tenant-এর spam-এর কারণে প্রায়ই blocklist-এ থাকে। সিদ্ধান্ত নেওয়ার আগে Spamhaus lookup বা mxtoolbox-এর মতো service-এ আপনার IP পরীক্ষা করুন। Listed IP থাকলে এমন rejection হবে, যা code দিয়ে সমাধান করা যায় না।
DNS নিয়ন্ত্রণ এবং সঠিক PTR record। আপনার domain-এর zone-এ record যোগ করতে হবে। Server-এর IP-এর জন্য reverse DNS (PTR) সেট করতে হবে, যাতে তা আপনার mail hostname-এ নির্দেশ করে। PTR প্রায় কখনও আপনার DNS panel-এ সেট করা থাকে না। এটি IP-এর মালিকের ব্যবস্থাপনায় থাকে। তাই এটি আপনার VPS provider-এর control panel থেকে অথবা support ticket-এর মাধ্যমে সেট করতে হবে।
6 GiB RAM এবং 2 vCPU হলো আরামদায়ক ন্যূনতম স্তর। Private install-এর জন্য mailcow-এর নিজস্ব minimum হলো 6 GiB RAM এবং অতিরিক্ত 1 GiB swap। কয়েকজন user নির্ভর করা শুরু করলে 8 GiB RAM ব্যবহারের পরামর্শ দেওয়া হয়। প্রায় 2.5 GiB-এর নিচে গেলে generate_config.sh ClamAV virus scanner disable করার প্রস্তাব দেয়, যাতে kernel container kill করা শুরু না করে। শুরুতে এর জন্য 20 GB SSD বরাদ্দ করুন।
Bare IP নয়, একটি DNS name। mail.example.com-এর মতো একটি hostname বেছে নিন। এই একটিমাত্র name আপনার MAILCOW_HOSTNAME, TLS certificate subject, PTR target এবং SMTP banner হিসেবে ব্যবহৃত হবে। সব জায়গায় এটি একই রাখুন।
ধাপ 1, outbound port 25 খোলা আছে কি না নিশ্চিত করুন
এটি প্রথমে করুন। এটি ব্যর্থ হলে পরের সব কাজই সময়ের অপচয়। সদ্য তৈরি VPS থেকে একটি প্রকৃত mail server-এর সঙ্গে SMTP সংযোগ খোলার চেষ্টা করুন:
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!port block করা থাকলে সংযোগটি পুরো পাঁচ সেকেন্ড অপেক্ষা করবে, তারপর ব্যর্থ হবে:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressএই timeout-ই block হওয়ার প্রমাণ। এটি provider-এর দিকের 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, অর্থাৎ অন্য server আপনার server-এ সংযোগ করছে কি না, একটি আলাদা পথ এবং সাধারণত খোলা থাকে। Provider-রা সাধারণত outbound দিকটিই সীমিত করে।
ধাপ 2, এখন DNS record সেট করুন
DNS পরিবর্তন কার্যকর হতে সময় লাগে। তাই installation শুরু করার আগে যতটা সম্ভব সবকিছু 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 পাঠাতে পারবে; বাকিগুলো প্রত্যাখ্যান করুন।” নিজের mail reject না করে report পর্যবেক্ষণ করতে DMARC শুরু করুন p=none দিয়ে। Alignment যাচাই হয়ে গেলে এটি প্রথমে p=quarantine এবং পরে p=reject-এ কঠোর করুন। দুটি record ইচ্ছাকৃতভাবে এখনো অনুপস্থিত: DKIM, যা Step 6-এ mailcow আপনার জন্য তৈরি করবে, এবং PTR, যা এখন আপনার provider-এর panel-এ সেট করতে হবে।
10.0.0.10-এর জন্য PTR (reverse DNS) mail.example.com-এ সেট করুন; এর exact value হলো MAILCOW_HOSTNAME। অধিকাংশ মানুষ এই একক record-টি ভুলে যান, কিন্তু বড় provider-গুলো এটি না থাকলে mail প্রত্যাখ্যান করে। আপনার panel-এ rDNS field না থাকলে একটি ticket খুলুন।
ধাপ 3, Docker ইনস্টল করুন
mailcow-এর জন্য Compose v2 plugin-সহ Docker Engine প্রয়োজন। Ubuntu-এর docker.io package ব্যবহার না করে Docker-এর official convenience script ব্যবহার করুন। ওই package-এ কোনো Compose plugin নেই:
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 ইনস্টল হয়নি। Docker-এর repository থেকে plugin ইনস্টল করুন, উপরের script আবার চালান, অথবা আমাদের Docker Compose-এর মৌলিক নির্দেশিকা অনুসরণ করুন। ওই নির্দেশিকায় Docker-এর নিজস্ব apt repository থেকে দুটিই সেটআপ করা হয়।
ধাপ 4, mailcow ক্লোন করুন এবং configuration তৈরি করুন
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shপ্রথমে দেখুন umask চালালে 0022 দেখায় কি না। অস্বাভাবিক file mask থাকলে mailcow build করতে অস্বীকার করে। নতুন Ubuntu 24.04 root shell-এ ইতিমধ্যেই 0022 সেট করা থাকে। এরপর script-টি গুরুত্বপূর্ণ একমাত্র তথ্যটি জানতে চায়: fully qualified hostname। mail.example.com লিখুন। এর মান আপনার A record এবং PTR-এর সঙ্গে হুবহু মিলতে হবে। এটি mailcow.conf লিখে, যেটি পুরো stack ব্যবহার করা একমাত্র environment file। Web port পরিবর্তন করতে চাইলে (HTTP_PORT, HTTPS_PORT), অথবা ছোট server-এ ClamAV বন্ধ করতে চাইলে file-টি খুলুন:
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কম RAM-এর server-এ SKIP_FTS=y হলো আরেকটি গুরুত্বপূর্ণ setting। mailcow-এর documentation অনুযায়ী full-text search দ্বিতীয় বৃহত্তম memory ব্যবহারকারী। এটি বাদ দিলে webmail-এ শুধু message body search করা যাবে না।
অন্য কোনো service আগে থেকেই ব্যবহার না করলে HTTP_PORT=80 এবং HTTPS_PORT=443 অপরিবর্তিত রাখুন। Certificate সংগ্রহের জন্য mailcow-এর built-in ACME client-এর port 80 Internet থেকে reachable থাকা প্রয়োজন। তাই একই server-এ আলাদা nginx-plus-Certbot setup চালাবেন না। mailcow নিজেই অভ্যন্তরীণভাবে TLS certificate issue ও renew করে। port 80 বা 443-এ দ্বিতীয় কোনো service listening করলে এই কাজ ব্যর্থ হবে। Public web front end প্রয়োজন এমন অন্য service-এর ক্ষেত্রেও একই নিয়ম প্রযোজ্য। তাই Halcyon দিয়ে Jellyfin library-কে 90s video store হিসেবে সাজানো-এর মতো build, যেটি 443-এ নিজের reverse proxy প্রত্যাশা করে, আলাদা host-এ রাখা উচিত। তবে কোনো service-এর public web port প্রয়োজন না হলে সেটি ব্যতিক্রম। Self-hosted RustDesk relay শুধু নিজের 21115 থেকে 21119 port range-এ listening করে। তাই পর্যাপ্ত অতিরিক্ত bandwidth থাকলে এটি একই server-এ চালানো যায়।
ধাপ 5: স্ট্যাক চালু করে লগ ইন করুন
sudo docker compose pull
sudo docker compose up -d
sudo docker compose pspull প্রক্রিয়ায় প্রায় দুই ডজন image ডাউনলোড হয়; কয়েক মিনিট সময় দিন। docker compose ps-এ প্রতিটি container-এর অবস্থা running (অথবা healthy) দেখালে browser-এ https://mail.example.com খুলুন। ডিফল্ট admin login হলো username admin এবং password moohoo। Access → Administrators-এর অধীনে admin UI থেকে অবিলম্বে এই password পরিবর্তন করুন। browser NET::ERR_CERT_AUTHORITY_INVALID সতর্কতা দেখালে ধরে নেবেন না যে এটি নষ্ট হয়েছে; ACME certificate এখনো issue নাও হয়ে থাকতে পারে। নিচের ACME failure অংশ দেখুন। প্রথম এক বা দুই মিনিট self-signed placeholder থাকা স্বাভাবিক।
ধাপ 6, একটি domain, mailbox যোগ করুন এবং DKIM প্রকাশ করুন
Admin UI-তে Mail Setup পৃষ্ঠা খুলুন (Configuration → Mail Setup)। এরপর Domains tab-এ Add domain-এ ক্লিক করে example.com লিখুন। তারপর Mailboxes-এর অধীনে Add mailbox-এ ক্লিক করে password-সহ you@example.com তৈরি করুন। এটি ইতিমধ্যেই IMAP-এর মাধ্যমে পৌঁছানো যায় এমন একটি কার্যকর mailbox।
এখন DKIM key তৈরি করুন। Configuration → ARC/DKIM keys-এ যান। Domain যোগ করার সময় mailcow হয়তো ইতিমধ্যে একটি key তৈরি করেছে। না হলে সেখানেই একটি key তৈরি করুন, domain নির্বাচন করুন, 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 button আছে। এটি প্রত্যাশিত প্রতিটি record তালিকাভুক্ত করে এবং বাস্তবে প্রকাশিত record-এর পাশে সবুজ টিক বা লাল ক্রস দেখায়। এটিকে checklist হিসেবে ব্যবহার করুন। Deliverability পরীক্ষা করার আগে প্রতিটি row সবুজ করুন। প্রকাশ করার পর DKIM row লাল থাকলে সাধারণত key ভুলভাবে একাধিক TXT chunk-এ ভাগ করা হয়েছে। একটি 2048-bit key-এর দৈর্ঘ্য একটি একক TXT string-এর 255-character সীমার চেয়ে বেশি। তাই এটিকে একটি logical value হিসেবে paste করুন এবং আপনার DNS host-কে এটি নিজে থেকে chunk-এ ভাগ করতে দিন।
ধাপ 7, মেইল deliverability পরীক্ষা করুন এবং 10/10 অর্জন করুন
mail-tester.com-এ যান। সেখানে দেখানো random address কপি করুন। আপনার নতুন mailbox থেকে ওই address-এ একটি message পাঠান। SOGo webmail-এ https://mail.example.com/SOGo ঠিকানায় log in করে সেখান থেকেও message পাঠান। এরপর "Then check your score" ক্লিক করুন।
10/10 অর্জনের লক্ষ্য রাখুন। সাধারণত নিচের কারণে score কমে:
- SPF not aligned, আপনার
MX/SPF record অনুপস্থিত, অথবা sending IP এতে অন্তর্ভুক্ত নয়। SPF TXT আবার পরীক্ষা করুন। - DKIM signature does not verify,
dkim._domainkeyTXT অনুপস্থিত, এখনও propagate হয়নি, অথবা বিকৃত হয়েছে। এটিই সবচেয়ে সাধারণ সমস্যা। - No PTR / PTR mismatch, reverse DNS
mail.example.com-এ resolve হচ্ছে না। provider-এর কাছে এটি ঠিক করুন। - Listed on a blocklist, আপনার IP-এর আগের reputation-এর কারণে এটি blocklist-এ রয়েছে। delisting-এর অনুরোধ করুন অথবা cleaner IP চান।
এটি 10/10 না হওয়া পর্যন্ত Gmail বা Outlook-এ real mail পাঠাবেন না। নতুন IP-এর সঙ্গে low score থাকলে প্রথম দিনেই আপনার domain flag হওয়ার সম্ভাবনা থাকে।
ধাপ 8, একটি প্রকৃত mail client সংযুক্ত করুন
এই settings ব্যবহার করে Thunderbird, Apple Mail বা আপনার ফোনকে server-এর সঙ্গে সংযুক্ত করুন। সব client-এর জন্য 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 সেট করেছেন
client-এর mail কখনো port 25 দিয়ে পাঠাবেন না। এই port শুধু server-to-server mail-এর জন্য। mailcow এখানে authenticated submission দেয় না, তাই এই port-এ নির্দেশ করা client-এর সংযোগ প্রত্যাখ্যান করা হয়। কোনো client যদি Relay access denied দেখায়, তাহলে সেটি port 25-এ অথবা authentication ছাড়া mail পাঠানোর চেষ্টা করছে। আপনার mailbox credentials ব্যবহার করে সেটিকে 465 অথবা 587 port-এ STARTTLS বা SSL/TLS সহ configure করুন।
ধাপ 9, যা সত্যিই গুরুত্বপূর্ণ তার ব্যাকআপ নিন
mailcow একটি backup script সরবরাহ করে, যা প্রতিটি stateful volume-এর snapshot তৈরি করে। এটি একটি external disk বা mounted remote-এ চালান:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall ছয়টি জিনিস সংরক্ষণ করে। এগুলোর যেকোনো একটি হারালে data হারাবে: vmail (প্রকৃত mailbox), crypt (vmail decrypt করার key; এটি ছাড়া key-টি অকার্যকর), mysql (domain, user, alias ও setting সংরক্ষণকারী MariaDB), redis (queue ও cache state), rspamd (শেখা spam/ham তথ্য), এবং postfix (mail queue)। এটি একটি helper container-এর ভিতরে চলে এবং compressed archive লেখে। তাই stack চালু থাকলেও backup consistent থাকে। এটি nightly cron job দিয়ে automated করুন এবং পুরোনো set মুছে ফেলতে --delete-days 14 যোগ করুন। কোনো cron job কাজ করা বন্ধ করলে তা নীরবে ব্যর্থ হয়। তাই script-এর exit status এমন কোনো মাধ্যমে পাঠান, যা আপনি সত্যিই লক্ষ্য করবেন; self-hosted ntfy server একই cron entry থেকে এক লাইনের curl request গ্রহণ করে এবং failure ঘটার রাতেই আপনার ফোনে notification পাঠায়। Restore করার জন্য একই script-এর সঙ্গে restore ব্যবহার করুন। এটি snapshot-এর তালিকা দেখায় এবং কোন data ফিরিয়ে আনবেন তা বেছে নেওয়ার সুযোগ দেয়। যে backup কখনো test-restore করা হয়নি, সেটি backup নয়, শুধু আশা। একটি scratch VPS-এ dry run করে দেখুন।
ধাপ 10, নির্ধারিত সময়সূচি অনুযায়ী আপডেট করুন
mailcow নিজস্ব script ব্যবহার করে আপডেট হয়। এই script নতুন code আনে, mailcow.conf migrate করে, image prefetch করে এবং ক্রমানুসারে container restart করে:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itপ্রথমে backup নিন (ধাপ 9), কারণ schema migration আগের অবস্থায় ফিরিয়ে নেওয়া কঠিন। আপডেট নিয়মিত প্রকাশিত হয় এবং Internet-facing daemon-এর জন্য security fix অন্তর্ভুক্ত থাকে। তাই mail server-কে কয়েক মাস আপডেট না করে রাখবেন না। কোনো আপডেটের পরে কোনো container unhealthy থাকলে, sudo docker compose logs --tail=50 <service>-mailcow যে daemon আবার চালু হতে পারেনি তার নাম দেখায়।
হার্ডেনিং সম্পর্কে একটি নোট
mailcow নিজস্ব netfilter service (netfilter-mailcow) চালায়। এটি mail ও webmail port-এ অতিরিক্ত অনুরোধ পাঠানো IP-গুলো ban করে। তাই mail অংশটি ডিফল্টভাবেই সুরক্ষিত থাকে। তবে host-এর SSH এতে অন্তর্ভুক্ত নয়। SSH এখনও exposed থাকে এবং brute-force আক্রমণের শিকার হতে পারে। এই build-এর সঙ্গে SSH auth log monitor করা Fail2ban এবং key-only login ব্যবহার করুন। mailcow admin UI-তে শক্তিশালী password দিন। সম্ভব হলে এটিকে public internet-এর বাইরে রাখুন অথবা VPN-এর পেছনে রাখুন।
ব্যর্থতার ধরন এবং সঠিক string
Mail queue-তে বার্তা জমে থাকে, কিন্তু কখনো delivery হয় না। sudo docker compose exec postfix-mailcow postqueue -p চালান, অথবা admin UI-এর mail queue দেখুন। Entry-গুলো deferred অবস্থায় থেকে যায় এবং সেখানে দেখা যায়:
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)এর মানে provider outbound port 25 block করেছে (ধাপ 1)। কোনো configuration পরিবর্তন করে এটি ঠিক করা যায় না; support ticket খুলুন। এটি DNS বা TLS-এর সমস্যা নয়। Remote MX-এর port 25-এর ক্ষেত্রে timed out শব্দটি দেখা যাওয়াই এর প্রধান লক্ষণ।
Gmail সব বার্তাকে spam হিসেবে চিহ্নিত করে বা bounce করে। Gmail-এ বার্তাটি খুলে "Show original" নির্বাচন করুন এবং authentication result পড়ুন। dkim=fail বা dkim=none মানে আপনার dkim._domainkey TXT record অনুপস্থিত, বিকৃত, অথবা এখনো propagate হয়নি। ARC/DKIM page-এ দেখানো মানটি হুবহু পুনরায় publish করুন এবং TTL শেষ হওয়া পর্যন্ত অপেক্ষা করুন। spf=fail মানে SPF/MX record আপনার IP অন্তর্ভুক্ত করে না। Alignment অত্যন্ত গুরুত্বপূর্ণ; একটি check ব্যর্থ হলেই বার্তা spam folder-এ যেতে পারে।
Connect করার সময় বড় provider-গুলো প্রত্যাখ্যান করে। Bounce message বা Postfix log-এ 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-এর অর্থ reverse DNS অনুপস্থিত বা সঠিক নয়। Provider-এর কাছে আপনার IP-এর PTR mail.example.com-এ সেট করুন (ধাপ 2)। Forward (A) এবং reverse (PTR) record-এর মধ্যে মিল থাকতে হবে, এবং উভয় record-এ একই host-এর নাম থাকতে হবে, যে host name হিসেবে mailcow অন্য server-কে নিজের পরিচয় দেয়।
Browser এমন certificate warning দেখায়, যা কখনো দূর হয় না। acme-mailcow container একটি বৈধ certificate সংগ্রহ করতে পারেনি। এর log পরীক্ষা করুন:
sudo docker compose logs acme-mailcow | tail -n 40Cannot validate any hostnames, skipping Let's Encrypt for 1 hour.-এর মতো line বা challenge failure-এর অর্থ port 80 Internet থেকে reachable নয়, অথবা A record এই server-এ নির্দেশ করছে না। mail.example.com এই machine-এ resolve হচ্ছে কি না নিশ্চিত করুন, host firewall-এর মাধ্যমে 80 এবং 443 port খুলুন, এবং অন্য কোনো process ওই port-গুলোতে listen করছে কি না পরীক্ষা করুন। কারণ ঠিক করার পরে এক ঘণ্টার back-off শেষ হওয়ার অপেক্ষা না করে sudo docker compose restart acme-mailcow দিয়ে client restart করুন।
FAQ
স্ব-হোস্ট করা ইমেইল কি সত্যিই সার্থক?
ডেটার মালিকানা, সীমাহীন alias এবং সম্পূর্ণ নিয়ন্ত্রণ চাইলে হ্যাঁ, VPS-এর মূল্যে mailcow আপনাকে একটি পেশাদার stack দেয়। তবে deliverability বজায় রাখা নিয়মিত কাজ: IP reputation, DNS alignment এবং blocklist monitoring কখনো পুরোপুরি শেষ হয় না। কোনো গুরুত্বপূর্ণ business address-এর ক্ষেত্রে, যেখানে একজনের spam folder-এ একটি দিন পড়ে থাকলেও আপনার ক্ষতি হয়, managed provider ব্যবহার করাই বাস্তবসম্মত সিদ্ধান্ত। সুবিধার চেয়ে নিয়ন্ত্রণকে বেশি মূল্য দিলে এবং এটি নিয়মিত পরিচালনা করতে পারলে self-host করুন। আপনার প্রকৃত লক্ষ্য যদি বিশেষভাবে ইমেইল নয়, বরং অন্য কারও server থেকে নিজের data সরিয়ে রাখা হয়, তাহলে এমন একটি service দিয়ে শুরু করুন যার বিষয়ে অন্য কেউ সিদ্ধান্ত নিতে পারে না: photo library-তে deliverability সমস্যা একেবারেই নেই, এবং একই ধরনের VPS-এ সেই build-এর জন্য প্রয়োজনীয় RAM floor ও backup command আমাদের PhotoPrism ও Immich তুলনা-এ ব্যাখ্যা করা হয়েছে।
Outbound port 25 block করা আছে কি না কীভাবে বুঝব?
Server থেকে nc -vz -w 5 gmail-smtp-in.l.google.com 25 চালান। "succeeded!" দেখালে port-টি খোলা আছে; pause-এর পরে timed out দেখালে provider এটি block করছে। এটি self-hosted server mail receive করতে পারলেও send করতে না পারার সবচেয়ে সাধারণ কারণ, এবং একমাত্র সমাধান হলো provider-এর port-টি খুলে দেওয়া; কোনো 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-ও deliverability ক্ষতিগ্রস্ত করে। প্রথমে mail-tester.com-এ 10/10 পাওয়ার চেষ্টা করুন। এরপর IP ধীরে ধীরে warm up করুন—প্রতিদিন কয়েকটি message দিয়ে শুরু করে সংখ্যা বাড়ান; প্রথম দিনেই বেশি volume পাঠাবেন না।
ঠিক কোন কোন জিনিসের backup নিতে হবে?
backup_and_restore.sh backup all চালিয়ে সম্পূর্ণ set-টি server-এর বাইরে সংরক্ষণ করুন। এতে vmail (mailbox), crypt (mailbox decrypt করার key), MariaDB database (domain, user, alias ও setting), Redis, Rspamd-এর learned data এবং Postfix queue অন্তর্ভুক্ত থাকে। crypt volume-টি অনেকে বাদ দেন। এটি ছাড়া vmail backup পড়া যায় না, কারণ তা ciphertext হিসেবে থাকে। অন্তত একবার একটি অস্থায়ী scratch box-এ restore পরীক্ষা করুন।
2 GB VPS-এ কি mailcow চালানো যায়?
স্বাচ্ছন্দ্যে নয়। প্রায় 2.5 GiB-এর কম memory থাকলে generate_config.sh ClamAV disable করার প্রস্তাব দেয়। তারপরও Rspamd, ClamAV, Dovecot এবং MariaDB memory-এর জন্য প্রতিযোগিতা করে। ফলে বাস্তব load-এ swap এবং OOM kill-এর সম্মুখীন হবেন। স্থিতিশীল single-user install-এর জন্য 6 GiB-এর সঙ্গে 1 GiB swap-কে ন্যূনতম সীমা ধরুন। একাধিক মানুষের নির্ভরতা তৈরি হলেই 8 GiB-এ upgrade করুন।