В условиях, когда алгоритмы поисковых систем регулярно меняются, прямая связь со своей аудиторией становится ключевым активом. Listmonk — это легкая, сверхбыстрая и высокопроизводительная платформа с открытым исходным кодом для управления информационными рассылками и email-кампаниями.
Благодаря тому, что сервис работает в формате Self-hosted, вы полностью контролируете собственную базу подписчиков, приватность данных и не зависите от ежемесячных тарифов сторонних сервисов вроде Mailchimp или Brevo.
Listmonk написан на языке Go и использует PostgreSQL в качестве базы данных. В отличие от тяжеловесных систем, он потребляет минимальное количество ресурсов сервера (от 50 МБ RAM) и способен обрабатывать отправку тысяч писем в минуту.
Listmonk идеально подходит владельцам контентных проектов, веб-мастерам, DevOps-инженерам и разработчикам, которым нужна независимая, приватная и быстрая система для работы с аудиторией без переплат за сторонние SaaS-решения.
Хотя приложения на Go часто запускаются бинарным файлом, использование Docker для Listmonk является наиболее рациональным выбором. Это связано с требованиями к конкретной конфигурации PostgreSQL и удобством обслуживания. Дело в том, что Listmonk использует PostgreSQL с расширением POSIX/ICU для правильной сортировки и работы со спецсимволами, а также внутреннюю схему миграций. Запуск через Docker избавляет от необходимости вручную компилировать или настраивать PostgreSQL в системе и позволяет обновить сервис одной командой.
Для работы Listmonk потребуется установить официальный Docker Engine и плагин Docker Compose, что подробно рассматривается в разделе Установка в Debian, Ubuntu. Ниже я предполагаю, что Docker уже установлен.
Создайте рабочую директорию для проекта на вашем VPS:
mkdir -p /opt/listmonk cd /opt/listmonk
Загрузите официальный `docker-compose.yml` из репозитория проекта:
curl -LO https://github.com/knadh/listmonk/raw/master/docker-compose.yml
Запустите сервисы в фоновом режиме:
docker compose up -d
Примечание: Команда автоматически скачает образы PostgreSQL и Listmonk, поднимет базу данных, выполнит миграции и запустит веб-интерфейс.
Проверить статус запущенных контейнеров можно командой:
docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS listmonk_app listmonk/listmonk:latest "docker-entrypoint.s…" app About a minute ago Up About a minute 0.0.0.0:9000->9000/tcp, [::]:9000->9000/tcp listmonk_db postgres:17-alpine "docker-entrypoint.s…" db About a minute ago Up About a minute (healthy) 127.0.0.1:5432->5432/tcp
После успешного старта веб-интерфейс Listmonk будет доступен по адресу:
http://YOUR_SERVER_IP:9000
При первом визите система автоматически перенаправит вас на страницу создания учетной записи суперадминистратора (`/admin/login`).
1. Заполните форму, указав желаемый **Username** и надежный **Password**. 2. Нажмите кнопку создания пользователя для завершения установки и входа в панель управления.
Для обеспечения безопасности данных, корректной работы трекинга писем и защиты от спам-фильтров панель управления и ссылки Listmonk должны работать строго по протоколу HTTPS через ваш домен (например, `newsletter.dieg.net`).
Установите веб-сервер Nginx и утилиту Certbot:
apt update && apt install -y nginx certbot python3-certbot-nginx
По умолчанию Docker внедряется напрямую в iptables (на уровень ядра Linux) и добавляет свои правила проброса портов ДО того, как до них доходят правила UFW.
По умолчанию порт 9000 открыт для всего интернета. Чтобы панель была доступна строго через Nginx с HTTPS, откройте docker-compose.yml и измените проброс портов:
ports: - "127.0.0.1:9000:9000"
После этого примените изменения командой:
docker compose up -d
Примечание: Docker Compose автоматически пересоздаст только контейнер приложения за 1-2 секунды, не затрагивая базу данных.
Теперь Listmonk будет принимать соединения только от локального веб-сервера Nginx.
Разрешите подключения по SSH и стандартным веб-портам, после чего включите UFW:
ufw allow OpenSSH ufw allow 'Nginx Full' ufw enable
Примечание: Порт 9000 открывать в UFW не нужно — доступ к нему будет производиться локально через Nginx.
Мы должны получить такую конфигурацию:
# ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), deny (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 80,443/tcp (Nginx Full) ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6) 80,443/tcp (Nginx Full (v6)) ALLOW IN Anywhere (v6)
Создайте конфигурационный файл для вашего поддомена:
nano /etc/nginx/sites-available/listmonk.conf
Добавьте следующее содержимое (замените `newsletter.dieg.net` на ваш поддомен):
server { listen 80; server_name newsletter.dieg.net; 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; } }
Активируйте виртуальный хост и проверьте синтаксис:
ln -s /etc/nginx/sites-available/listmonk.conf /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx
Запустите Certbot для автоматического выпуска и установки SSL-сертификата Let's Encrypt:
certbot --nginx -d newsletter.dieg.net
Утилита автоматически настроит редирект с HTTP на HTTPS. После этого ваша система полностью готова к безопасной работе по адресу `https://newsletter.dieg.net`.
Теперь вы можете перейти по адресу `https://newsletter.dieg.net` и войти в панель управления с учетными данными, которые вы указали при старте.
Чтобы обновить Listmonk до последней версии, достаточно выполнить две команды в рабочей директории `/opt/listmonk`:
docker compose pull docker compose up -d