docs: вся документация egorin в своей папке — обзор, DEPLOY на gate, макет горэлектросети, конфиги (секрет не в git)
This commit is contained in:
@@ -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 (реле «Ворота» цело)
|
||||
```
|
||||
@@ -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`.
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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` и залить.
|
||||
Reference in New Issue
Block a user