refactor: Redesign the language study project page with an enhanced layout, structured sections, and new project metadata.

This commit is contained in:
Simon Altschäffl 2026-02-17 11:58:59 +01:00
parent 97e1758b16
commit 3ca7259ad5
2 changed files with 225 additions and 264 deletions

View File

@ -2,127 +2,114 @@ import React from "react";
function LanguagestudyPage() {
return (
<section className="max-w-4xl mx-auto px-4 py-12 font-sans text-slate-800">
<h1 className="text-3xl md:text-4xl font-extrabold text-slate-900 mb-8 pb-4 border-b border-slate-200 text-center">Wikipedia Sprachstudie</h1>
<p className="text-center text-lg text-slate-600 mt-4 italic">
Dieses Projekt war mein Abschlussprojekt f&uuml;r den Kurs &bdquo;CS50x&ldquo;.
</p>
<div className="text-center mt-8 p-4 bg-slate-50 rounded-lg border border-slate-100 inline-block w-full">
<h3 className="text-lg font-bold text-slate-800 mb-2">GitHub Repository</h3>
<a
href="https://github.com/simon-266/WikiDictionaryResearch"
className="text-blue-600 hover:text-blue-800 hover:underline break-all"
target="_blank"
rel="noopener noreferrer"
>
https://github.com/simon-266/WikiDictionaryResearch
<div className="bg-slate-50 min-h-screen py-8 font-sans text-slate-800">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<header className="text-center border-b border-slate-200 pb-8 mb-12">
<h1 className="text-3xl md:text-5xl font-extrabold text-slate-900 mb-6 tracking-tight">Wikipedia Sprachstudie</h1>
<div className="mt-6 flex flex-wrap justify-center gap-4">
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Status</span>
<span className="text-sm font-medium text-slate-600">Abgeschlossen</span>
</div>
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Typ</span>
<span className="text-sm font-medium text-slate-600">Data Science / Analyse</span>
</div>
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Kontext</span>
<span className="text-sm font-medium text-slate-600">CS50x Final Project</span>
</div>
</div>
<div className="mt-8">
<a href="https://github.com/simon-266/WikiDictionaryResearch" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 font-bold inline-flex items-center bg-white px-4 py-2 rounded-lg border border-slate-200 shadow-sm hover:shadow-md transition-all">
<svg className="w-5 h-5 mr-2" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path fillRule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule="evenodd"></path></svg>
GitHub Repository
</a>
</div>
</header>
<div className="mt-12">
<h2 className="text-2xl font-bold text-slate-900 mb-4">Worum geht es in dieser Sprachstudie?</h2>
<p className="text-slate-700 leading-relaxed mb-6">
Ziel dieser Sprachstudie ist es, einem oft geh&ouml;rten Fakt beim
Sprachenlernen nachzugehen und ihn zu beweisen oder zu widerlegen. Der
Fakt lautet:{" "}
<span className="block my-4 p-4 bg-amber-50 border-l-4 border-amber-400 text-amber-900 font-medium rounded-r">
&bdquo;Die 1000 h&auml;ufigsten W&ouml;rter machen etwa 80 % des gesprochenen
Wortschatzes aus.&ldquo;
</span>
Um dies zu untersuchen, habe ich ein Skript programmiert, welches 15.000
Wikipedia-Seiten durchsucht und die englischen W&ouml;rter darin z&auml;hlt.
Zus&auml;tzlich habe ich einige Diagramme zu meinen Ergebnissen in einem
Jupyter Notebook erstellt:
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">1. Forschungsfrage & Ziel</h2>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm space-y-4">
<div className="p-4 bg-amber-50 border-l-4 border-amber-400 text-amber-900 font-medium rounded-r">
"Die 1000 h&auml;ufigsten W&ouml;rter machen etwa 80 % des gesprochenen Wortschatzes aus."
</div>
<p className="text-lg leading-relaxed text-slate-700">
Dieser oft zitierte Fakt beim Sprachenlernen war der Ausgangspunkt für meine Untersuchung.
Um dies zu verifizieren, habe ich ein Python-Skript entwickelt, das <b>15.000 Wikipedia-Artikel</b> analysiert
und die Häufigkeit englischer Wörter statistisch auswertet.
</p>
</div>
</section>
<div className="flex flex-wrap justify-center gap-8 my-10">
<div className="w-full md:w-5/12">
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">2. Visualisierung der Ergebnisse</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<img
src="/assets/projects/languageStudy/images/top1000.png"
alt="Kreisdiagramm: Die Top 1000 W&ouml;rter im Vergleich zum Rest"
className="w-full h-auto rounded-lg shadow-md border border-slate-200"
className="w-full h-auto rounded-lg mb-2"
/>
<p className="text-sm text-center text-slate-500 mt-2">Top 1000 W&ouml;rter vs. Rest</p>
<p className="text-sm text-center text-slate-500 font-medium">Top 1000 rter vs. Rest</p>
</div>
<div className="w-full md:w-5/12">
<div className="bg-white p-4 rounded-xl border border-slate-200 shadow-sm">
<img
src="/assets/projects/languageStudy/images/stats.png"
alt="Kreisdiagramm: Vergleiche der Vorkommen"
className="w-full h-auto rounded-lg shadow-md border border-slate-200"
className="w-full h-auto rounded-lg mb-2"
/>
<p className="text-sm text-center text-slate-500 mt-2">H&auml;ufigkeitsverteilung</p>
<p className="text-sm text-center text-slate-500 font-medium">ufigkeitsverteilung</p>
</div>
</div>
</div>
<div className="mt-12">
<h2 className="text-2xl font-bold text-slate-900 mb-4">Ergebnisse</h2>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm mt-6">
<h3 className="text-xl font-bold text-slate-800 mb-2">Das Ergebnis</h3>
<p className="text-slate-700 leading-relaxed">
Die Ergebnisse zeigen deutlich, dass die Top 1000 W&ouml;rter tats&auml;chlich
einen sehr gro&szlig;en Anteil ausmachen &ndash; auch wenn es nicht ganz 80 %,
sondern <em>knapp 70 %</em> sind. Daraus l&auml;sst sich schlussfolgern, dass es sich
beim Sprachenlernen definitiv lohnt, sich auf diese W&ouml;rter zu
konzentrieren, um <b>gute Fortschritte</b> zu erzielen.
Die Analyse von Millionen von Wörtern zeigte: Die Top 1000 Wörter machen tatsächlich einen
signifikanten Anteil von <b>knapp 70%</b> aus. Auch wenn die 80%-Marke knapp verfehlt wurde,
bestätigt die Studie, dass eine Konzentration auf den Grundwortschatz für Lernende extrem effizient ist.
</p>
</div>
</section>
<div className="mt-12">
<h2 className="text-2xl font-bold text-slate-900 mb-6">
Welche Techniken, Technologien und Bibliotheken habe ich verwendet?
</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-100 shadow-sm">
<ul className="list-disc pl-5 space-y-3 text-slate-700">
<li>
<b>Programmiersprachen</b>: Python, IPython
</li>
<li>
<b>Programme</b>: VSCode, JupyterLab, GIT (GitHub)
</li>
<li>
<b>Multithreading und Batchverarbeitung</b>: Mithilfe der <em>Future
Library</em> konnte ich das Z&auml;hlen der W&ouml;rter auf mehrere Threads
verteilen. Durch einfache Schleifen konnte ich den ben&ouml;tigten
Arbeitsspeicher begrenzen, indem ich die 15.000 Seiten in kleinere
Batches aufteilte, diese vorab zusammenf&uuml;hrte und am Ende zum
finalen Ergebnis zusammenf&uuml;hrte.
</li>
<li>
<b>Wikipedia</b>: Die Quelle meiner Daten, da die Inhalte dort ohne
Copyright-Probleme nutzbar sind, und die zugeh&ouml;rige Python
Library, welche das Webscraping vereinfacht.
</li>
<li>
<b>Pandas</b>: Hierf&uuml;r habe ich mich entschieden, da ich nach einer
effizienten M&ouml;glichkeit suchte, die W&ouml;rter zusammenzuf&uuml;hren.
Au&szlig;erdem vereinfacht es das Speichern dieser Daten in Dateien.
</li>
<li>
<b>sqlite3</b>: Gut zum Speichern und Abrufen meiner Daten.
</li>
</ul>
</div>
</div>
<div className="mt-12">
<h2 className="text-2xl font-bold text-slate-900 mb-4">Fazit</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-100 shadow-sm">
<ul className="list-disc pl-5 space-y-3 text-slate-700">
<li>
<b>Neues Wissen</b>: Durch dieses Projekt konnte ich mich zum ersten
Mal intensiv mit den Themen Webscraping (auch wenn es &uuml;ber eine
Library geschah) und Multithreading in Python besch&auml;ftigen, was f&uuml;r
zuk&uuml;nftige Projekte relevant sein k&ouml;nnte.
</li>
<li>
<b>&Uuml;bung</b>: Das Projekt hat sehr gut dazu gedient, mich intensiver
mit Python auseinanderzusetzen und dabei neue Libraries und
Funktionen innerhalb der Sprache selbst kennenzulernen.
</li>
</ul>
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">3. Tech Stack & Methoden</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-200">
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Python 3</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Pandas</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Web Scraping</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Multithreading</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">SQLite</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Matplotlib</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Jupyter Notebooks</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Git</div>
</div>
</div>
</section>
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">4. Technische Herausforderungen</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">Performance (Multithreading)</h3>
<p className="text-slate-600 text-sm">
Um 15.000 Seiten effizient zu verarbeiten, nutzte ich die <b>Python Future Library</b> für
parallele Requests. Batch-Verarbeitung verhinderte dabei einen RAM-Overflow.
</p>
</div>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">Datenbereinigung</h3>
<p className="text-slate-600 text-sm">
Rohes HTML musste geparsed und von Satzzeichen sowie Metadaten bereinigt werden, um
verzerrungsfreie Wortzählungen zu ermöglichen.
</p>
</div>
</div>
</section>
</div>
</div>
);
}

View File

@ -2,156 +2,130 @@ import React from "react";
function ServerPage() {
return (
<section className="max-w-4xl mx-auto px-4 py-12 font-sans text-slate-800">
<h1 className="text-3xl md:text-4xl font-extrabold text-slate-900 mb-8 pb-4 border-b border-slate-200 text-center">Struktur dieses Servers</h1>
<div className="bg-white p-4 rounded-xl border border-slate-200 shadow-sm mb-12">
<div className="bg-slate-50 min-h-screen py-8 font-sans text-slate-800">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<header className="text-center border-b border-slate-200 pb-8 mb-12">
<h1 className="text-3xl md:text-5xl font-extrabold text-slate-900 mb-6 tracking-tight">Home Server & Infrastruktur</h1>
<div className="mt-6 flex flex-wrap justify-center gap-4">
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Status</span>
<span className="text-sm font-medium text-slate-600">In Betrieb / Wartung</span>
</div>
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Typ</span>
<span className="text-sm font-medium text-slate-600">Homelab / DevOps</span>
</div>
<div className="bg-white px-4 py-2 rounded-full border border-slate-200 shadow-sm flex items-center space-x-2">
<span className="bg-slate-200 text-slate-700 text-xs font-bold px-2 py-0.5 rounded uppercase tracking-wide">Rolle</span>
<span className="text-sm font-medium text-slate-600">Administrator & Entwickler</span>
</div>
</div>
</header>
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">1. Projektüberblick & Architektur</h2>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm space-y-6">
<div className="bg-white p-4 rounded-xl border border-slate-100 shadow-sm mb-6">
<img
src="/assets/projects/server/images/server.png"
alt="Server Struktur Diagramm"
className="w-full h-auto rounded-lg"
/>
</div>
<div className="mb-12">
<h2 className="text-2xl font-bold text-slate-900 mb-4 border-b pb-2">Welche Kernaufgaben erf&uuml;llt dieser Server?</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-100 shadow-sm mt-4">
<ul className="list-disc pl-5 space-y-2 text-slate-700">
<li>Die Bereitstellung dieser Website über Nginx</li>
<li>Die Bereitstellung des JupyterHub-Servers für Data Science und Machine Learning</li>
<li>
Automatische Aktualisierung der React-Applikation durch GitHub-Webhooks
über die Flask-App
</li>
<li>Sichere Remote-Verbindung über WireGuard VPN und SSH</li>
<li>Zentrales Routing und Load Balancing durch Traefik</li>
</ul>
</div>
</div>
<div className="mb-12">
<h3 className="text-xl font-bold text-slate-800 mb-4">Wichtige Kerntechnologien</h3>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-100 shadow-sm">
<ul className="list-disc pl-5 space-y-4 text-slate-700">
<li>
<b>Docker und Docker-Compose</b>: Jeder Service läuft in einem eigenen Container,
was die Modularität und Wartbarkeit erhöht. Die Container-Architektur
ermöglicht eine klare Trennung der Dienste und vereinfacht das Deployment
sowie Updates.
</li>
<li>
<b>Traefik</b>: Fungiert als zentraler Reverse Proxy und Load Balancer.
Traefik übernimmt das Routing der Anfragen zu den entsprechenden Services,
verwaltet SSL-Zertifikate automatisch und ermöglicht eine einfache
Integration neuer Dienste durch Docker-Labels.
</li>
<li>
<b>Nginx</b>: Dient als Webserver für die React-App und stellt die
statischen Inhalte bereit.
</li>
<li>
<b>JupyterHub</b>: Ermöglicht die Verwaltung von Jupyter-Notebooks
für Data Science und Machine Learning. Benutzer können ihre eigenen
JupyterLab-Umgebungen über jupyter.simonaltschaeffl.de aufrufen.
</li>
<li>
<b>Flask</b>: Verarbeitet GitHub-Webhooks und triggert automatische
Updates der React-App. Die Flask-Anwendung verifiziert die Webhook-
Authentizität und stößt den Update-Prozess an.
</li>
<li>
<b>WireGuard VPN & SSH</b>: Bietet sicheren Remote-Zugriff auf den
Server. WireGuard ermöglicht eine moderne, schnelle VPN-Verbindung,
während der SSH-Server sichere Terminal-Verbindungen bereitstellt.
</li>
</ul>
</div>
</div>
<div className="mb-12 space-y-8">
<div>
<h3 className="text-xl font-bold text-slate-800 mb-2">Routing und Zugriff</h3>
<p className="text-slate-700 leading-relaxed">
Alle Anfragen werden zunächst von Traefik empfangen und basierend auf der
Domain an die entsprechenden Services weitergeleitet. Die Website ist unter
simonaltschaeffl.de erreichbar, wobei Traefik die Anfragen an den
Nginx-Container weiterleitet, der die React-Applikation bereitstellt.
<p className="text-lg leading-relaxed text-slate-700">
Dieser Server bildet das Herzstück meiner Entwicklungsumgebung. Er hostet nicht nur diese Website,
sondern dient als vielseitige Plattform für Data Science Experimente, Automatisierung und Lernen.
Alle Dienste laufen isoliert in <b>Docker-Containern</b>, orchestrirert durch <b>Docker Compose</b> und
verwaltet vom Reverse Proxy <b>Traefik</b>.
</p>
</div>
</section>
<div>
<h3 className="text-xl font-bold text-slate-800 mb-2">JupyterHub &amp; JupyterLab</h3>
<p className="text-slate-700 leading-relaxed">
Der JupyterHub-Service ist über jupyter.simonaltschaeffl.de erreichbar.
Traefik leitet die Anfragen an den JupyterHub-Container weiter, der die
Benutzerauthentifizierung und Container-Verwaltung übernimmt. Nach erfolgreicher
Anmeldung wird ein persönlicher JupyterLab-Container mit Data-Science-Tools
wie Pandas, TensorFlow, NumPy etc. gestartet, der für Machine Learning
Experimente und Datenanalysen genutzt werden kann.
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">2. Kernkomponenten & Dienste</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">Traefik (Reverse Proxy)</h3>
<p className="text-slate-600 text-sm">
Zentraler Einstiegspunkt. Routet Anfragen basierend auf Subdomains an die richtigen Container
und verwaltet automatisch <b>SSL-Zertifikate</b> (Let's Encrypt).
</p>
</div>
<div>
<h3 className="text-xl font-bold text-slate-800 mb-2">Sicherheit und Remote-Zugriff</h3>
<p className="text-slate-700 leading-relaxed">
Der sichere Remote-Zugriff wird durch eine Kombination aus WireGuard VPN
und SSH gewährleistet. WireGuard bietet eine moderne, effiziente
VPN-Lösung, während der SSH-Server sichere Terminal-Verbindungen für
Wartungsarbeiten ermöglicht. Die Verwaltung erfolgt über einen
dedizierten Admin-Zugang.
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">JupyterHub</h3>
<p className="text-slate-600 text-sm">
Multi-User Umgebung für <b>Data Science</b>. Startet für jeden Nutzer isolierte Container
mit vorinstallierten Libraries wie Pandas, TensorFlow und NumPy.
</p>
</div>
</div>
<div className="mb-12">
<h2 className="text-2xl font-bold text-slate-900 mb-4 border-b pb-2">Mein Fazit</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-100 shadow-sm mt-4">
<ul className="list-disc pl-5 space-y-3 text-slate-700">
<li>
<b>Umfangreiches Lernen</b>: Das Projekt bot eine gro&szlig;artige M&ouml;glichkeit, neue Technologien wie
Docker und React von Grund auf zu lernen.
</li>
<li>
<b>Lernkurve war es wert</b>: Auch wenn das Verst&auml;ndnis der neuen Technologien Zeit brauchte, war
der Erkenntnisgewinn immens.
</li>
<li>
<b>Produktionsvorteile von Docker</b>: Das Projekt hat das Verst&auml;ndnis f&uuml;r die Bedeutung von Docker in
Produktionsumgebungen deutlich gemacht und wird die
Serverkonfiguration zuk&uuml;nftiger Projekte erleichtern.
</li>
<li>
<b>Effizienz von JavaScript-Bibliotheken (React)</b>: Die Einfachheit und Geschwindigkeit, mit der komplexe Webseiten mit
React erstellt werden k&ouml;nnen, hat positiv &uuml;berrascht und wird in
Zukunft h&auml;ufiger eingesetzt werden.
</li>
</ul>
</div>
</div>
<div className="mb-12">
<h3 className="text-xl font-bold text-slate-800 mb-2">Rolle von LLMs in der Konfiguration</h3>
<div className="bg-indigo-50 p-6 rounded-xl border border-indigo-100 text-indigo-900">
<p>
Ich habe Chatbots in verschiedenen Bereichen eingesetzt, vor allem im
Bereich <em>Debugging und Rechtschreibung</em>. Viele Fehler, vor allem bei
Dockerfiles oder Docker-Compose-Dateien, konnten durch den Einsatz von
Chatbots effizient behoben werden.
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">CI/CD Pipeline</h3>
<p className="text-slate-600 text-sm">
Eine Flask-Anwendung lauscht auf <b>GitHub Webhooks</b>. Bei neuen Pushes wird die Website
automatisch neu gebaut und deployed.
</p>
</div>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">Sicherheit</h3>
<p className="text-slate-600 text-sm">
Zugriffsschutz durch <b>WireGuard VPN</b> und SSH (Key-Auth). Interne Dienste sind
nicht öffentlich erreichbar.
</p>
</div>
<div>
<h2 className="text-2xl font-bold text-slate-900 mb-4 border-b pb-2">Ideen f&uuml;r die Zukunft des Servers</h2>
<div className="bg-emerald-50 p-6 rounded-xl border border-emerald-100 text-emerald-900">
<ul className="list-disc pl-5 space-y-2">
<li>Integration weiterer Dienste durch einfache Erweiterung der Traefik-Konfiguration</li>
<li>Implementierung eines Monitoring-Systems für bessere Überwachung der Services</li>
<li>Automatisierung der Backups und Disaster Recovery Prozesse</li>
<li>Erweiterung der JupyterHub-Umgebung mit zusätzlichen Data Science Tools</li>
</ul>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm hover:shadow-md transition-shadow">
<h3 className="text-xl font-bold text-slate-800 mb-3 pb-2 border-b border-slate-100">Nginx</h3>
<p className="text-slate-600 text-sm">
High-Performance Webserver für die Auslieferung der statischen React-Build-Dateien
dieser Portfolio-Seite.
</p>
</div>
</div>
</section>
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">3. Tech Stack</h2>
<div className="bg-slate-50 p-6 rounded-xl border border-slate-200">
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Docker</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Docker Compose</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Traefik</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Nginx</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Linux (Ubuntu)</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Python (Flask)</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">Bash Scripting</div>
<div className="bg-white p-4 rounded shadow-sm text-center font-semibold text-slate-700">WireGuard</div>
</div>
</div>
</section>
<section className="mb-16">
<h2 className="text-2xl font-bold text-slate-900 mb-6 border-l-4 border-indigo-500 pl-4">4. Learnings & KI-Einsatz</h2>
<div className="bg-white p-6 rounded-xl border border-slate-200 shadow-sm space-y-4">
<div className="flex flex-col md:flex-row gap-6">
<div className="flex-1">
<h3 className="text-lg font-bold text-slate-800 mb-2">Wichtigste Erkenntnisse</h3>
<ul className="list-disc pl-5 space-y-2 text-slate-700">
<li>Verständnis von Container-Orchestrierung in Produktionsumgebungen.</li>
<li>Wichtigkeit von automatisierten Deployments (CI/CD) für effizientes Arbeiten.</li>
<li>Netzwerk-Routing und SSL-Management mit Reverse Proxies.</li>
</ul>
</div>
<div className="flex-1">
<h3 className="text-lg font-bold text-slate-800 mb-2">KI als "Co-Admin"</h3>
<div className="bg-indigo-50 p-4 rounded-lg border border-indigo-100 text-indigo-900 text-sm">
<p>
LLMs waren eine große Hilfe beim Debugging komplexer <b>Docker-Compose</b> Konfigurationen
und beim Schreiben von robusten Shell-Skripten. Sie dienten als interaktive Dokumentation
für Linux-Server-Administration.
</p>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
);
}