From 4d5ae2ccebbd1ed3458e2039cef61594d3d644fb Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Tue, 3 Jun 2025 21:37:28 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20IHK=20Projektdokument?= =?UTF-8?q?ation=20and=20logs=20for=20better=20clarity=20and=20organizatio?= =?UTF-8?q?n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dokumentation.md | 119 ++++++++------ backend/logs/myp-install-debug.log | 40 +++++ backend/logs/myp-install.log | 151 ++++++++++++++++++ 3 files changed, 258 insertions(+), 52 deletions(-) diff --git a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md index 05596920..bcb81e61 100644 --- a/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md +++ b/IHK_Projektdokumentation/Dokumentation_Final_Markdown/Dokumentation.md @@ -168,28 +168,30 @@ neben den Druckern überhaupt so nennen möchte – führte zu systematischen Problemen. Doppelbuchungen waren an der Tagesordnung, die manuelle Aktivierung und Deaktivierung der Geräte wurde regelmäßig vergessen (was zu unnötigem Energieverbrauch und erhöhtem Verschleiß führte), und eine -verlässliche Dokumentation der tatsächlichen Nutzungszeiten? -Fehlanzeige. Weder Verantwortungszuordnung für Aufräumarbeiten noch +verlässliche Dokumentation der tatsächlichen Nutzungszeiten existierte +schlichtweg nicht. Weder Verantwortungszuordnung für Aufräumarbeiten noch verursachungsgerechte Kostenzuordnung waren möglich. Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben Haack – Fachrichtung Daten- und Prozessanalyse – hatte einen vielversprechenden Frontend-Prototyp auf Basis von Next.js hervorgebracht. Der Prototyp verfügte über eine moderne -Benutzeroberfläche mit umfangreichen Analysefunktionen. Nur fehlte -dummerweise die komplette Backend-Funktionalität. Ohne Backend blieb +Benutzeroberfläche mit umfangreichen Analysefunktionen. Allerdings fehlte +die essenzielle Backend-Funktionalität vollständig. Ohne Backend blieb die Projektarbeit des Herrn Haack in der praktischen Anwendung funktionslos. Ursprünglich war angedacht, API-Endpunkte zu implementieren, welche die Daten- und Prozessanalyse seines Frontends ermöglicht hätten – eine Aufgabe, die naturgemäß außerhalb meines Fachgebiets der digitalen Vernetzung lag. -Ich sah die Chance, die Idee aufzugreifen und im Rahmen meiner +Ich erkannte die Chance, die Idee aufzugreifen und im Rahmen meiner Projektarbeit weiterzuentwickeln. Die Schnittstelle der Vernetzung zum -cyber-physischen System lag im Backend – genau mein Ding. Mehrere -Möglichkeiten zur Einbringung meiner Fachrichtung sprangen mir direkt -ins Auge. Keine lästige Pflichtaufgabe wie bei anderen Projektoptionen, -sondern echtes Interesse. Es kitzelte meine Leidenschaft. +cyber-physischen System lag im Backend – exakt in meinem +Kompetenzbereich. Mehrere Möglichkeiten zur Einbringung meiner +Fachrichtung waren unmittelbar ersichtlich. Im Gegensatz zu anderen +verfügbaren Projektoptionen, die eher pflichtgemäßen Charakter hatten, +weckte dieses Vorhaben mein genuines fachliches Interesse und meine +intrinsische Motivation. Es kitzelte meine Leidenschaft. ## 1.2 Ableitung der Projektziele @@ -300,8 +302,9 @@ Funktionsumfang und Benutzerfreundlichkeit. Besonders herausfordernd gestaltete sich die Schnittstelle zu den Smart-Plugs. Die ursprüngliche Annahme, dass sich die TAPO P110-Steckdosen von TP-Link problemlos integrieren lassen würden, erwies sich als -naiv. Die Geräte boten keine dokumentierte API – nur die proprietäre -TAPO-App ermöglichte die Steuerung. Das war ein Problem. +zu optimistisch. Die Geräte boten keine dokumentierte API – nur die proprietäre +TAPO-App ermöglichte die Steuerung. Dies stellte eine erhebliche technische +Herausforderung für die geplante Integration dar. ## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen @@ -529,24 +532,27 @@ kategorisch aus, was die Optionen erheblich einschränkte. Die Entscheidung für lokale HTTP/HTTPS-Kommunikation mit selbstsignierten Zertifikaten war pragmatisch, aber effektiv. -Die Kommunikation mit den Smart-Plugs stellte die größte Herausforderung -dar. Die TAPO-Geräte boten keine dokumentierte Schnittstelle – nur die -proprietäre App konnte sie steuern. Also griff ich zu Wireshark und -analysierte den Netzwerkverkehr zwischen App und Steckdosen. Was ich -fand, war ernüchternd: verschlüsselte Kommunikation mit sich ständig -ändernden Session-Keys. +Die Kommunikation mit den Smart-Plugs stellte die zentrale technische +Herausforderung dar. Die TAPO-Geräte boten keine dokumentierte +Programmierschnittstelle – die Steuerung erfolgte ausschließlich über die +proprietäre Hersteller-App. Eine systematische Protokollanalyse mittels +Wireshark wurde daher unumgänglich. Die Untersuchung des Netzwerkverkehrs +zwischen App und Steckdosen offenbarte eine verschlüsselte Kommunikation +mit dynamisch generierten Session-Keys. -Mein erster Versuch mit einem vielversprechenden Python-Modul schlug -fehl – es funktionierte einfach nicht mit meinen Geräten. Der -Wireshark-Mitschnitt offenbarte immer dieselben verschlüsselten -Responses. Ohne Erfolg beim Simulieren einzelner Anfragen dämmerte -es mir: Die Anfragensequenz musste stimmen! Die Verbindung nutzte -temporäre Cookies und proprietäre Verschlüsselung. +Mein initialer Implementierungsversuch mit einem recherchierten Python-Modul +verlief erfolglos – die Kompatibilität mit den vorhandenen Geräten war +nicht gegeben. Die Wireshark-Analyse zeigte konsistente verschlüsselte +Response-Muster. Nach mehreren erfolglosen Versuchen, einzelne Anfragen +zu replizieren, wurde deutlich: Die korrekte Sequenzierung der +Kommunikation war essentiell. Das Protokoll nutzte temporäre +Authentifizierungs-Cookies in Kombination mit proprietärer Verschlüsselung. -Nach tagelangen Experimenten stieß ich auf PyP100 – ein alternatives -Python-Modul, versteckt in den Tiefen von GitHub. Dieses Modul löste -die Session-Key-Problematik elegant und ermöglichte endlich eine -stabile Integration. +Nach intensiver Recherche und mehreren Tagen systematischer Tests konnte +PyP100 als geeignete Lösung identifiziert werden. Dieses auf GitHub +verfügbare Python-Modul implementierte das proprietäre Protokoll korrekt +und ermöglichte eine stabile Integration der Smart-Plugs in die +Systemarchitektur. ## 2.6 Planung der Prozess-/ und Systemschnittstellen @@ -554,23 +560,25 @@ Die Schnittstellenplanung erforderte eine sorgfältige Balance zwischen Funktionalität und Sicherheit. Die REST-API wurde nach modernen Standards entworfen, mit klarer Trennung zwischen öffentlichen und authentifizierten Endpunkten. Über 100 Endpunkte wurden spezifiziert – -eine Zahl, die zunächst übertrieben erschien, sich aber als notwendig -erwies; jeder Endpunkt ein kleines Kunstwerk der Funktionalität. +eine Anzahl, die zunächst umfangreich erschien, sich jedoch als +notwendig für die vollständige Funktionsabdeckung erwies. Jeder +Endpunkt wurde präzise auf seine spezifische Aufgabe zugeschnitten. Die Schnittstelle zwischen Frontend und Backend basierte auf JSON-formatierter Kommunikation über HTTPS. Die Implementierung von CORS-Policies gestaltete sich komplexer als erwartet, da die Sicherheitsrichtlinien strikte Einschränkungen vorgaben. Die Lösung – eine Whitelist-basierte CORS-Konfiguration – erfüllte die -Sicherheitsanforderungen ohne die Funktionalität einzuschränken; ein -Drahtseilakt zwischen Sicherheit und Usability. +Sicherheitsanforderungen ohne die Funktionalität einzuschränken. Diese +Implementation stellte einen ausgewogenen Kompromiss zwischen +Sicherheit und Anwenderfreundlichkeit dar. Besondere Aufmerksamkeit erforderte die Scheduler-Schnittstelle. Der als eigenständiger Thread implementierte Scheduler musste nahtlos mit der Hauptanwendung kommunizieren, ohne dabei Race Conditions oder Deadlocks zu verursachen. Die Verwendung von Thread-sicheren Queues und explizitem -Locking löste diese Herausforderung – eine Lösung, die in ihrer -Eleganz bestach. +Locking löste diese Herausforderung mit einer technisch eleganten +Architektur. ## 2.7 Planung der IT-Sicherheitsmaßnahmen @@ -609,23 +617,26 @@ iterativen, problemgetriebenen Herangehensweise. ### 3.1.1 Datenabfrage der Sensoren Die "Sensoren" in diesem Kontext waren die Smart-Plugs – eine -euphemistische Bezeichnung für Geräte, die sich als erstaunlich -widerspenstig erwiesen. Meine erste Hoffnung, ein bestehendes -Python-Modul zur Steuerung zu finden, zerschlug sich schnell. -Das gefundene Modul funktionierte schlicht nicht. +euphemistische Bezeichnung für Geräte, die sich als technisch +anspruchsvoll in der Integration erwiesen. Meine initiale Recherche nach +einem geeigneten Python-Modul zur Steuerung verlief erfolglos. Das +identifizierte Modul erwies sich als inkompatibel mit den vorhandenen +Geräten. -Also Plan B: Wireshark. Ich schnitt den Netzwerkverkehr zwischen -TAPO-App und Smart-Plugs mit. Die Analyse offenbarte das komplexe -Authentifizierungsprotokoll der TAPO-Geräte – verschlüsselte -Kommunikation mit Session-Tokens, die sich bei jeder Anmeldung -änderten. Die Verschlüsselung basierte auf einer Kombination aus -RSA und AES. Respektabel für Consumer-Hardware, aber auch verdammt -nervig für meine Zwecke. +Daraufhin erfolgte eine Protokollanalyse mittels Wireshark. Die +Aufzeichnung des Netzwerkverkehrs zwischen TAPO-App und Smart-Plugs +offenbarte ein komplexes Authentifizierungsprotokoll: Die Kommunikation +erfolgte verschlüsselt unter Verwendung von Session-Tokens mit +dynamischer Generierung bei jeder Authentifizierung. Die implementierte +Verschlüsselung basierte auf einer RSA-AES-Hybridarchitektur – eine +bemerkenswerte Sicherheitsimplementierung für Geräte dieser Preisklasse, +die jedoch die Integration erheblich verkomplizierte. -Nach tagelangen Experimenten stieß ich endlich auf PyP100 – ein -Python-Modul, das die lokale Kommunikation mit den TAPO-Geräten -tatsächlich beherrschte. Versteckt in den Tiefen von GitHub, löste -es die Session-Key-Problematik elegant. Endlich. +Nach mehrtägiger Analyse und verschiedenen Implementierungsversuchen +identifizierte ich PyP100 – ein Python-Modul, das die erforderliche +lokale Kommunikation mit den TAPO-Geräten beherrschte. Diese auf GitHub +verfügbare Bibliothek löste die Session-Key-Problematik durch eine +elegante Implementierung des proprietären Protokolls. Die Implementierung der Datenabfrage erfolgte über eine selbstentwickelte Wrapper-Klasse, die die Komplexität der Kommunikation @@ -653,8 +664,10 @@ bei Fehlern. Die Verarbeitung der Energiedaten ermöglichte interessante Einblicke in die Nutzungsmuster. Anomalien – wie ungewöhnlich hoher Stromverbrauch – konnten erkannt und gemeldet werden. Diese Funktion, ursprünglich nicht -geplant, erwies sich als wertvolles Feature für die präventive Wartung; -ein glücklicher Zufall, der zur Kernfunktionalität wurde. +in der Projektspezifikation vorgesehen, entwickelte sich zu einem +wertvollen Feature für die präventive Wartung. Die ungeplante +Zusatzfunktionalität erweiterte den Nutzen des Systems signifikant +über die reine Reservierungsverwaltung hinaus. ## 3.2 Abweichung, Anpassung und Entscheidungen @@ -773,8 +786,10 @@ geprüft. Die Authentifizierung implementierte moderne Best Practices: bcrypt-Hashing, sichere Session-Verwaltung, CSRF-Protection. Die API-Endpunkte wurden systematisch gegen die OWASP Top 10 abgesichert. -Input-Validation erfolgte auf mehreren Ebenen – Client-seitig für UX, -Server-seitig für Sicherheit; Vertrauen ist gut, Kontrolle ist besser. +Input-Validation erfolgte auf mehreren Ebenen – Client-seitig für die +Benutzerfreundlichkeit, Server-seitig für die Sicherheit. Diese +mehrschichtige Validierung gewährleistete sowohl eine positive +Nutzererfahrung als auch robuste Sicherheit. Die Implementierung eines Rate-Limiters erschwerte Brute-Force-Angriffe. Nach fünf fehlgeschlagenen Login-Versuchen wurde diff --git a/backend/logs/myp-install-debug.log b/backend/logs/myp-install-debug.log index ed1edb0d..1ae9d42e 100644 --- a/backend/logs/myp-install-debug.log +++ b/backend/logs/myp-install-debug.log @@ -30,3 +30,43 @@ DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. Externe IP ermittelt über ifconfig.me: 163.116.179.142 --- +[2025-06-03 21:34:22] DEBUG von setup.sh:1168 +sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +--- + +[2025-06-03 21:34:22] DEBUG von setup.sh:1224 +Sysctl-Phase abgeschlossen - fahre mit Installation fort +--- + +[2025-06-03 21:34:22] DEBUG von setup.sh:1250 +systemd-networkd nicht aktiv - überspringe +--- + +[2025-06-03 21:34:23] DEBUG von setup.sh:1276 +NetworkManager nicht aktiv - überspringe +--- + +[2025-06-03 21:34:23] DEBUG von setup.sh:1282 +IPv6 Einträge in /etc/hosts auskommentiert +--- + +[2025-06-03 21:34:23] DEBUG von setup.sh:1299 +Netzwerk-Sicherheit ohne Blockierung abgeschlossen +--- + +[2025-06-03 21:36:04] DEBUG von setup.sh:1605 +SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp +--- + +[2025-06-03 21:36:06] DEBUG von setup.sh:1713 +SSL-Konfiguration abgeschlossen ohne hängende Prozesse +--- + +[2025-06-03 21:36:07] DEBUG von setup.sh:998 +flask erfolgreich importiert +--- + +[2025-06-03 21:36:08] DEBUG von setup.sh:998 +requests erfolgreich importiert +--- + diff --git a/backend/logs/myp-install.log b/backend/logs/myp-install.log index cf7d35a7..61ceb386 100644 --- a/backend/logs/myp-install.log +++ b/backend/logs/myp-install.log @@ -42,3 +42,154 @@ System: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 [DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142 [2025-06-03 21:34:04] === KONFIGURIERE HOSTNAME === [2025-06-03 21:34:04] ✅ Hostname bereits korrekt: 'raspberrypi' +[2025-06-03 21:34:14] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 +[2025-06-03 21:34:14] === ROBUSTE SYSTEM-UPDATE === +[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit... +[FORTSCHRITT] Validiere APT-Repositories... +[2025-06-03 21:34:14] ✅ Source-Repositories deaktiviert (nicht benötigt) +[FORTSCHRITT] Aktualisiere Paketlisten mit Retry... +[FORTSCHRITT] Führe System-Upgrade durch... +[FORTSCHRITT] Installiere essenzielle System-Tools... +[FORTSCHRITT] Installiere Pakete: ca-certificates +[FORTSCHRITT] Installiere Pakete: gnupg +[FORTSCHRITT] Installiere Pakete: curl +[FORTSCHRITT] Installiere Pakete: wget +[FORTSCHRITT] Installiere Pakete: git +[FORTSCHRITT] Installiere Pakete: nano +[FORTSCHRITT] Installiere Pakete: htop +[FORTSCHRITT] Installiere Pakete: rsync +[FORTSCHRITT] Installiere Pakete: unzip +[FORTSCHRITT] Installiere Pakete: sudo +[FORTSCHRITT] Installiere Pakete: systemd +[FORTSCHRITT] Installiere Pakete: lsb-release +[FORTSCHRITT] Installiere Pakete: apt-transport-https +[FORTSCHRITT] Installiere Pakete: software-properties-common +[FORTSCHRITT] Installiere Pakete: bc +[FORTSCHRITT] Installiere Pakete: dbus +[FORTSCHRITT] Installiere Pakete: systemd-timesyncd +[FORTSCHRITT] Synchronisiere Systemzeit... +[2025-06-03 21:34:22] ✅ Robustes System-Update abgeschlossen +[2025-06-03 21:34:22] === KONFIGURIERE OPTIONALE NETZWERK-SICHERHEIT === +[FORTSCHRITT] Deaktiviere IPv6 (robust)... +[FORTSCHRITT] Deaktiviere IPv6 in GRUB... +[INFO] IPv6 bereits in GRUB deaktiviert +[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration... +[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt +[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[FORTSCHRITT] OPTIONAL: Versuche sysctl-Einstellungen anzuwenden... +[ERFOLG] ✅ MYP sysctl-Einstellungen angewendet +[DEBUG] Sysctl-Phase abgeschlossen - fahre mit Installation fort +[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)... +[DEBUG] systemd-networkd nicht aktiv - überspringe +[DEBUG] NetworkManager nicht aktiv - überspringe +[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert +[2025-06-03 21:34:23] ✅ Optionale Netzwerk-Sicherheit konfiguriert: +[2025-06-03 21:34:23] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[2025-06-03 21:34:23] ⚙️ Einstellungen werden beim nächsten Boot aktiv +[2025-06-03 21:34:23] 🔧 Netzwerk-Konfiguration vorbereitet +[INFO] 💡 Tipp: Netzwerk-Sicherheit kann manuell aktiviert werden: +[INFO] → sudo sysctl -p /etc/sysctl.d/99-myp-security.conf +[INFO] → Oder automatisch beim nächsten Neustart +[DEBUG] Netzwerk-Sicherheit ohne Blockierung abgeschlossen +[2025-06-03 21:34:23] === ROBUSTE PYTHON-INSTALLATION === +[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten... +[FORTSCHRITT] Installiere Pakete: python3 +[FORTSCHRITT] Installiere Pakete: python3-pip +[FORTSCHRITT] Installiere Pakete: python3-dev +[FORTSCHRITT] Installiere Pakete: python3-setuptools +[FORTSCHRITT] Installiere Pakete: python3-venv +[FORTSCHRITT] Installiere Pakete: python3-wheel +[FORTSCHRITT] Installiere Pakete: build-essential +[FORTSCHRITT] Installiere Pakete: libssl-dev +[FORTSCHRITT] Installiere Pakete: libffi-dev +[FORTSCHRITT] Installiere Pakete: libbz2-dev +[FORTSCHRITT] Installiere Pakete: libreadline-dev +[FORTSCHRITT] Installiere Pakete: libsqlite3-dev +[FORTSCHRITT] Installiere Pakete: libncurses5-dev +[FORTSCHRITT] Installiere Pakete: libncursesw5-dev +[FORTSCHRITT] Installiere Pakete: zlib1g-dev +[FORTSCHRITT] Installiere Pakete: sqlite3 +[FORTSCHRITT] Validiere Python-Installation... +[2025-06-03 21:34:28] ✅ Python Version: 3.11.2 +[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit... +[FORTSCHRITT] Erstelle systemweite pip-Konfiguration... +[FORTSCHRITT] Konfiguriere pip für alle Benutzer... +[2025-06-03 21:34:28] ✅ pip konfiguriert für Benutzer: user +[FORTSCHRITT] Aktualisiere pip mit Retry... +[2025-06-03 21:34:29] ✅ pip Version: 25.1.1 +[2025-06-03 21:34:29] ✅ Robuste Python-Umgebung installiert +[2025-06-03 21:34:29] === ROBUSTE NODE.JS UND NPM INSTALLATION === +[FORTSCHRITT] Bereinige alte Node.js-Installationen... +[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie... +[FORTSCHRITT] Verwende Debian Repository als Fallback... +[FORTSCHRITT] Installiere Pakete: nodejs npm +[2025-06-03 21:36:00] ✅ Node.js via Debian Repository installiert +[FORTSCHRITT] Validiere Node.js Installation... +[2025-06-03 21:36:00] ✅ Node.js Version: v18.19.0 +[2025-06-03 21:36:01] ✅ npm Version: 9.2.0 +[FORTSCHRITT] Optimiere npm-Konfiguration... +[2025-06-03 21:36:02] ✅ Node.js und npm erfolgreich installiert +[2025-06-03 21:36:02] === TIMEOUT-GESICHERTE SSL-ZERTIFIKATE KONFIGURATION === +[FORTSCHRITT] Installiere SSL-Grundkomponenten... +[FORTSCHRITT] Installiere Pakete: ca-certificates openssl +[FORTSCHRITT] Aktualisiere CA-Zertifikate (timeout-gesichert)... +[ERFOLG] ✅ CA-Zertifikate erfolgreich aktualisiert +[DEBUG] SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp +[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (timeout-gesichert)... +[FORTSCHRITT] Lade CA-Zertifikate nach Mercedes-Import neu (timeout-gesichert)... +[ERFOLG] ✅ Mercedes-Zertifikate erfolgreich in CA-Store integriert +[FORTSCHRITT] Konfiguriere SSL-Umgebungsvariablen... +[FORTSCHRITT] Validiere SSL-Konfiguration... +[2025-06-03 21:36:06] ✅ SSL-Zertifikate verfügbar: 144 CA-Zertifikate +[FORTSCHRITT] Finalisiere SSL-Konfiguration... +[2025-06-03 21:36:06] ✅ SSL-Zertifikate timeout-gesichert konfiguriert +[DEBUG] SSL-Konfiguration abgeschlossen ohne hängende Prozesse +[2025-06-03 21:36:06] === PYTHON-PAKETE INSTALLATION === +[FORTSCHRITT] Installiere Python-Pakete... +[FORTSCHRITT] Installiere requirements.txt... +[ERFOLG] ✅ requirements.txt erfolgreich installiert +[FORTSCHRITT] Validiere essenzielle Python-Module... +[DEBUG] flask erfolgreich importiert +[DEBUG] requests erfolgreich importiert +[ERFOLG] ✅ Essenzielle Python-Module verfügbar +[2025-06-03 21:36:08] ✅ Python-Pakete Installation abgeschlossen +[FORTSCHRITT] Zeige installierte Python-Pakete... +[2025-06-03 21:36:08] === ROBUSTES ANWENDUNGS-DEPLOYMENT === +[FORTSCHRITT] Erstelle sicheres Zielverzeichnis: /opt/myp +[FORTSCHRITT] Validiere Source-Dateien... +[FORTSCHRITT] Kopiere Anwendungsdateien (robust)... +[FORTSCHRITT] Kopiere kritische Datei: app.py +[ERFOLG] ✅ app.py erfolgreich kopiert +[FORTSCHRITT] Kopiere kritische Datei: models.py +[ERFOLG] ✅ models.py erfolgreich kopiert +[FORTSCHRITT] Kopiere kritische Datei: requirements.txt +[ERFOLG] ✅ requirements.txt erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: blueprints +[ERFOLG] ✅ blueprints erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: config +[ERFOLG] ✅ config erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: database +[ERFOLG] ✅ database erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: static +[ERFOLG] ✅ static erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: templates +[ERFOLG] ✅ templates erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: uploads +[ERFOLG] ✅ uploads erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: utils +[ERFOLG] ✅ utils erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: logs +[ERFOLG] ✅ logs erfolgreich kopiert +[FORTSCHRITT] Kopiere Verzeichnis: certs +[ERFOLG] ✅ certs erfolgreich kopiert +[FORTSCHRITT] Kopiere optionale Datei: package.json +[FORTSCHRITT] Kopiere optionale Datei: package-lock.json +[FORTSCHRITT] Kopiere optionale Datei: tailwind.config.js +[FORTSCHRITT] Kopiere optionale Datei: postcss.config.js +[FORTSCHRITT] Kopiere optionale Datei: README.md +[FORTSCHRITT] Erstelle Verzeichnisstruktur... +[FORTSCHRITT] Setze sichere Berechtigungen... +[FORTSCHRITT] Konfiguriere robuste Python-Umgebung... +[2025-06-03 21:36:18] ✅ Python-Pfad konfiguriert: /usr/local/lib/python3.11/dist-packages/myp-app.pth +[FORTSCHRITT] Konfiguriere Umgebungsvariablen... +[FORTSCHRITT] Aktualisiere Bash-Profile...