commit 19e0d4b1b1712aa6eb1c12235b38855d19dfbaf1 Author: striker Date: Fri May 8 04:36:06 2026 +0300 Initial Home Assistant Container deployment - docker-compose.yml: homeassistant/home-assistant:stable, bridge, 127.0.0.1:8123, journald - config/ исключён из git (.gitignore) - README + CLAUDE с описанием стека, деплоя, nginx-нюансов diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96eee2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +config/ +!config/.gitkeep +*.log +*.db +*.db-shm +*.db-wal +.HA_VERSION diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e5234fb --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,52 @@ +# CLAUDE.md — home-assistant + +## Что +Home Assistant Container на str-u-01 (45.10.53.148). UI публикуется через nginx на `ha.striker.su`. + +## Стек +- `homeassistant/home-assistant:stable` (Docker Hub, обычный Container — не Supervised, без addons) +- bridge network, `127.0.0.1:8123:8123` (только loopback на сервере) +- volume bind-mount: `./config:/config` (НЕ в git) +- log-driver: journald (см. memory `reference_fail2ban_gitea.md` про journald на str-u-01) +- `restart: unless-stopped`, healthcheck на `/manifest.json` + +## Структура +``` +home-assistant/ +├── docker-compose.yml # сервис ha +├── .gitignore # исключает config/ +├── README.md +└── CLAUDE.md +``` + +На сервере: `/opt/docker/sites/home-assistant/`. Папка `config/` создаётся автоматически HA при первом запуске. + +## Деплой +```bash +ssh striker@str-u-01.striker.su +cd /opt/docker/sites/home-assistant +git pull +docker compose pull && docker compose up -d +``` + +## nginx +vhost: `/etc/nginx/conf.d/ha.striker.su` на str-u-01 (ssl + reverse-proxy на 127.0.0.1:8123). +Обязательно `proxy_set_header Upgrade` / `Connection upgrade` для WebSocket — UI ломается без них. + +## LE-сертификат +DNS-01 через Technitium API (см. memory `feedback_acme_technitium_dns01.md`). +Файлы: `/etc/letsencrypt/live/ha.striker.su/fullchain.pem` + `privkey.pem`. + +## HA конфиг +После первого запуска в `config/configuration.yaml` добавить: +```yaml +http: + use_x_forwarded_for: true + trusted_proxies: + - 127.0.0.1 +``` +Иначе HA отвергнет соединения от nginx как "untrusted proxy". + +## Доступы +- UI: https://ha.striker.su (онбординг при первом входе — создаёт admin) +- Локально: `curl http://127.0.0.1:8123` (только с самого сервера) diff --git a/README.md b/README.md new file mode 100644 index 0000000..7211556 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Home Assistant — str-u-01 + +Home Assistant Container на str-u-01.striker.su. + +## Стек +- **Image**: `homeassistant/home-assistant:stable` +- **Network**: bridge, биндинг `127.0.0.1:8123` (только loopback) +- **Публичный доступ**: nginx reverse-proxy на `ha.striker.su` с LE-сертификатом +- **Логи**: journald (`docker logs` + journalctl) +- **Volume**: `./config:/config` (bind-mount, локально на сервере, в git не попадает) + +## Деплой + +```bash +ssh striker@str-u-01.striker.su +cd /opt/docker/sites/home-assistant +git pull +docker compose pull +docker compose up -d +``` + +## Обновление + +HA в режиме Container обновляется ручным `docker compose pull && docker compose up -d`. Авто-обновлений нет специально (контроль над брейкинг-чейнджами). + +## Доступ +- UI: https://ha.striker.su +- Локально на сервере: http://127.0.0.1:8123 +- Первый запуск: онбординг (создание учётки админа) при первом заходе на UI + +## Заметки +- **trusted_proxies** в `config/configuration.yaml` должен включать `127.0.0.1` (для корректного `X-Forwarded-For` от nginx). Прописывается после первого запуска через `http:` секцию. +- Папка `config/` исключена из git (`.gitignore`) — содержит секреты (токены, пароли, БД состояния). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..1278918 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +services: + homeassistant: + image: homeassistant/home-assistant:stable + container_name: home-assistant + restart: unless-stopped + ports: + - "127.0.0.1:8123:8123" + volumes: + - ./config:/config + - /etc/localtime:/etc/localtime:ro + environment: + - TZ=Europe/Moscow + healthcheck: + test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8123/manifest.json"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + logging: + driver: journald + options: + tag: "{{.Name}}"