218 lines
9.9 KiB
Bash
218 lines
9.9 KiB
Bash
#!/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}"
|