230 lines
9.9 KiB
PowerShell
230 lines
9.9 KiB
PowerShell
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 для выхода"
|