Настройка торгового бота на облачному сервері
Написати торгового бота та запустити його надійно в production — дві різні задачі. Більшість ботів падають не через помилки в торговій логіці, а через проблеми з інфраструктурою: обрив з'єднання, OOM kill, немає мониторингу, немає рестарту після краху. Ця сторінка — про інфраструктурну частину.
Мінімальний жизнеспособний стек
Для одного бота на Python/Node.js:
VPS (DigitalOcean/Hetzner/Vultr) → systemd service → процес бота → біржевий API
↓
Telegram alert bot (алерти про статус)
Чому не Docker для одного бота? Лишня складність без вигоди. systemd простіше, надійніше для single-process, і працює на будь-якому Linux VPS з коробки.
Вибір сервера
| Параметр | Мінімум | Рекомендація |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1GB | 2–4GB |
| Диск | 20GB SSD | 40GB SSD |
| Мережа | Будь-яка | Близько до біржі (для latency) |
| Провайдер | DigitalOcean, Hetzner | Vultr Tokyo/Singapore для Binance |
Для ботів, де latency критична (скальпинг, арбітраж) — сервер у тому ж регіоні, що біржа. Binance mainnet — AWS Tokyo або Singapore. FTX був у AWS Virginia. Latency між Європою та Азією — 200–300ms, це смерть для HFT стратегій.
systemd unit файл
# /etc/systemd/system/trading-bot.service
[Unit]
Description=Trading Bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/trading-bot
EnvironmentFile=/home/bot/trading-bot/.env
ExecStart=/home/bot/.venv/bin/python main.py
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
# Обмеження ресурсів
MemoryMax=512M
CPUQuota=80%
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable trading-bot
systemctl start trading-bot
journalctl -u trading-bot -f # логи в реальному часі
Restart=on-failure + RestartSec=10 — бот автоматично рестартує після краху з 10-секундною паузою. Важливо: on-failure, а не always — бот не повинен рестартувати при нормальному exit (наприклад, при ручній зупинці).
Змінні середовища та секрети
API ключі — тільки через environment variables, ніколи у коді:
# /home/bot/trading-bot/.env (права 600, власник bot)
BINANCE_API_KEY=xxx
BINANCE_SECRET=yyy
TELEGRAM_BOT_TOKEN=zzz
TELEGRAM_CHAT_ID=123456
chmod 600 /home/bot/trading-bot/.env
chown bot:bot /home/bot/trading-bot/.env
Мониторинг та алерти в Telegram
Мінімальний мониторинг для бота:
import httpx, asyncio
TELEGRAM_URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
async def send_alert(message: str, level: str = "INFO"):
prefix = {"INFO": "ℹ️", "WARN": "⚠️", "ERROR": "🚨"}.get(level, "")
await httpx.AsyncClient().post(TELEGRAM_URL, json={
"chat_id": TELEGRAM_CHAT_ID,
"text": f"{prefix} *{level}*\n{message}",
"parse_mode": "Markdown"
})
# Алерт при старті
await send_alert("Bot started", "INFO")
# Алерт при ордері
await send_alert(f"Order placed: BUY {qty} BTC @ {price}", "INFO")
# Heartbeat — бот живий
async def heartbeat():
while True:
await asyncio.sleep(3600) # раз на годину
await send_alert(f"Heartbeat: balance={await get_balance()}", "INFO")
Якщо heartbeat перестав приходити — бот упав. Додатково можна настроїти UptimeRobot або BetterStack для зовнішнього мониторингу процесу.
Обновлення бота без downtime
# Деплой нової версії
cd /home/bot/trading-bot
git pull origin main
/home/bot/.venv/bin/pip install -r requirements.txt
# Graceful restart — systemd дожидається завершення поточної ітерації
systemctl restart trading-bot
Настройка інфраструктури для одного бота від нуля: 2–4 години. Для кількох ботів з Docker Compose та централізованим логуванням — 1–2 дні.







