====== АННОТАЦИЯ ====== В данном программном документе приведено руководство системного программиста по установке и настройке системы сбора, обработки и хранения результатов измерений (далее система), предназначенной для сохранения и предоставления любых переданных данных, а в частности – с учебных устройств, разработанных на кафедре ПМиВТ МФ МГТУ им. Н. Э. Баумана. ====== Общие сведения о системе ====== Функциональным назначением системы является приём, сохранение и предоставление данных, полученных в процессе проведения замеров. Основные функции системы состоят в приёме и обработке данных JSON формата, сохранение и предоставлении по запросу, для последующей обработкой операторами. Для функционирования системы требуется серверная операционная си-стема, система управления базами данных, веб-сервер с поддержкой языка программирования PHP 7.2 и программный код. ====== Структура системы ====== Система сбора, обработки и хранения результатов измерений состоит из комплекса программного обеспечения, необходимого для её выполнения. На серверной операционной системе запущен веб-сервер, ожидающий HTTP запроса. При вхождение запроса выполняется сценарий, зависящий от вызываемого при запросе файла. ====== Настройка системы ====== Подготовка системы к работе делится на несколько этапов, выполнение которых будет рассматриваться на примере системы GNU/Linux Debian 9. ===== 1 Создание базы данных ===== ==== Установка СУБД MariaDB ==== Обновите базу пакетов $ apt-get update Найдите нужный пакет $ apt-cache search mysql-server Установите пакет mariaDB $ apt-get install mariadb-server-* Если будет просить ввести root пароль, то оставьте его пустым Инициализируйте систему безопасности MySQL $ mysql_secure_installation После этого система будет задавать вопросы, рассмотренные в разделе «сообщения системного программисту». ==== Настройка СУБД ==== Откройте конфигурационный файл «50-server.cnf» расположенный по пути /etc/mysql/mariadb.conf.d/ и в разделе [mysql] добавьте строку lower_case_table_names = 1 для регистронезависимости имён таблиц. Перезапустите mysql для внесения изменений $ systemctl restart mysql ==== Создание и настройка базы данных ==== Зайдите в mysql и создайте новую базу данных: $ mysql –u root –p (после нужно ввести пароль) CREATE DATABASE Production; Если ошибок нет, то база успешно создана. Создайте пользователя, под которым сайт будет работать с БД, пользователя для запроса данных, и пользователя-администратора базы данных для удалённого администрирования, следующей командой: CREATE USER ‘username’@’localhost’ IDENTIFIED BY ‘password’; Выдайте пользователям привилегии. Для сайта: $ GRANT SELECT,INSERT,UPDATE,DELETE ON production.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’; Для запроса данных: $ GRANT SELECT ON production.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’; GRANT FILE ON *.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’; Для администратора: $ GRANT ALL PRIVILEGES ON production.* TO ‘username’@’localhost’ IDEN-TIFIED BY ‘password’; Выйдите из базы данных. $ Exit Воссоздайте структуру базы данных с помощью SQL файла дампа. mysql -u username -p Production < data-dump.sql (Структура базы данных рассматривается в Приложении 1.) ===== 2 Установка HTTP сервера ===== ==== Установка и настройка пакета apache ==== Установите apache2 веб-сервер $ apt-get install apache2 Создайте каталог для сайта. $ mkdir –p /var/www/site.ru/ Настройте конфигурацию виртуального хоста. $ nano /etc/apache2/sites-available/site.ru.conf Вставьте в созданный файл конфигурации следующие настройки: ServerAdmin admin@e-mail ServerName site.ru ServerAlias www.site.ru DocumentRoot /var/www/site.ru/ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Options ExecCGI Сохраните файл и включите сайт. a2ensite site.ru.conf Отключите стандартный сайт. a2dissite 000-default.conf Перезапустите apache. systemctl restart apache2 ==== Установка и настройка php 7.2 ==== Импортируйте ключ подписи и включите PPA. $ wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -echo "deb https://packages.sury.org/php/stretch main" | sudo tee /etc/apt/sources.list.d/php.list Установите сертификаты. $ apt-get install ca-certificates apt-transport-https Обновите пакеты. $ apt-get update Установите пакеты php 7.2 с наиболее используемыми расширениями $ apt-get install php7.2 php7.2-cli php7.2-common php7.2-opcache php7.2-curl php7.2-mbstring php7.2-mysql php7.2-zip php7.2-xml php7.2-json Проверьте результат установки запросом версии php $ php –v В конфигурационном файле php.ini располагающемся по пути /etc/php/7.2/apache2/php.ini значение «short_open_tag» укажите «on». ===== 3 Удалённый доступ к файлам веб-приложения ===== Для доступа к файлам сайта можно использовать FTP или SSH. ==== FTP ==== Установите пакет ftp $ apt-get install proftpd Откройте конфигурационный файл proftpd.conf, путь к которому /etc/proftpd/proftpd.conf В строке DefaultRoot укажите /var/www/site.ru/ В строке User укажите пользователя, которого создадите позднее http-admin В строке Group укажите группу http Проверьте, чтобы весь раздел был закомментирован. ==== SSH ==== Установите SSH $ apt-get install openssh-server Запустите сервис ssh $ service ssh start Для загрузки файла на сервер используйте команду $ scp /path/to/file.http User@remote.host:/var/www/site.ru Для загрузки папки на сервер используйте команду с ключом –r $ scp –r path/to/dir User@remote.host:/var/www/site.ru Для скачивания с сервера на локальную машину используйте команду $ scp User@remote.host:/var/www/site.ru/file.http local/path/to/dir ===== 4 Создание пользователей системы ===== Создайте группу и http пользователя этой группы. $ groupadd http $ adduser User $ usermod –aG sudo,http User Выдайте пользователю владение директорией сайта $ chown –R User:http /var/www/site.ru/ Для возможности экспорта из mysql выдайте разделу /var/www/site.ru/export/ доступ другим пользователям. $ chmod –R 777 /var/www/site.ru/export/ В случае, если для доступа к файлам сайта было решено использовать FTP, создайте пользователя http-admin и добавьте ему группу http $ adduser http-admin $ usermod –aG http http-admin Смените владельца директории сайта на группу http $ chgrp –R http /var/www/site.ru/ ===== 5 Обязательные изменения в текстах программ ===== 1. Откройте в текстовом редакторе файл /core/baseinfo.php. 2. Замените в нём: * 'server' – если база данных и веб сервер находятся на одной машине, то замените на «localhost», иначе замените на адрес сервера с базой данных. * 'user' – замените на логин пользователя базы данных. * 'password' – замените на пароль пользователя базы данных. * 'BD' – замените на название базы данных (по умолчанию Production). 3. Сохраните изменения 4. Откройте в текстовом редакторе файл /admin/config.php. 5. Добавьте пользователей панели управления. Шаблонный пример: $buffer['admin'] = ['password'=>'111','level'=>255]; В данной строке в массив buffer по индексу ‘admin’ вносится массив с паролем ‘12345’ и уровнем доступа ‘255’. Индекс – имя пользователя. Уровень доступа указывает к каким функциям пользователь имеет доступ: **"1"** – только внесение новых данных. **"2"** – внесение новых данных и данных калибровки и адресов датчиков. **"127"** – добавление и редактирование объектов, операторов и приборов. **"255"** – Полный доступ. 6. Сохраните изменений 7. Загрузите изменённые файлы в директорию сайта. ====== Проверка системы ====== Для проведения проверки системы рекомендуется внести данные в ручном режиме через веб-интерфейс, или же провести тестовую передачу данных с устройства. После выполнение внесения данных, проверьте хранимые данные SQL запросом: SELECT sd.Num as Num,sd.Type as Type,sd.Value as Value,li.Date as Date,li.uid as Unit FROM save_data sd INNER JOIN ( SELECT Num_i as Num, Date, ul.uname as uid FROM info inf INNER JOIN ( SELECT uNum,uName as uname FROM units_list) as ul ON inf.Prib_id = ul.uNum ORDER BY inf.Num_i DESC) as li ON li.Num = sd.Num ====== Сообщения системному программисту ====== При запуске инициализации системы безопасности MySQL будут заданы вопросы: ---- «Enter current password for root (enter for none)». Нажмите Enter, текущий пароль root пустой. ---- «Set root password? [Y/n]». Введите Y. Да, установить пароль root для подключения к MariaDB. Теперь введите «новый» пароль root. ---- «Remove anonymous users? [Y/n]». Введите Y. Удалить анонимного пользователя. ---- «Disallow root login remotely? [Y/n]». Введите Y. Запретить подключаться под пользователем root к MariaDB с удаленных машин. ---- «Remove test database and access to it? [Y/n]». Введите Y. Удалить тестовую базу test. ---- «Reload privilege tables now? [Y/n]». Введите Y. Перезагрузить таблицу привилегий для вступления их в силу. ====== ПРИЛОЖЕНИЕ 1 ====== ===== Структура базы данных ===== Для хранения данных используется следующая структура базы данных: 1. **opr_list(N, Name)** – таблица содержащая данные о операторах. *Столбцы: ***N** – уникальный номер оператора(id). ***Name** – имя оператора. 2. **objects(NumOb, NameOb)** – таблица содержащая данные о объектах размещения приборов. *Столбцы: ***NumOb** – уникальный номер объекта размещения(id). ***NameOb** – наименование объекта размещения. 3. **units_list(uNum, uName, Serial, AKey, OPid, x, y, IDob)** – таблица со-держащая данные о используемых приборах. *Столбцы: ***uNum** – уникальный номер прибора(id). ***uName** – наименование прибора. ***Serial** – серийный номер прибора. ***AKey** – ключ доступа прибора (используется для идентификации при-бора при передаче данных). ***OPid** – уникальный номер оператора (берётся из таблицы OPR_list). ***x** – координата размещения прибора Х. ***y** – координата размещения прибора У. ***IDob** – уникальный номер объекта размещения (берётся из таблицы Objects) 4. **info(Num_i, Date, Prib_id, OpNum, ObjectId, x, y)** – таблица содержащая данные о сессиях передачи данных. *Столбцы: ***Num_i** – номер сессии передачи данных. ***Date** – временной штамп сессии передачи данных. ***Prib_id** – уникальный номер прибора передавшего данные (берётся из units_list) ***OpNum** – уникальный номер оператора, закреплённого к прибору на момент сессии передачи данных (берётся из OPR_list) ***ObjectId** – уникальный номер объекта размещения, где располагался прибор на момент сессии передачи данных. ***x** – координата X размещения прибора на объекта размещения, на момент сессии передачи данных. ***y** – координата Y размещения прибора на объекте размещения, на момент сессии передачи данных. 5. **save_data(Num, Type, Value)** – таблица содержащая данные, полученные в процессе сессии передачи данных. *Столбцы: ***Num** – номер сессии, в процессе которой были переданы данные. ***Type** – вид параметра, данные измерения которого были переданы. ***Value** – значение данных для замеряемого параметра. 6. **multiplier(unit, sensor, timestamp, ratio)** – таблица содержащая калибровочные данные датчиков. *Столбцы: ***unit** – уникальный номер прибора на котором установлен калибруемый датчик. ***sensor** – наименование датчика, параметр, если он снимает несколько параметров, а так же номер датчика, если их несколько в одном приборе ***timestamp** – временная привязка данных калибровки ***ratio** – данные калибровки. 7. **sensors_adr(id, unit_id, sensor, adr, timestamp, sensor_name, note)** – таблица содержащая адреса датчиков. *Столбцы: ***id** – уникальный номер записи ***unit_id** – уникальный номер прибора на котором установлен датчик ***sensor** – полное название параметра передаваемого датчиком ***adr** – адрес датчика ***timestamp** – время внесения данных ***sensor_name** – короткое наименование параметра ***note** – заметка о датчике и его применение Далее представлена структура базы данных и взаимосвязь таблиц на рисунке 1. {{:doc:1513:bd_after.png?nolink|}} === Рисунок 1. === ---- ===== SQL запрос, для загрузки в новую базу данных созданной структуры ===== SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for info -- ---------------------------- DROP TABLE IF EXISTS `info`; CREATE TABLE `info` ( `Num_i` int(1) UNSIGNED NOT NULL AUTO_INCREMENT, `Date` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, `Prib_id` tinyint(1) UNSIGNED NOT NULL, `OpNum` tinyint(1) UNSIGNED NOT NULL, `ObjectId` tinyint(1) UNSIGNED NOT NULL, `x` float(10, 5) NOT NULL, `y` float(10, 5) NOT NULL, PRIMARY KEY (`Num_i`) USING BTREE, UNIQUE INDEX `Number_id_index`(`Num_i`) USING BTREE, INDEX `date_index`(`Date`) USING BTREE, INDEX `Unit_index`(`Prib_id`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for multiplier -- ---------------------------- DROP TABLE IF EXISTS `multiplier`; CREATE TABLE `multiplier` ( `unit` tinyint(1) NOT NULL, `sensor` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `timestamp` datetime(0) NOT NULL, `ratio` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `adr` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, INDEX `Unit_index_multip`(`unit`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for objects -- ---------------------------- DROP TABLE IF EXISTS `objects`; CREATE TABLE `objects` ( `NumOb` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `NameOb` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`NumOb`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for opr_list -- ---------------------------- DROP TABLE IF EXISTS `opr_list`; CREATE TABLE `opr_list` ( `N` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`N`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for save_data -- ---------------------------- DROP TABLE IF EXISTS `save_data`; CREATE TABLE `save_data` ( `Num` int(1) UNSIGNED NOT NULL, `Type` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `Value` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, INDEX `Num_ses`(`Num`) USING BTREE, INDEX `Type_value_index`(`Type`, `Value`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for sensors_adr -- ---------------------------- DROP TABLE IF EXISTS `sensors_adr`; CREATE TABLE `sensors_adr` ( `id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `unit_id` tinyint(1) UNSIGNED NOT NULL, `sensor` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `adr` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `timestamp` datetime(0) NOT NULL, `sensor_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; -- ---------------------------- -- Table structure for units_list -- ---------------------------- DROP TABLE IF EXISTS `units_list`; CREATE TABLE `units_list` ( `uNum` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `uName` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `Serial` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `AKey` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `OPid` tinyint(1) UNSIGNED NOT NULL, `x` float(10, 5) NOT NULL, `y` float(10, 5) NOT NULL, `IDob` tinyint(1) UNSIGNED NOT NULL, `remove` bit(1) NOT NULL, PRIMARY KEY (`uNum`) USING BTREE, UNIQUE INDEX `Units`(`uNum`, `uName`) USING BTREE ) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page; SET FOREIGN_KEY_CHECKS = 1;