# Test Net Self-hosted тест скорости сети на Node.js без внешних npm-зависимостей. Приложение показывает download/upload скорость, HTTP-пинг до каждого сервера, позволяет выбрать целевой сервер и переключать светлую/темную тему с акцентным цветом. ## Возможности - выбор сервера из общего `servers.json`; - измерение HTTP-пинга от браузера клиента до каждого сервера; - download/upload тесты через выбранный сервер; - SVG-флаги стран в карточках серверов; - автоматическое скачивание недостающих флагов в `flags/`; - светлая и темная тема, пользовательский акцентный цвет; - адаптивный canvas-график скорости с пиками и средними значениями; - cluster-режим Node.js для использования всех CPU. ## Запуск ```bash npm start ``` По умолчанию сервер слушает `http://localhost:3000`. Переменные окружения: ```bash PORT=3000 SERVER_ID=local WORKERS=4 npm start ``` - `PORT` - порт HTTP-сервера. - `SERVER_ID` - id текущего сервера из `servers.json`. - `WORKERS` - количество Node.js worker-процессов. Если не задано, используется количество CPU. ## Конфигурация серверов `servers.json` можно держать одинаковым и синхронизировать на всех серверах. Текущий инстанс выбирается через `SERVER_ID`; если переменная не задана, используется `currentServerId`. ```json { "currentServerId": "de-1", "servers": [ { "id": "de-1", "name": "Frankfurt", "address": "https://de.example.com", "country": "Германия", "countryCode": "de" }, { "id": "nl-1", "name": "Amsterdam", "address": "https://nl.example.com", "country": "Нидерланды", "countryCode": "nl" } ] } ``` Важно: `address` должен быть доступен из браузера клиента. Для тестов между разными доменами backend отправляет CORS-заголовки. ## Флаги При старте primary-процесс читает `servers.json`, создает папку `flags/` и скачивает недостающие SVG-флаги с `https://flagcdn.com/.svg`. Если флаг уже есть локально, повторная загрузка не выполняется. ## API - `GET /` - интерфейс теста. - `GET /api/servers` - JSON со списком серверов и текущим сервером. - `GET /ping` - легкий endpoint для измерения задержки из браузера. - `GET /download` - бесконечный поток байтов для download-теста. - `POST /upload` - принимает поток данных и возвращает количество байтов. - `GET /flags/:code.svg` - локально сохраненный SVG-флаг. ## Как работает измерение Клиент сначала загружает `/api/servers`, затем для каждого сервера делает несколько запросов к `/ping` и показывает минимальное значение. Выбранный сервер используется как base URL для `/download` и `/upload`. График строится в браузере по текущим скоростям, которые обновляются каждые несколько сотен миллисекунд.