Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Платформа домашней автоматизации
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 описывает зону ответственности сервиса и явно
то, что в неё не входит, — ещё до того, как там появится код.
Этапы разработки
- Go-сервисы — ingest, rule-engine, device-control, эмулятор ESP32.
- Laravel — авторизация (Sanctum, owner/viewer), CRUD для зон/устройств/ правил, Blade-дашборд, ручное управление устройствами. MVP считается готовым на этом этапе.
- (опционально, но сильно повышает ценность) Observability — метрики Prometheus с Go-сервисов, один-два дашборда в Grafana.
- Расширения (не спеша) — Telegram-уведомления, фронтенд на Vue.js/Inertia, приложение на Flutter, подключение реального ESP32.
Запуск локально
Пока только инфраструктура (сервисы добавляются в docker-compose.yml по
мере реализации):
cp .env.example .env
docker compose up -d
Поднимутся Mosquitto (1883), PostgreSQL (5432), ClickHouse (8123/9000),
Redis (6379) и RabbitMQ (5672, веб-интерфейс управления на 15672).