SSD Nodes Learn RAM 8GB — $66/mwaka
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-01

Jinsi ya Kujisimamia Listmonk kwenye VPS

Sakinisha Listmonk v6.2.0 kwenye Ubuntu 24.04 kwa PostgreSQL, config.toml, systemd na TLS, kisha unganisha SMTP na ujue gharama halisi ya uwasilishaji.

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

Listmonk inayohitaji kwa jarida linalojiendesha

Listmonk ni programu ya kujisimamia ya majarida na orodha za barua pepe: binary moja ya Go, hifadhidata moja ya PostgreSQL, faili moja ya usanidi, na kitengo kimoja cha systemd. VPS ndogo inaweza kuiendesha bila shida, kwa sababu Listmonk huhifadhi wanaofuatilia na kupanga kampeni kwenye foleni, lakini haitumi barua pepe yenyewe. Hukabidhi kila ujumbe kwa seva ya SMTP (itifaki rahisi ya kuhamisha barua), hivyo kiwango chako cha uwasilishaji huamuliwa na sifa ya seva hiyo, si na programu hii.

Mwongozo huu unasakinisha Listmonk v6.2.0, toleo la sasa kufikia Julai 2026, kwenye Ubuntu 24.04. Unahitaji VPS yenye anwani ya IP ya umma, jina la kikoa unalolidhibiti, na PostgreSQL 12 au mpya zaidi. Usakinishaji huchukua takribani saa moja. Sifa ya utumaji huchukua wiki kadhaa, na sehemu hiyo imeelezwa karibu na mwisho.

Sakinisha PostgreSQL na uunde hifadhidata

Ubuntu 24.04 hutoa PostgreSQL 16 katika hazina yake, ambayo ni toleo jipya zaidi kuliko mahitaji ya Listmonk.

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

Unda role na hifadhidata katika kikao kimoja cha psql. -v ON_ERROR_STOP=1 huifanya psql itoke baada ya kauli ya kwanza kushindwa, kwa hivyo kosa la kuandika halitakuachia usanidi ambao haujakamilika lakini unaonekana umekamilika.

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 si jambo la kupamba. Usakinishaji wa schema huunda majedwali, aina za data, faharasa na functions, kwa hivyo role lazima iwe mmiliki wa hifadhidata. Ukielekeza Listmonk kwenye hifadhidata inayomilikiwa na role nyingine, usakinishaji husimama na permission denied, hata baada ya kuendesha GRANT CONNECT.

Thibitisha kuwa hifadhidata ipo kabla ya kuendelea.

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

Hiyo huchapisha listmonk. Mstari tupu unamaanisha kuwa kauli ya CREATE haikuendeshwa, kwa hivyo soma tena matokeo ya psql.

Sakinisha binary ya Listmonk

Listmonk hutoa binary tuli kwa kila usanifu. Kagua usanifu wako kwanza, kwa sababu binary ya amd64 kwenye VPS ya ARM ni faili ambayo kernel hukataa kuitekeleza.

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

Kwenye VPS ya ARM, badilisha amd64 kwa arm64 katika jina la faili. listmonk --version kuchapisha mfuatano wa toleo ni uthibitisho wako wa kwanza kwamba binary inaendana na mashine.

Tengeneza config.toml na uifunge kwa ruhusa kali

--new-config huandika config.toml katika saraka ya sasa ya kazi. Ndiyo sababu cd iko ndani ya sh -c, na si kabla ya sudo.

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

Faili iliyotengenezwa ni fupi. Chini ya [app], address = "localhost:9000" huunganisha seva ya HTTP kwenye loopback pekee, kwa hiyo paneli ya usimamizi haipatikani kutoka kwenye intaneti hadi uweke reverse proxy mbele yake. Acha mstari huo bila kuubadilisha. Chini ya [db] utapata host = "localhost", port = 5432, user = "listmonk", database = "listmonk" na ssl_mode = "disable". Chaguo-msingi hizo tayari zinaendana na database uliyounda, kwa hiyo mstari pekee unaopaswa kubadilisha ni wa nenosiri.

ssl_mode = "disable" ni sahihi wakati Postgres inasikiliza kwenye loopback kwenye kompyuta hiyo hiyo, kwa sababu trafiki hiyo haiondoki kwenye mashine. Ukihamisha database kwenye host nyingine, iweke kuwa require, la sivyo nenosiri litasafirishwa kwenye mtandao bila usimbaji.

Hariri mstari wa nenosiri chini ya [db] ili uendane na role, kisha tengeneza akaunti ya huduma na uondoe ufikiaji wa faili hiyo kwa login nyingine zote.

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

Sasa akaunti ya huduma inaweza kusoma faili hiyo, na hakuna mwingine anayeweza.

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

Amri ya kwanza huchapisha readable. Ya pili huchapisha root:listmonk 640. Akaunti nyingine yoyote isiyo na haki za kiutawala ikijaribu cat hiyo hiyo hupata Permission denied. Hilo ndilo lengo: faili hii ina nenosiri la database bila usimbaji, na kwa kawaida seva huwa na login zaidi ya moja. Mantiki hiyo hiyo inatumika kwa kila huduma unayoendesha, kwa hiyo soma watumiaji wa huduma wenye haki chache mara moja na uitumie kila mahali.

Unda schema kwa kutumia --install

--install huunda majedwali na kuweka mipangilio chaguomsingi. Weka kuingia kwa mara ya kwanza kwa msimamizi kupitia vigeu vya mazingira, ili akaunti iwepo kabla paneli haijaanza kufikiwa.

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

--yes hujibu kidokezo cha uthibitishaji. Soma kidokezo hicho mara moja kabla ya kukiendesha kiotomatiki, kwa sababu --install ni kisakinishi cha awali na hufuta schema iliyopo ya Listmonk. Kukitekeleza tena kwenye hifadhidata inayotumika huharibu orodha ya waliojisajili. Kwenye hati yoyote inayoweza kuendeshwa mara mbili, tumia --install --idempotent --yes, ambayo haifanyi chochote majedwali yanapokuwa tayari yapo. Mabadiliko ya schema yaliyotolewa katika toleo jipya hutumika kwa --upgrade, kamwe si kwa --install.

Thibitisha matokeo kutoka upande wa hifadhidata badala ya kivinjari.

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

Ya kwanza huorodhesha majedwali ya Listmonk, yakiwemo subscribers, lists, campaigns, templates na bounces. Ya pili huchapisha admin. Matokeo tupu kutoka ya pili yanamaanisha kuwa vigeu vya mazingira havikufikia mchakato, hivyo paneli itakuomba uunde mtumiaji wa kwanza kwenye kivinjari badala yake.

Endesha Listmonk chini ya systemd

Andika /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 ni muhimu kwa sababu Listmonk hutatua njia za faili za relatifu, ikiwemo njia ya mfumo wa faili ya upakiaji wa midia, ikilinganishwa na njia hiyo. After=postgresql.service huagiza tu kuanza; haisubiri Postgres ikubali miunganisho. Kwa hiyo, Restart=on-failure hushughulikia hali ambapo Listmonk inaanza mapema sana na haiwezi kuunganishwa.

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

ss inapaswa kuonyesha 127.0.0.1:9000 katika hali ya LISTEN. curl ikirejesha mstari wowote wa hali ya HTTP, hiyo inamaanisha seva inajibu. curl ikishindwa kwa Connection refused, inamaanisha mchakato ulikufa wakati wa kuanza, na journalctl -u listmonk -n 50 --no-pager itaeleza sababu. Kumbuka kuwa enable --now ndiyo sehemu inayosalia baada ya kuwasha upya: mchakato ulioanzishwa kwa mkono huondoka baada ya uboreshaji unaofuata wa kernel.

Weka nginx na TLS mbele

Listmonk hutumia HTTP ya kawaida kwenye loopback, kwa hiyo nginx hukomesha TLS (usalama wa safu ya usafirishaji) na kusambaza ombi.

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 lazima iongezwe kwa sababu uagizaji wa waliojisajili na upakiaji wa midia ni machapisho ya faili, na nginx hukataa chochote kinachozidi 1 MB kwa chaguo-msingi kwa kutumia 413 Request Entity Too Large. Toa cheti kwa kutumia certbot, ambayo pia huandika mistari ya listen 443 ssl na kuelekeza upya kutoka port 80 kwa niaba yako: hatua ziko kwenye mwongozo wa cheti cha Let's Encrypt kwa nginx. Fungua port 80 na 443, na uache port 9000 ikiwa imefungwa, kwa kuwa proksi huifikia kupitia loopback. Ikiwa firewall bado haijasanidiwa, anza na misingi ya firewall ya ufw.

Kisha fungua paneli ya usimamizi na uweke URL ya root chini ya Settings iwe https://lists.example.com. Usakinishaji mpya huwa na http://localhost:9000, na Listmonk huandika thamani hiyo katika kila kiungo cha kujiondoa kwenye usajili na URL ya midia inayoweka kwenye barua pepe. Tuma kampeni kabla ya kuibadilisha, na kila mpokeaji atapata viungo vinavyoelekeza kwenye mashine yake mwenyewe. Viungo hivyo havitafanya kazi kwa msomaji, na kwa kichujio cha barua taka vitaonekana kama mtumaji asiyeweza kusanidi domeni yake mwenyewe.

Unganisha SMTP, ambayo haipo kwenye config.toml

Tafuta sehemu ya SMTP katika config.toml; hutaipata. Mipangilio ya barua pepe iko kwenye hifadhidata, katika jedwali la settings, na unaihariri kwenye paneli ya usimamizi chini ya Settings na SMTP. Ndiyo sababu faili inayozalishwa inabaki fupi, na pia ndiyo sababu mabadiliko ya SMTP hayahitaji kuwasha upya huduma.

Kuna chaguo mbili zinazofaa kwa seva ya SMTP yenyewe. Endesha seva yako mwenyewe. Hilo huweka kabisa sifa ya anwani ya IP mikononi mwako, na ni mradi kamili unaojitegemea: kuendesha seva yako ya barua pepe kwa Mailcow kunaeleza kinachohusika. Au elekeza Listmonk kwenye relay ya miamala, kisha umwachie mtoa huduma mwingine usimamizi wa sifa ya anwani ya IP.

Kwa vyovyote vile, tumia port 587 pamoja na STARTTLS, au port 465 pamoja na TLS isiyohitaji kuanzishwa kwa amri. Usipange kutumia port 25 kwa miunganisho ya kutoka. Watoa huduma wengi wa VPS huizuia kwa chaguo-msingi kwenye akaunti mpya. Port 25 iliyozuiwa huonekana sawa kabisa na muunganisho uliokwama, kwa sababu pakiti hutupwa badala ya kukataliwa. Hivyo, mteja husubiri hadi muda wa muunganisho kuisha badala ya kushindwa mara moja.

Ijaribu kabla ya kuiamini. Unda orodha, ongeza anwani yako mwenyewe kama msajili, kisha tuma kampeni kwa mpokeaji mmoja. Fungua ujumbe uliopokelewa na usome vichwa vyote. Kichwa cha Authentication-Results kilichoongezwa na upande unaopokea kinakuonyesha ikiwa SPF na DKIM zilifaulu.

Ufikishaji wa barua pepe ndio kazi nzima

Listmonk huunda ujumbe, hufuatilia orodha, na kukabidhi barua pepe kwa seva ya barua. Kila uamuzi kuhusu iwapo barua hiyo itafika kwenye kikasha hufanywa na mtoa huduma anayepokea, kwa kutumia anwani ya IP inayotuma na domain inayotuma. IP mpya ya VPS haina historia kabisa, na kila mtoa huduma mkubwa wa vikasha huchukulia ukosefu huo wa historia kuwa ishara ya mashaka kwa kiwango fulani.

Mambo manne si ya hiari:

  • Rekodi ya TXT ya SPF (sender policy framework) inayotaja host iliyoruhusiwa kutuma kwa niaba ya domain yako.
  • Ufunguo wa DKIM (domainkeys identified mail) uliochapishwa kama rekodi ya TXT, huku uwekaji saini ukifanywa na seva ya barua, si Listmonk.
  • Rekodi ya DMARC (domain based message authentication, reporting and conformance), inayowaeleza wapokeaji cha kufanya vipengele viwili vya kwanza vinaposhindwa.
  • Kikasha cha bounce ambacho Listmonk hukisoma, ili anwani zinazokataa barua ziondolewe kwenye orodha badala ya kujaribiwa tena bila mwisho.

Kisha tuma barua polepole mwanzoni. Domain ambayo haijawahi kutuma barua na ghafla ikaanza kuwasilisha ujumbe 10000 ndani ya saa moja inaonekana kama akaunti iliyoathiriwa, hivyo huchujwa hivyo. Anza na wanachama wako wanaoshiriki zaidi, kisha ongeza ujazo kwa siku kadhaa.

Kila template pia inahitaji kiungo cha kujiondoa kinachofanya kazi. Katika template ya Listmonk, kiungo hicho ni {{ UnsubscribeURL }}, na maudhui ya kampeni huwekwa mahali ambapo {{ template "content" . }} ipo; lazima ionekane mara moja tu katika kila template. Kampeni isiyo na kiungo cha kujiondoa husababisha malalamiko ya barua taka badala ya maombi ya kujiondoa, na malalamiko ndiyo njia ya haraka zaidi ya kupoteza sifa ya utumaji uliyoijenga kwa wiki kadhaa.

Hifadhi rudufu, na kile ambacho urejeshaji unahitaji

Vitu viwili lazima viondolewe kwenye seva: dampo la hifadhidata na config.toml. Ongeza saraka ya midia ikiwa unapakia picha kwenye kampeni.

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

Dampo hilo lina wahalifu, kampeni, violezo na kila mpangilio, ikiwemo vitambulisho vya SMTP, kwa hiyo lisimbage kwa njia fiche na lihifadhi nje ya seva hii. Kupanga kazi hiyo ni rahisi: tazama hifadhi rudufu za restic zilizosimbwa kwa njia fiche kwenye hifadhi ya mbali. config.toml ina mistari michache lakini ina nenosiri la hifadhidata, kwa hiyo ishughulikie kwa njia hiyo hiyo.

Uboreshaji hufuata mpangilio mmoja. Simamisha huduma, tengeneza dampo, badilisha binary katika /usr/bin, endesha listmonk --config /etc/listmonk/config.toml --upgrade, kisha uanzishe huduma. Uhamishaji wa schema huenda mbele pekee, kwa hiyo dampo hilo ndilo njia yako pekee ya kurudi nyuma.

Kwa nini Listmonk inashindwa kuanza?

Soma journal kwanza kwa journalctl -u listmonk -n 50 --no-pager. Takribani kila hitilafu ya kuanza huonyeshwa katika mstari mmoja ndani ya kizuizi cha [db].

pq: password authentication failed for user "listmonk" inamaanisha kuwa nenosiri katika [db] halilingani na jukumu la Postgres. Kiambishi pq ni taarifa ya driver ya Postgres kuhusu kukataliwa na seva. Hivyo, usanidi ulisomwa kwa usahihi, lakini kitambulisho kilikuwa si sahihi. Weka upya jukumu hilo kwa sudo -u postgres psql -c "ALTER USER listmonk WITH PASSWORD 'new-password';", kisha uweke mfuatano huohuo katika faili.

pq: database "listmonk" does not exist inamaanisha kuwa thamani ya database katika [db] haitaji hifadhidata halisi. sudo -u postgres psql -l huorodhesha vilivyopo kwenye seva, ikiwemo tahajia uliyotumia kimakosa.

permission denied wakati wa --install inamaanisha kuwa jukumu linaweza kuunganisha, lakini si mmiliki wa hifadhidata. Kwa hiyo, haliwezi kuunda majedwali ndani yake. Rekebisha kwa sudo -u postgres psql -c "ALTER DATABASE listmonk OWNER TO listmonk;", kisha uendeshe usakinishaji tena.

Huduma haijawahi kuanza na journal inataja faili ya usanidi. Mchakato unaoendeshwa kama listmonk hauwezi kufungua config.toml iliyoachwa ikiwa root:root yenye mode 600. stat -c '%U:%G %a' /etc/listmonk/config.toml inapaswa kuchapisha root:listmonk 640, na saraka iliyo juu yake inapaswa kuwa root:listmonk 750.

Paneli inafanya kazi, lakini hakuna barua pepe inayowasili. Hilo si tatizo la kuanza. Kwanza kagua Settings na SMTP, kisha kagua logi ya kampeni yenyewe katika paneli ya usimamizi. Logi hiyo huhifadhi hitilafu ambayo seva ya barua pepe ilirudisha kwa kila jaribio.

FAQ

Je, ninahitaji seva yangu ya barua pepe ili kutumia Listmonk?

Hapana. Listmonk si seva ya barua pepe. Inahitaji vitambulisho vya SMTP vya seva inayokubali barua zako na kuzifikisha, ambayo inaweza kuwa relay ya barua za miamala au seva ya barua unayoendesha mwenyewe. Weka vitambulisho hivyo chini ya Settings na SMTP katika paneli ya usimamizi, wala si katika config.toml, kwa sababu mipangilio ya barua pepe huhifadhiwa kwenye hifadhidata. Tumia port 587 pamoja na STARTTLS au port 465 pamoja na TLS fiche isiyo na mazungumzo ya kuanzisha, kwa sababu watoa huduma wengi wa VPS huzuia port 25 ya kutoka kwenye akaunti mpya.

Kwa nini viungo katika kampeni yangu vinaelekeza kwenye localhost:9000?

Mipangilio ya URL ya msingi bado iko kwenye thamani ya usakinishaji ya msingi ya http://localhost:9000. Listmonk huandika thamani hiyo kwenye viungo vya kujiondoa na URL za midia wakati kampeni inatumwa. Fungua Settings katika paneli ya usimamizi, weka URL ya msingi iwe anwani yako halisi ya HTTPS, kisha uhifadhi. Ujumbe uliokwisha fikishwa hauwezi kusahihishwa, kwa hiyo jitume kampeni ya majaribio na ubofye kiungo cha kujiondoa ndani yake kabla ya kutuma barua kwa orodha halisi.

Je, kuendesha --install tena kutafuta waliojisajili?

Ndiyo. --install ni kisakinishi cha mara ya kwanza na huondoa schema iliyopo ya Listmonk, na --yes huondoa kidokezo ambacho kingekuonya. Katika hati yoyote inayoweza kuendeshwa mara mbili, tumia --install --idempotent --yes, ambayo haifanyi chochote wakati majedwali tayari yapo. Ili kutumia mabadiliko ya schema katika toleo jipya, simamisha huduma, tengeneza pg_dump, kisha endesha --upgrade.

Kwa nini Listmonk inasema uthibitishaji wa nenosiri umeshindwa kwa mtumiaji listmonk?

Nenosiri katika sehemu ya [db] ya /etc/listmonk/config.toml halilingani na jukumu la Postgres lenye jina hilo hilo. Mstari wa journal ni pq: password authentication failed for user "listmonk", na pq ni kiendeshi cha Postgres kinachowasilisha kukataliwa kwa seva, jambo linalomaanisha kuwa faili ya usanidi ilipatikana na kusomwa. Weka upya nenosiri la jukumu hilo kwa kutumia sudo -u postgres psql -c "ALTER USER listmonk WITH PASSWORD 'new-password';", andika mfuatano huo huo kwenye faili ya usanidi, kisha endesha sudo systemctl restart listmonk.