v5
Publish Docker image / build-and-push (push) Successful in 1m0s
- Restructured project files for better maintainability and clarity. - Enhanced component organization to streamline imports and improve readability. - Updated relevant documentation to reflect changes in project structure. Made-with: Cursor
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— каталог для локальных.rscbackup-файлов 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, иначе.rscbackup-файлы потеряются при пересоздании контейнера. - Использовать стабильный
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)
- В
backend/package.jsonнет зависимостей AWS SDK. - Приложение стартует с
SQLITE_PATHи создает/использует файл БД. - CRUD по основным данным (
/api/domains-new,/api/ip-ranges,/api/asns) работает после перезапуска контейнера с тем же volume. - Созданный MikroTik backup появляется как локальный
.rscфайл в каталогеMIKROTIK_BACKUP_DIR. - После перезапуска контейнера с тем же volume backup-файл остается доступным.
GET /api/s3/last-modifiedвозвращает метаданные, но интерпретируется как legacy endpoint поверх SQLite.
Структура репозитория
backend/ Express API
frontend/ Vite + React UI
Лицензия
MIT
Languages
JavaScript
89.4%
Dockerfile
4.7%
CSS
3.9%
HTML
2%