Home Assistant: убираем за NGINX и подключаем сертификаты

Home Assistant

Всем привет!
В предыдущей заметке об установке 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

Получаем поздравление:

— Congratulations! Your certificate and chain have been saved at:
/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, если все правильно сделали, то соединение будет защищенным:
Home Assistant: убираем за NGINX и подключаем сертификатыСертификат нам выдали на срок 3 месяца, добавим задание в corntab для автоматической пролонгации сертификата:

# crontab -e
#SSL Renew
2        */12    *       *       *              /usr/local/bin/certbot renew -q && nginx -s reload

Что даст нам проверку сертификатов два раза в день и перезагрузку конфигурации NGINX, без которой NGINX не увидит новых сертификатов после их обновления.
На этом вроде все:)

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Игорь

    Блеск, идеально. Долго не мог разобраться с ошибками после создания прокси, но ваш набор параметров proxy_* из location сработал идеально. Подходит в том числе и для dsm synology

Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.