#!/bin/bash # start.sh - Скрипт для запуска Telegram Tinder Bot # Позволяет выбрать между локальной БД в контейнере или внешней БД # Цвета для вывода 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 ${NC}" echo -e "${BLUE}==================================================${NC}" # Проверка наличия Docker и Docker Compose if ! command -v docker &> /dev/null || ! command -v docker-compose &> /dev/null; then echo -e "${RED}ОШИБКА: Docker и/или Docker Compose не установлены!${NC}" echo -e "Для установки Docker следуйте инструкции на: https://docs.docker.com/get-docker/" exit 1 fi # Проверяем наличие .env файла if [ ! -f .env ]; then echo -e "${YELLOW}Файл .env не найден. Создаем из шаблона...${NC}" if [ -f .env.example ]; then cp .env.example .env echo -e "${GREEN}Файл .env создан из шаблона. Пожалуйста, отредактируйте его с вашими настройками.${NC}" else echo -e "${RED}ОШИБКА: Файл .env.example не найден. Создайте файл .env вручную.${NC}" exit 1 fi fi # Проверяем и исправляем проблему с командой сборки в Dockerfile echo -e "${YELLOW}Проверка конфигурации Dockerfile...${NC}" if grep -q "RUN npm run build" Dockerfile && ! grep -q "RUN npm run build:linux" 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 обновлен для использования команды сборки совместимой с Linux${NC}" fi # Спрашиваем про запуск базы данных read -p "Запустить базу данных PostgreSQL в контейнере? (y/n): " use_container_db # Функция для изменения docker-compose.yml modify_docker_compose() { local host=$1 local port=$2 local user=$3 local password=$4 local db_name=$5 echo -e "${YELLOW}Модифицируем docker-compose.yml для работы с внешней базой данных...${NC}" # Сохраняем оригинальную версию файла cp docker-compose.yml docker-compose.yml.bak # Создаем временный файл с модифицированным содержимым cat > docker-compose.temp.yml << EOL version: '3.8' services: bot: build: . container_name: telegram-tinder-bot restart: unless-stopped env_file: .env environment: - NODE_ENV=production - DB_HOST=${host} - DB_PORT=${port} - DB_NAME=${db_name} - DB_USERNAME=${user} - DB_PASSWORD=${password} volumes: - ./uploads:/app/uploads - ./logs:/app/logs networks: - bot-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 5s retries: 3 start_period: 10s adminer: image: adminer:latest container_name: adminer-tinder restart: unless-stopped ports: - "8080:8080" networks: - bot-network volumes: postgres_data: networks: bot-network: driver: bridge EOL # Заменяем оригинальный файл mv docker-compose.temp.yml docker-compose.yml echo -e "${GREEN}docker-compose.yml обновлен для работы с внешней базой данных${NC}" } # Функция для восстановления docker-compose.yml restore_docker_compose() { if [ -f docker-compose.yml.bak ]; then mv docker-compose.yml.bak docker-compose.yml echo -e "${GREEN}docker-compose.yml восстановлен из резервной копии${NC}" fi } # Обработка выбора if [[ "$use_container_db" =~ ^[Nn]$ ]]; then # Запрашиваем параметры подключения к внешней БД echo -e "${BLUE}Введите параметры подключения к внешней базе данных:${NC}" read -p "Хост (например, localhost): " db_host read -p "Порт (например, 5432): " db_port read -p "Имя базы данных: " db_name read -p "Имя пользователя: " db_user read -p "Пароль: " db_password # Модифицируем docker-compose.yml modify_docker_compose "$db_host" "$db_port" "$db_user" "$db_password" "$db_name" # Обновляем .env файл echo -e "${YELLOW}Обновляем файл .env с параметрами внешней базы данных...${NC}" # Используем sed для замены переменных в .env if [[ "$OSTYPE" == "darwin"* ]]; then # macOS требует другой синтаксис для sed sed -i '' "s/DB_HOST=.*/DB_HOST=${db_host}/" .env sed -i '' "s/DB_PORT=.*/DB_PORT=${db_port}/" .env sed -i '' "s/DB_NAME=.*/DB_NAME=${db_name}/" .env sed -i '' "s/DB_USERNAME=.*/DB_USERNAME=${db_user}/" .env sed -i '' "s/DB_PASSWORD=.*/DB_PASSWORD=${db_password}/" .env else # Linux и другие системы sed -i "s/DB_HOST=.*/DB_HOST=${db_host}/" .env sed -i "s/DB_PORT=.*/DB_PORT=${db_port}/" .env sed -i "s/DB_NAME=.*/DB_NAME=${db_name}/" .env sed -i "s/DB_USERNAME=.*/DB_USERNAME=${db_user}/" .env sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${db_password}/" .env fi echo -e "${GREEN}Файл .env обновлен с параметрами внешней базы данных${NC}" # Запускаем только контейнер с ботом echo -e "${BLUE}Запускаем Telegram Bot без контейнера базы данных...${NC}" docker-compose up -d bot adminer echo -e "${GREEN}Бот запущен и использует внешнюю базу данных: ${db_host}:${db_port}/${db_name}${NC}" echo -e "${YELLOW}Adminer доступен по адресу: http://localhost:8080/${NC}" echo -e "${YELLOW}Данные для входа в Adminer:${NC}" echo -e "${YELLOW}Система: PostgreSQL${NC}" echo -e "${YELLOW}Сервер: ${db_host}${NC}" echo -e "${YELLOW}Пользователь: ${db_user}${NC}" echo -e "${YELLOW}Пароль: (введенный вами)${NC}" echo -e "${YELLOW}База данных: ${db_name}${NC}" else # Восстанавливаем оригинальный docker-compose.yml если есть бэкап restore_docker_compose echo -e "${BLUE}Запускаем Telegram Bot с контейнером базы данных...${NC}" # Проверка, запущены ли контейнеры containers=$(docker ps -q -f name=telegram-tinder-bot -f name=postgres-tinder) if [ -n "$containers" ]; then echo -e "${YELLOW}Контейнеры уже запущены. Перезапустить? (y/n): ${NC}" read restart_containers if [[ "$restart_containers" =~ ^[Yy]$ ]]; then docker-compose down docker-compose up -d echo -e "${GREEN}Контейнеры перезапущены${NC}" else echo -e "${BLUE}Продолжаем работу с уже запущенными контейнерами${NC}" fi else docker-compose up -d echo -e "${GREEN}Контейнеры запущены${NC}" fi # Проверка наличия пароля для БД в .env db_password=$(grep DB_PASSWORD .env | cut -d '=' -f2) if [ -z "$db_password" ]; then # Генерируем случайный пароль random_password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16) # Обновляем .env файл if [[ "$OSTYPE" == "darwin"* ]]; then # macOS требует другой синтаксис для sed sed -i '' "s/DB_PASSWORD=.*/DB_PASSWORD=${random_password}/" .env else # Linux и другие системы sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${random_password}/" .env fi echo -e "${YELLOW}Сгенерирован случайный пароль для базы данных и сохранен в .env${NC}" fi echo -e "${GREEN}Telegram Bot запущен с локальной базой данных${NC}" echo -e "${YELLOW}Adminer доступен по адресу: http://localhost:8080/${NC}" echo -e "${YELLOW}Данные для входа в Adminer:${NC}" echo -e "${YELLOW}Система: PostgreSQL${NC}" echo -e "${YELLOW}Сервер: db${NC}" echo -e "${YELLOW}Пользователь: postgres${NC}" echo -e "${YELLOW}Пароль: (из переменной DB_PASSWORD в .env)${NC}" echo -e "${YELLOW}База данных: telegram_tinder_bot${NC}" fi # Проверка статуса контейнеров echo -e "${BLUE}Проверка статуса контейнеров:${NC}" docker-compose ps echo -e "${BLUE}==================================================${NC}" echo -e "${GREEN}Процесс запуска Telegram Tinder Bot завершен!${NC}" echo -e "${BLUE}==================================================${NC}" echo -e "${YELLOW}Для просмотра логов используйте: docker-compose logs -f bot${NC}" echo -e "${YELLOW}Для остановки: docker-compose down${NC}"