Files
tg_tinder_bot/deploy.sh
2025-11-06 15:09:15 +09:00

218 lines
9.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}"