При самостоятельном размещении 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
Вот 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. 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, в котором вы подтвердили домен) - Порт: 587
- Протокол аутентификации: LOGIN
- TLS: STARTTLS
- Имя пользователя и пароль: SMTP-учётные данные, сгенерированные SES
SES требует STARTTLS на порту 587. Если вы оставите TLS в значении none или выберете порт 465, Listmonk подключится, SES вернёт 530 Must issue a STARTTLS command first, а тест SMTP-учётных данных в админ-панели всё равно может показать успех. Отправьте реальное тестовое письмо на личный ящик, к которому у вас есть доступ, прежде чем запускать любую кампанию.
Новые аккаунты SES стартуют в режиме песочницы. В песочнице вы можете отправлять только на подтверждённые адреса, что бесполезно для списка подписчиков. Откройте тикет в поддержку из консоли 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. Это делает релей. Никакой специфичной для Listmonk настройки DKIM нет. Пройдите мастер настройки 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. Не пропускайте фазу мониторинга. Опечатка в include вашей SPF-записи в сочетании с p=reject в первый же день уничтожит вашу собственную легитимную почту без единого сигнала о том, что что-то пошло не так.
Заголовок List-Unsubscribe (RFC 8058) генерируется Listmonk автоматически. Убедитесь, что он включён в разделе Settings → General. Gmail и Apple Mail показывают этот заголовок как кнопку отписки в один клик, что бережёт репутацию отправителя.
Что на самом деле ломается в продакшене
Четыре сценария сбоя, которые не проявляются, пока вы не отправите первую настоящую кампанию. Поймайте их раньше, чем это сделают ваши подписчики.
Проблема 1: процент отказов не совпадает с цифрой вашего релея. Listmonk обрабатывает отказы, считывая письма с назначенного адреса для отказов по 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 и имени, когда появится запрос. Listmonk принимает стандартные CSV-экспорты из Mailchimp, ConvertKit и большинства платформ рассылок без преобразования формата.
Что происходит, когда кто-то отписывается от кампании Listmonk?
Listmonk по умолчанию добавляет ссылку для отписки в каждое письмо кампании. Когда подписчик нажимает её, его добавляют в чёрный список и убирают из всех будущих кампаний. Заголовок List-Unsubscribe (RFC 8058) включается автоматически, поэтому почтовые клиенты с поддержкой отписки в один клик (Gmail, Apple Mail) показывают её нативно. Запись о подписчике остаётся в базе данных для аудита, но новые кампании ему отправляться не будут.