Installer
Installer — мобильное приложение для монтажников интернет-провайдера и оператора связи. Приложение работает как PWA и интегрируется с учётной системой ERP UserSide и аналагичных.
Возможности
- Работа с нарядами: просмотр, поиск, фильтрация, создание и изменение статусов задач.
- Карточка задачи: описание, чек-лист, исполнители, комментарии, оборудование, файлы, история и связанные объекты.
- Фото и документы по задачам с загрузкой через камеру или галерею.
- Работа с абонентами: поиск по ФИО, адресу и лицевому счёту, просмотр договора, тарифа, услуг, баланса и контактных данных.
- Работа с оборудованием абонентов: ONU, MAC/IP, уровни PON, выдача и возврат ТМЦ.
- Интерактивная карта сети с GPS-позицией сотрудника.
- Отображение узлов, муфт, опор, колодцев, кабелей, волокон, домов и других объектов сети.
- Использование картографических подложек OpenStreetMap, Яндекс и Google.
- Измерение расстояний на карте (линейка).
- Поиск и геокодирование адресов.
- Создание и редактирование объектов сети, линий, кабелей и зданий в соответствии с правами сотрудника.
- Просмотр схемы коммутации узлов из ERP.
- Работа с личным инвентарём и складом.
- Поиск оборудования по серийному номеру, MAC-адресу или штрихкоду.
- Сканирование штрихкодов и QR-кодов камерой устройства.
- Перемещение ТМЦ между сотрудником, абонентом, домом, узлом, задачей и складом.
- Справочник адресов с поиском домов.
- Складские накладные на перемещение ТМЦ.
- Поиск ONU/ONT с отображением текущего уровня сигнала и порта OLT.
- История уровней PON и параметров ONU.
- Уведомления о событиях ERP через Web Push и канал реального времени.
- Чат между сотрудниками.
- Блокнот с разделами и заметками из ERP.
- Табель: календарь явок, сверхурочных и аварийных выездов.
- Управление началом и окончанием смены.
- Профиль сотрудника и доступ к функциям в соответствии с правами ERP.
- Установка на смартфон, планшет или компьютер без использования магазина приложений.
- Работа в браузере и в режиме установленного PWA-приложения.
Технические характеристики
- React, TypeScript, Progressive Web App (PWA).
- Интеграция с ERP через серверный Go-proxy.
- JWT-аутентификация; API-ключ ERP не передаётся клиенту.
- Карты на базе Leaflet.
- Локальное хранение кэша и истории уведомлений в IndexedDB.
- Уведомления через STOMP и Web Push.
- Поддержка GPS-позиционирования при открытом приложении.
- Портретная ориентация, режим standalone.
Требования
- HTTPS на хосте PWA в проде (геолокация, камера, Web Push, установка PWA)
Параметры конфигурации PWA
Задаются в dist/config.js на сервере.
Префикс REACT_APP_ — исторический; все ключи ниже входят в runtime-конфиг.
Обязательные / основные
| Параметр | По умолчанию | Описание |
|---|---|---|
REACT_APP_API_URL | — | Базовый URL ipx без хвоста /api (напр. https://api.example.com). От него строятся /api, /webpush, иконки узлов и т.п. |
REACT_APP_STOMP_URL | из API_URL → ws(s)://{host}/ws | Явный URL STOMP. Обычно не нужен, если WS на том же хосте, что API |
REACT_APP_LOGO_URL | пусто | URL логотипа в шапке (ссылка на главную). Пусто — без картинки-лого |
Карты и геопоиск
| Параметр | По умолчанию | Описание |
|---|---|---|
REACT_APP_MAP_SEARCH_PROVIDER | nominatim (если пусто — эвристика) | Провайдер поиска адресов: yandex | dadata | nominatim |
REACT_APP_YANDEX_TILES_KEY | — | Ключ Tiles API — только подложка карты (не для поиска) |
REACT_APP_YANDEX_GEOCODER_KEY | — | JS API / Geocoder — поиск и reverse |
REACT_APP_YANDEX_SUGGEST_KEY | — | Геосаджест — подсказки адресов |
REACT_APP_YANDEX_MAPS_KEY | — | Устаревший/общий fallback для тайлов и геокодера, если отдельные ключи пусты |
REACT_APP_DADATA_API_KEY | — | Токен DaData (если provider = dadata или автовыбор) |
REACT_APP_GOOGLE_MAPS_KEY | — | Ключ тайлов Google (карта / спутник / гибрид) |
Поведение поиска:
yandex— suggest + geocoder; без ключа или при ошибке → fallback на Nominatimdadata— подсказки DaDatanominatim— OSM Nominatim (без ключа; соблюдать политику использования)
OSM-подложка карты работает без ключей. Яндекс/Google-слои появляются при наличии соответствующих ключей.
Схема работы

Соответствие пунктов и прав ERP
С пунктами PWA приложения связаны только следующие права ERP.
Остальные экраны видны без отдельной галочки.
| Пункт приложения | Право в ERP |
|---|---|
| Абоненты | Список (кроме поиска) |
| Карта и Выбор карты в меню профиля | Покрытие» → Просмотр данных |
| Склад | Просмотр склада |
| Звонки / Список звонков | Журнал звонков |
| Терминалы на карте | коммутатор |
Права, влияющие на действия внутри экранов
Некоторые права не скрывают пункт меню, а включают отдельные действия внутри соответствующего экрана:
-
изменение склада
- перемещения;
- накладные на складе.
-
прослушивание записей
- кнопка прослушивания записей в звонках.
-
«Редактирование свойств здания»
- создание здания на карте;
- редактирование здания на карте.
-
Запись в типе узла и в типе кабельной линии
- создание узла на карте;
- создание линии на карте.
-
«Доступные адреса»
- пункт «Адреса» виден всегда;
- список домов формируется только из доступной пользователю зоны.
Прокси Installer
ipx (installer proxy) — серверная часть Installer на Go. Клиент (PWA) не ходит в ERP напрямую: все запросы идут через ipx. API-ключ ERP хранится только на proxy и на устройство не передаётся.
Установка
sudo bash -c 'curl -fsSL https://files.nodelink.ru/installer/ipx -o /tmp/ipx && chmod +x /tmp/ipx && /tmp/ipx install'
Это скачает бинарник, сделает его исполняемым и запустит install: бинарник в /usr/local/bin/ipx, systemctl enable --now ipx.
Команды:
ipx # запуск сервера (foreground)
ipx install # systemd-сервис (нужен root)
ipx uninstall # остановить и удалить сервис (каталог /opt/ipx сохраняется)
ipx restart # перезапуск сервиса
ipx status # статус systemd
ipx help # справка
Чтобы сервис не шёл от root, при ipx install
- Создаёт системного пользователя ipx, если его ещё нет (useradd --system, shell nologin, home /opt/ipx, без логина). Если пользователь или группа уже есть — переиспользует их.
- Пишет в unit
User=ipxиGroup=ipx. - Делает chown на
/opt/ipx(включая.env,webpush/,tmp/).
Повторный sudo ipx install на уже установленной машине подхватит того же пользователя, перезапишет unit и перезапустит сервис уже не от root, uninstall пользователя не удаляет — как и каталог /opt/ipx. Убрать вручную: userdel ipx.
Записи звонков
Как работает воспроизведение записи
PWA приложение не обращается к record_url напрямую. Это важно, потому что record_url может указывать на HTTP-ресурс во внутренней сети, например http://192.168.1.1/..., а PWA приложение может не иметь доступ к внутреннему ресурсу.
Вместо этого запись проходит через IPX:
- Пользователь нажимает Play в PWA приложении.
- PWA отправляет в IPX HTTPS-запрос call/get_record с id звонка и JWT.
- IPX по id запрашивает в ERP данные звонка через call/get.
- ERP возвращает record_url, если у пользователя есть права доступа.
- IPX проверяет полученный URL и сам запрашивает запись у рекордера по HTTP/HTTPS.
- IPX потоково передаёт полученные аудиоданные обратно в PWA по HTTPS.
- PWA получает ответ как Blob, создаёт blob: URL через URL.createObjectURL() и передаёт его в
<audio>. - Браузер видит только HTTPS-запросы и blob:https://..., поэтому mixed content отсутствует.
IPX должен резолвить хосты АТС/рекордера в LAN

Конфигурация
Файл .env загружается из рабочей директории и/или рядом с бинарником. Переменные окружения процесса имеют приоритет над .env (уже заданные не перезаписываются).
При установке через ipx install конфиг ожидается в /opt/ipx/.env (если файла ещё нет — копируется найденный .env).
Переменные
| Переменная | Обязательно | По умолчанию | Описание |
|---|---|---|---|
LISTEN_ADDR | нет | :8080 | Адрес прослушивания IPX |
ERP_URL | да | — | Базовый URL ERP со слэшем в конце, напр. http://192.168.1.44/ |
ERP_API_KEY | да | — | API-ключ ERP (поле key в запросах к api.php) |
ERP_WS_URL | нет | из ERP_URL → ws(s)://{host}/ws | STOMP WebSocket ERP |
PUBLIC_BASE_URL | нет | LAN IP proxy | URL, с которого ERP может скачать временный файл вложения (…/tmp/…) |
TMP_DIR | нет | tmp | Каталог временных файлов для upload |
DEBUG | нет | 0 | 0 — обычный JSON; 1 — сырой ответ ERP как text/plain (ломает SPA). JWT не отключается |
CORS_ORIGIN | нет | * | Значение Access-Control-Allow-Origin |
SESSION_SECRET | нет* | dev-строка | Секрет HMAC для JWT (HS256). В проде задать длинную случайную строку |
WEBPUSH_DIR | нет | webpush | Каталог VAPID-ключей и подписок |
VAPID_SUBJECT | нет | mailto:installer@localhost | Контакт VAPID (mailto: или https:) |
CALL_RECORD_HOSTS | нет | пусто | Cписок хостов, которым IPX разрешено запрашивать записи. |
* Без смены SESSION_SECRET токены можно подделать при известном дефолте.
Пример .env
LISTEN_ADDR=:8080
ERP_URL=https://erp.example.com/
ERP_API_KEY=your-erp-api-key
SESSION_SECRET=длинная-случайная-строка
CORS_ORIGIN=https://installer.example.com
PUBLIC_BASE_URL=https://api-installer.example.com
WEBPUSH_DIR=webpush
VAPID_SUBJECT=mailto:support@example.com
DEBUG=0
Демо
Адрес: https://installer.nodelink.ru
| Профиль | Логин | Пароль |
|---|---|---|
| Администратор | demo | demodemo |
| Монтажник | tech | tech |
Версия: 1.0.13 Alpha
Штрихкоды для сканирования
Сканируйте камерой Installer для поиска оборудования или добавления в накладную: штрихкоды (PDF)