# История изменений ## 2026-04-06 09:37 UTC – Загрузка из БД при пустой таблице **Проблема:** При открытии главной страницы данные из PostgreSQL подставлялись только если `GET /api/incidents` возвращал непустой `rows`; при пустой базе `processData` не вызывался, дашборд оставался скрытым до первой загрузки файла. **Решение:** После успешного ответа API всегда вызывается `processData(rows)` (в том числе для пустого массива); показ индикатора «Загрузка данных из базы…», отдельные сообщения для непустой и пустой выборки, вывод ошибки при недоступности API. **Изменения:** `index.html` (`tryLoadFromDb`). **Проверка:** Открытие главной при пустой БД — видны KPI/диаграммы в нулевом состоянии и сообщение о пустой базе; при наличии записей — прежнее поведение. --- ## 2026-04-06 18:00 UTC – Многостраничный UI: загрузка на data.html **Проблема:** Источник данных и кнопка загрузки должны быть на отдельной странице; на ней же — сводка по числу объектов в БД и по последней загрузке. **Решение:** Вынесены стили в `css/dashboard.css`; добавлены `data.html` (загрузка, блоки статистики, `upload-core.js`) и навигация в шапке между `index.html` и `data.html`. С главной убраны PapaParse/XLSX и логика выбора файла. **Проверка:** Открытие `/data.html`, загрузка `sample-data.csv`, проверка счётчиков и переход на мониторинг. --- ## 2026-04-06 17:00 UTC – Проверка docker compose api и Nginx для /api/ **Проблема:** Запросы к `https://sd.gen7x.ru/api/health` отдавали 404: регекс статики `~* \.(json|…)$` перехватывал URI раньше префикса `/api/`. **Решение:** В `sd.gen7x.ru.conf` для API использован `location ^~ /api/`. Проверены `docker compose up -d api`, `curl` на `:3910` и через HTTPS. **Изменения:** Nginx; README — блок «Проверка после развёртывания»; `/root/docs/docs/history.md`. --- ## 2026-04-06 16:00 UTC – Сохранение загрузки в PostgreSQL (ключ «Название») **Проблема:** Нужно хранить выгрузки в БД: по ключу «Название» обновлять запись или вставлять новую. **Решение:** Добавлен API на Node.js (Express + `pg`), таблица `incidents (number_key PK, data JSONB)`. После разбора файла фронт вызывает `POST /api/incidents/sync`; при открытии — `GET /api/incidents`. Nginx на `sd.gen7x.ru` проксирует `/api/` на `127.0.0.1:3910`. Контейнер `omc-sd-api` в сети `docker_gen7x_network`, БД `omc_sd_monitor` в существующем Postgres. **Изменения:** каталог `server/`, `docker-compose.yml` (сервис `api`), `.env.example`, `index.html`, `README.md`. **Проверка:** `docker compose up -d api`, `GET /api/health`, загрузка `sample-data.csv` на https://sd.gen7x.ru/. --- ## 2026-04-06 14:00 UTC – Загрузка из Excel **Проблема:** Нужна загрузка выгрузки в формате Excel при той же структуре колонок, что у CSV/JSON. **Решение:** Подключён SheetJS (`xlsx` с CDN), разбор первого листа через `sheet_to_json`; расширены `accept` у поля файла и подсказки в шапке. **Изменения:** `index.html` (скрипт, `parseExcelToRows`, ветка `handleFile` для `.xlsx`/`.xls`); README. **Проверка:** Загрузка таблицы, сохранённой из Excel с заголовками как в CSV. --- ## 2026-04-06 08:00 UTC – Публикация на sd.gen7x.ru **Проблема:** Нужен доступ к дашборду по постоянному URL извне. **Решение:** Включён виртуальный хост Nginx на хосте: `sd.gen7x.ru` → каталог проекта `/opt/omc-servicedesk-monitor`, HTTPS, те же Origin SSL, что у остальных поддоменов gen7x.ru. **Изменения:** Файл `/opt/gen7x/nginx/conf.d/sd.gen7x.ru.conf`; обновлён README. **Проверка:** `nginx -t`, `systemctl reload nginx`; локально `curl` с `--resolve` к 127.0.0.1 — ответ 200. В DNS Cloudflare для `sd.gen7x.ru` должна быть запись на сервер. --- ## 2026-04-06 12:00 UTC – Начальная версия дашборда **Проблема:** Нужен локальный мониторинг инцидентов ServiceDesk без сервера, в едином стиле «ситуационный центр». **Решение:** Добавлен self-contained `index.html` (Chart.js, PapaParse, светлая тема), загрузка CSV/JSON, KPI, фильтры, вкладки, Docker с nginx для раздачи статики. **Изменения:** Создан проект `/opt/omc-servicedesk-monitor`: `index.html`, `docker-compose.yml`, `.env.example`, `README.md`. **Проверка:** Локальное открытие `index.html`; загрузка `sample-data.csv`; `docker compose up` — статика через nginx на порту из `.env` (по умолчанию 8080). Репозиторий создан в Gitea, ветка `main` запушена (`git@git.gen7x.ru:cursor-agent/omc-servicedesk-monitor.git`).