#!/bin/bash # Скрипт для production деплоя set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" echo "🚀 Quiz Bot Production Deploy" echo "=============================" # Загрузка переменных окружения if [ -f "$PROJECT_ROOT/.env.prod" ]; then source "$PROJECT_ROOT/.env.prod" else echo "⚠️ Файл .env.prod не найден!" echo "📝 Создайте файл с production настройками" exit 1 fi # Проверка обязательных переменных if [ -z "$BOT_TOKEN" ]; then echo "❌ BOT_TOKEN не установлен!" exit 1 fi # Функция для деплоя deploy_production() { echo "🔄 Деплой в production..." cd "$PROJECT_ROOT" # Создание backup базы данных если она существует if [ -f "data/quiz_bot.db" ]; then echo "💾 Создание backup базы данных..." cp data/quiz_bot.db "data/quiz_bot.db.backup.$(date +%Y%m%d_%H%M%S)" fi # Запуск production сервисов docker-compose -f docker-compose.prod.yml pull docker-compose -f docker-compose.prod.yml up -d --build echo "⏳ Ожидание запуска сервисов..." sleep 30 # Проверка статуса echo "📋 Статус сервисов:" docker-compose -f docker-compose.prod.yml ps # Health check echo "🏥 Проверка health check..." if docker-compose -f docker-compose.prod.yml exec -T quiz-bot python -c "import sqlite3; conn = sqlite3.connect('/app/data/quiz_bot.db'); conn.close(); print('✅ Database OK')"; then echo "✅ Production деплой успешен!" else echo "❌ Health check не прошёл!" exit 1 fi } # Функция для отката rollback() { echo "🔄 Откат к предыдущей версии..." cd "$PROJECT_ROOT" # Останавливаем текущие сервисы docker-compose -f docker-compose.prod.yml down # Восстанавливаем backup базы данных LATEST_BACKUP=$(ls -t data/quiz_bot.db.backup.* 2>/dev/null | head -n1) if [ -n "$LATEST_BACKUP" ]; then echo "💾 Восстановление базы данных из $LATEST_BACKUP" cp "$LATEST_BACKUP" data/quiz_bot.db fi # Запускаем с предыдущим образом export IMAGE_TAG=previous docker-compose -f docker-compose.prod.yml up -d echo "✅ Откат завершён" } # Функция для мониторинга monitor() { echo "📊 Мониторинг production сервисов..." cd "$PROJECT_ROOT" while true; do clear echo "=== Quiz Bot Production Status ===" echo "Время: $(date)" echo "" echo "📋 Статус контейнеров:" docker-compose -f docker-compose.prod.yml ps echo "" echo "💾 Использование ресурсов:" docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" echo "" echo "📊 Логи (последние 10 строк):" docker-compose -f docker-compose.prod.yml logs --tail=10 quiz-bot echo "" echo "Обновление через 30 сек... (Ctrl+C для выхода)" sleep 30 done } # Главное меню case "${1:-menu}" in "deploy") deploy_production ;; "rollback") rollback ;; "status") cd "$PROJECT_ROOT" docker-compose -f docker-compose.prod.yml ps ;; "logs") cd "$PROJECT_ROOT" docker-compose -f docker-compose.prod.yml logs -f ;; "monitor") monitor ;; "stop") cd "$PROJECT_ROOT" docker-compose -f docker-compose.prod.yml down echo "✅ Production сервисы остановлены" ;; "menu"|*) echo "" echo "Использование: $0 [команда]" echo "" echo "Команды:" echo " deploy - Деплой в production" echo " rollback - Откат к предыдущей версии" echo " status - Статус сервисов" echo " logs - Показать логи" echo " monitor - Мониторинг в реальном времени" echo " stop - Остановить сервисы" echo "" ;; esac