From 280a6c4ad02c462179c3eaf449be45eb52a67b6d Mon Sep 17 00:00:00 2001 From: "Andrey K. Choi" Date: Tue, 4 Nov 2025 20:12:09 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B6=D0=BA=D0=B0=20Docker=20Compose=20v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Fixes: - Добавлена поддержка Docker Compose v2 (docker compose) - Автоматическое определение версии Docker Compose в Makefile - Обновлены скрипты master-deploy.sh и pre-deploy-check.sh - Добавлена утилита detect-docker-compose.sh - Исправлены команды в функции setup_database 🔧 Изменения: - Makefile: улучшенное определение команды Docker Compose - master-deploy.sh: использует make команды вместо прямых вызовов - pre-deploy-check.sh: проверка обеих версий Docker Compose - Добавлена команда shell-exec в Makefile Теперь скрипт корректно работает с Docker Compose v2 на современных системах. --- Makefile | 15 ++++++- scripts/detect-docker-compose.sh | 29 ++++++++++++++ scripts/master-deploy.sh | 67 +++++++++++++++++++++++++------- scripts/pre-deploy-check.sh | 15 ++++++- 4 files changed, 109 insertions(+), 17 deletions(-) create mode 100755 scripts/detect-docker-compose.sh diff --git a/Makefile b/Makefile index 1ff89fd..2f328a3 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,13 @@ # CatLink Development and Deployment Makefile # ================================================ -# Docker Compose command detection -DOCKER_COMPOSE := $(shell which docker-compose 2>/dev/null || echo "docker compose") +# Docker Compose command detection (v1 or v2) +DOCKER_COMPOSE := $(shell which docker-compose 2>/dev/null && echo "docker-compose" || (docker compose version >/dev/null 2>&1 && echo "docker compose" || echo "")) + +# Check if Docker Compose is available +ifeq ($(DOCKER_COMPOSE),) +$(error Docker Compose not found. Please install Docker Compose v1 or v2) +endif .PHONY: help install update dev build deploy ssl clean logs test restart shell backup restore @@ -184,6 +189,12 @@ logs-frontend: ## Логи frontend shell: ## Django shell @$(DOCKER_COMPOSE) exec web python manage.py shell +shell-bash: ## Bash в контейнере backend + @$(DOCKER_COMPOSE) exec web bash + +shell-exec: ## Выполнить команду в контейнере (использование: make shell-exec CMD="python manage.py migrate") + @$(DOCKER_COMPOSE) exec web $(CMD) + shell-db: ## Подключение к базе данных @$(DOCKER_COMPOSE) exec db psql -U links_user -d links_db diff --git a/scripts/detect-docker-compose.sh b/scripts/detect-docker-compose.sh new file mode 100755 index 0000000..42c138e --- /dev/null +++ b/scripts/detect-docker-compose.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Docker Compose Detection Utility +# Определяет правильную команду для Docker Compose v1/v2 + +detect_docker_compose() { + if command -v docker-compose &> /dev/null; then + echo "docker-compose" + elif docker compose version &> /dev/null 2>&1; then + echo "docker compose" + else + echo "" + fi +} + +# Экспортируем функцию +export -f detect_docker_compose + +# Если скрипт запущен напрямую, выводим результат +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + COMPOSE_CMD=$(detect_docker_compose) + if [[ -n "$COMPOSE_CMD" ]]; then + echo "$COMPOSE_CMD" + exit 0 + else + echo "Docker Compose not found" >&2 + exit 1 + fi +fi \ No newline at end of file diff --git a/scripts/master-deploy.sh b/scripts/master-deploy.sh index febd419..26515a8 100755 --- a/scripts/master-deploy.sh +++ b/scripts/master-deploy.sh @@ -46,6 +46,9 @@ print(''.join(secrets.choice(chars) for i in range(50))) " } +# Глобальная переменная для команды Docker Compose +DOCKER_COMPOSE_CMD="" + # Проверка требований check_requirements() { log "🔍 Проверка системных требований..." @@ -55,11 +58,18 @@ check_requirements() { error "Docker не установлен. Установите Docker и попробуйте снова." fi - # Проверяем Docker Compose - if ! command -v docker-compose &> /dev/null; then + # Проверяем Docker Compose (v1 или v2) + DOCKER_COMPOSE_CMD=$(./scripts/detect-docker-compose.sh) + if [[ -z "$DOCKER_COMPOSE_CMD" ]]; then error "Docker Compose не установлен. Установите Docker Compose и попробуйте снова." fi + if [[ "$DOCKER_COMPOSE_CMD" == "docker-compose" ]]; then + log "✅ Найден Docker Compose v1" + else + log "✅ Найден Docker Compose v2" + fi + # Проверяем nginx if ! command -v nginx &> /dev/null; then warning "nginx не установлен. Установка nginx..." @@ -438,20 +448,45 @@ EOF setup_database() { log "🗄️ Настройка и проверка безопасности базы данных..." - # Проверяем что контейнеры запущены - if ! docker-compose ps | grep -q "Up"; then - log "Запуск контейнеров для настройки БД..." - docker-compose up -d - sleep 15 + # Ждем запуска контейнеров + log "⏳ Ожидание запуска контейнеров..." + sleep 15 + + # Проверяем статус контейнеров + if ! make status | grep -q "Up"; then + warning "Контейнеры могут быть не готовы, ожидаем еще..." + sleep 10 fi # Применяем миграции log "🔄 Применение миграций базы данных..." - docker-compose exec -T web python manage.py migrate + if ! make migrate; then + error "Ошибка применения миграций" + fi - # Создаем суперпользователя (если не существует) - log "👤 Создание суперпользователя..." - docker-compose exec -T web python manage.py shell << 'EOF' + # Создаем суперпользователя + log "👤 Настройка суперпользователя..." + cat > /tmp/create_superuser.py << 'PYTHON_EOF' +from django.contrib.auth import get_user_model +User = get_user_model() +if not User.objects.filter(username='admin').exists(): + User.objects.create_superuser('admin', 'admin@example.com', 'admin123') + print('✅ Суперпользователь admin создан с паролем admin123') + print('⚠️ ВАЖНО: Смените пароль после первого входа!') +else: + print('ℹ️ Суперпользователь уже существует') +PYTHON_EOF + + # Выполняем скрипт создания суперпользователя + if make shell-exec CMD="python manage.py shell < /tmp/create_superuser.py" 2>/dev/null; then + success "Суперпользователь настроен" + else + # Fallback - используем прямую команду + $(./scripts/detect-docker-compose.sh) exec web python manage.py shell < /tmp/create_superuser.py || warning "Не удалось создать суперпользователя автоматически" + fi + + # Удаляем временный файл + rm -f /tmp/create_superuser.py from django.contrib.auth import get_user_model User = get_user_model() if not User.objects.filter(username='admin').exists(): @@ -660,8 +695,14 @@ main() { setup_nginx log "🏗️ Сборка и запуск контейнеров..." - make build-prod - make up-prod + # Используем Makefile команды которые автоматически определяют Docker Compose + if ! make build-prod; then + error "Ошибка сборки контейнеров" + fi + + if ! make up-prod; then + error "Ошибка запуска контейнеров" + fi setup_database setup_ssl diff --git a/scripts/pre-deploy-check.sh b/scripts/pre-deploy-check.sh index 107d3d8..9c6ec47 100755 --- a/scripts/pre-deploy-check.sh +++ b/scripts/pre-deploy-check.sh @@ -100,11 +100,22 @@ if command -v docker >/dev/null 2>&1; then fi # Проверка Docker Compose -check_and_report "command -v docker-compose >/dev/null 2>&1" "Docker Compose установлен" +# Проверка Docker Compose +echo "" +info "Проверка Docker Compose..." +# Проверяем Docker Compose v1 или v2 if command -v docker-compose >/dev/null 2>&1; then COMPOSE_VERSION=$(docker-compose --version | cut -d' ' -f3 | cut -d',' -f1) - echo " Версия Docker Compose: $COMPOSE_VERSION" + echo " Версия Docker Compose v1: $COMPOSE_VERSION" + success "Docker Compose v1 установлен" +elif docker compose version >/dev/null 2>&1; then + COMPOSE_VERSION=$(docker compose version --short 2>/dev/null || docker compose version | head -1 | cut -d' ' -f4) + echo " Версия Docker Compose v2: $COMPOSE_VERSION" + success "Docker Compose v2 установлен" +else + error "Docker Compose не установлен" + ((ERRORS++)) fi # Проверка портов