Erste Fassung, live unter https://pulse.perinco.de. Frontend React 19 + TypeScript + Tailwind 4 (Vite), Backend Express mit mysql2 auf MariaDB, Exporte als PDF (pdfkit), Excel (exceljs) und CSV. Aufbau, Designsystem und die sieben Themes kommen aus dem perinco CRM. Fachlich: - Buchung mit Wochen-, Monats- und Jahresansicht, Zeiten als 1:23 oder 1,5 - Projekte mit n Budgettoepfen: Laufzeit, Volumen, Sperre bei Ablauf oder aufgebrauchtem Budget, Buchung nur auf den passenden Topf - Kunden, Team mit Hierarchie, Reports im Harvest-Stil, Monatsexporte - Rollen user/lead/management/admin, doppelt geprueft (Menue und Backend) - SSO gegen Microsoft Entra ID, Uebernahme der AD-Benutzer per Drag & Drop Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
58 lines
2.5 KiB
PowerShell
58 lines
2.5 KiB
PowerShell
# perinco Pulse - Deployment auf 31.70.144.60
|
|
#
|
|
# Baut lokal und laedt dist/ plus Backend-Quellen hoch.
|
|
#
|
|
# Aufruf aus dem Projektverzeichnis:
|
|
# $env:PULSE_SSH_PASSWORD = '...'
|
|
# powershell -File deploy/deploy.ps1
|
|
# powershell -File deploy/deploy.ps1 -SkipBuild
|
|
# powershell -File deploy/deploy.ps1 -Deps # bei neuen Backend-Paketen
|
|
|
|
param(
|
|
[string]$ServerHost = '31.70.144.60',
|
|
[int]$Port = 22,
|
|
[string]$User = 'root',
|
|
[string]$Password = $env:PULSE_SSH_PASSWORD,
|
|
[string]$RemotePath = '/var/www/pulse',
|
|
[switch]$SkipBuild,
|
|
[switch]$Deps
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
if (-not $Password) { throw 'Kein Passwort. Setze $env:PULSE_SSH_PASSWORD oder uebergib -Password.' }
|
|
|
|
$plink = 'C:\Program Files\PuTTY\plink.exe'
|
|
$pscp = 'C:\Program Files\PuTTY\pscp.exe'
|
|
foreach ($tool in @($plink, $pscp)) { if (-not (Test-Path $tool)) { throw "Nicht gefunden: $tool" } }
|
|
|
|
$projectRoot = Split-Path -Parent $PSScriptRoot
|
|
Set-Location $projectRoot
|
|
|
|
if (-not $SkipBuild) {
|
|
Write-Host '==> Frontend bauen' -ForegroundColor Green
|
|
npm run build
|
|
if ($LASTEXITCODE -ne 0) { throw 'Build fehlgeschlagen - es wird nichts hochgeladen.' }
|
|
}
|
|
|
|
$target = "$User@$ServerHost"
|
|
|
|
Write-Host '==> dist/ hochladen' -ForegroundColor Green
|
|
& $plink -ssh -batch -P $Port -pw $Password $target "rm -rf $RemotePath/dist.new && mkdir -p $RemotePath/dist.new"
|
|
& $pscp -r -batch -P $Port -pw $Password 'dist\*' "${target}:$RemotePath/dist.new/"
|
|
|
|
Write-Host '==> Backend hochladen' -ForegroundColor Green
|
|
& $pscp -r -batch -P $Port -pw $Password 'server\src' "${target}:$RemotePath/server/"
|
|
& $pscp -r -batch -P $Port -pw $Password 'server\assets' "${target}:$RemotePath/server/"
|
|
& $pscp -batch -P $Port -pw $Password 'server\package.json' 'server\package-lock.json' "${target}:$RemotePath/server/"
|
|
|
|
# dist atomar tauschen, damit niemand eine halb hochgeladene Version sieht.
|
|
$remote = "cd $RemotePath && rm -rf dist.old && (mv dist dist.old 2>/dev/null; true) && mv dist.new dist && rm -rf dist.old"
|
|
if ($Deps) { $remote = "$remote && cd $RemotePath/server && npm ci --omit=dev --no-audit --no-fund" }
|
|
$remote = "$remote && chown -R pulse:pulse $RemotePath/server && systemctl restart perinco-pulse-backend && sleep 3 && systemctl is-active perinco-pulse-backend && curl -s http://127.0.0.1:5010/api/health"
|
|
|
|
Write-Host '==> Tauschen, neu starten, pruefen' -ForegroundColor Green
|
|
& $plink -ssh -batch -P $Port -pw $Password $target $remote
|
|
|
|
Write-Host ''
|
|
Write-Host 'Fertig: https://pulse.perinco.de' -ForegroundColor Green
|