Как развернуть свой спидтест на чистом JavaScript без внешних сервисов

15 авг 2026
3,774
371
27
5 месяцев

Бывало такое, что интернет по тарифу гигабитный, файлы качаются шустро, а рабочий созвон или доступ к домашнему серверу тормозит безбожно? Первая реакция в такой ситуации — открыть известный сайт со спидометром и нажать большую круглую кнопку. Вот только публичные тесты показывают скорость до серверов провайдера, а не реальную пропускную способность внутри локальной сети, офисного контура или до вашего личного облака.

Download OpenSpeedTest-Server V2.1

Я наткнулся на репозиторий Speed-Test от проекта OpenSpeedTest. Автор развивает его больше десяти лет, еще с 2011 года. Это открытый инструмент для тестирования пропускной способности сети, написанный исключительно на чистом HTML5, CSS и Vanilla JavaScript. Никаких React, Vue, тяжелых бандлов или внешних зависимостей.

Download from the Microsoft Store Download from the Mac App Store Download from the App Store Download from the Google Play Store Download from the Snap Store Download from the Docker Hub Download from the Helm Store Download from GitHub

Что под капотом

Главная фишка исходников в их лаконичности. Вся клиентская логика сжата в gzipped-скрипт размером меньше 8 КБ. Интерфейс полностью отрисован в векторном SVG, поэтому он одинаково четко выглядит на старом мониторе и на 4K-дисплее смартфона.

Реклама

Для работы инструмента клиентской стороне нужен только браузер, поддерживающий XMLHttpRequest (XHR2). Подойдет даже древний Internet Explorer 10. На стороне сервера достаточно отдавать статику через любой веб-сервер: Nginx, Apache, Caddy или Express.

Тут нет скрытых бэкенд-скриптов или сложных бинарников, поэтому поверхность атаки минимальна. По сути вы отдаете браузеру набор статических файлов, после чего клиент начинает слать серию параллельных POST и GET запросов заданного размера.

Video Tutorial by Roberto Jorge Tech Video Tutorial by LanPad

Управление тестами через 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.

Download OpenSpeedTest-Server V2.1

Если ставите сервис за собственный Reverse Proxy, обязательно увеличьте лимит на размер тела запроса client_max_body_size минимум до 35 МБ. Иначе тесты аплоада начнут падать с ошибкой 413.

Кстати, если планируете проверять скорость выше 1 Гбит/с, автор рекомендует использовать Linux-хост. На Docker Desktop под macOS или Windows скорость часто упирается в накладные расходы виртуализации и сетевого моста.

Зачем держать локальный спидтест

Есть несколько сценариев, где обычные веб-сервисы бесполезны:

  1. Диагностика Wi-Fi и репитеров. Когда вы ставите в доме или офисе повторитель сигнала, скорость в среднем падает вдвое. Тестируя линк локально из разных комнат, можно точно подобрать место для точки доступа без оглядки на колебания внешнего интернет-канала.
  2. Проверка влияния расширений в браузере. Иногда утилиты вроде iperf показывают честный гигабит, а веб-страницы открываются медленно. Запустите OpenSpeedTest в обычном профиле, а затем в приватном окне. Разница в результатах покажет, сколько миллисекунд съедают установленные плагины.
  3. Оценка каналов до удаленного офиса. Когда удаленщики жалуются на медленный доступ к файловому хранилищу, локальный контейнер на сервере покажет реальную скорость туннеля.

Стоит ли пробовать

Speed-Test решает одну конкретную задачу без рекламы, сторонней телеметрии и раздутых зависимостей. Если вам регулярно приходится настраивать локальные сети, искать сбоящие патч-корды или проверять производительность домашнего NAS, держите этот образ в запасе. Разворачивается за минуту, ресурсов потребляет минимум, а пользы приносит массу.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.