242 lines
9.8 KiB
Batchfile
242 lines
9.8 KiB
Batchfile
@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=<tmp_containers.txt
|
||
del tmp_containers.txt
|
||
|
||
if not "%containers%" == "" (
|
||
set /p restart_containers="Контейнеры уже запущены. Перезапустить? (y/n): "
|
||
if /I "%restart_containers%" == "y" (
|
||
docker-compose down
|
||
docker-compose up -d
|
||
echo [32mКонтейнеры перезапущены[0m
|
||
) else (
|
||
echo [36mПродолжаем работу с уже запущенными контейнерами[0m
|
||
)
|
||
) else (
|
||
docker-compose up -d
|
||
echo [32mКонтейнеры запущены[0m
|
||
)
|
||
|
||
:: Проверка наличия пароля для БД в .env
|
||
findstr /C:"DB_PASSWORD=" .env > tmp_db_password.txt
|
||
set /p db_password_line=<tmp_db_password.txt
|
||
del tmp_db_password.txt
|
||
|
||
:: Проверяем, есть ли значение после DB_PASSWORD=
|
||
for /f "tokens=2 delims==" %%i in ("%db_password_line%") do (
|
||
set db_password=%%i
|
||
)
|
||
|
||
if "%db_password%" == "" (
|
||
:: Генерируем случайный пароль
|
||
set chars=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
|
||
set random_password=
|
||
for /L %%i in (1,1,16) do (
|
||
set /a random_index=!random! %% 62
|
||
for %%j in (!random_index!) do set random_password=!random_password!!chars:~%%j,1!
|
||
)
|
||
|
||
:: Обновляем .env файл с новым паролем
|
||
:: Создаем временный файл
|
||
type NUL > .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
|