"feat: Implement backend server initialization with temp init script"

This commit is contained in:
Till Tomczak 2025-05-23 09:56:24 +02:00
parent ffc32959e0
commit ed2765d207
2 changed files with 61 additions and 58 deletions

View File

@ -1,5 +1,5 @@
# MYP Backend - Windows PowerShell Server Start # MYP Backend - Windows PowerShell Server Start
# Startet den Backend-Server vollständig unabhängig vom Frontend # Startet den Backend-Server vollstaendig unabhaengig vom Frontend
param( param(
[switch]$Production, [switch]$Production,
@ -8,7 +8,7 @@ param(
[switch]$Help [switch]$Help
) )
# Farben für PowerShell # Farben fuer PowerShell
$Red = "Red" $Red = "Red"
$Green = "Green" $Green = "Green"
$Yellow = "Yellow" $Yellow = "Yellow"
@ -37,51 +37,49 @@ function Write-Error {
# Banner # Banner
Write-Host "========================================" -ForegroundColor $Blue Write-Host "========================================" -ForegroundColor $Blue
Write-Host "🏭 MYP Backend - Standalone Server Start" -ForegroundColor $Blue Write-Host "MYP Backend - Standalone Server Start" -ForegroundColor $Blue
Write-Host "========================================" -ForegroundColor $Blue Write-Host "========================================" -ForegroundColor $Blue
if ($Help) { if ($Help) {
Write-Host @" Write-Host "Verwendung: .\start-backend-server.ps1 [OPTIONEN]"
Verwendung: .\start-backend-server.ps1 [OPTIONEN] Write-Host ""
Write-Host "OPTIONEN:"
OPTIONEN: Write-Host " -Production Produktionsmodus (Gunicorn)"
-Production Produktionsmodus (Gunicorn) Write-Host " -Development Entwicklungsmodus (Flask Dev Server)"
-Development Entwicklungsmodus (Flask Dev Server) Write-Host " -Logs Zeige Live-Logs"
-Logs Zeige Live-Logs Write-Host " -Help Zeige diese Hilfe"
-Help Zeige diese Hilfe Write-Host ""
Write-Host "BEISPIELE:"
BEISPIELE: Write-Host " .\start-backend-server.ps1 -Development"
.\start-backend-server.ps1 -Development Write-Host " .\start-backend-server.ps1 -Production"
.\start-backend-server.ps1 -Production Write-Host " .\start-backend-server.ps1 -Development -Logs"
.\start-backend-server.ps1 -Development -Logs
"@
exit 0 exit 0
} }
# Bestimme Ausführungsmodus # Bestimme Ausfuehrungsmodus
$RunMode = "development" $RunMode = "development"
if ($Production) { if ($Production) {
$RunMode = "production" $RunMode = "production"
Write-Log "🏭 Produktionsmodus aktiviert" -Color $Blue Write-Log "Produktionsmodus aktiviert" -Color $Blue
} elseif ($Development) { } elseif ($Development) {
$RunMode = "development" $RunMode = "development"
Write-Log "🔧 Entwicklungsmodus aktiviert" -Color $Blue Write-Log "Entwicklungsmodus aktiviert" -Color $Blue
} else { } else {
$RunMode = "development" $RunMode = "development"
Write-Log "🔧 Standard-Entwicklungsmodus aktiviert" -Color $Blue Write-Log "Standard-Entwicklungsmodus aktiviert" -Color $Blue
} }
# Arbeitsverzeichnis prüfen # Arbeitsverzeichnis pruefen
$CurrentDir = Get-Location $CurrentDir = Get-Location
Write-Log "Arbeitsverzeichnis: $CurrentDir" Write-Log "Arbeitsverzeichnis: $CurrentDir"
if (-not (Test-Path "app.py")) { if (-not (Test-Path "app.py")) {
Write-Error "app.py nicht gefunden! Bitte im Backend-Verzeichnis ausführen." Write-Error "app.py nicht gefunden! Bitte im Backend-Verzeichnis ausfuehren."
exit 1 exit 1
} }
# Python-Installation prüfen # Python-Installation pruefen
Write-Log "🐍 Prüfe Python-Installation..." -Color $Blue Write-Log "Pruefe Python-Installation..." -Color $Blue
try { try {
$PythonVersion = python --version 2>&1 $PythonVersion = python --version 2>&1
@ -101,14 +99,14 @@ function Set-EnvironmentFromFile {
return return
} }
Write-Log "⚙️ Lade Backend-Umgebungsvariablen aus $FilePath..." -Color $Blue Write-Log "Lade Backend-Umgebungsvariablen aus $FilePath..." -Color $Blue
try { try {
$EnvContent = Get-Content $FilePath -Raw $EnvContent = Get-Content $FilePath -Raw
$Lines = $EnvContent -split "`r?`n" $Lines = $EnvContent -split "`r?`n"
foreach ($Line in $Lines) { foreach ($Line in $Lines) {
# Überspringe leere Zeilen und Kommentare # Ueberspringe leere Zeilen und Kommentare
if ([string]::IsNullOrWhiteSpace($Line) -or $Line.TrimStart().StartsWith('#')) { if ([string]::IsNullOrWhiteSpace($Line) -or $Line.TrimStart().StartsWith('#')) {
continue continue
} }
@ -123,7 +121,7 @@ function Set-EnvironmentFromFile {
$Key = $Line.Substring(0, $EqualIndex).Trim() $Key = $Line.Substring(0, $EqualIndex).Trim()
$Value = $Line.Substring($EqualIndex + 1).Trim() $Value = $Line.Substring($EqualIndex + 1).Trim()
# Entferne umgebende Anführungszeichen, falls vorhanden # Entferne umgebende Anfuehrungszeichen, falls vorhanden
if (($Value.StartsWith('"') -and $Value.EndsWith('"')) -or if (($Value.StartsWith('"') -and $Value.EndsWith('"')) -or
($Value.StartsWith("'") -and $Value.EndsWith("'"))) { ($Value.StartsWith("'") -and $Value.EndsWith("'"))) {
$Value = $Value.Substring(1, $Value.Length - 2) $Value = $Value.Substring(1, $Value.Length - 2)
@ -136,7 +134,7 @@ function Set-EnvironmentFromFile {
} }
} }
# Überschreibe FLASK_ENV mit dem gewählten Modus # Ueberschreibe FLASK_ENV mit dem gewaehlten Modus
[Environment]::SetEnvironmentVariable("FLASK_ENV", $RunMode, "Process") [Environment]::SetEnvironmentVariable("FLASK_ENV", $RunMode, "Process")
Write-Success "Umgebungsvariablen erfolgreich geladen" Write-Success "Umgebungsvariablen erfolgreich geladen"
@ -150,7 +148,7 @@ function Set-EnvironmentFromFile {
Set-EnvironmentFromFile "env.backend" Set-EnvironmentFromFile "env.backend"
# Notwendige Verzeichnisse erstellen # Notwendige Verzeichnisse erstellen
Write-Log "📁 Prüfe Verzeichnisse..." -Color $Blue Write-Log "Pruefe Verzeichnisse..." -Color $Blue
$Directories = @("instance", "logs", "uploads") $Directories = @("instance", "logs", "uploads")
foreach ($Dir in $Directories) { foreach ($Dir in $Directories) {
@ -160,8 +158,8 @@ foreach ($Dir in $Directories) {
} }
} }
# Dependencies prüfen # Dependencies pruefen
Write-Log "📦 Prüfe Python-Dependencies..." -Color $Blue Write-Log "Pruefe Python-Dependencies..." -Color $Blue
if (Test-Path "requirements.txt") { if (Test-Path "requirements.txt") {
try { try {
@ -175,20 +173,18 @@ if (Test-Path "requirements.txt") {
} }
# Datenbank initialisieren # Datenbank initialisieren
Write-Log "🗄️ Initialisiere Datenbank..." -Color $Blue Write-Log "Initialisiere Datenbank..." -Color $Blue
try { try {
$env:FLASK_APP = "app.py" $env:FLASK_APP = "app.py"
# Erstelle temporäre Python-Datei für Datenbank-Initialisierung # Erstelle temporaere Python-Datei fuer Datenbank-Initialisierung
$TempInitFile = "temp_init.py" $TempInitFile = "temp_init.py"
$InitCode = @" $InitCode = "from app import create_app, init_db`n"
from app import create_app, init_db $InitCode += "app = create_app('$RunMode')`n"
app = create_app('$RunMode') $InitCode += "with app.app_context():`n"
with app.app_context(): $InitCode += " init_db()`n"
init_db() $InitCode += " print('Datenbank initialisiert')"
print('✅ Datenbank initialisiert')
"@
$InitCode | Out-File -FilePath $TempInitFile -Encoding UTF8 $InitCode | Out-File -FilePath $TempInitFile -Encoding UTF8
python $TempInitFile python $TempInitFile
@ -203,7 +199,7 @@ with app.app_context():
exit 1 exit 1
} }
# Port prüfen # Port pruefen
$Port = 5000 $Port = 5000
if ($env:PORT) { if ($env:PORT) {
$Port = [int]$env:PORT $Port = [int]$env:PORT
@ -218,12 +214,12 @@ if ($PortInUse) {
# Server starten basierend auf Modus # Server starten basierend auf Modus
if ($RunMode -eq "production") { if ($RunMode -eq "production") {
Write-Log "🏭 Starte Backend-Server im Produktionsmodus..." -Color $Blue Write-Log "Starte Backend-Server im Produktionsmodus..." -Color $Blue
# Prüfe Gunicorn # Pruefe Gunicorn
try { try {
gunicorn --version | Out-Null gunicorn --version | Out-Null
Write-Log "Verwende Gunicorn für Produktionsbetrieb" Write-Log "Verwende Gunicorn fuer Produktionsbetrieb"
} catch { } catch {
Write-Error "Gunicorn ist nicht installiert! Installiere mit: pip install gunicorn" Write-Error "Gunicorn ist nicht installiert! Installiere mit: pip install gunicorn"
exit 1 exit 1
@ -262,11 +258,12 @@ if ($RunMode -eq "production") {
break break
} }
} catch { } catch {
# Ignoriere Fehler während der Startphase # Ignoriere Fehler waehrend der Startphase
} }
if ($Counter % 10 -eq 0) { if ($Counter % 10 -eq 0) {
Write-Log "Warte auf Backend-Service... ($Counter/$TimeoutSeconds Sekunden)" $StatusMessage = "Warte auf Backend-Service... ($Counter/$TimeoutSeconds Sekunden)"
Write-Log $StatusMessage
} }
} while ($Counter -lt $TimeoutSeconds) } while ($Counter -lt $TimeoutSeconds)
@ -277,7 +274,7 @@ if ($RunMode -eq "production") {
} }
} else { } else {
Write-Log "🔧 Starte Backend-Server im Entwicklungsmodus..." -Color $Blue Write-Log "Starte Backend-Server im Entwicklungsmodus..." -Color $Blue
# Flask-Entwicklungsserver # Flask-Entwicklungsserver
$env:FLASK_APP = "app.py" $env:FLASK_APP = "app.py"
@ -309,11 +306,12 @@ if ($RunMode -eq "production") {
break break
} }
} catch { } catch {
# Ignoriere Fehler während der Startphase # Ignoriere Fehler waehrend der Startphase
} }
if ($Counter % 10 -eq 0) { if ($Counter % 10 -eq 0) {
Write-Log "Warte auf Backend-Service... ($Counter/$TimeoutSeconds Sekunden)" $StatusMessage = "Warte auf Backend-Service... ($Counter/$TimeoutSeconds Sekunden)"
Write-Log $StatusMessage
} }
} while ($Counter -lt $TimeoutSeconds) } while ($Counter -lt $TimeoutSeconds)
@ -329,22 +327,22 @@ if ($RunMode -eq "production") {
# URLs anzeigen # URLs anzeigen
Write-Host "" Write-Host ""
Write-Success "🎉 Backend-Server erfolgreich gestartet!" Write-Success "Backend-Server erfolgreich gestartet!"
Write-Host "" Write-Host ""
Write-Host "📡 Backend-API: http://localhost:$Port" -ForegroundColor $Green Write-Host "Backend-API: http://localhost:$Port" -ForegroundColor $Green
Write-Host "🔧 Backend-Health: http://localhost:$Port/monitoring/health/simple" -ForegroundColor $Green Write-Host "Backend-Health: http://localhost:$Port/monitoring/health/simple" -ForegroundColor $Green
Write-Host "📋 Backend-Test: http://localhost:$Port/api/test" -ForegroundColor $Green Write-Host "Backend-Test: http://localhost:$Port/api/test" -ForegroundColor $Green
Write-Host "" Write-Host ""
if ($RunMode -eq "development") { if ($RunMode -eq "development") {
Write-Host "🔧 Entwicklungsmodus aktiv:" -ForegroundColor $Blue Write-Host "Entwicklungsmodus aktiv:" -ForegroundColor $Blue
Write-Host "- Debug-Modus ist aktiviert" -ForegroundColor $White Write-Host "- Debug-Modus ist aktiviert" -ForegroundColor $White
Write-Host "- Automatisches Neuladen bei Änderungen" -ForegroundColor $White Write-Host "- Automatisches Neuladen bei Aenderungen" -ForegroundColor $White
Write-Host "- Detaillierte Fehlermeldungen" -ForegroundColor $White Write-Host "- Detaillierte Fehlermeldungen" -ForegroundColor $White
} else { } else {
Write-Host "🏭 Produktionsmodus aktiv:" -ForegroundColor $Blue Write-Host "Produktionsmodus aktiv:" -ForegroundColor $Blue
Write-Host "- Gunicorn mit $Workers Workern" -ForegroundColor $White Write-Host "- Gunicorn mit $Workers Workern" -ForegroundColor $White
Write-Host "- Optimiert für Performance" -ForegroundColor $White Write-Host "- Optimiert fuer Performance" -ForegroundColor $White
Write-Host "- Logging aktiviert" -ForegroundColor $White Write-Host "- Logging aktiviert" -ForegroundColor $White
} }

5
backend/temp_init.py Normal file
View File

@ -0,0 +1,5 @@
from app import create_app, init_db
app = create_app('development')
with app.app_context():
init_db()
print('Datenbank initialisiert')