2026-02-24 00:48:34 +07:00
2025-07-07 13:07:26 +07:00

Router Lists UI

Полноценный UI/Backend для управления списками BGP (домены, IP-диапазоны, ASNs), фильтрами и конфигурациями MikroTik на базе S3 (Yandex Object Storage). Интерфейс построен на Tabler, frontend — Vite + React, backend — Express.

Быстрый старт

Требования

  • Node.js 18+
  • S3-совместимое хранилище (Yandex Object Storage)
  • Доступы AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET_NAME, AWS_REGION

Запуск backend

cd backend
npm i
# создайте .env и заполните (пример ниже)
npm start

Сервис поднимется на http://localhost:3001.

Запуск frontend

cd frontend
npm i
npm run dev

Frontend доступен на http://localhost:5173 (по умолчанию). Production-сборка: npm run build.

Главные особенности

  • Единая UX/UI библиотека Tabler, адаптивные панели действий и навигация.
  • Онлайн-обновление (WebSocket) BGP c потоковым логом и фоновое обновление (HTTP POST) из UI.
  • Блокировки (soft-lock) ресурсов с TTL, чтобы избежать гонок при одновременном редактировании.
  • Версионирование данных (история/откат), если включено версии в бакете.
  • Генерация конфигурации MikroTik из фильтров (/api/filters/generate-config) и экспорт в S3.
  • Метрики Prometheus: /metrics, health/ready: /health, /ready.

Важные переменные окружения

  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET_NAME — доступ к Object Storage
  • ENCRYPTION_KEY — ключ шифрования (64 hex символа) для IPSec и MikroTik паролей
  • CORS_ORIGINS — список разрешённых Origin через запятую (если пусто — разрешены все)
  • LOG_LEVEL — уровень логов pino (info по умолчанию)
  • PORT — порт backend (по умолчанию 3001)
  • BGP_BACKGROUND_URL — адрес фонового обновления BGP, например:
    • http://77.232.38.173:8080/api/update_bgp/background?api_key=...
    • Используется эндпоинтом прокси POST /api/update-bgp/background для обхода CORS

Пример .env:

PORT=3001
LOG_LEVEL=info
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=ru-central1
S3_BUCKET_NAME=...
CORS_ORIGINS=http://localhost:5173
BGP_BACKGROUND_URL=http://77.232.38.173:8080/api/update_bgp/background?api_key=denozord2502

API (backend)

Все ответы об ошибке имеют единый формат:

{ "code": "E_*", "message": "...", "details": {}, "requestId": "..." }

Успешные POST/PUT возвращают:

{ "ok": true, "etag": "...", "lastModified": "ISO", "contentLength": 123 }

И всегда выставляют заголовки ETag, Last-Modified, Content-Length-Source (если есть). GET поддерживают countOnly=true там, где это логично.

Данные

  • GET /api/domains-new — список доменов { domain, community }

    • ?q=, ?offset=, ?limit=, ?countOnly=true, ?format=std
  • POST /api/domains-new{ domains: [{domain, community}], etag }

  • GET /api/ip-ranges — список [{ ipRange, community }]

  • POST /api/ip-ranges{ ipRanges: [{ipRange, community}], etag }

  • GET /api/asns — список [{ domain, type }] (domain = AS, type = community)

  • POST /api/asns{ domains: [{domain, type}], etag }

  • GET /api/communities — справочник community (JSON)

  • POST /api/communities{ communities: [...] } (валидация уникальности value)

Фильтры и конфигурации

  • GET /api/filters / POST /api/filters — фильтры для всех серверов.

  • GET /api/filters/generate-config?format=text|json — сгенерировать конфиг MikroTik из filters.json.

  • POST /api/filters/export-config — сохранить сгенерированный конфиг в S3 (mikrotik-frouting-config.txt).

  • GET /api/server-configs / POST /api/server-configs — список серверов (id, name, ...).

  • GET /api/server-configs/:serverId / POST /api/server-configs/:serverId — конфиг конкретного сервера.

  • DELETE /api/server-configs/:serverId — удалить конфиг.

  • DELETE /api/server-configs/:serverId/complete — удалить конфиг и фильтры.

  • GET /api/server-filters/:serverId — фильтры сервера.

  • POST /api/server-filters/:serverId — сохранить фильтры сервера.

  • POST /api/server-filters/generate-config — сгенерировать конфиг MikroTik на лету из переданных { filters, format?: 'text'|'json' }.

  • POST /api/mikrotik/generate — сгенерировать конфиг интерфейсов и маршрутов. Body: { format?: 'text'|'json', type?: 'interfaces'|'recursive'|'all', serverId?: string, config?, servers? }. Возвращает { blocks } — массив блоков с полем code (text) или operations (json).

  • GET /api/mikrotik/generate-interfaces?format=text|json&serverId= — только интерфейсы.

  • GET /api/mikrotik/generate-recursive-routes?format=text|json&serverId= — только рекурсивные маршруты.

  • POST /api/mikrotik/test-connection — проверить соединение с MikroTik. Body: { serverId } или { host, port?, user?, password }.

  • POST /api/mikrotik/apply — применить конфигурацию на MikroTik по API. Body: { serverId, type?: 'interfaces'|'recursive'|'all', dryRun?: boolean }. Только для jumphost.

Прочее

  • GET /api/servers / POST /api/servers — список серверов.
  • GET /api/billing / POST /api/billing — биллинг (ноды, статусы и т.п.).
  • GET /api/auto-urls / POST /api/auto-urls — список авто-URL.
  • POST /api/auto-urls/process — обработать авто-URL и добавить IP в bgp_data/ips.txt.
  • GET /api/servers/availability?ttlSeconds=60 — быстрый TCP‑чек доступности нод.
  • GET /api/s3/last-modified — метаданные S3 (etag/lastModified/contentLength) по ключевым файлам.
  • POST /api/update-bgp/background — прокси к фоновой задаче обновления BGP. Требует BGP_BACKGROUND_URL в .env.
  • Locks: GET /api/locks/:resource, POST /api/locks/:resource, DELETE /api/locks/:resource (опциональные soft-locks для редактирования; доступ к S3 и долгие операции вроде speed-test блокировок не используют).
  • History: GET /api/history/:resource, POST /api/history/:resource/rollback.

Frontend

  • Vite + React, Tabler CSS/JS (@tabler/core).
  • Общий компонент PageHeaderActions — единый toolbar на страницах данных.
  • Модалка WsUpdateModal — поток логов online-обновления (ws).
  • Доступность: роли, подписи, фокус-кольца, hot-path без мыши.

Скрипты

npm run dev    # dev-сервер
npm run build  # продакшн сборка

Структура репозитория

backend/         # Express API
frontend/        # Vite React UI

Безопасность и эксплуатация

  • Helmet, RateLimit, CORS, отключён слабый etag на JSON.
  • Prometheus метрики по умолчанию.
  • Для истории версий включите versioning в бакете S3.

Лицензия

MIT

📂 RouterOS Manager

Веб-интерфейс для удобного управления файлами в S3-совместимом хранилище Yandex Cloud. Приложение позволяет в реальном времени просматривать, добавлять, редактировать, удалять и массово изменять записи в следующих файлах:

  • domains.txt - список доменов и их шлюзов
  • asns.txt - список AS номеров и их шлюзов
  • servers.json - список серверов с расширенной информацией (IP, DNS, страна, провайдер, тип туннеля)

Возможности

  • Три режима работы: Управление списками доменов, AS-номеров и серверов через вкладки.
  • CRUD операции: Полный набор действий: создание, чтение, обновление и удаление записей.
  • Поиск в реальном времени: Мгновенная фильтрация списков по мере ввода.
  • Массовая замена: Быстрое обновление шлюзов для сотен записей в один клик.
  • Сохранение в S3: Все изменения сохраняются непосредственно в файлах в бакете Yandex Cloud.
  • Docker-контейнеризация: Готовый Dockerfile для сборки и запуска приложения в изолированном окружении.
  • CI/CD с Gitea Actions: Автоматическая сборка и публикация Docker-образа в Gitea Registry при пуше в main.
  • Современный интерфейс: Полностью интегрированный Tabler UI с официальными компонентами.

🛠️ Технологический стек

Область Технология
Фронтенд React + Vite
@tabler/core (UI-компоненты для Tabler версии)
Tabler Icons (иконки)
Axios (HTTP-клиент)
Бэкенд Node.js + Express
AWS SDK for JS (для работы с Yandex Cloud S3)
CI/CD Docker, Gitea Actions

🏗️ Архитектура

Приложение состоит из двух основных частей: фронтенд на React и бэкенд на Node.js/Express, которые взаимодействуют через REST API.

graph TD
    subgraph Browser
        A[React Frontend]
    end

    subgraph Server
        B(Node.js/Express API)
    end

    subgraph Yandex Cloud
        C{S3 Bucket}
        D1[domains.txt]
        D2[asns.txt]
        D3[servers.json]
    end

    A -- HTTP Requests --> B
    B -- AWS SDK --> C
    C --- D1
    C --- D2

🚀 Установка и запуск

Предварительные требования

  • Node.js (v20.x или выше)
  • npm или yarn
  • Доступ к бакету Yandex Cloud S3 и сервисный аккаунт с правами на чтение и запись.

1. Настройка бэкенда

  1. Перейдите в директорию backend:
    cd backend
    
  2. Создайте файл .env на основе примера .env.example. Заполните его вашими учетными данными от Yandex Cloud S3:
    # .env
    S3_ACCESS_KEY_ID=ВАШ_КЛЮЧ_ДОСТУПА
    S3_SECRET_ACCESS_KEY=ВАШ_СЕКРЕТНЫЙ_КЛЮЧ
    S3_BUCKET_NAME=ИМЯ_ВАШЕГО_БАКЕТА
    
  3. Установите зависимости:
    npm install
    

2. Настройка фронтенда

  1. Перейдите в директорию frontend:
    cd ../frontend
    
  2. Установите зависимости:
    npm install
    

3. Запуск приложения

  1. Запустите бэкенд-сервер. В директории backend выполните:

    npm start
    

    Сервер запустится на http://localhost:3001.

  2. Запустите фронтенд. В новой вкладке терминала, в директории frontend, выполните:

    npm run dev
    

    Приложение будет доступно по адресу http://localhost:5173 и будет автоматически проксировать API-запросы на бэкенд.

🐳 Docker

Приложение полностью готово к запуску в Docker с двумя вариантами интерфейса.

Доступные образы

Основная версия (main branch)

git.shts.su/[repository]:latest

Tabler версия (tabler branch)

git.shts.su/[repository]:tabler

Быстрый запуск

Основная версия

docker run -d \
  --name s3-lists-manager \
  -p 3001:3001 \
  --env-file ./backend/.env \
  git.shts.su/[repository]:latest

Tabler версия

docker run -d \
  --name s3-lists-manager-tabler \
  -p 3002:3001 \
  --env-file ./backend/.env \
  git.shts.su/[repository]:tabler

Локальная сборка

Для сборки образа выполните команду в корневой директории проекта:

docker build -t s3-lists-manager .

Запуск контейнера

Для запуска контейнера необходимо передать переменные окружения. Это можно сделать с помощью флага -e или через --env-file.

docker run --rm -p 3001:3001 --env-file ./backend/.env s3-lists-manager

После этого приложение будет доступно по адресу http://localhost:3001.

Docker Compose

Создайте файл docker-compose.yml:

version: '3.8'

services:
  s3-lists-manager:
    image: git.shts.su/[repository]:latest
    container_name: s3-lists-manager
    ports:
      - "3001:3001"
    restart: unless-stopped
    env_file:
      - ./backend/.env

  s3-lists-manager-tabler:
    image: git.shts.su/[repository]:tabler
    container_name: s3-lists-manager-tabler
    ports:
      - "3002:3001"
    restart: unless-stopped
    env_file:
      - ./backend/.env

Запуск:

docker-compose up -d

Подробная документация по Docker образам доступна в файле DOCKER.md.

⚙️ API Endpoints

Метод Путь Описание
GET /api/domains Получить список всех доменов.
POST /api/domains Сохранить изменения в domains.txt.
GET /api/asns Получить список всех AS.
POST /api/asns Сохранить изменения в asns.txt.
GET /api/servers Получить список всех серверов.
POST /api/servers Сохранить изменения в servers.json.
S
Description
No description provided
Readme
4.5 MiB
Languages
JavaScript 89.4%
Dockerfile 4.7%
CSS 3.9%
HTML 2%