Настройка бота на VPS/виділеному сервері
Торговий бот, що працює з ноутбука — це бот, який упаде в найбільш неподходящий момент: закриєте кришку, перервується інтернет, macOS вирішить оновитися. VPS з правильною конфігурацією розв'язує завдання аптайму, але тільки якщо зробити це правильно — без nohup script.py & в терміналі та надії на краще.
Вибір та конфігурація сервера
Для більшості торговельних ботів достатньо: 2 vCPU, 4 ГБ RAM, SSD 40 ГБ. Для ботів з важкою аналітикою або власною нодою — 4-8 vCPU, 16-32 ГБ RAM.
Географічне розташування має значення: латентність до біржі впливає на швидкість виконання. Binance — сервери у Франкфурті та Токіо, Bybit — Нідерланди, dYdX — AWS us-east-1. Для HFT (high-frequency) ставте сервер у тому самому датацентрі або як можна ближче. Для стратегій з утримуванням позиції > 1 хвилини — некритично.
ОС: Ubuntu 22.04 LTS або Debian 12. Жодної графічної оболонки — тільки headless сервер.
Ізоляція та управління залежностями
Python бот
# Оновлення системи
apt update && apt upgrade -y
apt install -y python3.11 python3.11-venv python3-pip git
# Створення непривілейованого користувача
useradd -m -s /bin/bash botuser
su - botuser
# Віртуальне окружение
python3.11 -m venv /home/botuser/bot-env
source /home/botuser/bot-env/bin/activate
pip install -r requirements.txt
Node.js бот
# Node.js через nvm (не через apt — застарілі версії)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
cd /home/botuser/mybot && npm ci --production
Ніколи не запускайте бота від root. Якщо бот скомпрометований — мінімальні права означають мінімальний ущерб.
Systemd як менеджер процесів
screen, tmux, nohup — для розробки. Для production — тільки systemd. Він перезапустить процес при падінні, управляє логами, стартує при перезавантаженні сервера.
# /etc/systemd/system/trading-bot.service
[Unit]
Description=Trading Bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/home/botuser/mybot
# Python
ExecStart=/home/botuser/bot-env/bin/python main.py
# Node.js альтернатива:
# ExecStart=/home/botuser/.nvm/versions/node/v20.0.0/bin/node index.js
Restart=on-failure
RestartSec=10s
StartLimitIntervalSec=60s
StartLimitBurst=3
# Ліміти ресурсів
MemoryMax=2G
CPUQuota=150%
# Переменні окружения з файлу
EnvironmentFile=/home/botuser/mybot/.env
# Логірування
StandardOutput=journal
StandardError=journal
SyslogIdentifier=trading-bot
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable trading-bot
systemctl start trading-bot
systemctl status trading-bot
# Перегляд логів
journalctl -u trading-bot -f --since "1 hour ago"
Restart=on-failure + RestartSec=10s + StartLimitBurst=3 — бот перезапустится при падінні, але не зациклиться в бесконечний crash loop.
Переменні окружения та секрети
API ключи ніколи не в коді та не в git. Файл .env з обмеженими правами:
# /home/botuser/mybot/.env
EXCHANGE_API_KEY=your_key_here
EXCHANGE_API_SECRET=your_secret_here
TELEGRAM_BOT_TOKEN=...
LOG_LEVEL=INFO
chmod 600 /home/botuser/mybot/.env
chown botuser:botuser /home/botuser/mybot/.env
.gitignore обов'язаний містити .env. Перевірте що .env випадково не попав у git історію: git log --all --full-history -- .env.
Мониторинг та алерти
Бот повинен сам повідомляти про проблеми. Мінімальний набір:
import telebot
import functools
bot_notifier = telebot.TeleBot(os.environ['TELEGRAM_BOT_TOKEN'])
ADMIN_CHAT_ID = os.environ['TELEGRAM_CHAT_ID']
def notify(message: str, level: str = 'INFO'):
prefix = {'INFO': 'ℹ️', 'WARNING': '⚠️', 'ERROR': '🔴'}.get(level, '')
try:
bot_notifier.send_message(ADMIN_CHAT_ID, f"{prefix} {message}")
except Exception:
pass # не ломаємо бота через проблеми з нотифікацією
# У обробнику виключення
except Exception as e:
notify(f"Bot crashed: {type(e).__name__}: {e}", level='ERROR')
raise
Зовнішній watchdog: UptimeRobot або аналог пінгує HTTP health-endpoint бота кожні 5 хвилин. Бот відда 200 — живий. Якщо ні — SMS/email алерт.
# Простий health endpoint (якщо бот має HTTP сервер)
from aiohttp import web
async def health(request):
return web.json_response({
'status': 'ok',
'uptime': time.time() - start_time,
'last_trade': last_trade_timestamp,
})
Безпека сервера
# Закриваємо SSH по паролю, тільки ключі
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh
# UFW — відкриваємо тільки потрібні порти
ufw default deny incoming
ufw allow ssh
ufw allow 443/tcp # якщо є web інтерфейс
ufw enable
# Fail2ban проти брутфорса SSH
apt install fail2ban -y
systemctl enable fail2ban --now
API ключи біржі: настроїти IP whitelist на бірже — тільки IP вашого VPS. Навіть якщо ключ утече, з інших IP працювати не буде.
Деплой оновлень
# Деплой скрипт
#!/bin/bash
set -e
cd /home/botuser/mybot
git pull origin main
source /home/botuser/bot-env/bin/activate
pip install -r requirements.txt --quiet
systemctl restart trading-bot
sleep 3
systemctl status trading-bot --no-pager
Для більш складних проектів — GitHub Actions + SSH деплой автоматично при push у main.
Настройка займає один робочий день: конфігурація сервера, systemd юнит, мониторинг, безпека SSH, тестовий запуск бота та перевірка автоматичного рестарту.







