📚 Improved IHK Projektdokumentation and logs for better clarity & error handling in backend installation process. 🖥️🔍
This commit is contained in:
parent
d861cf3312
commit
690aa8835e
@ -131,65 +131,65 @@ Gesamtinfrastruktur
|
||||
|
||||
[4.4 Abnahme [15](#abnahme)](#abnahme)
|
||||
|
||||
[Anlagen [15](#anlagen)](#anlagen)
|
||||
# Anlagen
|
||||
|
||||
[Netzwerkdiagramme und Systemarchitektur
|
||||
[15](#netzwerkdiagramme-und-systemarchitektur)](#netzwerkdiagramme-und-systemarchitektur)
|
||||
## Netzwerkdiagramme und Systemarchitektur
|
||||
|
||||
[API-Dokumentation [15](#api-dokumentation)](#api-dokumentation)
|
||||
(Inklusive Zenmap-Visualisierung der DNS-Problematik)
|
||||
|
||||
[Benutzerhandbuch [16](#benutzerhandbuch)](#benutzerhandbuch)
|
||||
## API-Dokumentation
|
||||
|
||||
[Testprotokolle [16](#testprotokolle)](#testprotokolle)
|
||||
## Benutzerhandbuch
|
||||
|
||||
[Screenshots der Benutzeroberfläche
|
||||
[16](#screenshots-der-benutzeroberfläche)](#screenshots-der-benutzeroberfläche)
|
||||
## Testprotokolle
|
||||
|
||||
[Konfigurationsdateien und Deployment-Skripte
|
||||
[16](#konfigurationsdateien-und-deployment-skripte)](#konfigurationsdateien-und-deployment-skripte)
|
||||
## Screenshots der Benutzeroberfläche
|
||||
|
||||
## Konfigurationsdateien und Deployment-Skripte
|
||||
|
||||
# 1. Einleitung
|
||||
|
||||
## 1.1 Analyse des Projektauftrages
|
||||
|
||||
Die Technische Berufsausbildungsstätte (TBA) der Mercedes-Benz AG am
|
||||
Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller
|
||||
(Prusa, Anycubic; B-Ware im Vergleich zu 3D-Druckern von Kostenstellen
|
||||
höherer Prioriät sozusagen). Diese Geräte stellen eine wichtige
|
||||
Ressource für die praktische Ausbildung dar, weisen jedoch erhebliche
|
||||
technische Limitierungen auf; beispielsweise verfügen die Drucker weder
|
||||
über Funk- noch Netzwerkschnittstellen oder andere gesamteinheitliche
|
||||
Steuerungsmöglichkeiten. Diese technischen Einschränkungen verhinderten
|
||||
bislang eine koordinierte digitale Verwaltung und eine damit
|
||||
einhergehende Übersicht von Reservierungen und Nutzungsplänen der
|
||||
Azubis.
|
||||
Standort Berlin verfügt über sechs 3D-Drucker verschiedener Hersteller –
|
||||
Prusa, Anycubic. B-Ware im Vergleich zu 3D-Druckern von Kostenstellen
|
||||
höherer Priorität, aber für unsere Zwecke vollkommen ausreichend. Diese
|
||||
Geräte stellen eine wichtige Ressource für die praktische Ausbildung dar,
|
||||
weisen jedoch erhebliche technische Limitierungen auf: Die Drucker
|
||||
verfügen weder über Funk- noch Netzwerkschnittstellen, geschweige denn
|
||||
über andere gesamteinheitliche Steuerungsmöglichkeiten. Diese technischen
|
||||
Einschränkungen verhinderten bislang eine koordinierte digitale
|
||||
Verwaltung und damit auch jegliche Übersicht von Reservierungen und
|
||||
Nutzungsplänen.
|
||||
|
||||
Das bestehende 'Reservierungssystem' - wenn man es nun so nennen kann -
|
||||
basierte auf einem analogen Whiteboard, welches neben den Druckern
|
||||
positioniert war. Dies führte zu systematischen Problemen:
|
||||
Doppelbuchungen traten regelmäßig auf, wenn mehrere Nutzer zeitgleich
|
||||
Reservierungen vornahmen, die manuelle Aktivierung und Deaktivierung der
|
||||
Geräte wurde häufig versäumt - was zu unnötigem Energieverbrauch und
|
||||
erhöhtem Verschleiß führte - und eine verlässliche Dokumentation der
|
||||
tatsächlichen Nutzungszeiten existierte nicht, wodurch weder
|
||||
aussagekräftige Betätigungs- und Verantwortungszuordnung (bspw. für
|
||||
Aufräumarbeiten), noch eine verursachungsgerechte Kostenzuordnung
|
||||
möglich waren.
|
||||
Das bestehende 'Reservierungssystem' – wenn man ein analoges Whiteboard
|
||||
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
|
||||
verursachungsgerechte Kostenzuordnung waren möglich.
|
||||
|
||||
Ein erstmaliger Lösungsansatz durch den ehemaligen Auszubildenden Torben
|
||||
Haack hatte einen vielversprechenden Frontend-Prototyp auf Basis von
|
||||
Next.js hervorgebracht. Der Prototyp verfügte über eine moderne
|
||||
Benutzeroberfläche und gute Analysefunktionen, allerdings jedoch fehlte
|
||||
ganz fundamental die essentielle Backend-Funktionalität; ohne dies blieb
|
||||
die auf Prototypen-basierende Projektarbeit des Torben Haacks in der
|
||||
praktischen Anwendung ohne jegliche Funktion. Ich sah für mich also die
|
||||
Chance, die Idee hinter dem Prototypen aufzugreifen und mich ihrer im
|
||||
Rahmen meiner hier dargelegten Projektarbeit anzunehmen, da ich sofort
|
||||
mehrere Möglichkeiten zur Einbringung meiner Fachrichtung identifizieren
|
||||
konnte und ich keine notwendige Obligation - wie bei anderen
|
||||
Projektmöglichkeiten die sich mir boten - verspürte, sondern einen
|
||||
Anflug von Ideen, Tatendrang und intrinsischer Motivation; sprich: es
|
||||
kitzelte meine Leidenschaft.
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
## 1.2 Ableitung der Projektziele
|
||||
|
||||
@ -238,13 +238,24 @@ erfordert, die weder zeitlich noch wirtschaftlich vertretbar gewesen
|
||||
wären – ganz zu schweigen von den Garantieverlusten, die solche
|
||||
Eingriffe unweigerlich nach sich gezogen hätten.
|
||||
|
||||
Ebenfalls nicht Teil des Projekts war die Integration in übergeordnete
|
||||
ERP-Systeme oder das unternehmensweite Intranet. Diese Anbindungen
|
||||
hätten zusätzliche Genehmigungsprozesse und Sicherheitsprüfungen
|
||||
erfordert, die den Projektrahmen bei weitem überschritten hätten.
|
||||
Die Integration in das unternehmensweite Intranet war ursprünglich fest
|
||||
eingeplant – ein Vorhaben, das sich als verhängnisvoller Trugschluss
|
||||
erweisen sollte. Zur Projektmitte hatte ich die bereits genehmigten
|
||||
SSL-Zertifikate des Haack'schen Prototyps durch einen unglücklichen
|
||||
Neuinstallationsprozess unwiederbringlich gelöscht; ein Moment des
|
||||
Schreckens, der die gesamte Projektplanung ins Wanken brachte. Immerhin
|
||||
war ich so weit gekommen, dass ich vom Frontend aus den GitHub
|
||||
OAuth-Zertifizierungsmechanismus ansteuern konnte – doch eine uns im
|
||||
E-Mail-Verkehr zuvor mitgeteilte IP-Adresse war aus irgendeinem Grund im
|
||||
DNS nicht mehr richtig zugeordnet, wie ich mit Zenmap herausfand. Die
|
||||
Intranetanbindung blieb somit ausstehend; zum Zeitpunkt der Abgabe war
|
||||
sie aufgrund der Konzerngröße und der damit einhergehenden,
|
||||
entschleunigenden Formalitäten und Genehmigungsprozesse unvollkommen.
|
||||
Diese Anbindung hätte zusätzliche Sicherheitsprüfungen erfordert, die
|
||||
den bereits strapazierten Projektrahmen endgültig gesprengt hätten.
|
||||
Stattdessen wurde eine autarke Lösung entwickelt, die alle
|
||||
erforderlichen Funktionen lokal bereitstellt – ein Ansatz, der sich im
|
||||
Nachhinein als goldrichtig erweisen sollte.
|
||||
erforderlichen Funktionen lokal bereitstellt – ein Ansatz, der sich
|
||||
trotz der Rückschläge als gangbar erwies.
|
||||
|
||||
## 1.4 Projektumfeld
|
||||
|
||||
@ -289,9 +300,8 @@ 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 proprietäre API der Geräte war nicht nur
|
||||
undokumentiert, sondern verschleiert – ein Umstand, der
|
||||
erheblichen Reverse-Engineering-Aufwand erforderte.
|
||||
naiv. Die Geräte boten keine dokumentierte API – nur die proprietäre
|
||||
TAPO-App ermöglichte die Steuerung. Das war ein Problem.
|
||||
|
||||
## 1.6 Analyse der IT-sicherheitsrelevante Bedingungen
|
||||
|
||||
@ -306,25 +316,30 @@ Lösungsansätzen zwang.
|
||||
Die Authentifizierung und Autorisierung musste robust implementiert
|
||||
werden, ohne die Benutzerfreundlichkeit zu beeinträchtigen – ein
|
||||
klassisches Dilemma der IT-Sicherheit. Die Entscheidung für
|
||||
bcrypt-basiertes Password-Hashing mit einem Cost-Faktor von 12 stellte
|
||||
einen vernünftigen Kompromiss zwischen Sicherheit und Performance auf
|
||||
dem ressourcenbeschränkten Raspberry Pi dar.
|
||||
bcrypt-basiertes Password-Hashing stellte einen vernünftigen Kompromiss
|
||||
zwischen Sicherheit und Performance auf dem ressourcenbeschränkten
|
||||
Raspberry Pi dar; die Details der Implementierung überließ ich –
|
||||
naturgemäß außerhalb meiner Kernkompetenz der digitalen Vernetzung
|
||||
liegend – der bewährten Flask-Login-Bibliothek.
|
||||
|
||||
Besondere Aufmerksamkeit erforderte die Absicherung der API-Endpunkte.
|
||||
Jeder Endpunkt musste gegen gängige Angriffsvektoren wie SQL-Injection,
|
||||
Cross-Site-Scripting und CSRF-Attacken geschützt werden. Die
|
||||
Implementierung eines Rate-Limiting-Mechanismus verhindert zudem
|
||||
Implementierung eines Rate-Limiting-Mechanismus erschwert
|
||||
Brute-Force-Angriffe auf die Authentifizierungsschnittstelle – eine
|
||||
Maßnahme, die sich später als weitsichtig erweisen sollte.
|
||||
Maßnahme, die zwar keinen absoluten Schutz bietet, aber die Hürde für
|
||||
Angreifer signifikant erhöht.
|
||||
|
||||
## 1.7 Darstellung der vorhandenen Systemarchitektur
|
||||
|
||||
Die vorgefundene Systemarchitektur – wenn man sie denn überhaupt so
|
||||
nennen möchte – bestand aus isolierten Komponenten ohne jegliche
|
||||
Integration. Die 3D-Drucker operierten als Insellösungen, verbunden
|
||||
lediglich durch ihre physische Nähe und das gemeinsame Whiteboard. Der
|
||||
Frontend-Prototyp von Torben Haack existierte als Docker-Container auf
|
||||
einem Entwicklungsserver, ohne Anbindung an reale Daten oder Funktionen.
|
||||
Die vorgefundene Systemarchitektur – möchte man sie überhaupt so nennen –
|
||||
bestand aus diffusen Komponenten ohne jegliche Integration. Die
|
||||
3D-Drucker operierten als Insellösungen, verbunden lediglich durch ihre
|
||||
physische Nähe und das gemeinsame Whiteboard. Der Frontend-Prototyp von
|
||||
Torben Haack existierte als Docker-Container auf einem
|
||||
Entwicklungsserver, operativ maximal auf ein Testnetzwerk begrenzt ohne
|
||||
jegliche praktische Integration – ohne Anbindung an reale Daten oder
|
||||
Funktionen.
|
||||
|
||||
Die Netzwerkinfrastruktur der TBA basierte auf einem segmentierten
|
||||
Ansatz mit verschiedenen VLANs für unterschiedliche Geräteklassen. Die
|
||||
@ -338,7 +353,15 @@ erforderlich war. Die Lösung musste die isolierten Komponenten zu einem
|
||||
kohärenten System verbinden, ohne dabei die bestehenden
|
||||
Sicherheitsrichtlinien zu verletzen. Der gewählte Ansatz – die Steuerung
|
||||
über Smart-Plugs – stellte einen eleganten Kompromiss zwischen
|
||||
technischer Machbarkeit und praktischem Nutzen dar.
|
||||
technischer Machbarkeit und praktischem Nutzen dar; eine Entscheidung,
|
||||
die nicht zuletzt auf meiner privaten Erfahrung mit TAPO-Geräten
|
||||
basierte. In meiner privat geführten Infrastruktur hatte ich bereits
|
||||
TAPO-Geräte aller Art integriert – stets ging dies recht schnell und
|
||||
einfach vonstatten. Privat nutzte ich ebenfalls Air-Gapped-Networks
|
||||
hierfür, jedoch mit dem entscheidenden Unterschied, nicht mit der
|
||||
eigenständigen programmatischen Integration eben jener Geräte als
|
||||
Hauptkomponente beauftragt zu sein; ein Unterschied, der sich als
|
||||
gravierend herausstellen sollte.
|
||||
|
||||
# 2. Projektplanung
|
||||
|
||||
@ -437,6 +460,13 @@ nicht nur Unabhängigkeit von proprietären Lösungen, sondern erfüllte
|
||||
auch die strikte Offline-Anforderung des Projekts – ein Umstand, der
|
||||
sich als Segen erwies.
|
||||
|
||||
Als Betriebssystem stand zunächst eine Entscheidung zwischen OpenSUSE
|
||||
und NixOS im Raum – wir hatten uns bereits gedanklich auf NixOS
|
||||
festgelegt, da es durch seine deklarative Konfiguration für diesen
|
||||
Einsatzzweck prädestiniert schien. Letztendlich entschied ich mich doch
|
||||
für Raspbian, um nicht unnötig zu experimentieren und die knapp bemessene
|
||||
Zeit effizient zu nutzen; Pragmatismus über technische Eleganz.
|
||||
|
||||
## 2.3 Planung der Qualitätssicherung
|
||||
|
||||
Das Qualitätssicherungskonzept orientierte sich am V-Modell. Für jede
|
||||
@ -499,25 +529,23 @@ 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 erfolgte über das proprietäre
|
||||
TP-Link-Protokoll, das auf HTTP basiert. Die anfänglichen Versuche, die
|
||||
offizielle Cloud-API zu nutzen, scheiterten an den
|
||||
Sicherheitsrichtlinien. Die Entdeckung, dass die Geräte auch eine lokale
|
||||
API anboten, war ein Durchbruch – allerdings einer, der erheblichen
|
||||
Reverse-Engineering-Aufwand erforderte.
|
||||
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.
|
||||
|
||||
Hier kam Wireshark ins Spiel. Zusammen mit der TAPO-App analysierte ich
|
||||
den Netzwerkverkehr, um das Kommunikationsprotokoll zu entschlüsseln.
|
||||
Die Erkenntnis, dass ein Session-Key erforderlich war, der sich bei
|
||||
jeder Anmeldung änderte, verkomplizierte die Integration erheblich.
|
||||
Zunächst versuchte ich, diesen Key manuell abzufangen und in meine
|
||||
Anwendung zu integrieren – ein Ansatz, der funktionierte, aber
|
||||
offensichtlich nicht praxistauglich war.
|
||||
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.
|
||||
|
||||
Nach tagelangen Experimenten und zahllosen Fehlversuchen stieß ich auf
|
||||
ein alternatives Python-Modul, das die lokale Kommunikation mit den
|
||||
TAPO-Geräten ermöglichte. Dieses Modul – versteckt in den Tiefen von
|
||||
GitHub – löste die Session-Key-Problematik elegant und ermöglichte eine
|
||||
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.
|
||||
|
||||
## 2.6 Planung der Prozess-/ und Systemschnittstellen
|
||||
@ -582,24 +610,24 @@ iterativen, problemgetriebenen Herangehensweise.
|
||||
|
||||
Die "Sensoren" in diesem Kontext waren die Smart-Plugs – eine
|
||||
euphemistische Bezeichnung für Geräte, die sich als erstaunlich
|
||||
widerspenstig erwiesen. Die initiale Annahme, dass die PyP100-Bibliothek
|
||||
out-of-the-box funktionieren würde, zerschlug sich an der Realität der
|
||||
proprietären TP-Link-Implementation.
|
||||
widerspenstig erwiesen. Meine erste Hoffnung, ein bestehendes
|
||||
Python-Modul zur Steuerung zu finden, zerschlug sich schnell.
|
||||
Das gefundene Modul funktionierte schlicht nicht.
|
||||
|
||||
Der erste Ansatz – die Nutzung der dokumentierten Cloud-API – scheiterte
|
||||
an den Sicherheitsrichtlinien. Der zweite Ansatz – die direkte lokale
|
||||
Kommunikation – scheiterte an der fehlenden Dokumentation. Erst der
|
||||
dritte Ansatz – Reverse Engineering mittels Wireshark – führte zum
|
||||
Durchbruch.
|
||||
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.
|
||||
|
||||
Die Wireshark-Analyse offenbarte das komplexe
|
||||
Authentifizierungsprotokoll der TAPO-Geräte. Jede Kommunikation
|
||||
erforderte einen verschlüsselten Handshake, gefolgt von einem
|
||||
Session-Token, der für alle weiteren Operationen benötigt wurde. Die
|
||||
Verschlüsselung basierte auf einer Kombination aus RSA und AES –
|
||||
durchaus respektabel für Consumer-Hardware.
|
||||
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.
|
||||
|
||||
Die Implementierung der Datenabfrage erfolgte schließlich über eine
|
||||
Die Implementierung der Datenabfrage erfolgte über eine
|
||||
selbstentwickelte Wrapper-Klasse, die die Komplexität der Kommunikation
|
||||
kapselte. Retry-Mechanismen mit exponentieller Backoff-Strategie sorgten
|
||||
für Robustheit bei Netzwerkproblemen. Die Abfrage umfasste nicht nur den
|
||||
@ -645,16 +673,19 @@ konsolidieren, vereinfachte nicht nur die Architektur, sondern
|
||||
reduzierte auch Kosten und Stromverbrauch.
|
||||
|
||||
Der versehentliche Verlust der SSL-Zertifikate während einer
|
||||
Neuinstallation führte zur Implementierung
|
||||
eines robusten Backup-Systems. Kritische Konfigurationsdateien werden nun dreifach
|
||||
gesichert.
|
||||
Neuinstallation führte zur Implementierung eines robusten Backup-Systems.
|
||||
Kritische Konfigurationsdateien werden nun dreifach gesichert – eine
|
||||
Lektion, die schmerzhaft gelernt wurde. Der Verlust der bereits
|
||||
genehmigten Zertifikate des Haack'schen Prototyps zur Projektmitte war
|
||||
ein Moment des Schreckens; die mühsam erkämpften Genehmigungen, die
|
||||
etablierten Vertrauensstellungen – alles dahin durch einen unbedachten
|
||||
Moment während der Systemkonfiguration.
|
||||
|
||||
Die Entscheidung, von der komplexen PyP100-Integration zu einem
|
||||
alternativen Modul zu wechseln, fiel nach tagelangen frustrierenden
|
||||
Debugging-Sessions. Der Stolz, es "richtig" machen zu wollen, wich dem
|
||||
Pragmatismus, eine funktionierende Lösung zu liefern. Das gefundene
|
||||
Alternative Modul – ironischerweise simpler und stabiler – rettete das
|
||||
Projekt.
|
||||
Die Entscheidung, von meinem ersten Python-Modul-Versuch zu PyP100 zu
|
||||
wechseln, fiel nach tagelangen frustrierenden Debugging-Sessions. Der
|
||||
Stolz, es mit dem ersten Modul schaffen zu wollen, wich dem Pragmatismus,
|
||||
eine funktionierende Lösung zu liefern. PyP100 – ironischerweise simpler
|
||||
und stabiler – rettete das Projekt.
|
||||
|
||||
## 3.3 Maßnahmen zur Qualitätskontrolle
|
||||
|
||||
@ -704,7 +735,7 @@ für die Offline-Anforderung.
|
||||
Der Scheduler wurde als eigenständiger Thread implementiert, der beim
|
||||
Anwendungsstart initialisiert wurde. Die Kommunikation mit dem
|
||||
Hauptthread erfolgte über thread-sichere Queues. Diese Architektur
|
||||
ermöglichte asynchrone Hardware-Operationen ohne Blockierung der
|
||||
ermöglicht asynchrone Hardware-Operationen ohne Blockierung der
|
||||
Web-Requests.
|
||||
|
||||
## 3.5 Konfiguration von Übertragungssystemen und Integration in die Gesamtinfrastruktur
|
||||
@ -721,10 +752,11 @@ erheblich, aber notwendig für die Compliance.
|
||||
|
||||
Die SSL-Konfiguration mit selbstsignierten Zertifikaten war ein
|
||||
notwendiges Übel. Ohne Internet-Zugang war Let's Encrypt keine Option.
|
||||
Die Zertifikate wurden mit allen relevanten SANs (Subject Alternative
|
||||
Names) generiert, um Kompatibilitätsprobleme zu vermeiden. Die
|
||||
Browser-Warnungen wurden durch eine dokumentierte Prozedur zur
|
||||
Zertifikats-Installation umgangen – nicht elegant, aber funktional.
|
||||
Die Zertifikate wurden mit OpenSSL generiert und mit allen relevanten
|
||||
SANs (Subject Alternative Names) versehen, um Kompatibilitätsprobleme zu
|
||||
vermeiden. Die Browser-Warnungen wurden durch eine dokumentierte
|
||||
Prozedur zur Zertifikats-Installation umgangen – nicht elegant, aber
|
||||
funktional.
|
||||
|
||||
Die Integration der Smart-Plugs erforderte statische IP-Adressen –
|
||||
DHCP-Reservierungen waren in der Netzwerk-Policy nicht vorgesehen. Die
|
||||
@ -744,11 +776,11 @@ 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.
|
||||
|
||||
Die Implementierung eines Rate-Limiters verhinderte
|
||||
Die Implementierung eines Rate-Limiters erschwerte
|
||||
Brute-Force-Angriffe. Nach fünf fehlgeschlagenen Login-Versuchen wurde
|
||||
die IP-Adresse für 30 Minuten gesperrt – lang genug, um Angriffe
|
||||
unwirtschaftlich zu machen, kurz genug, um legitime Nutzer nicht
|
||||
übermäßig zu frustrieren; ein Balanceakt zwischen Sicherheit und
|
||||
unattraktiv zu machen, kurz genug, um legitime Nutzer nicht übermäßig zu
|
||||
frustrieren; ein Balanceakt zwischen Sicherheit und
|
||||
Benutzerfreundlichkeit.
|
||||
|
||||
DSGVO-Compliance wurde durch Privacy-by-Design erreicht.
|
||||
@ -789,6 +821,24 @@ Energiemonitorings. Diese ursprünglich nicht geplante Funktion
|
||||
ermöglicht detaillierte Einblicke in Nutzungsmuster und Energieverbrauch
|
||||
– wertvolle Daten für die Optimierung des Druckerbetriebs.
|
||||
|
||||
Für die programmatische Umsetzung des Frontends nahm ich gänzlich
|
||||
Unterstützung künstlicher Intelligenz zu Hilfe – mehr als absolut
|
||||
notwendig, um das Zeitlimit nicht um Längen zu überschreiten und die
|
||||
Profession meiner Fachrichtung einzuhalten. Die Frontend-Entwicklung lag
|
||||
außerhalb meines Kernkompetenzbereichs der digitalen Vernetzung; die
|
||||
KI-Assistenz ermöglichte es mir, mich auf die Backend-Integration und
|
||||
Hardware-Anbindung zu konzentrieren – meine eigentlichen Stärken.
|
||||
|
||||
Die Implementierung eines Kiosk-Modus für die Werkstatt-Terminals
|
||||
erforderte zusätzliche Systemkonfiguration: Openbox als minimalistisches
|
||||
Desktop-Environment, Chromium im Kiosk-Modus mit automatischem Start
|
||||
dreier Instanzen – eine auf Port 443, eine auf Port 80 als Fallback für
|
||||
die API, sowie eine lokale Instanz auf Port 5000 für den Kiosk-Modus.
|
||||
Die Mercedes Root-CA-Zertifikate mussten manuell installiert werden; ein
|
||||
Shell-Skript automatisierte diesen Prozess, eine systemd-Service-Datei
|
||||
gewährleistete den Autostart. FirewallD diente als Firewall-Service –
|
||||
eine weitere Ebene der Absicherung.
|
||||
|
||||
Die technischen Herausforderungen – insbesondere die
|
||||
Smart-Plug-Integration – erforderten mehr Zeit als geplant. Die
|
||||
investierte Mühe zahlte sich jedoch aus: Die finale Lösung ist robuster
|
||||
@ -889,17 +939,3 @@ chaotisch zu strukturiert, von manuell zu automatisiert ist vollbracht.
|
||||
Was als technische Herausforderung begann, endete als Erfolgsgeschichte – ein Beweis dafür, dass mit Kreativität, Durchhaltevermögen und einer
|
||||
Prise technischer Finesse auch scheinbar unlösbare Probleme gemeistert
|
||||
werden können.
|
||||
|
||||
# Anlagen
|
||||
|
||||
## Netzwerkdiagramme und Systemarchitektur
|
||||
|
||||
## API-Dokumentation
|
||||
|
||||
## Benutzerhandbuch
|
||||
|
||||
## Testprotokolle
|
||||
|
||||
## Screenshots der Benutzeroberfläche
|
||||
|
||||
## Konfigurationsdateien und Deployment-Skripte
|
||||
|
@ -1,72 +1,32 @@
|
||||
=================================================================
|
||||
MYP Installation DEBUG Log - 2025-06-03 20:57:58
|
||||
MYP Installation DEBUG Log - 2025-06-03 21:26:54
|
||||
=================================================================
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:449
|
||||
[2025-06-03 21:26:54] DEBUG von setup.sh:485
|
||||
Debian erkannt über /etc/debian_version: 12.11
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:517
|
||||
[2025-06-03 21:26:54] DEBUG von setup.sh:553
|
||||
Kein Raspberry Pi erkannt. Hardware-Info:
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:518
|
||||
[2025-06-03 21:26:54] DEBUG von setup.sh:554
|
||||
- Device Tree: nicht verfügbar
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:519
|
||||
[2025-06-03 21:26:54] DEBUG von setup.sh:555
|
||||
- CPU Hardware: nicht verfügbar
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:559
|
||||
Vollständige Kernel-Info: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux
|
||||
[2025-06-03 21:26:54] DEBUG von setup.sh:595
|
||||
Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:615
|
||||
[2025-06-03 21:26:56] DEBUG von setup.sh:651
|
||||
DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup.
|
||||
---
|
||||
|
||||
[2025-06-03 20:57:58] DEBUG von setup.sh:716
|
||||
[2025-06-03 21:26:56] DEBUG von setup.sh:752
|
||||
Externe IP ermittelt über ifconfig.me: 163.116.179.142
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1132
|
||||
sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1188
|
||||
Sysctl-Phase abgeschlossen - fahre mit Installation fort
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1214
|
||||
systemd-networkd nicht aktiv - überspringe
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1240
|
||||
NetworkManager nicht aktiv - überspringe
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1246
|
||||
IPv6 Einträge in /etc/hosts auskommentiert
|
||||
---
|
||||
|
||||
[2025-06-03 20:58:45] DEBUG von setup.sh:1263
|
||||
Netzwerk-Sicherheit ohne Blockierung abgeschlossen
|
||||
---
|
||||
|
||||
[2025-06-03 21:02:02] DEBUG von setup.sh:1569
|
||||
SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp
|
||||
---
|
||||
|
||||
[2025-06-03 21:02:07] DEBUG von setup.sh:1677
|
||||
SSL-Konfiguration abgeschlossen ohne hängende Prozesse
|
||||
---
|
||||
|
||||
[2025-06-03 21:02:50] DEBUG von setup.sh:962
|
||||
flask erfolgreich importiert
|
||||
---
|
||||
|
||||
[2025-06-03 21:02:50] DEBUG von setup.sh:962
|
||||
requests erfolgreich importiert
|
||||
---
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
=================================================================
|
||||
MYP Installation FEHLER Log - 2025-06-03 20:57:58
|
||||
MYP Installation FEHLER Log - 2025-06-03 21:26:54
|
||||
=================================================================
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
=================================================================
|
||||
MYP Installation WARNUNGEN Log - 2025-06-03 20:57:58
|
||||
MYP Installation WARNUNGEN Log - 2025-06-03 21:26:54
|
||||
=================================================================
|
||||
|
||||
|
@ -1,25 +1,25 @@
|
||||
=================================================================
|
||||
MYP Installation Log - 2025-06-03 20:57:58
|
||||
MYP Installation Log - 2025-06-03 21:26:54
|
||||
Script Version: 4.1.0
|
||||
System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux
|
||||
System: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux
|
||||
=================================================================
|
||||
|
||||
[0;32m[2025-06-03 20:57:58] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===[0m
|
||||
[0;32m[2025-06-03 20:57:58] ✅ Root-Berechtigung bestätigt[0m
|
||||
[0;32m[2025-06-03 20:57:58] === SYSTEM-RESSOURCEN PRÜFUNG ===[0m
|
||||
[0;32m[2025-06-03 21:26:54] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===[0m
|
||||
[0;32m[2025-06-03 21:26:54] ✅ Root-Berechtigung bestätigt[0m
|
||||
[0;32m[2025-06-03 21:26:54] === SYSTEM-RESSOURCEN PRÜFUNG ===[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe RAM...[0m
|
||||
[0;35m[FORTSCHRITT] Verfügbarer RAM: 15614MB[0m
|
||||
[0;36m[ERFOLG] ✅ Ausreichend RAM verfügbar (15614MB)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Festplattenplatz...[0m
|
||||
[0;35m[FORTSCHRITT] Verfügbarer Festplattenplatz: 13,2GB (13473MB)[0m
|
||||
[0;36m[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (13,2GB)[0m
|
||||
[0;35m[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,2GB (12473MB)[0m
|
||||
[0;36m[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,2GB)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe CPU...[0m
|
||||
[0;35m[FORTSCHRITT] CPU: 6 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz[0m
|
||||
[0;36m[ERFOLG] ✅ CPU-Information erfolgreich ermittelt[0m
|
||||
[0;32m[2025-06-03 20:57:58] ✅ System-Ressourcen-Prüfung abgeschlossen[0m
|
||||
[0;32m[2025-06-03 21:26:54] ✅ System-Ressourcen-Prüfung abgeschlossen[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Debian/Raspbian-System...[0m
|
||||
[0;34m[DEBUG] Debian erkannt über /etc/debian_version: 12.11[0m
|
||||
[0;32m[2025-06-03 20:57:58] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11)[0m
|
||||
[0;32m[2025-06-03 21:26:54] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Raspberry Pi Hardware...[0m
|
||||
[0;34m[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi)[0m
|
||||
[0;34m[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info:[0m
|
||||
@ -30,8 +30,8 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202
|
||||
[0;34m[INFO] → 64-Bit x86 Architektur erkannt[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Kernel-Version...[0m
|
||||
[0;34m[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64[0m
|
||||
[0;34m[DEBUG] Vollständige Kernel-Info: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux[0m
|
||||
[0;32m[2025-06-03 20:57:58] ✅ System-Analyse abgeschlossen[0m
|
||||
[0;34m[DEBUG] Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux[0m
|
||||
[0;32m[2025-06-03 21:26:54] ✅ System-Analyse abgeschlossen[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)...[0m
|
||||
[0;35m[FORTSCHRITT] Teste DNS-Auflösung...[0m
|
||||
[0;34m[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. [0m
|
||||
@ -40,158 +40,5 @@ System: Linux debian 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (202
|
||||
[0;35m[FORTSCHRITT] Ermittle externe IP-Adresse...[0m
|
||||
[0;34m[INFO] 🌐 Externe IP: 163.116.179.142[0m
|
||||
[0;34m[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.179.142[0m
|
||||
[0;32m[2025-06-03 20:57:58] === KONFIGURIERE HOSTNAME ===[0m
|
||||
[0;35m[FORTSCHRITT] Setze Hostname von 'debian' auf 'raspberrypi'...[0m
|
||||
[0;32m[2025-06-03 20:57:58] ✅ Hostname erfolgreich auf 'raspberrypi' gesetzt[0m
|
||||
[0;32m[2025-06-03 20:58:09] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1[0m
|
||||
[0;32m[2025-06-03 20:58:09] === ROBUSTE SYSTEM-UPDATE ===[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit...[0m
|
||||
[0;35m[FORTSCHRITT] Validiere APT-Repositories...[0m
|
||||
[0;32m[2025-06-03 20:58:09] ✅ Source-Repositories deaktiviert (nicht benötigt)[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere Paketlisten mit Retry...[0m
|
||||
[0;35m[FORTSCHRITT] Führe System-Upgrade durch...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere essenzielle System-Tools...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: gnupg[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: curl[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: wget[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: git[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: nano[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: htop[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: rsync[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: unzip[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: sudo[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: lsb-release[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: apt-transport-https[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: software-properties-common[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: bc[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: dbus[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd-timesyncd[0m
|
||||
[0;35m[FORTSCHRITT] Synchronisiere Systemzeit...[0m
|
||||
[0;32m[2025-06-03 20:58:40] ✅ Robustes System-Update abgeschlossen[0m
|
||||
[0;32m[2025-06-03 20:58:40] === KONFIGURIERE OPTIONALE NETZWERK-SICHERHEIT ===[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 (robust)...[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in GRUB...[0m
|
||||
[0;36m[ERFOLG] ✅ IPv6 in GRUB deaktiviert[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration...[0m
|
||||
[0;36m[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt[0m
|
||||
[0;34m[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;35m[FORTSCHRITT] OPTIONAL: Versuche sysctl-Einstellungen anzuwenden...[0m
|
||||
[0;36m[ERFOLG] ✅ MYP sysctl-Einstellungen angewendet[0m
|
||||
[0;34m[DEBUG] Sysctl-Phase abgeschlossen - fahre mit Installation fort[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)...[0m
|
||||
[0;34m[DEBUG] systemd-networkd nicht aktiv - überspringe[0m
|
||||
[0;34m[DEBUG] NetworkManager nicht aktiv - überspringe[0m
|
||||
[0;34m[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert[0m
|
||||
[0;32m[2025-06-03 20:58:45] ✅ Optionale Netzwerk-Sicherheit konfiguriert:[0m
|
||||
[0;32m[2025-06-03 20:58:45] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;32m[2025-06-03 20:58:45] ⚙️ Einstellungen werden beim nächsten Boot aktiv[0m
|
||||
[0;32m[2025-06-03 20:58:45] 🔧 Netzwerk-Konfiguration vorbereitet[0m
|
||||
[0;34m[INFO] 💡 Tipp: Netzwerk-Sicherheit kann manuell aktiviert werden:[0m
|
||||
[0;34m[INFO] → sudo sysctl -p /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;34m[INFO] → Oder automatisch beim nächsten Neustart[0m
|
||||
[0;34m[DEBUG] Netzwerk-Sicherheit ohne Blockierung abgeschlossen[0m
|
||||
[0;32m[2025-06-03 20:58:45] === ROBUSTE PYTHON-INSTALLATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-pip[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-setuptools[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-venv[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-wheel[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: build-essential[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libssl-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libffi-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libbz2-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libreadline-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libsqlite3-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncurses5-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncursesw5-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: zlib1g-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: sqlite3[0m
|
||||
[0;35m[FORTSCHRITT] Validiere Python-Installation...[0m
|
||||
[0;32m[2025-06-03 20:59:51] ✅ Python Version: 3.11.2[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit...[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle systemweite pip-Konfiguration...[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere pip für alle Benutzer...[0m
|
||||
[0;32m[2025-06-03 20:59:51] ✅ pip konfiguriert für Benutzer: user[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere pip mit Retry...[0m
|
||||
[0;32m[2025-06-03 20:59:55] ✅ pip Version: 25.1.1[0m
|
||||
[0;32m[2025-06-03 20:59:55] ✅ Robuste Python-Umgebung installiert[0m
|
||||
[0;32m[2025-06-03 20:59:55] === ROBUSTE NODE.JS UND NPM INSTALLATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Bereinige alte Node.js-Installationen...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie...[0m
|
||||
[0;35m[FORTSCHRITT] Verwende Debian Repository als Fallback...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: nodejs npm[0m
|
||||
[0;32m[2025-06-03 21:01:58] ✅ Node.js via Debian Repository installiert[0m
|
||||
[0;35m[FORTSCHRITT] Validiere Node.js Installation...[0m
|
||||
[0;32m[2025-06-03 21:01:58] ✅ Node.js Version: v18.19.0[0m
|
||||
[0;32m[2025-06-03 21:01:59] ✅ npm Version: 9.2.0[0m
|
||||
[0;35m[FORTSCHRITT] Optimiere npm-Konfiguration...[0m
|
||||
[0;32m[2025-06-03 21:02:01] ✅ Node.js und npm erfolgreich installiert[0m
|
||||
[0;32m[2025-06-03 21:02:01] === TIMEOUT-GESICHERTE SSL-ZERTIFIKATE KONFIGURATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Installiere SSL-Grundkomponenten...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates openssl[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere CA-Zertifikate (timeout-gesichert)...[0m
|
||||
[0;36m[ERFOLG] ✅ CA-Zertifikate erfolgreich aktualisiert[0m
|
||||
[0;34m[DEBUG] SSL-Verzeichnis erstellt: /usr/local/share/ca-certificates/myp[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (timeout-gesichert)...[0m
|
||||
[0;35m[FORTSCHRITT] Lade CA-Zertifikate nach Mercedes-Import neu (timeout-gesichert)...[0m
|
||||
[0;36m[ERFOLG] ✅ Mercedes-Zertifikate erfolgreich in CA-Store integriert[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere SSL-Umgebungsvariablen...[0m
|
||||
[0;35m[FORTSCHRITT] Validiere SSL-Konfiguration...[0m
|
||||
[0;32m[2025-06-03 21:02:06] ✅ SSL-Zertifikate verfügbar: 144 CA-Zertifikate[0m
|
||||
[0;35m[FORTSCHRITT] Finalisiere SSL-Konfiguration...[0m
|
||||
[0;36m[ERFOLG] ✅ Finale CA-Zertifikate Integration abgeschlossen[0m
|
||||
[0;32m[2025-06-03 21:02:07] ✅ SSL-Zertifikate timeout-gesichert konfiguriert[0m
|
||||
[0;34m[DEBUG] SSL-Konfiguration abgeschlossen ohne hängende Prozesse[0m
|
||||
[0;32m[2025-06-03 21:02:07] === PYTHON-PAKETE INSTALLATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Python-Pakete...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere requirements.txt...[0m
|
||||
[0;36m[ERFOLG] ✅ requirements.txt erfolgreich installiert[0m
|
||||
[0;35m[FORTSCHRITT] Validiere essenzielle Python-Module...[0m
|
||||
[0;34m[DEBUG] flask erfolgreich importiert[0m
|
||||
[0;34m[DEBUG] requests erfolgreich importiert[0m
|
||||
[0;36m[ERFOLG] ✅ Essenzielle Python-Module verfügbar[0m
|
||||
[0;32m[2025-06-03 21:02:50] ✅ Python-Pakete Installation abgeschlossen[0m
|
||||
[0;35m[FORTSCHRITT] Zeige installierte Python-Pakete...[0m
|
||||
[0;32m[2025-06-03 21:02:50] === ROBUSTES ANWENDUNGS-DEPLOYMENT ===[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle sicheres Zielverzeichnis: /opt/myp[0m
|
||||
[0;35m[FORTSCHRITT] Validiere Source-Dateien...[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Anwendungsdateien (robust)...[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: app.py[0m
|
||||
[0;36m[ERFOLG] ✅ app.py erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: models.py[0m
|
||||
[0;36m[ERFOLG] ✅ models.py erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere kritische Datei: requirements.txt[0m
|
||||
[0;36m[ERFOLG] ✅ requirements.txt erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: blueprints[0m
|
||||
[0;36m[ERFOLG] ✅ blueprints erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: config[0m
|
||||
[0;36m[ERFOLG] ✅ config erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: database[0m
|
||||
[0;36m[ERFOLG] ✅ database erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: static[0m
|
||||
[0;36m[ERFOLG] ✅ static erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: templates[0m
|
||||
[0;36m[ERFOLG] ✅ templates erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: uploads[0m
|
||||
[0;36m[ERFOLG] ✅ uploads erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: utils[0m
|
||||
[0;36m[ERFOLG] ✅ utils erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: logs[0m
|
||||
[0;36m[ERFOLG] ✅ logs erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere Verzeichnis: certs[0m
|
||||
[0;36m[ERFOLG] ✅ certs erfolgreich kopiert[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: package.json[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: package-lock.json[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: tailwind.config.js[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: postcss.config.js[0m
|
||||
[0;35m[FORTSCHRITT] Kopiere optionale Datei: README.md[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle Verzeichnisstruktur...[0m
|
||||
[0;35m[FORTSCHRITT] Setze sichere Berechtigungen...[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere robuste Python-Umgebung...[0m
|
||||
[0;32m[2025-06-03 21:03:16] ✅ Python-Pfad konfiguriert: /usr/local/lib/python3.11/dist-packages/myp-app.pth[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere Umgebungsvariablen...[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere Bash-Profile...[0m
|
||||
[0;32m[2025-06-03 21:26:56] === KONFIGURIERE HOSTNAME ===[0m
|
||||
[0;32m[2025-06-03 21:26:56] ✅ Hostname bereits korrekt: 'raspberrypi'[0m
|
||||
|
117
backend/setup.sh
117
backend/setup.sh
@ -11,6 +11,42 @@
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# =========================== KOMMANDOZEILEN-PARAMETER =======================
|
||||
# Erkenne Skip-Parameter
|
||||
SKIP_BASH_PROFILE=false
|
||||
SKIP_SYSTEMD=false
|
||||
SKIP_KIOSK=false
|
||||
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--skip-bash-profile)
|
||||
SKIP_BASH_PROFILE=true
|
||||
;;
|
||||
--skip-systemd)
|
||||
SKIP_SYSTEMD=true
|
||||
;;
|
||||
--skip-kiosk)
|
||||
SKIP_KIOSK=true
|
||||
;;
|
||||
--wsl|--dev)
|
||||
# WSL/Development-Modus: Überspringe systemspezifische Schritte
|
||||
SKIP_BASH_PROFILE=true
|
||||
SKIP_SYSTEMD=true
|
||||
SKIP_KIOSK=true
|
||||
echo "WSL/Development-Modus aktiviert - systemspezifische Schritte werden übersprungen"
|
||||
;;
|
||||
--help|-h)
|
||||
echo "MYP Setup-Skript - Optionen:"
|
||||
echo " --skip-bash-profile Überspringe Bash-Profile Updates"
|
||||
echo " --skip-systemd Überspringe Systemd-Service Installation"
|
||||
echo " --skip-kiosk Überspringe Kiosk-Modus Konfiguration"
|
||||
echo " --wsl, --dev WSL/Development-Modus (überspringt alle systemspezifischen Schritte)"
|
||||
echo " --help, -h Zeige diese Hilfe"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# =========================== GLOBALE KONFIGURATION ===========================
|
||||
readonly APP_NAME="MYP Druckerverwaltung"
|
||||
readonly APP_VERSION="4.1.0"
|
||||
@ -1839,32 +1875,85 @@ FLASK_ENV=production
|
||||
EOF
|
||||
|
||||
# Bash-Profile für alle User aktualisieren (robust)
|
||||
if [ "$SKIP_BASH_PROFILE" = true ]; then
|
||||
log "⏭️ Bash-Profile Update übersprungen (--skip-bash-profile oder --wsl/--dev)"
|
||||
return
|
||||
fi
|
||||
|
||||
progress "Aktualisiere Bash-Profile..."
|
||||
local profile_updated=0
|
||||
|
||||
for user_home in "/root" "/home/"*; do
|
||||
if [ -d "$user_home" ] && [ "$user_home" != "/home/lost+found" ] && [ -w "$user_home" ]; then
|
||||
if ! grep -q "MYP Application Environment" "$user_home/.bashrc" 2>/dev/null; then
|
||||
cat >> "$user_home/.bashrc" << 'EOF'
|
||||
# WSL-Erkennung
|
||||
local is_wsl=false
|
||||
if grep -qEi "(Microsoft|WSL)" /proc/version 2>/dev/null || [ -n "${WSL_DISTRO_NAME:-}" ]; then
|
||||
is_wsl=true
|
||||
debug "WSL-Umgebung erkannt - verwende angepasste Bash-Profile-Logik"
|
||||
fi
|
||||
|
||||
# Definiere die zu prüfenden Verzeichnisse basierend auf der Umgebung
|
||||
local home_dirs=()
|
||||
if [ "$is_wsl" = true ]; then
|
||||
# In WSL nur das aktuelle Benutzerverzeichnis verwenden
|
||||
if [ -n "${HOME:-}" ] && [ -d "$HOME" ]; then
|
||||
home_dirs=("$HOME")
|
||||
fi
|
||||
# Füge /root nur hinzu wenn wir als root laufen
|
||||
if [ "$(id -u)" = "0" ] && [ -d "/root" ] && [ -w "/root" ]; then
|
||||
home_dirs+=("/root")
|
||||
fi
|
||||
else
|
||||
# Standard-Verhalten für echtes Linux
|
||||
home_dirs=("/root")
|
||||
# Füge alle Home-Verzeichnisse hinzu, aber mit Timeout
|
||||
while IFS= read -r -d '' user_home; do
|
||||
if [ "$user_home" != "/home/lost+found" ]; then
|
||||
home_dirs+=("$user_home")
|
||||
fi
|
||||
done < <(find /home -maxdepth 1 -type d -print0 2>/dev/null | head -20)
|
||||
fi
|
||||
|
||||
# Aktualisiere Bash-Profile mit Timeout
|
||||
for user_home in "${home_dirs[@]}"; do
|
||||
if [ -d "$user_home" ] && [ -w "$user_home" ]; then
|
||||
# Prüfe ob .bashrc existiert und lesbar ist
|
||||
if [ -f "$user_home/.bashrc" ] && [ -r "$user_home/.bashrc" ]; then
|
||||
# Verwende timeout um hängende Operationen zu vermeiden
|
||||
if timeout 5s grep -q "MYP Application Environment" "$user_home/.bashrc" 2>/dev/null; then
|
||||
debug "Bash-Profile bereits konfiguriert: $user_home/.bashrc"
|
||||
else
|
||||
# Schreibe mit timeout und prüfe Erfolg
|
||||
if timeout 5s bash -c "cat >> '$user_home/.bashrc' << 'EOF'
|
||||
|
||||
# MYP Application Environment
|
||||
if [ -d "/opt/myp" ]; then
|
||||
export MYP_APP_DIR="/opt/myp"
|
||||
export FLASK_APP="/opt/myp/app.py"
|
||||
export FLASK_ENV="production"
|
||||
if [ -z "${PYTHONPATH:-}" ]; then
|
||||
export PYTHONPATH="/opt/myp"
|
||||
if [ -d \"/opt/myp\" ]; then
|
||||
export MYP_APP_DIR=\"/opt/myp\"
|
||||
export FLASK_APP=\"/opt/myp/app.py\"
|
||||
export FLASK_ENV=\"production\"
|
||||
if [ -z \"\${PYTHONPATH:-}\" ]; then
|
||||
export PYTHONPATH=\"/opt/myp\"
|
||||
else
|
||||
export PYTHONPATH="/opt/myp:$PYTHONPATH"
|
||||
export PYTHONPATH=\"/opt/myp:\$PYTHONPATH\"
|
||||
fi
|
||||
fi
|
||||
EOF
|
||||
((profile_updated++))
|
||||
log "✅ Bash-Profile aktualisiert: $user_home/.bashrc"
|
||||
EOF" 2>/dev/null; then
|
||||
((profile_updated++))
|
||||
log "✅ Bash-Profile aktualisiert: $user_home/.bashrc"
|
||||
else
|
||||
warning "⚠️ Konnte Bash-Profile nicht aktualisieren: $user_home/.bashrc"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
debug "Überspringe nicht-existierendes/unlesbares .bashrc: $user_home/.bashrc"
|
||||
fi
|
||||
else
|
||||
debug "Überspringe nicht-schreibbares Verzeichnis: $user_home"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $profile_updated -eq 0 ] && [ "$is_wsl" = false ]; then
|
||||
warning "⚠️ Keine Bash-Profile wurden aktualisiert"
|
||||
fi
|
||||
|
||||
# Validiere Deployment
|
||||
progress "Validiere Application Deployment..."
|
||||
local validation_errors=0
|
||||
|
Loading…
x
Reference in New Issue
Block a user