Розгортання Listmonk на VPS: Керування розсилками з Docker, PostgreSQL та Caddy
TL;DR
У цьому детальному посібнику ми крок за кроком налаштуємо Listmonk — потужну open-source платформу для email-розсилок — на власному VPS-сервері. Використовуючи Docker для контейнеризації, PostgreSQL для бази даних та Caddy як реверс-проксі з автоматичним HTTPS, ви отримаєте повністю контрольоване, масштабоване та безпечне рішення для керування підписниками та надсилання кампаній, уникаючи залежності від сторонніх сервісів та їхніх обмежень.
- Налаштування Listmonk, PostgreSQL та Caddy з використанням Docker Compose для простоти розгортання та керування.
- Автоматичне отримання та поновлення SSL-сертифікатів за допомогою Caddy.
- Забезпечення базової безпеки сервера (SSH, файрвол, Fail2ban).
- Рекомендації щодо вибору оптимального VPS-конфігу та стратегій резервного копіювання.
- Практичні команди та конфігураційні файли для кожного етапу встановлення.
- Розгорнутий розділ з усунення типових проблем та відповіді на часті запитання.
Що ми налаштовуємо і навіщо
У цьому посібнику ми зосередимося на розгортанні Listmonk — сучасної, високопродуктивної та багатофункціональної платформи для керування email-розсилками. Listmonk є чудовою альтернативою комерційним SaaS-рішенням, таким як Mailchimp або SendGrid, пропонуючи повний контроль над вашими даними та розсилками без щомісячної плати за кількість підписників або надісланих листів (ви платите лише за SMTP-сервіс та VPS).
Що отримає читач у підсумку:
- Повністю функціонуючу систему для створення та надсилання email-кампаній.
- Можливість імпортувати та керувати списками підписників.
- Інструменти для сегментації аудиторії та персоналізації листів.
- Детальну аналітику щодо відкриттів, кліків та відписок.
- Надійне рішення, що працює в контейнерах Docker, з базою даних PostgreSQL та реверс-проксі Caddy, що забезпечує автоматичний HTTPS.
- Власний сервер для розсилок, який ви можете масштабувати та налаштовувати під свої унікальні потреби, не турбуючись про політики використання сторонніх сервісів.
Які альтернативи існують і чому self-hosted на VPS:
На ринку існує безліч рішень для email-маркетингу. Їх можна розділити на дві основні категорії:
-
Cloud-managed (SaaS) сервіси: Mailchimp, SendGrid, Brevo (Sendinblue), MailerLite, Constant Contact.
- Плюси: Простота використання, не потрібна технічна експертиза, готова інфраструктура.
- Мінуси: Висока вартість при зростанні бази підписників, залежність від політики сервісу (блокування облікових записів, обмеження щодо контенту), відсутність повного контролю над даними, неможливість глибокої кастомізації.
-
Self-hosted рішення: Listmonk, Mautic, Ghost (з інтеграцією розсилок), Postfix/Dovecot (для поштового сервера).
- Плюси: Повний контроль над даними та інфраструктурою, відсутність обмежень за кількістю підписників, гнучкість у налаштуванні та інтеграції, потенційно нижча вартість у довгостроковій перспективі, підвищена приватність.
- Мінуси: Потрібна технічна експертиза для встановлення та обслуговування, відповідальність за безпеку та працездатність лежить на вас.
Вибір self-hosted рішення на VPS, такого як Listmonk, ідеальний для розробників, стартапів, малих та середніх бізнесів, а також усіх, хто цінує незалежність, контроль та конфіденційність. Це дозволяє створити потужну систему розсилок, яка повністю відповідатиме вашим вимогам та зростатиме разом з вашим проєктом.
Який VPS-конфіг потрібен для цього завдання
Вибір відповідного VPS-конфігу критичний для стабільної та ефективної роботи Listmonk. Хоча Listmonk досить легковесний, PostgreSQL може бути вимогливим до ресурсів при великих обсягах даних та високому навантаженні. Caddy та Docker самі по собі споживають мінімальні ресурси, але їх потрібно враховувати.
Мінімальні вимоги:
- CPU: 2 vCPU. Один для Listmonk, один для PostgreSQL та решти системи.
- RAM: 4 GB. PostgreSQL полюбляє RAM для кешування, і сам Listmonk працюватиме комфортніше.
- Диск: 50 GB SSD. SSD значно прискорює роботу бази даних. Цього вистачить для операційної системи, Docker-образів, даних Listmonk та PostgreSQL (для десятків тисяч підписників та тисяч надісланих листів).
- Мережа: 100 Mbps. Для більшості завдань цього достатньо. Важливіша стабільність та відсутність лімітів на трафік.
Конкретний VPS-план для завдання:
Для комфортного старту та підтримки кількох сотень тисяч підписників з регулярними розсилками рекомендується розглянути наступний конфігураційний план:
- CPU: 2-4 vCPU (наприклад, Intel Xeon E5 або AMD EPYC).
- RAM: 4-8 GB DDR4.
- Диск: 80-160 GB NVMe SSD (переважніше NVMe за швидкість, але хороший SATA SSD також підійде).
- Мережа: 1 Gbps порт з необмеженим трафіком або великим лімітом (наприклад, 1-2 TB/місяць).
- Операційна система: Ubuntu Server 24.04 LTS (або новіша стабільна версія).
Можна взяти VPS із зазначеними характеристиками для старту або розглянути більш потужні варіанти в міру зростання ваших потреб.
Коли потрібен dedicated, а не VPS:
Dedicated-сервер варто розглядати, якщо у вас:
- Мільйони підписників: PostgreSQL вимагатиме значно більше ресурсів CPU та RAM, а також високошвидкісні диски.
- Дуже висока частота розсилок: Надсилання мільйонів листів на годину вимагає стабільної та потужної мережевої підсистеми, а також виділених ресурсів для SMTP-сервісу.
- Підвищені вимоги до ізоляції та безпеки: Dedicated-сервер забезпечує повну фізичну ізоляцію від інших користувачів.
- Необхідність у специфічному апаратному забезпеченні: Наприклад, для GPU-обчислень або особливих RAID-масивів, що рідко потрібно для Listmonk, але може бути актуальним для супутніх завдань.
Для більшості завдань Listmonk на рівні малого та середнього бізнесу, добре налаштований VPS буде більш ніж достатнім.
Локація: на що впливає
- Затримка (Latency): Вибирайте локацію, близьку до вашої основної аудиторії або до вас самих (для керування). Низька затримка покращує швидкість завантаження інтерфейсу Listmonk та швидкість доставки листів до SMTP-провайдера.
- Законодавство: Якщо ви працюєте з персональними даними користувачів з ЄС, переконайтеся, що сервер знаходиться в юрисдикції, яка відповідає GDPR. Аналогічно для інших регіонів.
- Доступність SMTP-провайдера: Деякі SMTP-провайдери можуть мати бажані регіони для кращої продуктивності.
Підготовка сервера
Перш ніж приступати до встановлення Listmonk, необхідно виконати базове налаштування безпеки та оновити операційну систему. Ми будемо використовувати Ubuntu Server 24.04 LTS як найпоширенішу та стабільну платформу для подібних завдань.
1. Підключення до сервера по SSH
Використовуйте SSH-клієнт для підключення до вашого VPS. Зазвичай провайдер надає IP-адресу та початкові облікові дані (логін root та пароль).
ssh root@ВАШ_IP_АДРЕС
2. Оновлення системи
Насамперед оновіть список пакетів та встановлені пакети до актуальних версій.
sudo apt update -y # Оновлення списку пакетів
sudo apt upgrade -y # Оновлення встановлених пакетів
sudo apt autoremove -y # Видалення непотрібних залежностей
3. Створення нового користувача з правами sudo
Використання root-користувача для повсякденних завдань небезпечне. Створіть нового користувача та надайте йому права sudo.
adduser listmonkadmin # Створення нового користувача "listmonkadmin"
usermod -aG sudo listmonkadmin # Додавання користувача до групи sudo
Тепер вийдіть із сесії root та увійдіть під новим користувачем:
exit # Вихід із сесії root
ssh listmonkadmin@ВАШ_IP_АДРЕС # Вхід під новим користувачем
4. Налаштування SSH-ключів (рекомендується)
Для підвищення безпеки рекомендується використовувати SSH-ключі замість паролів. Згенеруйте пару ключів на локальній машині (якщо ще немає):
ssh-keygen -t rsa -b 4096 # На вашій локальній машині
Скопіюйте публічний ключ на сервер:
ssh-copy-id listmonkadmin@ВАШ_IP_АДРЕС # На вашій локальній машині
Після цього можна вимкнути авторизацію за паролем у /etc/ssh/sshd_config, встановивши PasswordAuthentication no та перезапустивши службу SSH.
5. Налаштування файрволу (UFW)
Увімкніть UFW (Uncomplicated Firewall) та дозвольте лише необхідні порти: SSH (22), HTTP (80) та HTTPS (443).
sudo ufw allow OpenSSH # Дозволити SSH
sudo ufw allow http # Дозволити HTTP (для Caddy/Let's Encrypt)
sudo ufw allow https # Дозволити HTTPS
sudo ufw enable # Увімкнути файрвол (підтвердіть 'y')
sudo ufw status # Перевірити статус файрволу
6. Встановлення Fail2ban
Fail2ban захищає від брутфорс-атак, блокуючи IP-адреси, які намагаються підібрати паролі до SSH та інших служб.
sudo apt install fail2ban -y # Встановлення Fail2ban
sudo systemctl enable fail2ban # Увімкнення автозапуску
sudo systemctl start fail2ban # Запуск служби
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Створення локальної копії конфігу
Відредагуйте /etc/fail2ban/jail.local, щоб налаштувати параметри, наприклад, встановіть bantime = 1h (час блокування) та maxretry = 5 (кількість спроб). Переконайтеся, що секція [sshd] активна (enabled = true).
7. Встановлення базових утиліт
Встановіть необхідні утиліти, які знадобляться в процесі встановлення та для налагодження.
sudo apt install curl wget git nano htop -y
Тепер ваш сервер готовий до встановлення основного програмного забезпечення.
Встановлення ПЗ — покроково
Для розгортання Listmonk ми будемо використовувати Docker та Docker Compose. Це значно спрощує встановлення, керування залежностями та забезпечує переносимість рішення. Ми встановимо Docker Engine, Docker Compose, а потім налаштуємо сервіси Listmonk, PostgreSQL та Caddy.
1. Встановлення Docker Engine
Встановимо Docker з офіційного репозиторію, щоб отримувати актуальні версії (для 2026 року будемо орієнтуватися на Docker Engine 26.x та вище).
# Обновление списка пакетов
sudo apt update -y
# Установка необходимых пакетов для работы с репозиториями по HTTPS
sudo apt install ca-certificates curl gnupg lsb-release -y
# Добавление официального GPG ключа Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Добавление репозитория Docker в Apt sources
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Обновление списка пакетов с учетом нового репозитория
sudo apt update -y
# Установка Docker Engine, containerd и Docker Compose (cli)
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# Добавление текущего пользователя в группу docker для работы без sudo
sudo usermod -aG docker $USER
# Примечание: Для применения изменений группы нужно выйти и снова войти в SSH-сессию
echo "Для завершения установки Docker, пожалуйста, выйдите из SSH-сессии и войдите заново."
Вийдіть з SSH-сесії (exit) та увійдіть заново, щоб зміни групи Docker набули чинності. Після цього перевірте встановлення Docker:
docker run hello-world # Проверка успешной установки Docker
Якщо ви бачите повідомлення "Hello from Docker!", значить, Docker встановлено та він працює коректно.
2. Встановлення Docker Compose (плагін)
У сучасних версіях Docker, docker compose вже йде як плагін до Docker CLI, тому окреме встановлення не потрібне. Ми вже встановили docker-compose-plugin на попередньому кроці. Перевіримо його версію:
docker compose version # Проверка версии Docker Compose
Очікувана версія для 2026 року буде щось на зразок Docker Compose v2.25.x або вище.
3. Створення директорії для проєкту Listmonk
Створимо директорію, де зберігатимуться всі файли конфігурації та дані Listmonk.
mkdir ~/listmonk # Создание директории проекта в домашней папке пользователя
cd ~/listmonk # Переход в директорию проекта
4. Підготовка файлу docker-compose.yml
Тепер створимо основний файл docker-compose.yml, який описуватиме всі наші сервіси: Listmonk, PostgreSQL та Caddy.
nano docker-compose.yml # Открытие текстового редактора для создания файла
Вставте наступний вміст (актуальні версії образів на 2026 рік):
version: '3.8'
services:
db:
image: postgres:17-alpine # Актуальная версия PostgreSQL на 2026 год, alpine для легковесности
restart: always
environment:
POSTGRES_DB: listmonk # Имя базы данных
POSTGRES_USER: listmonk # Пользователь базы данных
POSTGRES_PASSWORD: ${DB_PASSWORD} # Пароль из .env файла
volumes:
- db_data:/var/lib/postgresql/data # Персистентное хранение данных БД
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk -d listmonk"]
interval: 5s
timeout: 5s
retries: 5
listmonk:
image: listmonk/listmonk:2.5.0 # Актуальная версия Listmonk на 2026 год
restart: always
environment:
LM_APP_NAME: "My Listmonk" # Имя вашего приложения
LM_DATABASE_URL: postgres://listmonk:${DB_PASSWORD}@db:5432/listmonk?sslmode=disable # URL подключения к БД
LM_ADMIN_USERNAME: admin # Имя пользователя администратора по умолчанию
LM_ADMIN_PASSWORD: ${ADMIN_PASSWORD} # Пароль администратора из .env
LM_SMTP_HOST: ${SMTP_HOST} # Хост SMTP-сервера (например, smtp.sendgrid.net)
LM_SMTP_PORT: ${SMTP_PORT} # Порт SMTP-сервера (например, 587)
LM_SMTP_USERNAME: ${SMTP_USERNAME} # Имя пользователя SMTP
LM_SMTP_PASSWORD: ${SMTP_PASSWORD} # Пароль SMTP
LM_SMTP_AUTH_PROTOCOL: login # Протокол авторизации (обычно login или plain)
LM_SMTP_FROM_EMAIL: "[email protected]" # Email отправителя по умолчанию
LM_SMTP_FROM_NAME: "Your Company" # Имя отправителя по умолчанию
LM_ENABLE_GRAVATAR: "true" # Включить Gravatar
LM_DEBUG: "false" # Отключить отладочный режим в продакшене
LM_TLS_ENABLE: "true" # Включение TLS для SMTP (по умолчанию)
LM_APP_URL: "https://listmonk.yourdomain.com" # Публичный URL вашего Listmonk
depends_on:
db:
condition: service_healthy # Запускать Listmonk только после готовности БД
volumes:
- listmonk_data:/var/lib/listmonk # Персистентное хранение данных Listmonk (аватары, вложения)
labels:
caddy: "listmonk.yourdomain.com" # Указываем Caddy домен для Listmonk
caddy.reverse_proxy: "{{upstreams}}" # Проксируем запросы на Listmonk
caddy:
image: caddy:2.7.6-alpine # Актуальная версия Caddy на 2026 год, alpine для легковесности
restart: always
ports:
- "80:80" # HTTP порт
- "443:443" # HTTPS порт
volumes:
- caddy_data:/data # Для хранения SSL-сертификатов и других данных Caddy
- caddy_config:/config # Для хранения конфигурации Caddy
- ./Caddyfile:/etc/caddy/Caddyfile # Наш кастомный Caddyfile
depends_on:
- listmonk # Caddy зависит от Listmonk (хотя может стартовать и раньше)
volumes:
db_data:
listmonk_data:
caddy_data:
caddy_config:
ВАЖЛИВО: Замініть listmonk.yourdomain.com на ваш реальний домен, який ви плануєте використовувати для Listmonk. Переконайтеся, що DNS-запис (A або CNAME) для цього домену вказує на IP-адресу вашого VPS.
5. Створення файлу .env для секретів
Для безпеки ми будемо зберігати паролі та інші чутливі дані в окремому файлі .env, який не потраплятиме в систему контролю версій (якщо ви її використовуєте).
nano .env # Открытие текстового редактора для создания файла
Вставте наступний вміст, замінивши YOUR_DB_PASSWORD, YOUR_ADMIN_PASSWORD, YOUR_SMTP_HOST тощо на свої значення:
DB_PASSWORD=YOUR_DB_PASSWORD_STRONG_AND_UNIQUE
ADMIN_PASSWORD=YOUR_ADMIN_PASSWORD_STRONG_AND_UNIQUE
SMTP_HOST=smtp.your-email-provider.com
SMTP_PORT=587
SMTP_USERNAME=your-smtp-username
SMTP_PASSWORD=YOUR_SMTP_PASSWORD_STRONG_AND_UNIQUE
Збережіть файл (Ctrl+O, Enter, Ctrl+X).
6. Створення файлу Caddyfile
Caddy автоматично керує SSL-сертифікатами, що значно спрощує налаштування HTTPS. Створимо простий Caddyfile для нашого домену.
nano Caddyfile # Открытие текстового редактора для создания файла
Вставте наступний вміст, замінивши listmonk.yourdomain.com на ваш реальний домен:
listmonk.yourdomain.com {
reverse_proxy listmonk:9000 # Проксируем запросы на Listmonk, который слушает порт 9000 внутри Docker
log {
output stdout
format json
}
}
Збережіть файл (Ctrl+O, Enter, Ctrl+X).
7. Запуск сервісів Docker Compose
Тепер, коли всі файли готові, можна запустити всі сервіси за допомогою Docker Compose.
docker compose up -d # Запуск всех сервисов в фоновом режиме
Ця команда завантажить необхідні Docker-образи (Listmonk, PostgreSQL, Caddy), створить контейнери, налаштує мережі та запустить їх. Прапор -d означає запуск у detached-режимі (у фоновому режимі).
8. Ініціалізація бази даних Listmonk
Після першого запуску контейнера Listmonk необхідно ініціалізувати його базу даних. Це потрібно зробити лише один раз.
docker compose run --rm listmonk ./listmonk --install # Запуск команды установки Listmonk в новом контейнере
Ця команда створить таблиці в базі даних PostgreSQL та налаштує початкові дані для Listmonk. Параметр --rm гарантує, що тимчасовий контейнер буде видалено після виконання команди.
Після успішної ініціалізації ви можете перевірити статус запущених контейнерів:
docker compose ps # Проверка статуса контейнеров
Усі контейнери (db, listmonk, caddy) повинні бути в стані running.
Тепер Listmonk має бути доступний через ваш домен (наприклад, https://listmonk.yourdomain.com) за HTTPS. Caddy автоматично отримає та налаштує SSL-сертифікат від Let's Encrypt.