218 lines
9.3 KiB
Bash
Executable File
218 lines
9.3 KiB
Bash
Executable File
#!/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
|
||
|
||
# Спрашиваем про запуск базы данных
|
||
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}"
|