# 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 ```powershell cd backend npm install # создайте .env и заполните (пример ниже) npm start ``` Backend поднимется на `http://localhost:3001`. ### Запуск frontend ```powershell 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`: ```dotenv 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) Формат ошибок: ```json { "code": "E_*", "message": "...", "details": {}, "requestId": "..." } ``` Формат успешных `POST/PUT`: ```json { "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](DOCKER.md). Критично для production: - Обязательно смонтировать volume для пути с `SQLITE_PATH`. - Обязательно смонтировать volume для `MIKROTIK_BACKUP_DIR`, иначе `.rsc` backup-файлы потеряются при пересоздании контейнера. - Использовать стабильный `ENCRYPTION_KEY` между перезапусками. Пример запуска: ```powershell 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. ## Структура репозитория ```text backend/ Express API frontend/ Vite + React UI ``` ## Лицензия MIT