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

Получить VPS arrow_forward
eco Начальный Туториал

Развёртывание Listmonk на VPS: Управление рассылками с Docker, PostgreSQL и Caddy

calendar_month Jun 26, 2026 schedule 22 мин. чтения visibility 27 просмотров
Развёртывание 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. Перед обновлением рекомендуется сделать бэкап.

Troubleshooting + FAQ

Даже при тщательной настройке могут возникнуть проблемы. Этот раздел поможет вам диагностировать и решить наиболее распространённые из них.

1. Listmonk UI недоступен или выдает ошибку 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.