Jinsi ya kuweka mailcow kwenye VPS
Angalia kama port 25 imefunguliwa kabla ya kuanza. Jifunze jinsi ya kurekebisha makosa ya DNS ili Gmail isikatae ujumbe wako kwa kosa la 550 5.7.25 PTR.
Unachojenga
Seva ya barua pepe kamili kwenye kifaa chako: SMTP kwa kutuma na kupokea, IMAP ili simu na laptop yako zibaki sawa, mteja wa webmail, na chujio la spam linalopima kila ujumbe kwa pande zote mbili. mailcow-dockerized inajumuisha Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis, na mteja wa ACME kwenye stack moja ya Docker Compose, hivyo programu si sehemu ngumu. Utakuwa umeiweka tayari ndani ya nusu saa.
Sehemu ngumu ni kila kitu kinachozunguka seva hiyo. Barua pepe ni huduma ambayo mtandao wote unauogopa seva mpya kabisa, na tofauti kati ya "inafanya kazi" na "Gmail inafuta kila ujumbe kimya kimya" inategemea rekodi nne za DNS na mipangilio moja ya IP-reputation ambayo huenda usiweze kuidhibiti kikamilifu. Soma mahitaji ya awali hapa chini kabla ya kukodisha seva yoyote. Ukiamua kuwa juhudi za kuimarisha reputation hazilipwi baada ya kusoma, hiyo ni jibu sahihi — mchanganuo wetu wa kile kinachostahili kujihostia mwenyewe mwaka 2026 unataja barua pepe chini ya "ikiwa tu una nia ya kweli" kwa sababu hizi hasa.
Mahitaji ya awali NI mradi wenyote
Ukikosa hata moja kati ya haya, utatuma barua pepe ambazo hazitafika kamwe. Hii imewekwa kulingana na mfuatano wa mara ambazo kila moja husababisha kushindwa:
Port 25 ya outbound lazima iwe wazi. Server yako hutuma barua pepe kwenda Gmail na Microsoft kupitia TCP port 25. Washindani wengi wa VPS na cloud huzuia port 25 ya outbound kwa kutoa kizuizi cha kiufundi ili kupambana na spam. Kizuizi hiki hakitoi kosa wakati wa kuwasha mfumo; kila kitu kitaonekana kuwa sawa, lakini barua pepe itabaki kwenye queue milele. Ijaribu kabla ya kusakinisha kitu chochote. Ikiwa imezuiwa, suluhisho pekee ni kufungua ticket ya support ili kuomba mtoa huduma wako aifungue; baadhi hufanya hivyo kwa akaunti za zamani, na wengine hawatafanya hivyo kamwe.
IP safi yenye reputeshoni inayofanya kazi. IP za VPS zilizorejeshwa mara nyingi huwa tayari zipo kwenye blocklists kutokana na spam ya mtumiaji wa awali. Kagua IP yako kwenye huduma kama Spamhaus lookup au mxtoolbox kabla ya kuanza. IP iliyoorodheshwa kwenye blacklist inamaanisha barua pepe zitakataliwa na huwezi kutatua tatizo hilo kwa kurekebisha kodi.
Udhibiti wa DNS pamoja na rekodi sahihi ya PTR. Unahitaji kuongeza rekodi kwenye zone ya domain yako, na unahitaji reverse DNS (PTR) kwa IP ya server inayoelekeza kwenye hostname ya barua pepe yako. PTR mara nyingi haipatikani kwenye panel yako ya DNS — inamilikiwa na mmiliki wa IP, hivyo inatakiwa kuwekwa kwenye control panel ya mtoa huduma wako wa VPS au kupitia ticket.
6 GiB RAM na 2 vCPU ndio kiwango cha chini cha utendaji mzuri. Kiwango cha chini cha mailcow ni 6 GiB RAM pamoja na 1 GiB swap kwa install ya binafsi, huku 8 GiB ikishauriwa pindi watumiaji kadhaa wanapoanza kutumia mfumo huo. Chini ya takriban 2.5 GiB, generate_config.sh inatoa chaguo la kuzima virus scanner ya ClamAV ili kernel isianze kuua containers. Anza kwa kutoa 20 GB ya SSD.
Jina la DNS, siyo IP pekee. Chagua hostname kama mail.example.com. Jina hilo litakuwa MAILCOW_HOSTNAME yako, subject ya TLS certificate yako, lengo la PTR yako, na SMTP banner yako. Liweke sawa kila mahali.
Hatua ya 1 — Thibitisha kuwa port 25 ya outbound iko wazi
Fanya hivi kwanza. Kazi nyingine zote zitakuwa bure ikiwa itafeli. Kutoka kwenye VPS mpya, jaribu kuanzisha mazungumzo ya SMTP na mail server halisi:
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25Matokeo ya mafanikio yanatokea mara moja:
Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!Port iliyozuiwa itasubiri kwa sekunde tano kamili, kisha itafeli:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressKuchelewa huko (timeout) kunamaanisha port imezuiwa. Ni kichungi cha mtandao cha upande wa mtoa huduma, siyo firewall yako, hivyo mabadiliko ya ndani hayatayarekebisha. Fungua tiketi: "Tafadhali wezesha outbound TCP port 25 kwa VPS yangu kwenye <IP>; ninatumia mail server halali." Usisakinisha mailcow mpaka hali hii irudishe "succeeded". Kumbuka kuwa inbound 25 (server nyingine zinazofikia wewe) ni njia tofauti na kwa kawaida iko wazi — ni upande wa outbound ndio mtoa huduma huzuia.
Hatua ya 2 — Sanidi rekodi za DNS sasa
Mabadiliko ya DNS huchukua muda kuenea, hivyo chapisha kila kitu unachoweza kabla ya kusakinisha. Chukulia kuwa domain yako ni example.com, host ya barua pepe ni mail.example.com, na IP ni 10.0.0.10. Kwenye zone yako, tengeneza:
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"Rekodi ya SPF inasema "ni MX yangu pekee inayoweza kutuma kwa ajili ya domain hii, kataa nyingine zote". Anza DMARC kwa p=none ili uweze kufuatilia ripoti bila kurudisha barua pepe zako; kisha imarisha hadi p=quarantine na kisha p=reject baada ya usawa kuthibitishwa. Rekodi mbili bado hazipo kwa makusudi: DKIM, ambayo mailcow itakutengenezea kwenye Hatua ya 6, na PTR, ambayo utaiset sasa kwenye panel ya mtoa huduma wako.
Sanidi PTR (reverse DNS) kwa 10.0.0.10 kuwa mail.example.com — thamani kamili ya MAILCOW_HOSTNAME. Hii ni rekodi moja ambayo watu wengi husahau, na watoa huduma wakubwa hukataa kutokana na hitilafu hii. Ikiwa panel yako haina sehemu ya rDNS, fungua ticket.
Hatua ya 3 — Install Docker
mailcow inahitaji Docker Engine pamoja na Compose v2 plugin. Tumia script rasmi ya Docker badala ya package ya Ubuntu ya docker.io, ambayo haina Compose plugin:
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose versionUnapaswa kuona mstari wa Docker Compose version v2.x. Ikiwa docker compose version inaonyesha docker: 'compose' is not a docker command, Docker Engine imewekwa lakini Compose plugin haipo. Sakinisha plugin kutoka kwenye repository ya Docker — rudi na uendeshe script iliyo juu, au fuata mwongozo wetu wa Docker Compose basics, ambao unasakinisha zote mbili kutoka kwenye apt repository ya Docker.
Hatua ya 4 — Clone mailcow na utengeneze config
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shHakikisha umask inaonyesha 0022 kwanza — mailcow inakataa kujengwa ikiwa ina file mask isiyo sahihi, na shell ya root ya Ubuntu 24.04 mpya tayari inakupa 0022. Script itakuuliza jambo moja muhimu: hostname iliyokamilika (fully qualified hostname). Ingiza mail.example.com — thamani lazima ifanane na rekodi yako ya A na PTR kwa usahihi. Inatengeneza mailcow.conf, faili moja ya mazingira (environment file) ambayo stack nzima inaisoma. Ifungue ikiwa unahitaji kubadilisha web ports (HTTP_PORT, HTTPS_PORT) au kuzima ClamAV kwenye mashine yenye rasilimali ndogo:
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 ni chaguo lingine kwa mashine yenye RAM ndogo: full-text search ni kitu cha pili kinachotumia memory nyingi kulingana na nyaraka za mailcow, na kuacha kutumia chaguo hili kutakuacha tu bila uwezo wa kutafuta maandishi kwenye webmail.
Acha HTTP_PORT=80 na HTTPS_PORT=443 bila kubadilisha isipokuwa kama kuna huduma nyingine kwenye host inazitumia — ACME client ya mailcow inahitaji port 80 iwe inafikika kutoka internet ili kupata cheti (certificate). Hii ndiyo sababu hupasimwi kutumia setup tofauti ya nginx-plus-Certbot kwenye mashine hiyo hiyo; mailcow hutoa na kuhuisha TLS yake yenyewe ndani; huduma nyingine inayotumia port 80/443 itavuruga mchakato huo.
Hatua ya 5 — Anza stack na ingia
sudo docker compose pull
sudo docker compose up -d
sudo docker compose psAmri ya pull inapakua takriban picha (images) kumi na mbili; subiri kwa dakika chache. Wakati docker compose ps inapoonyesha kila container running (au healthy), fungua https://mail.example.com kwenye kivinjari (browser). Logini ya admin ya kawaida ni jina la mtumiaji admin, nywila moohoo. Badilisha nywila hiyo mara moja kwenye UI ya admin chini ya Access → Administrators. Ikiwa kivinjari kinatoa onyo la NET::ERR_CERT_AUTHORITY_INVALID, cheti cha ACME bado hakijatolewa — angalia hitilafu ya ACME hapa chini kabla ya kudhani kuwa imevunjika; cheti cha self-signed ni hali ya kawaida kwa dakika moja au mbili za kwanza.
Hatua ya 6 — Kuongeza domain, mailbox, na kuchapisha DKIM
Kwenye admin UI, fungua ukurasa wa Mail Setup (Configuration → Mail Setup), na chini ya tab ya Domains bofya Add domain na uingize example.com. Kisha, chini ya Mailboxes, bofya Add mailbox ili kutengeneza you@example.com pamoja na nywila. Hii itakuwa mailbox inayofanya kazi na inayoweza kufikiwa kupitia IMAP.
Sasa kuhusu DKIM key. Nenda kwenye Configuration → ARC/DKIM keys; mailcow inaweza kuwa tayari imetengeneza key wakati ulipoongeza domain, na kama haijatengenezwa, tengeneza hapo — chagua domain, baki na selector dkim, chagua 2048-bit, na ubonyeze Add. Nakili thamani ndefu ya TXT inayotokea na ichapishwe kama:
dkim._domainkey.example.com. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"Ukurasa wa Domains wa mailcow una kitufe cha DNS kinachoorodhesha kila rekodi inayohitajika na kuonyesha alama ya kijani au alama ya X nyekundu kwa rekodi iliyochapishwa. Itumie kama orodha yako ya ukaguzi — hakikisha kila mstari ni wa kijani kabla ya kufanya jaribio la ufikiaji wa barua pepe. Mstari mwekundu wa DKIM baada ya kuchapisha kawaida unamaanisha kuwa key imegawanywa kwenye sehemu za TXT kimakosa; key ya 2048-bit ni ndefu kuliko kikomo cha herufi 255 kwa string moja ya TXT, hivyo nakili kama thamani moja ya kimantiki na uache host yako ya DNS igawanye katika sehemu ndogo.
Hatua ya 7 — Jaribu uwezo wa kutuma na upate alama 10/10
Nenda mail-tester.com, nakili anwani ya mpangilio wa bahati inayozalishwa, kisha tuma ujumbe kwenda anwani hiyo kutoka kwenye sanduku lako jipya la barua pepe — ingia kwenye SOGo webmail kwenye https://mail.example.com/SOGo na utume kutoka hapo. Kisha bonyeza "Then check your score".
Lenga kupata alama 10/10. Sababu za kawaida za kupunguziwa alama ni:
- SPF hailingani — rekodi yako ya
MX/SPF haipo au IP inayotuma haijafunikwa. Hakikisha tena SPF TXT. - Saini ya DKIM haithibitishi —
dkim._domainkeyTXT haipo, bado inasambaa, au imevurugika. Hili ndilo kosa la kawaida zaidi. - Hakuna PTR / PTR haioani — reverse DNS haitambuliki kama
mail.example.com. Rekebisha kwa mtoa huduma. - Umeorodheshwa kwenye blocklist — kutokana na sifa ya awali ya IP yako. Omba kuondolewa kwenye orodha au uombe IP safi zaidi.
Usitume barua pepe halisi kwa Gmail au Outlook mpaka alama ifike 10/10. Alama ndogo pamoja na IP mpya ndiyo itakayofanya domain yako iwekwe kwenye orodha ya kutiliwa shaka siku ya kwanza.
Hatua ya 8 — Unganisha programu ya barua pepe (mail client)
Elekeza Thunderbird, Apple Mail, au simu yako kwenye seva kwa kutumia mipangilio hii. Host ya seva ni mail.example.com kwa zote:
- IMAP: port 993, SSL/TLS (au 143 kwa kutumia STARTTLS)
- SMTP submission: port 465, SSL/TLS (au 587 kwa kutumia STARTTLS)
- Username: anwani kamili,
you@example.com - Password: nywila ya sanduku la barua pepe uliyoweka
Usitume barua pepe kupitia port 25 — port hiyo ni kwa ajili ya mawasiliano kati ya seva na seva pekee, mailcow haitoi huduma ya submission yenye uthibitisho (authenticated submission) kupitia port hiyo, na maombi kutoka kwa client yatakataliwa. Ikiwa client inaonyesha Relay access denied, inajaribu kutuma kupitia port 25 au bila uthibitisho; badilisha iwe 465 au 587 ukitumia taarifa zako za utambulisho wa sanduku la barua pepe.
Hatua ya 9 — Backup vitu muhimu zaidi
mailcow inakuja na script ya backup inayofanya snapshot kwenye kila volume yenye data. Iendeshe kwenye diski ya nje au kwenye remote disk iliyounganishwa:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall inahifadhi vitu sita, na kupoteza kimoja kutapoteza data: vmail (sanduku za barua pepe), crypt (funguo za kufungua vmail — hazina kazi bila hizo), mysql (MariaDB inayohifadhi domain, watumiaji, aliases na mipangilio), redis (hali ya queue na cache), rspamd (data iliyojifunza kuhusu spam/ham), na postfix (mail queue). Inafanya kazi ndani ya helper container inayotengeneza archives zilizofungwa (compressed), hivyo backup zinabaki kuwa sahihi hata wakati stack inafanya kazi. Iweke ijiendeshe yenyewe kwa kutumia cron job ya kila usiku, na ongeza --delete-days 14 ili kufuta backup za zamani. Kurejesha (restore) ni kutumia script hiyo hiyo ukiweka restore, ambayo inaorodhesha snapshots na kukuwezesha kuchagua unachotaka kurejesha. Backup ambayo hujawahi kuijaribu kurejesha ni matumaini tu, siyo backup — fanya jaribio moja kwenye VPS mpya.
Hatua ya 10 — Sasisho kwa ratiba
mailcow husasisha kupitia script yake yenyewe. Script hii huvuta kodi mpya, huhamaisha mailcow.conf, hutafuta picha (images) mapema, na kuanzisha upya containers kwa mpangilio huu:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itFanya backup kwanza (Hatua ya 9), kwa sababu uhamishaji wa schema ni mgumu kurudisha nyuma. Masasisho hutolewa mara kwa mara na yanajumuisha marekebisho ya usalama kwa daemons zinazozingatiwa na mtandao, hivyo usiruhusu mail server isisasaishwe kwa miezi kadhaa. Ikiwa sasisho litasababisha container kuwa unhealthy, sudo docker compose logs --tail=50 <service>-mailcow hutaja daemon iliyoshindwa kuwaka tena.
Kumbukumbu kuhusu kuimarisha usalama
mailcow inatumia huduma yake ya netfilter (netfilter-mailcow) ambayo huzuia IP zinazojaribu kushambulia bandari za mail na webmail. Kwa sababu hiyo, upande wa mail unalindwa tayari. Hii haijumuishi SSH kwenye host yenyewe, ambayo bado iko wazi na inaweza kushambuliwa kwa brute-force. Unganisha mfumo huu na Fail2ban inayofuatilia log ya SSH auth na utumie login ya funguo (key-only login) pekee. Weka UI ya admin ya mailcow nyuma ya nywila imara, na ikiwezekana, iwe nje ya mtandao wa umma au nyuma ya VPN.
Failure modes, with the exact strings
Mail queues and never delivers. Run sudo docker compose exec postfix-mailcow postqueue -p, au soma mail queue kwenye admin UI; entries zinabaki zimechelewa (deferred) na:
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)Hii inamaanisha port 25 ya outbound imezuiwa na mtoa huduma wako (Step 1). Mabadiliko ya config hayataifanyia kazi — fungua ticket. Sio tatizo la DNS wala TLS; ishara ni neno timed out dhidi ya remote MX kwenye port 25.
Gmail marks everything spam, or bounces it. Fungua ujumbe kwenye Gmail, chagua "Show original", kisha soma matokeo ya auth. dkim=fail au dkim=none inamaanisha dkim._domainkey yako ya TXT haipo, imevurugika, au bado haijasambazwa — chapisha tena kile kinachoonyeshwa kwenye ukurasa wa ARC/DKIM na usubiri TTL. spf=fail inamaanisha rekodi za SPF/MX hazijafunika IP yako. Alignment ni muhimu; check moja inayofeli inatosha kupeleka ujumbe kwenye spam.
Rejected by large providers on connect. Bounces au logs za Postfix zinaonyesha kukataliwa kwa PTR na 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.Code ya 550 5.7.25 inamaanisha reverse DNS haipo au haioani. Weka PTR kwa IP yako kuwa mail.example.com kwa mtoa huduma (Step 2). Forward (A) na reverse (PTR) lazima zikubaliane, na zote lazima ziwe na jina moja ambalo mailcow hutumia kusalimia seva nyingine.
Browser shows a certificate warning that never clears. Container ya acme-mailcow imeshindwa kupata cert halisi. Angalia log yake:
sudo docker compose logs acme-mailcow | tail -n 40Mstari kama Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. au kushindwa kwa challenge inamaanisha port 80 haipatikani kutoka internet, au A record haielekezi kwenye seva hii. Hakikisha mail.example.com inatatua (resolves) kwenye box, fungua port 80 na 443 kupitia firewall yoyote ya host, na hakikisha hakuna kingine kinachotumia ports hizo. Baada ya kurekebisha chanzo, washa upya client kwa kutumia sudo docker compose restart acme-mailcow badala ya kusubiri muda wa back-off wa saa moja.
FAQ
Je, kujihostia barua pepe kuna thamani?
Ikiwa unataka umiliki wa data, alias zisizo na kikomo, na udhibiti kamili, ndiyo — mailcow inakupa mfumo wa kitaalamu kwa bei ya VPS. Lakini uwezo wa kufikisha barua pepe ni kazi ya kudumu: uaminifu wa IP, usawa wa DNS, na ufuatiliaji wa orodha za kuzuia (blocklists) haviishi. Kwa anwani ya biashara muhimu ambapo siku moja kwenye folder la spam inaweza kukugharimu, mtoa huduma anayetoa usimamizi (managed provider) ndio chaguo la kimantiki. Ji-hoste mwenyewe ikiwa unathamini udhibiti kuliko urahisi na utaweza kuitunza.
Nitajuaje ikiwa port 25 ya kutuma imezuiwa?
Run nc -vz -w 5 gmail-smtp-in.l.google.com 25 kutoka kwenye server. "succeeded!" inamaanisha iko wazi; timed out baada ya kusubiri inamaanisha mtoa huduma wako ameizuia. Hii ndiyo sababu kuu inayofanya server inayojihosti iweze kupokea barua pepe lakini ishindwe kutuma; suluhisho pekee ni mtoa huduma wako kufungua port hiyo — mabadiliko ya mipangilio ya ndani hayataifungua.
Kwa nini barua pepe yangu bado inaingia kwenye spam folder ya Gmail?
Mara nyingi ni kutokana na mnyororo wa uthibitisho (authentication chain) uliovunjika. Tumia "Show original" kwenye Gmail na utafute spf=pass, dkim=pass, na dmarc=pass. dkim=fail inaashiria rekodi ya dkim._domainkey TXT iliyopotea au iliyoharibika; pia PTR mismatch au IP mpya isiyo na historia ya kutuma barua pepe husababisha tatizo hili. Hakikisha mail-tester.com inapata alama 10/10 kwanza, kisha anza kuipasha moto IP polepole — ujumbe machache kwa siku yakiongezeka — badala ya kutuma barua pepe nyingi sana siku ya kwanza.
Nahitaji kufanya backup ya nini hasa?
Run backup_and_restore.sh backup all na uweke seti nzima nje ya server. Inahifadhi vmail (sanduku za barua pepe), crypt (funguo zinazozifafanua), database ya MariaDB (domain, watumiaji, alias, mipangilio), Redis, data ya Rspamd iliyojifunza, na Postfix queue. Volume ya crypt ndiyo inayosahaulika na watu — bila hiyo, backup ya vmail itakuwa maandishi yasiyosomika. Jaribu kufanya urejeshaji (restore) kwenye machine nyingine angalau mara moja.
Je, naweza kuendesha mailcow kwenye VPS ya 2 GB?
Hapana kwa urahisi. generate_config.sh inatoa chaguo la kuzima ClamAV ikiwa chini ya takriban 2.5 GiB, na hata hivyo Rspamd, ClamAV, Dovecot na MariaDB wanashindana kwa memory, hivyo utafikia swap na OOM kills chini ya mzigo wowote wa kweli. Chukua 6 GiB pamoja na 1 GiB swap kama kiwango cha chini kwa install ya mtumiaji mmoja inayostahimili, na uhame kwenye 8 GiB mara tu watu zaidi ya wawili wanapoanza kuitumia.