Вчера в настройки полностью установленного и протестированного 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
На втором экране все строчки должны быть зеленые. Если какого-то модуля не хватает, то надо установить.
На третьем экране идет проверка прав доступа к папкам. Все строчки должны быть зелеными.
На четвёртом экране, нам надо указать название базы, имя пользователя базы и его пароль:
На пятом шаге нас просят указать данные администратора системы. Здесь главное — установить свою тайм-зону (расписание рассылок будет брать её за отправную точку). Кроме того, вы стразу можете создать Заказчик (Customer) с теми же реквизитами, что и администратор. Я в первый раз сказал No и у меня были проблемы при преключениях из роли админа в заказчика и наоборот, возможно, из-за этого.
На шестом шаге нас просят запланировать в cron скрипты обслуживания.
Запускаем crontab:
crontab -e
и копируем все восемь задач в конец редактируемого файла. Сохраняем его и выходим. Нажимаем Next.
Процесс первичной установки закончен. Надо обязательно удалить папку install из корня нашего сайта. Кликаем на backend (https://example.com/backend/) и попадаем на авторизационную форму.
Важно! В дальнейшем админом входим через https://example.com/backend/
, а Заказчиком через http://example.com/customer/
.
Первое, что вы должны сделать, зайдя в панель управления системой, это перейти в меню Settings->Common и установить в No пункт Check for new version automatically и Application auto update и нажать кнопку Save Changes. Если у вас nulled версия программы, и это не сделать, то это плохо скажется на её будущей работе.
Важно! В прошлый раз я погорел на том что в пункте Clean urls выбрал вариант Yes, use clean urls. После сохранения сгенерированного .htaccess и нажатия на кнопку Save Changes у меня всё умерло. Умерло и в этот раз, но я смог откатить назад выбав вариант No, do not use clean urls и сохранив этот выбор (подчистил я и .htaccess в корне сайта позже).
Я думал, что это как-то связано mod_rewrite, который сначала не был установлен. Но в этот раз он был изначально активен. В чем причина я не стал разбираться — пусть будут кривые urls с index.php внутри них.
Остальные настройки оставим на утро 🙂