From 0eabb1bc7572a6e1cefaa60b873a81e8cb8147d7 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 17 Nov 2025 15:34:06 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20docker?= =?UTF-8?q?=20compose=20v1/v2=20=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Makefile автоматически находит docker compose или docker-compose - Добавлена команда make docker-check для проверки окружения - Создана документация DOCKER_INSTALL.md - Обновлен DEPLOY_QUICKSTART.md с инструкцией по установке Docker - Все docker команды теперь используют переменную DOCKER_COMPOSE Исправляет ошибку: 'docker-compose: No such file or directory' --- DEPLOY_QUICKSTART.md | 18 +++++ DOCKER_INSTALL.md | 170 +++++++++++++++++++++++++++++++++++++++++++ Makefile | 60 ++++++++++----- 3 files changed, 228 insertions(+), 20 deletions(-) create mode 100644 DOCKER_INSTALL.md diff --git a/DEPLOY_QUICKSTART.md b/DEPLOY_QUICKSTART.md index 4a61b02..b7573df 100644 --- a/DEPLOY_QUICKSTART.md +++ b/DEPLOY_QUICKSTART.md @@ -1,5 +1,23 @@ # 🚀 Быстрый деплой бота с внешним PostgreSQL +## Шаг 0: Установка Docker (если не установлен) + +```bash +# Проверка Docker +docker --version +docker compose version + +# Если не установлен - см. DOCKER_INSTALL.md +# Или быстрая установка (Ubuntu/Debian): +sudo apt update +sudo apt install -y docker.io docker-compose-plugin +sudo systemctl enable docker +sudo systemctl start docker + +# Проверка +make docker-check +``` + ## Шаг 1: Подготовка PostgreSQL ```bash diff --git a/DOCKER_INSTALL.md b/DOCKER_INSTALL.md new file mode 100644 index 0000000..079f182 --- /dev/null +++ b/DOCKER_INSTALL.md @@ -0,0 +1,170 @@ +# Установка Docker и Docker Compose + +## Для Ubuntu/Debian + +### Установка Docker + +```bash +# Обновление системы +sudo apt update +sudo apt upgrade -y + +# Установка зависимостей +sudo apt install -y ca-certificates curl gnupg lsb-release + +# Добавление GPG ключа Docker +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg + +# Добавление репозитория Docker +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +# Установка Docker Engine +sudo apt update +sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + +# Проверка установки +docker --version +docker compose version +``` + +### Настройка прав (опционально) + +```bash +# Добавить пользователя в группу docker (чтобы не использовать sudo) +sudo usermod -aG docker $USER + +# Применить изменения (нужно перелогиниться или выполнить) +newgrp docker + +# Проверка +docker ps +``` + +### Автозапуск Docker + +```bash +sudo systemctl enable docker +sudo systemctl start docker +``` + +## Для других систем + +### CentOS/RHEL/Fedora + +```bash +# Установка Docker +sudo yum install -y yum-utils +sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo +sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + +# Запуск +sudo systemctl start docker +sudo systemctl enable docker +``` + +### Debian + +```bash +# Для Debian используйте те же команды что и для Ubuntu +# Но в добавлении репозитория используйте: +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +``` + +## Проверка установки + +```bash +# Версия Docker +docker --version +# Должно вывести: Docker version 24.0.x или новее + +# Версия Docker Compose +docker compose version +# Должно вывести: Docker Compose version v2.x.x или новее + +# Тест Docker +docker run hello-world +``` + +## Если Docker Compose v1 (старая версия) + +Если у вас установлен `docker-compose` (v1) вместо `docker compose` (v2): + +```bash +# Удалите старую версию +sudo apt remove docker-compose + +# Установите плагин compose +sudo apt install docker-compose-plugin + +# Проверка +docker compose version +``` + +## Troubleshooting + +### Ошибка: "Cannot connect to the Docker daemon" + +```bash +# Запустите Docker +sudo systemctl start docker + +# Проверьте статус +sudo systemctl status docker +``` + +### Ошибка: "permission denied" + +```bash +# Добавьте пользователя в группу docker +sudo usermod -aG docker $USER + +# Перелогиньтесь или выполните +newgrp docker +``` + +### Ошибка: "docker-compose: command not found" но Docker Compose установлен + +Makefile автоматически определит правильную команду: +- `docker compose` (v2, рекомендуется) +- `docker-compose` (v1, устаревшая) + +## Полезные команды + +```bash +# Информация о Docker +docker info + +# Список запущенных контейнеров +docker ps + +# Список всех контейнеров +docker ps -a + +# Список образов +docker images + +# Очистка неиспользуемых ресурсов +docker system prune -a + +# Логи контейнера +docker logs container_name + +# Остановить все контейнеры +docker stop $(docker ps -aq) + +# Удалить все контейнеры +docker rm $(docker ps -aq) +``` + +## Обновление Docker + +```bash +sudo apt update +sudo apt upgrade docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` diff --git a/Makefile b/Makefile index cd45fd8..1b97c77 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,8 @@ # Makefile для телеграм-бота розыгрышей +# Определяем команду $(DOCKER_COMPOSE) (v2) или docker-compose (v1) +DOCKER_COMPOSE := $(shell command -v $(DOCKER_COMPOSE) 2> /dev/null || command -v docker-compose 2> /dev/null) + .PHONY: help install setup setup-postgres init-db run test clean # По умолчанию показываем справку @@ -213,10 +216,27 @@ docker-setup: @mkdir -p logs backups @echo "✅ Настройка завершена!" +# Проверка Docker и Docker Compose +docker-check: + @echo "� Проверка Docker окружения..." + @command -v docker >/dev/null 2>&1 || { echo "❌ Docker не установлен! См. DOCKER_INSTALL.md"; exit 1; } + @echo "✅ Docker: $$(docker --version)" + @if [ -z "$(DOCKER_COMPOSE)" ]; then \ + echo "❌ Docker Compose не найден!"; \ + echo " Установите: sudo apt install docker-compose-plugin"; \ + echo " Или см. DOCKER_INSTALL.md"; \ + exit 1; \ + fi + @echo "✅ Docker Compose: $$($(DOCKER_COMPOSE) version)" + @docker ps >/dev/null 2>&1 || { echo "❌ Docker daemon не запущен!"; echo " Запустите: sudo systemctl start docker"; exit 1; } + @echo "✅ Docker daemon работает" + @echo "" + @echo "🎉 Все проверки пройдены!" + # Сборка Docker образа -docker-build: +docker-build: docker-check @echo "🔨 Сборка Docker образа..." - docker compose build --no-cache + $(DOCKER_COMPOSE) build --no-cache # Запуск контейнеров в фоновом режиме docker-up: @@ -225,7 +245,7 @@ docker-up: echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \ exit 1; \ fi - docker compose --env-file .env.prod up -d + $(DOCKER_COMPOSE) --env-file .env.prod up -d @echo "✅ Контейнеры запущены!" @echo "📊 Проверьте статус: make docker-status" @echo "📋 Просмотр логов: make docker-logs" @@ -237,39 +257,39 @@ docker-up-fg: echo "❌ Файл .env.prod не найден! Запустите 'make docker-setup'"; \ exit 1; \ fi - docker compose --env-file .env.prod up + $(DOCKER_COMPOSE) --env-file .env.prod up # Остановка контейнеров docker-down: @echo "🛑 Остановка контейнеров..." - docker compose down + $(DOCKER_COMPOSE) down @echo "✅ Контейнеры остановлены!" # Перезапуск контейнеров docker-restart: @echo "🔄 Перезапуск контейнеров..." - docker compose restart + $(DOCKER_COMPOSE) restart @echo "✅ Контейнеры перезапущены!" # Просмотр логов бота docker-logs: @echo "📋 Логи бота..." - docker compose logs -f bot + $(DOCKER_COMPOSE) logs -f bot # Просмотр логов базы данных docker-logs-db: @echo "📋 Логи базы данных..." - docker compose logs -f db + $(DOCKER_COMPOSE) logs -f db # Просмотр всех логов docker-logs-all: @echo "📋 Все логи..." - docker compose logs -f + $(DOCKER_COMPOSE) logs -f # Статус контейнеров docker-status: @echo "📊 Статус контейнеров..." - @docker compose ps + @$(DOCKER_COMPOSE) ps @echo "" @echo "💾 Использование volumes:" @docker volume ls | grep lottery || echo "Нет volumes" @@ -281,20 +301,20 @@ docker-ps: # Применение миграций в контейнере docker-db-migrate: @echo "⬆️ Применение миграций в контейнере..." - docker compose exec bot alembic upgrade head + $(DOCKER_COMPOSE) exec bot alembic upgrade head @echo "✅ Миграции применены!" # Подключение к PostgreSQL в контейнере docker-db-shell: @echo "🐘 Подключение к PostgreSQL..." - @docker compose exec db psql -U $${POSTGRES_USER:-lottery_user} -d $${POSTGRES_DB:-lottery_bot_db} + @$(DOCKER_COMPOSE) exec db psql -U $${POSTGRES_USER:-lottery_user} -d $${POSTGRES_DB:-lottery_bot_db} # Создание бэкапа базы данных docker-db-backup: @echo "💾 Создание бэкапа базы данных..." @mkdir -p backups @BACKUP_FILE=backups/backup_$$(date +%Y%m%d_%H%M%S).sql; \ - docker compose exec -T db pg_dump -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db} > $$BACKUP_FILE && \ + $(DOCKER_COMPOSE) exec -T db pg_dump -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db} > $$BACKUP_FILE && \ echo "✅ Бэкап создан: $$BACKUP_FILE" # Восстановление из бэкапа @@ -307,7 +327,7 @@ docker-db-restore: @echo "Восстановление из: $(BACKUP)" @read -p "Это удалит текущие данные! Продолжить? [y/N] " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ - cat $(BACKUP) | docker compose exec -T db psql -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db}; \ + cat $(BACKUP) | $(DOCKER_COMPOSE) exec -T db psql -U $${POSTGRES_USER:-lottery_user} $${POSTGRES_DB:-lottery_bot_db}; \ echo "✅ База данных восстановлена!"; \ else \ echo "❌ Отменено"; \ @@ -316,12 +336,12 @@ docker-db-restore: # Открыть shell в контейнере бота docker-shell: @echo "🐚 Открытие shell в контейнере бота..." - docker compose exec bot /bin/bash + $(DOCKER_COMPOSE) exec bot /bin/bash # Остановка и удаление контейнеров docker-clean: @echo "🧹 Очистка контейнеров..." - docker compose down --remove-orphans + $(DOCKER_COMPOSE) down --remove-orphans @echo "✅ Контейнеры удалены!" # Полная очистка (включая volumes) @@ -330,7 +350,7 @@ docker-prune: @read -p "Продолжить? [y/N] " confirm; \ if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \ echo "🗑️ Полная очистка..."; \ - docker compose down -v --remove-orphans; \ + $(DOCKER_COMPOSE) down -v --remove-orphans; \ docker system prune -f; \ echo "✅ Очистка завершена!"; \ else \ @@ -340,9 +360,9 @@ docker-prune: # Пересборка и перезапуск docker-rebuild: @echo "🔄 Пересборка и перезапуск..." - docker compose down - docker compose build --no-cache - docker compose --env-file .env.prod up -d + $(DOCKER_COMPOSE) down + $(DOCKER_COMPOSE) build --no-cache + $(DOCKER_COMPOSE) --env-file .env.prod up -d @echo "✅ Готово!" @make docker-logs