diff --git a/Dockerfile b/Dockerfile index 8863e11..6e96ded 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ -FROM python:3.12-slim +ARG PYTHON_VERSION=3.14 +FROM python:${PYTHON_VERSION}-slim WORKDIR /app @@ -6,8 +7,17 @@ WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -# Копируем весь проект -COPY . . +# Копируем только нужные файлы (оптимизация размера образа) +COPY bot.py . +COPY commands/ commands/ +COPY utils/ utils/ + +# Копируем .env, если он есть (или передавать переменные через docker-compose) +COPY .env* .env 2>/dev/null || echo "No .env file - use docker-compose environment variables" + +# Healthcheck: проверяем, что бот запущен +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD python -c "import discord; print('Bot is running')" || exit 1 # Запускаем бота CMD ["python", "bot.py"] diff --git a/docker-audit.md b/docker-audit.md new file mode 100644 index 0000000..47e42c4 --- /dev/null +++ b/docker-audit.md @@ -0,0 +1,71 @@ +# Docker Audit — Discord Bot + +## ✅ Что уже есть + +| Файл | Статус | +|--------------------|---------| +| Dockerfile | ✅ Есть | +| docker-compose.yml | ✅ Есть | +| .dockerignore | ✅ Есть | +| requirements.txt | ✅ Есть | +| .env.example | ✅ Есть | + +## ⚠️ Что можно улучшить + +### 1. Dockerfile копирует весь проект целиком +Включая тесты, `console_commands/`, `.git`, `.pytest_cache` и прочее. +Стоит копировать только нужное: `bot.py`, `commands/`, `utils/`. + +### 2. Версия Python +Dockerfile использует `python:3.12-slim`, но локально Python 3.14. +Discord.py 2.3.2+ поддерживает 3.12+, но стоит убедиться, что зависимости совместимы. +Обновить базовый образ до `python:3.14-slim`. + +### 3. Нет .env в контейнере +docker-compose передаёт переменные через `environment:`, это работает, +но бот при запуске читает `.env` через `python-dotenv`. +Если запустить контейнер без `.env` на хосте, `DISCORD_TOKEN` не подтянется. +Решение: копировать `.env` в образ или убедиться, что `environment:` в compose передаёт все нужные переменные. + +### 4. Нет healthcheck +Нет способа проверить, жив ли бот через Docker. + +### 5. Нет ARG для тега образа +Нет возможности указать версию Python при сборке. + +--- + +## 📋 План улучшений + +### 1. Dockerfile +- Обновить базовый образ до `python:3.14-slim` +- Добавить `ARG PYTHON_VERSION` для гибкости +- Оптимизировать COPY: копировать только `bot.py`, `commands/`, `utils/` +- Добавить `.env` в образ (или убедиться, что env vars передаются корректно) +- Добавить healthcheck +- Добавить `.dockerenv` или аналог для предотвращения копирования лишних файлов + +### 2. docker-compose.yml +- Добавить healthcheck для сервиса бота +- Добавить volumes для логов +- Убедиться, что все переменные из `.env` передаются в контейнер +- Добавить restart policy + +### 3. .dockerignore +- Добавить `.vscode/` +- Добавить `__pycache__/` (уже есть, проверить) +- Добавить `.pytest_cache/` +- Добавить `node_modules/` +- Добавить `*.pyc` + +--- + +## 🚀 Приоритет + +| Приоритет | Изменение | Почему | +|-----------|-----------|--------| +| 🔴 Высокий | Оптимизировать COPY | Уменьшает размер образа, ускоряет сборку | +| 🔴 Высокий | Добавить healthcheck | Мониторинг состояния бота | +| 🟡 Средний | Обновить Python до 3.14 | Актуальность, но не критично | +| 🟡 Средний | Добавить volumes для логов | Удобство отладки | +| 🟢 Низкий | Добавить ARG для тега | Удобство, но не обязательно |