Files
btgo-playwright/deployment/windows/scripts/deploy.ps1
2025-11-06 20:55:35 +02:00

283 lines
10 KiB
PowerShell

#Requires -RunAsAdministrator
<#
.SYNOPSIS
BTGO Telegram Bot - Complete Deployment Script
.DESCRIPTION
Deployment complet pentru bot-ul Telegram pe Windows VM
Verifica dependente, instaleaza requirements, configureaza serviciul
.NOTES
Rulare: Right-click → "Run with PowerShell" (ca Administrator)
#>
# Error handling
$ErrorActionPreference = "Stop"
# ============================================================================
# FUNCTIONS
# ============================================================================
function Write-ColorOutput {
param(
[string]$Message,
[string]$Color = "White",
[string]$Prefix = ""
)
$prefixColor = switch ($Prefix) {
"[OK]" { "Green" }
"[INFO]" { "Cyan" }
"[EROARE]" { "Red" }
"[AVERTIZARE]" { "Yellow" }
default { "White" }
}
if ($Prefix) {
Write-Host $Prefix -ForegroundColor $prefixColor -NoNewline
Write-Host " $Message" -ForegroundColor $Color
} else {
Write-Host $Message -ForegroundColor $Color
}
}
function Write-Separator {
param([string]$Title = "")
Write-Host ""
Write-Host "=" * 80 -ForegroundColor Cyan
if ($Title) {
Write-Host $Title -ForegroundColor Yellow
Write-Host "=" * 80 -ForegroundColor Cyan
}
}
# ============================================================================
# CONFIGURATION
# ============================================================================
$ScriptDir = Split-Path -Parent $PSCommandPath
$ProjectDir = Resolve-Path (Join-Path $ScriptDir "..\..\..") | Select-Object -ExpandProperty Path
$ServiceName = "BTGOTelegramBot"
Write-Separator "BTGO TELEGRAM BOT - DEPLOYMENT COMPLET"
Write-Host ""
Write-ColorOutput "Director proiect: $ProjectDir" -Prefix "[INFO]"
Write-Host ""
# ============================================================================
# [1/6] VERIFICARE PYTHON
# ============================================================================
Write-Separator "[1/6] VERIFICARE PYTHON"
try {
$pythonVersion = python --version 2>&1
if ($LASTEXITCODE -ne 0) { throw }
Write-ColorOutput "Python gasit: $pythonVersion" -Prefix "[OK]"
} catch {
Write-ColorOutput "Python nu este instalat sau nu este in PATH!" -Prefix "[EROARE]"
Write-Host ""
Write-Host "Instaleaza Python 3.11+ de la: https://www.python.org/downloads/"
Write-Host "Asigura-te ca bifezi 'Add Python to PATH' la instalare"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
# ============================================================================
# [2/6] VERIFICARE FISIERE PROIECT
# ============================================================================
Write-Separator "[2/6] VERIFICARE FISIERE PROIECT"
$criticalFiles = @(
"telegram_trigger_bot.py",
"btgo_scraper.py",
"requirements.txt"
)
$filesOk = $true
foreach ($file in $criticalFiles) {
$filePath = Join-Path $ProjectDir $file
if (Test-Path $filePath) {
Write-ColorOutput "$file - OK" -Prefix "[OK]"
} else {
Write-ColorOutput "$file - LIPSESTE!" -Prefix "[EROARE]"
$filesOk = $false
}
}
if (-not $filesOk) {
Write-ColorOutput "Fisiere critice lipsesc din proiect!" -Prefix "[EROARE]"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
# ============================================================================
# [3/6] VERIFICARE/CREARE .env
# ============================================================================
Write-Separator "[3/6] VERIFICARE CONFIGURARE (.env)"
$envFile = Join-Path $ProjectDir ".env"
$envExample = Join-Path $ProjectDir ".env.example"
if (-not (Test-Path $envFile)) {
if (Test-Path $envExample) {
Write-ColorOutput ".env nu exista. Copiem .env.example..." -Prefix "[INFO]"
Copy-Item $envExample $envFile
Write-ColorOutput ".env creat din .env.example" -Prefix "[OK]"
Write-Host ""
Write-ColorOutput "IMPORTANT: Editeaza .env si configureaza:" -Prefix "[AVERTIZARE]"
Write-Host " - TELEGRAM_BOT_TOKEN"
Write-Host " - TELEGRAM_ALLOWED_USER_IDS"
Write-Host " - TELEGRAM_CHAT_ID (optional)"
Write-Host " - LOGIN_ID si PAROLA pentru BTGO"
Write-Host ""
Read-Host "Apasa Enter dupa ce ai configurat .env"
} else {
Write-ColorOutput ".env si .env.example lipsesc!" -Prefix "[EROARE]"
Write-Host "Creaza manual .env cu variabilele necesare"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
}
# Verifică variabile critice
$envContent = Get-Content $envFile -Raw
if ($envContent -notmatch "TELEGRAM_BOT_TOKEN=(?!your_).+") {
Write-ColorOutput "TELEGRAM_BOT_TOKEN nu este configurat in .env!" -Prefix "[EROARE]"
Write-Host "Editeaza .env si adauga token-ul de la @BotFather"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
if ($envContent -notmatch "LOGIN_ID=(?!your_).+") {
Write-ColorOutput "LOGIN_ID nu este configurat in .env!" -Prefix "[AVERTIZARE]"
Write-Host "Scraper-ul nu va functiona fara credentiale BTGO"
}
Write-ColorOutput ".env exista si pare configurat" -Prefix "[OK]"
# ============================================================================
# [4/6] INSTALARE DEPENDENTE PYTHON
# ============================================================================
Write-Separator "[4/6] INSTALARE DEPENDENTE PYTHON"
try {
Write-ColorOutput "Upgrade pip..." -Prefix "[INFO]"
python -m pip install --upgrade pip --quiet
Write-ColorOutput "Instalare requirements.txt..." -Prefix "[INFO]"
$requirementsFile = Join-Path $ProjectDir "requirements.txt"
python -m pip install -r $requirementsFile
if ($LASTEXITCODE -ne 0) { throw }
Write-ColorOutput "Dependente instalate cu succes" -Prefix "[OK]"
} catch {
Write-ColorOutput "Instalarea dependentelor a esuat!" -Prefix "[EROARE]"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
# ============================================================================
# [5/6] INSTALARE PLAYWRIGHT BROWSERS (GLOBAL)
# ============================================================================
Write-Separator "[5/6] INSTALARE PLAYWRIGHT BROWSERS (GLOBAL)"
# Setează locație globală pentru browsere (accesibilă pentru serviciul SYSTEM)
$globalBrowserPath = "C:\playwright-browsers"
Write-ColorOutput "Configurare locatie globala browsere: $globalBrowserPath" -Prefix "[INFO]"
# Creează directorul dacă nu există
if (-not (Test-Path $globalBrowserPath)) {
New-Item -ItemType Directory -Path $globalBrowserPath -Force | Out-Null
Write-ColorOutput "Director creat: $globalBrowserPath" -Prefix "[OK]"
}
# Acordă permisiuni SYSTEM la director
Write-ColorOutput "Acordare permisiuni SYSTEM..." -Prefix "[INFO]"
icacls $globalBrowserPath /grant "SYSTEM:(OI)(CI)F" /T 2>&1 | Out-Null
# Setează environment variable la nivel de sistem
[System.Environment]::SetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH", $globalBrowserPath, [System.EnvironmentVariableTarget]::Machine)
$env:PLAYWRIGHT_BROWSERS_PATH = $globalBrowserPath
Write-ColorOutput "Environment variable setata: PLAYWRIGHT_BROWSERS_PATH" -Prefix "[OK]"
# Instalează browserele
try {
Write-ColorOutput "Instalare browsere Playwright in $globalBrowserPath..." -Prefix "[INFO]"
Write-Host "Aceasta poate dura 1-2 minute..." -ForegroundColor Gray
python -m playwright install chromium
if ($LASTEXITCODE -ne 0) { throw }
Write-ColorOutput "Playwright browsere instalate cu succes!" -Prefix "[OK]"
} catch {
Write-ColorOutput "Instalarea browserelor Playwright a esuat!" -Prefix "[AVERTIZARE]"
Write-Host "Scraper-ul poate sa nu functioneze corect"
}
# ============================================================================
# CREARE DIRECTOARE NECESARE
# ============================================================================
$dataDir = Join-Path $ProjectDir "data"
$logsDir = Join-Path $ProjectDir "logs"
if (-not (Test-Path $dataDir)) { New-Item -ItemType Directory -Path $dataDir -Force | Out-Null }
if (-not (Test-Path $logsDir)) { New-Item -ItemType Directory -Path $logsDir -Force | Out-Null }
Write-ColorOutput "Directoare create: data, logs" -Prefix "[OK]"
# ============================================================================
# [6/6] INSTALARE/RESTART SERVICIU
# ============================================================================
Write-Separator "[6/6] INSTALARE SERVICIU WINDOWS"
# Verifică dacă serviciul există
$service = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($service) {
Write-ColorOutput "Serviciul exista deja. Reinstalam..." -Prefix "[INFO]"
& "$ScriptDir\uninstall_service.ps1"
Start-Sleep -Seconds 3
}
Write-ColorOutput "Rulare install_service.ps1..." -Prefix "[INFO]"
& "$ScriptDir\install_service.ps1"
if ($LASTEXITCODE -ne 0) {
Write-ColorOutput "Instalarea serviciului a esuat!" -Prefix "[EROARE]"
Read-Host "`nApasa Enter pentru a inchide"
exit 1
}
# ============================================================================
# FINALIZARE
# ============================================================================
Write-Separator "[SUCCES] DEPLOYMENT FINALIZAT!"
Write-Host ""
Write-Host "Serviciul BTGO Telegram Bot este acum instalat si ruleaza." -ForegroundColor Green
Write-Host ""
Write-Host "Comenzi utile:" -ForegroundColor Yellow
Write-Host " - Status: Get-Service $ServiceName"
Write-Host " - Logs: Get-Content '$logsDir\telegram_bot_stdout.log' -Tail 20"
Write-Host " - Opreste: Stop-Service $ServiceName"
Write-Host " - Porneste: Start-Service $ServiceName"
Write-Host " - Restart: Restart-Service $ServiceName"
Write-Host " - Dezinstala: .\uninstall_service.ps1"
Write-Host ""
Write-Host "Teste bot Telegram:" -ForegroundColor Yellow
Write-Host " 1. Deschide Telegram si cauta bot-ul tau"
Write-Host " 2. Trimite /start pentru a vedea comenzile"
Write-Host " 3. Trimite /scrape pentru a testa scraper-ul"
Write-Host ""
Write-Host "Verificare logs in timp real:" -ForegroundColor Yellow
Write-Host " Get-Content '$logsDir\telegram_bot_stdout.log' -Wait"
Write-Host ""
Write-Separator
Read-Host "`nApasa Enter pentru a inchide"