# Платформа домашней автоматизации 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`).