Home Assistant на Ubuntu 24.04: пошаговая установка
Если умный дом разросся до десятка интеграций, пары VPN-туннелей и Zigbee-сети, локальный Raspberry Pi с SD-картой начинает тормозить и сыпать ошибками записи. Ниже — рабочий способ поднять Home Assistant на обычном Ubuntu-сервере через Docker: с нормальным диском, стабильным IP и запасом ресурсов под историю сенсоров, а не под очередную прошивку производителя.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему сервер, а не Raspberry Pi
Home Assistant — open-source платформа умного дома с несколькими тысячами интеграций и полным локальным контролем: данные с датчиков не обязаны улетать в чужое облако, автоматизации работают даже без интернета. Проблема в том, на чём это крутится годами.
SD-карта в Raspberry Pi — расходник: recorder пишет в SQLite или Postgres тысячи записей в час, флеш деградирует за 1-2 года, и рано или поздно вы получите битую базу и неработающую историю. Сервер с обычным SSD или NVMe снимает эту проблему полностью, плюс даёт больше RAM для долгой истории датчиков, стабильный публичный IP для внешнего доступа и возможность держать рядом другие сервисы — MQTT-брокер, Zigbee2MQTT, Node-RED — без перегрузки одноплатника.
Важная оговорка, которую стоит проговорить сразу: у решения есть ограничение с обнаружением локальных устройств, если сервер физически не в одной сети с умным домом. Разберём это подробно в отдельной секции — оно решаемо, но не через «просто установить».
Подготовка Ubuntu 24.04 и установка Docker
Если сервер только что развёрнут, сначала стоит сделать базовую настройку — обновления, отдельного пользователя без root, SSH-ключи. Это отдельная тема, подробно разобрана в статье про первичную настройку Ubuntu 24.04.
Дальше ставим Docker Engine из официального репозитория — версия из штатных пакетов Ubuntu обычно старее и без docker compose plugin:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Проверяем, что демон живой, и добавляем своего пользователя в группу docker, чтобы не набирать sudo перед каждой командой:
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker
docker run --rm hello-world
Полное сравнение Docker и альтернатив для сервера — в статье Docker или LXC: что выбрать для сервера, если ещё не определились с подходом к контейнеризации.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка Home Assistant Container и первый запуск
У Home Assistant несколько вариантов установки: HAOS (полноценная ОС с супервизором и магазином дополнений, ставится обычно на выделенный диск или в виртуалку с проброшенным диском), Supervised (устаревающий вариант) и Container — обычный Docker-образ. На арендованном сервере без доступа к гипервизору Container — самый практичный вариант: никаких требований к разделам диска, обновляется как любой другой контейнер, полностью под вашим контролем.
Создаём директорию под конфиг и compose-файл:
mkdir -p /opt/homeassistant/config
cd /opt/homeassistant
nano docker-compose.yml
Содержимое docker-compose.yml:
services:
homeassistant:
container_name: homeassistant
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
network_mode: host
environment:
- TZ=Europe/Moscow
network_mode: host здесь не опция для галочки: без него не работают мультикаст-протоколы обнаружения устройств (mDNS, SSDP) и часть интеграций теряет автообнаружение. Минус — на удалённом сервере это всё равно не даст увидеть устройства в домашней сети напрямую, к этому вернёмся ниже.
Запускаем и смотрим логи первого старта — он инициализирует конфиг несколько минут:
docker compose up -d
docker compose logs -f homeassistant
Как только в логах появится строка про запущенный HTTP-сервер на порту 8123, открываем http://IP-сервера:8123 в браузере.
Мастер первоначальной настройки
При первом заходе Home Assistant проведёт через onboarding:
- Создание учётной записи администратора — логин, пароль, имя. Это отдельная локальная учётка, не путайте с Nabu Casa аккаунтом (он появится позже, если решите подключить облачный сервис).
- Название инстанса и часовой пояс — сверьте с
TZиз compose-файла. - Локация на карте — используется для расчёта восхода/заката в автоматизациях и погодных интеграций. Для приватности можно указать точку в квартале от реального адреса — на точность автоматизаций это почти не влияет.
- Единицы измерения — метрическая или американская система.
- Экран автообнаруженных устройств — на этом шаге сразу станет видно то самое ограничение: если сервер стоит не в вашей домашней сети, здесь будет пусто или почти пусто, даже с
network_mode: host.
После онбординга откроется собранный по умолчанию дашборд с базовыми карточками — его можно перестраивать сразу или начать с добавления реальных интеграций через Settings → Devices & Services.
Доступ к устройствам дома: реальное ограничение и как его обойти
Это ключевой момент, который часто упускают в общих мануалах. Home Assistant обнаруживает и опрашивает большинство локальных устройств по протоколам, которые не выходят за пределы одной L2-сети: mDNS/Bonjour, SSDP/UPnP, широковещательные запросы Zigbee- и Z-Wave-координаторов, подключённых по USB. Сервер в дата-центре физически не в вашей домашней сети — и network_mode: host эту физику не отменяет, он лишь снимает ограничения docker-сети внутри самого сервера.
Что реально работает в такой конфигурации:
- Устройства с облачным API (часть Xiaomi/Mi Home, Tuya-based умные розетки, Ecobee, многие роботы-пылесосы) — Home Assistant опрашивает их через интернет, локальная сеть тут вообще не нужна. Для них удалённый сервер работает без всяких оговорок.
- Устройства с локальным HTTP/API и статическим IP внутри домашней сети — доступны через сайт-ту-сайт VPN. Поднимаете WireGuard между сервером и домашним роутером (или мини-ПК дома), прописываете маршрут до подсети умного дома — и Home Assistant на удалённом сервере обращается к устройствам по их локальным IP как будто он в той же сети. Подробная настройка — в статье WireGuard на Ubuntu 24.04. mDNS через такой туннель обычно не проходит без отдельного avahi-reflector, поэтому интеграции с ручным указанием IP/хоста предпочтительнее автообнаружения.
- Zigbee/Z-Wave USB-координаторы нельзя просто «пробросить по сети» — физически дongle должен быть воткнут в машину, до которой достаёт USB. Рабочая схема: ставите Zigbee2MQTT (или Z-Wave JS UI) на дешёвый мини-ПК или Raspberry Pi дома, где физически стоит USB-стик, он публикует состояния в MQTT-брокер, а Home Assistant на удалённом сервере подключается к этому брокеру через тот же WireGuard-туннель. Брокер (например, Eclipse Mosquitto) можно поднять как отдельный контейнер рядом с Zigbee2MQTT или прямо на арендованном сервере — тогда роль дома выполняет только тонкий Zigbee-шлюз, а вся логика и хранение — на сервере.
Если ваш умный дом целиком состоит из облачных устройств — просто пропустите этот раздел, всё заработает из коробки. Если есть Zigbee/Z-Wave — закладывайте WireGuard и MQTT-мост в план сразу, это не постфактум-костыль, а штатная архитектура для распределённого умного дома.
HTTPS, безопасный доступ снаружи и бэкапы
Порт 8123 напрямую наружу лучше не светить — это админка вашего дома. Штатная связка — reverse proxy с автоматическим HTTPS перед Home Assistant. Пример на Caddy (конфигурация из статьи про Caddy с авто-SSL на Ubuntu 24.04):
ha.example.com {
reverse_proxy 127.0.0.1:8123
}
Home Assistant по умолчанию не доверяет заголовкам от прокси — это нужно явно включить в configuration.yaml, иначе получите ошибку 400 Bad Request: Invalid host header или неверный IP клиента в логах:
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
- ::1
Firewall настраивается так, чтобы 8123 был доступен только с localhost и, при необходимости, из VPN-подсети, а 80/443 — снаружи для реверс-прокси:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 8123/tcp
Автозапуск после перезагрузки сервера уже обеспечен restart: unless-stopped в compose-файле и systemctl enable docker — контейнер поднимется сам.
Бэкапы Home Assistant умеет делать штатно: Settings → System → Backups создаёт архив конфига, истории и (по желанию) медиа. Архив ложится в /opt/homeassistant/config/backups — оттуда его стоит забирать за пределы сервера тем же способом, что и остальные проекты: подход и готовые скрипты разобраны в статье про автоматические бэкапы на Ubuntu 24.04. Локальный бэкап на том же диске не защищает от отказа самого сервера.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли Home Assistant OS вместо Container-режима на арендованном сервере?
Обычно нет. HAOS удобен, когда у вас есть выделенный диск или отдельная виртуалка под него — там появляется Supervisor и магазин официальных дополнений в один клик. На типовом VPS/выделенном сервере без доступа к гипервизору Container-режим проще в администрировании: обновления, бэкапы и сеть вы контролируете сами через Docker, а недостающие дополнения (та же Zigbee2MQTT) ставятся отдельными контейнерами.
Сколько RAM и CPU закладывать?
Для старта с десятком интеграций хватает 1-2 ГБ RAM и одного ядра — это ориентир, а не гарантия: реальное потребление сильно зависит от числа сущностей, глубины истории в recorder и от того, крутятся ли рядом Zigbee2MQTT, MQTT-брокер и база данных для истории. С Postgres вместо встроенного SQLite и десятками датчиков закладывайте больше памяти с запасом.
Можно ли обойтись без своего сервера и просто подключить Nabu Casa?
Nabu Casa (Home Assistant Cloud) — платная подписка от самого проекта Home Assistant, которая даёт удалённый доступ и голосовые ассистенты без настройки VPN и реверс-прокси. Это альтернативный, а не взаимоисключающий вариант: она всё равно требует, чтобы сам Home Assistant где-то работал — локально или на сервере, как описано в этой статье.
Что делать, если обновление ломает интеграцию?
Перед крупным обновлением делайте бэкап через Settings → System → Backups и читайте release notes — Home Assistant честно помечает breaking changes для конкретных интеграций. Если что-то отвалилось, для контейнера достаточно указать в compose-файле предыдущий тег образа вместо stable и пересоздать контейнер — это откатывает версию за минуту.
Обязательно ли network_mode: host?
Нет, но без него часть интеграций теряет автообнаружение внутри локальной docker-сети, а на удалённом сервере эффект от него и так ограничен по причинам из раздела про доступ к устройствам. Если вы работаете только через MQTT и облачные интеграции, можно оставить обычный bridge-режим с проброшенным портом 8123.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →