MAATRIX / Блог / Listmonk на Ubuntu 24.04: пошаговая установка

Listmonk на Ubuntu 24.04: пошаговая установка

MAATRIX

Mailchimp давно поднял цены и требует карту иностранного банка, а российские сервисы рассылок либо дороги, либо ограничены по функциям. Listmonk — open-source альтернатива на Go: быстрый, легковесный, с нормальным редактором кампаний и сегментацией подписчиков, и всё это можно поставить на обычный VPS за 15-20 минут. Ниже — установка с нуля на чистой Ubuntu 24.04: от подготовки сервера до рабочей рассылки с SSL и корректной настройкой отправки.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Listmonk и кому он подойдёт

Listmonk — это self-hosted платформа для email-рассылок и ньюслеттеров, написанная на Go с фронтендом на Vue. Один бинарник, база данных PostgreSQL, никакого PHP и минимум зависимостей — это отличает его от, скажем, связки на базе WordPress-плагинов. Из коробки есть: управление списками подписчиков, сегментация по атрибутам (JSON-поля произвольной структуры), конструктор кампаний с HTML-редактором, шаблоны писем, статистика открытий и переходов, публичные формы подписки и двойное подтверждение (double opt-in).

Кому подходит:

  • Проектам, которым нужна рассылка новостей или триггерных писем без ежемесячной подписки за каждую тысячу контактов.
  • Тем, кто уже привык платить за инфраструктуру картой РФ или криптой и не хочет зависеть от иностранных биллингов.
  • Командам, которые хотят держать базу подписчиков у себя, а не в чужом облаке.

Ограничение честно: Listmonk — это инструмент рассылки, а не полноценная email-инфраструктура. Он не отправляет письма сам по себе — для этого нужен SMTP-сервер или релей, и от его репутации напрямую зависит, попадут ли письма во «Входящие» или в спам. Об этом — отдельный раздел ниже.

Требования к серверу и подготовка Ubuntu 24.04

Для небольшой и средней базы (до 50-100 тысяч подписчиков) хватает скромной конфигурации:

РесурсМинимумКомфортно
CPU1 vCPU2 vCPU
RAM1 ГБ2 ГБ
Диск15 ГБ SSD25+ ГБ SSD
ОСUbuntu 24.04 LTSUbuntu 24.04 LTS

Начните с обновления системы и базовых утилит:

apt update && apt upgrade -y
apt install -y curl wget gnupg2 ca-certificates lsb-release ufw

Настройте файрвол — открываем только SSH, HTTP и HTTPS, порт приложения (9000) наружу не выпускаем, он будет доступен только через Nginx на localhost:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Если ещё не настраивали SSH-доступ по ключу и базовую защиту сервера — сделайте это до того, как открывать сервис наружу, это отдельная тема и она важнее, чем кажется на старте.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка PostgreSQL и создание базы

Listmonk хранит все данные — подписчиков, кампании, шаблоны, статистику — в PostgreSQL (актуальны версии 12+, на конец августа 2026 разумно ставить версию из стандартного репозитория Ubuntu 24.04 или PGDG-репозитория, если нужна более новая ветка).

apt install -y postgresql postgresql-contrib
systemctl enable --now postgresql

Создаём отдельную роль и базу под Listmonk — не используйте суперпользователя postgres для приложения:

sudo -u postgres psql -c "CREATE ROLE listmonk WITH LOGIN PASSWORD 'сложный_пароль_сюда';"
sudo -u postgres psql -c "CREATE DATABASE listmonk OWNER listmonk;"

Проверьте, что подключение работает от имени нового пользователя:

psql -h 127.0.0.1 -U listmonk -d listmonk -c "SELECT version();"

Если хотите более гибкую настройку PostgreSQL под нагрузку рассылок — параметры shared_buffers, work_mem, max_connections, — это тема отдельного разговора, база вопрос не в объёме данных (он у Listmonk скромный), а в частоте вставок при больших кампаниях.

Установка и первый запуск Listmonk

Официальный способ — скачать готовый бинарник с релизов проекта. Уточните актуальную версию на странице релизов GitHub (knadh/listmonk) перед установкой, команды ниже — шаблон:

mkdir -p /opt/listmonk && cd /opt/listmonk
curl -LO https://github.com/knadh/listmonk/releases/latest/download/listmonk_linux_amd64.tar.gz
tar xzf listmonk_linux_amd64.tar.gz
rm listmonk_linux_amd64.tar.gz

Сгенерируйте конфиг и отредактируйте под свою базу:

./listmonk --new-config
nano config.toml

В config.toml важны блок [db] (host, port, user, password, database — то, что вы создали выше) и [app], где указывается адрес, на котором слушает приложение (по умолчанию 127.0.0.1:9000 — это то, что нужно, раз наружу будет смотреть Nginx). Прогоняем установку схемы базы:

./listmonk --install

Скрипт создаст таблицы и попросит задать логин и пароль администратора при первом запуске. Дальше настраиваем автозапуск через systemd, чтобы Listmonk поднимался при перезагрузке сервера:

# /etc/systemd/system/listmonk.service
[Unit]
Description=Listmonk newsletter and mailing list manager
After=network.target postgresql.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/listmonk
ExecStart=/opt/listmonk/listmonk --config /opt/listmonk/config.toml
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
chown -R www-data:www-data /opt/listmonk
systemctl daemon-reload
systemctl enable --now listmonk
systemctl status listmonk

Проверьте, что приложение слушает локальный порт:

curl -I http://127.0.0.1:9000

Ответ 200 OK или редирект на страницу логина означает, что бэкенд поднялся и готов к проксированию наружу.

Nginx и SSL: публикация по своему домену

Приложение работает только на localhost — снаружи его открывает Nginx как обратный прокси, он же терминирует SSL. Если вы уже разворачивали похожие сервисы, схема будет знакомой — общий разбор Nginx как обратного прокси пригодится, если что-то пойдёт не так.

apt install -y nginx

Конфиг сайта:

# /etc/nginx/sites-available/listmonk.conf
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;
        client_max_body_size 25m;
    }
}
ln -s /etc/nginx/sites-available/listmonk.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

client_max_body_size подняли заранее — при загрузке изображений в медиатеку или импорте больших CSV со списками подписчиков дефолтных 1 МБ не хватит.

SSL получаем через Let's Encrypt — процесс подробно расписан в статье про настройку Let's Encrypt на VPS, здесь минимальная версия:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d mail.example.com

Certbot сам пропишет редирект с 80 на 443 и подключит автопродление сертификата через systemd-таймер.

Настройка SMTP-отправки и репутация домена

Это самый важный раздел с точки зрения того, дойдут ли ваши письма до адресата. Listmonk сам писем не отправляет — он передаёт их на SMTP-сервер, указанный в веб-интерфейсе (Settings → SMTP), а не в config.toml. Зайдите в админку по своему домену, откройте настройки и добавьте SMTP-хост, порт, логин и пароль.

Два реалистичных варианта:

  1. Внешний транзакционный SMTP (Mailgun, Postmark, SES, SendGrid и аналоги, включая российские сервисы транзакционных писем). Проще всего с точки зрения репутации — эти сервисы годами прогревают свои IP и следят за жалобами на спам. Разумный выбор для старта, особенно если у вас нет времени заниматься настройкой почтового сервера отдельно.
  2. Собственный почтовый сервер на соседнем VPS (Postfix или связка вроде Mailcow). Дешевле в пересчёте на письмо при больших объёмах, но требует ручной работы: чистый IP без истории спама, корректная обратная DNS-запись (PTR) на сервере, SPF, DKIM и DMARC на домене отправителя.

Независимо от выбора, на уровне DNS-домена, с которого идёт рассылка, обязательны три записи:

example.com.       TXT  "v=spf1 include:отправляющий-сервис.com ~all"
default._domainkey  TXT  "v=DKIM1; k=rsa; p=ваш_публичный_ключ"
_dmarc.example.com  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"

Без SPF и DKIM почтовые провайдеры (особенно Gmail и Yandex) массово отправляют такие письма в спам или вовсе отклоняют — это не гипотеза, а стандартное поведение антиспам-фильтров при отсутствии аутентификации домена. Если планируете свой почтовый сервер и хотите разобраться, почему письма всё равно оседают в спаме даже после базовой настройки, у нас есть отдельный разбор типичных причин попадания писем в спам — большинство пунктов оттуда актуальны для любой SMTP-инфраструктуры, не только для Mailcow.

Отдельно: многие хостинг-провайдеры по умолчанию блокируют исходящий 25-й порт с VPS, чтобы бороться со спамом с чужих серверов — если собираетесь поднимать собственный Postfix, уточните это заранее, иначе отправка просто не заработает.

Бэкапы, обновление и обслуживание

База Listmonk компактная, бэкапить её просто. Дамп PostgreSQL плюс каталог с конфигом и загруженными медиафайлами:

#!/bin/bash
# /opt/scripts/backup-listmonk.sh
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/opt/backups/listmonk
mkdir -p "$BACKUP_DIR"

pg_dump -h 127.0.0.1 -U listmonk listmonk | gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
tar czf "$BACKUP_DIR/uploads-$DATE.tar.gz" /opt/listmonk/uploads 2>/dev/null

find "$BACKUP_DIR" -type f -mtime +14 -delete

Добавьте в cron на ежедневный запуск:

crontab -e
# 0 3 * * * /opt/scripts/backup-listmonk.sh

Пароль к базе в скрипте лучше не хранить в открытом виде — вынесите его в ~/.pgpass с правами 600, pg_dump подхватит его автоматически.

Обновление — скачиваете новый бинарник тем же способом, что и при установке, останавливаете сервис, заменяете файл и прогоняете миграции схемы базы:

systemctl stop listmonk
# заменяем бинарник на новую версию
./listmonk --upgrade
systemctl start listmonk

Перед обновлением на продакшене снимите свежий дамп базы — миграции необратимы, и откатиться проще из бэкапа, чем разбираться постфактум.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли поставить Listmonk в Docker вместо бинарника?

Да, официальный образ существует и это рабочий вариант, особенно если у вас уже есть Docker-инфраструктура с Compose. Описанный в статье способ через systemd-сервис проще для отдельного сервера без других контейнеров и не тянет за собой Docker как зависимость.

Сколько писем реально можно отправить с одного VPS?

Это зависит не от Listmonk (он лишь ставит письма в очередь и обращается к вашему SMTP), а от лимитов и репутации выбранного SMTP-релея или собственного почтового сервера. У большинства транзакционных сервисов есть дневные и часовые лимиты на бесплатных и стартовых тарифах — уточняйте их у конкретного провайдера, они меняются.

Нужен ли отдельный сервер под Listmonk или хватит существующего?

Если на сервере уже крутится сайт с умеренной нагрузкой, Listmonk спокойно уживётся рядом — он лёгкий и по CPU, и по памяти. Отдельный VPS имеет смысл, если вы одновременно поднимаете свой SMTP-сервер: держать почтовую инфраструктуру отдельно от веб-сервисов проще с точки зрения IP-репутации и файрвола.

Как перенести список подписчиков из другого сервиса?

Через импорт CSV в веб-интерфейсе Listmonk (Subscribers → Import). Важно: если подписчики раньше подтверждали согласие на рассылку в другом сервисе, а не через double opt-in Listmonk, для новых кампаний по такой базе стоит запланировать re-permission-письмо — это снижает риск жалоб на спам после переезда.

Что делать, если после установки страница логина не открывается?

Проверьте по очереди: systemctl status listmonk (сервис запущен), curl -I http://127.0.0.1:9000 (приложение отвечает локально), nginx -t (конфиг валиден) и логи journalctl -u listmonk -n 50. В девяти случаях из десяти проблема либо в неверных данных подключения к базе в config.toml, либо в том, что Nginx не перезагрузили после добавления конфига.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →