Пошаговая инструкция · Самостоятельная установка
Как установить Mautic на сервер и запустить первую кампанию
Пошаговая инструкция для самостоятельной установки. Развернём Mautic с веб-интерфейсом, расписанием кампаний и отдельным обработчиком почтовой очереди. Проверим путь от тестового контакта до письма, сохраним базу и файлы для восстановления.
Что подготовить и как читать инструкцию #
Mautic обслуживает формы, контакты и кампании; письма отправляет ваш SMTP-сервис. Подготовьте проверенный домен отправителя, почтовые реквизиты и допустимую скорость отправки. Начните с одного контролируемого адреса: импорт рабочей базы и массовая отправка не нужны для проверки установки.
Хост — Ubuntu 26.04 LTS с Docker Engine, Compose v2 и Nginx из общей инструкции. PHP и Apache поставляются внутри официального образа Mautic, поэтому не устанавливаем случайную версию PHP из Ubuntu. Для первой небольшой установки выбирайте 4 vCPU, 8 ГБ памяти и SSD с запасом для базы, медиа и копий; реальный объём зависит от контактов и событий кампаний.
Команды выполняйте в терминале сервера после подключения по SSH, если шаг не указывает другое место. sudo даёт команде права администратора. Действия в браузере выполняйте на своём компьютере. Домены, IP-адреса и значения ВАШ_ПАРОЛЬ из примеров заменяйте своими до выполнения команды.
Двигайтесь по одному шагу и проверяйте результат перед следующим. Блок с <<EOF или другим именем завершения копируйте целиком: он записывает содержимое одного файла. При работе в nano сохраняйте файл клавишами Ctrl+O, Enter и выходите Ctrl+X. Если прервали SSH-сеанс, снова перейдите в указанный каталог; переменные предыдущего сеанса потребуется задать заново.
Настройка внешнего доступа использует обратный прокси Nginx и Certbot для Nginx. Приложение остаётся доступным на локальном порту; снаружи открыт его HTTPS-домен.
Шаг 1. Создайте каталоги Mautic #
Конфигурация, журналы и загруженные материалы будут храниться отдельно от контейнеров в ~/apps/mautic. Перейдите в каталог установки.
mkdir -p ~/apps/mautic/mautic/{config,logs,media/files,media/images}
cd ~/apps/mauticТекущий каталог — ~/apps/mautic.
Шаг 2. Создайте пароль базы #
Создадим закрытый .env. Случайные пароли предназначены базе, а не будущему администратору Mautic. Повторный запуск генератора поверх рабочей базы изменит реквизиты только в файле, поэтому не повторяйте его.
umask 077
cat > .env <<EOF
MYSQL_PASSWORD=$(openssl rand -hex 32)
MYSQL_ROOT_PASSWORD=$(openssl rand -hex 32)
EOF
chmod 600 .envПароли заполнены, права .env — 600.
Шаг 3. Сохраните описание сервисов #
Откройте nano compose.yaml и вставьте YAML ниже. web показывает интерфейс, cron обновляет сегменты и кампании, worker выполняет задания из очереди. Они используют общую конфигурацию и выбранный образ 7.2.1.
x-mautic: &mautic
image: mautic/mautic:7.2.1-apache
restart: unless-stopped
environment: &mautic-env
MAUTIC_DB_HOST: db
MAUTIC_DB_PORT: 3306
MAUTIC_DB_DATABASE: mautic
MAUTIC_DB_USER: mautic
MAUTIC_DB_PASSWORD: ${MYSQL_PASSWORD:?set password}
MAUTIC_MESSENGER_DSN_EMAIL: doctrine://default
MAUTIC_MESSENGER_DSN_HIT: doctrine://default
DOCKER_MAUTIC_LOAD_TEST_DATA: "false"
PHP_INI_VALUE_MEMORY_LIMIT: 512M
volumes:
- ./mautic/config:/var/www/html/config
- ./mautic/logs:/var/www/html/var/logs
- ./mautic/media/files:/var/www/html/docroot/media/files
- ./mautic/media/images:/var/www/html/docroot/media/images
depends_on:
db:
condition: service_healthy
services:
db:
image: mysql:8.4
restart: unless-stopped
environment:
MYSQL_DATABASE: mautic
MYSQL_USER: mautic
MYSQL_PASSWORD: ${MYSQL_PASSWORD:?set password}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?set root password}
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: [CMD-SHELL, 'mysqladmin -u"$$MYSQL_USER" -p"$$MYSQL_PASSWORD" ping --silent']
interval: 10s
timeout: 5s
retries: 20
start_period: 30s
web:
<<: *mautic
ports:
- "127.0.0.1:8089:80"
environment:
<<: *mautic-env
DOCKER_MAUTIC_ROLE: mautic_web
cron:
<<: *mautic
environment:
<<: *mautic-env
DOCKER_MAUTIC_ROLE: mautic_cron
worker:
<<: *mautic
environment:
<<: *mautic-env
DOCKER_MAUTIC_ROLE: mautic_worker
DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL: 1
DOCKER_MAUTIC_WORKERS_CONSUME_HIT: 1
DOCKER_MAUTIC_WORKERS_CONSUME_FAILED: 1
volumes:
mysql-data:YAML сохранён; HTTP web доступен только на локальном 8089.
Шаг 4. Проверьте конфигурацию #
Проверим YAML и наличие паролей до скачивания и запуска.
docker compose config --quietconfig --quiet завершился без ошибок.
Шаг 5. Скачайте образы #
Загрузим выбранные версии. Контейнеры с почтовыми заданиями пока не запускаем, чтобы случайно не начать рассылку.
docker compose pullpull завершился успешно.
Шаг 6. Запустите базу и веб-интерфейс #
Сначала нужны только db и web. В браузере завершим установку, и лишь затем включим фоновые процессы.
docker compose up -d db webБаза и web созданы; cron/worker пока не запущены.
Шаг 7. Проверьте локальный сайт #
ps покажет состояние, curl — ответ HTTP на самом сервере. При ошибке сначала исправьте запуск приложения, затем HTTPS.
docker compose ps
curl -I http://127.0.0.1:8089Web отвечает, db не находится в цикле перезапусков.
Шаг 8. Сохраните сайт Nginx #
Установите Nginx и Certbot по подготовке Ubuntu, если ещё не установили. Откройте sudo nano /etc/nginx/sites-available/mautic и вставьте файл ниже. Замените все домены своими. Nginx передаёт приложению домен, адрес клиента и протокол; Upgrade и Connection сохраняют WebSocket. До получения сертификата условие $scheme блокирует обычные HTTP-запросы кодом 403, чтобы вход не происходил без шифрования.
/etc/nginx/sites-available/mauticmap $http_upgrade $mautic_connection_upgrade {
default upgrade;
"" close;
}
server {
listen 80;
server_name marketing.example.com;
client_max_body_size 100m;
location / {
if ($scheme = http) { return 403; }
proxy_pass http://127.0.0.1:8089;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $mautic_connection_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}
Сохраните Ctrl+O, Enter, Ctrl+X. В файле пока нет путей к сертификатам: Nginx сможет проверить его до выпуска HTTPS.
Шаг 9. Подключите сайт и проверьте HTTP #
Ссылка подключает сохранённый сайт. nginx -t проверяет все настройки сервера; && разрешает перечитать их только при успешной проверке. curl проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.
sudo ln -sfn /etc/nginx/sites-available/mautic /etc/nginx/sites-enabled/mautic
sudo nginx -t && sudo systemctl reload nginx
curl -I http://marketing.example.com/Ожидается successful от nginx -t и HTTP 403 для обычного запроса: до HTTPS это намеренная блокировка. DNS должен указывать на сервер, TCP 80/443 — быть доступен у провайдера. Ничего не вводите в форму входа по HTTP.
Шаг 10. Получите сертификат и включите HTTPS #
Каждое имя из команды должно указывать на этот сервер. Certbot проверит домены, сам добавит сертификат в сайт Nginx и включит перенаправление HTTP → HTTPS. Укажите свою почту при запросе и подтвердите условия Let’s Encrypt. Это отдельное действие после успешной проверки HTTP.
sudo /snap/bin/certbot --nginx -d marketing.example.com --redirectCertbot сообщил об успешной установке. Откройте HTTPS-адрес со своего компьютера: браузер не должен предупреждать о сертификате. Для закрытой панели используйте разрешённый IP. При ошибке исправьте DNS, в том числе AAAA, либо доступ к TCP 80; не повторяйте запросы выпуска подряд.
Шаг 11. Проверьте продление сертификата #
Certbot из snap создаёт службу автоматического продления. Dry-run выполняет пробное продление: настоящие сертификаты не заменяются. Затем проверьте, что таймер планирует следующий запуск. Сохраняйте доступ к TCP 80 для следующих проверок домена.
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all 'snap.certbot.renew*'Пробное продление успешно, у таймера есть следующий запуск. Если тест не прошёл, проверьте /var/log/letsencrypt/letsencrypt.log; сначала исправьте причину. После этого можно создавать учётную запись и приглашать пользователей.
Шаг 12. Завершите установку в браузере #
Откройте свой HTTPS-домен. В мастере используйте имя сервиса db как адрес базы и реквизиты из .env/Compose. Создайте администратора с новым паролем. Не используйте пароль базы как пароль администратора.
Открылась административная панель, повторный вход работает.
Шаг 13. Настройте отправку писем #
В конфигурации Mautic заполните SMTP или поддерживаемый транспорт по данным своего почтового сервиса. Укажите реальный адрес отправителя с подтверждённым доменом. Отправьте тестовое письмо на свой ящик.
Письмо получено, адрес отправителя верный; до этого массовые кампании не запускайте.
Шаг 14. Запустите фоновые процессы #
Cron обновляет условия сегментов и кампаний по расписанию, worker исполняет очередь. Веб-интерфейс сам по себе эту работу не заменяет.
docker compose up -d cron workerСервисы cron и worker запущены.
Шаг 15. Обновите сегменты #
Сегмент — список контактов по условиям. Команда обновления выполняется от www-data, владельца приложения внутри контейнера.
docker compose exec --user www-data --workdir /var/www/html web php bin/console mautic:segments:update --no-interactionКоманда завершилась без ошибки конфигурации и базы.
Шаг 16. Обновите и проверьте обработку кампании #
Первая команда подготавливает кампании, вторая исполняет подходящие события. Используйте только тестовую кампанию с собственным адресом, затем посмотрите журнал процессов.
docker compose exec --user www-data --workdir /var/www/html web php bin/console mautic:campaigns:update --no-interaction
docker compose exec --user www-data --workdir /var/www/html web php bin/console mautic:campaigns:trigger --no-interaction
docker compose logs --tail=80 cron workerНет ошибок cron/worker; событие тестовой кампании обработано.
Шаг 17. Проверьте полный путь тестового письма #
Создайте один тестовый контакт с вашим email, добавьте его в тестовый сегмент и кампанию с одним письмом. Опубликуйте только этот тест. Откройте журнал контакта и письмо в почтовом клиенте.
Есть событие отправки и фактическое письмо; отписка прекращает дальнейшие отправки этому контакту.
Шаг 18. Подготовьте согласованную копию #
Создадим закрытый каталог с временем копии и остановим web/cron/worker. Пользователи и задания временно не меняют данные; база остаётся работать.
umask 077
backup_dir="$HOME/backups/mautic/$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$backup_dir"
docker compose stop web cron workerПриложение остановлено, каталог backup_dir создан. Эти команды и следующие выполняйте в одном SSH-сеансе.
Шаг 19. Скопируйте базу #
Выгрузка использует пароль внутри контейнера. В базе хранятся контакты, кампании и события.
docker compose exec -T db sh -c 'exec mysqldump --single-transaction -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > "$backup_dir/database.sql"database.sql создан без ошибок и не пуст.
Шаг 20. Скопируйте настройки и материалы #
Архив включает постоянные каталоги и файлы установки. Он содержит секреты; перенесите обе части копии в закрытое хранилище на другой машине.
sudo tar -czf "$backup_dir/files.tar.gz" mautic .env compose.yamlfiles.tar.gz создан; копия базы и файлов хранится вместе.
Шаг 21. Запустите сервисы и проверьте восстановление #
Верните web/cron/worker. Восстановление проверяйте на отдельном сервере с отключённой реальной отправкой: тест не должен запустить письма рабочим контактам.
docker compose start web cron workerПриложение доступно; восстановленная копия показывает тестовый контакт и кампанию.
Если результат шага отличается #
Вернитесь к проверке того шага, на котором появилась ошибка. Первая ошибка в выводе обычно полезнее последних строк: последующие команды могли не получить нужный файл или работающую службу. Не повторяйте установку целиком поверх частично настроенного приложения.
Если страница не открывается, сначала проверьте домен и входящие порты, затем состояние приложения и его журнал. Если сайт открывается, но отдельное действие не работает, проверьте связанные компоненты — обработчик фоновых задач, почту или права пользователя. Официальные источники в конце статьи относятся к выбранному способу установки.
Настройки внешнего доступа храните вместе с копией приложения: /etc/nginx/sites-available/mautic и /etc/letsencrypt содержат сайт и сертификаты с закрытыми ключами. Архивируйте их с sudo в закрытое хранилище. После восстановления подключите сайт через sites-enabled, выполните sudo nginx -t, затем перечитайте Nginx. Для ошибки 502 сначала проверьте локальное приложение и /var/log/nginx/error.log; для сертификата — /var/log/letsencrypt/letsencrypt.log и таймер продления.