Инструменты пользователя

Инструменты сайта


doc:1513:643.mgul.15131-01_32_01

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
doc:1513:643.mgul.15131-01_32_01 [2019/06/20 04:14]
deimozzz создано
doc:1513:643.mgul.15131-01_32_01 [2019/07/21 12:09] (текущий)
deimozzz [5 Обязательные изменения в текстах программ]
Строка 3: Строка 3:
 В данном программном документе приведено руководство системного программиста по установке и настройке системы сбора, обработки и хранения результатов измерений (далее система),​ предназначенной для сохранения и предоставления любых переданных данных,​ а в частности – с учебных устройств,​ разработанных на кафедре ПМиВТ МФ МГТУ им. Н. Э. Баумана. В данном программном документе приведено руководство системного программиста по установке и настройке системы сбора, обработки и хранения результатов измерений (далее система),​ предназначенной для сохранения и предоставления любых переданных данных,​ а в частности – с учебных устройств,​ разработанных на кафедре ПМиВТ МФ МГТУ им. Н. Э. Баумана.
  
 +====== Общие сведения о системе ======
 +
 +
 +Функциональным назначением системы является приём, сохранение и предоставление данных,​ полученных в процессе проведения замеров.
 +Основные функции системы состоят в приёме и обработке данных JSON формата,​ сохранение и предоставлении по запросу,​ для последующей обработкой операторами.
 +Для функционирования системы требуется серверная операционная си-стема,​ система управления базами данных,​ веб-сервер с поддержкой языка программирования PHP 7.2 и программный код.
 + 
 +====== Структура системы ======
 +
 +
 +Система сбора, обработки и хранения результатов измерений состоит из комплекса программного обеспечения,​ необходимого для её выполнения. На серверной операционной системе запущен веб-сервер,​ ожидающий HTTP запроса. При вхождение запроса выполняется сценарий,​ зависящий от вызываемого при запросе файла.
 +
 +====== Настройка системы ======
 +
 +Подготовка системы к работе делится на несколько этапов,​ выполнение которых будет рассматриваться на примере системы GNU/Linux Debian 9. 
 +
 +===== 1 Создание базы данных =====
 +
 +==== Установка СУБД MariaDB ====
 +
 +
 +Обновите базу пакетов
 +<​code>​$ apt-get update</​code>​
 +Найдите нужный пакет
 +   $ 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
 +Вставьте в созданный файл конфигурации следующие настройки:​
 +<​code><​VirtualHost *:80>
 +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
 +
 +<​Directory /​var/​www/​site.ru>​
 +Options ExecCGI
 +</​Directory>​
 +</​VirtualHost></​code>​
 +
 +Сохраните файл и включите сайт.
 +  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
 +Проверьте,​ чтобы весь раздел <​Anonymous>​ был закомментирован.
 +
 +
 +==== 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. Добавьте пользователей панели управления.
 +
 +Шаблонный пример:​
 +<​code>​$buffer['​admin'​] = ['​password'​=>'​111','​level'​=>​255];​ </​code> ​
 +В данной строке в массив buffer по индексу ‘admin’ вносится массив с паролем ‘12345’ и уровнем доступа ‘255’. Индекс – имя пользователя. Уровень доступа указывает к каким функциям пользователь имеет доступ:​
 +
 +**"​1"​** – только внесение новых данных.
 +
 +**"​2"​** – внесение новых данных и данных калибровки и адресов датчиков.
 +
 +**"​127"​** – добавление и редактирование объектов,​ операторов и приборов.
 +
 +**"​255"​** – Полный доступ.
 +
 +6. Сохраните изменений
 +
 +7. Загрузите изменённые файлы в директорию сайта.
 +
 +
 +====== Проверка системы ======
 +
 +Для проведения проверки системы рекомендуется внести данные в ручном режиме через веб-интерфейс,​ или же провести тестовую передачу данных с устройства. После выполнение внесения данных,​ проверьте хранимые данные SQL запросом: ​
 +<​code>​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</​code>​
 +
 +====== Сообщения системному программисту ======
 +
 +При запуске инициализации системы безопасности 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 запрос,​ для загрузки в новую базу данных созданной структуры =====
 +
 +<file sql inject.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;
 +
 +</​file>​
doc/1513/643.mgul.15131-01_32_01.1560993288.txt.gz · Последние изменения: 2019/06/20 04:14 — deimozzz