🎉 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:
189
backend/setup.sh
189
backend/setup.sh
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user