diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md new file mode 100644 index 0000000..96fa18f --- /dev/null +++ b/docs/DEPLOY.md @@ -0,0 +1,56 @@ +# Развёртывание Егорин на gate (egorin.r.servaki.online) + +Узел **gate** = `gate.servaki.online` = **5.101.118.232** (Ubuntu 24.04, nginx 1.24, certbot). +Выбран как чистый веб-узел: уже nginx+LE (панель «Ворота»), **нет amnezia/xray/MTProxy** — +ничего не ломается. egorin — отдельный `server_name`, реле «Ворота» (`gate.conf`) не трогать. + +Имя **egorin.r.servaki.online** (relay-зона `.r.`) — совпадает с redirect_uri в Яндекс ID. + +## Компоненты +- Фронт (статика SPA) → `/var/www/egorin.r.servaki.online`. +- Бэкенд-шлюз (Node) → `/opt/egorin-api/server`, порт **127.0.0.1:4100**, systemd + `servaki-monitor-api` (см. [deploy/servaki-monitor-api.service](deploy/servaki-monitor-api.service)). +- nginx-vhost: SPA + proxy `/api/`,`/socket` → 4100 + (см. [deploy/egorin.r.servaki.online.conf](deploy/egorin.r.servaki.online.conf)). +- `.env` бэкенда → `/opt/egorin-api/.env` (см. [deploy/egorin.env.example](deploy/egorin.env.example); + **секрет Яндекс — только на сервере, не в git**). + +## Шаги (проверено, SSH из песочницы к gate работает по id_rsa0404) +```bash +# 1. DNS (на ru1, это только API-вызов, ru1 не меняем) +/root/beget-api.sh setA egorin.r.servaki.online 5.101.118.232 +# 2. Node 20 на gate +curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs +# 3. Фронт +npm run build # локально → dist/ +scp -r dist/* root@5.101.118.232:/var/www/egorin.r.servaki.online/ +# 4. Бэкенд +scp -r server root@5.101.118.232:/opt/egorin-api/ +# на gate: cd /opt/egorin-api/server && npm install --omit=dev +# cp .env → /opt/egorin-api/.env ; cp unit → /etc/systemd/system/ +# systemctl enable --now servaki-monitor-api +# 5. nginx + TLS +cp egorin.r.servaki.online.conf /etc/nginx/sites-available/ && ln -s … sites-enabled/ +nginx -t && systemctl reload nginx +certbot --nginx -d egorin.r.servaki.online --redirect -m mpo-inform@yandex.ru --agree-tos -n +``` + +## Обновление +- Только фронт: `npm run build` → залить `dist/` в `/var/www/egorin.r.servaki.online/`. +- Бэкенд/демо-данные: залить `server/src/*` → `/opt/egorin-api/server/src/` → + `systemctl restart servaki-monitor-api`. + +## Яндекс ID (приложение «Железный монитор») +- `YANDEX_CLIENT_ID=12f8169bc7f74571b53e90a2bafea786` +- `YANDEX_REDIRECT=https://egorin.r.servaki.online/api/auth/yandex/callback` (совпадает с + зарегистрированным в oauth.yandex.ru — иначе mismatch). +- `YANDEX_ADMINS=mpo-inform@yandex.ru` (роль admin). +- **Client secret** — в `/opt/egorin-api/.env` на gate, НЕ в git. +- Поток: `/api/auth/yandex/start` → oauth.yandex.ru → `/api/auth/yandex/callback` → сессия. + +## Проверка +```bash +curl -sI https://egorin.r.servaki.online/ # 200 (фронт) +curl -sI https://egorin.r.servaki.online/api/auth/yandex/start # 302 → oauth.yandex.ru +curl -sI https://gate.servaki.online/ # 200 (реле «Ворота» цело) +``` diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..e68f6f3 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,22 @@ +# Егорин («Железный монитор» / Servaki Monitor) — документация + +Мультиарендная веб-панель мониторинга: энергомониторинг, GPS/ГЛОНАСС, охрана (ПЦН), +смарт (Wiren Board), сетевая инфраструктура. Форк «Орбиты», тёплый стиль (amber), +вход через Яндекс ID. + +## Содержание +- [DEPLOY.md](DEPLOY.md) — развёртывание на gate (`egorin.r.servaki.online`): DNS, nginx, + бэкенд-шлюз (systemd), TLS (certbot), Яндекс ID. +- [gorelectroseti-demo.md](gorelectroseti-demo.md) — демо-макет «городские электросети» + (ТП + автопарк бригад) и **где живут данные панели**. +- [deploy/](deploy/) — nginx-vhost, systemd-юнит, `.env.example`. + +## Стек +React 18 + Vite + TypeScript + Tailwind, zustand, react-router, recharts, leaflet + +maplibre-gl (карта). Бэкенд-шлюз: Node (`server/`, порт 4100) — Яндекс OAuth + адаптеры +MQTT/InfluxDB/Traccar (иначе демо-данные). + +## Прод +- **Живьё:** `https://egorin.r.servaki.online/` — на узле **gate** (5.101.118.232). +- Демо-превью (Beget path): `https://servaki.online/egorin/`. +- Репозиторий: `git1.servaki.online/german/egorin`. diff --git a/docs/deploy/egorin.env.example b/docs/deploy/egorin.env.example new file mode 100644 index 0000000..7adb842 --- /dev/null +++ b/docs/deploy/egorin.env.example @@ -0,0 +1,15 @@ +# /opt/egorin-api/.env — бэкенд-шлюз egorin (gate). НЕ коммитить в git. +PORT=4100 +JWT_SECRET=egorin-gate-2026-CHANGE-IF-NEEDED +DATA_DIR=/opt/egorin-api/data + +# Яндекс ID (приложение «Железный монитор») +YANDEX_CLIENT_ID=12f8169bc7f74571b53e90a2bafea786 +YANDEX_CLIENT_SECRET=<секрет в .env на gate, НЕ в git> +YANDEX_REDIRECT=https://egorin.r.servaki.online/api/auth/yandex/callback +YANDEX_ADMINS=mpo-inform@yandex.ru + +# Источники данных — включатся по мере готовности стеков (иначе демо-fallback): +# MQTT_URL=mqtt://mosquitto:1883 +# INFLUX_URL=http://influxdb:8086 +# TRACCAR_URL=http://traccar:8082 diff --git a/docs/deploy/egorin.r.servaki.online.conf b/docs/deploy/egorin.r.servaki.online.conf new file mode 100644 index 0000000..09ce261 --- /dev/null +++ b/docs/deploy/egorin.r.servaki.online.conf @@ -0,0 +1,40 @@ +# /etc/nginx/sites-available/egorin.r.servaki.online.conf (gate 5.101.118.232) +# HTTP-first. certbot --nginx -d egorin.r.servaki.online довыпустит серт и добавит 443. +# Рядом с панелью «Ворота» (другой server_name) — её не трогает. +server { + listen 80; + listen [::]:80; + server_name egorin.r.servaki.online; + + root /var/www/egorin.r.servaki.online; + index index.html; + + # SPA + location / { + try_files $uri $uri/ /index.html; + } + location /assets/ { + expires 30d; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + # Бэкенд-шлюз (Yandex OAuth + данные) на 127.0.0.1:4100 + location /api/ { + proxy_pass http://127.0.0.1:4100; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location /socket { + proxy_pass http://127.0.0.1:4100; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + } + + gzip on; + gzip_types text/css application/javascript application/json image/svg+xml; + access_log /var/log/nginx/egorin.access.log; + error_log /var/log/nginx/egorin.error.log; +} diff --git a/docs/deploy/servaki-monitor-api.service b/docs/deploy/servaki-monitor-api.service new file mode 100644 index 0000000..9753cd3 --- /dev/null +++ b/docs/deploy/servaki-monitor-api.service @@ -0,0 +1,16 @@ +[Unit] +Description=Egorin / Servaki Monitor API gateway (Node) +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/egorin-api/server +EnvironmentFile=/opt/egorin-api/.env +ExecStart=/usr/bin/node src/server.js +Restart=on-failure +RestartSec=3 +User=www-data +Group=www-data + +[Install] +WantedBy=multi-user.target diff --git a/docs/gorelectroseti-demo.md b/docs/gorelectroseti-demo.md new file mode 100644 index 0000000..d70d199 --- /dev/null +++ b/docs/gorelectroseti-demo.md @@ -0,0 +1,31 @@ +# Демо-макет «Городские электросети» + +Сценарий-начинка панели: работа городской электросетевой службы — трансформаторные +подстанции под мониторингом + бригадный автопарк на карте. + +## Объекты +- **Трансформаторные подстанции / РП** (тип `energy`): ТП-14 «Бештау» (авария/offline), + ТП-7 «Центр» (перегрев 41 °C), ТП-3 «Западный», ТП-9 «Южный», РП-2 (распределительный + пункт). Телеметрия: `load` (кВт), `u` (В), `i` (А), `temp` (°C); `meta.feeder` — фидер ВЛ-10. +- **Бригадный автопарк — 5 машин** (тип `transport`): **Автовышка АГП-22**, Бригада ВЛ-1 + (ГАЗель), Аварийная бригада (УАЗ), Кабельщики (ГАЗ-3309), Мастер участка (Нива). + Часть машин «движется» → живые треки. +- Сетевые узлы mesh2 (раздел «Сеть»): finik-хаб, РЭС-1, Диспетчерская. + +## Рация (`RadioMiniWindow`) +- **Доска объявлений**: аварийные объявления с **миганием** (CSS `.sm-blink`), задачи бригад + с **чекбоксами** — закрытие даёт зачёркивание (`line-through`). +- **Список чтения**: очередь голосовых уведомлений, кнопка «Читать» → Web Speech (`speak`). + +## Карта — 2ГИС по умолчанию +- Leaflet (`MapView.tsx`): дефолт-слой '2ГИС' (переключение слоёв — в контроле карты). +- MapLibre GL (`MapViewGL.tsx`): `STYLE` — растровый источник 2ГИС (tile0-3.maps.2gis.com). + +## ⚠️ ГДЕ живут данные панели (важно при правках) +На проде **бэкенд активен** → объекты/энерго/GPS/события панель тянет из +**`server/src/demo.js`** (демо-fallback бэкенда), а НЕ из фронтового `src/data/mock.ts` +(фронт-mock работает только без бэкенда, чистая статика). + +**Правишь объекты монитора (ТП, машины, события) → правь `server/src/demo.js`**, залей на +gate в `/opt/egorin-api/server/src/` и `systemctl restart servaki-monitor-api`. +Рация-стор (`src/core/radio.ts`) и карты (2ГИС) — это фронт: пересобрать `dist` и залить.