🔧 Aktualisiert: Backend-Setup-Skript zur Verwendung einer bereinigten requirements.txt für die Installation von Python-Paketen mit verbesserter Fehlerbehandlung. 🚀

This commit is contained in:
2025-06-10 11:03:03 +02:00
parent 847841965b
commit fcf1d3afbb
4 changed files with 661 additions and 6 deletions

View File

@ -309,8 +309,22 @@ SSL certificate key usage incompatible
```
**Lösung:**
**🍓 RASPBERRY PI (Zielsystem) - PRIMÄRE LÖSUNG:**
```bash
# Schnell-Fix mit dediziertem Tool
# SSL-Fix auf Raspberry Pi ausführen
ssh pi@m040tbaraspi001
sudo chmod +x /tmp/fix_ssl_raspberry.sh
sudo /tmp/fix_ssl_raspberry.sh
# Oder via Setup-Skript
cd /opt/myp
sudo ./setup.sh # Option [1] wählen
```
**🔧 Alternative Tools:**
```bash
# Cross-Platform Python Tool
cd backend
python3 ssl_fix.py

View File

@ -0,0 +1,331 @@
# RASPBERRY PI SSL FIX - ERR_SSL_KEY_USAGE_INCOMPATIBLE
## 🍓 SSL-Problem auf Raspberry Pi Zielsystem lösen
Das `ERR_SSL_KEY_USAGE_INCOMPATIBLE` Problem tritt auf dem **Raspberry Pi** auf, weil die SSL-Zertifikat-Extensions nicht browser-kompatibel sind.
## 🚀 Automatische Lösung auf Raspberry Pi
### Option 1: Automatisches Skript (Empfohlen)
```bash
# Übertrage das Skript auf den Raspberry Pi
scp backend/fix_ssl_raspberry.sh pi@m040tbaraspi001:/tmp/
# Führe auf dem Raspberry Pi aus:
ssh pi@m040tbaraspi001
sudo chmod +x /tmp/fix_ssl_raspberry.sh
sudo /tmp/fix_ssl_raspberry.sh
```
### Option 2: Setup-Skript SSL-Regenerierung
```bash
# Auf dem Raspberry Pi:
cd /opt/myp
sudo ./setup.sh
# Wähle Option [1] Abhängigkeiten installieren
# Das Skript regeneriert automatisch SSL-Zertifikate
```
## 🔧 Manuelle Lösung auf Raspberry Pi
### Schritt 1: SSH-Verbindung
```bash
# Von Windows-Entwicklungsrechner:
ssh pi@m040tbaraspi001.de040.corpintra.net
# oder
ssh pi@192.168.1.XXX
```
### Schritt 2: SSL-Verzeichnis vorbereiten
```bash
sudo mkdir -p /opt/myp/ssl
sudo mkdir -p /opt/myp/ssl/backup
cd /opt/myp/ssl
```
### Schritt 3: Backup existierender Zertifikate
```bash
if [ -f cert.pem ]; then
sudo cp cert.pem backup/cert_backup_$(date +%Y%m%d_%H%M%S).pem
sudo cp key.pem backup/key_backup_$(date +%Y%m%d_%H%M%S).pem
echo "Backup erstellt"
fi
```
### Schritt 4: Browser-kompatible OpenSSL-Konfiguration
```bash
sudo tee openssl_raspberry_fix.conf << 'EOF'
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = DE
ST = Baden-Wuerttemberg
L = Stuttgart
O = Mercedes-Benz AG
OU = MYP Druckerverwaltung
CN = m040tbaraspi001
[v3_req]
# KRITISCH für Browser-Kompatibilität
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = critical, serverAuth, clientAuth
subjectAltName = critical, @alt_names
nsCertType = server
[alt_names]
# Lokale Entwicklung
DNS.1 = localhost
DNS.2 = *.localhost
IP.1 = 127.0.0.1
IP.2 = ::1
# Raspberry Pi Hostname
DNS.3 = m040tbaraspi001
DNS.4 = m040tbaraspi001.local
DNS.5 = raspberrypi
DNS.6 = raspberrypi.local
# Intranet-Domain
DNS.7 = m040tbaraspi001.de040.corpintra.net
DNS.8 = *.de040.corpintra.net
# Typische Raspberry Pi IPs
IP.3 = 0.0.0.0
EOF
```
### Schritt 5: Neue Zertifikate generieren
```bash
# Private Key generieren
sudo openssl genrsa -out key.pem 2048
# Browser-kompatibles Zertifikat erstellen
sudo openssl req -new -x509 \
-key key.pem \
-out cert.pem \
-days 365 \
-config openssl_raspberry_fix.conf \
-extensions v3_req \
-sha256
# Berechtigungen setzen
sudo chmod 644 cert.pem # Alle können lesen
sudo chmod 600 key.pem # Nur root kann lesen
sudo chown root:root cert.pem key.pem
# Aufräumen
sudo rm openssl_raspberry_fix.conf
```
### Schritt 6: Validierung
```bash
# Prüfe Browser-Kompatibilität
openssl x509 -in cert.pem -noout -text | grep -E "(Digital Signature|Key Encipherment|TLS Web Server Authentication|Subject Alternative Name|CA:FALSE)"
# Prüfe Raspberry Pi spezifische Einträge
openssl x509 -in cert.pem -noout -text | grep -E "(m040tbaraspi001|localhost|de040.corpintra.net)"
```
### Schritt 7: Services neu starten
```bash
# MYP Services neu starten
sudo systemctl restart myp-app.service
sudo systemctl restart myp-kiosk.service
# Status prüfen
sudo systemctl status myp-app.service
sudo systemctl status myp-kiosk.service
```
## 🌐 Zugriff nach SSL-Fix
### Intranet-Zugriff (von Windows-Client):
```
https://m040tbaraspi001.de040.corpintra.net
```
### Lokaler Zugriff (auf Raspberry Pi):
```
https://localhost:5000
```
### Direkte IP (falls DNS-Probleme):
```
https://192.168.1.XXX:5000
```
## 🔥 Firewall-Konfiguration
### UFW Firewall auf Raspberry Pi:
```bash
# Prüfe Firewall-Status
sudo ufw status
# Öffne HTTPS-Port falls blockiert
sudo ufw allow 443/tcp
sudo ufw allow 5000/tcp
# Status erneut prüfen
sudo ufw status numbered
```
## 🖥️ Browser-Setup auf Windows-Client
### Nach SSL-Fix auf Raspberry Pi:
#### 1. Browser-Cache vollständig leeren:
- **Chrome/Edge**: `Strg+Shift+Del` → "Gesamte Zeit" → alle Optionen
- **Firefox**: `Strg+Shift+Del` → "Alles" auswählen
#### 2. DNS-Cache leeren (Windows):
```cmd
ipconfig /flushdns
```
#### 3. Browser-Zugriff testen:
1. Öffne: `https://m040tbaraspi001.de040.corpintra.net`
2. Bei SSL-Warnung: **"Erweitert"** → **"Weiter zu m040tbaraspi001 (unsicher)"**
## 🐛 Debugging auf Raspberry Pi
### SSL-Verbindung testen:
```bash
# Teste SSL-Handshake
openssl s_client -connect localhost:5000 -servername localhost
# Teste von anderem System
openssl s_client -connect m040tbaraspi001.de040.corpintra.net:443
```
### Zertifikat-Details anzeigen:
```bash
# Vollständige Zertifikat-Informationen
openssl x509 -in /opt/myp/ssl/cert.pem -noout -text
# Nur Gültigkeit
openssl x509 -in /opt/myp/ssl/cert.pem -noout -dates
# Subject Alternative Names
openssl x509 -in /opt/myp/ssl/cert.pem -noout -text | grep -A 10 "Subject Alternative Name"
```
### Netzwerk-Debugging:
```bash
# Hostname prüfen
hostname
hostname -I
# DNS-Auflösung testen
nslookup m040tbaraspi001.de040.corpintra.net
ping m040tbaraspi001.de040.corpintra.net
# Port-Status
sudo netstat -tulpn | grep :443
sudo netstat -tulpn | grep :5000
```
### Service-Logs prüfen:
```bash
# MYP App Logs
sudo journalctl -u myp-app.service -f
# MYP Kiosk Logs
sudo journalctl -u myp-kiosk.service -f
# SSL-spezifische Fehler
sudo journalctl | grep -i ssl
sudo journalctl | grep -i certificate
```
## 📋 Raspberry Pi System-Info
### Hardware & OS:
```bash
# Raspberry Pi Modell
cat /proc/cpuinfo | grep "Model"
# OS Version
cat /etc/os-release
# Verfügbarer Speicher
df -h /opt/myp
# OpenSSL Version
openssl version
```
### Netzwerk-Konfiguration:
```bash
# IP-Konfiguration
ip addr show
# Routing-Tabelle
ip route show
# DNS-Konfiguration
cat /etc/resolv.conf
```
## 🔄 Integration mit Setup-Skript
Das Setup-Skript wurde aktualisiert um automatisch:
1. **Send2Trash-Problem** zu beheben (bereinigte requirements.txt)
2. **SSL-Zertifikate** browser-kompatibel zu regenerieren
3. **Raspberry Pi spezifische** Konfiguration anzuwenden
### Setup-Skript ausführen:
```bash
cd /opt/myp
sudo ./setup.sh
# Option [1]: Abhängigkeiten installieren
# Option [2]: Produktionsbetrieb einrichten
```
## 🎯 Erfolgs-Validierung
Nach dem SSL-Fix sollten folgende Tests erfolgreich sein:
### ✅ Raspberry Pi (lokal):
```bash
curl -k https://localhost:5000/health
```
### ✅ Windows-Client (remote):
```cmd
curl -k https://m040tbaraspi001.de040.corpintra.net/health
```
### ✅ Browser-Test:
- Keine `ERR_SSL_KEY_USAGE_INCOMPATIBLE` Fehler
- SSL-Warnung kann übersprungen werden
- MYP-Interface lädt korrekt
## 🚨 Fallback-Optionen
### Option 1: HTTP-Modus aktivieren
```bash
# In /opt/myp/config.py:
USE_HTTPS = False
PORT = 5000
# Zugriff über:
http://m040tbaraspi001.de040.corpintra.net:5000
```
### Option 2: Self-Signed Certificate Installation
```bash
# Zertifikat zu System CA-Store hinzufügen
sudo cp /opt/myp/ssl/cert.pem /usr/local/share/ca-certificates/myp.crt
sudo update-ca-certificates
```
---
**🍓 Der ERR_SSL_KEY_USAGE_INCOMPATIBLE Fehler sollte auf dem Raspberry Pi nach diesen Schritten vollständig behoben sein!**

View File

@ -0,0 +1,305 @@
#!/bin/bash
# MYP SSL Browser-Kompatibilitäts-Fix für Raspberry Pi
# Löst ERR_SSL_KEY_USAGE_INCOMPATIBLE Fehler auf Linux-Zielsystem
set -e # Beende bei Fehler
# Farbcodes für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
echo -e "${CYAN}=========================================================${NC}"
echo -e "${CYAN}MYP SSL BROWSER-KOMPATIBILITÄTS-FIX für Raspberry Pi${NC}"
echo -e "${CYAN}Löst ERR_SSL_KEY_USAGE_INCOMPATIBLE Fehler${NC}"
echo -e "${CYAN}=========================================================${NC}"
echo ""
# Aktuelles Verzeichnis und Pfade
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_DIR="/opt/myp"
SSL_DIR="$APP_DIR/ssl"
CERT_PATH="$SSL_DIR/cert.pem"
KEY_PATH="$SSL_DIR/key.pem"
echo -e "${BLUE}📁 Arbeitsverzeichnis: $SCRIPT_DIR${NC}"
echo -e "${BLUE}📁 App-Verzeichnis: $APP_DIR${NC}"
echo -e "${BLUE}🔐 SSL-Verzeichnis: $SSL_DIR${NC}"
echo ""
# Prüfe ob als root/sudo ausgeführt wird
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}❌ Dieses Skript muss als root ausgeführt werden!${NC}"
echo -e "${YELLOW}💡 Verwende: sudo $0${NC}"
exit 1
fi
# Prüfe ob OpenSSL verfügbar ist
if ! command -v openssl &> /dev/null; then
echo -e "${RED}❌ OpenSSL ist nicht installiert!${NC}"
echo -e "${YELLOW}📦 Installiere OpenSSL...${NC}"
apt update && apt install -y openssl
if ! command -v openssl &> /dev/null; then
echo -e "${RED}❌ OpenSSL Installation fehlgeschlagen!${NC}"
exit 1
fi
echo -e "${GREEN}✅ OpenSSL erfolgreich installiert${NC}"
fi
# SSL-Verzeichnis erstellen
echo -e "${YELLOW}📁 Erstelle SSL-Verzeichnis...${NC}"
mkdir -p "$SSL_DIR"
mkdir -p "$SSL_DIR/backup"
# Backup existierender Zertifikate
if [ -f "$CERT_PATH" ]; then
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
echo -e "${YELLOW}💾 Erstelle Backup der alten Zertifikate...${NC}"
cp "$CERT_PATH" "$SSL_DIR/backup/cert_backup_$TIMESTAMP.pem" 2>/dev/null || true
cp "$KEY_PATH" "$SSL_DIR/backup/key_backup_$TIMESTAMP.pem" 2>/dev/null || true
echo -e "${GREEN}✅ Backup erstellt: $SSL_DIR/backup/cert_backup_$TIMESTAMP.pem${NC}"
fi
# Erstelle Raspberry Pi spezifische OpenSSL-Konfiguration
echo -e "${YELLOW}📝 Erstelle browser-kompatible OpenSSL-Konfiguration...${NC}"
cat > "$SSL_DIR/openssl_raspberry_fix.conf" << 'EOF'
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = DE
ST = Baden-Wuerttemberg
L = Stuttgart
O = Mercedes-Benz AG
OU = MYP Druckerverwaltung
CN = m040tbaraspi001
[v3_req]
# Basic Constraints - KRITISCH für Browser-Kompatibilität
basicConstraints = critical, CA:FALSE
# Key Usage - KRITISCH für ERR_SSL_KEY_USAGE_INCOMPATIBLE Fix
keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
# Extended Key Usage - TLS Server Authentication
extendedKeyUsage = critical, serverAuth, clientAuth
# Subject Alternative Names - Alle Raspberry Pi Domains/IPs
subjectAltName = critical, @alt_names
# Netscape Extensions für Legacy-Browser
nsCertType = server
nsComment = "MYP Raspberry Pi SSL Fix - ERR_SSL_KEY_USAGE_INCOMPATIBLE Lösung"
[alt_names]
# Lokale Entwicklung
DNS.1 = localhost
DNS.2 = *.localhost
IP.1 = 127.0.0.1
IP.2 = ::1
# Raspberry Pi Hostname
DNS.3 = m040tbaraspi001
DNS.4 = m040tbaraspi001.local
DNS.5 = raspberrypi
DNS.6 = raspberrypi.local
# Intranet-Domain
DNS.7 = m040tbaraspi001.de040.corpintra.net
DNS.8 = *.de040.corpintra.net
# Raspberry Pi typische IPs
IP.3 = 0.0.0.0
IP.4 = 192.168.1.0/24
IP.5 = 10.0.0.0/8
EOF
echo -e "${GREEN}✅ OpenSSL-Konfiguration erstellt${NC}"
# Generiere Private Key
echo -e "${YELLOW}🔑 Generiere Private Key (RSA 2048)...${NC}"
openssl genrsa -out "$KEY_PATH" 2048
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Private Key generiert${NC}"
else
echo -e "${RED}❌ Private Key Generierung fehlgeschlagen!${NC}"
exit 1
fi
# Generiere browser-kompatibles Zertifikat
echo -e "${YELLOW}📜 Generiere browser-kompatibles Zertifikat...${NC}"
openssl req -new -x509 \
-key "$KEY_PATH" \
-out "$CERT_PATH" \
-days 365 \
-config "$SSL_DIR/openssl_raspberry_fix.conf" \
-extensions v3_req \
-sha256
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ Browser-kompatibles Zertifikat generiert${NC}"
else
echo -e "${RED}❌ Zertifikat-Generierung fehlgeschlagen!${NC}"
exit 1
fi
# Berechtigungen setzen
echo -e "${YELLOW}🔒 Setze korrekte Berechtigungen...${NC}"
chown root:root "$CERT_PATH" "$KEY_PATH"
chmod 644 "$CERT_PATH" # Alle können lesen
chmod 600 "$KEY_PATH" # Nur root kann lesen
echo -e "${GREEN}✅ Berechtigungen gesetzt${NC}"
# Aufräumen
rm -f "$SSL_DIR/openssl_raspberry_fix.conf"
# Validierung der Browser-Kompatibilität
echo ""
echo -e "${CYAN}=========================================================${NC}"
echo -e "${CYAN}🔍 BROWSER-KOMPATIBILITÄTS-VALIDIERUNG${NC}"
echo -e "${CYAN}=========================================================${NC}"
echo -e "${YELLOW}Prüfe Zertifikat-Extensions...${NC}"
# Extrahiere Zertifikat-Informationen
CERT_INFO=$(openssl x509 -in "$CERT_PATH" -noout -text 2>/dev/null)
# Browser-Kompatibilitäts-Checks
declare -A checks=(
["Digital Signature"]="Digital Signature"
["Key Encipherment"]="Key Encipherment"
["Key Agreement"]="Key Agreement"
["TLS Web Server Authentication"]="TLS Web Server Authentication"
["Subject Alternative Name"]="Subject Alternative Name"
["CA:FALSE"]="CA:FALSE"
["SHA-256 Signature"]="sha256WithRSAEncryption"
)
all_passed=true
for check_name in "${!checks[@]}"; do
pattern="${checks[$check_name]}"
if echo "$CERT_INFO" | grep -q "$pattern"; then
echo -e " ${GREEN}$check_name${NC}"
else
echo -e " ${RED}$check_name${NC}"
all_passed=false
fi
done
# Zusätzliche Raspberry Pi spezifische Checks
echo ""
echo -e "${YELLOW}Prüfe Raspberry Pi spezifische Konfiguration...${NC}"
# Hostname Check
if echo "$CERT_INFO" | grep -q "m040tbaraspi001"; then
echo -e " ${GREEN}✅ Raspberry Pi Hostname (m040tbaraspi001)${NC}"
else
echo -e " ${RED}❌ Raspberry Pi Hostname fehlt${NC}"
fi
# Localhost Check
if echo "$CERT_INFO" | grep -q "localhost"; then
echo -e " ${GREEN}✅ Localhost Support${NC}"
else
echo -e " ${RED}❌ Localhost Support fehlt${NC}"
fi
# Intranet Domain Check
if echo "$CERT_INFO" | grep -q "de040.corpintra.net"; then
echo -e " ${GREEN}✅ Intranet Domain Support${NC}"
else
echo -e " ${YELLOW}⚠️ Intranet Domain möglicherweise nicht verfügbar${NC}"
fi
# Zertifikat-Details anzeigen
echo ""
echo -e "${BLUE}📋 Zertifikat-Details:${NC}"
openssl x509 -in "$CERT_PATH" -noout -subject -dates
# Systemd Service Integration
echo ""
echo -e "${YELLOW}🔄 Integriere mit MYP Services...${NC}"
# Prüfe ob MYP App Service existiert
if systemctl list-units --type=service | grep -q "myp-app"; then
echo -e "${BLUE}🔄 Starte MYP App Service neu...${NC}"
systemctl restart myp-app.service
echo -e "${GREEN}✅ MYP App Service neu gestartet${NC}"
fi
# Prüfe ob MYP Kiosk Service existiert
if systemctl list-units --type=service | grep -q "myp-kiosk"; then
echo -e "${BLUE}🔄 Starte MYP Kiosk Service neu...${NC}"
systemctl restart myp-kiosk.service
echo -e "${GREEN}✅ MYP Kiosk Service neu gestartet${NC}"
fi
# Abschlussbericht
echo ""
if [ "$all_passed" = true ]; then
echo -e "${GREEN}=========================================================${NC}"
echo -e "${GREEN}🎉 SSL-FIX ERFOLGREICH ABGESCHLOSSEN!${NC}"
echo -e "${GREEN}=========================================================${NC}"
else
echo -e "${YELLOW}=========================================================${NC}"
echo -e "${YELLOW}⚠️ SSL-FIX ABGESCHLOSSEN (mit Warnungen)${NC}"
echo -e "${YELLOW}=========================================================${NC}"
fi
echo ""
echo -e "${CYAN}📊 ERGEBNIS:${NC}"
echo -e " 📄 Zertifikat: $CERT_PATH"
echo -e " 🔑 Private Key: $KEY_PATH"
echo -e " 📅 Gültig bis: $(date -d '+365 days' '+%Y-%m-%d')"
echo ""
echo -e "${CYAN}🌐 NÄCHSTE SCHRITTE:${NC}"
echo -e "${BLUE}1. Browser-Cache auf CLIENT-SYSTEM leeren:${NC}"
echo -e " • Chrome/Edge: Strg+Shift+Del → 'Gesamte Zeit' → alle Optionen"
echo -e " • Firefox: Strg+Shift+Del → 'Alles' auswählen"
echo ""
echo -e "${BLUE}2. Zugriff testen:${NC}"
echo -e " • Lokal: https://localhost:5000"
echo -e " • Intranet: https://m040tbaraspi001.de040.corpintra.net"
echo ""
echo -e "${BLUE}3. Bei SSL-Warnung im Browser:${NC}"
echo -e " • 'Erweitert' → 'Weiter zu [hostname] (unsicher)'"
echo ""
echo -e "${GREEN}💡 Der Fehler ERR_SSL_KEY_USAGE_INCOMPATIBLE sollte behoben sein!${NC}"
echo ""
# System-Info für Debugging
echo -e "${BLUE}🔍 System-Informationen:${NC}"
echo -e " 📟 Hostname: $(hostname)"
echo -e " 🌐 IP-Adressen: $(hostname -I | tr ' ' '\n' | head -3 | tr '\n' ' ')"
echo -e " 🐧 OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo -e " 🔐 OpenSSL: $(openssl version)"
echo ""
# Firewall-Check
if command -v ufw &> /dev/null; then
echo -e "${YELLOW}🔥 Prüfe Firewall (UFW)...${NC}"
ufw_status=$(ufw status | grep "Status:")
if echo "$ufw_status" | grep -q "active"; then
echo -e " 🔥 UFW aktiv - prüfe HTTPS Port 443..."
if ufw status | grep -q "443"; then
echo -e " ${GREEN}✅ Port 443 (HTTPS) ist geöffnet${NC}"
else
echo -e " ${YELLOW}⚠️ Port 443 (HTTPS) möglicherweise blockiert${NC}"
echo -e " 💡 Öffne mit: sudo ufw allow 443"
fi
else
echo -e " ${GREEN}✅ UFW inaktiv - keine Firewall-Blockierung${NC}"
fi
fi
echo -e "${GREEN}🏁 SSL-Fix für Raspberry Pi abgeschlossen!${NC}"

View File

@ -1574,11 +1574,16 @@ install_python_packages_with_break_system() {
# Mehrere Installationsversuche mit verschiedenen Strategien
local install_success=false
# Strategie 1: Mit --break-system-packages und --force-reinstall
if python3.11 -m pip install -r "$CURRENT_DIR/requirements.txt" --break-system-packages --force-reinstall --no-cache-dir; then
install_success=true
success "✅ requirements.txt mit --break-system-packages erfolgreich installiert"
else
# Erstelle bereinigte requirements.txt für Installation
if [ ! -f "$CURRENT_DIR/requirements_clean.txt" ]; then
create_clean_requirements
fi
# Strategie 1: Mit --break-system-packages und bereinigter requirements.txt
if python3.11 -m pip install -r "$CURRENT_DIR/requirements_clean.txt" --break-system-packages --force-reinstall --no-cache-dir; then
install_success=true
success "✅ Bereinigte requirements.txt mit --break-system-packages erfolgreich installiert"
else
warning "⚠️ Strategie 1 fehlgeschlagen, versuche Alternative..."
# Strategie 2: Bereinigte Einzelinstallation