SSD Nodes Learn
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-07-24

איך להקים Mailcow ב-VPS בלי חסימות

בדקו שפורט 25 פתוח לפני ההתקנה כדי למנוע תקלה ב-queue. נלמד איך להגדיר DNS נכון כדי למנוע מ-Gmail לדחות הודעות עם שגיאת 550 5.7.25 PTR.

מה אתם בונים

שרת דואר מלא על שרת בבעלותכם: SMTP לשליחה וקבלה, IMAP כדי שהטלפון והמחשב האישי שלכם יהיו מסונכרנים, לקוח webmail, ומסנן spam שבודק כל הודעה בשני הכיוונים. חבילת mailcow-dockerized כוללת את Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis ולקוח ACME בתוך stack אחד של Docker Compose, כך שהתוכנה עצמה אינה החלק הקשה. השרת יהיה פעיל תוך חצי שעה.

החלק הקשה הוא כל מה שמסביב. דואר אלקטרוני הוא השירות היחיד שבו שאר האינטרנט חושדת באופן פעיל בשרת חדש לחלוטין. הפער בין "זה עובד" לבין "Gmail פשוט מתעלם מכל הודעה" תלוי בארבע רשומות DNS והגדרה אחת של reputation של ה-IP, שייתכן ולא תהיה בשליטתכם המלאה. קראו את דרישות הקדם להלן לפני שתשכרו שרת. אם לאחר הקריאה ת решили שהמאמץ לשפר את ה-reputation אינו שווה את המאמץ, זו תשובה לגיטימית — הסקירה שלנו על מה באמת שווה self-hosting ב-2026 מסווגת את דואר אלקטרוני תחת "רק אם אתם רציניים" בדיוק מהסיבות הללו.

התנאים המוקדמים הם הפרויקט עצמו

החסר כל אחד מהתנאים הללו יוביל לשליחת מיילים שלא יגיעו ליעדם. להלן רשימה לפי שכיחות התקלות:

פורט 25 (Outbound port 25) חייב להיות פתוח. השרת שלך מעביר הודעות ל-Gmail ול-Microsoft דרך TCP port 25. ספקי VPS וענן רבים חוסמים פורט 25 בצאת (outbound) כברירת מחדל כדי להילחם בספאם. החסימה היא שקטה — לא תופיע שגיאה בעת עליית המערכת, הכל ייראה תקין, והמיילים פשוט יישארו בתור (queue) לנצח. בדקו זאת לפני ההתקנה. אם הפורט חסום, הפתרון היחיד הוא פתיחת פנייה (support ticket) לספק לבקש את פתיחתו; חלקם עושים זאת עבור חשבונות ותיקים, וחלקם לא יעשו זאת לעולם.

כתובת IP נקייה עם מוניטין תקין. כתובות IP ממוחזרות של שירותי VPS נמצאות לעיתים קרובות כבר ברשימות חסימה (blocklists) עקב ספאם של משתמש קודם. בדקו את הכתובת שלכם בשירותים כמו Spamhaus lookup או mxtoolbox לפני שתתחילו. כתובת IP ברשימה חסימה פירושה דחיית הודעות שלא ניתן לפתור באמצעות קוד.

שליטה ב-DNS ורשומת PTR תקינה. עליכם להוסיף רשומות לאזור ה-DNS של הדומיין שלכם, ועליכם להגדיר DNS הפוך (PTR) עבור כתובת ה-IP של השרת, כך שתצביע חזרה לשם המארח (hostname) של המייל שלכם. רשומת PTR כמעט אף פעם לא מוגדרת בלוח ה-DNS שלכם — היא מנוהלת על ידי בעל כתובת ה-IP, ולכן יש להגדירה בלוח הבקרה של ספק ה-VPS או באמצעות פנייה לתמיכה.

6 GiB RAM ו-2 vCPU הם המינימום המומלץ. המינימום של mailcow עבור התקנה פרטית הוא 6 GiB RAM בתוספת 1 GiB swap, כאשר מומלץ להשתמש ב-8 GiB ברגע שיש מספר משתמשים המסתמכים על המערכת. מתחת לערך של כ-2.5 GiB, generate_config.sh מציע לבטל את סורק האנטי-וירוס ClamAV כדי שה-kernel לא יתחיל להרוג קונטיינרים. הקצו 20 GB של SSD להתחלה.

שם DNS, לא כתובת IP בלבד. בחרו hostname כמו mail.example.com. השם הזה יהיה ה-MAILCOW_HOSTNAME שלכם, הנושא (subject) של תעודת ה-TLS, היעד של ה-PTR וה-SMTP banner שלכם. שמרו על עקביות בשם בכל המקומות.

Step 1 — Prove outbound port 25 is open

בצעו זאת תחילה. כל שאר הפעולות יהיו בזבוז זמן אם הבדיקה תיכשל. מתוך ה-VPS החדש, נסו לפתוח SMTP conversation עם mail server אמיתי:

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), ולא ב-firewall שלכם, לכן שום שינוי מקומי לא יפתור זאת. פתחו ticket: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." אל תתקינו את mailcow עד שתקבלו הודעת "succeeded". שימו לב שפורט 25 inbound (שרתים אחרים הפונים אליכם) הוא נתיב נפרד ובדרך כלל פתוח — הספקים חוסמים בדרך כלל את הצד ה-outbound.

Step 2 — הגדרת רשומות DNS

שינויי DNS דורשים זמן להפצה (propagation), לכן יש לפרסם את כל הרשומות לפני ההתקנה. נניח שהדומיין שלך הוא example.com, שרת המייל הוא mail.example.com, והכתובת היא 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 קובעת שרק ה-MX שלך רשאי לשלוח מייל עבור הדומיין, וכל שאר המקורות יידחו. התחל עם DMARC ב-p=none כדי שתוכל לעקוב אחר דוחות מבלי שדבריך ייחסמו; לאחר שתוודא התאמה (alignment), עבור ל-p=quarantine ולאחר מכן ל-p=reject. שתי רשומות חסרות בכוונה: DKIM, ש-mailcow יוצר עבורך ב-Step 6, ו-PTR, אותה עליך להגדיר כעת בפאנל של ספק השירות שלך.

הגדר את ה-PTR (reverse DNS) עבור 10.0.0.10 ל-mail.example.com — הערך המדויק של MAILCOW_HOSTNAME. זוהי הרשומה היחידה שרוב המשתמשים שוכחים, וספקים גדולים דוחים מיילים בגלל חסרונה. אם בפאנל שלך אין שדה rDNS, פתח פנייה (ticket) לתמיכה.

Step 3 — Install Docker

mailcow דורשת את Docker Engine עם התוסף Compose v2. מומלץ להשתמש בסקריפט ההתקנה הרשמי של Docker במקום בחבילת ה-docker.io של Ubuntu, שכן היא אינה כוללת את תוסף Compose:

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

עליך לראות שורה של Docker Compose version v2.x. אם הפקודה docker compose version מחזירה docker: 'compose' is not a docker command, ה-Docker Engine מותקן אך תוסף ה-Compose אינו מותקן. התקן את התוסף ממאגר ה-Docker — הרץ מחדש את הסקריפט לעיל, או פעל לפי המדריך שלנו לבסיס Docker Compose, המגדיר את שניהם ממאגר ה-apt של Docker.

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.sh

בדוק תחילה ש-umask מדפיס את 0022 — mailcow לא תצליח לבנות את המערכת עם מסיכת קבצים שגויה, ו-shell של root ב-Ubuntu 24.04 חדש כבר מספק לך את 0022. לאחר מכן, הסקריפט יבקש את הפרמטר החשוב ביותר: ה-fully qualified hostname. הקלד את mail.example.com — הערך חייב להיות זהה בדיוק ל-A record ול-PTR שלך. הסקריפט יצור את mailcow.conf, קובץ הסביבה היחיד שכל ה-stack קורא ממנו. פתח אותו אם עליך לשנות את פורטי ה-web (HTTP_PORT, HTTPS_PORT) או לבטל את ClamAV במכונה עם משאבים מוגבלים:

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 הוא כלי נוסף עבור מכונות עם RAM נמוך: חיפוש בטקסט מלא (full-text search) הוא צורך הזיכרון השני שמוזכר בתיעוד של mailcow, וביטולו יגרום לאובדן יכולת חיפוש בתוכן המייל ב-webmail בלבד.

השאר את HTTP_PORT=80 ו-HTTPS_PORT=443 כפי שהם, אלא אם שירות אחר על ה-host כבר משתמש בהם — ה-ACME client המובנה של mailcow זקוק לכך שפורט 80 יהיה נגיש מהאינטרנט כדי להשיג את התעודה. זו הסיבה שאין להריץ a separate nginx-plus-Certbot setup על אותה מכונה; mailcow מנפיקה ומחדשת TLS משלה באופן פנימי, ושירות נוסף שתופס את פורט 80/443 ישבש את הפעולה.

Step 5 — Start the stack and log in

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

תהליך ה-pull מוריד כ-24 images; המתן מספר דקות. כאשר docker compose ps מציג שכל ה-container בסטטוס running (או healthy), פתח את https://mail.example.com בדפדפן. פרטי ההתחברות כ-admin הם username admin ו-password moohoo. יש לשנות את הסיסמה באופן מיידי בממשק ה-admin תחת Access → Administrators. אם הדפדפן מציג אזהרת NET::ERR_CERT_AUTHORITY_INVALID, המשמעות היא שתווית ה-ACME certificate טרם הונפק — בדוק את סיבת הכשל ב-ACME המופיעה להלן לפני שתיקח זאת כתקלה; שימוש ב-self-signed placeholder הוא תקין במהלך الدקות הראשונות.

שלב 6 — הוספת דומיין, תיבת דואר ופרסום DKIM

בממשק הניהול (admin UI), פתח את דף Mail Setup (בנתיב Configuration → Mail Setup). תחת לשונית Domains, לחץ על Add domain והקלד את example.com. לאחר מכן, תחת Mailboxes, לחץ על Add mailbox כדי ליצור את you@example.com עם סיסמה. תיבת דואר זו תהיה פעילה ותזמינה דרך פרוטוקול IMAP.

כעת, הגדרת מפתח ה-DKIM. עבור אל Configuration → ARC/DKIM keys. ייתכן ש-mailcow כבר יצר מפתח בעת הוספת הדומיין. אם לא, צור מפתח חדש שם — בחר את הדומיין, השאר את ה-selector כ-dkim, בחר ב-2048-bit, ולחץ על Add. העתק את ערך ה-TXT הארוך שמוצג ופרסם אותו כך:

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

בדף Domains של mailcow קיים כפתור DNS המציג רשימה של כל הרשומות הנדרשות. הוא מציג סימן וי (V) ירוק עבור רשומות שפורסמו, וסימן X אדום עבור רשומות שחסרות. השתמש ברשימה זו כרשימת בקרה — וודא שכל השורות ירוקות לפני בדיקת יכולת המשלוח. שורה אדומה של DKIM לאחר הפרסום מעידה בדרך כלל על כך שהמפתח פוצץ לשברי TXT בצורה שגויה; מפתח 2048-bit ארוך יותר מהמגבלה של 255 תווים עבור מחרוזת TXT בודדת. לכן, יש להדביק את הערך כערך לוגי אחד, ולאפשר למארח ה-DNS לפצל אותו לשברים בעצמו.

Step 7 — Test deliverability and chase 10/10

עברו לכתובת mail-tester.com, העתיקו את הכתובת המקרית המוצגת, ושלחו הודעה אליה מתיבת המייל החדשה שלכם — התחברו ל-SOGo webmail בכתובת https://mail.example.com/SOGo ושלחו משם. לאחר מכן לחצו על "Then check your score".

המטרה היא לקבל ציון 10/10. הסיבות הנפוצות להורדת הציון:

  • SPF not aligned — רשומת ה-MX/SPF חסרה או שכתובת ה-IP השולחת אינה מכוסה. בדקו מחדש את רשומת ה-SPF TXT.
  • DKIM signature does not verify — רשומת ה-dkim._domainkey TXT חסרה, עדיין בתהליך Propagating, או פגומה. זוהי הטעות הנפוצה ביותר.
  • No PTR / PTR mismatch — ה-reverse DNS אינו מתרגם ל-mail.example.com. יש לתקן זאת אצל הספק.
  • Listed on a blocklist — בשל המוניטין הקודם של כתובת ה-IP שלכם. בקשו delisting או בקשו כתובת IP נקייה יותר.

אל תשלחו מיילים אמיתיים ל-Gmail או ל-Outlook עד שהציון יהיה 10/10. ציון נמוך בשילוב עם IP חדש הוא הדרך המהירה לסמן את הדומיין שלכם כ-Spam כבר ביום הראשון.

Step 8 — Connect a real mail client

הגדר את Thunderbird, Apple Mail, או את הטלפון שלך עם ההגדרות הבאות. ה-server host עבור כולם הוא mail.example.com:

  • IMAP: port 993, SSL/TLS (או 143 עם STARTTLS)
  • SMTP submission: port 465, SSL/TLS (או 587 עם STARTTLS)
  • Username: הכתובת המלאה, you@example.com
  • Password: הסיסמה שהגדרת עבור תיבת המייל

לעולם אל תשלח דואר דרך port 25 — פורט זה מיועד לתקשורת server-to-server בלבד. mailcow אינה מאפשרת שם authenticated submission, וכל client שינסה זאת ייחסם. אם ה-client מדווח על Relay access denied, סימן שהוא מנסה לשלוח דרך port 25 או ללא authentication; שנה את ההגדרות ל-465 או 587 עם פרטי ה-mailbox שלך.

Step 9 — גיבוי המידע הקריטי

mailcow מספקת סקריפט גיבוי שמבצע snapshot לכל ה-volumes בעלי מצב (stateful). יש להריץ אותו לדיסק חיצוני או לנתיב מחובר (mounted) מרחוק:

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

all כולל שישה רכיבים, ואובדן כל אחד מהם יוביל לאובדן נתונים: vmail (תיבות המייל עצמן), crypt (המפתחות לפענוח ה-vmail — ללא המפתחות המידע חסר תועלת), mysql (מסד הנתונים MariaDB המכיל דומיינים, משתמשים, aliases והגדרות), redis (מצב התור וה-cache), rspamd (נתוני spam/ham שנלמדו), ו-postfix (תור המיילים). הסקריפט רץ בתוך container עזר וכותב ארכיבים דחוסים, כך שהגיבויים נשארים עקביים גם בזמן שהמערכת פעילה. מומלץ להפעיל את הגיבוי באופן אוטומטי באמצעות cron job לילי, ולהוסיף את --delete-days 14 כדי למחוק סטים ישנים. תהליך השחזור מתבצע באמצעות אותו סקריפט עם הדגל restore, המציג את ה-snapshots ומאפשר לבחור מה לשחזר. גיבוי שלא נבדק בשחזור הוא רק תקווה, לא גיבוי — בצע הרצה אחת (dry run) על VPS נקי.

Step 10 — Update on a schedule

mailcow מתעדכן באמצעות script משלו. ה-script מוריד קוד חדש, מבצע migration ל-mailcow.conf, מוריד מראש (prefetches) images, ומפעיל מחדש את ה-containers בסדר הבא:

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

בצע גיבוי תחילה (Step 9), מכיוון שקשה לבטל schema migration. עדכונים מגיעים לעיתים קרובות וכוללים תיקוני אבטחה עבור daemons הפתוחים לאינטרנט, לכן אין להשאיר mail server ללא עדכונים במשך חודשים. אם עדכון גורם ל-container להפוך ל-unhealthy, sudo docker compose logs --tail=50 <service>-mailcow מציין את ה-daemon שלא הצליח לפעיל מחדש.

הערה לגבי hardening

mailcow מריצה שירות netfilter משלה (netfilter-mailcow) החוסם כתובות IP המבצעות brute-force על פורטי ה-mail וה-webmail. לכן, מערכת ה-mail מוגנת מובנה. הגנה זו אינה מכסה את SSH על ה-host עצמו, אשר עדיין חשוף ועדיין סובל מניסיונות brute-force — מומלץ לשלב התקנה זו עם Fail2ban המנטר את ה-SSH auth log ושימוש בכניסה באמצעות מפתח בלבד (key-only login). יש להגן על ממשק הניהול של mailcow באמצעות סיסמה חזקה, ורצוי להשאיר אותו מחוץ לאינטרנט הציבורי או מאחורי VPN.

Failure modes, with the exact strings

Mail queues and never delivers. הרץ את sudo docker compose exec postfix-mailcow postqueue -p, או בדוק את תור המייל ב-admin UI; הודעות נשארות במצב deferred עם:

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

זה אומר שספק האינטרנט שלך חוסם את פורט 25 היוצא (Step 1). שום הגדרה לא תפתור זאת — פתח פנייה (ticket) לספק. זו אינה בעיית DNS או TLS; הסימן לכך הוא המילה timed out מול MX מרחוק בפורט 25.

Gmail marks everything spam, or bounces it. פתח את ההודעה ב-Gmail, בחר ב-"Show original", וקרא את תוצאות ה-auth. dkim=fail או dkim=none אומרים שרשומת ה-dkim._domainkey TXT שלך חסרה, משובשת, או שטרם הופצה — פרסם מחדש בדיוק את מה שמופיע בדף ה-ARC/DKIM והמתן לסיום ה-TTL. spf=fail אומר שרשומות ה-SPF/MX אינן מכסות את ה-IP שלך. ה-Alignment הוא קריטי; בדיקה אחת שנכשלת מספיקה כדי שההודעה תגיע לספאם.

Rejected by large providers on connect. הודעות Bounce או לוגים של Postfix יציגו את סירוב ה-PTR של 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.

קוד ה-550 5.7.25 מעיד על חוסר או חוסר התאמה ב-reverse DNS. הגדר את ה-PTR עבור ה-IP שלך ל-mail.example.com אצל הספק (Step 2). רשומת Forward (A) ורשומת reverse (PTR) חייבות להיות תואמות, ושתיהן חייבות לציין את אותו ה-host שבו mailcow משתמש מול שרתים אחרים.

Browser shows a certificate warning that never clears. הקונטיינר acme-mailcow נכשל בקבלת תעודה אמיתית. בדוק את הלוג שלו:

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

שורה כמו Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. או כישלון ב-challenge אומרים שפורט 80 אינו נגיש מהאינטרנט, או שרשומת ה-A אינה מפנה לשרת זה. ודא ש-mail.example.com מתרגם לשרת, פתח את פורטים 80 ו-443 בכל חומת אש (firewall) של המארח, וודא ששום תהליך אחר אינו תופס את הפורטים הללו. לאחר תיקון הגורם, הפעל מחדש את ה-client באמצעות sudo docker compose restart acme-mailcow במקום להמתין שעה של back-off.

FAQ

האם כדאי באמת לארח שרת דואר באופן עצמאי (self-hosting)?

אם חשוב לך בעלות על הנתונים, כינויים (aliases) בלתי מוגבלים ושליטה מלאה, התשובה היא כן — mailcow מספקת תשתית מקצועית בעלות של VPS. עם זאת, ניהול יכולת המשלוח (deliverability) הוא משימה מתמשכת: דירוג سمعת ה-IP, התאמת DNS וניטור רשימות חסומות (blocklists) הם תהליכים מתמשכים. עבור כתובת עסקית קריטית שבה יום אחד בתיקיית ה-spam של משתמש עלול לעלות ביוקר, ספק מנוהל הוא הבחירה הפרקטית. בחר ב-self-host רק אם השליטה חשובה לך יותר מהנוחות ואתה מתכוון לנהל את השרת בפועל.

איך אני יודע אם פורט 25 היוצא חסום?

הרץ את nc -vz -w 5 gmail-smtp-in.l.google.com 25 מהשרת. הודעת "succeeded!" פירושה הפורט פתוח; הודעת timed out לאחר ההמתנה פירושה שהספק שלך חוסם אותו. זו הסיבה הנפוצה ביותר לכך ששרת עצמאי יכול לקבל דואר אך לא יכול לשלוח אותו; הפתרון היחיד הוא שהספק יפתח את הפורט — שום הגדרה מקומית לא תשנה זאת.

מדוע הדואר שלי עדיין מגיע לתיקיית ה-spam של Gmail?

ברוב המקרים מדובר בשרשרת אימות (authentication) שבורה. השתמש ב-"Show original" ב-Gmail וחפש את spf=pass, dkim=pass, ו-dmarc=pass. הודעת dkim=fail מעידה על רשו |\ dkim._domainkey TXT חסרה או פגומה; גם חוסר התאמה ב-PTR או כתובת IP חדשה ללא היסטוריית שליחה פוגעים ביכולת המשלוח. ראשית, השג ציון 10/10 ב-mail-tester.com, ולאחר מכן בצע "חימום" (warm up) איטי ל-IP — שלח מספר הודעות ביום והעלה את הכמות בהדרגה — במקום לשלוח נפח גדול ביום הראשון.

מה בדיוק אני צריך לגבות?

הרץ את backup_and_restore.sh backup all ושמור את כל החבילה מחוץ לשרת. הגיבוי כולל את vmail (תיבות הדואר), crypt (המפתחות לפענוח), מסד הנתונים MariaDB (דומיינים, משתמשים, כינויים, הגדרות), Redis, נתוני הלמידה של Rspamd, ותור ה-Postfix. נפח ה-crypt הוא החלק שמשתמשים נוטים להזניח — בלעדיו גיבוי ה-vmail יהיה טקסט מוצפן בלתי ניתן לקריאה. בדוק שחזור על שרת נפרד לפחות פעם אחת.

האם ניתן להריץ mailcow על VPS עם 2 GB RAM?

לא בצורה יציבה. generate_config.sh מציע לבטל את ClamAV בנפח פחות מ-2.5 GiB, וגם אז Rspamd, ClamAV, Dovecot ו-MariaDB מתחרים על זיכרון. תחת עומס אמיתי, תגיע למצב של swap וקריסות OOM. עבור התקנה יציבה של משתמש יחיד, הקצה לפחות 6 GiB RAM ו-1 GiB swap, ועבור ל-8 GiB ברגע שיותר משני משתמשים מסתמכים על השרת.

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