"feat: Enhanced backend installation script in install.ps1 and test-backend-setup.py"
This commit is contained in:
parent
9614267d48
commit
9fe529247b
241
backend/install.ps1
Normal file
241
backend/install.ps1
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
# MYP Backend - Windows PowerShell Installations-Skript
|
||||||
|
# Installiert das Backend für Produktionsbetrieb oder Entwicklung
|
||||||
|
|
||||||
|
param(
|
||||||
|
[switch]$Production,
|
||||||
|
[switch]$Development,
|
||||||
|
[switch]$Clean,
|
||||||
|
[switch]$Logs,
|
||||||
|
[switch]$Help
|
||||||
|
)
|
||||||
|
|
||||||
|
# Farben für PowerShell
|
||||||
|
$Red = "Red"
|
||||||
|
$Green = "Green"
|
||||||
|
$Yellow = "Yellow"
|
||||||
|
$Blue = "Cyan"
|
||||||
|
|
||||||
|
function Write-Log {
|
||||||
|
param([string]$Message, [string]$Color = "White")
|
||||||
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||||
|
Write-Host "[$timestamp] $Message" -ForegroundColor $Color
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Success {
|
||||||
|
param([string]$Message)
|
||||||
|
Write-Log "SUCCESS: $Message" -Color $Green
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Warning {
|
||||||
|
param([string]$Message)
|
||||||
|
Write-Log "WARNING: $Message" -Color $Yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Error {
|
||||||
|
param([string]$Message)
|
||||||
|
Write-Log "FEHLER: $Message" -Color $Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Banner
|
||||||
|
Write-Host "========================================" -ForegroundColor $Blue
|
||||||
|
Write-Host "🏭 MYP Backend - Windows Installation" -ForegroundColor $Blue
|
||||||
|
Write-Host "========================================" -ForegroundColor $Blue
|
||||||
|
|
||||||
|
if ($Help) {
|
||||||
|
Write-Host @"
|
||||||
|
Verwendung: .\install.ps1 [OPTIONEN]
|
||||||
|
|
||||||
|
OPTIONEN:
|
||||||
|
-Production Produktions-Installation
|
||||||
|
-Development Entwicklungs-Installation
|
||||||
|
-Clean Bereinige vorherige Installation
|
||||||
|
-Logs Zeige detaillierte Logs
|
||||||
|
-Help Zeige diese Hilfe
|
||||||
|
|
||||||
|
BEISPIELE:
|
||||||
|
.\install.ps1 -Production
|
||||||
|
.\install.ps1 -Development -Logs
|
||||||
|
.\install.ps1 -Clean
|
||||||
|
"@
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Bestimme Installationsmodus
|
||||||
|
$InstallMode = "development"
|
||||||
|
if ($Production) {
|
||||||
|
$InstallMode = "production"
|
||||||
|
Write-Log "🏭 Produktions-Installation gestartet" -Color $Blue
|
||||||
|
} elseif ($Development) {
|
||||||
|
$InstallMode = "development"
|
||||||
|
Write-Log "🔧 Entwicklungs-Installation gestartet" -Color $Blue
|
||||||
|
} else {
|
||||||
|
Write-Log "🔧 Standard-Installation (Entwicklung)" -Color $Blue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Arbeitsverzeichnis prüfen
|
||||||
|
$CurrentDir = Get-Location
|
||||||
|
Write-Log "Arbeitsverzeichnis: $CurrentDir"
|
||||||
|
|
||||||
|
if (-not (Test-Path "app.py")) {
|
||||||
|
Write-Error "app.py nicht gefunden! Bitte im Backend-Verzeichnis ausführen."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Python-Version prüfen
|
||||||
|
Write-Log "🐍 Prüfe Python-Installation..." -Color $Blue
|
||||||
|
|
||||||
|
try {
|
||||||
|
$PythonVersion = python --version 2>&1
|
||||||
|
Write-Log "Python-Version: $PythonVersion"
|
||||||
|
|
||||||
|
# Prüfe Mindestversion (3.8+)
|
||||||
|
$VersionMatch = $PythonVersion -match "Python (\d+)\.(\d+)"
|
||||||
|
if ($VersionMatch) {
|
||||||
|
$Major = [int]$Matches[1]
|
||||||
|
$Minor = [int]$Matches[2]
|
||||||
|
|
||||||
|
if ($Major -lt 3 -or ($Major -eq 3 -and $Minor -lt 8)) {
|
||||||
|
Write-Error "Python 3.8+ erforderlich, gefunden: $PythonVersion"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "Python-Version ist kompatibel"
|
||||||
|
} catch {
|
||||||
|
Write-Error "Python nicht gefunden! Bitte Python 3.8+ installieren."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Bereinigung (falls gewünscht)
|
||||||
|
if ($Clean) {
|
||||||
|
Write-Log "🧹 Bereinige vorherige Installation..." -Color $Yellow
|
||||||
|
|
||||||
|
if (Test-Path "instance") {
|
||||||
|
Remove-Item -Recurse -Force "instance"
|
||||||
|
Write-Log "Datenbank-Verzeichnis entfernt"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path "logs") {
|
||||||
|
Remove-Item -Recurse -Force "logs"
|
||||||
|
Write-Log "Log-Verzeichnis entfernt"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "Bereinigung abgeschlossen"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Erstelle erforderliche Verzeichnisse
|
||||||
|
Write-Log "📁 Erstelle Verzeichnisse..." -Color $Blue
|
||||||
|
|
||||||
|
$Directories = @("instance", "logs", "uploads")
|
||||||
|
foreach ($Dir in $Directories) {
|
||||||
|
if (-not (Test-Path $Dir)) {
|
||||||
|
New-Item -ItemType Directory -Path $Dir | Out-Null
|
||||||
|
Write-Log "Verzeichnis erstellt: $Dir"
|
||||||
|
} else {
|
||||||
|
Write-Log "Verzeichnis existiert bereits: $Dir"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Installiere Python-Dependencies
|
||||||
|
Write-Log "📦 Installiere Python-Pakete..." -Color $Blue
|
||||||
|
|
||||||
|
if (Test-Path "requirements.txt") {
|
||||||
|
try {
|
||||||
|
if ($Logs) {
|
||||||
|
pip install -r requirements.txt
|
||||||
|
} else {
|
||||||
|
pip install -r requirements.txt --quiet
|
||||||
|
}
|
||||||
|
Write-Success "Python-Pakete installiert"
|
||||||
|
} catch {
|
||||||
|
Write-Error "Fehler beim Installieren der Python-Pakete: $_"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Warning "requirements.txt nicht gefunden"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Umgebungskonfiguration
|
||||||
|
Write-Log "⚙️ Konfiguriere Umgebung..." -Color $Blue
|
||||||
|
|
||||||
|
if (Test-Path "env.backend") {
|
||||||
|
Write-Log "Umgebungskonfiguration gefunden: env.backend"
|
||||||
|
|
||||||
|
# Lade Umgebungsvariablen für Tests
|
||||||
|
$EnvContent = Get-Content "env.backend"
|
||||||
|
foreach ($Line in $EnvContent) {
|
||||||
|
if ($Line -match "^([^#][^=]+)=(.*)$") {
|
||||||
|
$Key = $Matches[1].Trim()
|
||||||
|
$Value = $Matches[2].Trim()
|
||||||
|
[Environment]::SetEnvironmentVariable($Key, $Value, "Process")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "Umgebungsvariablen geladen"
|
||||||
|
} else {
|
||||||
|
Write-Warning "env.backend nicht gefunden"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Datenbank initialisieren
|
||||||
|
Write-Log "🗄️ Initialisiere Datenbank..." -Color $Blue
|
||||||
|
|
||||||
|
try {
|
||||||
|
$env:FLASK_APP = "app.py"
|
||||||
|
$env:FLASK_ENV = $InstallMode
|
||||||
|
|
||||||
|
$PythonCode = "from app import create_app, init_db; app = create_app('$InstallMode'); app.app_context().push(); init_db(); print('Datenbank initialisiert')"
|
||||||
|
python -c $PythonCode
|
||||||
|
Write-Success "Datenbank erfolgreich initialisiert"
|
||||||
|
} catch {
|
||||||
|
Write-Error "Fehler bei der Datenbank-Initialisierung: $_"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Konfigurationstest
|
||||||
|
Write-Log "🧪 Teste Konfiguration..." -Color $Blue
|
||||||
|
|
||||||
|
try {
|
||||||
|
python test-backend-setup.py | Out-Null
|
||||||
|
$TestResult = $LASTEXITCODE
|
||||||
|
|
||||||
|
if ($TestResult -eq 0) {
|
||||||
|
Write-Success "Alle Konfigurationstests bestanden"
|
||||||
|
} else {
|
||||||
|
Write-Warning "Einige Konfigurationstests fehlgeschlagen (Code: $TestResult)"
|
||||||
|
if ($Logs) {
|
||||||
|
Write-Log "Führe detaillierte Tests aus..."
|
||||||
|
python test-backend-setup.py
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Warning "Konfigurationstest konnte nicht ausgeführt werden: $_"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Installation abgeschlossen
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "========================================" -ForegroundColor $Green
|
||||||
|
Write-Host "✅ MYP Backend Installation abgeschlossen!" -ForegroundColor $Green
|
||||||
|
Write-Host "========================================" -ForegroundColor $Green
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
Write-Host "📋 Nächste Schritte:" -ForegroundColor $Blue
|
||||||
|
Write-Host "1. Backend starten:" -ForegroundColor $White
|
||||||
|
Write-Host " .\start-backend-server.ps1" -ForegroundColor $Yellow
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "2. Health-Check testen:" -ForegroundColor $White
|
||||||
|
Write-Host " curl http://localhost:5000/monitoring/health/simple" -ForegroundColor $Yellow
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "3. Logs überwachen:" -ForegroundColor $White
|
||||||
|
Write-Host " Get-Content logs\myp.log -Wait" -ForegroundColor $Yellow
|
||||||
|
Write-Host ""
|
||||||
|
|
||||||
|
if ($InstallMode -eq "production") {
|
||||||
|
Write-Host "🏭 Produktions-Hinweise:" -ForegroundColor $Blue
|
||||||
|
Write-Host "- Verwende einen Reverse Proxy (nginx/Apache)" -ForegroundColor $White
|
||||||
|
Write-Host "- Konfiguriere SSL/TLS-Zertifikate" -ForegroundColor $White
|
||||||
|
Write-Host "- Überwache Logs und Metriken" -ForegroundColor $White
|
||||||
|
Write-Host "- Führe regelmäßige Backups durch" -ForegroundColor $White
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Success "Installation erfolgreich abgeschlossen!"
|
@ -29,29 +29,31 @@ def test_dependencies():
|
|||||||
"""Teste erforderliche Python-Pakete"""
|
"""Teste erforderliche Python-Pakete"""
|
||||||
print("📦 Teste Python-Dependencies...")
|
print("📦 Teste Python-Dependencies...")
|
||||||
|
|
||||||
required_packages = [
|
required_packages = {
|
||||||
'flask',
|
'flask': 'flask',
|
||||||
'flask_cors',
|
'flask_cors': 'flask_cors',
|
||||||
'werkzeug',
|
'werkzeug': 'werkzeug',
|
||||||
'pyjwt',
|
'jwt': 'PyJWT', # PyJWT wird als 'jwt' importiert
|
||||||
'python_dotenv',
|
'dotenv': 'python-dotenv', # python-dotenv wird als 'dotenv' importiert
|
||||||
'gunicorn'
|
'gunicorn': 'gunicorn'
|
||||||
]
|
}
|
||||||
|
|
||||||
missing_packages = []
|
missing_packages = []
|
||||||
|
|
||||||
for package in required_packages:
|
for import_name, package_name in required_packages.items():
|
||||||
try:
|
try:
|
||||||
__import__(package)
|
__import__(import_name)
|
||||||
print(f" ✅ {package}")
|
print(f" ✅ {package_name}")
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print(f" ❌ {package} fehlt")
|
print(f" ❌ {package_name} fehlt")
|
||||||
missing_packages.append(package)
|
missing_packages.append(package_name)
|
||||||
|
|
||||||
if missing_packages:
|
if missing_packages:
|
||||||
print(f" Fehlende Pakete: {', '.join(missing_packages)}")
|
print(f" Fehlende Pakete: {', '.join(missing_packages)}")
|
||||||
print(" Installiere mit: pip install -r requirements.txt")
|
print(" Installiere mit: pip install -r requirements.txt")
|
||||||
return False
|
return False
|
||||||
|
else:
|
||||||
|
print(" ✅ Alle Dependencies verfügbar")
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -80,26 +82,29 @@ def test_configuration():
|
|||||||
print(f" ❌ Konfigurationsfehler: {e}")
|
print(f" ❌ Konfigurationsfehler: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def test_app_factory():
|
def test_application_factory():
|
||||||
"""Teste Application Factory Pattern"""
|
"""Teste Application Factory Pattern"""
|
||||||
print("🏭 Teste Application Factory...")
|
print("🏭 Teste Application Factory...")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Temporäre Umgebungsvariablen setzen
|
|
||||||
os.environ['SECRET_KEY'] = 'test_secret_key'
|
|
||||||
os.environ['DATABASE_PATH'] = ':memory:'
|
|
||||||
|
|
||||||
from app import create_app
|
from app import create_app
|
||||||
|
|
||||||
# Teste verschiedene Konfigurationen
|
# Teste verschiedene Konfigurationen
|
||||||
dev_app = create_app('development')
|
configs = ['development', 'production', 'testing']
|
||||||
prod_app = create_app('production')
|
|
||||||
test_app = create_app('testing')
|
|
||||||
|
|
||||||
print(f" ✅ Development-App: {dev_app.config['FLASK_ENV']}")
|
for config_name in configs:
|
||||||
print(f" ✅ Production-App: {prod_app.config['FLASK_ENV']}")
|
try:
|
||||||
print(f" ✅ Testing-App: {test_app.config['FLASK_ENV']}")
|
app = create_app(config_name)
|
||||||
|
if app and hasattr(app, 'config'):
|
||||||
|
print(f" ✅ {config_name.title()}-Config erfolgreich geladen")
|
||||||
|
else:
|
||||||
|
print(f" ❌ {config_name.title()}-Config fehlgeschlagen")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print(f" ❌ {config_name.title()}-Config Fehler: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
print(" ✅ Application Factory funktioniert")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -204,8 +209,8 @@ def test_health_endpoint():
|
|||||||
app = create_app('testing')
|
app = create_app('testing')
|
||||||
|
|
||||||
with app.test_client() as client:
|
with app.test_client() as client:
|
||||||
# Teste sowohl /health als auch /monitoring/health
|
# Teste sowohl /health als auch /monitoring/health und /monitoring/health/simple
|
||||||
endpoints_to_test = ['/health', '/monitoring/health']
|
endpoints_to_test = ['/health', '/monitoring/health/simple', '/monitoring/health']
|
||||||
|
|
||||||
for endpoint in endpoints_to_test:
|
for endpoint in endpoints_to_test:
|
||||||
response = client.get(endpoint)
|
response = client.get(endpoint)
|
||||||
@ -244,7 +249,7 @@ def main():
|
|||||||
test_python_environment,
|
test_python_environment,
|
||||||
test_dependencies,
|
test_dependencies,
|
||||||
test_configuration,
|
test_configuration,
|
||||||
test_app_factory,
|
test_application_factory,
|
||||||
test_database_functions,
|
test_database_functions,
|
||||||
test_environment_variables,
|
test_environment_variables,
|
||||||
test_wsgi,
|
test_wsgi,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user