diff --git a/Dockerfile b/Dockerfile index 7cd385d..8b3336c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ COPY src/ ./src/ COPY .env.example ./ # Build the application (using Linux-compatible build command) -RUN npm run build:linux +RUN npm run build:linux:linux # Production stage FROM node:18-alpine AS production diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4bc34a6 --- /dev/null +++ b/Makefile @@ -0,0 +1,75 @@ +# Makefile для Telegram Tinder Bot + +.PHONY: help install update run migrate fix-docker clean + +# Значения по умолчанию +DB_HOST ?= db +DB_PORT ?= 5432 +DB_NAME ?= telegram_tinder_bot +DB_USERNAME ?= postgres +DB_PASSWORD ?= postgres + +# Основные команды +help: + @echo "========== Telegram Tinder Bot Makefile ==========" + @echo "make install - Установка зависимостей" + @echo "make update - Обновление кода из репозитория" + @echo "make run - Запуск бота в контейнере" + @echo "make migrate - Применение миграций базы данных" + @echo "make fix-docker - Исправление проблем с Docker" + @echo "make clean - Очистка и остановка контейнеров" + +install: + @echo "Установка зависимостей..." + @if ! command -v docker &> /dev/null || ! command -v docker-compose &> /dev/null; then \ + echo "Установка Docker..."; \ + sudo apt update && sudo apt install -y docker.io docker-compose; \ + fi + @if [ ! -f .env ]; then \ + echo "Создание .env файла..."; \ + cp .env.example .env 2>/dev/null || cp .env.production .env 2>/dev/null || echo "NODE_ENV=production" > .env; \ + echo "Пожалуйста, отредактируйте файл .env!"; \ + fi + @mkdir -p logs uploads && chmod -R 777 logs uploads + +update: + @echo "Обновление кода..." + @git fetch --all + @git pull origin main || git pull origin master || echo "Не удалось обновить код" + @if [ -f package.json ]; then npm ci || npm install; fi + +run: + @echo "Запуск бота..." + @docker-compose down || true + @make fix-docker + @docker-compose build + @docker-compose up -d + @echo "Бот запущен! Для просмотра логов: docker-compose logs -f" + +migrate: + @echo "Применение миграций..." + @if [ -d migrations ]; then \ + mkdir -p temp_migrations; \ + find migrations -name "*.js" -exec cp {} temp_migrations/ \; 2>/dev/null || true; \ + DATABASE_URL=postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} \ + npx node-pg-migrate up --migrations-dir=migrations || true; \ + fi + @if [ -d sql ]; then \ + for sql_file in sql/*.sql; do \ + [ -f "$${sql_file}" ] && docker-compose exec -T db psql -U ${DB_USERNAME} -d ${DB_NAME} -f "/app/$${sql_file}" || true; \ + done; \ + fi + +fix-docker: + @echo "Исправление Docker конфигурации..." + @if [ -f Dockerfile ] && grep -q "RUN npm run build" Dockerfile; then \ + sed -i 's/RUN npm run build/RUN npm run build:linux/g' Dockerfile; \ + fi + @docker rm -f postgres-tinder adminer-tinder telegram-tinder-bot 2>/dev/null || true + @docker system prune -f --volumes >/dev/null 2>&1 || true + +clean: + @echo "Очистка..." + @docker-compose down || true + @rm -rf temp_migrations node_modules/.cache + @echo "Очистка завершена" diff --git a/additional_translations.json b/additional_translations.json new file mode 100644 index 0000000..c937d4e --- /dev/null +++ b/additional_translations.json @@ -0,0 +1,49 @@ +{ + "noProfile": { + "message": "❌ У вас пока нет профиля.\\nСоздайте его для начала использования бота!", + "createButton": "🚀 Создать профиль" + }, + "noMatches": { + "message": "💔 У вас пока нет матчей.\\n\\n🔍 Попробуйте просмотреть больше анкет!\\nИспользуйте /browse для поиска.", + "browsing": "🔍 Найти еще" + }, + "matches": { + "title": "💕 Ваши матчи:", + "openChats": "💬 Открыть чаты", + "nativeChats": "📱 Нативные чаты", + "findMore": "🔍 Найти еще", + "cityNotSpecified": "Не указан" + }, + "profileCreation": { + "start": "👋 Давайте создадим ваш профиль!\\n\\n📝 Сначала напишите ваше имя:", + "enterName": "❌ Пожалуйста, отправьте текстовое сообщение с вашим именем", + "enterAge": "📅 Отлично! Теперь укажите ваш возраст:", + "ageNotNumber": "❌ Пожалуйста, отправьте число", + "ageInvalid": "❌ Возраст должен быть числом от 18 до 100", + "enterCity": "📍 Прекрасно! В каком городе вы живете?", + "cityText": "❌ Пожалуйста, отправьте название города", + "enterBio": "📝 Теперь расскажите немного о себе (био):\\n\\n💡 Например: хобби, интересы, что ищете в отношениях и т.д.", + "bioText": "❌ Пожалуйста, отправьте текстовое описание", + "enterPhoto": "📸 Отлично! Теперь отправьте ваше фото:\\n\\n💡 Лучше использовать качественное фото лица", + "photoRequired": "❌ Пожалуйста, отправьте фотографию", + "error": "❌ Произошла ошибка. Попробуйте еще раз.", + "createError": "❌ Ошибка при создании профиля. Попробуйте еще раз позже." + }, + "profileView": { + "cityNotSpecified": "Не указан", + "bioNotSpecified": "Описание не указано", + "editProfile": "✏️ Редактировать", + "managePhotos": "📸 Фото", + "startBrowsing": "🔍 Начать поиск", + "backToBrowsing": "👈 Назад" + }, + "browsing": { + "noMoreProfiles": "🎉 Вы просмотрели всех доступных кандидатов!\\n\\n⏰ Попробуйте позже - возможно появятся новые анкеты!", + "needProfile": "❌ Сначала создайте профиль!\\nИспользуйте команду /start", + "cityNotSpecified": "Не указан" + }, + "general": { + "greeting": "Привет! 👋\\n\\nИспользуйте команды для навигации:\\n/start - Главное меню\\n/help - Справка\\n/profile - Мой профиль\\n/browse - Поиск анкет", + "photoManagement": "📸 Для управления фотографиями используйте:" + } +} diff --git a/bin/apply_direct_sql.sh b/bin/apply_direct_sql.sh old mode 100644 new mode 100755 diff --git a/bin/apply_migrations.sh b/bin/apply_migrations.sh old mode 100644 new mode 100755 diff --git a/bin/backup_db.sh b/bin/backup_db.sh old mode 100644 new mode 100755 diff --git a/bin/compile_ts_migrations.sh b/bin/compile_ts_migrations.sh old mode 100644 new mode 100755 diff --git a/bin/create_consolidated_migration.sh b/bin/create_consolidated_migration.sh old mode 100644 new mode 100755 diff --git a/bin/create_release.sh b/bin/create_release.sh old mode 100644 new mode 100755 diff --git a/bin/fix_docker.sh b/bin/fix_docker.sh old mode 100644 new mode 100755 diff --git a/bin/fix_line_endings.sh b/bin/fix_line_endings.sh old mode 100644 new mode 100755 diff --git a/bin/fix_permissions.sh b/bin/fix_permissions.sh old mode 100644 new mode 100755 diff --git a/bin/install_docker.sh b/bin/install_docker.sh old mode 100644 new mode 100755 diff --git a/bin/install_ubuntu.sh b/bin/install_ubuntu.sh old mode 100644 new mode 100755 diff --git a/bin/run_full_migration.sh b/bin/run_full_migration.sh old mode 100644 new mode 100755 diff --git a/bin/run_sql_migrations.sh b/bin/run_sql_migrations.sh old mode 100644 new mode 100755 diff --git a/bin/setup.sh b/bin/setup.sh old mode 100644 new mode 100755 diff --git a/bin/start_bot.sh b/bin/start_bot.sh old mode 100644 new mode 100755 diff --git a/bin/update.sh b/bin/update.sh old mode 100644 new mode 100755 diff --git a/build-fix.bat b/build-fix.bat deleted file mode 100644 index 77e94dd..0000000 --- a/build-fix.bat +++ /dev/null @@ -1,59 +0,0 @@ -@echo off -REM build-fix.bat - Скрипт для исправления проблем сборки в Docker для Windows - -echo ================================================== -echo Проверка и исправление проблем сборки -echo ================================================== - -REM Проверяем наличие Dockerfile -if not exist Dockerfile ( - echo ОШИБКА: Dockerfile не найден в текущей директории! - exit /b 1 -) - -REM Проверяем команду сборки в Dockerfile -echo Проверка конфигурации Dockerfile... - -findstr /c:"RUN npm run build" Dockerfile > nul -if %errorlevel% equ 0 ( - findstr /c:"RUN npm run build:linux" Dockerfile > nul - if %errorlevel% neq 0 ( - echo Найдена проблема: Dockerfile использует 'npm run build', что не работает в контейнере Linux - echo Исправление: заменяем на 'npm run build:linux'... - - REM Создаем резервную копию - copy Dockerfile Dockerfile.bak - - REM Заменяем команду - powershell -Command "(Get-Content Dockerfile) -replace 'RUN npm run build', 'RUN npm run build:linux' | Set-Content Dockerfile" - - echo ✅ Dockerfile обновлен. Резервная копия сохранена как Dockerfile.bak - ) else ( - echo ✅ Dockerfile уже использует корректную команду сборки - ) -) else ( - echo ✅ Команда сборки не найдена в Dockerfile -) - -REM Проверка команды сборки в package.json -if exist package.json ( - findstr /c:"\"build:linux\":" package.json > nul - if %errorlevel% equ 0 ( - echo ✅ В package.json уже определена команда build:linux - ) else ( - echo В package.json отсутствует команда build:linux - echo Рекомендуем добавить команду build:linux вручную: - echo Найдите строку с "build": "tsc && xcopy /E /I src\\locales dist\\locales" - echo И добавьте после нее: - echo "build:linux": "tsc && cp -R src/locales dist/", - ) -) else ( - echo ПРЕДУПРЕЖДЕНИЕ: package.json не найден в текущей директории! -) - -echo ================================================== -echo Проверка и исправление завершены! -echo ================================================== -echo Для применения изменений выполните: docker-compose build - -pause diff --git a/build-fix.sh b/build-fix.sh deleted file mode 100644 index 71f6c62..0000000 --- a/build-fix.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash -# build-fix.sh - Скрипт для исправления проблем сборки в Docker - -# Цвета для вывода -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -RED='\033[0;31m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -echo -e "${BLUE}==================================================${NC}" -echo -e "${BLUE} Проверка и исправление проблем сборки ${NC}" -echo -e "${BLUE}==================================================${NC}" - -# Проверяем наличие Dockerfile -if [ ! -f Dockerfile ]; then - echo -e "${RED}ОШИБКА: Dockerfile не найден в текущей директории!${NC}" - exit 1 -fi - -# Проверяем команду сборки в package.json и Dockerfile -echo -e "${YELLOW}Проверка конфигурации сборки...${NC}" - -# Проверка команды сборки в Dockerfile -if grep -q "RUN npm run build" Dockerfile && ! grep -q "RUN npm run build:linux" Dockerfile; then - echo -e "${YELLOW}Найдена проблема: Dockerfile использует 'npm run build', что не работает в контейнере Linux${NC}" - echo -e "${BLUE}Исправление: заменяем на 'npm run build:linux'...${NC}" - - # Создаем резервную копию - cp Dockerfile Dockerfile.bak - - # Заменяем команду - sed -i "s/RUN npm run build/RUN npm run build:linux/g" Dockerfile - - echo -e "${GREEN}✅ Dockerfile обновлен. Резервная копия сохранена как Dockerfile.bak${NC}" -else - echo -e "${GREEN}✅ Dockerfile уже использует корректную команду сборки${NC}" -fi - -# Проверка команды сборки в package.json -if [ -f package.json ]; then - if grep -q "\"build:linux\":" package.json; then - echo -e "${GREEN}✅ В package.json уже определена команда build:linux${NC}" - else - echo -e "${YELLOW}В package.json отсутствует команда build:linux${NC}" - echo -e "${BLUE}Добавляем команду build:linux...${NC}" - - # Создаем резервную копию - cp package.json package.json.bak - - # Получаем текущую команду build - build_cmd=$(grep -o '"build": "[^"]*"' package.json | sed 's/"build": "\(.*\)"/\1/') - - # Создаем версию для Linux, заменяя xcopy на cp -R - linux_build_cmd=$(echo "$build_cmd" | sed 's/xcopy \/E \/I/cp -R/g' | sed 's/\\\\/\//g') - - # Добавляем команду build:linux, если она не существует - if [[ "$linux_build_cmd" != "$build_cmd" ]]; then - sed -i "/\"build\":/a \ \"build:linux\": \"${linux_build_cmd}\"," package.json - echo -e "${GREEN}✅ Команда build:linux добавлена в package.json${NC}" - fi - fi -else - echo -e "${RED}ПРЕДУПРЕЖДЕНИЕ: package.json не найден в текущей директории!${NC}" -fi - -echo -e "${BLUE}==================================================${NC}" -echo -e "${GREEN}Проверка и исправление завершены!${NC}" -echo -e "${BLUE}==================================================${NC}" -echo -e "${YELLOW}Для применения изменений выполните: docker-compose build${NC}" diff --git a/deploy.sh b/deploy.sh old mode 100644 new mode 100755 index 1a61f2f..c20f8e9 --- a/deploy.sh +++ b/deploy.sh @@ -1,63 +1,217 @@ #!/bin/bash -# deploy.sh - Скрипт для деплоя Telegram Tinder Bot +# deploy.sh - Улучшенный скрипт для деплоя Telegram Tinder Bot -echo "🚀 Деплой Telegram Tinder Bot..." +set -e # Выход при ошибке -# Проверяем наличие Docker -if ! command -v docker &> /dev/null || ! command -v docker-compose &> /dev/null; then - echo "❌ Docker и Docker Compose должны быть установлены!" - echo "Для установки на Ubuntu выполните:" - echo "sudo apt update && sudo apt install -y docker.io docker-compose" - exit 1 -fi +# Определение цветов для вывода +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 + # Получаем последние изменения -echo "📥 Получение последних изменений..." -git pull origin main +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 "📝 Создание .env файла из .env.production..." - cp .env.production .env - echo "⚠️ Пожалуйста, отредактируйте файл .env и укажите свои настройки!" - exit 1 + 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 -# Проверяем и исправляем проблему с командой сборки в Dockerfile -echo "🔧 Проверка конфигурации Dockerfile..." -if grep -q "RUN npm run build" Dockerfile; then - echo "⚠️ Исправление команды сборки в Dockerfile для совместимости с Linux..." +# Проверяем наличие 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 "✅ Dockerfile обновлен" + echo -e "${GREEN}✓ Dockerfile обновлен${NC}" fi -# Запускаем Docker Compose -echo "🐳 Сборка и запуск контейнеров Docker..." -docker-compose down +# Исправление прав доступа к файлам в 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 "🔍 Проверка статуса контейнеров..." +echo -e "${YELLOW}Проверка статуса контейнеров...${NC}" docker-compose ps -echo "✅ Деплой успешно завершен! Бот должен быть доступен через Telegram." +# Ждем запуска 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 "📊 Полезные команды:" -echo "- Просмотр логов: docker-compose logs -f" -echo "- Перезапуск сервисов: docker-compose restart" -echo "- Остановка всех сервисов: docker-compose down" -echo "- Доступ к базе данных: docker-compose exec db psql -U postgres -d telegram_tinder_bot" -echo "- Проверка состояния бота: curl http://localhost:3000/health" +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 "🌟 Для администрирования базы данных:" -echo "Adminer доступен по адресу: http://ваш_сервер:8080" -echo " - Система: PostgreSQL" -echo " - Сервер: db" -echo " - Пользователь: postgres" -echo " - Пароль: (из переменной DB_PASSWORD в .env)" -echo " - База данных: telegram_tinder_bot" +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}" diff --git a/docker-compose.override.yml.example b/docker-compose.override.yml.example deleted file mode 100644 index 7ebf603..0000000 --- a/docker-compose.override.yml.example +++ /dev/null @@ -1,69 +0,0 @@ -# Используем версию Docker Compose для локальной разработки - -version: '3.8' - -services: - bot: - build: - context: . - dockerfile: Dockerfile - args: - - NODE_ENV=development - environment: - - NODE_ENV=development - - DB_HOST=db - - DB_PORT=5432 - - DB_NAME=telegram_tinder_bot - - DB_USERNAME=postgres - - DB_PASSWORD=dev_password - volumes: - # Монтируем исходный код для горячей перезагрузки - - ./src:/app/src - - ./dist:/app/dist - - ./.env:/app/.env - ports: - # Открываем порт для отладки - - "9229:9229" - command: npm run dev - networks: - - bot-network - depends_on: - - db - - db: - # Используем последнюю версию PostgreSQL для разработки - image: postgres:16-alpine - environment: - - POSTGRES_DB=telegram_tinder_bot - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=dev_password - volumes: - # Хранение данных локально для быстрого сброса - - postgres_data_dev:/var/lib/postgresql/data - # Монтируем скрипты инициализации - - ./sql:/docker-entrypoint-initdb.d - ports: - # Открываем порт для доступа к БД напрямую - - "5433:5432" - networks: - - bot-network - - adminer: - image: adminer:latest - ports: - - "8080:8080" - networks: - - bot-network - depends_on: - - db - environment: - - ADMINER_DEFAULT_SERVER=db - - ADMINER_DEFAULT_USER=postgres - - ADMINER_DEFAULT_PASSWORD=dev_password - -volumes: - postgres_data_dev: - -networks: - bot-network: - driver: bridge diff --git a/docker-compose.temp.yml b/docker-compose.temp.yml deleted file mode 100644 index 2017b71..0000000 --- a/docker-compose.temp.yml +++ /dev/null @@ -1,45 +0,0 @@ -[36mВведите параметры подключения к внешней базе данных:[0m -Хост (например, localhost): Порт (например, 5432): Имя базы данных: Имя пользователя: Пароль: [33mМодифицируем docker-compose.yml для работы с внешней базой данных...[0m -஢ 䠩: 0. -version: '3.8' - -services: - bot: - build: . - container_name: telegram-tinder-bot - restart: unless-stopped - env_file: .env - environment: - - NODE_ENV=production - - DB_HOST= - - DB_PORT= - - DB_NAME= - - DB_USERNAME= - - DB_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 diff --git a/src/services/userLanguageService.ts b/src/services/userLanguageService.ts new file mode 100644 index 0000000..cce0066 --- /dev/null +++ b/src/services/userLanguageService.ts @@ -0,0 +1,59 @@ +import { query } from '../database/connection'; + +export class UserLanguageService { + // Получить язык пользователя + async getUserLanguage(telegramId: string): Promise { + try { + const result = await query( + 'SELECT language FROM users WHERE telegram_id = $1', + [telegramId] + ); + + if (result.rows.length > 0) { + return result.rows[0].language || 'ru'; + } + + return 'ru'; // Язык по умолчанию + } catch (error) { + console.error('Error getting user language:', error); + return 'ru'; + } + } + + // Установить язык пользователя + async setUserLanguage(telegramId: string, language: string): Promise { + try { + await query( + 'UPDATE users SET language = $1 WHERE telegram_id = $2', + [language, telegramId] + ); + return true; + } catch (error) { + console.error('Error setting user language:', error); + return false; + } + } + + // Получить поддерживаемые языки + getSupportedLanguages(): { [key: string]: string } { + return { + 'ru': '🇷🇺 Русский', + 'en': '🇺🇸 English', + 'es': '🇪🇸 Español', + 'fr': '🇫🇷 Français', + 'de': '🇩🇪 Deutsch', + 'it': '🇮🇹 Italiano', + 'pt': '🇵🇹 Português', + 'zh': '🇨🇳 中文', + 'ja': '🇯🇵 日本語', + 'ko': '🇰🇷 한국어', + 'uz': '🇺🇿 O\'zbekcha', + 'kk': '🇰🇿 Қазақша' + }; + } + + // Проверить, поддерживается ли язык + isLanguageSupported(language: string): boolean { + return Object.keys(this.getSupportedLanguages()).includes(language); + } +} diff --git a/start.bat b/start.bat deleted file mode 100644 index 6ef2b25..0000000 --- a/start.bat +++ /dev/null @@ -1,241 +0,0 @@ -@echo off -:: start.bat - Скрипт для запуска Telegram Tinder Bot на Windows -:: Позволяет выбрать между локальной БД в контейнере или внешней БД - -echo ================================================ -echo Запуск Telegram Tinder Bot -echo ================================================ - -:: Проверка наличия Docker и Docker Compose -WHERE docker >nul 2>&1 -IF %ERRORLEVEL% NEQ 0 ( - echo [31mОШИБКА: Docker не установлен![0m - echo Установите Docker Desktop для Windows: https://docs.docker.com/desktop/install/windows-install/ - exit /b 1 -) - -:: Проверяем наличие .env файла -IF NOT EXIST .env ( - echo [33mФайл .env не найден. Создаем из шаблона...[0m - IF EXIST .env.example ( - copy .env.example .env - echo [32mФайл .env создан из шаблона. Пожалуйста, отредактируйте его с вашими настройками.[0m - ) ELSE ( - echo [31mОШИБКА: Файл .env.example не найден. Создайте файл .env вручную.[0m - exit /b 1 - ) -) - -:: Спрашиваем про запуск базы данных -set /p use_container_db="Запустить базу данных PostgreSQL в контейнере? (y/n): " - -:: Функции для работы с docker-compose -IF /I "%use_container_db%" NEQ "y" ( - :: Запрашиваем параметры подключения к внешней БД - echo [36mВведите параметры подключения к внешней базе данных:[0m - set /p db_host="Хост (например, localhost): " - set /p db_port="Порт (например, 5432): " - set /p db_name="Имя базы данных: " - set /p db_user="Имя пользователя: " - set /p db_password="Пароль: " - - :: Модифицируем docker-compose.yml - echo [33mМодифицируем docker-compose.yml для работы с внешней базой данных...[0m - - :: Сохраняем оригинальную версию файла - copy docker-compose.yml docker-compose.yml.bak - - :: Создаем временный файл с модифицированным содержимым - ( - echo version: '3.8' - echo. - echo services: - echo bot: - echo build: . - echo container_name: telegram-tinder-bot - echo restart: unless-stopped - echo env_file: .env - echo environment: - echo - NODE_ENV=production - echo - DB_HOST=%db_host% - echo - DB_PORT=%db_port% - echo - DB_NAME=%db_name% - echo - DB_USERNAME=%db_user% - echo - DB_PASSWORD=%db_password% - echo volumes: - echo - ./uploads:/app/uploads - echo - ./logs:/app/logs - echo networks: - echo - bot-network - echo healthcheck: - echo test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] - echo interval: 30s - echo timeout: 5s - echo retries: 3 - echo start_period: 10s - echo. - echo adminer: - echo image: adminer:latest - echo container_name: adminer-tinder - echo restart: unless-stopped - echo ports: - echo - "8080:8080" - echo networks: - echo - bot-network - echo. - echo volumes: - echo postgres_data: - echo. - echo networks: - echo bot-network: - echo driver: bridge - ) > docker-compose.temp.yml - - :: Заменяем оригинальный файл - move /y docker-compose.temp.yml docker-compose.yml - - echo [32mdocker-compose.yml обновлен для работы с внешней базой данных[0m - - :: Обновляем .env файл - echo [33mОбновляем файл .env с параметрами внешней базы данных...[0m - - :: Создаем временный файл - type NUL > .env.temp - - :: Читаем .env построчно и заменяем нужные строки - for /f "tokens=*" %%a in (.env) do ( - set line=%%a - set line=!line:DB_HOST=*! - if "!line:~0,1!" == "*" ( - echo DB_HOST=%db_host%>> .env.temp - ) else ( - set line=!line:DB_PORT=*! - if "!line:~0,1!" == "*" ( - echo DB_PORT=%db_port%>> .env.temp - ) else ( - set line=!line:DB_NAME=*! - if "!line:~0,1!" == "*" ( - echo DB_NAME=%db_name%>> .env.temp - ) else ( - set line=!line:DB_USERNAME=*! - if "!line:~0,1!" == "*" ( - echo DB_USERNAME=%db_user%>> .env.temp - ) else ( - set line=!line:DB_PASSWORD=*! - if "!line:~0,1!" == "*" ( - echo DB_PASSWORD=%db_password%>> .env.temp - ) else ( - echo %%a>> .env.temp - ) - ) - ) - ) - ) - ) - - :: Заменяем оригинальный файл - move /y .env.temp .env - - echo [32mФайл .env обновлен с параметрами внешней базы данных[0m - - :: Запускаем только контейнер с ботом - echo [36mЗапускаем Telegram Bot без контейнера базы данных...[0m - docker-compose up -d bot adminer - - echo [32mБот запущен и использует внешнюю базу данных: %db_host%:%db_port%/%db_name%[0m - echo [33mAdminer доступен по адресу: http://localhost:8080/[0m - echo [33mДанные для входа в Adminer:[0m - echo [33mСистема: PostgreSQL[0m - echo [33mСервер: %db_host%[0m - echo [33mПользователь: %db_user%[0m - echo [33mПароль: (введенный вами)[0m - echo [33mБаза данных: %db_name%[0m -) ELSE ( - :: Восстанавливаем оригинальный docker-compose.yml если есть бэкап - if exist docker-compose.yml.bak ( - move /y docker-compose.yml.bak docker-compose.yml - echo [32mdocker-compose.yml восстановлен из резервной копии[0m - ) - - echo [36mЗапускаем Telegram Bot с контейнером базы данных...[0m - - :: Проверка, запущены ли контейнеры - docker ps -q -f name=telegram-tinder-bot > tmp_containers.txt - set /p containers= .env.temp - - :: Читаем .env построчно и заменяем строку с паролем - for /f "tokens=*" %%a in (.env) do ( - set line=%%a - set line=!line:DB_PASSWORD=*! - if "!line:~0,1!" == "*" ( - echo DB_PASSWORD=%random_password%>> .env.temp - ) else ( - echo %%a>> .env.temp - ) - ) - - :: Заменяем оригинальный файл - move /y .env.temp .env - - echo [33mСгенерирован случайный пароль для базы данных и сохранен в .env[0m - ) - - echo [32mTelegram Bot запущен с локальной базой данных[0m - echo [33mAdminer доступен по адресу: http://localhost:8080/[0m - echo [33mДанные для входа в Adminer:[0m - echo [33mСистема: PostgreSQL[0m - echo [33mСервер: db[0m - echo [33mПользователь: postgres[0m - echo [33mПароль: (из переменной DB_PASSWORD в .env)[0m - echo [33mБаза данных: telegram_tinder_bot[0m -) - -:: Проверка статуса контейнеров -echo [36mПроверка статуса контейнеров:[0m -docker-compose ps - -echo ================================================ -echo [32mПроцесс запуска Telegram Tinder Bot завершен![0m -echo ================================================ -echo [33mДля просмотра логов используйте: docker-compose logs -f bot[0m -echo [33mДля остановки: docker-compose down[0m - -pause diff --git a/start.ps1 b/start.ps1 deleted file mode 100644 index dd2674e..0000000 --- a/start.ps1 +++ /dev/null @@ -1,229 +0,0 @@ -function createModifiedDockerCompose { - param ( - [string]$dbHost, - [string]$dbPort, - [string]$dbName, - [string]$dbUser, - [string]$dbPassword - ) - - $dockerComposeContent = @" -version: '3.8' - -services: - bot: - build: . - container_name: telegram-tinder-bot - restart: unless-stopped - env_file: .env - environment: - - NODE_ENV=production - - DB_HOST=$dbHost - - DB_PORT=$dbPort - - DB_NAME=$dbName - - DB_USERNAME=$dbUser - - DB_PASSWORD=$dbPassword - 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 -"@ - - return $dockerComposeContent -} - -function restoreDockerCompose { - if (Test-Path -Path "docker-compose.yml.bak") { - Copy-Item -Path "docker-compose.yml.bak" -Destination "docker-compose.yml" -Force - Write-Host "docker-compose.yml восстановлен из резервной копии" -ForegroundColor Green - } -} - -function updateEnvFile { - param ( - [string]$dbHost, - [string]$dbPort, - [string]$dbName, - [string]$dbUser, - [string]$dbPassword - ) - - $envContent = Get-Content -Path ".env" -Raw - - $envContent = $envContent -replace "DB_HOST=.*", "DB_HOST=$dbHost" - $envContent = $envContent -replace "DB_PORT=.*", "DB_PORT=$dbPort" - $envContent = $envContent -replace "DB_NAME=.*", "DB_NAME=$dbName" - $envContent = $envContent -replace "DB_USERNAME=.*", "DB_USERNAME=$dbUser" - $envContent = $envContent -replace "DB_PASSWORD=.*", "DB_PASSWORD=$dbPassword" - - Set-Content -Path ".env" -Value $envContent - - Write-Host "Файл .env обновлен с параметрами внешней базы данных" -ForegroundColor Green -} - -function generateRandomPassword { - $length = 16 - $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - $bytes = New-Object Byte[] $length - $rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::new() - $rng.GetBytes($bytes) - - $password = "" - for ($i = 0; $i -lt $length; $i++) { - $password += $chars[$bytes[$i] % $chars.Length] - } - - return $password -} - -# Начало основного скрипта -Write-Host "==================================================" -ForegroundColor Cyan -Write-Host " Запуск Telegram Tinder Bot" -ForegroundColor Cyan -Write-Host "==================================================" -ForegroundColor Cyan - -# Проверка наличия Docker -try { - docker --version | Out-Null -} catch { - Write-Host "ОШИБКА: Docker не установлен!" -ForegroundColor Red - Write-Host "Установите Docker Desktop для Windows: https://docs.docker.com/desktop/install/windows-install/" - exit -} - -# Проверяем наличие .env файла -if (-not (Test-Path -Path ".env")) { - Write-Host "Файл .env не найден. Создаем из шаблона..." -ForegroundColor Yellow - - if (Test-Path -Path ".env.example") { - Copy-Item -Path ".env.example" -Destination ".env" - Write-Host "Файл .env создан из шаблона. Пожалуйста, отредактируйте его с вашими настройками." -ForegroundColor Green - } else { - Write-Host "ОШИБКА: Файл .env.example не найден. Создайте файл .env вручную." -ForegroundColor Red - exit - } -} - -# Спрашиваем про запуск базы данных -$useContainerDb = Read-Host "Запустить базу данных PostgreSQL в контейнере? (y/n)" - -if ($useContainerDb -ne "y") { - # Запрашиваем параметры подключения к внешней БД - Write-Host "Введите параметры подключения к внешней базе данных:" -ForegroundColor Cyan - $dbHost = Read-Host "Хост (например, localhost)" - $dbPort = Read-Host "Порт (например, 5432)" - $dbName = Read-Host "Имя базы данных" - $dbUser = Read-Host "Имя пользователя" - $dbPassword = Read-Host "Пароль" -AsSecureString - $dbPasswordText = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($dbPassword)) - - # Модифицируем docker-compose.yml - Write-Host "Модифицируем docker-compose.yml для работы с внешней базой данных..." -ForegroundColor Yellow - - # Сохраняем оригинальную версию файла - Copy-Item -Path "docker-compose.yml" -Destination "docker-compose.yml.bak" -Force - - # Создаем модифицированный docker-compose.yml - $dockerComposeContent = createModifiedDockerCompose -dbHost $dbHost -dbPort $dbPort -dbName $dbName -dbUser $dbUser -dbPassword $dbPasswordText - Set-Content -Path "docker-compose.yml" -Value $dockerComposeContent - - Write-Host "docker-compose.yml обновлен для работы с внешней базой данных" -ForegroundColor Green - - # Обновляем .env файл - Write-Host "Обновляем файл .env с параметрами внешней базы данных..." -ForegroundColor Yellow - updateEnvFile -dbHost $dbHost -dbPort $dbPort -dbName $dbName -dbUser $dbUser -dbPassword $dbPasswordText - - # Запускаем только контейнер с ботом - Write-Host "Запускаем Telegram Bot без контейнера базы данных..." -ForegroundColor Cyan - docker-compose up -d bot adminer - - Write-Host "Бот запущен и использует внешнюю базу данных: $dbHost`:$dbPort/$dbName" -ForegroundColor Green - Write-Host "Adminer доступен по адресу: http://localhost:8080/" -ForegroundColor Yellow - Write-Host "Данные для входа в Adminer:" -ForegroundColor Yellow - Write-Host "Система: PostgreSQL" -ForegroundColor Yellow - Write-Host "Сервер: $dbHost" -ForegroundColor Yellow - Write-Host "Пользователь: $dbUser" -ForegroundColor Yellow - Write-Host "Пароль: (введенный вами)" -ForegroundColor Yellow - Write-Host "База данных: $dbName" -ForegroundColor Yellow -} else { - # Восстанавливаем оригинальный docker-compose.yml если есть бэкап - restoreDockerCompose - - Write-Host "Запускаем Telegram Bot с контейнером базы данных..." -ForegroundColor Cyan - - # Проверка, запущены ли контейнеры - $containers = docker ps -q -f name=telegram-tinder-bot -f name=postgres-tinder - - if ($containers) { - $restartContainers = Read-Host "Контейнеры уже запущены. Перезапустить? (y/n)" - if ($restartContainers -eq "y") { - docker-compose down - docker-compose up -d - Write-Host "Контейнеры перезапущены" -ForegroundColor Green - } else { - Write-Host "Продолжаем работу с уже запущенными контейнерами" -ForegroundColor Cyan - } - } else { - docker-compose up -d - Write-Host "Контейнеры запущены" -ForegroundColor Green - } - - # Проверка наличия пароля для БД в .env - $envContent = Get-Content -Path ".env" -Raw - $match = [Regex]::Match($envContent, "DB_PASSWORD=(.*)(\r?\n|$)") - $dbPassword = if ($match.Success) { $match.Groups[1].Value.Trim() } else { "" } - - if ([string]::IsNullOrWhiteSpace($dbPassword)) { - # Генерируем случайный пароль - $randomPassword = generateRandomPassword - - # Обновляем .env файл - $envContent = $envContent -replace "DB_PASSWORD=.*", "DB_PASSWORD=$randomPassword" - Set-Content -Path ".env" -Value $envContent - - Write-Host "Сгенерирован случайный пароль для базы данных и сохранен в .env" -ForegroundColor Yellow - } - - Write-Host "Telegram Bot запущен с локальной базой данных" -ForegroundColor Green - Write-Host "Adminer доступен по адресу: http://localhost:8080/" -ForegroundColor Yellow - Write-Host "Данные для входа в Adminer:" -ForegroundColor Yellow - Write-Host "Система: PostgreSQL" -ForegroundColor Yellow - Write-Host "Сервер: db" -ForegroundColor Yellow - Write-Host "Пользователь: postgres" -ForegroundColor Yellow - Write-Host "Пароль: (из переменной DB_PASSWORD в .env)" -ForegroundColor Yellow - Write-Host "База данных: telegram_tinder_bot" -ForegroundColor Yellow -} - -# Проверка статуса контейнеров -Write-Host "Проверка статуса контейнеров:" -ForegroundColor Cyan -docker-compose ps - -Write-Host "==================================================" -ForegroundColor Cyan -Write-Host "Процесс запуска Telegram Tinder Bot завершен!" -ForegroundColor Green -Write-Host "==================================================" -ForegroundColor Cyan -Write-Host "Для просмотра логов используйте: docker-compose logs -f bot" -ForegroundColor Yellow -Write-Host "Для остановки: docker-compose down" -ForegroundColor Yellow - -Read-Host "Нажмите Enter для выхода" diff --git a/start.sh b/start.sh deleted file mode 100755 index fe07eca..0000000 --- a/start.sh +++ /dev/null @@ -1,225 +0,0 @@ -#!/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}"