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