kpi-dashboard/updater/README.md

6.6 KiB
Raw Blame History

KPI Updater — ежедневное обновление CSV из Impala

Скрипт запускается на рабочем компьютере с доступом к корпоративной сети (VPN): выгружает свежие KPI из Impala, перезаписывает ../drb_iliyas_kpi_2026.csv и пушит его в ветку pages. Сайт (Gitea Pages) при открытии делает fetch('drb_iliyas_kpi_2026.csv'), поэтому из внешней сети видны свежие данные.

updater/
├─ update_kpi.py        # основной скрипт
├─ requirements.txt     # зависимости (impyla и пр.)
├─ config.example.yaml  # шаблон конфига -> скопировать в config.yaml
├─ run_update.bat       # обёртка для Планировщика задач
└─ update.log           # лог (создаётся при запуске, в git не коммитится)

1. Установка (один раз)

⚠️ Версия Python. impyla/thrift/thrift-sasl стабильно ставятся на Python 3.103.12. На системном Python 3.14 колёс может не быть и сборка упадёт. Установите отдельный Python 3.12 и создавайте venv именно им.

В папке updater/:

REM создать виртуальное окружение (укажите путь к python 3.12, если нужно)
python -m venv venv
venv\Scripts\activate

pip install -r requirements.txt

Создать конфиг и заполнить логин/пароль Impala + git-токен:

copy config.example.yaml config.yaml
notepad config.yaml

config.yaml уже в .gitignore — он не попадёт в git.


2. Аутентификация для пуша

Пуш по расписанию должен идти без ручного ввода пароля. Два варианта:

A. Токен (рекомендуется). В Gitea: Settings → Applications → Generate New Token, право write:repository. Вставьте его в config.yamlgit.token. Скрипт использует токен только в команде пуша, в git-конфиг он не сохраняется, а в логах маскируется.

B. Git Credential Manager. Оставьте git.token пустым и один раз выполните вручную git push origin pages, сохранив логин/пароль в системном хранилище Windows.


3. Проверка вручную

Подключитесь к VPN, затем:

cd /d "путь\к\kpi-dashboard\updater"
run_update.bat

Ожидаемо: в update.log появятся строки подключения, число строк, и при изменении данных — коммит и Пуш выполнен успешно. Если данные не менялись — Данные не изменились, коммита не будет.


4. Расписание (раз в сутки)

Создать задачу в Планировщике Windows (ежедневно в 12:00). Важно: не использовать schtasks /TR "..." — из-за пробела в пути («Project 1») команда теряет кавычки и сохраняет действие разорванным (<Command>...\Project</Command>), задача падает с 0x80070002 («файл не найден») и НЕ запускается. Создавайте через PowerShell-командлеты (корректно обрабатывают пробелы). Выполнить в PowerShell, поправив путь:

$bat = "C:\Users\1\Desktop\QC\Vibecode\Project 1\kpi-dashboard\updater\run_update.bat"
$wd  = Split-Path $bat
$action   = New-ScheduledTaskAction -Execute $bat -WorkingDirectory $wd
$trigger  = New-ScheduledTaskTrigger -Daily -At 12:00
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 1)
Register-ScheduledTask -TaskName "KPI Dashboard Update" -Action $action -Trigger $trigger -Settings $settings -RunLevel Limited -Force

Проверить / запустить вручную / посмотреть действие / удалить:

schtasks /Query  /TN "KPI Dashboard Update" /V /FO LIST   # Last Result: 0 = успех
schtasks /Run    /TN "KPI Dashboard Update"
schtasks /Query  /TN "KPI Dashboard Update" /XML | Select-String Command,WorkingDirectory
schtasks /Delete /TN "KPI Dashboard Update" /F

Условия успешного запуска:

  • ПК включён (с -StartWhenAvailable задача догонит пропущенный запуск).
  • Поднят VPN — иначе ошибка подключения, данные останутся прежними.
  • Файл drb_iliyas_kpi_2026.csv НЕ открыт в Excel — Excel блокирует его на запись, и KPI-апдейтер падает с [Errno 13] Permission denied (код задачи 1). Метрики МП при этом обновятся. На следующий день, если файл закрыт, всё догонится автоматически.

Логика скрипта (кратко)

  1. Читает config.yaml.
  2. Применяет SSL monkey-patch (старые cipher suites сервера, см. ../Impala_connection.md).
  3. Подключается к host, при ошибке — к fallback_host.
  4. Выполняет SQL (зашит в update_kpi.py, константа SQL_QUERY).
  5. Формирует CSV в точном формате исходника: разделитель ;, строки в кавычках, точка как десятичный разделитель, CRLF, сортировка по убыванию report_period_id, затем entry_date.
  6. Если содержимое не изменилось — выходит без коммита.
  7. Иначе: git add только CSV → commit → fetch + rebase + push в pages (с авто-rebase и повтором, т.к. веб-приложение тоже пушит ai-cache.json).

Пустой результат запроса (0 строк) НЕ перезаписывает CSV — защита от стирания данных.