Я поставил самому себе задачу – автоматизировать установку сервисаУмный Домв лице приложения MajorDoMo на Ubuntu 18.04 Server amd64. В процессе написания использовал систему контроля версий mercurial, Virtualbox и тестовый образ. Сражу предупрежу, что скрипт не окончательный и в первую очередь для себя будет дополняться все новыми и новыми возможностями. Главное что у меня получилось настроить систему под разворачиваемое приложение, как я это уже описывал в этой заметке, но теперь уже не как команды который нужно указывать в терминале, а как единый скрипт команд.

От 30.04.2019 – Решил проверить работу скрипта, перестал подниматься сервис MajorDoMo, разбираюсь где проблема, проблема в базе sql которая на сайте разработчика.

Исходные данные:
ekzorchik@srv-bionic:~$ uname -a
Linux srv-bionic 4.15.0-23-generic #25-Ubuntu SMP Wed May 23 18:02:16 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Образ: ubuntu-18.04-live-server-amd64.iso

Ниже сам скрипт:

Рабочая эталонная база:

ekzorchik@srv-bionic:~$ wget https://www.ekzorchik.ru/wp-content/uploads/db_terminal_30_04_2019_default.zip

ekzorchik@srv-bionic:~$ unzip db_terminal_30_04_2019_default.zip 
Archive: db_terminal_30_04_2019_default.zip
inflating: db_terminal_30_04_2019_default.sql

ekzorchik@srv-bionic:~$ mkdir mproject/

ekzorchik@srv-bionic:~$ mv db_terminal_30_04_2019_default.sql mproject/

ekzorchik@srv-bionic:~$ nano mproject/majordomo

#!/bin/bash
# Codepage UTF-8
# Обновленный скрипт установки Majordomo на Ubuntu Bionic Server от 30.04.2019
mysqlroot="712mbddr@"
mysqluser="612mbddr@"

apt-get install -y git curl apache2 apache2-bin apache2-utils libapache2-mod-php7.2 php7.2-curl mysql-client mysql-server dbconfig-mysql php7.2-mbstring php7.2-mysql php-mysql ntpdate

unlink /etc/apache2/sites-available/000-default.conf
unlink /etc/apache2/sites-available/default-ssl.conf
unlink /etc/apache2/sites-enabled/000-default.conf
rm -Rf /var/www/html/


tee /etc/apache2/sites-available/majordomo.conf << EOF
<VirtualHost *:80>
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF

a2ensite majordomo.conf
mysqladmin -u root password $mysqlroot
a2enmod rewrite
rm -rf /var/lib/mysql/db_terminal
rm -Rf /usr/src/majordomo/
rm -Rf /usr/src/majordomo-master/
rm -Rf /usr/src/master.zip

#git clone https://github.com/sergejey/majordomo.git /usr/src/majordomo
wget https://github.com/sergejey/majordomo/archive/master.zip -P /usr/src/
unzip /usr/src/master.zip -d /usr/src/
# Переносим систему в директорию WEB-сервера
cp -rp /usr/src/majordomo-*/* /var/www
cp -rp $PWD/mproject/db_terminal_30_04_2019_default.sql /var/www/db_terminal.sql
cp -rp /usr/src/majordomo-*/.htaccess /var/www
# Создаем конфигурационный файл для системы
cp /var/www/config.php.sample /var/www/config.php
rm /var/www/config.php.sample
# Назначаем права и владельца для директории с системой
chown -R www-data:www-data /var/www
find /var/www/ -type f -exec chmod 0666 {} \;
find /var/www/ -type d -exec chmod 0777 {} \;

tee /etc/mysql/conf.d/disable_strict_mode.cnf << EOF
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
EOF

# Настраиваем Apache
sed -i 's/None/All/g' /etc/apache2/apache2.conf
echo "ServerName localhost" | sudo tee -a /etc/apache2/apache2.conf
sed -i '/short_open_tag/s/Off/On/' /etc/php/7.2/apache2/php.ini 
sed -i '/error_reporting/s/~E_DEPRECATED & ~E_STRICT/~E_NOTICE/' /etc/php/7.2/apache2/php.ini
sed -i '/max_execution_time/s/30/90/' /etc/php/7.2/apache2/php.ini
sed -i '/max_input_time/s/60/180/' /etc/php/7.2/apache2/php.ini
sed -i '/post_max_size/s/8/200/' /etc/php/7.2/apache2/php.ini
sed -i '/upload_max_filesize/s/2/50/' /etc/php/7.2/apache2/php.ini
sed -i '/max_file_uploads/s/20/150/' /etc/php/7.2/apache2/php.ini

#timezone
sed -i 's#^;date\.timezone[[:space:]]=.*$#date.timezone = "Europe/Moscow"#' /etc/php/7.2/apache2/php.ini

# Настраиваем PHP для командной строки
sed -i '/short_open_tag/s/Off/On/' /etc/php/7.2/cli/php.ini

# Создаю базу, пользователя и пароля для сервиса mysql
mysql -u root -p$mysqlroot -e "drop database db_terminal"
mysql -u root -p$mysqlroot -e "drop user 'us_majordomo'@'localhost'"
mysql -u root -p$mysqlroot -e "create database db_terminal character set utf8"
mysql -u root -p$mysqlroot db_terminal < /var/www/db_terminal.sql
mysql -u root -p$mysqlroot -e "create user 'us_majordomo'@'localhost' identified by '$mysqluser'"
mysql -u root -p$mysqlroot -e "grant all on db_terminal.* to 'us_majordomo'@'localhost';"
# Прописываю в файле сервиса MajorDoMo данные по пользователю MySQL, базе и паролю
cp /var/www/config.php.sample /var/www/config.php
sed -i "s/Define('DB_NAME', '')/Define('DB_NAME','db_terminal')/" /var/www/config.php
sed -i "s/Define('DB_USER', 'root')/Define('DB_USER','us_majordomo')/" /var/www/config.php
sed -i "s/Define('DB_PASSWORD', '')/Define('DB_PASSWORD','$mysqluser')/" /var/www/config.php

# Создаем описание сервиса для запуска основного цикла системы
tee /etc/systemd/system/majordomo.service << EOF
[Unit]
Description=MajorDoMo

[Service]
Requires=mysql.service
Requires=apache2.service
Type=simple
WorkingDirectory=/var/www
ExecStart=/usr/bin/php /var/www/cycle.php
Restart=always
User=www-data
Group=www-data

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable majordomo.service
systemctl restart majordomo.service

usermod -aG audio www-data

#Cycle in crontab
echo "@reboot /usr/bin/php /var/www/cycle.php" | tee -a /var/spool/cron/crontabs/root

# Обновляем и перезапускаем службы
service mysql restart
systemctl restart apache2
rm -f /var/www/modules/control_modules/installed

# Смена языка интерфейса
mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "update settings set value='Europe/Moscow' where id='74'";
#по умолчанию данной строки в таблице нет и ее нужно добавить
mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "delete from settings where NAME='SITE_LANGUAGE'"
mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "insert into settings(NAME,TITLE,VALUE,TYPE) VALUES('SITE_LANGUAGE','Language','ru','text')"
#sudo mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "update settings set value='ru' where Name='SITE_LANGUAGE'";
mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "update settings set value='ru' where name='VOICE_LANGUAGE'";
mysql -u us_majordomo -p$mysqluser -h localhost db_terminal -e "update users set EMAIL='support@ekzorchik.ru'"
mysql -u root -p$mysqlroot -h localhost db_terminal -e "flush privileges"

#Reboot System
sudo shutdown -r now

ekzorchik@srv-bionic:~$ chmod +x mproject/majordomo
ekzorchik@srv-bionic:~$ sudo mproject/majordomo

Дополнения по скрипту:

от 11.11.2018 закомментирована строка #sudo rm -f /var/lib/dpkg/lock вместо нее добавлены проверки на существование файлов и если они есть удалить, они блокируют установку обновлений и тем самым весь скрипт рушится. По мере свободного времени с учетом всех проверок скрипт модернизируется.

Пока на этом все, скажу напоследок, что использовать Mercurial в ходе написания скрипт здорово экономило время плюс контроль что я делал днями ранее и что изменял после. На этом я прощаюсь, заметка по установке MajorDoMo на Ubuntu 18.04 Server amd64 мною автором Олло Александр aka ekzorchik завершена и работает.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru