SSD Nodes Learn 8GB RAM — $66/שנה
מדריכים Matt Connorמאת Matt Connor · עודכן 2026-08-01

איך להתקין את Listmonk על VPS עם Ubuntu 24.04

מדריך להתקנת Listmonk v6.2.0 עם PostgreSQL 16, config.toml, יחידת systemd ו-TLS, כולל חיבור SMTP והסבר מדוע מוניטין שליחה נבנה במשך שבועות.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

מה נדרש לניוזלטר באירוח עצמי באמצעות Listmonk

Listmonk הוא מנהל ניוזלטר ורשימות תפוצה באירוח עצמי: קובץ בינארי אחד של Go, מסד נתונים אחד של PostgreSQL, קובץ תצורה אחד ויחידת systemd אחת. VPS קטן מריץ אותו ללא מאמץ, מכיוון ש-Listmonk מאחסן את פרטי המנויים ומנהל תור לקמפיינים, אך אינו מוסר את הדואר בעצמו. הוא מעביר כל הודעה לשרת SMTP (simple mail transfer protocol), ולכן שיעור המסירה נקבע לפי המוניטין של השרת הזה ולא לפי תוכנה זו.

מדריך זה מתקין את Listmonk v6.2.0, הגרסה הנוכחית נכון ליולי 2026, על Ubuntu 24.04. נדרש VPS עם כתובת IP ציבורית, שם מתחם שבשליטתכם ו-PostgreSQL 12 או חדש יותר. ההתקנה נמשכת כשעה. בניית מוניטין השליחה נמשכת שבועות, והנושא הזה מוסבר לקראת סוף המדריך.

התקנת PostgreSQL ויצירת מסד הנתונים

Ubuntu 24.04 מפיצה את PostgreSQL 16 במאגר משלה, וגרסה זו חדשה בהרבה מהנדרש עבור Listmonk.

sudo apt update
sudo apt install -y postgresql curl
sudo systemctl enable --now postgresql

צרו את התפקיד ואת מסד הנתונים באותה הפעלת psql. -v ON_ERROR_STOP=1 גורם ל-psql לצאת לאחר הפקודה הראשונה שנכשלה, כך ששגיאת הקלדה לא תשאיר אתכם עם התקנה חלקית שנראית שהושלמה.

sudo -u postgres psql -v ON_ERROR_STOP=1 <<'SQL'
CREATE USER listmonk WITH PASSWORD 'pick-a-long-random-password';
CREATE DATABASE listmonk OWNER listmonk;
SQL

OWNER listmonk אינו קישוט. התקנת הסכמה יוצרת טבלאות, טיפוסים, אינדקסים ופונקציות, ולכן התפקיד חייב להיות הבעלים של מסד הנתונים. אם תפנו את Listmonk למסד נתונים שבבעלות תפקיד אחר, ההתקנה תיעצר עם permission denied, גם לאחר שהרצתם את GRANT CONNECT.

ודאו שמסד הנתונים קיים לפני שתמשיכו.

sudo -u postgres psql -tAc "SELECT datname FROM pg_database WHERE datname='listmonk';"

הפקודה מציגה את listmonk. שורה ריקה פירושה שהפקודה CREATE לא הופעלה, ולכן עיינו שוב בפלט של psql.

התקנת הקובץ הבינארי של Listmonk

Listmonk מפיצה קובץ בינארי סטטי לכל ארכיטקטורה. בדקו תחילה מהי הארכיטקטורה שלכם, מכיוון שקובץ בינארי של amd64 ב-VPS מבוסס ARM הוא קובץ שהליבה מסרבת להפעיל.

dpkg --print-architecture
cd /tmp
curl -fsSLO https://github.com/knadh/listmonk/releases/download/v6.2.0/listmonk_6.2.0_linux_amd64.tar.gz
tar -xzf listmonk_6.2.0_linux_amd64.tar.gz
sudo install -m 755 listmonk /usr/bin/listmonk
listmonk --version

ב-VPS מבוסס ARM, החליפו את amd64 ב-arm64 בשם הקובץ. listmonk --version שמדפיסה מחרוזת גרסה היא ההוכחה הראשונה לכך שהקובץ הבינארי תואם למכונה.

יצירת config.toml והגבלת הגישה אליו

--new-config כותב את config.toml לספריית העבודה הנוכחית. לכן cd נמצא בתוך sh -c, ולא לפני sudo.

sudo install -d -m 750 /etc/listmonk
sudo sh -c 'cd /etc/listmonk && listmonk --new-config'

הקובץ שנוצר קצר. תחת [app], address = "localhost:9000" קושר את שרת ה-HTTP ל-loopback בלבד, ולכן לא ניתן לגשת ללוח הניהול מהאינטרנט עד שמציבים לפניו reverse proxy. אין לשנות את השורה הזו. תחת [db] מופיעים host = "localhost", port = 5432, user = "listmonk", database = "listmonk" ו-ssl_mode = "disable". ערכי ברירת המחדל האלה כבר תואמים למסד הנתונים שיצרתם, ולכן השורה היחידה שיש לשנות היא שורת הסיסמה.

ssl_mode = "disable" נכון כאשר Postgres מאזין ב-loopback באותו מחשב, מכיוון שהתעבורה הזו אינה יוצאת מהמחשב. אם מעבירים את מסד הנתונים למארח אחר, יש להגדיר אותו ל-require, אחרת הסיסמה תעבור ברשת בטקסט גלוי.

ערכו את שורת הסיסמה תחת [db] כך שתתאים לתפקיד, ולאחר מכן צרו את חשבון השירות והסירו את הקובץ מכל משתמש אחר.

sudo useradd --system --home-dir /var/lib/listmonk --create-home --shell /usr/sbin/nologin listmonk
sudo chown -R root:listmonk /etc/listmonk
sudo chmod 640 /etc/listmonk/config.toml

כעת חשבון השירות יכול לקרוא את הקובץ, ואף משתמש אחר אינו יכול לעשות זאת.

sudo -u listmonk cat /etc/listmonk/config.toml > /dev/null && echo readable
stat -c '%U:%G %a' /etc/listmonk/config.toml

הפקודה הראשונה מציגה את readable. הפקודה השנייה מציגה את root:listmonk 640. כל חשבון לא-מורשה אחר שמנסה לבצע את אותו cat מקבל Permission denied. זו בדיוק המטרה: הקובץ מכיל את סיסמת מסד הנתונים שלכם בטקסט גלוי, ובדרך כלל יש בשרת יותר מחשבון התחברות אחד. אותו עיקרון חל על כל שירות שאתם מפעילים, לכן קראו פעם אחת על משתמשי שירות עם הרשאות מינימליות ויישמו אותו בכל מקום.

יצירת הסכימה באמצעות --install

--install יוצר את הטבלאות ומאתחל את הגדרות ברירת המחדל. הגדירו את פרטי הכניסה הראשונים של מנהל המערכת באמצעות משתני סביבה, כדי שהחשבון ייווצר לפני שהפאנל יהיה נגיש.

sudo -u listmonk env LISTMONK_ADMIN_USER=admin \
  LISTMONK_ADMIN_PASSWORD='another-long-random-password' \
  listmonk --config /etc/listmonk/config.toml --install --yes

--yes מאשר את בקשת האישור. קראו את הבקשה פעם אחת לפני שאתם הופכים את הפעולה לאוטומטית, משום ש---install משמש להתקנה ראשונה והוא מוחק סכימת Listmonk קיימת. הפעלה נוספת שלו מול מסד נתונים פעיל תמחק את המנויים שלכם. בכל סקריפט שעשוי לפעול פעמיים, השתמשו ב---install --idempotent --yes, שאינו מבצע פעולה כאשר הטבלאות כבר קיימות. שינויי סכימה שפורסמו בגרסה חדשה מוחלים באמצעות --upgrade, ולא באמצעות --install.

בדקו את התוצאה מצד מסד הנתונים, ולא דרך הדפדפן.

sudo -u postgres psql -d listmonk -c '\dt'
sudo -u postgres psql -d listmonk -tAc "SELECT username FROM users;"

הפקודה הראשונה מציגה את טבלאות Listmonk, ובהן subscribers, lists, campaigns, templates ו-bounces. הפקודה השנייה מציגה את admin. תוצאה ריקה מהפקודה השנייה פירושה שמשתני הסביבה לא הגיעו לתהליך, ולכן הפאנל יבקש מכם ליצור את המשתמש הראשון בדפדפן.

הפעלת Listmonk באמצעות systemd

כתבו את /etc/systemd/system/listmonk.service.

[Unit]
Description=Listmonk newsletter and mailing list manager
After=network-online.target postgresql.service
Wants=network-online.target

[Service]
Type=simple
User=listmonk
Group=listmonk
WorkingDirectory=/var/lib/listmonk
ExecStart=/usr/bin/listmonk --config /etc/listmonk/config.toml
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target

WorkingDirectory חשוב משום ש-Listmonk פותר נתיבים יחסיים, כולל נתיב העלאת מדיה במערכת הקבצים, ביחס אליו. After=postgresql.service רק מורה על ההפעלה; הוא אינו ממתין עד ש-Postgres יקבל חיבורים. לכן Restart=on-failure מטפל במקרה שבו Listmonk מופעל מוקדם מדי ואינו מצליח להתחבר.

sudo systemctl daemon-reload
sudo systemctl enable --now listmonk
ss -ltnp | grep 9000
curl -sI http://127.0.0.1:9000/

ss אמור להציג את 127.0.0.1:9000 במצב LISTEN. curl שמחזיר שורת מצב HTTP כלשהי מציין שהשרת עונה. curl שנכשל עם Connection refused מציין שהתהליך הסתיים במהלך ההפעלה, ו-journalctl -u listmonk -n 50 --no-pager יסביר מדוע. שימו לב ש-enable --now הוא החלק ששורד אתחול מחדש: תהליך שהופעל ידנית ייעלם לאחר שדרוג הליבה הבא.

הצבת nginx ו-TLS מלפנים

Listmonk משתמש ב-HTTP רגיל על ממשק loopback, לכן nginx מסיים את TLS (אבטחת שכבת התעבורה) ומעביר את הבקשה.

server {
    listen 443 ssl;
    server_name lists.example.com;

    client_max_body_size 25m;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

יש להגדיל את client_max_body_size, מכיוון שייבוא מנויים והעלאת מדיה הם בקשות להעלאת קבצים, ו-nginx דוחה כברירת מחדל כל בקשה שגודלה עולה על 1 MB באמצעות 413 Request Entity Too Large. יש להנפיק את האישור באמצעות certbot. הוא גם כותב עבורך את שורות listen 443 ssl ומגדיר את ההפניה מיציאה 80: השלבים נמצאים במדריך אישור Let's Encrypt עבור nginx. יש לפתוח את יציאות 80 ו-443 ולהשאיר את 9000 סגורה, מכיוון שה-proxy ניגש אליה דרך loopback. אם חומת האש עדיין לא הוגדרה, יש להתחיל במבוא לחומת האש ufw.

לאחר מכן יש לפתוח את לוח הניהול ולהגדיר את כתובת הבסיס תחת Settings ל-https://lists.example.com. בהתקנה חדשה מוגדר הערך http://localhost:9000, ו-Listmonk כותב אותו לכל קישור ביטול הרשמה ולכל כתובת מדיה שהוא מוסיף להודעת דוא"ל. אם תשלחו מסע פרסום לפני שינוי הערך, כל נמען יקבל קישורים שמפנים למחשב שלו עצמו. הקישורים לא יפעלו אצל הנמען, ולמסנן דואר זבל הם ייראו כאילו השולח אינו יודע להגדיר את הדומיין שלו.

חיבור SMTP שאינו נמצא ב-config.toml

חפשו ב-config.toml מקטע SMTP, ולא תמצאו אותו. הגדרות הדואר נשמרות במסד הנתונים, בטבלה settings, ועורכים אותן בלוח הניהול, תחת Settings ו-SMTP. לכן הקובץ שנוצר נשאר קצר כל כך, וגם משום כך שינוי בהגדרת SMTP אינו דורש הפעלה מחדש.

יש שתי אפשרויות תקינות עבור שרת ה-SMTP עצמו. אפשר להפעיל שרת משלכם. במקרה כזה המוניטין נמצא כולו באחריותכם, וזהו פרויקט של ממש בפני עצמו: הפעלת שרת דואר משלכם באמצעות Mailcow מסבירה מה הדבר כולל. לחלופין, אפשר להפנות את Listmonk ל-relay עסקאות, ולהשאיר את ניהול המוניטין של כתובת ה-IP לספק אחר.

בכל מקרה, השתמשו בפורט 587 עם STARTTLS, או בפורט 465 עם TLS בלתי-מפורש. אל תתכננו לשלוח דרך פורט 25. רוב ספקי ה-VPS חוסמים אותו כברירת מחדל בחשבונות חדשים. פורט 25 חסום נראה בדיוק כמו חיבור שנתקע, משום שהמנות מושמטות במקום להידחות. לכן הלקוח ממתין לפקיעת זמן קצוב במקום להיכשל במהירות.

בדקו את ההגדרה לפני שאתם מסתמכים עליה. צרו רשימה, הוסיפו את הכתובת שלכם כמנוי ושלחו מסע פרסום לנמען אחד. פתחו את ההודעה שהתקבלה וקראו את כל הכותרות. כותרת Authentication-Results, שנוספה בצד המקבל, מציינת אם בדיקות SPF ו-DKIM עברו בהצלחה.

מסירת הדואר היא כל המשימה

Listmonk בונה את ההודעה, עוקב אחר הרשימה ומעביר את הדואר הלאה. כל החלטה אם הדואר יגיע לתיבת הדואר הנכנס מתקבלת אצל הספק המקבל, לפי כתובת ה-IP השולחת ולפי הדומיין השולח. לכתובת IP חדשה של VPS אין היסטוריה כלל, וכל ספקי תיבות הדואר הגדולים מתייחסים להיעדר היסטוריה כאל סימן חשוד במידה מסוימת.

ארבעה דברים אינם נתונים לבחירה:

  • רשומת TXT של SPF (מסגרת מדיניות שולחים), המציינת את המארח המורשה לשלוח בשם הדומיין שלך.
  • מפתח DKIM (דואר מזוהה באמצעות מפתחות דומיין), המפורסם כרשומת TXT, כאשר החתימה מתבצעת על ידי שרת הדואר ולא על ידי Listmonk.
  • רשומת DMARC (אימות, דיווח והתאמה של הודעות מבוססי דומיין), המורה למקבלים כיצד לפעול כאשר שני המנגנונים הראשונים נכשלים.
  • תיבת דואר לקבלת הודעות החזרה, ש-Listmonk קורא ממנה, כדי שכתובות שדוחות דואר יוסרו מהרשימה במקום שהמערכת תנסה לשלוח אליהן שוב ללא הגבלה.

לאחר מכן, שלח הודעות באיטיות בתחילה. דומיין שמעולם לא שלח דואר ופתאום מוסר עשר אלף הודעות בתוך שעה נראה בדיוק כמו חשבון שנפרץ, ולכן הוא מסונן בהתאם. התחל עם המנויים המעורבים ביותר והגדל את הנפח בהדרגה במשך כמה ימים.

כל תבנית זקוקה גם לקישור ביטול מינוי תקין. בתבנית של Listmonk הקישור הוא {{ UnsubscribeURL }}, וגוף הקמפיין מוכנס במקום שבו מופיע {{ template "content" . }}. המקום הזה חייב להופיע בדיוק פעם אחת בכל תבנית. קמפיין ללא קישור לביטול מינוי יוצר תלונות על דואר זבל במקום ביטולי מינוי, ותלונות הן הדרך המהירה ביותר לאבד מוניטין שליחה שבנית במשך שבועות.

גיבויים, ומה נדרש בפועל לשחזור

שני פריטים חייבים לצאת מהשרת: גיבוי מסד הנתונים ו-config.toml. הוסיפו את ספריית המדיה אם אתם מעלים תמונות לקמפיינים.

sudo -u postgres pg_dump -Fc listmonk > listmonk-$(date +%F).dump

גיבוי זה מכיל את רשימת המנויים, הקמפיינים, התבניות וכל ההגדרות, כולל פרטי הכניסה ל-SMTP. לכן יש להצפין אותו ולשמור אותו מחוץ לשרת זה. תזמון גיבויים הוא בעיה פתורה: ראו גיבויי restic מוצפנים לאחסון מרוחק. config.toml כולל כמה שורות בלבד, אך הוא מכיל את סיסמת מסד הנתונים. לכן יש לטפל בו באותו אופן.

שדרוגים מתבצעים בסדר קבוע. עצרו את השירות, צרו גיבוי, החליפו את הקובץ הבינארי ב-/usr/bin, הריצו את listmonk --config /etc/listmonk/config.toml --upgrade, ולאחר מכן הפעילו את השירות. מיגרציות של הסכמה מתבצעות רק קדימה, ולכן גיבוי זה הוא הדרך היחידה לחזור לאחור.

מדוע Listmonk אינו מצליח להפעיל את עצמו?

קראו תחילה את היומן באמצעות journalctl -u listmonk -n 50 --no-pager. כמעט כל כשל בהפעלה מופיע בשורה אחת בבלוק [db].

pq: password authentication failed for user "listmonk" פירושו שהסיסמה ב-[db] אינה תואמת לתפקיד Postgres. הקידומת pq מציינת שמנהל ההתקן של Postgres מדווח על דחיית השרת. לכן התצורה נקראה כראוי, אך פרטי האימות היו שגויים. אפסו את התפקיד באמצעות sudo -u postgres psql -c "ALTER USER listmonk WITH PASSWORD 'new-password';" והכניסו לקובץ את אותה מחרוזת בדיוק.

pq: database "listmonk" does not exist פירושו שהערך database ב-[db] אינו מציין מסד נתונים קיים. sudo -u postgres psql -l מציג את מסדי הנתונים שבפועל נמצאים בשרת, כולל האיות שהשתמשתם בו בטעות.

permission denied במהלך --install פירושו שלתפקיד יש אפשרות להתחבר, אך הוא אינו הבעלים של מסד הנתונים ולכן אינו יכול ליצור בו טבלאות. תקנו זאת באמצעות sudo -u postgres psql -c "ALTER DATABASE listmonk OWNER TO listmonk;" והפעילו שוב את ההתקנה.

השירות אינו מופעל כלל והיומן מציין את קובץ התצורה. תהליך שפועל בשם listmonk אינו יכול לפתוח קובץ config.toml שהוגדר כבעלות root:root עם הרשאות 600. stat -c '%U:%G %a' /etc/listmonk/config.toml אמור להציג את root:listmonk 640, והספרייה שמעליו אמורה להיות root:listmonk 750.

הממשק פועל, אך דואר אינו מגיע. זו אינה בעיית הפעלה. בדקו תחילה את Settings ואת SMTP, ולאחר מכן את היומן של הקמפיין עצמו בלוח הניהול. היומן מתעד את השגיאה שהוחזרה משרת הדואר בכל ניסיון.

FAQ

האם נדרש לי שרת דואר משלי כדי להשתמש ב-Listmonk?

לא. Listmonk אינו שרת דואר. הוא זקוק לנתוני אימות של SMTP עבור שרת שמקבל את הדואר שלך ומוסר אותו ליעדו. שרת זה יכול להיות ממסר דואר עסקאות או שרת דואר שאתה מפעיל בעצמך. הגדר את הנתונים האלה תחת Settings ו-SMTP בלוח הניהול, ולא ב-config.toml, מכיוון שהגדרות הדואר נשמרות במסד הנתונים. השתמש ביציאה 587 עם STARTTLS או ביציאה 465 עם TLS מובלע, מכיוון שרוב ספקי ה-VPS חוסמים יציאה של תעבורה ביציאה 25 בחשבונות חדשים.

מדוע הקישורים בקמפיין שלי מפנים אל localhost:9000?

ההגדרה של כתובת הבסיס עדיין מוגדרת לערך ברירת המחדל של ההתקנה, http://localhost:9000. Listmonk כותב את הערך הזה בקישורי הסרה מרשימת התפוצה ובכתובות של קובצי מדיה בעת שליחת קמפיין. פתח את Settings בלוח הניהול, הגדר את כתובת הבסיס לכתובת ה-HTTPS האמיתית שלך ושמור. אי אפשר לתקן הודעות שכבר נמסרו, לכן שלח לעצמך קמפיין בדיקה ולחץ על קישור ההסרה מרשימת התפוצה שבו לפני שליחת הודעה לרשימה אמיתית.

האם הפעלה חוזרת של --install תמחק את המנויים שלי?

כן. --install הוא מתקין ההפעלה הראשונה, והוא מוחק את הסכמה הקיימת של Listmonk. --yes מסיר את ההנחיה שהייתה מזהירה אותך מכך. בכל סקריפט שעשוי לפעול פעמיים, השתמש ב---install --idempotent --yes, שאינו מבצע פעולה כאשר הטבלאות כבר קיימות. כדי להחיל את שינויי הסכמה בגרסה חדשה, עצור את השירות, צור pg_dump ולאחר מכן הפעל את --upgrade.

מדוע Listmonk מציג את השגיאה password authentication failed for user listmonk?

הסיסמה בבלוק [db] של /etc/listmonk/config.toml אינה תואמת לתפקיד Postgres בעל אותו שם. השורה ביומן היא pq: password authentication failed for user "listmonk", ו-pq הוא מנהל ההתקן של Postgres שמעביר את דחיית השרת. פירוש הדבר הוא שקובץ התצורה נמצא ונקרא. אפס את הסיסמה של התפקיד באמצעות sudo -u postgres psql -c "ALTER USER listmonk WITH PASSWORD 'new-password';", כתוב את אותה מחרוזת בדיוק בקובץ התצורה ולאחר מכן הפעל את sudo systemctl restart listmonk.