Files
gridbot/DEPLOY.md
T

263 lines
11 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.
# Деплой Kronos advisor на боевой сервер
**Файл пакета:** `kolp-deploy-2026-06-05.tar.gz` (130 КБ, 18 файлов, без `__pycache__`)
**SHA256:** см. `kolp-deploy-2026-06-05.tar.gz.sha256`
**Сервер:** `46.29.164.31`, корень проекта `/root/grid-bot`
---
## ⏱ 5-минутный план (на сервере)
### 0. Бэкап (30 сек)
```bash
cd /root/grid-bot
sudo systemctl stop grid-bot
tar -czf ~/grid-bot-backup-$(date +%F).tar.gz \
--exclude='kronos-venv' --exclude='__pycache__' \
--exclude='.env' --exclude='.env.bak' \
--exclude='*.log' --exclude='data' --exclude='models' .
ls -la ~/grid-bot-backup-*.tar.gz
```
### 1. Скопировать пакет (1 мин)
```bash
# На своём ноуте:
scp kolp-deploy-2026-06-05.tar.gz root@46.29.164.31:/root/grid-bot/
```
### 2. Распаковать поверх (30 сек)
```bash
cd /root/grid-bot
tar -xzf kolp-deploy-2026-06-05.tar.gz
# Проверить, что новые файлы на месте:
ls -la kronos/ kronos_advisor_main.py kronos-advisor.* kronos_advice.json
# Файлы main.py / config.py / .env.example / templates/dashboard.html — перезаписаны
```
### 3. Поднять venv для advisor-а (1 мин)
```bash
cd /root/grid-bot
python3 -m venv --without-pip --system-site-packages kronos-venv
curl -sSL https://bootstrap.pypa.io/get-pip.py | kronos-venv/bin/python
kronos-venv/bin/pip install --quiet --upgrade pip
kronos-venv/bin/pip install --quiet \
torch --index-url https://download.pytorch.org/whl/cpu
kronos-venv/bin/pip install --quiet \
numpy pandas einops==0.8.1 huggingface_hub==0.33.1 \
matplotlib==3.9.3 tqdm==4.67.1 safetensors==0.6.2 \
requests python-dotenv
# Скачать модель (~30 МБ, ~10 сек):
kronos-venv/bin/python -c "
import os
os.environ['HF_HOME'] = os.path.abspath('models/hf-cache')
os.makedirs(os.environ['HF_HOME'], exist_ok=True)
from huggingface_hub import snapshot_download
snapshot_download('NeoQuasar/Kronos-Tokenizer-2k', local_dir='models/Kronos-Tokenizer-2k', allow_patterns=['*.json','*.safetensors','*.txt'])
snapshot_download('NeoQuasar/Kronos-mini', local_dir='models/Kronos-mini', allow_patterns=['*.json','*.safetensors','*.txt'])
print('OK')
"
```
### 4. Обновить .env (1 мин)
```bash
cd /root/grid-bot
# Добавить новые переменные, ЕСЛИ их ещё нет
grep -q '^WEB_USERNAME=' .env || cat >> .env <<'EOF'
# === Web auth (ОБЯЗАТЕЛЬНО сменить) ===
WEB_USERNAME=kolpakov
WEB_PASSWORD=***ВАШ_СЛОЖНЫЙ_ПАРОЛЬ***
# === Kronos advisor ===
KRONOS_ENABLED=true
KRONOS_LIVE_ENABLED=false # ← сначала false, проверим в проде
KRONOS_MODEL=kronos-mini
KRONOS_TF_MIN=60
KRONOS_LOOKBACK=400
KRONOS_PRED_LEN=24
KRONOS_MIN_CONFIDENCE=0.4
KRONOS_ADVICE_FILE=/root/.openclaw/kronos_advice.json
EOF
# Сменить права
chmod 600 .env
```
### 5. Запустить grid-bot (30 сек)
```bash
sudo systemctl start grid-bot
sudo systemctl status grid-bot --no-pager
# В логах должно появиться:
# [INFO] Kronos kronos-mini loaded on cpu (max_context=2048)
# или просто запуск без Kronos (если KRONOS_ENABLED=false)
```
### 6. Установить systemd-timer для advisor-а (1 мин)
```bash
sudo cp /root/grid-bot/kronos-advisor.{service,timer} /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now kronos-advisor.timer
systemctl list-timers kronos-advisor.timer
# Должно показать "next" через <15 мин
```
### 7. Проверить работу (1 мин)
```bash
# 1) Через 5-10 мин проверить, что kronos_advice.json обновляется
ls -la /root/.openclaw/kronos_advice.json
cat /root/.openclaw/kronos_advice.json
# 2) Дашборд
curl -u "kolpakov:ВАШ_ПАРОЛЬ" https://gridbot.kolp.pro/api/kronos | python3 -m json.tool
# 3) Логи advisor-а
journalctl -u kronos-advisor.service -n 20 --no-pager
tail -50 /root/grid-bot/kronos-advisor.log
```
---
## 🔒 Безопасность — обязательно
1. **Сменить оба комплекта ключей Tradernet** (9adf.../97b0... и a8e6.../7313...) — они утекли в архив, который я видел.
- `https://tradernet.by` → Настройки → API-ключи → отозвать старые, выпустить новые
- Положить новые в `.env` (не в `config.py`!)
- В `config.py` старые ключи **уже удалены** (только `os.getenv`)
2. **`WEB_PASSWORD`** поставить сложный (16+ символов, не как в `.env.example`)
3. **Telegram-токен** — тоже отозвать (`@BotFather` → `/revoke` → новый)
---
## 🚦 Стратегия включения в проде
### Этап 1 — безопасно (текущий шаг)
- `KRONOS_ENABLED=true`
- `KRONOS_LIVE_ENABLED=false`
- Советник пишет `kronos_advice.json`, видим в дашборде
- **Бот работает как раньше**, Kronos **не влияет** на ордера
### Этап 2 — полу-включение (через 1-2 дня, если метрики ОК)
- `KRONOS_LIVE_ENABLED=true`
- Kronos начинает реально корректировать шаг/центр/паузу
- Следить за логом `[KRONOS] applied: ...`
- При проблемах → `KRONOS_LIVE_ENABLED=false` в `.env` + `sudo systemctl restart grid-bot`
### Этап 3 — прод-настройки (когда уверен)
- То же, что этап 2
- Включить Telegram-уведомления о смене совета (уже в коде — сработает само)
- Опционально: сменить `KRONOS_TF_MIN` на 15/30/120
---
## 🔄 Откат (если что-то пошло не так)
```bash
cd /root/grid-bot
sudo systemctl stop grid-bot
# Восстановить из бэкапа
tar -xzf ~/grid-bot-backup-2026-06-05.tar.gz
# Если нужно полностью выключить Kronos:
sed -i 's/^KRONOS_ENABLED=true/KRONOS_ENABLED=false/' .env
sed -i 's/^KRONOS_LIVE_ENABLED=true/KRONOS_LIVE_ENABLED=false/' .env
sudo systemctl start grid-bot
```
Или ещё проще:
```bash
# В .env:
KRONOS_ENABLED=false
KRONOS_LIVE_ENABLED=false
sudo systemctl restart grid-bot
# Бот работает как ДО интеграции с Kronos
```
---
## 📁 Что внутри пакета
```
grid-bot/
├── main.py ← обновлён (Kronos-интеграция)
├── config.py ← секреты → .env, KRONOS_* переменные
├── .env.example ← шаблон .env
├── .gitignore ← защита .env
├── kronos/ ← NEW: пакет советника
│ ├── __init__.py
│ ├── advisor.py ← KronosAdvisor
│ ├── data_source.py ← Tradernet + Binance источники
│ ├── backtest.py ← backtest static vs adaptive
│ └── compare_backtest.py ← сравнение conservative/adjusted/minimal
├── kronos_advisor_main.py ← CLI (запускается из systemd)
├── kronos_advice.json ← последний совет (пример)
├── kronos-advisor.service ← systemd unit
├── kronos-advisor.timer ← каждые 15 мин
├── kronos-advisor.README.md ← подробная докуменация по unit
├── templates/
│ └── dashboard.html ← обновлён (🧠 Kronos-блок)
└── static/
├── chart.umd.min.js
└── chartjs-plugin-annotation.min.js
```
**НЕ включено в пакет (нужно отдельно):**
- `kronos-venv/` (создаётся на шаге 3)
- `models/Kronos-Tokenizer-2k/` + `models/Kronos-mini/` (скачивается на шаге 3)
- `data/` (нет нужды — данные тянутся с биржи)
- `.env` и `.env.bak` (ты добавишь сам)
- `venv/` (твой существующий)
---
## 📊 Что мы знаем о качестве Kronos-прогноза
Результаты backtest-а на 14 мес BTCUSDT 1h (Apr 2025 → Jun 2026):
| Mode | PnL | WinRate | MaxDD | Sharpe |
|---|---|---|---|---|
| static (фикс 0.5%) | +1672% | 100% | -0.79% | 1.38 |
| conservative (Kronos) | +515% | 100% | -0.69% | 1.16 |
| adjusted (Kronos) | *в процессе* | | | |
| minimal (Kronos) | *в процессе* | | | |
**Вывод честный:**
- В **текущей** реализации Kronos для grid на трендовом рынке вредит (статичная сетка BTC-тренда выгоднее)
- Однако **Telegram-уведомления** и **adaptive pause** — это ценная страховка от резких обвалов
- Backtest на отрезке **с трендом вверх** искажает картину: grid зарабатывает на колебаниях, а Kronos их «фильтрует»
- На **боковике** adaptive может выиграть — нужно тестировать в проде в разные фазы рынка
**Рекомендация:** запускай в режиме «Этап 1» (наблюдение), через 1-2 недели включай «Этап 2», следи за метриками. Не жди чудес — Kronos это **советник**, не замена стратегии.
---
## ⚠️ Что я НЕ делал
- Не отзывал ключи Tradernet (ты сам)
- Не запускал ничего на твоём сервере
- Не менял существующий `grid-bot.service` (только добавил `kronos-advisor.{service,timer}`)
- Не трогал твой `.env` и `.env.bak`
- Не интегрировал в существующий дашборд `b.html` (если он у тебя живёт — нужно руками перенести Kronos-блок)
---
## 📞 Если что-то не работает
```bash
# Смотри логи в таком порядке:
journalctl -u grid-bot -n 50 --no-pager
journalctl -u kronos-advisor.service -n 50 --no-pager
tail -100 /root/grid-bot/kronos-advisor.log
tail -100 /root/grid-bot/margin-bot.log
# Проверь, что модель на месте
ls -la /root/grid-bot/models/Kronos-Tokenizer-2k/
ls -la /root/grid-bot/models/Kronos-mini/
# Проверь, что совет генерируется
cd /root/grid-bot
kronos-venv/bin/python kronos_advisor_main.py --live 2>&1 | tail -10
cat /root/.openclaw/kronos_advice.json
```
Если `kronos_advisor_main.py` падает — пришли мне вывод ошибки, разберёмся.