🎉 Added COMMON_ERRORS.md, updated requirements.txt, setup.sh, and introduced file_utils.py & ssl_config.py in backend/utils 🎨

This commit is contained in:
2025-06-10 10:42:19 +02:00
parent af7838e77b
commit a303624798
5 changed files with 498 additions and 22 deletions

View File

@@ -1358,47 +1358,190 @@ EOF
log "✅ Robuste Python-Umgebung installiert"
}
create_clean_requirements() {
log "=== ERSTELLE BEREINIGTE REQUIREMENTS.TXT ==="
local original_req="$CURRENT_DIR/requirements.txt"
local clean_req="$CURRENT_DIR/requirements_clean.txt"
# Problematische Pakete, die übersprungen werden sollen
local problematic_packages=(
"Send2Trash"
"pywin32"
"wmi"
"RPi.GPIO"
"python-magic-bin"
)
progress "Erstelle bereinigte requirements.txt..."
# Erstelle neue requirements.txt ohne problematische Pakete
> "$clean_req" # Datei leeren
while IFS= read -r line || [ -n "$line" ]; do
local skip_line=false
local package_name=$(echo "$line" | sed 's/[<>=!].*//' | xargs)
# Überspringe leere Zeilen und Kommentare
if [[ -z "${line// }" ]] || [[ "$line" =~ ^[[:space:]]*# ]]; then
echo "$line" >> "$clean_req"
continue
fi
# Prüfe ob Paket problematisch ist
for problematic in "${problematic_packages[@]}"; do
if [[ "$package_name" == "$problematic" ]]; then
echo "# ÜBERSPRUNGEN (problematisch): $line" >> "$clean_req"
log "⚠️ Überspringe problematisches Paket: $package_name"
skip_line=true
break
fi
done
# Spezielle Behandlung für plattformspezifische Pakete
if [[ "$line" =~ "sys_platform" ]]; then
# Prüfe Plattform-Kompatibilität
if [[ "$line" =~ "win32" ]] && [[ "$(uname -s)" != "CYGWIN"* ]] && [[ "$(uname -s)" != "MINGW"* ]]; then
echo "# ÜBERSPRUNGEN (Windows): $line" >> "$clean_req"
log " Überspringe Windows-spezifisches Paket: $package_name"
skip_line=true
elif [[ "$line" =~ "linux" ]] && [[ "$(uname -s)" != "Linux" ]]; then
echo "# ÜBERSPRUNGEN (Linux): $line" >> "$clean_req"
log " Überspringe Linux-spezifisches Paket: $package_name"
skip_line=true
fi
fi
# Füge Zeile hinzu wenn nicht übersprungen
if [ "$skip_line" = false ]; then
echo "$line" >> "$clean_req"
fi
done < "$original_req"
log "✅ Bereinigte requirements.txt erstellt: $clean_req"
# Zeige Statistiken
local original_count=$(grep -v -E '^[[:space:]]*#|^[[:space:]]*$' "$original_req" | wc -l)
local clean_count=$(grep -v -E '^[[:space:]]*#|^[[:space:]]*$' "$clean_req" | wc -l)
log "📊 Pakete: $original_count$clean_count ($(($original_count - $clean_count)) übersprungen)"
}
install_essential_packages_fallback() {
log "=== INSTALLIERE ESSENTIELLE PAKETE (FALLBACK) ==="
# Minimale Liste essentieller Pakete für MYP
local essential_packages=(
"Flask>=2.0.0"
"Werkzeug>=2.0.0"
"Jinja2>=3.0.0"
"requests>=2.25.0"
"SQLAlchemy>=1.4.0"
"Flask-Login>=0.6.0"
"Flask-WTF>=1.0.0"
"WTForms>=3.0.0"
"cryptography>=3.4.0"
"bcrypt>=3.2.0"
"psutil>=5.8.0"
"python-dateutil>=2.8.0"
"click>=8.0.0"
"colorlog>=6.6.0"
"watchdog>=2.1.0"
"schedule>=1.1.0"
"Pillow>=8.3.0"
)
progress "Installiere essentielle Pakete einzeln..."
local install_count=0
local total_count=${#essential_packages[@]}
for package in "${essential_packages[@]}"; do
local package_name=$(echo "$package" | sed 's/[<>=!].*//')
progress "Installiere $package_name... ($((++install_count))/$total_count)"
# Mehrere Installationsstrategien
if python3 -m pip install "$package" --break-system-packages --no-cache-dir >/dev/null 2>&1; then
log "$package_name erfolgreich installiert"
elif python3 -m pip install "$package_name" --break-system-packages --no-cache-dir >/dev/null 2>&1; then
log "$package_name erfolgreich installiert (ohne Version)"
elif python3 -m pip install "$package" --user --no-cache-dir >/dev/null 2>&1; then
log "$package_name erfolgreich installiert (user)"
else
warning "⚠️ $package_name Installation fehlgeschlagen"
fi
done
log "✅ Essentieller Pakete Installation abgeschlossen"
}
install_python_packages() {
log "=== PYTHON-PAKETE INSTALLATION ==="
log "=== ROBUSTE PYTHON-PAKETE INSTALLATION ==="
progress "Installiere Python-Pakete..."
if [ ! -f "$CURRENT_DIR/requirements.txt" ]; then
error "requirements.txt nicht gefunden: $CURRENT_DIR/requirements.txt"
install_essential_packages_fallback
return
fi
# Kopiere requirements.txt
cp "$CURRENT_DIR/requirements.txt" "$APP_DIR/" 2>/dev/null || true
# Installiere alle Pakete aus requirements.txt
progress "Installiere requirements.txt..."
# Erstelle bereinigte requirements.txt
create_clean_requirements
if python3 -m pip install -r "$CURRENT_DIR/requirements.txt" --break-system-packages; then
success "✅ requirements.txt erfolgreich installiert"
# Installiere bereinigte Pakete
progress "Installiere bereinigte requirements.txt..."
local install_success=false
# Strategie 1: Bereinigte requirements.txt mit --break-system-packages
if python3 -m pip install -r "$CURRENT_DIR/requirements_clean.txt" --break-system-packages --no-cache-dir; then
install_success=true
success "✅ Bereinigte requirements.txt erfolgreich installiert"
else
error "❌ requirements.txt Installation fehlgeschlagen"
return 1
warning "⚠️ Bereinigte requirements.txt Installation fehlgeschlagen"
# Strategie 2: Essentielle Pakete einzeln installieren
warning "Verwende Fallback: Essentielle Pakete einzeln installieren"
install_essential_packages_fallback
install_success=true
fi
# Aufräumen
rm -f "$CURRENT_DIR/requirements_clean.txt" 2>/dev/null || true
# Validiere essenzielle Module
progress "Validiere essenzielle Python-Module..."
local essential_modules=("flask" "requests")
local essential_modules=("flask" "requests" "werkzeug" "jinja2" "sqlalchemy")
local validation_success=true
for module in "${essential_modules[@]}"; do
if python3 -c "import $module; print(f'✅ $module verfügbar')" 2>/dev/null; then
debug "$module erfolgreich importiert"
else
warning "⚠️ $module nicht verfügbar"
warning "⚠️ $module nicht verfügbar - versuche nachinstallation..."
python3 -m pip install "$module" --break-system-packages --no-cache-dir >/dev/null 2>&1 || true
fi
done
# Finale Validierung
for module in "${essential_modules[@]}"; do
if python3 -c "import $module" 2>/dev/null; then
log "$module verfügbar"
else
warning "⚠️ $module fehlt"
validation_success=false
fi
done
if [ "$validation_success" = true ]; then
success "✅ Essenzielle Python-Module verfügbar"
success "✅ Alle essentiellen Python-Module verfügbar"
else
warning "⚠️ Einige essenzielle Module fehlen"
warning "⚠️ Einige essenzielle Module fehlen - Fallback verwendet"
fi
log "✅ Python-Pakete Installation abgeschlossen"
@@ -1407,7 +1550,7 @@ install_python_packages() {
progress "Zeige installierte Python-Pakete..."
echo ""
echo "📦 Installierte Python-Pakete:"
python3 -m pip list 2>/dev/null | grep -E "(Flask|requests|Werkzeug|Jinja2)" | head -10 || echo " Keine relevanten Pakete gefunden"
python3 -m pip list 2>/dev/null | grep -E "(Flask|requests|Werkzeug|Jinja2|SQLAlchemy)" | head -10 || echo " Keine relevanten Pakete gefunden"
echo ""
}
@@ -1438,8 +1581,14 @@ install_python_packages_with_break_system() {
else
warning "⚠️ Strategie 1 fehlgeschlagen, versuche Alternative..."
# Strategie 2: Einzelne Pakete installieren
progress "Installiere Pakete einzeln..."
# Strategie 2: Bereinigte Einzelinstallation
progress "Installiere bereinigte Pakete einzeln..."
# Erstelle bereinigte requirements.txt falls nicht vorhanden
if [ ! -f "$CURRENT_DIR/requirements_clean.txt" ]; then
create_clean_requirements
fi
while IFS= read -r package || [ -n "$package" ]; do
# Überspringe Kommentare und leere Zeilen
if [[ "$package" =~ ^[[:space:]]*# ]] || [[ -z "${package// }" ]]; then
@@ -1450,14 +1599,18 @@ install_python_packages_with_break_system() {
package=$(echo "$package" | xargs)
if [ -n "$package" ]; then
progress "Installiere: $package"
local package_name=$(echo "$package" | sed 's/[<>=!].*//')
progress "Installiere: $package_name"
if python3.11 -m pip install "$package" --break-system-packages --no-cache-dir; then
debug "$package erfolgreich installiert"
debug "$package_name erfolgreich installiert"
else
warning "⚠️ $package Installation fehlgeschlagen"
warning "⚠️ $package_name Installation fehlgeschlagen"
fi
fi
done < "$CURRENT_DIR/requirements.txt"
done < "$CURRENT_DIR/requirements_clean.txt"
# Aufräumen
rm -f "$CURRENT_DIR/requirements_clean.txt" 2>/dev/null || true
install_success=true
fi