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 для выхода"