test-net/README.md

4.0 KiB
Raw Permalink Blame History

Test Net

Self-hosted тест скорости сети на Node.js без внешних npm-зависимостей. Приложение показывает download/upload скорость, HTTP-пинг до каждого сервера, позволяет выбрать целевой сервер и переключать светлую/темную тему с акцентным цветом.

Возможности

  • выбор сервера из общего servers.json;
  • измерение HTTP-пинга от браузера клиента до каждого сервера;
  • download/upload тесты через выбранный сервер;
  • SVG-флаги стран в карточках серверов;
  • автоматическое скачивание недостающих флагов в flags/;
  • светлая и темная тема, пользовательский акцентный цвет;
  • адаптивный canvas-график скорости с пиками и средними значениями;
  • cluster-режим Node.js для использования всех CPU.

Запуск

npm start

По умолчанию сервер слушает http://localhost:3000.

Переменные окружения:

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.

{
  "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/<countryCode>.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. График строится в браузере по текущим скоростям, которые обновляются каждые несколько сотен миллисекунд.