Настройка бота на 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, тестовый запуск бота и проверка автоматического рестарта.







