#!/bin/bash # Скрипт для обновления и перезапуска приложения через Docker # Использование: ./deploy.sh set -e # Остановка при ошибке echo "🚀 Начинаем обновление..." echo "" echo "📥 Шаг 1/5: Обновление кода из Git..." # Сохраняем локальные изменения в stash (если есть) if [ -n "$(git status --porcelain)" ]; then echo "⚠️ Обнаружены локальные изменения, сохраняем в stash..." git stash push -m "Auto-stash before deploy $(date +%Y-%m-%d_%H:%M:%S)" || true fi # Получаем последние изменения из репозитория git fetch origin # Определяем текущую ветку BRANCH=$(git rev-parse --abbrev-ref HEAD) # Принудительно обновляем до состояния репозитория git reset --hard origin/$BRANCH if [ $? -eq 0 ]; then echo "✅ Код обновлен из Git (ветка: $BRANCH)" else echo "❌ Ошибка при обновлении кода из Git" exit 1 fi echo "" echo "🛑 Шаг 2/5: Остановка контейнеров..." docker compose down if [ $? -eq 0 ]; then echo "✅ Контейнеры остановлены" else echo "❌ Ошибка при остановке контейнеров" exit 1 fi echo "" echo "💾 Шаг 3/5: Остановка Redis (если запущен)..." docker compose stop redis 2>/dev/null || true echo "✅ Redis остановлен (если был запущен)" echo "" echo "🔨 Шаг 4/5: Сборка образов (без кеша)..." docker compose build --no-cache if [ $? -eq 0 ]; then echo "✅ Образы собраны успешно" else echo "❌ Ошибка при сборке образов" exit 1 fi echo "" echo "▶️ Шаг 5/5: Запуск контейнеров..." docker compose up -d if [ $? -eq 0 ]; then echo "✅ Контейнеры запущены" echo "" echo "⏳ Ожидание готовности Redis..." sleep 3 docker compose ps redis | grep -q "Up" && echo "✅ Redis запущен" || echo "⚠️ Redis не запущен (работаем без БД)" else echo "❌ Ошибка при запуске контейнеров" exit 1 fi echo "" echo "🎉 Обновление завершено успешно!" echo "" echo "📊 Статус контейнеров:" docker compose ps