130 lines
6.6 KiB
Markdown
130 lines
6.6 KiB
Markdown
# 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.10–3.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
|