Skip to main content
Sleva 50% všechny plány, omezený čas. Od $2.48/mo
Zbývá 14 min
Web a firemní aplikace

Jak hostovat vlastní newsletter pomocí Listmonk

C By Chike 14 min čtení
Jak hostovat vlastní newsletter pomocí Listmonk na VPS: Docker Compose, SMTP relay a doručitelnost přes SPF/DKIM/DMARC.

Při hostování ve vlastní režii běží Listmonk na VPS, který už platíte. Odesílání stojí tolik, kolik si váš SMTP relay účtuje za tisíc e-mailů. Počet odběratelů ani jedno z těchto čísel nemění. To je ten zásadní rozdíl, díky kterému se vlastní hostování vyplatí, jakmile přerostete bezplatnou úroveň spravované služby.

Listmonk je open-source správce newsletterů napsaný v jazyce Go. Získáte neomezený počet odběratelů, seznamů a kampaní za cenu VPS plus účtu u SMTP relay. Jednu věc je třeba ujasnit ještě dřív, než zadáte první příkaz: Listmonk se stará o všechno kromě samotného odesílání. To, zda váš e-mail dorazí do schránky nebo do spamu, určuje SMTP relay, který nastavíte, a DNS záznamy, které vytvoříte na odesílací doméně.

Co tento návod pokrývá

  • Nasazení Listmonk a PostgreSQL pomocí Docker Compose za reverzní proxy Nginx (nebo Caddy) s HTTPS
  • Výběr správného SMTP relay podle objemu a rozpočtu (Amazon SES, Postmark, Brevo nebo jiný)
  • Nastavení SPF, DKIM a DMARC na odesílací doméně
  • Vyhnutí se čtyřem produkčním selháním, která často nehlásí žádnou jasnou chybu
  • Odhadovaný čas: 30 minut, pokud máte připravený VPS a doménu
  • Mimo rozsah: dripová automatizace, transakční e-maily, nasazení s více instancemi (viz FAQ)

Kdy je Listmonk špatný nástroj

Listmonk je správná odpověď pro konkrétní situaci. Pokud je vaše situace jiná, existuje lepší odpověď.

Objem pod přibližně 10K e-maily měsíčně. Bezplatné úrovně u Brevo nebo Mailchimp mohou v součtu vyjít levněji než VPS plus SMTP relay v tomto měřítku. Vlastní hostování se začne vyplácet, jakmile tuto hranici překročíte. Než cokoliv nasadíte, porovnejte čísla se svým skutečným počtem odběratelů a frekvencí odesílání.

Netechnický tým. Mailchimp a Brevo mají opravdu lepší rozhraní pro lidi, kteří nepracují v terminálu. Listmonk předpokládá, že se někdo v týmu umí přihlásit přes SSH na server, číst logy Dockeru a interpretovat propagaci DNS. Pokud takový člověk neexistuje, jsou spravované služby správná volba.

Potřebujete automatizační workflow. Listmonk odesílá kampaně. Nepodporuje dripové sekvence, e-maily spouštěné chováním ani vizuální editory workflow. Pokud je potřebujete, provozujte Mautic nebo propojte Listmonk s n8n a získejte automatizační vrstvu.

Seznamy odběratelů citlivé z hlediska GDPR. Pokud jsou vaši odběratelé převážně z EU nebo se na váš seznam vztahují pravidla GDPR o umístění dat, provozujte Listmonk v evropském datovém centru. Nabízíme lokality ve Frankfurtu a Londýně, které splňují požadavky na umístění dat v EU.

Co potřebujete, než začnete

Listmonk plus PostgreSQL plus středně velká fronta potřebují na minimum 2 GB RAM. 4 GB je pohodlný produkční cíl.

Hardware. Pro osobní seznam pod 50K e-maily měsíčně stačí VPS s 2 vCPU, 4 GB RAM a 120 GB úložištěm NVMe. Rostoucí seznamy nad 200K měsíčně potřebují 4 vCPU a 8 GB RAM. Toto nastavení Compose provozujeme na 4 GB VPS ve Frankfurtu. Pokud můžete, zvolte lokalitu blízko svým odběratelům. Latence odesílání moc nezáleží, na odezvě administrátorského panelu ano.

Doména. Doména směřovaná na váš VPS přes A záznam. Pro administrátorské rozhraní použijte subdoménu, například mail.example.com. Odesílací doména a administrátorská subdoména mohou být na stejné kořenové doméně.

Účet u SMTP relay. Zatím žádný nevytvářejte. Volba relay je nejzávažnější rozhodnutí v tomto návodu a závisí na vašem objemu. Přeskočte do sekce „Výběr SMTP relay“, vyberte poskytovatele a pak se sem vraťte s SMTP hostem, portem, uživatelským jménem a heslem po ruce.

Software na VPS. Ubuntu 22.04 LTS nebo 24.04 LTS. Docker Engine 24.0 nebo vyšší s pluginem Docker Compose. UFW nebo obdobný firewall s otevřenými porty 22, 80 a 443. SSH přístup jako sudo uživatel bez root práv.

Nasazení Listmonk pomocí Docker Compose

Listmonk a PostgreSQL nasazené pomocí Docker Compose na VPS, za reverzní proxy Nginx nebo Caddy, která ukončuje HTTPS.

Vytvořte adresář pro nasazení a pak do něj vložte docker-compose.yml soubor se dvěma službami: postgres pro databázi a listmonk pro aplikaci. Obě se při selhání restartují. Listmonk se naváže na 127.0.0.1 takže reverzní proxy je jediné, co se k němu dostane.

Soubor Docker Compose

I'd be happy to help translate, but your message appears to be incomplete. Could you please provide the full text you'd like me to translate to Czech? docker-compose.yml. Ověřte přesné tagy obrazů a názvy proměnných prostředí podle oficiální dokumentace instalace Listmonk. S každým vydáním se aktualizují.

# docker-compose.yml
services:
  postgres:
    image: postgres:16-alpine
    container_name: listmonk-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: listmonk
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: listmonk
    volumes:
      - listmonk-postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U listmonk"]
      interval: 10s
      timeout: 5s
      retries: 6

  app:
    image: listmonk/listmonk:latest
    container_name: listmonk-app
    restart: unless-stopped
    # Bind to loopback only. The reverse proxy is the public entrypoint.
    ports:
      - "127.0.0.1:9000:9000"
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      LISTMONK_app__address: "0.0.0.0:9000"
      LISTMONK_db__host: postgres
      LISTMONK_db__port: 5432
      LISTMONK_db__user: listmonk
      LISTMONK_db__password: ${POSTGRES_PASSWORD}
      LISTMONK_db__database: listmonk

volumes:
  listmonk-postgres:

Vytvořit .env soubor s POSTGRES_PASSWORD= nastaveno na dlouhý náhodný řetězec. Pak spusťte stack a proveďte jednorázovou instalaci databáze:

# Pull images and start the database first
docker compose up -d postgres

# Run the install step (creates schema and the first admin user)
docker compose run --rm app ./listmonk --install --idempotent --yes

# Start the application
docker compose up -d

--install příkaz se zeptá na administrátorský e-mail a heslo. Uložte si je. Ověřte, že oba kontejnery běží:

docker compose ps

Očekávaný výstup: dvě uvedené služby, obě se stavem Up. U řádku postgres by se mělo zobrazit (healthy).

127.0.0.1:9000 navázání je záměrné. Listmonk nemá vestavěný omezovač počtu pokusů o přihlášení ani povolování podle IP. Vystavení portu 9000 do veřejného internetu znamená, že kdokoliv na planetě se může pokusit o přihlášení do vašeho administrátorského rozhraní. Reverzní proxy je to, co zpřístupní toto přihlášení pouze přes HTTPS.

Reverzní proxy Nginx a SSL

Nainstalujte Nginx a Certbot z repozitářů Ubuntu. Vytvořte konfiguraci webu v /etc/nginx/sites-available/listmonk s proxy hlavičkami, které Listmonk potřebuje ke generování správných odkazů v kampaních:

# /etc/nginx/sites-available/listmonk
server {
    listen 80;
    server_name mail.example.com;

    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;

        # Listmonk streams campaign progress over WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Vytvořte symbolický odkaz do sites-enabled, otestujte konfiguraci, znovu načtěte Nginx a pak vydejte certifikát:

sudo ln -s /etc/nginx/sites-available/listmonk /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d mail.example.com

Certbot přepíše server blok, aby naslouchal na portu 443 s novým certifikátem, a přidá přesměrování z HTTP na HTTPS. Ověřte:

curl -I https://mail.example.com

Očekávaný výstup: HTTP/2 200 s platnou hlavičkou strict-transport-security. Pokud dostanete smyčku přesměrování, zkontrolujte, že je v konfiguraci Nginx výše nastavena hlavička X-Forwarded-Proto Devětkrát z deseti je tou smyčkou právě tato hlavička.

Pokud je Listmonk jediná věc na tomto VPS, použijte raději Caddy. Caddyfile má tři řádky a obstará obnovu certifikátu bez cron úlohy:

mail.example.com {
    reverse_proxy 127.0.0.1:9000
}

Oprava hlavičky Message-ID

Ve výchozím nastavení Listmonk používá v odchozí hlavičce Message-ID systémový hostname. Pokud je hostname vašeho VPS localhost nebo cokoliv, co není platný FQDN, Listmonk odesílá Message-ID: <[email protected]>. Spamové filtry u Gmailu a Outlooku to okamžitě označí. Je to zdokumentováno ve vláknu 15410 na Cloudron Foru.

Oprava je jeden řádek v souboru Listmonk config.tomlPro čerstvou instalaci vygenerujte soubor pomocí docker compose run --rm app ./listmonk --new-config. Pak nastavte:

[app]
hostname = "mail.example.com"

Po úpravě restartujte kontejner aplikace:

docker compose restart app

Udělejte to dřív, než odešlete jedinou kampaň. Seznam zamořený localhost.localdomain Message-ID se obnovuje hůř než ten, který začal čistě.

Profesionální tip

Pokud byste se nastavení přes Compose raději vyhnuli, podívejte se na náš one-click Listmonk VPS a nasaďte Listmonk během pár minut jediným kliknutím. Instance přichází předkonfigurovaná s PostgreSQL. Stále musíte nastavit svůj SMTP relay a přidat DNS záznamy. Tyto kroky nejsou volitelné, ať už nasazujete jakkoliv.

Výběr SMTP relay

Výběr SMTP relay pro Listmonk: Amazon SES, Postmark, Brevo a Mailgun porovnané podle struktury nákladů, webhooků pro odražené e-maily a nejlepšího využití.

Veškeré odesílání probíhá přes relay, který nastavíte. To, zda váš e-mail dorazí do schránky nebo do spamu, určuje reputace IP relay, jeho limity rychlosti a zpracování odražených e-mailů.

Zde je funkční srovnání. Ceny a limity bezplatných úrovní se mění. Před rozhodnutím si ověřte každý na oficiální cenové stránce poskytovatele.

PoskytovatelStruktura nákladůWebhooky pro odražené e-mailyNejlepší pro
Amazon SESZa e-mail, při objemu velmi nízkáAno, přes SNSCena při objemu; už jste na AWS
PostmarkMěsíční základ plus za e-mailAno, nativněPrioritou je doručitelnost; transakční reputace
BrevoBezplatná úroveň pro nízký objem, placené úrovně výšeAnoNízký objem s možností přejít výš
MailgunCeny za e-mailŽádný nativní webhook endpoint; v případě potřeby použijte obecné API pro odražené e-maily.Známé vývojářům

To byl jen krátký pohled na každý SMTP relay. Teď si každý projdeme do hloubky.

SES je nejlevnější varianta při objemu a nejvíce probíraná v komunitě Listmonk. Nastavení má víc kroků než u Postmarku nebo Brevo, ale rozdíl v ceně za e-mail je při jakémkoliv reálném objemu dostatečně velký, aby tu práci ospravedlnil.

Nastavte ho ve třech fázích. Nejprve vytvořte IAM uživatele s politikou AmazonSESFullAccess (nebo přísnější vlastní politikou pouze s ses:SendRawEmail a ses:GetSendQuota). Za druhé ověřte svou odesílací doménu v konzoli SES. SES vás provede DKIM CNAME záznamy, které máte přidat. Za třetí vygenerujte SMTP přihlašovací údaje v panelu SMTP nastavení SES. Nejsou to vaše přístupové klíče AWS; SES vygeneruje samostatné uživatelské jméno a heslo specifické pro SMTP, když kliknete na „Create SMTP credentials“.

V administraci Listmonk pod Settings → SMTP přidejte nový server s:

  • Hostitel: email-smtp.<region>.amazonaws.com (použijte SES region, ve kterém jste doménu ověřili)
  • Port: 587
  • Auth protocol: LOGIN
  • TLS: STARTTLS
  • Username a password: SMTP přihlašovací údaje, které SES vygeneroval

SES vyžaduje STARTTLS na portu 587. Pokud necháte TLS nastavené na none nebo zvolíte port 465, Listmonk se připojí, SES vrátí 530 Must issue a STARTTLS command first, a test SMTP přihlašovacích údajů v administrátorském panelu může stejně ukázat úspěch. Před spuštěním jakékoliv kampaně odešlete skutečný testovací e-mail do osobní schránky, kterou ovládáte.

Nové účty SES začínají v sandbox režimu. V sandboxu můžete odesílat pouze na ověřené e-mailové adresy, což pro seznam odběratelů není užitečné. Otevřete v konzoli SES tiket podpory a požádejte o produkční přístup. Schválení obvykle trvá jeden pracovní den.

Postmark (alternativa s prioritou na doručitelnost)

Postmark stojí za e-mail víc než SES, ale má nativní podporu webhooků pro odražené e-maily a pověst vysoké míry doručení do schránky díky přísným pravidlům pro odesílatele. Vyplatí se, pokud jsou vaše newslettery zásadní pro byznys nebo nechcete řešit schvalování přechodu ze sandboxu do produkce u SES.

Konfigurace Listmonk má stejnou podobu jako u SES: host, port 587, STARTTLS, přihlašovací údaje z panelu API tokenů serveru Postmark. Ověřte svou odesílací doménu v nastavení podpisu Postmark, přidejte DKIM záznamy, které Postmark vygeneruje, a můžete odesílat.

Postmark zvolte, když na doručitelnosti záleží víc než na ceně za e-mail. SES zvolte, když na objemu záleží víc než na vodění za ruku.

Varování ohledně testu SMTP přihlašovacích údajů. Test připojení v administraci Listmonk vždy hlásí úspěch, dokonce i s neplatnými přihlašovacími údaji. Je to zdokumentováno v několika GitHub issues. Nevěřte mu. Po nastavení jakéhokoliv relay odešlete kampaň jednomu testovacímu odběrateli a potvrďte si přijetí v cílové schránce, než budete odesílat na celý seznam.

Pro hromadné odesílání kampaní se Mailersend vyhněte. Jeho limit 5 e-mailů na připojení produkuje chyby 421 Service not available které Listmonk eviduje jako odeslané, přestože doručení selhalo. Kampaň vypadá v Listmonk úspěšně a bez varování zahodí většinu svých zpráv.

Aby e-mail skutečně dorazil: SPF, DKIM a DMARC

DNS záznamy SPF, DKIM a DMARC na odesílací doméně, které umožní přijímacím poštovním serverům ověřit e-mail od Listmonk a udržet ho mimo spam.

Toto jsou tři DNS záznamy na vaší odesílací doméně, které přijímacím poštovním serverům sdělí, že vaše doména pověřila tento relay odesíláním ve vašem zastoupení. Vynechte kterýkoliv z nich a podstatná část vašich odeslaných e-mailů ve větším měřítku skončí ve spamu, bez ohledu na to, jak čistý je váš relay nebo text. Přidejte je u svého DNS poskytovatele před odesláním první kampaně.

Záznam SPF

SPF autorizuje konkrétní IP nebo odesílací služby k odesílání e-mailů za vaši doménu. Přidejte jediný TXT záznam v kořeni vaší odesílací domény s include pro váš relay. Pro SES vypadá záznam takto:

v=spf1 include:amazonses.com ~all

Pro Postmark nahraďte include hodnotou include:spf.mtasv.net. Vždy si ověřte přesnou hodnotu include v oficiální SPF dokumentaci vašeho relay. Liší se podle poskytovatele a někdy i podle regionu.

Doména může mít jen jeden SPF záznam. Pokud už nějaký máte pro jinou službu (Google Workspace, Microsoft 365), sloučte include do stávajícího záznamu místo přidávání druhého.

DKIM

DKIM připojuje k odchozím e-mailům kryptografický podpis, který přijímací servery ověřují proti veřejnému klíči ve vašem DNS. Váš relay vygeneruje klíčový pár. Veřejný klíč přidáte jako TXT záznam na subdoméně selektoru (například sel1._domainkey.example.com) s přesnou hodnotou, kterou vám relay dá.

Listmonk DKIM podepisování neřeší. Dělá to relay. Žádná DKIM konfigurace specifická pro Listmonk neexistuje. Postupujte podle průvodce nastavením DKIM vašeho relay, přidejte záznamy, které vám dá, a počkejte na propagaci DNS (obvykle do 30 minut, někdy několik hodin).

DMARC

DMARC říká přijímacím serverům, co dělat s e-mailem, který neprojde kontrolami SPF nebo DKIM. Začněte v režimu monitorování s p=none abyste mohli vidět selhání v souhrnných reportech, aniž byste ovlivnili doručitelnost, zatímco si dolaďujete chybná nastavení. Přidejte TXT záznam v _dmarc.example.com:

v=DMARC1; p=none; rua=mailto:[email protected]

Po dvou nebo třech týdnech čistých reportů zpřísněte politiku na p=quarantine or p=reject. Fázi monitorování nepřeskakujte. Překlep ve vašem SPF include v kombinaci s p=reject v první den smaže vaše vlastní legitimní e-maily bez jediného signálu, že se něco pokazilo.

Hlavičku List-Unsubscribe (RFC 8058) generuje Listmonk automaticky. Potvrďte, že je zapnutá pod Settings → General. Gmail a Apple Mail zobrazují tuto hlavičku jako možnost odhlášení jedním kliknutím, což chrání reputaci odesílatele.

Co se v produkci skutečně rozbije

Čtyři selhání, která se neprojeví, dokud neodešlete svou první skutečnou kampaň. Odhalte je dřív než vaši odběratelé.

Problém 1: Míra odražených e-mailů neodpovídá číslu vašeho relay. Listmonk zpracovává odražené e-maily čtením určené e-mailové adresy pro odražené zprávy přes POP3 a mazáním každé zprávy, kterou přečte. To zahrnuje automatické odpovědi z dovolené, doručenky a oznámení o nepřítomnosti, vše klasifikované jako odražené. Váš relay počítá pouze skutečná selhání doručení vrácená poštovními servery příjemců. Pokud SES hlásí 0.6 % a Listmonk hlásí 4 %, tady je ten rozdíl. Oprava spočívá v nastavení webhook callbacků pro odražené e-maily místo POP3. Pro SES použijte SNS k doručování oznámení o odražených e-mailech na webhook endpoint Listmonk. Pro Postmark nasměrujte jeho nativní webhook na stejný endpoint. Webhook odražené e-maily jsou přesné; POP3 odražené e-maily čísla nadhodnocují.

Problém 2: Test SMTP přihlašovacích údajů hlásí úspěch, i když je to špatně. Jak bylo zmíněno v sekci o relay, test připojení vždy hlásí úspěch bez ohledu na platnost přihlašovacích údajů. Nevěřte mu. Po nastavení nebo změně jakéhokoliv SMTP nastavení vždy odešlete skutečný testovací e-mail.

Problém 3: Kampaň se uprostřed odesílání zastaví bez chyby. Listmonk označuje kampaně jako Finished i tehdy, když e-mail obdrželo jen 60 % odběratelů. Zbývající odeslání byla odmítnuta relay nebo přiškrcena na síťové vrstvě VPS a Listmonk ani jedno nehlásí jako chybu na úrovni kampaně (vlákno 13165 na Cloudron Foru). Pokud kampaň vykazuje méně odeslání než odběratelů, otevřete dashboard svého relay pro časové okno odeslání a porovnejte počet přijatých zpráv u relay s počtem u Listmonk. Pravda je u relay.

Problém 4: Nikdo nezálohuje PostgreSQL. Compose volume uchovává data napříč restarty. Nechrání před selháním hostitele, omylem zadaným docker volume rm nebo poškozenými aktualizacemi. Přidejte denní pg_dump:

0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql

Spusťte ten řádek nejprve jednou ručně. Než budete cron záznamu věřit, ověřte, že výstupní soubor není prázdný. Zálohovací skript, který zapíše soubor o nulové velikosti, aniž by nahlásil chybu, je horší než žádná záloha, protože na zálohování přestanete myslet.

Než cokoliv z toho v produkci nasadíte, odešlete testovací kampaň jednomu odběrateli a potvrďte si přijetí v cílové schránce. Pokud ten jeden e-mail dorazí čistě, dorazí i dalších deset tisíc.

Časté dotazy

Proč jsou míry odražených e-mailů v Listmonk vyšší než to, co hlásí Amazon SES?

Zpracování odražených e-mailů přes POP3 v Listmonk nadhodnocuje počty tím, že čte automatické odpovědi z nepřítomnosti a z dovolené jako odražené. Pro přesné počty nastavte SNS webhook callbacky u SES.

Podporuje Listmonk transakční e-maily?

Listmonk je nástroj na newslettery a hromadné kampaně. Nativně neřeší transakční e-maily (obnovy hesel, potvrzení objednávek, individuálně spouštěné e-maily). Pro transakční e-maily ze stejné odesílací domény nastavte transakční endpoint svého relay samostatně nebo použijte vyhrazený nástroj jako Postal nebo transakční API Postmark vedle Listmonk.

Jak naimportuji své odběratele z Mailchimpu do Listmonk?

Exportujte svůj seznam z Mailchimpu jako CSV přes Audience → Export Audience. V Listmonk přejděte na Subscribers → Import a nahrajte CSV. Při výzvě namapujte sloupce e-mailu a jména. Listmonk přijímá standardní CSV exporty z Mailchimpu, ConvertKit a většiny newsletterových platforem bez převodu formátu.

Co se stane, když se někdo odhlásí z kampaně Listmonk?

Listmonk přidává do každého e-mailu kampaně odhlašovací odkaz ve výchozím nastavení. Když na něj odběratel klikne, je přidán na blokovací seznam a odstraněn ze všech budoucích kampaní. Hlavička List-Unsubscribe (RFC 8058) je zahrnuta automaticky, takže poštovní klienti, kteří podporují odhlášení jedním kliknutím (Gmail, Apple Mail), ji zobrazí nativně. Záznam odběratele zůstává v databázi pro účely auditu, ale žádné další kampaně mu odeslány nebudou.

Sdílet

Další z blogu

Pokračuj ve čtení.

Hotov k nasazení? Od 2,48 $/měs.

Nezávislý cloud od roku 2008. AMD EPYC, NVMe, 40 Gbps. Vrácení peněz do 14 dnů.