kpi-dashboard/updater/README.md

130 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/`:
```bat
REM создать виртуальное окружение (укажите путь к python 3.12, если нужно)
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
```
Создать конфиг и заполнить логин/пароль Impala + git-токен:
```bat
copy config.example.yaml config.yaml
notepad config.yaml
```
`config.yaml` уже в `.gitignore` — он **не попадёт в git**.
---
## 2. Аутентификация для пуша
Пуш по расписанию должен идти без ручного ввода пароля. Два варианта:
**A. Токен (рекомендуется).**
В Gitea: *Settings → Applications → Generate New Token*, право
`write:repository`. Вставьте его в `config.yaml``git.token`.
Скрипт использует токен только в команде пуша, в git-конфиг он не сохраняется,
а в логах маскируется.
**B. Git Credential Manager.**
Оставьте `git.token` пустым и один раз выполните вручную
`git push origin pages`, сохранив логин/пароль в системном хранилище Windows.
---
## 3. Проверка вручную
Подключитесь к VPN, затем:
```bat
cd /d "путь\к\kpi-dashboard\updater"
run_update.bat
```
Ожидаемо: в `update.log` появятся строки подключения, число строк, и при
изменении данных — коммит и `Пуш выполнен успешно`. Если данные не менялись —
`Данные не изменились`, коммита не будет.
---
## 4. Расписание (раз в сутки)
Создать задачу в Планировщике Windows (ежедневно в 12:00). **Важно:** не
использовать `schtasks /TR "..."` — из-за пробела в пути («Project 1»)
команда теряет кавычки и сохраняет действие разорванным
(`<Command>...\Project</Command>`), задача падает с `0x80070002` («файл не
найден») и НЕ запускается. Создавайте через PowerShell-командлеты (корректно
обрабатывают пробелы). Выполнить **в 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
```
Проверить / запустить вручную / посмотреть действие / удалить:
```powershell
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 — защита от стирания данных.
[Gitea Pages]: https://git.vibe42.kz/kyrykbaev/kpi-dashboard/src/branch/pages