Настройка Docker-контейнера для торгового бота
Торговый бот, запущенный напрямую на VPS без изоляции — это проблемы с зависимостями, непредсказуемый рестарт при падении и отсутствие воспроизводимости. Docker решает всё это за пару часов настройки. Основные задачи: изоляция окружения, автоматический рестарт при падении, безопасная передача API ключей, логирование, обновление без downtime.
Dockerfile для Python-бота
FROM python:3.12-slim
# Системные зависимости (если нужны C-расширения типа ta-lib)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Сначала зависимости (кэш слоя при изменении только кода)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Не запускать от root
RUN adduser --disabled-password --gecos '' botuser
USER botuser
CMD ["python", "-u", "bot.py"]
Флаг -u в Python отключает буферизацию stdout — логи видны сразу, не после flush.
docker-compose с секретами и автозапуском
services:
trading-bot:
build: .
container_name: trading_bot
restart: unless-stopped # перезапуск при падении, но не при ручной остановке
environment:
- PYTHONUNBUFFERED=1
- TZ=UTC
# Секреты через env_file, не хардкодим в compose
env_file:
- .env.secrets
volumes:
- ./data:/app/data # персистентные данные бота
- ./logs:/app/logs # логи вне контейнера
# Ограничение ресурсов
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
# Health check — Docker перезапустит если бот завис
healthcheck:
test: ["CMD", "python", "-c", "import os; os.path.exists('/app/data/heartbeat')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
.env.secrets (никогда не коммитить в git):
BINANCE_API_KEY=your_key_here
BINANCE_SECRET=your_secret_here
TELEGRAM_BOT_TOKEN=notification_token
Добавьте .env.secrets в .gitignore. Лучший вариант — Docker Secrets или HashiCorp Vault, но для простого бота env_file достаточно при условии закрытого репозитория.
Health check через heartbeat файл
Бот пишет timestamp в файл каждый N секунд. Docker проверяет свежесть файла:
# В боте — heartbeat каждые 10 сек
import threading
import time
import pathlib
def heartbeat_loop():
while True:
pathlib.Path('/app/data/heartbeat').touch()
time.sleep(10)
threading.Thread(target=heartbeat_loop, daemon=True).start()
# healthcheck команда проверяет что файл изменён < 60 сек назад
test: ["CMD", "bash", "-c", "[ $(($(date +%s) - $(date +%s -r /app/data/heartbeat))) -lt 60 ]"]
Обновление без полного downtime
# Пересборка и замена контейнера
docker-compose build trading-bot
docker-compose up -d --no-deps trading-bot
--no-deps не трогает другие сервисы. Контейнер останавливается, новый стартует — downtime 5-10 секунд. Для торгового бота это обычно приемлемо.
Полезные команды
# Запуск
docker-compose up -d
# Логи в реальном времени
docker-compose logs -f trading-bot
# Состояние
docker-compose ps
# Войти в контейнер для отладки
docker-compose exec trading-bot bash
# Перезапуск
docker-compose restart trading-bot







