chore: commit all pending changes including deploy scripts and Windows config
- deploy.ps1, iis-web.config: Windows Server deployment scripts - api/app/routers/sync.py, dashboard.py: router updates - api/app/services/import_service.py, sync_service.py: service updates - api/app/static/css/style.css, js/*.js: UI updates - api/database-scripts/08_PACK_FACTURARE.pck: Oracle package - .gitignore: add .gittoken - CLAUDE.md, agent configs: documentation updates Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
528
deploy.ps1
Normal file
528
deploy.ps1
Normal file
@@ -0,0 +1,528 @@
|
||||
#Requires -RunAsAdministrator
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Deploy / update GoMag Import Manager pe Windows Server cu IIS.
|
||||
|
||||
.DESCRIPTION
|
||||
- Prima rulare: clone repo, setup venv, genereaza start.bat, configureaza IIS
|
||||
- Rulari ulterioare: git pull, reinstaleaza deps, restarteaza serviciul
|
||||
|
||||
.PARAMETER RepoPath
|
||||
Calea locala unde se cloneaza repo-ul. Default: C:\gomag-vending
|
||||
|
||||
.PARAMETER Port
|
||||
Portul pe care ruleaza FastAPI. Default: 5003
|
||||
|
||||
.PARAMETER IisSiteName
|
||||
Numele site-ului IIS parinte. Default: "Default Web Site"
|
||||
|
||||
.PARAMETER SkipIIS
|
||||
Sarit configurarea IIS (util daca nu ai ARR/URLRewrite instalate inca)
|
||||
|
||||
.EXAMPLE
|
||||
.\deploy.ps1
|
||||
.\deploy.ps1 -RepoPath "D:\apps\gomag-vending" -Port 5003
|
||||
.\deploy.ps1 -SkipIIS
|
||||
#>
|
||||
|
||||
param(
|
||||
[string]$RepoPath = "C:\gomag-vending",
|
||||
[int] $Port = 5003,
|
||||
[string]$IisSiteName = "Default Web Site",
|
||||
[switch]$SkipIIS
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# Helpers
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
function Write-Step { param([string]$msg) Write-Host "`n==> $msg" -ForegroundColor Cyan }
|
||||
function Write-OK { param([string]$msg) Write-Host " [OK] $msg" -ForegroundColor Green }
|
||||
function Write-Warn { param([string]$msg) Write-Host " [WARN] $msg" -ForegroundColor Yellow }
|
||||
function Write-Fail { param([string]$msg) Write-Host " [FAIL] $msg" -ForegroundColor Red }
|
||||
function Write-Info { param([string]$msg) Write-Host " $msg" -ForegroundColor Gray }
|
||||
|
||||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 1. Citire token Gitea
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Citire token Gitea"
|
||||
|
||||
$TokenFile = Join-Path $ScriptDir ".gittoken"
|
||||
$GitToken = ""
|
||||
|
||||
if (Test-Path $TokenFile) {
|
||||
$GitToken = (Get-Content $TokenFile -Raw).Trim()
|
||||
Write-OK "Token citit din $TokenFile"
|
||||
} else {
|
||||
Write-Warn ".gittoken nu exista langa deploy.ps1"
|
||||
Write-Info "Creeaza fisierul $TokenFile cu token-ul tau Gitea (fara newline)"
|
||||
Write-Info "Ex: echo -n 'ghp_xxxx' > .gittoken"
|
||||
Write-Info ""
|
||||
Write-Info "Continui fara token (merge doar daca repo-ul e public sau deja clonat)"
|
||||
}
|
||||
|
||||
$RepoUrl = if ($GitToken) {
|
||||
"https://$GitToken@gitea.romfast.ro/romfast/gomag-vending.git"
|
||||
} else {
|
||||
"https://gitea.romfast.ro/romfast/gomag-vending.git"
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 2. Git clone / pull
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Git clone / pull"
|
||||
|
||||
# Verifica git instalat
|
||||
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
||||
Write-Fail "Git nu este instalat!"
|
||||
Write-Info "Descarca Git for Windows de la: https://git-scm.com/download/win"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (Test-Path (Join-Path $RepoPath ".git")) {
|
||||
Write-Info "Repo exista, fac git pull..."
|
||||
Push-Location $RepoPath
|
||||
try {
|
||||
# Update remote URL cu tokenul curent (in caz ca s-a schimbat)
|
||||
if ($GitToken) {
|
||||
git remote set-url origin $RepoUrl 2>$null
|
||||
}
|
||||
git pull --ff-only
|
||||
Write-OK "git pull OK"
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
} else {
|
||||
Write-Info "Clonez in $RepoPath ..."
|
||||
$ParentDir = Split-Path -Parent $RepoPath
|
||||
if (-not (Test-Path $ParentDir)) {
|
||||
New-Item -ItemType Directory -Path $ParentDir -Force | Out-Null
|
||||
}
|
||||
git clone $RepoUrl $RepoPath
|
||||
Write-OK "git clone OK"
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 3. Verificare Python
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Verificare Python"
|
||||
|
||||
$PythonCmd = $null
|
||||
foreach ($candidate in @("python", "python3", "py")) {
|
||||
try {
|
||||
$ver = & $candidate --version 2>&1
|
||||
if ($ver -match "Python 3\.(\d+)") {
|
||||
$minor = [int]$Matches[1]
|
||||
if ($minor -ge 11) {
|
||||
$PythonCmd = $candidate
|
||||
Write-OK "Python gasit: $ver ($candidate)"
|
||||
break
|
||||
} else {
|
||||
Write-Warn "Python $ver prea vechi (necesar 3.11+)"
|
||||
}
|
||||
}
|
||||
} catch { }
|
||||
}
|
||||
|
||||
if (-not $PythonCmd) {
|
||||
Write-Fail "Python 3.11+ nu este instalat sau nu e in PATH!"
|
||||
Write-Info "Descarca de la: https://www.python.org/downloads/"
|
||||
Write-Info "IMPORTANT: Bifeaza 'Add Python to PATH' la instalare"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 4. Creare venv si instalare dependinte
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Virtual environment + dependinte"
|
||||
|
||||
$VenvDir = Join-Path $RepoPath "venv"
|
||||
$VenvPip = Join-Path $VenvDir "Scripts\pip.exe"
|
||||
$VenvPy = Join-Path $VenvDir "Scripts\python.exe"
|
||||
$ReqFile = Join-Path $RepoPath "api\requirements.txt"
|
||||
$DepsFlag = Join-Path $VenvDir ".deps_installed"
|
||||
|
||||
if (-not (Test-Path $VenvDir)) {
|
||||
Write-Info "Creez venv..."
|
||||
& $PythonCmd -m venv $VenvDir
|
||||
Write-OK "venv creat"
|
||||
}
|
||||
|
||||
# Reinstaleaza daca requirements.txt e mai nou decat flag-ul
|
||||
$needInstall = $true
|
||||
if (Test-Path $DepsFlag) {
|
||||
$reqTime = (Get-Item $ReqFile).LastWriteTime
|
||||
$flagTime = (Get-Item $DepsFlag).LastWriteTime
|
||||
if ($flagTime -ge $reqTime) { $needInstall = $false }
|
||||
}
|
||||
|
||||
if ($needInstall) {
|
||||
Write-Info "Instalez dependinte din requirements.txt..."
|
||||
& $VenvPip install --upgrade pip --quiet
|
||||
& $VenvPip install -r $ReqFile
|
||||
New-Item -ItemType File -Path $DepsFlag -Force | Out-Null
|
||||
Write-OK "Dependinte instalate"
|
||||
} else {
|
||||
Write-OK "Dependinte deja up-to-date"
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 5. Detectare Oracle Home → sugestie INSTANTCLIENTPATH
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Detectare Oracle"
|
||||
|
||||
$OracleHome = $env:ORACLE_HOME
|
||||
$OracleBinPath = ""
|
||||
|
||||
if ($OracleHome -and (Test-Path $OracleHome)) {
|
||||
$OracleBinPath = Join-Path $OracleHome "bin"
|
||||
Write-OK "ORACLE_HOME detectat: $OracleHome"
|
||||
Write-Info "Seteaza in api\.env: INSTANTCLIENTPATH=$OracleBinPath"
|
||||
} else {
|
||||
# Cauta Oracle in locatii comune
|
||||
$commonPaths = @(
|
||||
"C:\oracle\product\19c\dbhome_1\bin",
|
||||
"C:\oracle\product\21c\dbhome_1\bin",
|
||||
"C:\app\oracle\product\19.0.0\dbhome_1\bin",
|
||||
"C:\oracle\instantclient_19_15",
|
||||
"C:\oracle\instantclient_21_3"
|
||||
)
|
||||
foreach ($p in $commonPaths) {
|
||||
if (Test-Path "$p\oci.dll") {
|
||||
$OracleBinPath = $p
|
||||
Write-OK "Oracle gasit la: $p"
|
||||
Write-Info "Seteaza in api\.env: INSTANTCLIENTPATH=$p"
|
||||
break
|
||||
}
|
||||
}
|
||||
if (-not $OracleBinPath) {
|
||||
Write-Warn "Oracle Instant Client nu a fost gasit automat"
|
||||
Write-Info "Optiuni:"
|
||||
Write-Info " 1. Thick mode: seteaza INSTANTCLIENTPATH=<cale_oracle_bin> in api\.env"
|
||||
Write-Info " 2. Thin mode: seteaza FORCE_THIN_MODE=true in api\.env"
|
||||
}
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 6. Creare .env din template daca lipseste
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Fisier configurare api\.env"
|
||||
|
||||
$EnvFile = Join-Path $RepoPath "api\.env"
|
||||
$EnvExample = Join-Path $RepoPath "api\.env.example"
|
||||
|
||||
if (-not (Test-Path $EnvFile)) {
|
||||
if (Test-Path $EnvExample) {
|
||||
Copy-Item $EnvExample $EnvFile
|
||||
Write-OK "api\.env creat din .env.example"
|
||||
|
||||
# Actualizeaza TNS_ADMIN cu calea reala
|
||||
$ApiDir = Join-Path $RepoPath "api"
|
||||
(Get-Content $EnvFile) -replace "TNS_ADMIN=.*", "TNS_ADMIN=$ApiDir" |
|
||||
Set-Content $EnvFile
|
||||
|
||||
# Seteaza INSTANTCLIENTPATH daca am gasit Oracle
|
||||
if ($OracleBinPath) {
|
||||
(Get-Content $EnvFile) -replace "INSTANTCLIENTPATH=.*", "INSTANTCLIENTPATH=$OracleBinPath" |
|
||||
Set-Content $EnvFile
|
||||
}
|
||||
|
||||
Write-Warn "IMPORTANT: Editeaza $EnvFile cu credentialele Oracle si GoMag API!"
|
||||
Write-Info " ORACLE_USER, ORACLE_PASSWORD, ORACLE_DSN"
|
||||
Write-Info " GOMAG_API_KEY, GOMAG_API_SHOP"
|
||||
} else {
|
||||
Write-Warn ".env.example nu exista, sari pasul"
|
||||
}
|
||||
} else {
|
||||
Write-OK "api\.env exista deja"
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 7. Creare directoare necesare
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Directoare date"
|
||||
|
||||
foreach ($dir in @("data", "output", "logs")) {
|
||||
$fullPath = Join-Path $RepoPath $dir
|
||||
if (-not (Test-Path $fullPath)) {
|
||||
New-Item -ItemType Directory -Path $fullPath -Force | Out-Null
|
||||
Write-OK "Creat: $dir\"
|
||||
} else {
|
||||
Write-OK "Exista: $dir\"
|
||||
}
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 8. Generare start.bat
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Generare start.bat"
|
||||
|
||||
$StartBat = Join-Path $RepoPath "start.bat"
|
||||
|
||||
# Citeste TNS_ADMIN si INSTANTCLIENTPATH din .env daca exista
|
||||
$TnsAdmin = Join-Path $RepoPath "api"
|
||||
$InstantClient = ""
|
||||
if (Test-Path $EnvFile) {
|
||||
Get-Content $EnvFile | ForEach-Object {
|
||||
if ($_ -match "^TNS_ADMIN=(.+)") {
|
||||
$TnsAdmin = $Matches[1].Trim()
|
||||
}
|
||||
if ($_ -match "^INSTANTCLIENTPATH=(.+)" -and $_ -notmatch "^#") {
|
||||
$InstantClient = $Matches[1].Trim()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$OraclePathLine = ""
|
||||
if ($InstantClient) {
|
||||
$OraclePathLine = "set PATH=$InstantClient;%PATH%"
|
||||
}
|
||||
|
||||
$StartBatContent = @"
|
||||
@echo off
|
||||
:: GoMag Import Manager - Windows Launcher
|
||||
:: Generat de deploy.ps1 - nu edita manual, ruleaza deploy.ps1 din nou
|
||||
|
||||
cd /d "$RepoPath"
|
||||
set TNS_ADMIN=$TnsAdmin
|
||||
$OraclePathLine
|
||||
|
||||
echo Starting GoMag Import Manager on http://0.0.0.0:$Port (prefix /gomag)
|
||||
"$VenvPy" -m uvicorn app.main:app --host 0.0.0.0 --port $Port --root-path /gomag --app-dir api
|
||||
"@
|
||||
|
||||
Set-Content -Path $StartBat -Value $StartBatContent -Encoding UTF8
|
||||
Write-OK "start.bat generat: $StartBat"
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 9. IIS — Verificare ARR + URL Rewrite
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Verificare module IIS"
|
||||
|
||||
if ($SkipIIS) {
|
||||
Write-Warn "SkipIIS activ — configurare IIS sarita"
|
||||
} else {
|
||||
$ArrPath = "$env:SystemRoot\System32\inetsrv\arr.dll"
|
||||
$UrlRewritePath = "$env:SystemRoot\System32\inetsrv\rewrite.dll"
|
||||
|
||||
$ArrOk = Test-Path $ArrPath
|
||||
$UrlRwOk = Test-Path $UrlRewritePath
|
||||
|
||||
if ($ArrOk) {
|
||||
Write-OK "Application Request Routing (ARR) instalat"
|
||||
} else {
|
||||
Write-Warn "ARR 3.0 NU este instalat"
|
||||
Write-Info "Descarca: https://www.iis.net/downloads/microsoft/application-request-routing"
|
||||
Write-Info "Sau: winget install Microsoft.ARR"
|
||||
}
|
||||
|
||||
if ($UrlRwOk) {
|
||||
Write-OK "URL Rewrite 2.1 instalat"
|
||||
} else {
|
||||
Write-Warn "URL Rewrite 2.1 NU este instalat"
|
||||
Write-Info "Descarca: https://www.iis.net/downloads/microsoft/url-rewrite"
|
||||
Write-Info "Sau: winget install Microsoft.URLRewrite"
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────
|
||||
# 10. Configurare IIS — copiere web.config
|
||||
# ─────────────────────────────────────────────────────────────────────────
|
||||
if ($ArrOk -and $UrlRwOk) {
|
||||
Write-Step "Configurare IIS reverse proxy"
|
||||
|
||||
# Activeaza proxy in ARR (necesar o singura data)
|
||||
try {
|
||||
Import-Module WebAdministration -ErrorAction SilentlyContinue
|
||||
$proxyEnabled = (Get-WebConfigurationProperty `
|
||||
-pspath "MACHINE/WEBROOT/APPHOST" `
|
||||
-filter "system.webServer/proxy" `
|
||||
-name "enabled" `
|
||||
-ErrorAction SilentlyContinue).Value
|
||||
if (-not $proxyEnabled) {
|
||||
Set-WebConfigurationProperty `
|
||||
-pspath "MACHINE/WEBROOT/APPHOST" `
|
||||
-filter "system.webServer/proxy" `
|
||||
-name "enabled" `
|
||||
-value $true
|
||||
Write-OK "ARR proxy activat global"
|
||||
} else {
|
||||
Write-OK "ARR proxy deja activ"
|
||||
}
|
||||
} catch {
|
||||
Write-Warn "Nu am putut activa ARR proxy automat: $($_.Exception.Message)"
|
||||
Write-Info "Activeaza manual din IIS Manager → server root → Application Request Routing Cache → Enable Proxy"
|
||||
}
|
||||
|
||||
# Determina wwwroot site-ului IIS
|
||||
$IisRootPath = $null
|
||||
try {
|
||||
Import-Module WebAdministration -ErrorAction SilentlyContinue
|
||||
$site = Get-Website -Name $IisSiteName -ErrorAction SilentlyContinue
|
||||
if ($site) {
|
||||
$IisRootPath = [System.Environment]::ExpandEnvironmentVariables($site.PhysicalPath)
|
||||
Write-OK "Site IIS '$IisSiteName' gasit: $IisRootPath"
|
||||
} else {
|
||||
Write-Warn "Site IIS '$IisSiteName' nu a fost gasit"
|
||||
}
|
||||
} catch {
|
||||
# Fallback la locatia standard
|
||||
$IisRootPath = "$env:SystemDrive\inetpub\wwwroot"
|
||||
Write-Warn "WebAdministration unavailable, folosesc fallback: $IisRootPath"
|
||||
}
|
||||
|
||||
if ($IisRootPath) {
|
||||
$SourceWebConfig = Join-Path $RepoPath "iis-web.config"
|
||||
$DestWebConfig = Join-Path $IisRootPath "web.config"
|
||||
|
||||
if (Test-Path $SourceWebConfig) {
|
||||
# Inlocuieste portul in web.config cu cel configurat
|
||||
$wcContent = Get-Content $SourceWebConfig -Raw
|
||||
$wcContent = $wcContent -replace "localhost:5003", "localhost:$Port"
|
||||
|
||||
if (Test-Path $DestWebConfig) {
|
||||
# Backup web.config existent
|
||||
$backup = "$DestWebConfig.bak_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
|
||||
Copy-Item $DestWebConfig $backup
|
||||
Write-Info "Backup web.config: $backup"
|
||||
}
|
||||
|
||||
Set-Content -Path $DestWebConfig -Value $wcContent -Encoding UTF8
|
||||
Write-OK "web.config copiat in $IisRootPath"
|
||||
} else {
|
||||
Write-Warn "iis-web.config nu exista in repo, sarit"
|
||||
}
|
||||
|
||||
# Restart IIS
|
||||
try {
|
||||
iisreset /noforce 2>&1 | Out-Null
|
||||
Write-OK "IIS restartat"
|
||||
} catch {
|
||||
Write-Warn "IIS restart esuat: $($_.Exception.Message)"
|
||||
Write-Info "Ruleaza manual: iisreset"
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Write-Warn "IIS nu e configurat complet — instaleaza ARR si URL Rewrite, apoi ruleaza deploy.ps1 din nou"
|
||||
}
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 11. Serviciu Windows (NSSM sau Task Scheduler)
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Step "Serviciu Windows"
|
||||
|
||||
$ServiceName = "GoMagVending"
|
||||
$NssmExe = ""
|
||||
|
||||
# Cauta NSSM
|
||||
foreach ($p in @("nssm", "C:\nssm\win64\nssm.exe", "C:\tools\nssm\nssm.exe")) {
|
||||
if (Get-Command $p -ErrorAction SilentlyContinue) {
|
||||
$NssmExe = $p
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if ($NssmExe) {
|
||||
Write-Info "NSSM gasit: $NssmExe"
|
||||
|
||||
$existingService = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
|
||||
|
||||
if ($existingService) {
|
||||
Write-Info "Serviciu existent, restarteaza..."
|
||||
& $NssmExe restart $ServiceName
|
||||
Write-OK "Serviciu $ServiceName restartat"
|
||||
} else {
|
||||
Write-Info "Instalez serviciu $ServiceName cu NSSM..."
|
||||
& $NssmExe install $ServiceName (Join-Path $RepoPath "start.bat")
|
||||
& $NssmExe set $ServiceName AppDirectory $RepoPath
|
||||
& $NssmExe set $ServiceName DisplayName "GoMag Vending Import Manager"
|
||||
& $NssmExe set $ServiceName Description "Import comenzi web GoMag -> ROA Oracle"
|
||||
& $NssmExe set $ServiceName Start SERVICE_AUTO_START
|
||||
& $NssmExe set $ServiceName AppStdout (Join-Path $RepoPath "logs\service_stdout.log")
|
||||
& $NssmExe set $ServiceName AppStderr (Join-Path $RepoPath "logs\service_stderr.log")
|
||||
& $NssmExe set $ServiceName AppRotateFiles 1
|
||||
& $NssmExe set $ServiceName AppRotateOnline 1
|
||||
& $NssmExe set $ServiceName AppRotateBytes 10485760
|
||||
& $NssmExe start $ServiceName
|
||||
Write-OK "Serviciu $ServiceName instalat si pornit"
|
||||
}
|
||||
|
||||
} else {
|
||||
# Fallback: Task Scheduler
|
||||
Write-Warn "NSSM nu este instalat"
|
||||
Write-Info "Optiuni:"
|
||||
Write-Info " 1. Descarca NSSM: https://nssm.cc/download si pune nssm.exe in PATH"
|
||||
Write-Info " 2. Sau foloseste Task Scheduler (creat mai jos)"
|
||||
|
||||
# Verifica daca task-ul exista deja
|
||||
$taskExists = Get-ScheduledTask -TaskName $ServiceName -ErrorAction SilentlyContinue
|
||||
|
||||
if (-not $taskExists) {
|
||||
Write-Info "Creez Task Scheduler task '$ServiceName'..."
|
||||
try {
|
||||
$action = New-ScheduledTaskAction -Execute (Join-Path $RepoPath "start.bat")
|
||||
$trigger = New-ScheduledTaskTrigger -AtStartup
|
||||
$settings = New-ScheduledTaskSettingsSet `
|
||||
-ExecutionTimeLimit (New-TimeSpan -Days 365) `
|
||||
-RestartCount 3 `
|
||||
-RestartInterval (New-TimeSpan -Minutes 1)
|
||||
$principal = New-ScheduledTaskPrincipal `
|
||||
-UserId "SYSTEM" `
|
||||
-LogonType ServiceAccount `
|
||||
-RunLevel Highest
|
||||
|
||||
Register-ScheduledTask `
|
||||
-TaskName $ServiceName `
|
||||
-Action $action `
|
||||
-Trigger $trigger `
|
||||
-Settings $settings `
|
||||
-Principal $principal `
|
||||
-Description "GoMag Vending Import Manager" `
|
||||
-Force | Out-Null
|
||||
|
||||
Start-ScheduledTask -TaskName $ServiceName
|
||||
Write-OK "Task Scheduler '$ServiceName' creat si pornit"
|
||||
} catch {
|
||||
Write-Warn "Task Scheduler esuat: $($_.Exception.Message)"
|
||||
Write-Info "Porneste manual: .\start.bat"
|
||||
}
|
||||
} else {
|
||||
# Restart task
|
||||
Stop-ScheduledTask -TaskName $ServiceName -ErrorAction SilentlyContinue
|
||||
Start-ScheduledTask -TaskName $ServiceName
|
||||
Write-OK "Task '$ServiceName' restartat"
|
||||
}
|
||||
}
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# Sumar final
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
Write-Host ""
|
||||
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
|
||||
Write-Host " GoMag Vending Deploy — Sumar" -ForegroundColor Cyan
|
||||
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Write-Host " Repo: $RepoPath" -ForegroundColor White
|
||||
Write-Host " FastAPI: http://localhost:$Port/gomag" -ForegroundColor White
|
||||
Write-Host " start.bat generat" -ForegroundColor White
|
||||
Write-Host ""
|
||||
|
||||
if (-not (Test-Path $EnvFile)) {
|
||||
Write-Host " [!] api\.env lipseste — configureaza inainte de start!" -ForegroundColor Red
|
||||
} else {
|
||||
Write-Host " api\.env: OK" -ForegroundColor Green
|
||||
# Verifica daca mai are valori placeholder
|
||||
$envContent = Get-Content $EnvFile -Raw
|
||||
if ($envContent -match "your_api_key_here|USER_ORACLE|parola_oracle|TNS_ALIAS") {
|
||||
Write-Host " [!] api\.env contine valori placeholder — editeaza!" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host " Acces app: http://SERVER/gomag" -ForegroundColor Cyan
|
||||
Write-Host " Test local: http://localhost:$Port/gomag/health" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Reference in New Issue
Block a user