test-net/README.md

91 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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