263 lines
11 KiB
Markdown
263 lines
11 KiB
Markdown
# Деплой 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` падает — пришли мне вывод ошибки, разберёмся.
|