117 lines
5.4 KiB
Markdown
117 lines
5.4 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 (запуск каждый день в 06:30).
|
||
Выполнить **в PowerShell от администратора**, поправив путь:
|
||
|
||
```powershell
|
||
$bat = "C:\Users\1\Desktop\QC\Vibecode\Project 1\kpi-dashboard\updater\run_update.bat"
|
||
schtasks /Create /TN "KPI Dashboard Update" /TR "`"$bat`"" /SC DAILY /ST 06:30 /RL LIMITED /F
|
||
```
|
||
|
||
Проверить / запустить вручную / удалить:
|
||
|
||
```powershell
|
||
schtasks /Query /TN "KPI Dashboard Update" /V /FO LIST
|
||
schtasks /Run /TN "KPI Dashboard Update"
|
||
schtasks /Delete /TN "KPI Dashboard Update" /F
|
||
```
|
||
|
||
> Задача выполнится, только когда компьютер включён и (для успешной выгрузки)
|
||
> поднят VPN. Если в момент запуска VPN не подключён, скрипт залогирует ошибку
|
||
> подключения и завершится с ненулевым кодом — данные останутся прежними.
|
||
|
||
---
|
||
|
||
## Логика скрипта (кратко)
|
||
|
||
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
|