Files
playbull/deploy/push-homelab.ps1
Mike 94b6cc3be9 Initial PlayBull release with Trilogy Hub integration.
Includes homelab deploy tooling, image position/zoom manifest persistence, and full trading/casino stack.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 08:31:36 +02:00

140 lines
5.4 KiB
PowerShell

#Requires -Version 5.1
<#
.SYNOPSIS
Kopiert PlayBull nach ~/bestewebsite/bestewebsite und startet install-homelab.sh.
Nutzt deploy/homelab.credentials (Posh-SSH) wenn vorhanden.
#>
param(
[string]$SshTarget = "",
[string]$RemoteDir = "",
[switch]$SkipInstall,
[switch]$UserOnly
)
$ErrorActionPreference = "Stop"
$Root = Split-Path $PSScriptRoot -Parent
$CredFile = Join-Path $PSScriptRoot "homelab.credentials"
$UseCredentials = Test-Path $CredFile
function Assert-LastExit {
param([string]$Step)
if ($LASTEXITCODE -ne 0) {
throw "${Step} fehlgeschlagen (Exit ${LASTEXITCODE})."
}
}
$EnvFile = Join-Path $PSScriptRoot "env.homelab"
if (-not (Test-Path $EnvFile)) {
Write-Error "deploy/env.homelab fehlt."
}
$envContent = Get-Content $EnvFile -Raw
if ($RemoteDir -eq "" -and $envContent -match '(?m)^APP_DIR=(.+)$') {
$RemoteDir = $Matches[1].Trim()
}
if ([string]::IsNullOrWhiteSpace($RemoteDir)) {
$RemoteDir = "/home/gizzler/bestewebsite/bestewebsite"
}
if ($UseCredentials) {
. "$PSScriptRoot/homelab-lib.ps1"
$config = Get-HomelabConfig
if ($SshTarget -eq "") { $SshTarget = $config.SshTarget }
Write-Host "==> Sync nach $($config.SshTarget):${RemoteDir} (homelab.credentials)" -ForegroundColor Cyan
Invoke-HomelabRemote -Config $config -Command "mkdir -p '$RemoteDir'" -WorkDir "" | Out-Null
$archiveWin = Join-Path $env:TEMP "playbull-deploy.tgz"
if (Test-Path $archiveWin) { Remove-Item $archiveWin -Force }
$tarExe = Join-Path $env:SystemRoot "System32\tar.exe"
$tarItems = @("server", "public", "package.json", "package-lock.json", "deploy", ".env.example")
Push-Location $Root
try {
& $tarExe -czf $archiveWin @tarItems
if ($LASTEXITCODE -ne 0) { throw "tar-Archiv fehlgeschlagen." }
}
finally { Pop-Location }
$sizeMb = [math]::Round((Get-Item $archiveWin).Length / 1MB, 1)
Write-Host " -> Archiv ${sizeMb} MB" -ForegroundColor DarkGray
Send-HomelabPath -Config $config -LocalPath $archiveWin -RemoteDir $RemoteDir
$extractCmd = @'
cp deploy/env.homelab deploy/env.homelab.bak 2>/dev/null || true
tar xzf playbull-deploy.tgz && rm -f playbull-deploy.tgz
if [ -f deploy/env.homelab.bak ]; then
for key in DUCKDNS_TOKEN CLOUDFLARE_TUNNEL_TOKEN CLOUDFLARE_API_TOKEN CLOUDFLARE_ZONE_ID JWT_SECRET FINNHUB_API_KEY APP_DOMAIN; do
old=$(grep -m1 "^${key}=" deploy/env.homelab.bak 2>/dev/null | cut -d= -f2- | tr -d '\r')
if [ -n "$old" ]; then
if grep -q "^${key}=" deploy/env.homelab 2>/dev/null; then
sed -i "s|^${key}=.*|${key}=${old}|" deploy/env.homelab
else
echo "${key}=${old}" >> deploy/env.homelab
fi
fi
done
rm -f deploy/env.homelab.bak
fi
sed -i 's/\r$//' deploy/env.homelab deploy/*.sh deploy/nginx/*.conf 2>/dev/null || true
'@
$extract = Invoke-HomelabRemote -Config $config -Command $extractCmd -WorkDir $RemoteDir -TimeoutSeconds 300
$extract.Output | ForEach-Object { Write-Output $_ }
if ($extract.ExitStatus -ne 0) { exit $extract.ExitStatus }
Remove-Item $archiveWin -Force -ErrorAction SilentlyContinue
if ($UserOnly) {
Write-Host "==> User-Sync"
$r = Invoke-HomelabRemote -Config $config -Command "bash deploy/sync-user.sh" -WorkDir $RemoteDir -TimeoutSeconds 300
$r.Output | ForEach-Object { Write-Output $_ }
if ($r.ExitStatus -ne 0) { exit $r.ExitStatus }
Write-Host "Fertig (User-Modus)." -ForegroundColor Green
exit 0
}
if ($SkipInstall) {
Write-Host "Sync fertig. Installer: .\deploy\homelab-exec.ps1 -Sudo 'bash deploy/install-homelab.sh'" -ForegroundColor Cyan
exit 0
}
Write-Host "==> Installer auf Homelab"
$install = Invoke-HomelabRemote -Config $config -Sudo -Command "chmod +x deploy/*.sh && bash deploy/install-homelab.sh" -WorkDir $RemoteDir -TimeoutSeconds 900
$install.Output | ForEach-Object { Write-Output $_ }
if ($install.Error) { $install.Error | ForEach-Object { [Console]::Error.WriteLine($_) } }
if ($install.ExitStatus -ne 0) { exit $install.ExitStatus }
Write-Host ""
Write-Host "==> Verifikation" -ForegroundColor Cyan
$verify = Invoke-HomelabRemote -Config $config -Command "systemctl is-active playbull cloudflared 2>/dev/null; curl -sf http://127.0.0.1:3080/api/market | head -c 80; echo; test -f public/image-editor.js && echo image-editor.js OK" -WorkDir $RemoteDir
$verify.Output | ForEach-Object { Write-Output $_ }
if ($verify.ExitStatus -ne 0) { exit $verify.ExitStatus }
Write-Host ""
Write-Host "Fertig. https://trilogyhub.de" -ForegroundColor Green
exit 0
}
# Fallback: interaktives ssh/scp
if ($SshTarget -eq "" -and $envContent -match '(?m)^HOMELAB_SSH=(.+)$') {
$SshTarget = $Matches[1].Trim()
}
if ([string]::IsNullOrWhiteSpace($SshTarget) -or $SshTarget -eq "root@dein-server") {
Write-Error "HOMELAB_SSH setzen oder deploy/homelab.credentials anlegen."
}
Write-Host "SSH mit Passwort (interaktiv)..." -ForegroundColor Yellow
ssh $SshTarget "mkdir -p '$RemoteDir'"
Assert-LastExit "ssh mkdir"
$items = @("server", "public", "package.json", "package-lock.json", "deploy", ".env.example")
foreach ($item in $items) {
$local = Join-Path $Root $item
if (Test-Path $local) {
scp -r $local "${SshTarget}:${RemoteDir}/"
Assert-LastExit "scp $item"
}
}
if ($SkipInstall) { exit 0 }
ssh -t $SshTarget "cd '$RemoteDir' && chmod +x deploy/*.sh && sudo bash deploy/install-homelab.sh"
Assert-LastExit "install-homelab.sh"