MAATRIX / Блог / Как установить и настроить Home Assistant на VPS

Как установить и настроить Home Assistant на VPS

MAATRIX

Home Assistant на Raspberry Pi дома — это удобно, пока роутер не перезагрузится, диск SD-карты не осыплется или не понадобится доступ к дому снаружи без проброса портов через домашний NAT. VPS с белым IP снимает эти проблемы: сервер работает 24/7 в дата-центре, доступен по HTTPS из любой точки мира, а бэкапы можно хранить отдельно от площадки, где стоит "железо". Ниже — рабочая установка Home Assistant в Docker на VPS, с оговоркой сразу: часть интеграций (Zigbee, Z-Wave, Bluetooth-датчики) требует локального USB-стика или отдельного шлюза, и об этом тоже будет отдельный раздел.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что реально даёт VPS для Home Assistant, а что нет

Прежде чем ставить, стоит понять границы подхода — иначе будет разочарование.

VPS хорошо подходит, если ваш умный дом строится на сетевых интеграциях: устройства с Wi-Fi (Shelly, Tasmota, ESPHome по сети), облачные API (Xiaomi Cloud, Tuya, Yandex, погода, календари), MQTT-брокер с устройствами, которые сами стучатся наружу, а также если нужен просто центральный "мозг" для автоматизаций, дашбордов и уведомлений — без прямого физического подключения к радиомодулям.

VPS не подойдёт напрямую, если вам нужен Zigbee/Z-Wave USB-координатор (Conbee, Sonoff Zigbee, Aeotec) — воткнуть USB-стик в облачный сервер физически нельзя. Обходные пути: сетевой Zigbee-координатор вроде SLZB-06, который сам работает по Ethernet/Wi-Fi и общается с Home Assistant по сети (тогда VPS снова в игре), либо локальный хаб дома плюс VPS только как точка внешнего HTTPS-доступа через VPN-туннель.

Дальше — установка полноценного Home Assistant прямо на VPS, для сценария с сетевыми и облачными устройствами.

Выбор конфигурации сервера

Home Assistant Core сам по себе лёгкий, но плагины (интеграции), база данных истории (recorder) и, если добавите, Zigbee2MQTT или Frigate для видео, требования поднимают.

СценарийvCPURAMДискКомментарий
Базовый: 10-30 устройств, без видео1-22 ГБ20-30 ГБ SSDRecorder + пара десятков автоматизаций
Средний: 50+ устройств, MQTT, статистика24 ГБ40 ГБ SSD+ Zigbee2MQTT (через сетевой координатор), Node-RED
С видеоаналитикой (Frigate)48 ГБ80+ ГБ SSDFrigate съедает CPU/RAM заметно сильнее самого HA

Для старта достаточно 2 ГБ RAM — Home Assistant стартует и на 1 ГБ, но с recorder на несколько сотен сущностей и историей за месяц лучше не экономить, иначе получите OOM-килы процесса при перезапусках. Диск — обязательно SSD/NVMe: recorder пишет в SQLite часто, на HDD это заметно тормозит интерфейс.

Локация сервера влияет на задержку интерфейса: сервер географически ближе к вам — заметно быстрее реакция панели и мобильного приложения, особенно если планируете голосовые сценарии или быстрые кнопки "нажал — сработало" через облачные вебхуки.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Docker и Home Assistant Container

Ставим Home Assistant в варианте Container (не Home Assistant OS — тот требует отдельную виртуализацию или bare metal и на обычном VPS избыточен). Container-вариант — это чистый Python-процесс Home Assistant Core в контейнере, без встроенного Supervisor и магазина аддонов, зато лёгкий и предсказуемый в управлении через docker compose.

Если Docker ещё не установлен, сначала пройдите базовую установку — например, по инструкции для Ubuntu 24.04. Дальше — сам Home Assistant.

Создаём рабочую директорию и файл конфигурации:

mkdir -p /opt/homeassistant/config
cd /opt/homeassistant

docker-compose.yml:

services:
  homeassistant:
    container_name: homeassistant
    image: ghcr.io/home-assistant/home-assistant:stable
    restart: unless-stopped
    privileged: false
    network_mode: host
    volumes:
      - ./config:/config
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=Europe/Moscow

network_mode: host — сознательный выбор: Home Assistant активно использует mDNS/SSDP для автообнаружения устройств, и host-режим упрощает жизнь с плагинами, которые слушают широковещательные пакеты. Если такой режим не подходит по политике безопасности — используйте ports: - "8123:8123" вместо network_mode: host, тогда часть автообнаружения не будет работать (некритично для облачных интеграций).

Запуск:

docker compose up -d
docker compose logs -f homeassistant

Первый старт занимает 1-3 минуты — Home Assistant разворачивает базу конфигурации. После сообщения о запущенном сервере на 8123 порту открывайте http://IP-сервера:8123 и проходите мастер: создание учётной записи администратора, часовой пояс, единицы измерения, аналитика (можно отключить).

Настройка HTTPS через reverse proxy

Открывать Home Assistant по HTTP и голому IP наружу — плохая идея: логин и пароль идут в открытом виде, а сам интерфейс — заметная цель для сканеров. Ставим обратный прокси с автоматическим SSL. Вариант с несколькими сервисами разобран в статье про Traefik как reverse proxy для Docker, но для одного сервиса проще Caddy: конфиг — три строки, сертификат Let's Encrypt выпускается и обновляется сам.

Caddyfile:

home.ваш-домен.ru {
    reverse_proxy 127.0.0.1:8123
}

Запуск Caddy в Docker рядом:

  caddy:
    image: caddy:2
    container_name: caddy
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddyfile
      - caddy_data:/data
    command: caddy run --config /etc/caddyfile

volumes:
  caddy_data:

Домен должен указывать A-записью на IP сервера до запуска — иначе Let's Encrypt не пройдёт HTTP-валидацию. Если хотите разобраться с получением сертификата отдельно от Caddy — есть инструкция про Let's Encrypt на VPS.

Важный момент конфигурации Home Assistant за прокси — файл config/configuration.yaml, добавьте http-секцию, иначе HA будет ругаться на заголовки от прокси и может блокировать запросы как подозрительные:

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - ::1

После правки конфигурации — перезапуск контейнера: docker compose restart homeassistant.

Firewall и базовая защита

Home Assistant хранит доступ ко всей домашней автоматике и часто — интеграции с камерами и замками, так что защита сервера от сканирования и брутфорса не опциональна.

Минимальный набор:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny 8123/tcp
ufw enable

Порт 8123 закрываем снаружи полностью — доступ идёт только через Caddy по 443, напрямую на голый порт Home Assistant извне попасть не должны. Подробный разбор firewall — в статье про установку UFW на VPS.

Внутри самого Home Assistant включите двухфакторную аутентификацию (Профиль → Безопасность → Двухфакторная аутентификация, TOTP-приложение). Модуль ip_ban_enabled уже включён по умолчанию и банит IP после 5 неудачных попыток входа на 24 часа.

Для системной защиты SSH и связки с логами Caddy от HTTP-брутфорса пригодится настройка Fail2ban на VPS.

MQTT и интеграция устройств

Для устройств, которые публикуют данные по MQTT (Tasmota/ESPHome-прошивки, сетевые Zigbee-мосты через Zigbee2MQTT), нужен брокер. Проще всего — Eclipse Mosquitto рядом в том же compose:

  mosquitto:
    image: eclipse-mosquitto:2
    container_name: mosquitto
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data

Минимальный mosquitto/config/mosquitto.conf:

listener 1883
allow_anonymous false
password_file /mosquitto/config/passwd
persistence true
persistence_location /mosquitto/data/

Пользователя создаём отдельной командой (контейнер должен быть запущен хотя бы раз для наличия бинарника, либо используйте docker run с тем же образом разово):

docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/passwd homeassistant

Порт 1883 тоже держите закрытым в UFW снаружи — он нужен только внутри сервера для связи Home Assistant и подключённых к нему устройств.

В Home Assistant интеграция MQTT добавляется через UI: Настройки → Интеграции → Добавить → MQTT, указываете localhost:1883 и созданные логин/пароль.

Автоматический бэкап конфигурации

Автоматизации, история сущностей и интеграции — это часы настройки, которые обидно потерять при сбое диска или неудачном обновлении. В Container-варианте (без Supervisor) встроенного модуля бэкапов из коробки нет, делаем через cron и архивацию директории конфигурации.

Скрипт /opt/homeassistant/backup.sh:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/opt/backups/homeassistant"
mkdir -p "$BACKUP_DIR"

docker exec homeassistant python3 -c "print('pre-backup check ok')" >/dev/null 2>&1

tar --exclude='./home-assistant_v2.db-*' \
    -czf "$BACKUP_DIR/ha-config-$DATE.tar.gz" \
    -C /opt/homeassistant config

find "$BACKUP_DIR" -name "ha-config-*.tar.gz" -mtime +14 -delete
chmod +x /opt/homeassistant/backup.sh
crontab -e

Строка в cron — ежедневный бэкап в 4 утра:

0 4 * * * /opt/homeassistant/backup.sh

Файл базы recorder (home-assistant_v2.db) намеренно исключён — это история состояний, она растёт быстро и не критична для восстановления системы. Для восстановления на новом сервере: разворачиваете тот же docker-compose.yml, распаковываете архив в config/ до первого запуска контейнера и стартуете — Home Assistant поднимется с прежними автоматизациями и интеграциями (токены некоторых облачных сервисов могут потребовать повторной авторизации).

Копию архивов стоит держать не только на самом VPS, а хотя бы на отдельном сервере — если сгорит диск исходной машины, локальный бэкап на нём же не поможет.

Обновление и обслуживание

Home Assistant выпускает релизы каждый месяц, иногда с изменениями в конфигурации, которые ломают нестандартные настройки. Обновление образа:

cd /opt/homeassistant
docker compose pull homeassistant
docker compose up -d homeassistant

Перед крупным обновлением (смена мажорной версии) — обязательно прогоняйте свежий бэкап и читайте раздел "Breaking Changes" в release notes: там перечисляют, какие интеграции и параметры YAML меняют поведение. Чаще всего именно после таких обновлений ломаются автоматизации, завязанные на конкретные атрибуты сущностей сторонних интеграций.

Логи после обновления стоит проверить сразу:

docker compose logs --tail=100 homeassistant

Ошибки уровня ERROR в первые минуты после старта — сигнал проверить конкретную интеграцию до того, как переходить к следующим правкам.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли поставить Home Assistant OS (с Supervisor и магазином аддонов) на VPS?

Технически да, через виртуализацию (KVM/qemu с образом HAOS), но это тяжелее в администрировании и требует VPS с поддержкой вложенной виртуализации или выделенного сервера. Для большинства сценариев с сетевыми/облачными устройствами Container-варианта из этой статьи достаточно и он проще в обслуживании.

Как быть с Zigbee-устройствами, если координатор физически нельзя воткнуть в облачный сервер?

Используйте сетевой Zigbee-координатор (Ethernet/Wi-Fi, например SLZB-06 или готовый Zigbee-to-MQTT мост) — он публикует данные по сети, а Home Assistant на VPS получает их через MQTT-интеграцию без USB. Либо держите Zigbee-хаб локально дома, а VPS используйте для внешнего HTTPS-доступа и облачных интеграций.

Нужен ли отдельный домен или подойдёт IP с портом?

Домен нужен фактически всегда: без него не получить бесплатный TLS-сертификат Let's Encrypt, а без HTTPS браузеры и мобильное приложение Home Assistant будут ругаться на подключение и часть функций (геолокация, push-уведомления) может не работать корректно.

Что делать, если после переноса на VPS выросла задержка в мобильном приложении?

Проверьте, не идёт ли трафик через дальнюю локацию сервера — для управления домом лучше выбирать дата-центр географически ближе к месту, откуда вы обычно заходите, и по возможности включить локальный кэш состояний в приложении (Companion App поддерживает виджеты с локальным обновлением по push, без ожидания ответа сервера на каждое действие).

Как оплатить сервер из России, если оплата иностранной картой не проходит?

У большинства провайдеров, ориентированных на российских клиентов, есть оплата картой российского банка и криптовалютой напрямую, без посредников и конвертации через третьи страны.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →