#!/bin/bash # deploy.sh - Улучшенный скрипт для деплоя Telegram Tinder Bot set -e # Выход при ошибке # Определение цветов для вывода GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[0;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} Telegram Tinder Bot Deploy ${NC}" echo -e "${BLUE}========================================${NC}" # Определяем рабочую директорию SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" cd "$SCRIPT_DIR" # Функция для проверки наличия команды check_command() { if ! command -v "$1" &> /dev/null; then echo -e "${RED}❌ Команда $1 не найдена!${NC}" return 1 else echo -e "${GREEN}✓ Команда $1 найдена${NC}" return 0 fi } # Шаг 1: Проверка и установка зависимостей echo -e "\n${BLUE}Шаг 1: Проверка и установка зависимостей...${NC}" # Проверяем наличие Docker и Docker Compose if ! check_command docker || ! check_command docker-compose; then echo -e "${YELLOW}Установка Docker и Docker Compose...${NC}" # Проверяем, запущен ли скрипт от имени root if [ "$(id -u)" -ne 0 ]; then echo -e "${RED}❌ Этот скрипт должен быть запущен с правами root для установки Docker.${NC}" echo -e "Пожалуйста, запустите: ${YELLOW}sudo $0${NC}" exit 1 fi # Устанавливаем Docker и Docker Compose if [ -f bin/install_docker.sh ]; then bash bin/install_docker.sh else echo -e "${YELLOW}Установка Docker с помощью apt...${NC}" apt update apt install -y docker.io docker-compose fi fi # Проверяем наличие Git if ! check_command git; then echo -e "${YELLOW}Установка Git...${NC}" apt update && apt install -y git fi # Проверяем наличие Node.js (для локальных операций) if ! check_command node || ! check_command npm; then echo -e "${YELLOW}Установка Node.js...${NC}" apt update apt install -y curl curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt install -y nodejs fi # Шаг 2: Получение последних изменений из репозитория echo -e "\n${BLUE}Шаг 2: Получение последних изменений из репозитория...${NC}" # Сохраняем локальные изменения, если они есть git stash save "Auto-stash before deploy: $(date)" || true # Получаем последние изменения git fetch --all git checkout main || git checkout master git pull origin "$(git rev-parse --abbrev-ref HEAD)" echo -e "${GREEN}✓ Получены последние изменения${NC}" # Шаг 3: Проверка и создание файлов конфигурации echo -e "\n${BLUE}Шаг 3: Проверка и настройка конфигурационных файлов...${NC}" # Проверяем наличие .env файла if [ ! -f .env ]; then echo -e "${YELLOW}⚠️ Файл .env не найден!${NC}" # Пытаемся найти шаблон .env файла if [ -f .env.production ]; then echo -e "${YELLOW}Создание .env файла из .env.production...${NC}" cp .env.production .env elif [ -f .env.example ]; then echo -e "${YELLOW}Создание .env файла из .env.example...${NC}" cp .env.example .env else echo -e "${RED}❌ Шаблон .env файла не найден! Создаем базовый .env файл...${NC}" cat > .env << EOL # Базовый .env файл NODE_ENV=production PORT=3000 DB_HOST=db DB_PORT=5432 DB_NAME=telegram_tinder_bot DB_USERNAME=postgres DB_PASSWORD=postgres TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN EOL fi echo -e "${YELLOW}⚠️ Пожалуйста, отредактируйте файл .env и укажите свои настройки!${NC}" echo -e "${YELLOW}⚠️ Особенно важно указать TELEGRAM_BOT_TOKEN${NC}" read -p "Продолжить деплой? (y/n): " continue_deploy if [[ ! $continue_deploy =~ ^[Yy]$ ]]; then echo -e "${RED}Деплой отменен. Пожалуйста, настройте .env файл и запустите скрипт снова.${NC}" exit 1 fi fi # Проверяем наличие docker-compose.override.yml if [ ! -f docker-compose.override.yml ] && [ -f docker-compose.override.yml.example ]; then echo -e "${YELLOW}Создание docker-compose.override.yml из примера...${NC}" cp docker-compose.override.yml.example docker-compose.override.yml fi # Шаг 4: Исправление проблем с Docker echo -e "\n${BLUE}Шаг 4: Проверка и исправление проблем с Docker...${NC}" # Исправляем проблему с командой сборки в Dockerfile if [ -f Dockerfile ] && grep -q "RUN npm run build" Dockerfile; then echo -e "${YELLOW}⚠️ Исправление команды сборки в Dockerfile для совместимости с Linux...${NC}" sed -i 's/RUN npm run build/RUN npm run build:linux/g' Dockerfile echo -e "${GREEN}✓ Dockerfile обновлен${NC}" fi # Исправление прав доступа к файлам в Unix-системах if [ -f bin/fix_permissions.sh ]; then echo -e "${YELLOW}Исправление прав доступа к файлам...${NC}" bash bin/fix_permissions.sh fi # Шаг 5: Запуск с Docker Compose echo -e "\n${BLUE}Шаг 5: Сборка и запуск Docker контейнеров...${NC}" # Остановка и удаление старых контейнеров echo -e "${YELLOW}Остановка и удаление старых контейнеров...${NC}" docker-compose down || true # Проверка наличия скрипта для исправления Docker if [ -f bin/fix_docker.sh ]; then echo -e "${YELLOW}Запуск скрипта исправления Docker...${NC}" bash bin/fix_docker.sh fi # Создание необходимых директорий с правильными правами доступа echo -e "${YELLOW}Создание необходимых директорий...${NC}" mkdir -p logs uploads chmod -R 777 logs uploads # Сборка и запуск контейнеров echo -e "${YELLOW}Сборка контейнеров...${NC}" docker-compose build echo -e "${YELLOW}Запуск контейнеров...${NC}" docker-compose up -d # Шаг 6: Применение миграций echo -e "\n${BLUE}Шаг 6: Применение миграций базы данных...${NC}" # Ждем инициализации базы данных echo -e "${YELLOW}Ожидание инициализации базы данных...${NC}" sleep 10 # Выбор способа миграции if [ -f bin/run_full_migration.sh ]; then echo -e "${YELLOW}Запуск полной миграции базы данных...${NC}" docker-compose exec bot bash -c "cd /app && ./bin/run_full_migration.sh" || true elif [ -f bin/apply_migrations.sh ]; then echo -e "${YELLOW}Применение миграций базы данных...${NC}" docker-compose exec bot bash -c "cd /app && ./bin/apply_migrations.sh" || true else echo -e "${YELLOW}Миграционные скрипты не найдены, пропускаем этап миграции${NC}" fi # Шаг 7: Проверка работоспособности echo -e "\n${BLUE}Шаг 7: Проверка работоспособности...${NC}" # Проверяем статус контейнеров echo -e "${YELLOW}Проверка статуса контейнеров...${NC}" docker-compose ps # Ждем запуска API echo -e "${YELLOW}Ожидание запуска API...${NC}" sleep 5 docker-compose exec bot curl -s http://localhost:3000/health || echo "⚠️ Сервис не отвечает на проверку здоровья" # Вывод информации о деплое echo -e "\n${GREEN}✅ Деплой успешно завершен!${NC}" echo -e "${GREEN}✅ Бот должен быть доступен через Telegram.${NC}" echo "" echo -e "${BLUE}📊 Полезные команды:${NC}" echo -e "- ${YELLOW}Просмотр логов:${NC} docker-compose logs -f bot" echo -e "- ${YELLOW}Перезапуск сервисов:${NC} docker-compose restart" echo -e "- ${YELLOW}Остановка всех сервисов:${NC} docker-compose down" echo -e "- ${YELLOW}Доступ к базе данных:${NC} docker-compose exec db psql -U postgres -d telegram_tinder_bot" echo -e "- ${YELLOW}Проверка состояния бота:${NC} curl http://localhost:3000/health" echo "" echo -e "${BLUE}🌟 Для администрирования базы данных:${NC}" echo -e "Adminer доступен по адресу: http://ваш_сервер:8080" echo -e " - ${YELLOW}Система:${NC} PostgreSQL" echo -e " - ${YELLOW}Сервер:${NC} db" echo -e " - ${YELLOW}Пользователь:${NC} postgres" echo -e " - ${YELLOW}Пароль:${NC} (из переменной DB_PASSWORD в .env)" echo -e " - ${YELLOW}База данных:${NC} telegram_tinder_bot" echo "" echo -e "${YELLOW}⚠️ При возникновении проблем проверьте файлы в директории bin/ для дополнительных утилит исправления.${NC}"