Установка MailWizz на VPS


Вчера в настройки полностью установленного и протестированного MailWizz я внес фатальные изменения (очистить Urls) после чего, он превратился в кирпич. Видимо, надо потренироваться в его установке еще раз, а за одно напишу инструкцию, как это делать.

Технические требования MailWizz

Итак, первое с чего надо начать — выбрать VPS. Большинство инструкций, которые мне попадались были об установке на Ubuntu (не беря DigitalOcean, оплату которого сейчас из России надо делать окольными путями). Хотя и MailWizz, и Ubuntu говорят о своих скромных минимальных требованиях, но когда туда добавляется MySQL и планов громадье по рассылке, то они растут. Поэтому остановился на следующих характеристиках:

  • 2 ядра
  • 4 Гб памяти
  • 30-40 Гб SSD/NVMe-диск

Помним, что чем больше диск, тем больше счёт на бэкап от хостера. Некоторые позволяют держать только один снимок, а у некоторых жестко — 4, 7 и т.д. Поэтому считайте, что вам подходит по деньгам.

По поводу памяти разработчики продукта говорят, что если вы планируете рассылать миллионы писем не надейтесь, что с 4Гб памяти сервер будет крутиться не напраягаясь.

Требования к софту сервера (официальные):

  • ОС семейства Linux
  • Веб-сервер Apache/Nginx
  • PHP >= 7.2 (плюс библиотеки gd, imap, zip, mbstring и curl)
  • БД MySQL/MariaDB с движком InnoDB
  • Доступ к настройке планировщика Cron (используйте терминальный cron а не веб-версию)

В рекомендациях по повышению производительности разработчики пишут, что вместо Apache, конечно, лучше использовать Nginx, или их комбинацию, где за статику отвечает Nginx, а за динамику Apache (у них написано наоборот, думается это опечатка).

С настройкой MySql/MariaDB они тоже советуют поколдовать.

Я решил взять VPS с Ubuntu 20.04.6 LTS и использовать Apache 2.4, PHP 8.1, MariaDB 10.3.38.

Важно! Перед началом процесса обзаведитесь доменом для своей системы и пропишите в DNS запись:

example.com A 111.222.333.444

, где 111.222.333.444 — ip-адрес вашего сервера.

Установка

Заходим на сервер по ssh. Реквизиты для этого вы найдете в панеле управленя вашего хостера. Если заходите под пользователем root, то sudo перед каждой командой ниже надо пропустить.

Установка имени хоста

Так как на этой машине ничего кроме MailWizz не будет, я ставлю его в основным хостом. Т.е. имя хоста будет example.com. Для этого набираю команду:

hostnamectl set-hostname example.com

Убедиться, что все Ок можно командой hostnamectl без параметров.

Установка Apache

В терминале вводим:

sudo apt update

Затем

sudo apt install apache2

После окончания перезапускаем и ставим на автостарт

sudo systemctl restart apache2.service
sudo systemctl enable apache2.service

Убеждаемся, что он работает, в браузере печатаем http://example.com или http://111.222.333.444

Если все в порядке то видим дефолтную страницу сервера Apache со словами It works!

Да, чуть не забыл. Подключим модуль rewrite, из-за настроек с которым у меня всё в прошлый раз умерло 🙂

sudo a2enmod rewrite
sudo systemctl restart apache2

Настройка Apache

Сразу сделаем настройку Apache.

Надо создать вируальный хост для нашего сервера. Для этого в папке /etc/apache2/sites-available/ создаем файл example.com.conf:

<VirtualHost *:80>
    Define root_domain example.com
    Define root_path /var/www/${root_domain}

    ServerAdmin admin@${root_domain}
    ServerName ${root_domain}
    DocumentRoot ${root_path}/docs

    ErrorLog ${root_path}/logs/error.log
    CustomLog ${root_path}/logs/access.log combined
</VirtualHost>

А в папке /var/www/example.com/docs/  кладем файл-заглушку index.html:

<html>
    <head>
        <title>Welcome to example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com virtual host is working!</h1>
    </body>
</html>

Я из под root это делаю, поэтому мне надо еще и права поправить на папку и файл (www-data:www-data — соответственно пользователь:группа от чьего имени работает Apache):

sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 775 /var/www/example.com

После этого деактивируем сайт по умолчанию (который ведет в папку /var/www/html/) и активирум наш

sudo a2dissite 000-default.conf 
sudo a2ensite example.com.conf

Если посмотреть, в папке /etc/apache2/sites-enabled/ останется лишь файл example.com.conf, который является символьной ссылкой на созданный нами файл /etc/apache2/sites-available/example.com.conf.

Не забываем делать проверку на корректность сделанных конфигов:

sudo apache2ctl configtest

Если все в порядке скажет: Syntax OK. После этого перезагрузим сервер.

sudo systemctl restart apache2

Зайдите на свой сайт http://example.com через браузер, и должны увидеть

Success!  The example.com virtual host is working!

Настройка HTTPS

Нехорошо, если мы на свой сервер управления будем заходить через небезопасный http. Будем использовать бесплатный ssl-серитфикат от Let’s Encrypt.

Устанавливаем certbot

sudo apt install certbot

Получаем сертификат в первый раз:

sudo certbot certonly --webroot --agree-tos --email admin@example.com --webroot-path /var/www/example.com/docs/ -d example.com

, где

  • certonly — запрос нового сертификата
  • —webroot — проверка владения доменом через файл в корне сайте
  • —agree-tos — соглашаемся с условиями лицензии
  • —email — адрес администратора
  • —webroot-path  — путь к корню сайта
  • -d — домен, для которого запрашиваем сертификат

Если всё успешно, получаем сообщение:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem

Соответственно, в папке /etc/letsencrypt/live/example.com/ будут лежать:

  • публичный ключ cert.pem
  • приватный ключ privkey.pem

Корректируем настройки Apache. Файл /etc/apache2/sites-available/example.com.conf будет теперь таким:

<VirtualHost *:80>
    Define root_domain example.com

    ServerName ${root_domain}
    RedirectMatch permanent /(.*) https://${root_domain}/$1
</VirtualHost>

<VirtualHost _default_:443>
    Define root_domain example.com
    Define root_path /var/www/${root_domain}

    ServerAdmin admin@${root_domain}
    ServerName ${root_domain}
    DocumentRoot ${root_path}/docs

    SSLEngine on
    SSLCertificateChainFile /etc/letsencrypt/live/${root_domain}/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/${root_domain}/privkey.pem
    SSLCertificateFile /etc/letsencrypt/live/${root_domain}/cert.pem

    ErrorLog ${root_path}/logs/error.log
    CustomLog ${root_path}/logs/access.log combined
</VirtualHost>

Я сделал редирект с http на https с учётом ошибок, с которыми столкнулся настраивая MailWizz в прошлый раз.

Настраиваем его автообновление сертификата. Сначала посмотрим, где лежит наш certbot:

which certbot

Проверим, установлен ли crontab, запустив его с фейковым параметром

sudo crontab --help

Если ругнется, что нет такой команды, то установим его:

sudo apt install cron
sudo systemctl start cron
sudo systemctl enable cron

Иначе запустим его:

sudo crontab -e

и выбрав редактор, вставим в конце следующие строчки (помните? где лежит crontab? — путь должен быть правильный)

# check and update Let's Encrypt certificate
0 0 * * 1,4 /usr/bin/certbot renew --noninteractive

Здесь проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00.

На сертификат завязан Apache, поэтому при его смене хорошо бы его перегрузить. Чтобы сделать это автоматически в файле /etc/letsencrypt/cli.ini добавляем строчку:

deploy-hook = systemctl reload apache2

Важно! Надо не забыть активировать модуль SSL для Apache. Но сначала проверим, может он уже есть:
sudo apachectl -M | grep ssl

Если не нашёл что-то вроде ssl_module (shared), то ставим:

sudo a2enmod ssl

Незабываем перегрузить веб-сервер:

sudo systemctl restart apache2

Устанавливаем базу MariaDB

Здесь у нас будет хранится вся информация нашей системы. Набираем в терминале команду:

sudo apt-get install mariadb-server mariadb-client

После установки перезапустим сервис и ставим на автозагрузку при загрузке Ubuntu:

sudo systemctl restart mariadb
sudo systemctl enable mariadb

Теперь защитим базу от непрошенных гостей. Выполняем команду

sudo mysql_secure_installation

И на все вопросы отвечаем Y, кроме первого, где просто жмем Enter, и там, где нас просят ввести новый пароль root-пользователя базы данных (не хоста/виртуальной машины) и подтвердить его.

Важно! Записывайте все пароли, явки, имена в текстовый файл или менеджер паролей.

Enter current password for root (enter for none): <просто жмём Enter>
Set a root password? [Y/n]: Y
New password: Enter your new password (create a secure one) <вводим новый пароль>
Re-enter new password: Repeat your new password <повторяем новый пароль>
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y
Restart MariaDB Mysql service

Проверяем, что база работает, выполнив команду, а когда она попросит пароль — вводя новый пароль самого главного по БД (см. шаг выше).

sudo mysql -u root -p

Если всё хорошо, то увидим надпись:

MariaDB Installed Successfully

Чтобы выйти из БД наберите

exit

Опционально, но я сделал небольшой тюнинг MariaDB, опираясь на рекомендации MailWizz, статью Александра Фролова и результаты программы mysqltuner.

Программка устанавливается с помощью команды:

sudo wget http://mysqltuner.pl/ -O mysqltuner.pl

А результаты обследования получаем так:

perl mysqltuner.pl

Вбив значение innodb_buffer_pool_size = 2867M в MySQL-калькулятор, я посчитал, что это будет слишком много в итоге память отъедать, поэтому остановился на следующих параметрах в файле /etc/mysql/mariadb.conf.d/50-server.cnf в секции [mysqld]:

skip-name-resolve = ON
performance_schema = ON
max_connections = 500
innodb_buffer_pool_size = 1000M
innodb_log_file_size = 128M
innodb_buffer_pool_instances = 2
innodb_flush_log_at_trx_commit = 2

Важно. Перед редактированием копируем этот файл в свою домашнюю директорию на случай форс-мажора.

cp /etc/mysql/mariadb.conf.d/50-server.cnf  ~/50-server.cnf.backup

Не забываем после сохранения перезапустить сервер.

sudo systemctl restart mariadb

Посмотреть все настройки работающие настройки можно с помощью команды, но в действительности, думаю, это лишнее:

sudo mysqld --verbose --help

Установка PHP и его модулей

В инструкциях все пишут про версии php 7.4, но себе я решил поставить по-новее — 8.1. Запускаем последовательно следующие команды:

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.1 libapache2-mod-php8.1 php8.1-common php8.1-gmp php8.1-curl php8.1-intl php8.1-mbstring php8.1-xmlrpc php8.1-mysql php8.1-bcmath php8.1-gd php8.1-xml php8.1-cli php8.1-zip php8.1-imap

Если хотите другую версию, поменяйте номера. После этого обязательно перегружаем Apache, с которым php работает в одной связке.

sudo systemctl restart apache2

Далее надо сделать небольшие изменения в файле /etc/php/8.1/apache2/

file_uploads = On
allow_url_fopen = On
short_open_tag = On
memory_limit = 512M
upload_max_filesize = 100M
max_execution_time = 360
date.timezone = Europe/Moscow

Если надо правьте timezone на свою и память memory_limit под свои возможности. После этого перегружаем Apache.

sudo systemctl restart apache2

Настройка MariaDB для MailWizz

И так, мы уже установили MariaDB, теперь необходимо создать базу для MailWizz и пользователя, которому позволено с ней работать.

Заходим в консоль управления MariaDB:

sudo mysql -u root -p

Пароль используем тот, который выше вводили и запомнили 🙂

Вводим команду создания базы «mailwizz» и не забываем точку с запятой в конце

CREATE DATABASE mailwizz;

Создаем пользователя для этой базы «mailwizz_usr»

CREATE USER 'mailwizz_usr'@'localhost' IDENTIFIED BY 'SuperPassword';

Здесь SuperPassword — уникальный пароль, который вы придумаете для этого пользователя.

Теперь ему надо дать права на эту базу данных:

GRANT ALL ON *.* TO 'mailwizz_usr'@'localhost';

Теперь эти права надо активировать:

FLUSH PRIVILEGES;

После этого выходим из БД:

exit;

Установка MailWizz

Первым делом устанавливаем unzip, потому что MailWizz идет в виде zip-архива.

sudo apt-get install unzip

Затем копируем архив с программой в папку /var/www/example.com/docs/

Так как  я работаю из под root, думаю неплохо этому файлу назначить владельцем Apache:

sudo chown www-data:www-data mailwizz.zip

Теперь распаковываем его:

unzip mailwizz.zip

Не помогло! все распакованные файлы и паки опять стали рутовыми. Повторяем операцию:

sudo chown -R www-data:www-data latest/
sudo chown -R www-data:www-data update/

У всех по-разному написано, но обычно есть папка latest (иногда ещё update). Надо перенести всё, что есть в latest в корень сайта — в /var/www/example.com/docs/.

cp -r /var/www/example.com/docs/latest/. /var/www/example.com/docs/

Удаляем latest

rm -r -f latest/

Для MailWizz важно иметь возможность писать в определенные папки. Чтобы ручками по папкам не бегать, разработчик подготовил даже скрипт для этого.

Сначала делаем его исполняемым:

chmod +x apps/console/commands/shell/set-dir-perms

А затем запускаем:

apps/console/commands/shell/set-dir-perms

А я все ручками делал. Хорошо в readme посмотрел 🙂 и по ссылке пошёл.

А теперь… в браузере идем по ссылочке https://example.com/install и начинаем его первичную установку.

Первичная настройка

На первом экране заполняем все поля, ставим галочку и нажимаем Next

Установка MailWizz на VPS

На втором экране все строчки должны быть зеленые. Если какого-то модуля не хватает, то надо установить.

Установка MailWizz на VPS

На третьем экране идет проверка прав доступа к папкам. Все строчки должны быть зелеными.

Установка MailWizz на VPS

На четвёртом экране, нам надо указать название базы, имя пользователя базы и его пароль:

Установка MailWizz на VPS

На пятом шаге нас просят указать данные администратора системы. Здесь главное — установить свою тайм-зону (расписание рассылок будет брать её за отправную точку). Кроме того, вы стразу можете создать Заказчик (Customer) с теми же реквизитами, что и администратор. Я в первый раз сказал No и у меня были проблемы при преключениях из роли админа в заказчика и наоборот, возможно, из-за этого.

Установка MailWizz на VPS

На шестом шаге нас просят запланировать в cron скрипты обслуживания.

Установка MailWizz на VPS

Запускаем crontab:

crontab -e

и копируем все восемь задач в конец редактируемого файла. Сохраняем его и выходим. Нажимаем Next.

Установка MailWizz на VPS

Процесс первичной установки закончен. Надо обязательно удалить папку install из корня нашего сайта. Кликаем на backend (https://example.com/backend/) и попадаем на авторизационную форму.

Установка MailWizz на VPS

Важно! В дальнейшем админом входим через https://example.com/backend/, а Заказчиком через http://example.com/customer/.

Первое, что вы должны сделать, зайдя в панель управления системой, это перейти в меню Settings->Common и установить в No пункт Check for new version automatically и Application auto update и нажать кнопку Save Changes. Если у вас nulled версия программы, и это не сделать, то это плохо скажется на её будущей работе.

Установка MailWizz на VPS

Важно! В прошлый раз я погорел на том что в пункте Clean urls выбрал вариант Yes, use clean urls. После сохранения сгенерированного .htaccess и нажатия на кнопку Save Changes у меня всё умерло. Умерло и в этот раз, но я смог откатить назад выбав вариант No, do not use clean urls и сохранив этот выбор (подчистил я и .htaccess в корне сайта позже).

Я думал, что это как-то связано mod_rewrite, который сначала не был установлен. Но в этот раз он был изначально активен. В чем причина я не стал разбираться — пусть будут кривые urls с index.php внутри них.

Остальные настройки оставим на утро 🙂