Здравствуйте! За 3 года эксплуатации MD на raspberry я немного устал менять SD карты и перенастраивать систему с нуля. Почему с нуля, да потому, что восстановление backup перестал работать. Обращаясь за консультацией решения моих ошибок в системе MD реакция гуру на использование raspbery совместно с SD картой, мягко говоря отвратительная. Поэтому я решил установить сервер MajorDoMo с самого начала на старенький ноутбук без GUI. Чиcтую debian-11. Поэтому по мере установки я буду конспектировать все действия которые мне пришлось проделать в момент установки и настройки сервера. Я надеюсь, что мои читатели умеют устанавливать linux на свои машины, поэтому я перейду сразу к установке и настройки системы в целом. Так как мне удобнее использовать SSH то в момент установки linux я поставил галочку для установки SSH подключения. Так же я установил галочку напротив WEB сервера и установка стандартных системных утилит. Я не буду расписывать какая команда за что отвечает так как сам многое не знаю, но я буду рассказывать своими словами, что я делаю, поэтому прошу всех специалистов linux не пинать меня а поправить, обещаю исправить неточности на которые вы укажите.
Подключаемся к серверу по SSH
Определяем наш текущий IP
ip addr show
Получаем примерно такой результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
dima@MD:~$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp3s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:03:25:54:85:d8 brd ff:ff:ff:ff:ff:ff inet 192.168.1.111/24 brd 192.168.1.255 scope global dynamic enp3s8 valid_lft 81649sec preferred_lft 81649sec inet6 fdbc:e265:299e:1400:203:25ff:fe54:85d8/64 scope global dynamic mngtmpaddr valid_lft 7185sec preferred_lft 3585sec inet6 fe80::203:25ff:fe54:85d8/64 scope link valid_lft forever preferred_lft forever 3: wlx001644a7e74b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:16:44:a7:e7:4b brd ff:ff:ff:ff:ff:ff |
Устанавливаем статический IP
Редактируем файл настроек сети
sudo nano /etc/network/interfaces
скорее всего у вас будет ошибка – “-bash: sudo: команда не найдена”. Исправляется она установкой sudo вот этой командой из под root.
apt install sudo
далее повторяем редактирование файла настроек сети командой:
sudo nano /etc/network/interfaces
Меняем параметр dhcp на static, и дописываем параметры сети
1 2 3 4 5 6 7 8 |
iface enp3s8 inet static address 192.168.1.15 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.255.255 gateway 192.168.1.1 dns-nameservers 192.168.1.1 #dns-nameservers 8.8.8.8 8.8.4.4 |
Перезапускаем сеть:
systemctl restart networking
Если сетевой интерфейс не поднялся, выполняем команду:
sudo ifup enp0s3
Ну а теперь можно и обновиться:
sudo apt update && sudo apt upgrade
Настройка WEB сервера
Далее нужно установить WEB сервер, Apache. Но я при установке linux оставил галочки на WEB сервер. Если вы сделали так же то проверьте установлен у вас сервер или нет. Сделать это можно двумя способами.
- вводим команду sudo httpd -v или: sudo apache2 -v Пример вывода: Server version: Apache/2.4.38 (Debian)
Server built: 2021-12-21T16:50:43 - Заходим в браузер и вводим IP вашего сервера. Вы должны получить страницу такого плана:
Всё же настройка WEB сервера необходима. Приступим:
запретим вывод версии Apache. Для этого откроем в редакторе Nano файл по пути:
sudo nano /etc/apache2/conf-enabled/security.conf
находим:
1 |
ServerTokens OS |
меняем на это:
1 |
ServerTokens Prod |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Далее вносим изменения в его конфигурационный файл.
sudo nano /etc/apache2/sites-available/000-default.conf
Я просто удалил все записи из конфигурационного файла, и вставил в него следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<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> |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Изменим следующий конфигурационный файл:
sudo nano /etc/apache2/apache2.conf
В самом его конце добавим вот такую строку:
1 |
ServerName localhost |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Перезагрузим Apache:
sudo apache2ctl restart
Устанавливаем PHP:
Для установки языка программирования PHP вводим следующую команду:
sudo apt-get install php php-cgi php-cli php-pear php-mysql php-mbstring php-xml -y
Устанавливаем CURL и его библиотеки:
sudo apt-get install curl libcurl4 libcurl3-dev php-curl -y
Устанавливаем PHP-модуль для веб-сервера Apache 2:
sudo apt-get install libapache2-mod-php -y
Включаем конфигурацию php7.3-cgi следующей командой:
sudo a2enconf php7.4-cgi
Перезапускаем сервис Apache:
sudo service apache2 reload
В редакторе nano создаем файл index.php в папке /var/www/html/
sudo nano /var/www/html/index.php
Вводим в созданный файл следующие строки:
1 2 3 4 5 6 7 8 9 |
<html> <body> <div style="width: 100%; font-size: 40px; font-weight: bold; text-align:center;"> <?php print Date("Y/m/d"); ?> </div> </body> </html> |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
В этой же папке у нас находится файл index.html. Удалим его командой:
sudo rm /var/www/html/index.html
Включаем работу коротким тегом <? /?> (для последних версий Apache). Для этого редактируем файл php.ini в папке /etc/php/7.3/apache2/
sudo nano /etc/php/7.4/apache2/php.ini
находим строчку:
1 |
short_open_tag = Off |
и меняем на:
1 |
short_open_tag = On |
Если такой строчки нет, то просто вставляем в конце файла:
1 |
short_open_tag = On |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Если этот этап пройден тогда переходим к установке MySQL
Устанавливаем MySQL:
На момент написания я использовал вот эту команду для установки MySQL:
sudo apt-get install mariadb-server-10.5 mariadb-client-10.5 -y
Далее необходимо сделать первоначальную конфигурацию MySQL сервера. К этой процедуре нужно отнестись более внимательно и обязательно нужно записать данные которые вы сейчас будете вводить.
Вводим в командную строку следующее:
sudo mysql_secure_installation
- Так как мы только что установили MySQL, пароля у нас нет, он пустой. На этом шаге просто нажимаем Enter.
- Далее нам будет предложено изменить этот пароль. Нажимаем Y и вводим пароль (ЗАПИСЫВАЕМ ЕГО!!!)
- После ввода пароля нам будет предложено его повторить. Повторяем. Обратите внимание на то, что при вводе пароля на экране ничего не буде происходить, символов, звёздочек, подчёркиваний вы не уведите.
- Далее нам буде предложено удалить анонимного пользователя который был создан при установке MySQL в тестовых целях. Соглашаемся введя буку Y.
- Далее скрипт предложит запретить вход в систему удаленно.
Вводим букву Y. -
На следующем шаге скрипт предлагает удалить тестовую базу данных: Соглашаемся Y.
- Далее будет предложено сохранить внесенные в скрипт изменения:
Здесь вводим Y, после чего происходит выход из скрипта и возвращение к командной строке.
Вот и вся предварительная настройка MySQL.
Правим конфигурационный файл 50-server.cnf
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Найдем в этом файле строчку:
1 |
character-set-server = utf8mb4 |
и поменяем ее на следующую:
1 |
character-set-server = utf8 |
Перед строчкой, которая следует сразу же за только что поменянной, поставим знак решетки # (закомментируем), она должна принять следующий вид:
1 |
#collation-server = utf8mb4_general_ci |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Устанавливаем PhpMyAdmin:
Сначала необходимо добавить две ссылки в репозиторий.
nano /etc/apt/sources.list
вставляем в этот файл эти ссылки:
1 2 |
deb http://deb.debian.org/debian/ stretch main contrib non-free deb-src http://deb.debian.org/debian/ stretch main contrib non-free |
После этого обновите репозиторий командой
PhpMyAdmin — это веб-приложение, которое позволяет через браузер осуществлять администрирование сервера MySQL. Устанавливается оно командой:
sudo apt-get install phpmyadmin php-mbstring php-gettext -y
В процессе установки нам нужно будет ответить на ряд вопросов. Сначала нам будет предложено выбрать версию web-сервера:
Поскольку у нас установлен Apache, то выбираем пункт apache2, нажимаем пробел (чтобы в выбранном пункте отобразилась звездочка), и нажимаем Enter.
Далее нам будет предложено сконфигурировать базы данных при помощи «dbconfig-common»: Здесь мы выбираем Нет!
Далее в браузере проверьте работу PhpMyAdmin. Введите адрес
Введите логин «root» и пароль который вы установили при установке MYSQL. Если у вас появилась ошибка #1698 — Access denied for user ‘root’@’localhost’ тогда вам нужно сделать следующее:
Для получения доступа к базе данных MySQL/MariaDB обычному пользователю без использования sudo привилегий, зайдите в приглашение командной строки MySQL
sudo mysql
и запустите следующие команды:
1 2 3 4 |
use mysql; update user set plugin='' where User='root'; flush privileges; exit |
После ввода последней команды происходит выход из командной строки MySQL.
Далее нам нужно подправить конфигурационный файл apache.conf
sudo nano /etc/phpmyadmin/apache.conf
В открывшемся файле, после строчки DirectoryIndex index.php вставляем строчку:
1 |
Require ip 127.0.0.1 192.168.1.1/24 |
В этой строчке ip 127.0.0.1 оставляем неизменным, а 192.168.1.0 меняем на ip вашей сети. Адрес моей сети 192.168.1.1
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Включаем mod_rewrite:
mod_rewrite — один из самых часто используемых модулей веб-сервера Apache. Этот модуль предоставляет гибкий и мощный способ манипулирования URL-адресами, используя неограниченное количество правил. Включается он следующей командой:
sudo a2enmod rewrite
Перезагрузим Apache:
sudo apache2ctl restart
Настройка PHP:
Вносим одинаковые изменения в два конфигурационных файла. Сначала мы внесем изменения в файл находящийся по пути /etc/php/7.4/apache2/php.ini
sudo nano /etc/php/7.4/apache2/php.ini
ищем в этом файле строку error_reporting, и приводим ее к следующему виду:
1 |
error_reporting = E_ALL & ~E_NOTICE |
Так же меняем:
max_execution_time — значение 30 меняем на 90
max_input_time — значение 60 меняем на 180
post_max_size — значение 8M меняем на 200M
upload_max_filesize — значение 2M меняем на 50M
max_file_uploads — значение 20 меняем на 150
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Внесем точно такие же изменения в конфигурационный файл, находящийся по пути /etc/php/7.4/cli/php.ini
sudo nano /etc/php/7.4/cli/php.ini
Вносим изменения которые находятся выше.
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Для применения всех изменений нам снова нужно перезапустить Apache
sudo /etc/init.d/apache2 restart
На этом установку и настройку Web-сервера можно считать законченной.
Создание базы данных.
Открывfем любой браузер и вводим IP адрес нашего сервера следующего формата http://IP_адрес_сервера/phpmyadmin где IP_адрес_сервера — это ip адрес вашей малинки. В моём случае 192.168.1.111
попадаем вот на такую форму ввода. Так как я уже создал базу данных то скриншоты будут немного отличаться от тех которые будете видеть вы на своих экранах. Имейте это в виду при дальнейшем ознакомлении со статьёй.
Вводим пользователя root пароль тот (rootpsw), который мы создали и запомнили при установке MySQL. Нажимаем кнопку Вперед, и попадаем в панель управления PhpMyAdmin: Теперь нам нужно создать базу данных db_terminal. Чтобы ее создать, нажимаем «Создать БД» в левой части окна. Затем, в поле Имя базы данных вводим db_terminal и нажимаем кнопку Создать:
После нажатия кнопки Создать, мы переходим в созданную нами базу данных db_terminal.
В верхней части окна ищем кнопку Импорт, и нажимаем её.
И вот тут возникнут проблемы. Но решаются они довольно таки просто. От вас требуется максимум внимания и концентрации. Но только на этом этапе. И так о каких же проблемах я говорю, об ошибках которые посыплются на вас в огромном количестве в виде так называемой «красной простыни» Я не могу точно передать суть ошибки но вы должны посмотреть на строчку примерно вот такого вида:
1 2 |
Warning in ./libraries/sql.lib.php#601 count(): Parameter must be an array or an object that implements Countable |
Вас должно интересовать номер строки который указан после знака #. В нашем случае это строка с номером #601 (у меня была строка с номером 551). Номер строки с указанием на ошибку может быть разный. Наша задача открыть файл в редакторе nano и найти там нужную строчку. И так поехали исправлять:
sudo nano /usr/share/phpmyadmin/libraries/sql.lib.php
Нажимаем комбинацию клавиш Ctrl+W (это поиск по файлу) вставляем в строку поиска вот это:
1 |
|| (count($analyzed_sql_results['select_expr'] == 1) |
нажимаем enter и переходим на начало искомой строки. Далее мы её редактируем что бы получилось вот такая строка:
1 |
|| ((count($analyzed_sql_results['select_expr']) == 1) |
Обратите внимание на скобки.
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
И так первый файл мы изменили. Теперь нам нужно изменить ещё один файл.
sudo nano /usr/share/phpmyadmin/libraries/plugin_interface.lib.php
Точно так же нажимаем комбинацию клавиш Ctrl+W вставляем в строку поиска вот это:
1 |
if ($options != null && count($options) > 0) { |
нажимаем enter и так же переходим на начало искомой строки. Далее мы её редактируем что бы получилось вот такая строка:
1 |
f ($options != null && count((array) $options) > 0) { |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Вот и всё. Ах да, для чего же нам нудно было знать номер строки указанной в ошибке. Да просто. В ваших файлах может быть добавлен какой то пробел лишний или что то в этом роде и поиском который я описал по комбинации клавиш Ctrl+W вы просто не смогли бы найти нужную строчку. А так можно открыть редактируемый файл в любом текстовом редакторе где отображается номер строки, найти визуально эту строчку и сделать изменения.
Ну да ладно, продолжаем далее настраивать наш сервер. В верхней части окна ищем кнопку Импорт, и нажимаем её.
Теперь нам нужен сам файл базы данных db_terminal.sql, из которого мы импортируем все данные. Скачаем дистрибутив MajorDomo на свой компьютер и разархивируем его. Нажимаем кнопку Обзор: и выбираем из распакованного архива вот этот файл db_terminal.sql. Перематываем это окно в самый низ, и нажимаем кнопку Вперед. Всё, наша база данных заполнилась нужными таблицами.
Установка MajorDoMo
Создадим папку в которой будет находиться наш MajorDoMo.
sudo mkdir /home/majordomo
переходим в эту папку:
cd /home/majordomo
Скачиваем дистрибутив MajorDoMo c githab.
sudo wget https://github.com/sergejey/majordomo/archive/master.zip
распакуем дистрибутив командой:
sudo unzip master.zip
Далее переносим распакованную систему MajorDomo в директорию Web-сервера командой:
sudo cp -rp /home/majordomo/majordomo-master/* /var/www
Теперь надо скопировать и скрытый файл .htaccess. Указываем его явно:
sudo cp -rp /home/majordomo/majordomo-master/.htaccess /var/www
Далее настраиваем права пользователей на файлы и директории.
Файлам устанавливаем права 0644
sudo find /var/www/ -type f -exec chmod 0644 {} \;
Директориям даём права 0755
sudo find /var/www/ -type d -exec chmod 0755 {} \;
Проверяем как распределились права:
ls -lh /var/www
должно быть так:
MajorDoMo (а именно сервисы: apache и php) работает от пользователя www-data. Права доступа к каталогу /var/www, где лежат файлы Majordomo по умолчанию принадлежат root. Изменим владельца директории /var/www на www-data при помощи следующей команды:
sudo chown -R www-data:www-data /var/www
Далее даём доступ пользователю www-data к медиа устройствам. Для этого добавляем его в группу audio.
sudo usermod -a -G audio www-data
Проверить, что пользователь www-data появился в группе audio можно командой:
cat /etc/group | grep audio
Правка основного конфигурационного файла MajorDoMo
Переходим в терминал или PuTTY и поехали далее:
sudo cp /var/www/config.php.sample /var/www/config.php
Далее пользователя www-data нужно сделать владельцем конфигурационного файла config.php
sudo chown www-data: /var/www/config.php
файл config.php в редакторе Nano
sudo nano /var/www/config.php
Прописываем имя пользователя и пароль в нужных строчках:
DB_USER — это пользователь
DB_PASSWORD — пароль
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Основной цикл
Создадим файл описание сервиса для запуска основного цикла системы.
sudo nano /etc/systemd/system/majordomo.service
Заполним его вот этим кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[Unit] Description=MajorDomo daemon Requires=network.target After=dhcpcd.service [Install] WantedBy=default.target [Service] Type=simple ExecStart=/usr/bin/php /var/www/cycle.php execStop=/usr/bin/pkill -f cycle_* User=www-data Group=www-data KillSignal=SIGKILL KillMode=control-group RestartSec=1min Restart=on-failure |
Сохраним изменения Ctrl+O, Enter, Ctrl+X, Enter.
Отключаем режим «Strict mode» для MySQL. Для этого создадим конфигурационный файл:
sudo nano /etc/mysql/conf.d/disable_strict_mode.cnf
Заполняем его этими двумя строками:
1 2 |
[mysqld] sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
Добавляем главный цикл в автозагрузку.
sudo systemctl enable majordomo
Запускаем основной цикл системы:
sudo systemctl start majordomo
Перезапускаем наш Raspberry:
sudo reboot
Переключаемся на наш браузер и вводим адрес нашего сервера «Безумного дома». Радуемся и читаем в моих статьях как же теперь из этого сервера сделать классные вещи!.
Теперь нужно сделать последний штрих – установить MQTT брокер. Без него многие устройства системы работать не смогут.
Установка MQTT брокера
sudo apt update
Чтобы установить Mosquitto, введите:
sudo apt install mosquitto mosquitto-clients
По умолчанию в Debian сервис Mosquitto запускается сразу после установки. Давайте проверим стандартные настройки программы. Для этого нужно подписаться на тему с помощью одного из клиентов Mosquitto.
Темы – это такие метки, которые присваиваются опубликованным сообщениям и на которые можно подписываться. Они организованы в иерархию (например, sensors/outside/temp или sensors/outside/humidity). Упорядочивание тем полностью зависит от ваших требований.
Откройте новую сессию терминала, в результате у вас должно быть два терминала. Запустите в новом терминале команду mosquitto_sub, чтобы подписаться на тему:
1 |
mosquitto_sub -h localhost -t test |
Флаг –h указывает имя хоста сервера MQTT, флаг -t – тему. После запуска команды на экране не появится вывода, поскольку mosquitto_sub ждет получения сообщений. Вернитесь в первый терминал и опубликуйте сообщение:
1 |
mosquitto_pub -h localhost -t test -m "hello world" |
Команда mosquitto_pub использует те же флаги, что и mosquitto_sub, но в этот раз нужен дополнительный флаг –m (он позволяет ввести текст сообщения). Нажмите Enter, и вы увидите в другом терминале ваше MQTT-сообщение «hello world».
Введите во втором терминале CTRL+C, чтобы остановить mosquitto_sub, но не прерывайте подключения (оно понадобится нам позже).
Далее в конфиг файле добавляем следующие строки:
sudo nano /etc/mosquitto/mosquitto.conf
1 2 |
listener 1883 allow_anonymous true |
Должно быть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example listener 1883 allow_anonymous true pid_file /run/mosquitto/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d |
Перегружаемся:
sudo systemctl restart mosquitto
Теперь нужно настроить парольную аутентификацию.
Настройка пароля MQTT
Mosquitto предоставляет утилиту mosquitto_passwd для создания файла паролей. Эта команда предложит ввести пароль для указанного пользователя и поместит его в файл /etc/mosquitto/passwd.
sudo mosquitto_passwd -c /etc/mosquitto/passwd 8host
Откройте конфигурации Mosquitto и добавьте в них информацию о новом файле:
sudo nano /etc/mosquitto/conf.d/default.conf
На экране появится пустой файл. Введите в него:
1 2 |
allow_anonymous false password_file /etc/mosquitto/passwd |
В конце файла нужно обязательно оставить пустую строку.
Строка allow_anonymous false блокирует анонимных пользователей. Строка password_file задает путь к файлу паролей. Сохраните и закройте файл.
Теперь нужно перезапустить Mosquitto и проверить новые настройки:
sudo systemctl restart mosquitto
Попробуйте опубликовать сообщение без пароля:
mosquitto_pub -h localhost -t “test” -m “hello world”
Сервер должен отклонить его:
Connection Refused: not authorised.
Error: The connection was refused.
Прежде чем снова попробовать отправить сообщение, перейдите во второй терминал и подпишитесь на тему test, на этот раз указав имя пользователя и пароль:
mosquitto_sub -h localhost -t test -u “8host” -P “password”
После того, как подключение будет создано, брокер будет ждать сообщений. Вы можете оставить этот терминал открытым до конца мануала, так как мы будем периодически отправлять туда тестовые сообщения.
Вернитесь в первый терминал и опубликуйте сообщение:
mosquitto_pub -h localhost -t “test” -m “hello world” -u “8host” -P “password”
Сообщение появится во втором терминале. Если всё так, настройка пароля Mosquitto прошла успешно.
На данный момент пароли существуют в незашифрованном виде. Чтобы исправить это, нужно настроить Mosquitto для поддержки SSL-шифрования.
Настройка поддержки SSL
Чтобы настроить SSL-шифрование, нужно показать Mosquitto, где хранятся сертификаты Let’s Encrypt. Откройте конфигурационный файл.
sudo nano /etc/mosquitto/conf.d/default.conf
Добавьте в конец файла такие строки, оставив две строки, что мы добавили ранее.
1 2 3 4 5 6 |
. . . listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem |
Теперь файл содержит два отдельных блока listener. Первый, listener 1883 localhost, обновляет прослушиватель MQTT по порту 1883 (стандартный нешифрованный порт MQTT). Часть localhost привязывает этот порт к интерфейсу локального хоста, а значит, к нему не будет внешнего доступа (так или иначе, внешние запросы заблокировал бы брандмауэр).
Строка listener 8883 настраивает зашифрованный прослушиватель по порту 8883. Это стандартный порт MQTT+SSL (что также называется MQTTS). Следующие три строки, certfile, cafile и keyfile указывают Mosquitto путь к файлам сертификата Let’s Encrypt.
Сохраните и закройте файл. Перезапустите Mosquitto:
sudo systemctl restart mosquitto
Откройте порт 8883 в брандмауэре.
sudo ufw allow 8883
Rule added
Rule added (v6)
Создайте ещё одно тестовое сообщение с помощью mosquitto_pub, добавив несколько опций SSL:
mosquitto_pub -h mqtt.example.com -t test -m “hello again” -p 8883 –capath /etc/ssl/certs/ -u “8host” -P “password”
Обратите внимание: вместо localhost здесь используется полное имя хоста. Поскольку сертификат SSL предназначен для домена (в данном случае для mqtt.example.com), при попытке подключиться к localhost вы получите ошибку: ведь имя хоста не совпадает с именем хоста в сертификате (хотя оба они указывают на один и тот же сервер Mosquitto).
Флаг –capath /etc/ssl/certs/ включает SSL для mosquitto_pub и сообщает, где найти root-сертификаты. Обычно они устанавливаются операционной системой, потому путь зависит от ОС. Команда mosquitto_pub проверяет подпись сертификата сервера Mosquitto. Команды mosquitto_pub и mosquitto_sub не смогут создать SSL-соединение без этой опции (или её аналога, –cafile) даже по стандартному порту 8883.
Если все работает правильно, во втором терминале появится сообщение «hello again». Теперь MQTT-сервер полностью готов к работе.
Если вы хотите расширить функции MQTT поддержкой веб-сокетов, следуйте инструкциям следующего раздела.
Поддержка веб-сокетов (опционально)
Для взаимодействия с JavaScript в браузерах протокол MQTT предоставляет поддержку стандартных веб-сокетов. Если эта функция вам не нужна, можете просто не включать ее.
Чтобы включить ее, нужно добавить новый блок listener в настройки Mosqiutto:
sudo nano /etc/mosquitto/conf.d/default.conf
Добавьте в конец файла:
1 2 3 4 5 6 |
. . . listener 8083 protocol websockets certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem |
Этот блок почти такой же, как предыдущие блоки, но в нем указан другой номер порта и есть строка protocol websockets. У MQTT нет стандартного порта для поддержки веб-сокетов, но обычно для этого используется 8083.
Сохраните и закройте файл. Перезапустите сервер:
sudo systemctl restart mosquitto
Откройте порт 8083 в брандмауэре:
sudo ufw allow 8083
Чтобы протестировать новые настройки, используйте открытый MQTT-клиент для браузера (например, Eclipse Paho JavaScript Client). Откройте клиент Paho JavaScript Client в браузере.
На экране появится окно настроек.
Заполните эту форму:
- Host: домен сервера (mqtt.example.com).
- Port: 8083.
- ClientId: можно оставить значение по умолчанию (js-utility-DI1m6).
- Path: можно оставить по умолчанию, /mqtt.
- Username: имя пользователя Mosquitto (в нашем случае 8host).
- Password: ваш пароль.
В остальных полях можно оставить значения по умолчанию.
Нажмите кнопку Connect, после чего клиент Paho подключится к серверу Mosquitto.
Чтобы опубликовать сообщение, перейдите в раздел Publish Message, в Topic введите test, а затем введите любое сообщение в поле Message. Нажмите кнопку Publish. Сообщение появится в терминале mosquitto_sub.