103 lines
5.6 KiB
Markdown
103 lines
5.6 KiB
Markdown
# Платформа домашней автоматизации
|
||
|
||
Pet-проект на микросервисной архитектуре для портфолио, демонстрирующий Go
|
||
(конкурентность, очереди сообщений, MQTT), PHP/Laravel (API, авторизация)
|
||
и работу с разными БД по назначению (PostgreSQL, ClickHouse, Redis).
|
||
|
||
**Это не «проект гроубокса».** Гроубокс — первая реализованная **зона**
|
||
с первым набором **типов устройств** (свет, полив, вентиляция, датчик
|
||
температуры). Ядро системы — управление устройствами, телеметрия, правила
|
||
автоматизации, пользователи, уведомления — оперирует исключительно
|
||
абстракциями *зона*, *устройство*, *тип устройства*, *показание датчика*,
|
||
*команда*, *правило*. Ничего специфичного для гроубокса не зашито в ядре:
|
||
добавление зоны «гостиная» с типом устройства «умная розетка» не должно
|
||
требовать изменений в коде сервисов — только новые строки в
|
||
`device_types` / `zones` / `devices`.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
ESP32 (или эмулятор)
|
||
│ MQTT
|
||
▼
|
||
ingest-service (Go) ──► ClickHouse (сырая телеметрия)
|
||
│
|
||
▼ RabbitMQ (событие "новое показание")
|
||
rule-engine-service (Go) ──► PostgreSQL (правила, кэшируются)
|
||
│ gRPC (при срабатывании правила)
|
||
▼
|
||
device-control-service (Go) ──► MQTT (команда) ──► устройство
|
||
│
|
||
▼
|
||
Redis (device shadow: desired/reported state, status, last_seen)
|
||
|
||
Laravel API (PHP) ──► PostgreSQL / ClickHouse / Redis
|
||
│ gRPC / HTTP
|
||
▼
|
||
device-control-service (ручные команды из UI)
|
||
```
|
||
|
||
## Стек
|
||
|
||
| Назначение | Технология |
|
||
|---|---|
|
||
| Прошивка устройства / эмулятор | Go (`services/esp32-emulator`) |
|
||
| Протокол устройство ↔ сервер | MQTT (Mosquitto) |
|
||
| Backend телеметрии / команд / правил | Go |
|
||
| Бизнес-логика / API / дашборд | PHP (Laravel) |
|
||
| Пользователи, зоны, устройства, правила | PostgreSQL |
|
||
| Телеметрия (time-series) | ClickHouse |
|
||
| Состояние устройств в реальном времени | Redis (паттерн Device Shadow) |
|
||
| Асинхронные события между сервисами | RabbitMQ |
|
||
| Синхронные вызовы между сервисами | gRPC / Protobuf |
|
||
| Метрики (этап 2.5) | Prometheus + Grafana |
|
||
| Контейнеризация | Docker Compose |
|
||
| Веб-фронтенд (этап 3) | Vue.js + Inertia.js |
|
||
| Мобильное приложение (этап 3) | Flutter |
|
||
| Уведомления | Telegram-бот (MVP) / Firebase Cloud Messaging (позже) |
|
||
|
||
## Структура репозитория
|
||
|
||
```
|
||
services/
|
||
ingest-service/ Go — MQTT → ClickHouse + RabbitMQ
|
||
device-control-service/ Go — gRPC + MQTT + Redis device shadow
|
||
rule-engine-service/ Go — консьюмер RabbitMQ + оценка правил
|
||
health-check-service/ Go — тикер обнаружения офлайн-устройств
|
||
esp32-emulator/ Go — фейковое устройство для локальной разработки
|
||
laravel-app/ PHP/Laravel — API, авторизация, дашборд (этап 2)
|
||
proto/ Общие gRPC-контракты (device_control.proto)
|
||
migrations/
|
||
postgres/ users, zones, devices, device_types, automation_rules
|
||
clickhouse/ таблица telemetry
|
||
configs/mosquitto/ Конфиг MQTT-брокера
|
||
monitoring/ Конфиги Prometheus + Grafana (этап 2.5)
|
||
```
|
||
|
||
Каждый `services/*/README.md` описывает зону ответственности сервиса и явно
|
||
то, что в неё не входит, — ещё до того, как там появится код.
|
||
|
||
## Этапы разработки
|
||
|
||
1. **Go-сервисы** — ingest, rule-engine, device-control, эмулятор ESP32.
|
||
2. **Laravel** — авторизация (Sanctum, owner/viewer), CRUD для зон/устройств/
|
||
правил, Blade-дашборд, ручное управление устройствами. MVP считается
|
||
готовым на этом этапе.
|
||
3. *(опционально, но сильно повышает ценность)* **Observability** — метрики
|
||
Prometheus с Go-сервисов, один-два дашборда в Grafana.
|
||
4. **Расширения** (не спеша) — Telegram-уведомления, фронтенд на
|
||
Vue.js/Inertia, приложение на Flutter, подключение реального ESP32.
|
||
|
||
## Запуск локально
|
||
|
||
Пока только инфраструктура (сервисы добавляются в `docker-compose.yml` по
|
||
мере реализации):
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
docker compose up -d
|
||
```
|
||
|
||
Поднимутся Mosquitto (`1883`), PostgreSQL (`5432`), ClickHouse (`8123`/`9000`),
|
||
Redis (`6379`) и RabbitMQ (`5672`, веб-интерфейс управления на `15672`).
|