bolt Valebyte VPS від $4/міс — NVMe, запуск за 60 секунд.

Отримати VPS arrow_forward
eco Початковий Туторіал

Розгортання Listmonk

calendar_month Jun 26, 2026 schedule 22 хв. читання visibility 25 переглядів
Развёртывание Listmonk на VPS: Управление рассылками с Docker, PostgreSQL и Caddy
info

Потрібен сервер для цього гайду? Ми пропонуємо виділені сервери та VPS у 50+ країнах з миттєвим налаштуванням.

Потрібен сервер для цього гайду?

Розгорніть VPS або виділений сервер за хвилини.

Розгортання 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-конфіг потрібен для цього завдання
Схема: Який 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.

Конфігурація

Схема: Конфігурація
Схема: Конфігурація

На етапі встановлення ми вже створили базові конфігураційні файли. Тепер давайте докладніше розглянемо їх і переконаємося, що все налаштовано коректно. Ключові файли, які ми будемо розглядати, це docker-compose.yml, .env та Caddyfile.

1. Огляд docker-compose.yml

Файл docker-compose.yml є центральним для нашого розгортання. Він визначає три сервіси:

  • db (PostgreSQL):
    • image: postgres:17-alpine: Використовується образ PostgreSQL версії 17 (на 2026 рік) на базі Alpine Linux для мінімізації розміру.
    • environment: Тут задаються змінні оточення для PostgreSQL, такі як ім'я бази даних (listmonk), ім'я користувача (listmonk) та пароль (DB_PASSWORD, який береться з файлу .env).
    • volumes: - db_data:/var/lib/postgresql/data: Це критично важливо. Ми монтуємо іменований том db_data в директорію, де PostgreSQL зберігає свої дані. Це гарантує, що дані бази даних збережуться навіть при видаленні або перестворенні контейнера db.
    • healthcheck: Визначає, як Docker перевірятиме працездатність бази даних, що дозволяє Listmonk не запускатися до повної готовності БД.
  • listmonk:
    • image: listmonk/listmonk:2.5.0: Використовується офіційний образ Listmonk версії 2.5.0 (актуальна на 2026 рік).
    • environment: Тут передаються всі необхідні налаштування для Listmonk:
      • LM_APP_NAME: Ім'я вашого застосунку Listmonk.
      • LM_DATABASE_URL: Рядок підключення до бази даних PostgreSQL. Зверніть увагу, що db — це ім'я сервісу PostgreSQL в Docker Compose, і воно використовується як хост. Пароль також береться з .env.
      • LM_ADMIN_USERNAME та LM_ADMIN_PASSWORD: Облікові дані для першого входу в адмін-панель Listmonk (також з .env).
      • LM_SMTP_HOST, LM_SMTP_PORT, LM_SMTP_USERNAME, LM_SMTP_PASSWORD: Налаштування для підключення до вашого SMTP-провайдера (наприклад, SendGrid, Mailgun, Brevo). Ці дані також беруться з .env.
      • LM_SMTP_FROM_EMAIL, LM_SMTP_FROM_NAME: Email та ім'я відправника за замовчуванням.
      • LM_APP_URL: Повний URL вашого Listmonk, який буде використовуватися в посиланнях у листах.
    • depends_on: Вказує, що Listmonk повинен запускатися тільки після того, як сервіс db стане здоровим (service_healthy).
    • volumes: - listmonk_data:/var/lib/listmonk: Зберігання даних Listmonk (наприклад, аватарів, вкладень) у персистентному томі.
  • caddy:
    • image: caddy:2.7.6-alpine: Використовується офіційний образ Caddy.
    • ports: - "80:80" - "443:443": Прокидання портів HTTP та HTTPS з хоста в контейнер Caddy.
    • volumes:
      • caddy_data:/data: Для зберігання SSL-сертифікатів Let's Encrypt та іншої динамічної інформації Caddy.
      • caddy_config:/config: Для зберігання постійної конфігурації Caddy.
      • ./Caddyfile:/etc/caddy/Caddyfile: Монтування нашого локального Caddyfile в контейнер.

2. Управління секретами через .env

Файл .env містить чутливу інформацію, таку як паролі до бази даних та SMTP-сервісу. Він автоматично завантажується Docker Compose при запуску. Ніколи не комітьте цей файл у публічні репозиторії!

Якщо вам потрібно змінити будь-який секрет, просто відредагуйте .env і перезапустіть сервіси:


docker compose down # Зупинка та видалення контейнерів
docker compose up -d # Запуск з новими змінними

3. Налаштування TLS/HTTPS через Caddy

Ми використовуємо Caddy як зворотний проксі, який автоматично отримує та оновлює SSL-сертифікати від Let's Encrypt. Це значно спрощує налаштування HTTPS.

У нашому Caddyfile:


listmonk.yourdomain.com {
    reverse_proxy listmonk:9000
    log {
        output stdout
        format json
    }
}
  • listmonk.yourdomain.com: Вказує домен, для якого Caddy буде обробляти запити та отримувати сертифікат. Переконайтеся, що цей запис відповідає вашому домену і що DNS-запис для цього домену вказує на IP-адресу вашого VPS.
  • reverse_proxy listmonk:9000: Перенаправляє всі вхідні запити на внутрішній сервіс listmonk (ім'я контейнера Listmonk в Docker Compose) по порту 9000.

При першому запуску Caddy автоматично спробує отримати SSL-сертифікат. Якщо у вас виникли проблеми, переконайтеся, що:

  • Доменне ім'я коректно налаштовано і вказує на IP вашого VPS.
  • Порти 80 та 443 відкриті у файрволі (ми це зробили на етапі підготовки сервера).
  • У контейнері Caddy немає інших помилок (перевірте логи: docker compose logs caddy).

4. Перевірка працездатності

Після запуску всіх сервісів необхідно переконатися, що все працює як треба.


# Перевірка статусу контейнерів
docker compose ps

# Перевірка логів Caddy (для налагодження SSL або проксіювання)
docker compose logs caddy

# Перевірка логів Listmonk (для налагодження підключення до БД або SMTP)
docker compose logs listmonk

# Перевірка доступності веб-інтерфейсу з сервера (замініть на ваш домен)
curl -IL https://listmonk.yourdomain.com

Ви повинні побачити HTTP-заголовки відповіді, включаючи HTTP/2 200 або HTTP/1.1 200 OK, що вказує на успішне підключення.

Відкрийте ваш домен у браузері (наприклад, https://listmonk.yourdomain.com). Ви повинні побачити сторінку входу Listmonk. Використовуйте логін admin та пароль, вказаний у змінній ADMIN_PASSWORD у вашому файлі .env, для входу.

Після входу в адмін-панель Listmonk, перейдіть до Settings > SMTP і переконайтеся, що ваші SMTP-налаштування коректно завантажилися. Ви можете надіслати тестовий лист, щоб перевірити працездатність SMTP-сервера.

Резервне копіювання та обслуговування

Схема: Резервне копіювання та обслуговування
Схема: Резервне копіювання та обслуговування

Резервні копії є критично важливою частиною будь-якого розгортання. Втрата даних може мати катастрофічні наслідки. У випадку з Listmonk на Docker, нам потрібно створювати резервні копії даних PostgreSQL, конфігурації Listmonk та файлів, що зберігаються Listmonk.

1. Що резервувати

  • База даних PostgreSQL: Містить усіх підписників, списки, кампанії, статистику та іншу важливу інформацію. Це найважливіший компонент.
  • Дані Listmonk: Включають аватари, вкладення до листів та інші файли, які Listmonk зберігає на диску (том listmonk_data).
  • Конфігураційні файли: docker-compose.yml, .env, Caddyfile. Вони необхідні для швидкого відновлення всієї інфраструктури.

2. Простий скрипт авторезервного копіювання

Створимо простий скрипт, який виконуватиме резервне копіювання бази даних та даних Listmonk, а потім архівуватиме їх. Для зберігання можна використовувати зовнішній S3-сумісний сервіс або інший VPS.

Створіть файл backup_listmonk.sh у директорії ~/listmonk:


nano backup_listmonk.sh

Вставте наступний вміст:


#!/bin/bash

# Каталог, где хранятся файлы docker-compose.yml и .env
PROJECT_DIR="/home/listmonkadmin/listmonk" # Убедитесь, что это правильный путь
BACKUP_DIR="/var/backups/listmonk"
DATE=$(date +%Y%m%d%H%M%S)

# Загрузка переменных окружения из .env
set -a
. "$PROJECT_DIR/.env"
set +a

# Создание директории для бэкапов, если она не существует
mkdir -p "$BACKUP_DIR"

echo "--- Начинаем бэкап Listmonk ($DATE) ---"

# 1. Бэкап базы данных PostgreSQL
echo "Бэкапим базу данных PostgreSQL..."
docker compose exec db pg_dump -U listmonk -d listmonk > "$BACKUP_DIR/listmonk_db_$DATE.sql"
if [ $? -eq 0 ]; then
    echo "Бэкап БД успешно создан: $BACKUP_DIR/listmonk_db_$DATE.sql"
else
    echo "Ошибка при создании бэкапа БД."
fi

# 2. Бэкап данных Listmonk (том listmonk_data)
echo "Бэкапим данные Listmonk..."
# Получаем имя тома Docker
LISTMONK_VOLUME_NAME=$(docker volume inspect listmonk_listmonk_data --format '{{ .Mountpoint }}')
if [ -d "$LISTMONK_VOLUME_NAME" ]; then
    tar -czf "$BACKUP_DIR/listmonk_files_$DATE.tar.gz" -C "$LISTMONK_VOLUME_NAME" .
    if [ $? -eq 0 ]; then
        echo "Бэкап файлов Listmonk успешно создан: $BACKUP_DIR/listmonk_files_$DATE.tar.gz"
    else
        echo "Ошибка при создании бэкапа файлов Listmonk."
    fi
else
    echo "Том listmonk_data не найден или путь некорректен."
fi

# 3. Копирование конфигурационных файлов
echo "Копируем конфигурационные файлы..."
cp "$PROJECT_DIR/docker-compose.yml" "$BACKUP_DIR/docker-compose_$DATE.yml"
cp "$PROJECT_DIR/.env" "$BACKUP_DIR/.env_$DATE"
cp "$PROJECT_DIR/Caddyfile" "$BACKUP_DIR/Caddyfile_$DATE"
echo "Конфигурационные файлы скопированы."

# 4. Удаление старых бэкапов (например, старше 7 дней)
echo "Удаляем старые бэкапы (старше 7 дней)..."
find "$BACKUP_DIR" -type f -name ".sql" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name ".tar.gz" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name ".yml" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name ".env" -mtime +7 -delete
echo "Старые бэкапы удалены."

echo "--- Бэкап Listmonk завершен ---"

Зробіть скрипт виконуваним:


chmod +x backup_listmonk.sh

Перевірте роботу скрипта вручну:


./backup_listmonk.sh
ls -lh /var/backups/listmonk/

3. Куди зберігати резервні копії

  • Зовнішнє S3-сумісне об'єктне сховище: Рекомендований варіант. Надійно, масштабовано та зазвичай недорого. Використовуйте утиліти на кшталт s3cmd, rclone або aws cli (для сумісних сховищ) для автоматичного завантаження файлів резервної копії.
  • Окремий VPS: Можна налаштувати rsync для копіювання резервних копій на інший VPS. Це забезпечує географічне розділення.
  • Локально (тільки для тестування): Зберігання резервних копій на тому ж сервері, що й дані, не є надійним рішенням, оскільки при втраті сервера втрачаються і резервні копії.

Для завантаження на S3-сумісне сховище можна додати до скрипта, наприклад, після архівації:


# Пример загрузки на S3 с помощью rclone (требуется предварительная настройка rclone)
# rclone copy "$BACKUP_DIR/listmonk_db_$DATE.sql" "my_s3_remote:listmonk-backups/"
# rclone copy "$BACKUP_DIR/listmonk_files_$DATE.tar.gz" "my_s3_remote:listmonk-backups/"

4. Автоматизація резервного копіювання за допомогою Cron

Додайте скрипт до Cron для автоматичного виконання, наприклад, щодня о 3:00 ночі.


crontab -e

Додайте наступний рядок у кінець файлу (переконайтеся, що шлях до скрипта правильний):


0 3   * /home/listmonkadmin/listmonk/backup_listmonk.sh >> /var/log/listmonk_backup.log 2>&1

Цей рядок запускатиме скрипт щодня о 3 годині ночі, а вивід перенаправлятиме до лог-файлу.

5. Оновлення: rolling vs maintenance window

Регулярні оновлення ПЗ важливі для безпеки та отримання нових функцій.

  • Оновлення ОС: Рекомендується виконувати раз на місяць (sudo apt update && sudo apt upgrade -y). Для великих оновлень дистрибутива (наприклад, з 24.04 до 26.04) плануйте maintenance window та робіть повні резервні копії.
  • Оновлення Docker-образів (Listmonk, PostgreSQL, Caddy):
    • Rolling updates: Якщо ви використовуєте тег latest (не рекомендується для продакшену) або специфічні, але не зафіксовані теги (наприклад, listmonk/listmonk:2.5 замість listmonk/listmonk:2.5.0), Docker завантажуватиме нові версії при docker compose pull.
    • Maintenance window: Для продакшену краще фіксувати версії образів (наприклад, listmonk/listmonk:2.5.0). Оновлення проводити вручну: змінити версію в docker-compose.yml, зробити docker compose pull, потім docker compose up -d. Перед оновленням рекомендується зробити резервну копію.

Вирішення проблем + FAQ

Навіть при ретельному налаштуванні можуть виникнути проблеми. Цей розділ допоможе вам діагностувати та вирішити найпоширеніші з них.

1. Інтерфейс Listmonk недоступний або видає помилку 502/503

Що перевірити:

  1. Статус контейнерів: Переконайтеся, що всі контейнери (db, listmonk, caddy) запущені та перебувають у стані running. Використовуйте команду docker compose ps.
  2. Логи Caddy: Перевірте логи Caddy на наявність помилок, пов'язаних з проксіюванням або SSL. docker compose logs caddy. Шукайте помилки типу "connection refused" до Listmonk або проблеми з отриманням сертифікатів Let's Encrypt.
  3. Логи Listmonk: Перевірте логи Listmonk. Можливо, він не може підключитися до бази даних або є інші внутрішні помилки. docker compose logs listmonk.
  4. Файрвол: Переконайтеся, що порти 80 і 443 відкриті на вашому VPS. sudo ufw status.
  5. DNS-запис: Перевірте, що ваш домен (наприклад, listmonk.yourdomain.com) коректно вказує на IP-адресу вашого VPS.

Як виправити: Виправте помилки, знайдені в логах. Якщо Caddy не може отримати SSL, переконайтеся, що DNS-запис вірний і порти 80/443 відкриті. Якщо Listmonk не може підключитися до БД, перевірте змінні оточення в .env та docker-compose.yml.

2. Помилка підключення до бази даних Listmonk

Що перевірити:

  1. Змінні оточення: Переконайтеся, що DB_PASSWORD у .env відповідає POSTGRES_PASSWORD у docker-compose.yml для сервісу db та використовується в LM_DATABASE_URL для сервісу listmonk.
  2. Здоров'я БД-контейнера: docker compose ps. Переконайтеся, що сервіс db перебуває у стані healthy.
  3. Логи БД: docker compose logs db. Шукайте помилки запуску PostgreSQL або проблеми з доступом.
  4. Ім'я хоста БД: У LM_DATABASE_URL хостом має бути ім'я сервісу Docker Compose, тобто db.

Як виправити: Виправте невірні паролі або імена користувачів. Якщо БД не запускається, перевірте логи. Можливо, том даних пошкоджений, і знадобиться його очищення (з втратою даних, якщо немає резервної копії) та повторна ініціалізація.

3. Проблеми з відправкою електронної пошти

Що перевірити:

  1. Налаштування SMTP: У Listmonk (Settings > SMTP) та у файлі .env перевірте SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD. Переконайтеся, що вони відповідають даним вашого SMTP-провайдера.
  2. Логи Listmonk: docker compose logs listmonk. Listmonk зазвичай виводить докладні помилки при невдалій спробі відправки листа.
  3. Файрвол VPS: Переконайтеся, що ваш VPS може встановлювати вихідні з'єднання на порт SMTP (зазвичай 587 або 465).
  4. Ліміти SMTP-провайдера: Перевірте, чи не перевищили ви ліміти відправки листів у вашого SMTP-провайдера.

Як виправити: Скоригуйте SMTP-налаштування. Переконайтеся, що ваш SMTP-провайдер не блокує з'єднання з вашої IP-адреси. Перевірте статус облікового запису у SMTP-провайдера.

4. Caddy не отримує SSL-сертифікат

Що перевірити:

  1. DNS-запис: Доменне ім'я має бути налаштоване та вказувати на публічний IP вашого VPS. Перевірте це за допомогою dig listmonk.yourdomain.com.
  2. Порти 80 і 443: Мають бути відкриті в UFW. sudo ufw status. Let's Encrypt використовує порт 80 для валідації домену.
  3. Caddyfile: Переконайтеся, що домен у Caddyfile вказаний правильно та відповідає вашому домену.
  4. Логи Caddy: docker compose logs caddy. Caddy зазвичай дуже докладно повідомляє про проблеми з отриманням SSL.

Як виправити: Виправте DNS-запис. Відкрийте порти у файрволі. Перезапустіть Caddy: docker compose restart caddy.

5. Який VPS-конфіг мінімально підійде?

Для невеликих проєктів з базою до 50 000 підписників та нечастими розсилками мінімально підійде VPS з 2 vCPU, 4 ГБ RAM та 50-80 ГБ NVMe/SSD диска. Це забезпечить достатню продуктивність для Listmonk, PostgreSQL та Caddy. Якщо ви плануєте активно розвивати email-маркетинг, варто одразу орієнтуватися на 4 vCPU та 8 ГБ RAM.

6. Що обрати — VPS чи dedicated для цього завдання?

Для більшості користувачів, включаючи розробників, соло-фаундерів та невеликі команди, VPS буде оптимальним вибором. Він пропонує достатню потужність, гнучкість та економічність. Dedicated-сервер виправданий лише при дуже великих масштабах (сотні тисяч або мільйони підписників, висока частота розсилок) або при специфічних вимогах до фізичної ізоляції та продуктивності, які не може забезпечити віртуалізація.

7. Як оновити Listmonk до нової версії?

Що перевірити:

  1. Перед оновленням обов'язково зробіть повну резервну копію бази даних та даних Listmonk, як описано в розділі "Резервне копіювання та обслуговування".
  2. Перевірте офіційну документацію Listmonk на наявність міграцій бази даних або важливих змін між версіями.

Як виправити: Відредагуйте файл docker-compose.yml та змініть тег образу Listmonk на нову версію (наприклад, з listmonk/listmonk:2.5.0 на listmonk/listmonk:2.6.0). Потім виконайте:


docker compose pull listmonk # Скачать новый образ Listmonk
docker compose up -d # Перезапустить контейнер Listmonk с новым образом

Якщо в новій версії потрібні міграції бази даних, Listmonk зазвичай виконує їх автоматично при запуску. Якщо ні, можуть знадобитися додаткові команди, зазначені в офіційній документації Listmonk.

Висновки та наступні кроки

Схема: Висновки та наступні кроки
Схема: Висновки та наступні кроки

Вітаємо! Ви успішно розгорнули Listmonk на своєму VPS-сервері, використовуючи Docker, PostgreSQL та Caddy. Тепер у вас є потужний, повністю контрольований інструмент для керування email-розсилками, який забезпечує гнучкість, конфіденційність і не має обмежень, притаманних багатьом SaaS-рішенням.

Це надійне та масштабоване рішення, готове до роботи. Ви отримали повний контроль над вашою інфраструктурою та даними, що є ключовою перевагою self-hosted підходу.

Наступні кроки:

  • Інтеграція з SMTP-провайдером: Переконайтеся, що ваш SMTP-провайдер (SendGrid, Mailgun, Brevo тощо) налаштований і працює коректно. Можливо, знадобиться налаштувати SPF, DKIM та DMARC записи для вашого домену для покращення доставлення листів.
  • Створення шаблонів листів: Розробіть привабливі та адаптивні шаблони для ваших розсилок. Listmonk підтримує HTML-редактор та імпорт шаблонів.
  • Імпорт підписників та сегментація: Імпортуйте існуючих підписників та налаштуйте сегменти для більш цільових розсилок.
  • Налаштування моніторингу: Розгляньте встановлення систем моніторингу (наприклад, Prometheus + Grafana) для відстеження стану вашого VPS, Docker-контейнерів та продуктивності Listmonk.
  • Масштабування: У міру зростання вашої бази підписників та обсягу розсилок, розгляньте можливість збільшення ресурсів VPS або переходу на dedicated-сервер. PostgreSQL може бути оптимізований для великих навантажень.

Поділитися цим записом:

розгортання listmonk на VPS: керування розсилками з docker, postgresql і caddy
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.