hw-connector
Локальный веб-сервис, через который веб-приложения работают с торговым оборудованием компьютера: ККТ, банковскими терминалами, принтерами и сканерами штрихкодов.
Сервис запускается на компьютере, к которому подключено оборудование, и принимает запросы только с этого
компьютера: http://localhost:7790. У него две стороны:
- Страница настройки — http://localhost:7790/: подключение и проверка устройств, принтеры, шаблоны отчётов, журнал операций.
- REST API —
http://localhost:7790/api/v1: веб-приложение в браузере или программа на этом компьютере пробивает чеки, проводит оплату картой, печатает документы. Полное описание с примерами — Swagger UI (описание на русском и английском), схема OpenAPI — /v3/api-docs/ru и /v3/api-docs/en.
Сервис работает в фоне, показывает значок в трее Windows и запускается вместе с Windows.
Быстрый старт
- Установите ПО оборудования, если оно нужно (см. Оборудование): драйвер ДТО10 x64 для ККТ АТОЛ, программу банка для терминала.
- Откройте страницу настройки: значок в трее → «Открыть интерфейс» или http://localhost:7790/.
- На вкладке «Оборудование» нажмите «Подключить устройство», выберите тип, заполните поля и нажмите «Сохранить и проверить». Карточка устройства покажет «на связи» или что исправить.
- На вкладке «Принтеры» назначьте принтеры для билетов и документов, задайте бумагу и напечатайте тестовую страницу.
- На вкладке «Рабочее место» укажите кассира и, если нужно, почту отправителя, место расчётов и СНО.
- Подключите веб-приложение к API (см. API).
Меню
Оборудование
Язык интерфейса переключается кнопками RU / EN в заголовке страницы, справки и в меню значка в трее.
Карточки устройств: ККТ, терминалы, принтеры без драйвера, дисплеи покупателя, сканеры, считыватели карт, денежные ящики, порты. Номер в углу карточки (№1, №2…) — номер устройства в API.
- Переключатель — включить или выключить устройство. Выключенное устройство не принимает операций.
- Проверить — проверить связь без денежных операций: для ККТ — состояние смены, для терминала — наличие ПО банка или ответ терминала, для сканера — открыт ли порт и последний код.
- Операции — действия с устройством вручную. ККТ: открыть смену, X-отчёт, закрыть смену (Z-отчёт), открыть денежный ящик, внесение и выплата наличных. Терминал: сверка итогов, слип показывается на экране. Принтер: напечатать текст, открыть ящик (ESC/POS). Дисплей: показать строки, очистить, открыть страницу второго монитора. Ящик: открыть. Порт: отправить байты и посмотреть ответ. У сканеров и считывателей операций нет — коды и карты приходят событиями.
- ⚙ Настроить — изменить параметры или удалить устройство.
- Подключить устройство — выбрать тип и заполнить поля. COM-порт выбирается из списка с названиями устройств; кнопка ⟳ ищет порты заново. Изменения применяются сразу, без перезапуска сервиса.
Принтеры
- Назначения — принтер для билетов и принтер для документов. Приложение печатает «по назначению»
(
role), не зная имени принтера. Без назначения — принтер Windows по умолчанию. Назначить можно и принтер без драйвера из списка устройств. - Настройки печати — бумага (как в документе, бланк билета 148 × 79 мм, лента 80 или 58 мм, A4 или свой
размер), масштаб (как в документе, вписать в бумагу, уменьшить, если не помещается), ориентация.
Применяются к PDF, картинкам и отчётам; команды принтера (
raw) идут как есть. - Тестовая страница — имя принтера, дата и кириллица: сразу видно, что печать и шрифты работают.
Отчёты
- Список шаблонов JasperReports (
*.jrxml) с параметрами$P{…}и полями$F{…}. - В установке уже есть шаблон TICKET — билет на бланке 148 × 79 мм. Каждая строка данных печатается
отдельным билетом на своей странице; поля:
top_line,upper_line,pos_line,addr_line,service_line,date_line,place_line,price_line,sold_line,sale_line,control_line,bottom_line,footer_line. - Загрузить шаблон или перетащить файлы на страницу. Шаблон проверяется компиляцией: с ошибкой не сохраняется. Можно и просто положить файлы в папку шаблонов — её путь показан на странице.
- Сформировать — ввести параметры и строки данных в JSON, открыть PDF или отправить на принтер.
Рабочее место
Значения по умолчанию для операций ККТ. Сервис подставляет их, только если в запросе их нет; переданное в запросе всегда важнее.
- Кассир: ФИО (тег 1021) и ИНН (тег 1203). Если кассир задан, поле
operatorв запросах можно не передавать. Если кассир не указан ни в запросе, ни здесь, операция не выполняется (422). - Почта отправителя (тег 1117): обратный адрес электронных чеков.
- Место расчётов (тег 1187): пусто — как зарегистрировано в ККТ.
- Система налогообложения: «Как в ККТ» — СНО, которую ККТ выбирает сама.
Ниже на той же вкладке — доступ к агенту и печать PDF. Изменения действуют сразу, без перезапуска,
и сохраняются в data\access.json; «Как в файле настроек» возвращает значения из config\application.yml.
- Разрешённые сайты: адреса программы кассы (например
https://bigbilet.com), которым можно обращаться к агенту из браузера. Запросы с других сайтов отклоняются. - Токен API: если задан, программа кассы передаёт
Authorization: Bearer <токен>(для событий —?access_token=). Кнопка «Создать» придумывает случайный токен — перенесите его в настройки программы кассы, иначе она получит 401. Пусто — токен не нужен. - Откуда можно печатать: начало адресов PDF, которые агент скачивает для печати; ожидание скачивания, наибольший размер файла и число файлов в одном задании.
Журнал
Все операции с устройствами: статус, что происходит сейчас, результат или ошибка. Обновляется вживую (зелёная точка у вкладки — события подключены). Щелчок по строке показывает операцию целиком. Хранятся 1000 последних операций, в том числе после перезапуска.
Значок в трее
Значок показывает, что сервис работает; подсказка и верхние строки меню — версия, число включённых устройств и порт. Двойной щелчок открывает интерфейс. Меню (правая кнопка):
- Открыть интерфейс, Журнал операций, Справка — страницы в браузере.
- Проверить оборудование — проверка связи со всеми включёнными устройствами, итог приходит уведомлением Windows.
- Папка программы — настройки (
config\,data\), шаблоны отчётов и логи. - Запускать при входе в Windows — ярлык в автозагрузке; пункт есть у установленной программы. При первом запуске после установки автозапуск включается сам.
- Язык / Language — русский или английский. Язык общий для значка, страницы настройки и справки; на странице его переключают кнопками RU / EN в заголовке.
- Выход — после подтверждения: пока сервис остановлен, оборудование и печать недоступны.
Поддерживаемое оборудование
| Устройство | Как подключается | Что нужно на компьютере |
|---|---|---|
| ККТ АТОЛ (платформа 5) | COM-порт, USB, сеть | Драйвер ДТО10 x64 |
| ККТ Штрих-М, Меркурий в режиме ФР, Ритейл, ЭЛВЕС, Paykiosk | Сеть или USB (RNDIS, порт 7778), COM-порт; протокол обмена версии 1 или 2 | Ничего: сервис работает с ККТ напрямую |
| ККТ Пирит 2Ф, Вики Принт 57/80, Дримкас-Ф | COM-порт (по умолчанию 57600), сеть через модуль Wi-Fi | Ничего; режим ФФД 1.2 |
| ККТ КИТ (КАСБИ): КИТ Онлайн-Ф, Терминал-ФА | Сеть (порт 50003) или COM-порт; ФФД 1.05 и 1.2 | Ничего; денежный ящик к КИТ не подключается |
| Терминал INPAS (Verifone, PAX) | Через DualConnector | INPAS DualConnector |
| Терминал Сбербанка | Через UPOS (sb_pilot.exe) | Дистрибутив UPOS, порт пинпада — в его pinpad.ini |
| Терминал ARCUS 2 (Ingenico) | Через Аркус-2 (CommandLineTool.exe) | ПО Аркус-2 |
| Терминал UCS | Кабель (COM-порт) или сеть | Ничего |
| Терминал с протоколом ТТК2 | Сеть (обычно порт 888) | Ничего; на терминале включить приём команд от кассы |
| Оплата по QR через СБП: Т-Банк, Сбербанк | Интернет-эквайринг банка по HTTPS | Ничего; ключи из договора эквайринга с подключённым СБП |
| Принтер чеков ESC/POS (Epson, Xprinter, Posiflex, АТОЛ, Штрих…) | Сеть (порт 9100), COM-порт, принтер Windows в режиме RAW | Ничего; для USB без COM — принтер в Windows (подойдёт Generic / Text Only) |
| Принтер этикеток и билетов ZPL (Zebra), TSPL (TSC), EZPL (Godex) | Сеть (9100), COM-порт, принтер Windows в режиме RAW | Так же |
| Билетный принтер Boca Systems (FGL) | Сеть (9100), COM-порт, принтер Windows в режиме RAW; 200 или 300 dpi | Так же |
| Любой принтер Windows | Драйвер Windows | Драйвер принтера |
| Дисплей QR-кодов Mertech QR-PA, QR-Screen | COM-порт (USB как виртуальный COM) | Драйвер виртуального COM дисплея |
| Дисплей покупателя VFD/LCD (Epson ESC/POS, CD5220) | COM-порт (USB как виртуальный COM) | Драйвер виртуального COM дисплея |
| Дисплей покупателя на втором мониторе | Страница display.html?device=N во весь экран | Браузер |
| Денежный ящик | Через ККТ, через принтер ESC/POS или свой COM-порт | Ничего |
| Сканер штрихкодов | COM-порт (USB как виртуальный COM) или USB HID POS | Для COM — драйвер виртуального COM сканера |
| Считыватель карт NFC/RFID (ACR122U, ACR1252, Omnikey…) | USB, PC/SC | Драйвер CCID считывателя (обычно ставится сам), служба «Смарт-карта» |
| ИБП | USB, Windows видит его как батарею | Ничего |
| Другое устройство на COM-порту или в сети | «Порт устройства»: байты отправляет и получает приложение | Ничего |
Для проверки без оборудования есть эмуляторы ККТ и терминала (группа «Для разработки»).
Совместимые ККТ
Многие ККТ других марок внутри работают по протоколу Штрих-М или Пирит. Для них не нужен отдельный драйвер: в окне «Подключить устройство» у каждой есть свой пункт, а настройки те же, что у ККТ с этим протоколом.
| ККТ | Протокол | Как подключить |
|---|---|---|
| Ритейл-01Ф, Ритейл-02Ф, Ритейл-Комбо-01Ф | Штрих-М | Пункт «Ритейл»: USB (RNDIS, 192.168.137.111, порт 7778) или COM-порт; пароли кассира и администратора по умолчанию 30 |
| ЭЛВЕС-ФР-Ф | Штрих-М | Пункт «ЭЛВЕС»: так же, как Штрих-М |
| Paykiosk PayOnline-01-ФА, Pay VKP-80К-ФА | Штрих-М | Пункт «Paykiosk»: обычно USB как виртуальный COM-порт — выберите «COM-порт» и нажмите «Найти порты» |
| РР-01Ф, РР-02Ф, РР-03Ф, РР-04Ф (РР-Электро) | Штрих-М, обычно обмен версии 2 | Пункт «РР-Электро»: так же, как Штрих-М; версия протокола 2 выбрана по умолчанию |
| Меркурий в режиме ФР | Штрих-М | Пункт «Штрих-М, Меркурий» |
| Вики Принт 57Ф, 57+Ф, 80+Ф (Дримкас) | Пирит | Пункт «Вики Принт»: COM-порт (USB как виртуальный COM, 57600) или сеть через модуль Wi-Fi; пароль связи PIRI |
| Пирит 1Ф, 2Ф, 2СФ (Кристалл Сервис) | Пирит | Пункт «Пирит» |
Если связи нет, проверьте на самой ККТ скорость COM-порта и версию протокола обмена: обычно они печатаются в тесте ККТ при включении с нажатой кнопкой протяжки.
Оплата по QR (СБП). «СБП по QR» подключается как банковский терминал и вызывается теми же методами
/terminals/{id}/…. При оплате приложение создаёт платёж в банке и показывает QR-код: в окне приложения,
на дисплее покупателя, номер которого указан в настройке (второй монитор, дисплей QR-кодов Mertech или QR-Screen), и событием qr для вашей программы.
Покупатель сканирует QR в приложении своего банка, приложение каждые 2 секунды спрашивает банк о статусе.
Не оплатили за время ожидания — платёж отменяется. Номер платежа в банке возвращается в paymentRef.idProcessing,
по нему делается возврат. Сверка итогов для СБП не нужна.
- Т-Банк: TerminalKey и пароль терминала из личного кабинета Т-Бизнеса (Интернет-эквайринг → Магазины → Терминалы).
- Сбербанк: логин и пароль API (обычно
…-api), которые выдаёт банк. - Среда «Тестовая» работает с тестовыми серверами банков: деньги не списываются, удобно для проверки.
API
Принципы
- Операции. Всё, что меняет состояние устройства, — операция.
POSTвозвращает её снимок:{id, type, status, stage, result, error, warnings, createdAt, startedAt, finishedAt}.status:QUEUED→RUNNING→SUCCEEDEDилиFAILED;UNKNOWN— сервис перезапустился во время операции, результат нужно проверить на устройстве. - Очередь. Операции на одном устройстве выполняются по очереди, на разных — параллельно.
- Идемпотентность. Каждый
POSTс операцией несёт заголовокIdempotency-Key(например, UUID на одно действие пользователя). Повтор с тем же ключом возвращает ту же операцию и не проводит оплату второй раз. - Ожидание.
Prefer: wait=30— подождать результат до 30 секунд (максимум 180):200, если операция закончилась, иначе202иLocationс адресом операции. - События.
GET /api/v1/events— Server-Sent Events:operationпри каждом изменении операции,barcode— код со сканера{deviceId, code, at},card— карта на считывателе{deviceId, uid, atr, reader, at},display— строки дисплея на втором мониторе,qr— QR для оплаты по СБП{deviceId, display, payload, amount, paymentId, bank, at}(payload: null— убрать QR),power— смена питания{source: AC|BATTERY, battery, batteryPercent, minutesLeft}. - Суммы — целые копейки. Перечисления — строками (
SELL,CARD,VAT20). - Документация. Swagger UI — все поля и примеры; язык описания — в списке «Select a definition».
Методы
| Метод | Что делает |
|---|---|
GET/api/v1/health | Сервис работает: версия, время запуска, питание (сеть или батарея) |
GET/api/v1/devices | Устройства: номер, вид, тип, название |
GET/api/v1/registers/{id}/shift | Состояние смены ККТ |
POST/api/v1/registers/{id}/shift/open | Открыть смену {operator}* |
POST/api/v1/registers/{id}/shift/close | Закрыть смену (Z-отчёт) {operator}* |
POST/api/v1/registers/{id}/reports/x | X-отчёт {operator}* |
POST/api/v1/registers/{id}/reports/calculation-state | Отчёт о текущем состоянии расчётов {operator}* |
GET/api/v1/registers/{id}/counters | Счётчики ККТ: число чеков и суммы по признакам расчёта за смену и за всё время ФН (АТОЛ, Штрих-М, Пирит) |
GET/api/v1/registers/{id}/fn-documents/{n} | Документ из ФН по номеру (АТОЛ, Штрих-М) |
POST/api/v1/registers/{id}/fn-documents/{n}/print | Напечатать копию документа из ФН (АТОЛ, Пирит) |
POST/api/v1/registers/{id}/cash/in | Внесение наличных {operator*, amount} |
POST/api/v1/registers/{id}/cash/out | Выплата наличных {operator*, amount} |
POST/api/v1/registers/{id}/cash-drawer/open | Открыть денежный ящик |
POST/api/v1/registers/{id}/receipts | Пробить чек |
POST/api/v1/registers/{id}/corrections | Чек коррекции {receipt, correction: {type: SELF|INSTRUCTION, baseDate, baseNumber}} — АТОЛ, Штрих-М, Пирит |
POST/api/v1/registers/{id}/documents | Напечатать нефискальный текст {lines} |
POST/api/v1/terminals/{id}/payments | Оплата картой {amount} |
POST/api/v1/terminals/{id}/refunds | Возврат на карту {amount, paymentRef} |
POST/api/v1/terminals/{id}/cancellations | Отмена оплаты в тот же день {amount, paymentRef} |
POST/api/v1/terminals/{id}/settlements | Сверка итогов |
POST/api/v1/terminals/{id}/emergency-reversals | Аварийная отмена последней операции, если касса не получила её результат {amount, paymentRef?} |
POST/api/v1/terminals/{id}/reports?full=false | Отчёт терминала по операциям смены без сверки: краткий или полный (full=true) |
GET/api/v1/terminals/{id}/last-slip | Слип последней успешной операции из журнала — чтобы напечатать ещё раз |
GET/api/v1/qr?text=…&size=400 | Картинка QR-кода PNG, например для payload из события qr |
POST/api/v1/checkouts | Продажа или возврат целиком: карта → чек → слип; если чек не напечатан — оплата отменяется |
GET/api/v1/printers | Принтеры Windows, назначения, настройки |
POST/api/v1/print-jobs | Печать: urls, document (PDF base64), images, raw, report или text (строки, только для принтера без драйвера); printer, device (принтер без драйвера) или role, copies |
POST/api/v1/cash-drawers/{id}/open | Открыть денежный ящик: id — ККТ, принтер ESC/POS или ящик на COM-порту |
POST/api/v1/displays/{id} | Показать строки на дисплее покупателя {lines}; пустой список — очистить |
POST/api/v1/displays/{id}/qr | Показать QR-код на дисплее QR-кодов или втором мониторе {payload, top, bottom}; пустой payload — убрать |
GET/api/v1/displays/{id} | Что показано на дисплее |
POST/api/v1/channels/{id}/exchange | Отправить байты в порт устройства и получить ответ {hex | base64 | text, readTimeoutMs, until} |
GET/api/v1/reports | Шаблоны отчётов с параметрами и полями |
POST/api/v1/reports/{name}/render | PDF по шаблону {parameters, rows} — сразу, не операция |
GET/api/v1/operations/{id} | Операция; с Prefer: wait=N ждёт окончания |
GET/api/v1/operations?limit=50 | Последние операции |
GET/api/v1/events | События (SSE) |
* operator можно не передавать, если кассир задан на вкладке «Рабочее место».
Тело запроса тогда тоже не нужно.
Методы /api/v1/setup/… обслуживают страницу настройки и доступны только с неё.
Чек
{
"type": "SELL", // SELL, SELL_RETURN, BUY, BUY_RETURN
"taxation": "USN_INCOME", // OSN, USN_INCOME, USN_INCOME_OUTCOME, ESHN, PATENT; нет — из «Рабочего места» или СНО ККТ
"operator": {"name": "Иванова И.И.", "inn": "770123456789"}, // нет — кассир из «Рабочего места»
"customer": {"contact": "+79991234567"}, // для электронного чека
"header": [
{"kind": "TEXT", "text": "Заказ 123", "align": "CENTER"},
{"kind": "PAIR", "text": "Дата:", "right": "01.11.2026 19:00"},
{"kind": "SEPARATOR"}
],
"items": [
{"name": "Услуга", "price": 150000, "quantity": 1, "amount": 150000,
"vat": "NONE", "paymentMethod": "FULL_PAYMENT", "paymentObject": "SERVICE"}
],
"payments": [{"type": "CARD", "amount": 150000}], // CASH, CARD, PREPAID, CREDIT, OTHER
"footer": [],
"electronic": false, // true — не печатать, отправить покупателю
"senderEmail": "kassa@example.ru", // тег 1117; нет — из «Рабочего места»
"settlementPlace": "Касса" // тег 1187; нет — из «Рабочего места»
}
Сумма оплат должна быть равна сумме позиций, стоимость позиции — цене × количество. Строки текста переносятся по ширине ленты ККТ автоматически.
Примеры
Продажа с оплатой картой — оплата, чек и слип одной операцией:
POST /api/v1/checkouts
Content-Type: application/json
Idempotency-Key: 3f6c1d9e-1b2a-4c55-9e0d-6a1f0c2b7d11
Prefer: wait=170
{"registerId": 1, "terminalId": 2, "receipt": { … }, "printSlip": true}
Ответ: операция с result.receipt (номер ФД, ФП, смена, QR-код) и result.payment
(paymentRef, карта, RRN, код авторизации, слип). paymentRef нужен для возврата.
Печать PDF на принтер билетов:
POST /api/v1/print-jobs
Idempotency-Key: …
{"urls": ["https://example.com/tickets/1.pdf"], "role": "tickets", "copies": 1}
Отчёт по шаблону — сразу PDF или на принтер:
POST /api/v1/reports/ACT/render
{"parameters": {"NUMBER": "15", "DATE": "2026-11-01"},
"rows": [{"NAME": "Позиция 1", "PRICE": 1500}]}
POST /api/v1/print-jobs
{"report": {"name": "ACT", "parameters": { … }, "rows": [ … ]}, "role": "documents"}
Билеты по шаблону TICKET — по билету на строку, на принтер билетов:
POST /api/v1/print-jobs
Idempotency-Key: …
{"report": {"name": "TICKET", "rows": [
{"top_line": "ООО Концерты", "pos_line": "Большой зал", "addr_line": "ул. Тверская, 1",
"service_line": "Концерт (12+)", "date_line": "Дата: 01.11.2026 Время начала: 19:00",
"place_line": "Партер ряд 5 место 12", "price_line": "Стоимость услуги: 1500.00 р.",
"sold_line": "31.10.2026 10:00 Кассир: Иванова И.И.", "sale_line": "1911-000123"}
]}, "role": "tickets"}
Команды принтера как есть (ESC/POS, ZPL) — например, этикетка ZPL:
POST /api/v1/print-jobs
{"raw": "XlhBXkZPNTAsNTBeQTBOLDUwXkZESGVsbG9eRlNeWFo=", "printer": "Zebra ZD220"}
Ожидание операции и события в браузере:
const events = new EventSource('http://localhost:7790/api/v1/events');
events.addEventListener('operation', e => {
const op = JSON.parse(e.data);
console.log(op.type, op.status, op.stage); // «Приложите карту к терминалу»
});
events.addEventListener('barcode', e => console.log(JSON.parse(e.data).code));
Ошибки
Ошибки запроса — ответ в формате RFC 9457 (application/problem+json) с полем code:
| HTTP | code | Когда |
|---|---|---|
| 400 | INVALID_REQUEST или нет | Неверный JSON, нет Idempotency-Key, нарушены ограничения полей (тогда code: INVALID_REQUEST и поля в detail) |
| 404 | DEVICE_NOT_FOUND, REPORT_NOT_FOUND | Нет такого устройства или шаблона |
| 409 | IDEMPOTENCY_KEY_REUSED, DEVICE_BUSY | Ключ уже использован для другой операции; устройство занято |
| 422 | VALIDATION_ERROR, REPORT_ERROR | Суммы не сходятся, не указан кассир, неверное значение параметра, шаблон с ошибкой |
Ошибки устройства приходят в самой операции: status: FAILED, error: {code, message, details}.
| code | Что произошло |
|---|---|
DEVICE_ERROR | Ошибка ККТ, терминала или принтера; текст — в message |
PAYMENT_CANCELLED | Чек не напечатан после оплаты картой; оплата отменена на терминале |
PAYMENT_NOT_CANCELLED | Чек не напечатан, отменить оплату не удалось; данные оплаты — в details |
RECEIPT_FAILED_AFTER_REFUND | Деньги на карту возвращены, чек возврата не напечатан |
INTERRUPTED | Сервис перезапустился во время операции |
Настройки и файлы
Устройства, назначения и настройки принтеров, рабочее место, доступ и ограничения печати меняются на странице настройки
(значения со страницы важнее файла). Остальное — в файле
config\application.yml в папке программы:
| Параметр | Что задаёт |
|---|---|
server.port | Порт агента, по умолчанию 7790; нужен перезапуск |
hw.allowed-origins | Адреса веб-приложений, которым разрешено обращаться к сервису из браузера |
hw.api-token | Токен: если задан, запросы к API должны нести Authorization: Bearer <токен> (для событий — ?access_token=) |
hw.printer.allowed-url-prefixes | Адреса, с которых разрешено скачивать PDF для печати |
hw.reports.dir, hw.reports.font | Папка шаблонов отчётов и шрифт с кириллицей для PDF |
hw.tray | false — без значка в трее |
hw.power-monitor | false — не следить за питанием |
| Папка | Что в ней |
|---|---|
data\devices.json | Устройства |
data\printers.json | Назначения и настройки принтеров |
data\ui.json | Язык интерфейса |
data\workplace.json | Рабочее место: кассир и реквизиты по умолчанию |
data\access.json | Доступ и печать, заданные на странице настройки |
data\operations.jsonl | Журнал операций |
reports\ | Шаблоны отчётов, картинки, подотчёты |
logs\ | Логи, 30 дней |
Безопасность
- Сервис слушает только
127.0.0.1: с других компьютеров к нему не обратиться. - Запросы из браузера принимаются только со страниц из
hw.allowed-originsи со страницы самого сервиса; запросы от чужих сайтов отклоняются до выполнения. - Имя хоста должно быть
localhostили127.0.0.1— защита от подмены адреса (DNS rebinding). - Настройка оборудования — только со страницы самого сервиса.
- PDF скачивается только с разрешённых адресов, с таймаутом и ограничением размера.
- Шаблоны отчётов содержат исполняемые выражения: загружать их может только тот, у кого есть доступ к этому компьютеру.