denozord fe7acd655e
Publish Docker image / build-and-push (push) Successful in 2m12s
Rollback frontend and config changes to commit a9a7e98 state.
Restore project files to match the requested baseline before subsequent updates.

Made-with: Cursor
2026-04-26 14:05:50 +07:00
2025-07-07 13:07:26 +07:00

Router Lists UI

UI/Backend для управления BGP-списками, фильтрами и конфигурациями MikroTik.
Текущая модель хранения: SQLite + локальная файловая система (для .rsc backup MikroTik).

Актуальная архитектура хранения

  • Основные данные и объекты приложения хранятся в SQLite (через better-sqlite3).
  • MikroTik backup-файлы (.rsc) хранятся в локальной ФС в каталоге MIKROTIK_BACKUP_DIR.
  • AWS SDK/S3 в runtime не используются.
  • Часть имен API/сервисов (s3*) сохранена для обратной совместимости, но фактический backend storage — SQLite.

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

Требования

  • Node.js 18+
  • npm

Запуск backend

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

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

Запуск frontend

cd frontend
npm install
npm run dev

Frontend доступен на http://localhost:5173.

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

  • SQLITE_PATH — путь к файлу SQLite (по умолчанию backend/data/router-lists.db).
  • MIKROTIK_BACKUP_DIR — каталог для локальных .rsc backup-файлов MikroTik.
  • ENCRYPTION_KEY — 64 hex-символа для шифрования секретов (IPSec/MikroTik).
  • EVOBGP_API_URL, EVOBGP_API_TOKEN — если используете интеграцию EvoBGP.
  • CORS_ORIGINS, LOG_LEVEL, PORT — эксплуатационные настройки сервиса.
  • BGP_BACKGROUND_URL — URL фонового обновления BGP для прокси-эндпоинта POST /api/update-bgp/background.

Пример .env:

PORT=3001
LOG_LEVEL=info
SQLITE_PATH=./data/router-lists.db
MIKROTIK_BACKUP_DIR=./data/backups/mikrotik
ENCRYPTION_KEY=<64-hex>
CORS_ORIGINS=http://localhost:5173
BGP_BACKGROUND_URL=http://77.232.38.173:8080/api/update_bgp/background?api_key=...

API (backend)

Формат ошибок:

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

Формат успешных POST/PUT:

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

Примечание по legacy-терминам

  • GET /api/s3/last-modified и функции вида readS3*/writeS3* — это legacy-названия.
  • Фактически эти операции работают с SQLite-backed хранилищем.

Основные эндпоинты

  • Данные: /api/domains-new, /api/ip-ranges, /api/asns, /api/communities
  • Фильтры/конфиги: /api/filters, /api/server-configs, /api/server-filters
  • MikroTik: /api/mikrotik/generate, /api/mikrotik/generate-interfaces, /api/mikrotik/generate-recursive-routes, /api/mikrotik/test-connection, /api/mikrotik/apply
  • Прочее: /api/servers, /api/billing, /api/auto-urls, /api/servers/availability, /api/locks/:resource, /api/history/:resource

Docker

Полная инструкция: DOCKER.md.

Критично для production:

  • Обязательно смонтировать volume для пути с SQLITE_PATH.
  • Обязательно смонтировать volume для MIKROTIK_BACKUP_DIR, иначе .rsc backup-файлы потеряются при пересоздании контейнера.
  • Использовать стабильный ENCRYPTION_KEY между перезапусками.

Пример запуска:

docker run -d `
  --name router-lists-ui `
  -p 3001:3001 `
  --env-file ./backend/.env `
  -e SQLITE_PATH=/data/router-lists.db `
  -e MIKROTIK_BACKUP_DIR=/data/backups/mikrotik `
  -v router-lists-data:/data `
  git.shts.su/[repository]:latest

Чек-лист проверки соответствия (S3 -> SQLite)

  1. В backend/package.json нет зависимостей AWS SDK.
  2. Приложение стартует с SQLITE_PATH и создает/использует файл БД.
  3. CRUD по основным данным (/api/domains-new, /api/ip-ranges, /api/asns) работает после перезапуска контейнера с тем же volume.
  4. Созданный MikroTik backup появляется как локальный .rsc файл в каталоге MIKROTIK_BACKUP_DIR.
  5. После перезапуска контейнера с тем же volume backup-файл остается доступным.
  6. GET /api/s3/last-modified возвращает метаданные, но интерпретируется как legacy endpoint поверх SQLite.

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

backend/   Express API
frontend/  Vite + React UI

Лицензия

MIT

S
Description
No description provided
Readme
4.5 MiB
Languages
JavaScript 89.4%
Dockerfile 4.7%
CSS 3.9%
HTML 2%