Как развернуть свой спидтест на чистом JavaScript без внешних сервисов
Бывало такое, что интернет по тарифу гигабитный, файлы качаются шустро, а рабочий созвон или доступ к домашнему серверу тормозит безбожно? Первая реакция в такой ситуации — открыть известный сайт со спидометром и нажать большую круглую кнопку. Вот только публичные тесты показывают скорость до серверов провайдера, а не реальную пропускную способность внутри локальной сети, офисного контура или до вашего личного облака.
Я наткнулся на репозиторий Speed-Test от проекта OpenSpeedTest. Автор развивает его больше десяти лет, еще с 2011 года. Это открытый инструмент для тестирования пропускной способности сети, написанный исключительно на чистом HTML5, CSS и Vanilla JavaScript. Никаких React, Vue, тяжелых бандлов или внешних зависимостей.
Что под капотом
Главная фишка исходников в их лаконичности. Вся клиентская логика сжата в gzipped-скрипт размером меньше 8 КБ. Интерфейс полностью отрисован в векторном SVG, поэтому он одинаково четко выглядит на старом мониторе и на 4K-дисплее смартфона.
Для работы инструмента клиентской стороне нужен только браузер, поддерживающий XMLHttpRequest (XHR2). Подойдет даже древний Internet Explorer 10. На стороне сервера достаточно отдавать статику через любой веб-сервер: Nginx, Apache, Caddy или Express.
Тут нет скрытых бэкенд-скриптов или сложных бинарников, поэтому поверхность атаки минимальна. По сути вы отдаете браузеру набор статических файлов, после чего клиент начинает слать серию параллельных POST и GET запросов заданного размера.
Управление тестами через URL-параметры
Вместо того чтобы городить громоздкие меню настроек, автор реализовал управление через GET-параметры адресной строки. Это удобно, если вы хотите дать коллегам готовую ссылку с заранее заданным поведением.
Вот несколько полезных параметров:
- Автозапуск теста сразу при открытии страницы:
http://192.168.1.5?Run
- Стресс-тест сети. Можно задать пресет или указать время проверки в секундах. Например, гонять трафик 300 секунд в обе стороны:
http://192.168.1.5?Stress=300
Или короткий синтаксис:
http://192.168.1.5?S=L
- Ограничение количества параллельных HTTP-потоков (по умолчанию 6, максимум 32):
http://192.168.1.5?XHR=4
- Запуск отдельной фазы, например только проверки отдачи или задержки:
http://192.168.1.5?Test=Upload
Если вы хотите собирать статистику с парка офисных машин, в файле index.html можно раскомментировать переменные saveData и указать адрес вебхука вашей базы данных:
var saveData = true;
var saveDataURL = "//metrics.internal.lan/save?data=";
Как запустить у себя
Самый быстрый способ развернуть свой спидтест — готовый Docker-образ. Он собран на базе легковесного Alpine с непривилегированным пользователем Nginx:
docker run -d \
--name openspeedtest \
--restart=unless-stopped \
-p 3000:3000 \
-p 3001:3001 \
openspeedtest/latest
Если привычнее работать с compose, конфигурация выглядит компактно:
version: '3.3'
services:
speedtest:
container_name: openspeedtest
image: openspeedtest/latest
restart: unless-stopped
ports:
- '3000:3000'
- '3001:3001'
После запуска интерфейс будет доступен по адресу http://IP_СЕРВЕРА:3000.
Если ставите сервис за собственный Reverse Proxy, обязательно увеличьте лимит на размер тела запроса client_max_body_size минимум до 35 МБ. Иначе тесты аплоада начнут падать с ошибкой 413.
Кстати, если планируете проверять скорость выше 1 Гбит/с, автор рекомендует использовать Linux-хост. На Docker Desktop под macOS или Windows скорость часто упирается в накладные расходы виртуализации и сетевого моста.
Зачем держать локальный спидтест
Есть несколько сценариев, где обычные веб-сервисы бесполезны:
- Диагностика Wi-Fi и репитеров. Когда вы ставите в доме или офисе повторитель сигнала, скорость в среднем падает вдвое. Тестируя линк локально из разных комнат, можно точно подобрать место для точки доступа без оглядки на колебания внешнего интернет-канала.
- Проверка влияния расширений в браузере. Иногда утилиты вроде iperf показывают честный гигабит, а веб-страницы открываются медленно. Запустите OpenSpeedTest в обычном профиле, а затем в приватном окне. Разница в результатах покажет, сколько миллисекунд съедают установленные плагины.
- Оценка каналов до удаленного офиса. Когда удаленщики жалуются на медленный доступ к файловому хранилищу, локальный контейнер на сервере покажет реальную скорость туннеля.
Стоит ли пробовать
Speed-Test решает одну конкретную задачу без рекламы, сторонней телеметрии и раздутых зависимостей. Если вам регулярно приходится настраивать локальные сети, искать сбоящие патч-корды или проверять производительность домашнего NAS, держите этот образ в запасе. Разворачивается за минуту, ресурсов потребляет минимум, а пользы приносит массу.












