29 апр. 2018 г.

О переходе с Windows на Linux

Листая ленту новостей Google в своём телефоне периодически натыкаюсь на заметки типа "5 причин перейти с Windows на Linux" и т.п. На фоне санкций и импортозамещения идея сменить проприетарную ОС на свободную выглядит очень привлекательной. Лично я заинтересовался свободными ОС ещё в начале 2000-х, когда и интернета толком не было. Приходилось искать болванки с дистрибутивами, искать хоть какую-то информацию о том, как всё установить, настроить. Сейчас всё гораздо проще. Любой может скачать любой интересующий его дистрибутив и установить на своё компьютер. За почти два десятиления процесс установки любой операционной системы превратился в простую процедуру, доступную каждому.

Первая ошибка переходящих на Linux: в нём все бесплатное. Отчасти это так. Сама операционная система имеет открытый исходных код. Также открытый исходный код имеют множество приложений. Но в некоторых случаях, в также можете воспользоваться проприетарными программами или играми. Например, магазин Steam имеет дистрибутив и под Linux. Вы можете купить интересующие вас игры (однако не все игры возможно будет запустить под Linux, а только адаптированные). Однако для домашнего и офисного использования набора отрытых и бесплатных программ вполне достаточно, то, за что в Windows нужно отдать не один десяток рублей только для того, чтобы ваш компьютер стал печатной машинкой, в Linux для вас не будет стоить ни копейки. И при этом вы не нарушите ни одного закона и чьих-то прав.

С чего начать

Итак, что же я посоветую тем, кто решился изменить свою жизнь и перейти на Linux? Не делайте резких движений. Новая операционная система заставит вас изменить ваши привычки. Первое, что вам нужно сделать, посмотреть на те программы, которыми вы пользуетесь и найти им альтернативу, которая есть в Linux. Множество свободных программ, доступных в Linux имеют и сборки под Windows. Попробуйте заменить, например:

  • Офисный пакет: LibreOffice, OpenOffice.org
  • Почтовую программу: Mozilla Thunderbird
  • Веб-браузер: Google Chrome, Mozilla Firefox
  • Графический растровый редактор: Gimp
  • Графический векторный редактор: Inkscape
  • Клиент мгновенного обмена сообщений: Pidgin

Возможно вы даже заметите, что некоторые ваши программы уже есть в Linux, например Google Chrome. Оцените на сколько вы можете заменить то, чем вы пользуетесь на открытые аналоги и аналоги, имеющие порты для Linux. Попробуйте установить из в Windows и оценить их достоинства и недостатки. Оцените, как вы можете работать в этих программах.

Например, если вы установите офисный пакет LibreOffice, то вам удобнее будет хранить документы в формате odt,а не doc и docx. Если вы не обмениваетесь документами с кем-либо, то у вас не будет никаких проблема. Открывать документы doc и docx вы в любом случае сможете, как и сохранять в этом формате. Но на которых сложных и не совсем удачно оформленных документах что-то может съехать (впрочем, такое же может произойти, если документ открывается в разных версиях Microsoft Office).

Заменить Photoshop на Gimp согласится не каждый. Возможно, если вы регулярно профессионально работаете в Photoshop, купили на него лицензию, то смысла переходить на Linux у вас нет. Однако если вы периодически или регулярно делаете что-то для себя или даже работаете в фотосалоне, но при этом не умеете работать в Photoshop, но хотите его освоить, то имеет смысл попробовать использовать Gimp. Да, он не так проработан и вылизан, зато полностью бесплатен и позволяет делать многое, что может Photoshop. Есть плагины, например, для создания в автоматическом режиме снимков для документов (нужно только указать лицо на фотографии и все необходимые операции по масштабированию, обрезке и созданию файла для печати Gimp выполнит за вас.

Месседжер Pidgin верой и правдой служил мне несколько лет. Конечно, с Miranda по удобству и красоте он не сравнится, но свои функции он выполняет. Впрочем, сейчас я им почти не пользуюсь, основное общение ушло в Telegram. И да, Telegram имеет клиента и под Linux, который не отличим от приложения для Windows.

После того, как вы определились с приложениями, попробуйте пользоваться только ими. Попробуйте отказаться от приложений, которые написаны исключительно для Windows. Если вы нашли какие-то приложения, которые не имеют порта на Windows, можете попробовать установить Linux в виртуальной машине, чтобы также оценить эти приложения.

На этом этапе вы уже сможете определиться, сможете ли вы перейти на Linux. Если всё проходит гладко, то можете попробовать установить Linxu на свой ПК. Если что-то вас не устраивает, повремените с этим шагом. Кстати, приобретённый вами опыт вам вполне пригодится. Например, пользуясь LibreOffice вы можете в будущем не платить за Microsoft Office на новом ПК, когда решите его обновить, а стоит офис от Майкрософта не мало и при этом не предлагает чего-то особенного. Лично для меня их новый интерфейс скорее неудобен и постоянно приходится искать в интернете как делать элементарные вещи который делал сто раз на версии 2003.

Из всего вышесказанного вытекает и ещё одна вещь. Если вы твёрдо решили использовать Linux, но у вас не всё получается, то пока вы используете Windows и получаете новые задачи, выбирайте новый софт с оглядкой на будущее. Если вы вдруг решите начать программировать и вам понадобится какая-нибудь база данных, то не выбирайте Microsoft Access. Быстрый старт обернётся для вас vendor lock, т.е. привязкой к поставщику. Теперь вы просто так уже не сможете сменить платформу, потому что вам придётся в будущем отказаться от всех ваших наработок. Кстати, именно сейчас так и делают госструктуры. По тендерам покупают продукты, заточенные для Windows, а потом рапортуют, что они не могут перейти на Linux и им необходимо из бюджетных средств покупать Windows. Не совершайте таких ошибок.

Лично у меня процесс ухода в Windows на Linux занял 2-3 года. Сейчас основную часть времени я проводу в Linux, однако если, например, если хочу поиграть в World Of Tanks или прошить некоторые Android устройства вынужден загружать Windows.

Выбор дистрибутива

Если вы совсем не разбираетесь в Linux, то могу сразу порекомендовать несколько дистрибутивов. Дальнейшее повествование будет вам неинтересно.

  • Ubuntu - первый из наиболее дружелюбных к пользователю;
  • Debian - старичок, но до сих пор в форме, по сути явился основой для Ubuntu;
  • Linux Mint - для тех, кто не хочет менять многое в рабочем столе, основан на Ubuntu, имеет несколько вариантов с классическими рабочими столами.

Первое, чем значительно отличаются дистрибутивы друг от друга - это методика формирования релизов. Дистрибутивы можно поделить на две категории:

  • с периодически выходящими релизами (Ubuntu, Debian, CentOS, Fedora и др.)
  • плавающие или роллинг-релизы (Gentoo, Archlinux и др.)

В первом случае дистрибутивы имеют чёткий график выходов, также как и Windows. При этом, зачастую, вы можете получить в своей системе не самые свежие версии программного обеспечения, но при этом стабильные. Кроме этого, могут возникнуть некоторые трудности при обновлении системы от релиза к релизу (вспомните, если вы хоть раз обновляли Windows с версии на версию). Даже для меня обновление Ubuntu от релиза к релизу не всегда было тривиальным.

В противоположность периодическим релизам есть дистрибутивы без релизов как таковых. Вы можете скачать текущую сборку и в последствии обновлять её. Этим меня привлекла Gentoo Linux. К тому же я получаю часто более свежие версии софта, чем предоставляет тот же самый Debian или Ubuntu.

Второе, на что стоит обратить внимание - система распространения софта. Это может быть как распространение бинарных сборок, как и система сборки из исходного кода. К первому типу систем относятся практически все человекоориентированные популярные дистрибутивы: Ubuntu, Debian, Fedora, CentOS и др. В них весь софт скачивается из репозитория в уже собранном виде. Система сама знает какие зависимости необходимы для данного конкретного приложения, и скачивает и устанавливает их самостоятельно.

Ярким представителем дистрибутива с системой сборки из исходного кода является Gentoo Linux. Если честно, то я не с первой попытки освоил этот дистрибутив. Но его построение мне было интересно с самого начала. Из-за этого первой операционной системой семейства unix, которую я освоил была FreeBSD. Это совсем не Linux, но для людей не сведущих найти отличия Linxu от FreeBSD будет затруднительным. Система портов FreeBSD очень проста для пользователя. Те самые рассказы про "красноглазых людей собирающих всё из исходников" никак не относятся ни к FreeBSD, ни к Gentoo. Например, сборка из исходников во FreeBSD представляет из себя запуск команды установки и последующим выводом меню, где вы выбираете какие функции вам нужны от программы. Это сродни тому, как вы настраиваете программы в Windows. Весь дальнейший процесс сборки из исходников прописан в файлах и вам ничего не нужно делать, а только ждать. В Gentoo этот процесс немного сложнее. Вам придётся пользоваться текстовым редактором и прописывать необходимые настройки специальными текстовыми ключами, называемыми USE-флагами. Процесс сборки ядра в Gentoo фактически тоже представляет из себя несколько команд и предварительное конфигурирование с помощью меню, хотя и в текстовом режиме. Опять таки процесс такой же, как и при настройке Windows программ с переходом между окнами и выставлением необходимых галок. Ну а чем же Gentoo и FreeBSD так хороши? Основное преимущество - оптимизацию приложений они практически потеряли, потому что оптимизацию на современном железе сложно заметить. Второе преимущество - вы можете не собирать те модули, которые вам не нужны и не засорять систему. Когда я пользовался Ubuntu был один случай, когда я пытался поставить IRC клиент XChat на свою систему. Каково же было моё удивление, когда менеджер зависимостей начал выкачивать кучу пакетов оболочки KDE. При этом я был пользователем Gnome. А произошло это потому, что мейнтейнер пакетов использует у себя KDE и те возможности программы, которые используют KDE. В результате в зависимость попала KDE. В Gentoo можно указать соответствующий USE-флаг, что вы не хотите использовать возможности KDE и приложение автоматически соберётся без этих компонентов.

Впрочем, не могу посоветовать начинать с Gentoo. Скорее всего вы столкнётесь с проблемами уже на этапе установки (процесс установки отлично описан на официальном сайте, даже в переводе на русский, но не каждый сможет это выполнить не имея опыта работы с Linux). Лучше всё-таки сначала попробовать какой-то более дружелюбный дистрибутив и уже потом переходить на Gentoo, когда вы будете представлять себе что такое Linux.

Если вас привлекли роллинг-релизы, то стоит также обратить внимание на дистрибутив Archlinux. Он имеет свой репозиторий с бинарнцыми версиями программ, но при этом имеет возможности для сборки программ из исходных кодов.

Для тех, кто не хочет сильно заморачиваться с настройками системы можно посоветовать дистрибутивы Ubuntu (в том числе Kubuntu, Xubuntu и др.) и Mint Linux.

Если вы сталкиваетесь c энтерпрайз серверами, то во многих случаях там будут использованы deb-based (Ubuntu, Debian) и rpm-based дистрибутивы. Во втором случае наиболее оптимальным для вас будет попробовать Fedora и CentOS. Использование систем с аналогичным типам репозиториев позволит вам лучше узнать как работают эти самые серверы.

Заключение

Даже просто начав процесс знакомства с миром Linux и пользуясь Windows вы окажетесь в более выгодном положении, чем другие. Увидев где-то Linux вы вполне сможете в нём работать, если заранее познакомитесь с теми программами, которые если в Linux. И однажды может наступить тот самый день, когда вы себе скажете: мне не важно какой системой я пользуюсь, ведь везде есть удобные для меня инструменты для выполнения моих задач.

23 апр. 2018 г.

Памятка по MySQL/MariaDB

Периодически возникает необходимость первоначальной настройки MySQL. Опишу несколько особенностей современной настройки.

В некоторых дистрибутивах, например, Debian 9, под mysql подразумевается mariadb, т.е. даже вы устанавливаете пакет mysql-server, то получаете mariadb-server.

Пароль root

Первая особенность - пользователь root недоступен при подключении через TCP. Он остаётся доступным только через unix-сокет. Поскольку подавляющее большинство использует TCP соединение в настройках PHP, соответственно все PHP-админки для MySQL не могут использовать пользователь root. Первое, что приходит в голову - разрешить root для TCP (и это можно сделать убрав в таблице mysql.user из поля plugin значение unix_socket). Однако, лучше не стрелять себе в ногу, а создать своего пользователя, который будет иметь полные привилегии для управления сервером. В таком случае, даже если кто-то получит доступ к вашей админке через интернет, то вынужден будет не только подбирать пароль для root, но ещё и угадывать пользователя. Если это не целевая атака на вашу систему, то у злоумышленника почти нет шансов это сделать.

Для предварительной настройки воспользуемся командной строкой:

mysql -u root -p

Изначально у пользователя root нет пароля и ключ -p можно не использовать, а если использовали, то принимается любой пароль.

Создаём нового пользователя mysuperuser с паролем 123 (я надеюсь вы понимаете, что пользователь и пароль приведёны для примера и в реальности нужно использовать своё оригинальное имя пользователя и сложный пароль):

CREATE USER mysuperuser@localhost IDENTIFIED BY '123';

Теперь мы можем подключиться к нашему серверу баз данных. Однако, мы имеем ограниченные права.

GRANT ALL PRIVILEGES ON *.* TO mysuperuser@localhost;

Т.е. задаём все права (ALL) для всех ресурсов (*.*) для нашего пользователя.

После перелогина в веб-интерфейсе вы получите полные права на управление сервером и сможете создавать пользователей, базы данных, настраивать привилегии и т.д. В некоторых статьях в интернете рекомендуют также перед этим перезагрузить привилегии:

FLUSH PRIVILEGES;

Судя по всему, делать этого не обязательно, т.к. работа с пользователями производилась с помощью команд CREATE и GRANT, а не при помощи INSERT/UPDATE в базе mysql.

Логика подсказывает, что изменить пользователя, в том числе пароль, можно с помощью команды:

ALTER USER mysuperuser@localhost IDENTIFIED BY 'new_password';

Но что-то пошло не так. Как оказывается, эта команда была введена в MySQL-5.7.6 и MariaDB-10.2. Если вы используете более старую версию (а на момент написания этой заметки в Debian доступна из основного репозитория только MariaDB 10.1), то изменить пароль можно следующим образом:

SET PASSWORD FOR mysuperuser@localhost = PASSWORD('new_password');

Кодировка

Как известно, в мире unix уже давно в качестве стандартной кодировки используется UTF-8 (привет пользователям Windows!!!). В MySQL поддержка UTF-8 имеется в нескольких наборах. Далее я буду иметь под словом "кодировка" как непосредственно кодировку, так и правила сортировки collation.

До недавнего времени я использовал кодировку utf8_general_ci, но, как оказалось, я немного отстал от жизни. Эта кодировка появилась первой. Позже была создана ещё одна utf8mb4. Она появилась ещё в версии MySQL 5.5.3. От первой она отличается увеличенным до 4 байт объёмом хранения одного символа. Лично я, поскольку использую русские символы, никогда не сталкивался с какими-то проблемами с utf8. Но, дабы избежать потенциальных проблем, лучше использовать utf8mb4.

Для utf8mb4 существует два основных варианта utf8mb4_general_ci и utf8mb4_unicode_ci. Судя по статьям в интернете, utf8mb4_general_ci является упрощённой и имеющая оптимизации при сортировке. Однако эти оптимизации могут вызвать в некоторых случаях не тот результат, что вы ожидаете. Поэтому лучше использовать кодировку utf8mb4_unicode_ci. К тому же, по некоторым данным, на современном железе разница в скорости сортировки практически незаметна (я думаю. если вы соберётесь создавать высоконагруженное приложение, то проведёте соответствующие тесты и выберете подходящий вариант). И ещё, немаловажно, по заявлению Oracle в MySQL 8.0, которая вышла в след за 5.7 (была изменена нумерация релизов), проведена значительная оптимизация скорости сортировки для utf8mb4, что позволяет получить 20 кратный прирост производительности.

Ну а что современные дистрибутивы? MySQL по умолчанию поставляется Oracle с кодировкой latin1. Переход на utf0mb4 произведён только в версии 8.0. В текущей версии MariaDB из репозитория Debian изначально используется utf8mb_general_ci.

База часовых поясов

Для корректной работы со временем необходимо сформировать базу часовых поясов на базе данных tzdata. Сделать это можно с помощью

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p

Операцию можно повторить, т.к. сгенерированный командой mysql_tzinfo_to_sql скрипт имеет в своём составе команды на удаление существующих таблиц. После обновления базы часовых поясов необходимо перезапустить MySQL-сервер.

База часовых поясов позволит вам устанавливать необходимый часовой пояс и учитывать все изменения для текущей местности при работе с датами из прошлого:

SET TIME_ZONE="Asia/Yekaterinburg"

3 апр. 2018 г.

Умный дом на основе Majordomo

Это черновик!

Это черновая версия публикации. Возможно в ней содержатся неточности и отсутствуют некоторые поясняющие фрагменты. Даже не смотря на это текст можно использовать в качестве знакомства с принципами работы Majordomo.

Системные требования

Что нужно для работы majordomo:

  1. веб-сервер
  2. php
  3. mysql

Выбор веб-сервера.

Так сложилось, что я не вижу большой необходимости в Apache для себя. Единственную функцию, которую он для меня выполняет - это разгребание .htaccess. Однако у меня нет задачи сделать хостинг для кого-то, у меня свой сервер, поэтому самым оптимальным будет спрятать эти правила в конфигурацию nginx. Тем более работающая конфигурация для nginx уже есть на сайте разработчиков.

Устанавливается nginx штатными средствами.

Файлы настроек nginx располагаются в папке /etc/nginx. В Debian-based дистрибутивах, в том числе Raspbian, nginx уже по умолчанию сконфигурирован на работу с виртуальными хостами, настройки которых хранятся в папке sites-available. Для включения виртуального хоста необходимо создать символическую ссылку в папке sites-enabled на созданный файл конфигурации виртуального хоста.

Если же конфигурация отличается, то можно самостоятельно прописать в секции http файла nginx.conf строку:

include /etc/nginx/sites.d/*.conf;

В этом случае внутрь секции http будут включены все файлы с расширением .conf из папки sites.d, которую необходимо будет создать.

На этом предварительную настройку nginx можно считать законченной. Дальнейшую настройку можно будет провести после установки php.

Установка PHP

Как известно на Apache можно установить PHP в виде модуля. Для nginx же из известных мне вариантов только подключение с использованием FastCGI. Впрочем, ещё в версии PHP 5.4 в самом PHP появился свой FastCGI Process Manager. Так что ничего лишнего устанавливать будет не нужно, всё уже есть «из коробки».

На Raspbian установить почти всё необходимое можно с помощью команды:

sudo apt-get install php-fpm

Для работы php из командной строки необходимо установить модуль php-cli.

После доустановки необходимых модулей для запуска Majordomo у меня получился следующий список:

  • php-cli
  • php-common
  • php-curl
  • php-fpm
  • php-gd
  • php-json
  • php-mbstring
  • php-mysql
  • php-opcache
  • php-readline
  • php-xml

Стандартный скрипт установки Majordomo предлагает более широкий набор модулей:

sudo apt-get -qq install -y php
sudo apt-get -qq install -y php-bz2 
sudo apt-get -qq install -y php-cli 
sudo apt-get -qq install -y php-common 
sudo apt-get -qq install -y php-curl 
sudo apt-get -qq install -y php-gd 
sudo apt-get -qq install -y php-json 
sudo apt-get -qq install -y php-mbstring 
sudo apt-get -qq install -y php-mcrypt 
sudo apt-get -qq install -y php-mysql 
sudo apt-get -qq install -y php-opcache 
sudo apt-get -qq install -y php-readline
sudo apt-get -qq install -y php-xml 
sudo apt-get -qq install -y php-mysql 
sudo apt-get -qq install -y php-pear
sudo apt-get -qq install -y php-idn 
sudo apt-get -qq install -y php-imagick 
sudo apt-get -qq install -y php-imap 
sudo apt-get -qq install -y php-memcache 
sudo apt-get -qq install -y php-mhash 
sudo apt-get -qq install -y php-ming 
sudo apt-get -qq install -y php-ps 
sudo apt-get -qq install -y php-pspell 
sudo apt-get -qq install -y php-recode 
sudo apt-get -qq install -y php-snmp 
sudo apt-get -qq install -y php-tidy 
sudo apt-get -qq install -y php-xmlrpc 
sudo apt-get -qq install -y php-xsl 
sudo apt-get -qq install -y php-json

Если у вас возникли проблемы с функционированием Majordomo, можете доустановить рекомендуемое.

Возможно при установке модулей потребуется явно указать версию php, для чего в наименовании пакеты нужно прописать php5-* или php7.0-*. Лично я не рекомендую использовать PHP 5 версии, т.к. в версии 7.0 разработчиками проделана значительная работа по оптимизации производительности (для системы на Raspberry Pi это особенно важно из-за небольшого количества ресурсов) и, кроме того, PHP 7.0 вышла в конце 2015 года и по стабильности не хуже PHP 5.

Конфигурация php хранится, как правило, в папке /etc/php. При этом внутренняя структура может отличаться на разных дистрибутивах. Например, на Raspbian конфигурация FPM хранится в папке /etc/php/7.0/fpm, а в Gentoo /etc/php/fpm-php7.0. В любом случае структура похожа. Нас интересует папка pool.d или fpm.d, во втором случае. Внутри этой папки расположен файл www.conf. Это пул процессов по имени www обрабатывающий запросы к PHP.

Настроим пул. Необходимо сделать минимум изменений в оригинальном файле. Во-первых, нужно указать системное имя пользователя и группу от имени которого будет запущены процессы PHP. Самым оптимальным будет использование того же самого пользователя, что и указан в конфигурации веб-сервера. Находим следующие строки и указываем своего пользователя:

user = www
group = www

Следующий интересующий нас параметр - прослушиваемый PHP-FPM сокет. Это может быть как TCP, так и unix. Можно просто записать значение параметра (его мы будем указывать в настройках nginx), либо указать своё значение. Вот так у меня выглядело значение по умолчанию:

listen = 127.0.0.1:9000

Это самый простой способ настроить PHP-FPM. Однако, поскольку наш PHP-FPM работает на той же машине, что и веб-сервер, можно воспользоваться unix-сокетами. При этом серверу не нужно будет использовать весь стек протоколов TCP/IP, который имеет свои накладные расходы. Однако, при использовании unix-сокета необходимо, чтобы у создаваемого ресурса были корректно выставлены права доступа. Находим и настраиваем следующие параметры (некоторые нужно будет раскомментировать):

listen = /run/php/php7.0-fpm.sock;
listen_owner = www
listen_group = www
listen_mode = 660

Вместо www укажите того же самого пользователя, что указывали в настройках веб-сервера и выше в этом файле конфигурации. Как не трудно догадаться, будет создан файл ресурса /run/php/php7.0-fpm.sock и владельцем www и группой www, а также правами доступа 660, т.е. доступный только для пользователя и группы, но не всех пользователей системы. Ещё неплохо будет убедиться, что папка /run/php существует и она доступна пользователю www (или того, который вы используете) для записи.

Теперь настал момент настройки nginx. Можно прописывать настройки php в каждый файл с виртуальным хостом, а можно прописать глобально. Даже не смотря на то, что у нас имеется только один виртуальный хост, воспользуемся вторым вариантом, как более «правильным». Для этого в файле /etc/nignx/nginx.conf найдём секцию http и добавим следующие строки (можно это сделать в самом начале секции после открывающейся фигурной скобки):

    upstream php-fpm {
 server unix:/run/php/php7.0-fpm.sock;
    }

Указанное нами имя php-fpm можно будет указывать в директиве fastcgi_pass в настройках виртуального хоста. Благодаря директиве upstream мы можем в любой момент изменить глобально настройки php, при этом все виртуальные хосты подхватят это изменение.

После этой настройки мой файл nginx.conf принял такой вид:

user www;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
 worker_connections 768;
 # multi_accept on;
}

http {
    upstream php-fpm {
 server unix:/run/php/php7.0-fpm.sock;
    }

 ##
 # Basic Settings
 ##

 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 65;
 types_hash_max_size 2048;

 include /etc/nginx/mime.types;
 default_type application/octet-stream;

 ##
 # SSL Settings
 ##

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
 ssl_prefer_server_ciphers on;

 ##
 # Logging Settings
 ##

 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;

 ##
 # Gzip Settings
 ##

 gzip on;
 gzip_disable "msie6";

 # gzip_vary on;
 # gzip_proxied any;
 # gzip_comp_level 6;
 # gzip_buffers 16 8k;
 # gzip_http_version 1.1;
 # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

 ##
 # Virtual Host Configs
 ##

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites.d/*.conf;
}

Настройка MySQL-сервера

В качестве MySQL-сервера для Majordomo можно использовать как оригинальный сервер, так и его форк MariaDB. Детальную настройку сервера опишу чуть позже.

Тут необходимо описать как настроить сервер, как создать базу данных и залить туда информацию, а также указать куда прописать реквизиты доступа.

При использовании MariaDB по умолчанию для пользователя root подключен плагин unix_socket. Это означает, что пользователь root не может использоваться при TCP соединении. Из-за этого нельзя зайти через phpMyAdmin. Самым безопасным вариантом является создание через командную строку своего пользователя и назначить ему глобальные привилегии. В качестве альтернативы можно просто записать пустую строку в поле plugin базы user в базе данных mysql, что, конечно, понизит безопасность системы.

Запуск сайта Majordomo

Основной интерфейс Majordomo выполнен в виде сайта. Скачиваем дистрибутив и распаковываем, например, в папку /var/www/majordomo. С помощью команды chown -R www:www /var/www/majordomo передаём эту папку нашему пользователю, от имени которого работает nginx и php. Задать права доступа для файлов и папок можно с помощью скрипта install-linux.sh в корневой папке. НО! В нём указаны команды chmod 777 и chmod 666, что явно излишне. Нам будет достаточно прав 770 и 660 или, даже, 750 и 640. Исправьте эти значения внутри файла, разрешите запуск скрипта с помощью команды chmod +x install-linux.sh и запустите его.

Создадим файл виртуального хоста в соответствующей папке, которую мы определили при настройке веб-сервера. Создаём там файл majordomo.conf:

server {
    listen 80 default_server;
    server_name  majordomo.localhost;

    charset utf-8;

    access_log  /var/log/nginx/majordomo_access.log;
    error_log  /var/log/nginx/majordomo_error.log;

    root   /var/www/majordomo;

    index  index.php index.htm index.html;

    location ~ index\.html$ {
    }

    location  fckeditor {
    }

    location ~ banner\.html$ {
    }

    location  flashcoms {
    }

    location  google {
    }

    location  fck {
    }

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        index  index.html index.htm index.php;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
      rewrite pda$ /popup/pda.html redirect;
        if (!-e $request_filename){
            rewrite ^(.*)$ /nf.php;
        }
        if (!-e $request_filename){
            rewrite ^(.*)$ /nf.php;
        }
    }

    location /config.php {
        deny all;
    }

    location /debmes.txt {
        deny all;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~ \.php$ {
 fastcgi_pass php-fpm;
        fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Я использовал один из вариантов конфигурации, который нашёл на сайте разработчика. Поясню некоторые из директив.

listen - указывает какой адрес и порт должен прослушивать веб-сервер для получения запросов к этому сайту. При указании только номера порта, как указано в конфигурации, прослушивание будет вестись на всех доступных серверу IP-адресах. Добавление директивы default_server позволит веб серверу всегда выводить этот сайт, в том числе по запросу через IP-адрес. Если хост один, то директиву можно и не добавлять. Позже расскажу как можно разнести несколько сайтов на одном хосте.

server_name - доменное имя сайта. Если у вас несколько виртуальных хостов на сервере и вы не указали директиву default_server, то попасть на этот сайт вы можете только если в адресной строке вашего браузера будет указано это доменное имя. Можно также указать несколько имён через пробел, например, добавить www.majordomo.localhost.

access_log и error_log - настройка, соответственно, логов доступа на сайт и логов ошибок. Если они вам не нужны просто закомментируйте эти строки или не указывайте их совсем.

root - собственно указание каталога где хранится сайт.

Теперь необходимо создать файл конфигурации Majordomo. Пример такого файл есть в корне проекта config.php.sample. Создаём его копию config.php. На что необходимо обратить внимание:

  • define констант с именами DB_*, это ни что иное, как реквизиты доступа к базе данных, в том числе: DB_HOST - хост базы данных (127.0.0.1 или localhost, скорее всего ваш вариант), DB_NAME - им базы данных, DB_USER - пользователь MySQL от имени которого будет осуществляться доступ к базе данных (указывали на этапе настройки MySQL), DB_PASSWORD - пароль пользователя (также указывали на этапе настройки MySQL);
  • date_default_timezone_set - ваш часовой пояс (также необходимо настроить его в MySQL, допишу позднее);
  • define('BASE_URL', 'http://127.0.0.1:80'); - здесь вместо http://127.0.0.1:80/ нужно указать корректный адрес, по которому демон сможет обратиться к вашему веб-сайту. Если у вас только один сайт, то можно оставить существующее значение, но если несколько виртуальных хостов, то необходимо установить корректное значение. Я установил это значение неверно и столкнулся с неработоспособностью модуля XiaomiHome. Возможно аналогичным образом работают и другие модули работы с оборудованием.

Запускаем демона

В терминологии разработчиков Majordomo системный сервис называется циклом. По сути это системный демон написанный, также на PHP, который работает в фоне и обеспечивает выполнение текущих задач и получение информации с датчиков.

Для обеспечения автоматического запуска нужного сервиса создаём файл конфигурации для systemd: /lib/systemd/system/majordomo.service (не могу ручиться, что создаю в правильном месте, позже будет уточнение)

[Unit]
Description=MajorDoMo

[Service]
Requires=mysql.service
Requires=nginx.service
Type=simple
WorkingDirectory=/var/www/majordomo
ExecStart=/usr/bin/php /var/www/majordomo/cycle.php
ExecStop=/usr/bin/pkill -f cycle_*.php
Restart=always
User=www
Group=www

[Install]
WantedBy=multi-user.target

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

В список требований перед запуском сервиса указан Requires=nginx.service. Это необходимо для того, что некоторые модули, например, XiaomiHome передают данные с датчиков с помощью запросов к веб-серверу. У меня работает и без этой строки.


Итог

После всех этих настроек мы получаем работающий сервер Majordomo. Рекомендую после проведения настроек перезагрузить сервер. Таким образом можно убедиться, что все сервисы стартуют успешно.