This commit is contained in:
147
scripts/deploy.sh
Executable file
147
scripts/deploy.sh
Executable file
@@ -0,0 +1,147 @@
|
||||
#!/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
|
||||
148
scripts/dev.sh
Executable file
148
scripts/dev.sh
Executable file
@@ -0,0 +1,148 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для локальной разработки с Docker
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
echo "🐳 Quiz Bot Development Script"
|
||||
echo "=============================="
|
||||
|
||||
# Функция для проверки Docker
|
||||
check_docker() {
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker не установлен!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker info &> /dev/null; then
|
||||
echo "❌ Docker daemon не запущен!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Docker готов к работе"
|
||||
}
|
||||
|
||||
# Функция для сборки образа
|
||||
build_image() {
|
||||
echo "🔨 Сборка Docker образа..."
|
||||
cd "$PROJECT_ROOT"
|
||||
docker build -t quiz-bot:dev .
|
||||
echo "✅ Образ собран: quiz-bot:dev"
|
||||
}
|
||||
|
||||
# Функция для запуска в development режиме
|
||||
run_dev() {
|
||||
echo "🚀 Запуск в режиме разработки..."
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Проверяем .env файл
|
||||
if [ ! -f .env ]; then
|
||||
echo "⚠️ Файл .env не найден. Создаём шаблон..."
|
||||
cat > .env << EOF
|
||||
BOT_TOKEN=your_bot_token_here
|
||||
DATABASE_PATH=data/quiz_bot.db
|
||||
CSV_DATA_PATH=data/
|
||||
LOG_LEVEL=DEBUG
|
||||
EOF
|
||||
echo "📝 Заполните .env файл и запустите скрипт снова"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создаём директории если их нет
|
||||
mkdir -p data logs
|
||||
|
||||
docker-compose up --build
|
||||
}
|
||||
|
||||
# Функция для остановки
|
||||
stop_dev() {
|
||||
echo "🛑 Остановка сервисов..."
|
||||
cd "$PROJECT_ROOT"
|
||||
docker-compose down
|
||||
echo "✅ Сервисы остановлены"
|
||||
}
|
||||
|
||||
# Функция для очистки
|
||||
cleanup() {
|
||||
echo "🧹 Очистка Docker ресурсов..."
|
||||
cd "$PROJECT_ROOT"
|
||||
docker-compose down --volumes --remove-orphans
|
||||
docker image rm quiz-bot:dev 2>/dev/null || true
|
||||
docker system prune -f
|
||||
echo "✅ Очистка завершена"
|
||||
}
|
||||
|
||||
# Функция для тестирования
|
||||
test_app() {
|
||||
echo "🧪 Запуск тестов..."
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Сборка тестового образа
|
||||
docker build -t quiz-bot:test .
|
||||
|
||||
# Запуск тестов в контейнере
|
||||
docker run --rm \
|
||||
-e BOT_TOKEN=test_token \
|
||||
-e DATABASE_PATH=":memory:" \
|
||||
quiz-bot:test \
|
||||
python -m pytest test_*.py -v
|
||||
|
||||
echo "✅ Тесты завершены"
|
||||
}
|
||||
|
||||
# Функция для логов
|
||||
show_logs() {
|
||||
echo "📋 Показ логов..."
|
||||
cd "$PROJECT_ROOT"
|
||||
docker-compose logs -f quiz-bot
|
||||
}
|
||||
|
||||
# Главное меню
|
||||
case "${1:-menu}" in
|
||||
"build")
|
||||
check_docker
|
||||
build_image
|
||||
;;
|
||||
"run"|"start")
|
||||
check_docker
|
||||
run_dev
|
||||
;;
|
||||
"stop")
|
||||
check_docker
|
||||
stop_dev
|
||||
;;
|
||||
"restart")
|
||||
check_docker
|
||||
stop_dev
|
||||
run_dev
|
||||
;;
|
||||
"test")
|
||||
check_docker
|
||||
test_app
|
||||
;;
|
||||
"logs")
|
||||
check_docker
|
||||
show_logs
|
||||
;;
|
||||
"cleanup")
|
||||
check_docker
|
||||
cleanup
|
||||
;;
|
||||
"menu"|*)
|
||||
echo ""
|
||||
echo "Использование: $0 [команда]"
|
||||
echo ""
|
||||
echo "Команды:"
|
||||
echo " build - Собрать Docker образ"
|
||||
echo " run - Запустить в режиме разработки"
|
||||
echo " stop - Остановить сервисы"
|
||||
echo " restart - Перезапустить сервисы"
|
||||
echo " test - Запустить тесты"
|
||||
echo " logs - Показать логи"
|
||||
echo " cleanup - Очистить Docker ресурсы"
|
||||
echo ""
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user