Настройка 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







