🔧 Исправлена поддержка Docker Compose v2
Some checks failed
continuous-integration/drone/push Build is failing

 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 на современных системах.
This commit is contained in:
2025-11-04 20:12:09 +09:00
parent e1bb1ab90a
commit 280a6c4ad0
4 changed files with 109 additions and 17 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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
# Проверка портов