Перейти к основному содержимому

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_PROVIDERnominatim (если пусто — эвристика)Провайдер поиска адресов: 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 на Nominatim
  • dadata — подсказки DaData
  • nominatim — OSM Nominatim (без ключа; соблюдать политику использования)

OSM-подложка карты работает без ключей. Яндекс/Google-слои появляются при наличии соответствующих ключей.

Схема работы​

Locale Dropdown

Соответствие пунктов и прав ERP​

С пунктами PWA приложения связаны только следующие права ERP.
Остальные экраны видны без отдельной галочки.

Пункт приложенияПраво в ERP
АбонентыСписок (кроме поиска)
Карта и Выбор карты в меню профиляПокрытие» → Просмотр данных
СкладПросмотр склада
Звонки / Список звонковЖурнал звонков
Терминалы на картекоммутатор

Права, влияющие на действия внутри экранов​

Некоторые права не скрывают пункт меню, а включают отдельные действия внутри соответствующего экрана:

  • изменение склада

    • перемещения;
    • накладные на складе.
  • прослушивание записей

    • кнопка прослушивания записей в звонках.
  • «Редактирование свойств здания»

    • создание здания на карте;
    • редактирование здания на карте.
  • Запись в типе узла и в типе кабельной линии

    • создание узла на карте;
    • создание линии на карте.
  • «Доступные адреса»

    • пункт «Адреса» виден всегда;
    • список домов формируется только из доступной пользователю зоны.
Сопоставление прав с приложением PWA

Прокси 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

Locale Dropdown

Конфигурация​

Файл .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}/wsSTOMP WebSocket ERP
PUBLIC_BASE_URLнетLAN IP proxyURL, с которого ERP может скачать временный файл вложения (…/tmp/…)
TMP_DIRнетtmpКаталог временных файлов для upload
DEBUGнет00 — обычный 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

ПрофильЛогинПароль
Администраторdemodemodemo
Монтажникtechtech

Версия: 1.0.13 Alpha

Штрихкоды для сканирования​

Сканируйте камерой Installer для поиска оборудования или добавления в накладную: штрихкоды (PDF)