Завдяки самостійному розміщенню Listmonk працює на VPS, за який ви вже й так платите. Відправлення коштує стільки, скільки ваш SMTP-релей бере за тисячу листів. Кількість підписників не змінює жодну з цих сум. Це і є структурний зсув, який робить самостійне розміщення вартим витраченого часу на налаштування, щойно ви переростаєте безкоштовний тариф керованого сервісу.
Listmonk — це менеджер розсилок з відкритим кодом, написаний мовою Go. Ви отримуєте необмежену кількість підписників, списків і кампаній за ціною VPS плюс акаунт SMTP-релея. Одна річ має бути зрозумілою, перш ніж ви торкнетеся командного рядка: Listmonk робить усе, крім власне відправлення. Те, чи потрапить ваш лист до вхідних, чи до спаму, визначається SMTP-релеєм, який ви налаштуєте, і DNS-записами, які ви встановите на своєму домені відправлення.
Що охоплює цей посібник
- Розгорнути Listmonk і PostgreSQL з Docker Compose за реверс-проксі Nginx (або Caddy) з HTTPS
- Підібрати відповідний SMTP-релей під ваш обсяг і бюджет (Amazon SES, Postmark, Brevo чи інший)
- Налаштувати SPF, DKIM і DMARC на своєму домені відправлення
- Уникнути чотирьох сценаріїв збоїв у продакшені, які часто не видають зрозумілих помилок
- Орієнтовний час: 30 хвилин, якщо у вас уже готові VPS і домен
- Поза межами: автоматизація drip-розсилок, транзакційні листи, мультиінстансні налаштування (див. FAQ)
Коли Listmonk — не той інструмент
Listmonk — правильна відповідь для конкретної ситуації. Якщо ваша ситуація інша, є краща відповідь.
Обсяг менший за ~10K листів на місяць. Безкоштовні тарифи керованих сервісів Brevo чи Mailchimp на такому масштабі можуть обійтися дешевше за все, ніж VPS плюс SMTP-релей. Самостійне розміщення починає окупатися, щойно ви виходите за цей діапазон. Звірте цифри з вашою реальною кількістю підписників і частотою відправлень, перш ніж розгортати.
Нетехнічна команда. Mailchimp і Brevo мають справді кращі інтерфейси для людей, які не працюють у терміналі. Listmonk припускає, що хтось у команді вміє підключитися до сервера через SSH, читати логи Docker і розуміти поширення DNS. Якщо такої людини немає, керовані сервіси — правильний вибір.
Потрібні автоматизовані робочі процеси. Listmonk відправляє кампанії. Він не підтримує drip-послідовності, листи за тригерами поведінки чи візуальні конструктори робочих процесів. Якщо вам це потрібно, запустіть Mautic або з'єднайте Listmonk із n8n для шару автоматизації.
Списки підписників, чутливі до GDPR. Якщо ваші підписники переважно в ЄС або ваш список підпадає під правила GDPR щодо резидентності даних, запускайте Listmonk у європейському дата-центрі. Ми пропонуємо локації у Франкфурті та Лондоні, які відповідають вимогам резидентності ЄС.
Що вам знадобиться, перш ніж почати
Listmonk плюс PostgreSQL плюс помірне навантаження черги потребують щонайменше 2 GB RAM. 4 GB — комфортна ціль для продакшену.
Залізо. Для особистого списку до 50K листів на місяць достатньо VPS з 2 vCPU, 4 GB RAM і 120 GB NVMe-сховища. Списки, що ростуть, на 200K+ на місяць потребують 4 vCPU і 8 GB RAM. Ми запускаємо це налаштування Compose на VPS з 4 GB у Франкфурті. Якщо можете, обирайте локацію ближче до своїх підписників. Затримка при відправленні майже не має значення; відгук адмін-панелі — має.
Домен. Домен, спрямований на ваш VPS через A-запис. Використовуйте піддомен для адмін-інтерфейсу, наприклад mail.example.com. Домен відправлення й адмін-піддомен можуть бути одним кореневим доменом.
Акаунт SMTP-релея. Поки що не створюйте його. Вибір релея — найвагоміше рішення в цьому посібнику, і воно залежить від вашого обсягу. Перейдіть наперед до розділу «Вибір вашого SMTP-релея», оберіть провайдера, а потім поверніться сюди вже з SMTP-хостом, портом, іменем користувача й паролем у руках.
Програмне забезпечення на VPS. Ubuntu 22.04 LTS або 24.04 LTS. Docker Engine 24.0 чи вище з плагіном Docker Compose. UFW або еквівалентний фаєрвол з відкритими портами 22, 80 і 443. SSH-доступ як користувач sudo, що не є root.
Розгортання Listmonk із Docker Compose

Створіть каталог для розгортання, потім покладіть туди docker-compose.yml файл із двома сервісами: postgres для бази даних і listmonk для застосунку. Обидва перезапускаються в разі збою. Listmonk прив'язується до 127.0.0.1 тож реверс-проксі — єдине, що може до нього дістатися.
Файл Docker Compose
I see you've started with "Here is the" but haven't provided the full text to translate. Could you please share the complete English text you'd like translated to Ukrainian? docker-compose.yml. Звірте точні теги образу та назви змінних середовища з офіційною документацією зі встановлення Listmonk. Вони оновлюються з кожним релізом.
# 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:
Створити .env файл з POSTGRES_PASSWORD= встановлено на довгий випадковий рядок. Потім запустіть стек і виконайте одноразове встановлення бази даних:
# 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 команда запитає email і пароль адміністратора. Збережіть їх. Переконайтеся, що обидва контейнери працюють:
docker compose ps
Очікуваний вивід: два перелічені сервіси, обидва зі статусом Up. У рядку postgres має бути (healthy).
127.0.0.1:9000 прив'язка зроблена навмисно. У Listmonk немає вбудованого обмежувача частоти автентифікації та немає списку дозволених IP. Відкриття порту 9000 у публічний інтернет означає, що будь-хто на планеті може звернутися до вашого адмін-логіну. Реверс-проксі — це те, що робить цей логін доступним лише через HTTPS.
Реверс-проксі Nginx і SSL
Встановіть Nginx і Certbot із репозиторіїв Ubuntu. Створіть конфіг сайту за адресою /etc/nginx/sites-available/listmonk з проксі-заголовками, які Listmonk потребує для генерації правильних посилань кампаній:
# /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";
}
}
Створіть символьне посилання в sites-enabled, перевірте конфіг, перезавантажте Nginx, потім випустіть сертифікат:
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 переписує блок server так, щоб слухати на 443 з новим сертифікатом, і додає переадресацію з HTTP на HTTPS. Перевірте:
curl -I https://mail.example.com
Очікуваний вивід: HTTP/2 200 з дійсним заголовком strict-transport-security. Якщо ви отримуєте цикл переадресацій, перевірте, що X-Forwarded-Proto заголовок встановлено в конфізі Nginx вище. У дев'яти випадках із десяти цикл — саме через цей заголовок.
Якщо Listmonk — єдине, що є на цьому VPS, використовуйте Caddy замість Nginx. Caddyfile складається з трьох рядків і обробляє оновлення сертифіката без cron-завдання:
mail.example.com {
reverse_proxy 127.0.0.1:9000
}
Виправлення заголовка Message-ID
За замовчуванням Listmonk використовує системне ім'я хоста у вихідному заголовку Message-ID. Якщо ім'я хоста вашого VPS — localhost або будь-що, що не є дійсним FQDN, Listmonk надсилає Message-ID: <[email protected]>. Спам-фільтри Gmail і Outlook одразу позначають це. Це задокументовано в гілці форуму Cloudron 15410.
Виправлення — це один рядок у Listmonk config.tomlДля нової інсталяції згенеруйте файл через docker compose run --rm app ./listmonk --new-config. Потім встановіть:
[app]
hostname = "mail.example.com"
Перезапустіть контейнер застосунку після редагування:
docker compose restart app
Зробіть це, перш ніж відправите бодай одну кампанію. Список, забруднений localhost.localdomain Message-ID, відновити складніше, ніж той, що починався чистим.
Професійна порада
Якщо ви волієте пропустити налаштування Compose, скористайтеся нашим VPS Listmonk в один клік щоб розгорнути Listmonk за кілька хвилин одним кліком. Інстанс постачається з попередньо налаштованим PostgreSQL. Вам усе одно потрібно налаштувати свій SMTP-релей і додати свої DNS-записи. Ці кроки не є необов'язковими, хоч би як ви розгортали.
Вибір вашого SMTP-релея

Усе відправлення відбувається через релей, який ви налаштовуєте. Саме репутація IP релея, ліміти швидкості й обробка відмов визначають, чи потрапить ваш лист до вхідних, чи до спаму.
Ось функціональне порівняння. Ціни й ліміти безкоштовних тарифів змінюються. Звірте кожен з них на офіційній сторінці цін провайдера, перш ніж брати на себе зобов'язання.
| Поставщик | Структура вартості | Вебхуки відмов | Найкраще для |
|---|---|---|---|
| Amazon SES | За лист, дуже дешево на великих обсягах | Так, через SNS | Вартість на обсязі; ви вже на AWS |
| Postmark | Місячна база плюс плата за лист | Так, нативно | Орієнтація на доставлюваність; транзакційна репутація |
| Brevo | Безкоштовний тариф для малих обсягів, платні тарифи вище | Так | Малий обсяг із можливістю апгрейду |
| Mailgun | Ціноутворення за лист | Немає нативної кінцевої точки вебхука; за потреби використовуйте загальний bounce API. | Знайомий розробникам |
Це був лише короткий огляд кожного SMTP-релея. Тепер ми розглянемо кожен детально.
Amazon SES (рекомендована стартова точка)
SES — найдешевший варіант на обсязі й найбільш обговорюваний у спільноті Listmonk. Налаштування має більше кроків, ніж у Postmark чи Brevo, але різниця у вартості за лист достатньо велика на будь-якому реальному обсязі, щоб виправдати роботу.
Налаштуйте його в три етапи. По-перше, створіть IAM-користувача з політикою AmazonSESFullAccess (або жорсткішою власною політикою лише з ses:SendRawEmail та ses:GetSendQuota). По-друге, верифікуйте свій домен відправлення в консолі SES. SES проведе вас через DKIM CNAME, які потрібно додати. По-третє, згенеруйте SMTP-облікові дані на панелі налаштувань SMTP у SES. Це не ваші ключі доступу AWS; SES генерує окреме SMTP-специфічне ім'я користувача й пароль, коли ви натискаєте «Create SMTP credentials».
В адмінці Listmonk у Settings → SMTP додайте новий сервер із:
- Хост:
email-smtp.<region>.amazonaws.com(використовуйте регіон SES, у якому ви верифікували домен) - Port: 587
- Auth protocol: LOGIN
- TLS: STARTTLS
- Ім'я користувача й пароль: SMTP-облікові дані, які згенерував SES
SES вимагає STARTTLS на порту 587. Якщо ви залишите TLS у значенні none або оберете порт 465, Listmonk підключиться, SES поверне 530 Must issue a STARTTLS command first, а тест SMTP-облікових даних в адмін-панелі все одно може показати успіх. Надішліть справжній тестовий лист на особисту скриньку, яку ви контролюєте, перш ніж запускати будь-яку кампанію.
Нові акаунти SES стартують у режимі пісочниці. У пісочниці ви можете надсилати лише на верифіковані адреси email, що марно для списку підписників. Відкрийте тікет підтримки з консолі SES, щоб запросити доступ до продакшену. Схвалення зазвичай займає один робочий день.
Postmark (альтернатива з пріоритетом доставлюваності)
Postmark коштує дорожче за лист, ніж SES, але має нативну підтримку вебхуків відмов і репутацію високого відсотка потрапляння до вхідних завдяки суворим політикам відправників. Він того вартий, якщо ваші розсилки критичні для бізнесу або ви не хочете керувати переходом SES із пісочниці в продакшен.
Конфігурація Listmonk має ту саму форму, що й для SES: хост, порт 587, STARTTLS, облікові дані з панелі API-токенів сервера Postmark. Верифікуйте свій домен відправлення в налаштуванні підпису Postmark, додайте DKIM-записи, які генерує Postmark, і ви готові до відправлення.
Обирайте Postmark, коли доставлюваність важливіша за вартість одного листа. Обирайте SES, коли обсяг важливіший за зайве панькання.
Попередження щодо тесту SMTP-облікових даних. Тест підключення в адмінці Listmonk завжди повідомляє про успіх, навіть з недійсними обліковими даними. Це задокументовано в кількох issue на GitHub. Не довіряйте йому. Після налаштування будь-якого релея надішліть кампанію одному тестовому підписнику й підтвердіть отримання в цільовій скриньці, перш ніж відправляти на весь список.
Уникайте Mailersend для масового відправлення кампаній. Його обмеження у 5 листів на з'єднання спричиняє помилки 421 Service not available , які Listmonk фіксує як відправлені, хоча доставлення не вдалося. Кампанія виглядає успішною в Listmonk і втрачає більшість своїх повідомлень без попередження.
Як зробити, щоб листи справді доходили: SPF, DKIM і DMARC

Це три DNS-записи на вашому домені відправлення, які повідомляють серверам-одержувачам, що ваш домен авторизував цей релей відправляти від вашого імені. Пропустіть бодай один із них — і помітна частка ваших відправлень потраплятиме до спаму на масштабі, хоч би яким чистим був ваш релей чи ваш текст. Додайте їх у свого DNS-провайдера, перш ніж відправляти першу кампанію.
Запис SPF
SPF авторизує конкретні IP або сервіси відправлення надсилати листи для вашого домену. Додайте єдиний TXT-запис у корені вашого домену відправлення з include для вашого релея. Для SES запис виглядає так:
v=spf1 include:amazonses.com ~all
Для Postmark замініть include на include:spf.mtasv.net. Завжди звіряйтеся з офіційною документацією SPF вашого релея щодо точного значення include. Воно змінюється залежно від провайдера, а іноді й від регіону.
Домен може мати лише один запис SPF. Якщо у вас уже є один для іншого сервісу (Google Workspace, Microsoft 365), об'єднайте include в наявний запис, а не додавайте другий.
DKIM
DKIM додає криптографічний підпис до вихідних листів, який сервери-одержувачі звіряють із публічним ключем у вашому DNS. Ваш релей генерує пару ключів. Ви додаєте публічний ключ як TXT-запис на піддомені-селекторі (наприклад, sel1._domainkey.example.com) з точним значенням, яке вам дає релей.
Listmonk не виконує підписання DKIM. Це робить релей. Немає DKIM-конфігурації, специфічної для Listmonk. Виконайте інструкції майстра налаштування DKIM вашого релея, додайте записи, які він вам дає, і дочекайтеся поширення DNS (зазвичай менше ніж за 30 хвилин; іноді кілька годин).
DMARC
DMARC повідомляє серверам-одержувачам, що робити з листом, який не проходить перевірки SPF або DKIM. Почніть у режимі моніторингу з p=none щоб ви могли бачити збої в агрегованих звітах, не впливаючи на доставлюваність, поки усуваєте хибні налаштування. Додайте TXT-запис на _dmarc.example.com:
v=DMARC1; p=none; rua=mailto:[email protected]
Через два-три тижні чистих звітів посильте політику до p=quarantine or p=reject. Не пропускайте фазу моніторингу. Друкарська помилка у вашому SPF include в поєднанні з p=reject першого ж дня знищить вашу власну легітимну пошту без жодного сигналу про те, що щось пішло не так.
Заголовок List-Unsubscribe (RFC 8058) генерується Listmonk автоматично. Переконайтеся, що його ввімкнено в Settings → General. Gmail і Apple Mail показують цей заголовок як опцію відписки в один клік, що захищає репутацію відправника.
Що насправді ламається у продакшені
Чотири сценарії збоїв, які не проявляються, поки ви не відправите свою першу справжню кампанію. Спіймайте їх раніше, ніж це зроблять ваші підписники.
Проблема 1: відсоток відмов не збігається з цифрою вашого релея. Listmonk обробляє відмови, читаючи призначену адресу email для відмов через POP3 і видаляючи кожне прочитане повідомлення. Сюди входять відповіді про відпустку, повідомлення про доставлення й автовідповіді «немає на місці» — усе класифікується як відмови. Ваш релей рахує лише справжні збої доставлення, повернуті поштовими серверами одержувачів. Якщо SES повідомляє 0.6%, а Listmonk повідомляє 4%, це і є та різниця. Виправлення — налаштувати зворотні виклики вебхуків відмов замість POP3. Для SES використовуйте SNS, щоб доставляти повідомлення про відмови до кінцевої точки вебхука Listmonk. Для Postmark спрямуйте його нативний вебхук на ту саму кінцеву точку. Відмови через вебхук точні; відмови через POP3 завищують.
Проблема 2: тест SMTP-облікових даних каже «успіх», коли це хибно. Як зазначалося в розділі про релей, тест підключення завжди повідомляє про успіх незалежно від дійсності облікових даних. Не довіряйте йому. Завжди надсилайте справжній тестовий лист після налаштування чи зміни будь-якого параметра SMTP.
Проблема 3: кампанія зупиняється посеред відправлення без помилки. Listmonk позначає кампанії як Finished, навіть коли лист отримали лише 60% підписників. Решту відправлень було відхилено релеєм або обмежено на мережевому шарі VPS, і Listmonk не показує жодне з цього як помилку рівня кампанії (гілка форуму Cloudron 13165). Якщо кампанія показує менше відправлень, ніж підписників, відкрийте дашборд вашого релея за часовим вікном відправлення й порівняйте кількість прийнятих релеєм із кількістю в Listmonk. Правда — у релеї.
Проблема 4: ніхто не робить резервних копій PostgreSQL. Том Compose зберігає дані між перезапусками. Він не захищає від збою хоста, випадкового docker volume rm чи пошкоджених оновлень. Додайте щоденний pg_dump:
0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql
Спершу виконайте цей рядок один раз вручну. Переконайтеся, що вихідний файл не порожній, перш ніж довіряти cron-запису. Скрипт резервного копіювання, який записує файл нульового розміру без виклику помилки, гірший за відсутність резервних копій узагалі, бо ви перестаєте про нього думати.
Перш ніж довіряти бодай чомусь із цього у продакшені, надішліть тестову кампанію одному підписнику й підтвердіть отримання в цільовій скриньці. Якщо цей один лист дійде чисто, наступні десять тисяч дійдуть теж.
Часті запитання
Чому мої показники відмов у Listmonk вищі за ті, що повідомляє Amazon SES?
Обробка відмов через POP3 у Listmonk завищує лічильники, читаючи відповіді «немає на місці» й автовідповідачі про відпустку як відмови. Налаштуйте зворотні виклики вебхука SES SNS для точних лічильників.
Чи підтримує Listmonk транзакційні листи?
Listmonk — це інструмент для розсилок і масових кампаній. Він не обробляє транзакційні листи нативно (скидання паролів, підтвердження замовлень, тригерні листи «один-до-одного»). Для транзакційних листів із того самого домену відправлення налаштуйте транзакційну кінцеву точку вашого релея окремо або використовуйте спеціалізований інструмент на кшталт Postal чи транзакційного API Postmark поряд із Listmonk.
Як імпортувати моїх підписників Mailchimp у Listmonk?
Експортуйте свій список Mailchimp як CSV із Audience → Export Audience. У Listmonk перейдіть до Subscribers → Import і завантажте CSV. Зіставте стовпці email і name, коли буде запит. Listmonk приймає стандартні CSV-експорти з Mailchimp, ConvertKit і більшості платформ розсилок без перетворення формату.
Що відбувається, коли хтось відписується від кампанії Listmonk?
Listmonk за замовчуванням додає посилання для відписки в кожен лист кампанії. Коли підписник натискає на нього, його додають до списку блокування й вилучають з усіх майбутніх кампаній. Заголовок List-Unsubscribe (RFC 8058) додається автоматично, тож поштові клієнти, які підтримують відписку в один клік (Gmail, Apple Mail), показують її нативно. Запис підписника залишається в базі даних для цілей аудиту, але жодних подальших кампаній йому надсилатися не буде.