Всем привет!
В предыдущей заметке об установке Home Assistant в операционной системе FreeBSD в конце материала я упомянул о «как это все убрать за NGINX с бесплатными сертификатами от Let’s Encrypt» и дабы не затягивать решил побыстрее об этом написать:)
Как и в прошлом материале мы будем использовать систему FreeBSD, но рецепт универсален кроме установки программ, поэтом его можно использовать в различных операционных системах включая Windows:-)
Я считаю, что Home Assistant и NGINX установлены на одном хосте, в принципе ничего вам не мешает разнести их по разным хостам.
В данном примере рассмотрим пошаговую настройку связки NGINX и Home Assistant, поэтом первым делом делаем запись в DNS обслуживающий наш домен о хосте по типу:
hass A 123.123.123
Получив имя третьего уровня, в примерах конфигурационных файлов будет указано как hass.mydomain.ru.
Ставим нужный нам софт, будем ставить через pkg.
# pkg install py37-certbot nginx
Разрешаем запуск NGINX:
# echo nginx_enable=\"YES\" >> /etc/rc.conf
Создадим две директории (первая для хранения конфигураций виртуальных web-серверов, вторая будет корневой папкой для hass.mydomain.ru):
# mkdir /usr/local/etc/nginx/conf.d /usr/local/www/hass # chown www:www /usr/local/www/hass
Сразу создадим директорию для web логов для hass.mydomain.ru:
# mkdir /var/log/nginx/hass
Укажем NGINX обрабатывать конфигурационные файлы из созданной нами директории:
# vi /usr/local/etc/nginx/nginx.conf
В низу файла (на самом деле не принципиально где:)) перед закрывающей фигурной скобкой впишем:
include /usr/local/etc/nginx/conf.d/*.conf;
Тем самым мы подключаем все файлы с расширением .conf из директории /usr/local/etc/nginx/conf.d
Создадим конфигурационный файл виртуального web-сервера:
# vi /usr/local/etc/nginx/conf.d/hass.mydomain.conf
server { listen 80; server_name hass.mydomain.ru; root /usr/local/www/hass/; access_log /var/log/nginx/hass/access.log; error_log /var/log/nginx/hass/error.log error; location / { proxy_pass http://127.0.0.1:8123; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /.well-known/ { root /usr/local/www/hass/; } }
Проверим конфиг NGINX на корректность:
# nginx -t nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Укажем Нome Assistant поднимать web-интерфейс на localhost:
# /usr/local/etc/rc.d/hass stop # vi /home/hass/.homeassistant/configuration.yaml
http: server_host: 127.0.0.1
Запустим Hоme Assisitant и проверим верна ли наша настройка:
# /usr/local/etc/rc.d/hass start # sockstat | grep 8123 hass python3.7 2255 36 tcp4 127.0.0.1:8123
Запустим NGINX:
# /usr/local/etc/rc.d/nginx start
Заходим через браузер по адресу http://hass.mydomain.ru, авторизуемся и если все в порядке, то идем дальше, если нет, то сверяем конфиги (по данному how-to были осуществлены две успешных инсталляции).
Получаем сертификат от Let’s Encrypt, указав корневую директорию web-сервера (-w) и имя домена (-d):
# certbot-3.7 certonly -w /usr/local/www/hass/ -d hass.mydomain.ru
На вопрос о методе аутентификации — выбираем второй вариант с помещением файла в корневую директорию сервера:
How would you like to authenticate with the ACME CA? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: Spin up a temporary webserver (standalone) 2: Place files in webroot directory (webroot) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Получаем поздравление:
/usr/local/etc/letsencrypt/live/hass.maydomain.ru/fullchain.pem
Your key file has been saved at:
/usr/local/etc/letsencrypt/live/hass.maydomain.ru/privkey.pem
Your cert will expire on 2020-08-16.
Перенастроим NGINX для ssl соединения с выданным нам сертификатом:
# vi /usr/local/etc/nginx/conf.d/hass.mydomain.conf
server { listen 80; server_name hass.mydomain.ru; return 301 https://$server_name$request_uri; } server { listen 443 ssl; root /usr/local/www/hass/; server_name hass.mydomain.ru; access_log /var/log/nginx/hass/access.log; error_log /var/log/nginx/hass/error.log error; ssl_certificate /usr/local/etc/letsencrypt/live/hass.mydomain.ru/fullchain.pem; ssl_certificate_key /usr/local/etc/letsencrypt/live/hass.mydomain.ru/privkey.pem; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; location / { proxy_pass http://127.0.0.1:8123; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /.well-known/ { root /usr/local/www/hass/; } }
Проверим корректность настройки NGINX:
# nginx -t nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Перезагрузим конфигурацию NGINX:
# nginx -s reload
В последней конфигурации NGINX мы указали редирект на https соединение:
return 301 https://$server_name$request_uri;
Заходим на hass.mydomain.ru, если все правильно сделали, то соединение будет защищенным:
Сертификат нам выдали на срок 3 месяца, добавим задание в corntab для автоматической пролонгации сертификата:
# crontab -e
#SSL Renew 2 */12 * * * /usr/local/bin/certbot renew -q && nginx -s reload
Что даст нам проверку сертификатов два раза в день и перезагрузку конфигурации NGINX, без которой NGINX не увидит новых сертификатов после их обновления.
На этом вроде все:)
Блеск, идеально. Долго не мог разобраться с ошибками после создания прокси, но ваш набор параметров proxy_* из location сработал идеально. Подходит в том числе и для dsm synology