Skip to content
Merged
42 changes: 42 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,48 @@

## [Unreleased]

## [0.5.0] — 2026-05-02

### Добавлено
- **Curses TUI-дашборд** (`tui.py`): `hope-hash --tui`. Постоянное окно с
EMA-хешрейтом, аптаймом, шарами (sent/ok/rej), pool diff, текущим job_id,
числом воркеров. Quit на `q`/`ESC`/`Ctrl+C`. На Windows без
`windows-curses` graceful fallback (warning + продолжаем без TUI),
чтобы не ломать `cli.main()` для тех, кто запустил с голым CPython.
- **`StatsProvider`** (`tui.py`): thread-safe шина между `mine()` и
потребителями (TUI/healthz/web). Pure-Python, без curses-зависимостей.
- **`--no-banner`** и ASCII-логотип (`banner.py`): при старте печатается
«HOPE HASH» в ASCII; для cron/systemd подавляется флагом.
- **Healthcheck endpoint** (`metrics.py`): `GET /healthz` отдаёт JSON
`{status, uptime_s, last_share_ts, ...}`. `ok` (200) когда reader жив,
EMA свежее 30с, шар в пределах `--healthz-stale-after` секунд.
`degraded` (200) — что-то одно подвыпало. `down` (503) — reader умер.
Внутри: чистая `build_health_snapshot()` тестируется без сети.
- **Telegram inbound-команды** (`notifier.py`, `tg_commands` встроены):
long-poll `getUpdates` в фоновой нити, диспатч `/stats`, `/stop`,
`/restart`, `/help`. Authz по `chat_id`. Включается через
`HOPE_HASH_TELEGRAM_INBOUND=1` (по умолчанию off — чтобы не открывать
поллер без явного opt-in).
- **`--log-file PATH`**: дублирует логи в файл. Особенно полезно с `--tui`,
где stdout занят дашбордом.
- **Grafana-дашборд** (`deploy/grafana/hope-hash.json`): минимальный JSON
для Grafana 10.x, datasource templated как `prometheus`. Панели:
hashrate over time, pool diff, shares accepted vs rejected (stacked
bar), workers gauge, uptime stat.
- **Type annotations** в `miner.py` и `stratum.py` доведены до 100%.
- **Тесты**: `test_tui.py` (StatsProvider, форматтеры), `test_banner.py`,
`test_healthz.py` (snapshot + HTTP), `test_notifier_timing.py`
(notify_share_accepted дёргается ТОЛЬКО из ack-callback, не из submit).
Расширен `test_notifier.py` (inbound dispatch + chat_id authz).
Всего **145 тестов** (было 101).

### Изменено
- `mine()` принимает опциональный `stats_provider: StatsProvider` —
пушит EMA/job/share-события в общую шину, чтобы TUI и healthz видели
одно и то же состояние.
- `supervisor_loop()` принимает опциональный `restart_event` — для
обработчика `/restart` из Telegram.

## [0.4.0] — 2026-04-30

### Добавлено
Expand Down
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@

---

## Что нового в v0.5.0

Ops & UX полировка: `--tui` — curses-дашборд (EMA-хешрейт, шары,
job_id, аптайм; quit на `q`), ASCII-баннер при старте (`--no-banner`
для cron), `/healthz` JSON-эндпоинт на `/metrics`-сервере (200/503
для k8s liveness), Telegram inbound-команды `/stats`/`/stop`/`/restart`
(opt-in через `HOPE_HASH_TELEGRAM_INBOUND=1`, authz по chat_id),
готовый Grafana-дашборд в `deploy/grafana/hope-hash.json`. Полный
API `mine()` теперь принимает `stats_provider: StatsProvider` —
единая шина данных для TUI и web (web придёт в v0.7.0).

## Статус: что уже сделано

- [x] TCP-клиент к `solo.ckpool.org:3333` через стандартную `socket`
Expand Down Expand Up @@ -189,7 +200,7 @@ hope-hash <BTC_адрес>
**Тесты:**

```bash
python -m unittest discover -s tests -v # 101 тест
python -m unittest discover -s tests -v # 145 тестов
```

**Prometheus-метрики, экспортируемые на `/metrics`:**
Expand Down
12 changes: 6 additions & 6 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,20 @@ TUI и команды Telegram — отложены.

### UI/UX

- [ ] **TUI на `rich`.** Постоянный дашборд со столбиками: текущий хешрейт, средний за час, аптайм, найденные шары, текущий job_id, pool difficulty. Обновляется in-place.
- [ ] **Альтернатива — `curses` дашборд** для терминалов без поддержки `rich`.
- [ ] **ASCII-арт логотип** в шапке при старте (когда определишься с названием).
- [ ] **TUI на `rich`.** Не делаем — `rich` не входит в stdlib. Заменено на `curses` ниже.
- [x] **`curses` дашборд** (`--tui`, v0.5.0). На Windows degrade без падения.
- [x] **ASCII-арт логотип** при старте (`banner.py`, v0.5.0). Гасится `--no-banner`.

### Telegram-бот

- [x] **Исходящие уведомления.** `notifier.py` через stdlib `urllib`, без `python-telegram-bot`. События: started / stopped / share_accepted / block_found / disconnected / reconnected. Конфиг через env (`HOPE_HASH_TELEGRAM_TOKEN`, `HOPE_HASH_TELEGRAM_CHAT_ID`). Если переменные не заданы — модуль молча disabled.
- [ ] **Входящие команды `/stats`, `/restart`, `/stop`** через тот же бот (long polling). Отложено.
- [x] **Входящие команды `/stats`, `/restart`, `/stop`** (long polling, v0.5.0). Authz по chat_id, opt-in через `HOPE_HASH_TELEGRAM_INBOUND=1`.

### Логи и метрики

- [x] **SQLite-журнал** (`storage.py`). Таблицы `shares` (ts, job_id, nonce_hex, hash_hex, difficulty, accepted, is_block) и `sessions`. WAL-режим, потокобезопасность через `threading.Lock`.
- [x] **Prometheus-экспортёр** (`metrics.py`). Эндпоинт `/metrics` на `http.server` (`ThreadingHTTPServer` в фоновой нити). Метрики: `hopehash_shares_total`, `hopehash_hashrate_hps`, `hopehash_pool_difficulty`, `hopehash_workers`, `hopehash_uptime_seconds`. CLI `--metrics-port` (0 — выключить).
- [ ] **Grafana-дашборд** с готовым JSON для импорта. Отложено.
- [x] **Grafana-дашборд** (`deploy/grafana/hope-hash.json`, v0.5.0). 5 панелей: hashrate / pool diff / shares stacked / workers / uptime.

---

Expand Down Expand Up @@ -95,7 +95,7 @@ TUI и команды Telegram — отложены.

### Мониторинг и SRE

- [ ] **Healthchecks endpoint.** Для k8s/docker liveness + readiness.
- [x] **Healthchecks endpoint.** `/healthz` JSON на metrics-сервере (v0.5.0). 200/503, флаг `--healthz-stale-after`.
- [ ] **Docker-образ.** `Dockerfile`, `docker-compose.yml` с volumes для логов и конфигов.
- [ ] **Helm chart**, если совсем хочется хардкора с k8s на одном Raspberry Pi.

Expand Down
Loading
Loading