docs: вся документация egorin в своей папке — обзор, DEPLOY на gate, макет горэлектросети, конфиги (секрет не в git)

This commit is contained in:
german
2026-07-08 23:06:33 +03:00
parent 8d0e26a02b
commit 010a5308f2
6 changed files with 180 additions and 0 deletions
+56
View File
@@ -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 (реле «Ворота» цело)
```
+22
View File
@@ -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`.
+15
View File
@@ -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
+40
View File
@@ -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;
}
+16
View File
@@ -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
+31
View File
@@ -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` и залить.