webstack-author/README.md
2026-08-15 08:45:07 +02:00

7.6 KiB

📚 Dual Identity Autoren-Zentrale (Selbstgehostet)

Willkommen in Ihrer modernen, reaktiven Autoren-Website für das 21. Jahrhundert! Dieses System ermöglicht es Ihnen, mehrere eigenständige Autorenprofile mit individuellen Themen, Biografien, Schreibprojekten und Bücherregalen über eine einzige, passwortgeschützte Administrationsoberfläche zu pflegen.


🛠️ Warum kein klassischer LAMP-Stack? (Unser Vorschlag)

Bisher liefen klassische Portfolios oft auf einem standardmäßigen LAMP-Stack (Linux, Apache, MySQL, PHP). Für diese modernisierte Website schlagen wir einen Node.JS + Docker-Stack vor. Hier ist der Grund, warum das für Ihre Bedürfnisse die deutlich bessere Option ist:

  1. Vollständige Kapselung (Kein Server-Wildwuchs): Bei einem LAMP-Stack müssen Sie Apache/Nginx, PHP-Laufzeiten und eine MySQL-Datenbank auf dem Host installieren und managen. Unser Docker-Stack bündelt das gesamte Frontend, das Express-Backend und die Speicherrelevanz in einem einzigen, autarken Container.
  2. Blitzschnelle, reaktive Benutzeroberfläche (SPA): Das Frontend nutzt modernste Webtechnologie (React & Tailwind CSS). Seitenwechsel und Buchdetails laden augenblicklich im Browser des Nutzers, ohne das klassische, träge Neuladen von PHP-Seiten.
  3. Einfachheit bei Datensicherungen (Backups): Anstatt komplexe MySQL-Dumps durchzuführen, speichert unsere Anwendung alle Buchtitel, Projekte, Cover und Biografien in einer schlanken JSON-Datenbankdatei (/data/database.json). Ein Backup lässt sich durch einfaches Kopieren dieser Datei anfertigen!
  4. KI-Unterstützung integriert: Der integrierte Gemini-Klappentext-Assistent läuft nahtlos und sicher über das Node-Backend (ohne API-Schlüssel im Webbrowser zu exponieren).

🌌 Die Trennung der Profile

Das System ist von Grund auf so strukturiert, dass Besucher der Website keine Verbindung zwischen den gepflegten Identitäten herstellen müssen. Der Code enthält derzeit vier getrennt auflösbare Profile; Domains und Pfade können im Adminbereich gepflegt werden. Unter anderem:

  • Echte Identität (Daniel Hesse — Sci-Fi & Fantasy): Erreichbar auf der Standard-Startseite (/). Das Design kombiniert dunkelblaue Weltraum-Energie, Monospace-Einflüsse und kosmische Magie-Akzente.
  • Pseudonym (Annie Slone — Sinnliche Literatur): Erreichbar unter anderem über den Pfad /sensual-moments. Das Profil verwendet ein warmes, edles Thema mit klassischer und anspruchsvoller Serif-Asthetik. Es gibt keinerlei gegenseitige Verlinkungen!

🚀 Inbetriebnahme als Docker-Stack (Empfohlen)

Es wird dringend empfohlen, die Website mithilfe von Docker und Docker-Compose zu betreiben. Dies garantiert, dass die Anwendung sofort und unabhängig von installierten Node.JS-Versionen auf Ihrem Server funktioniert.

1. Dateien vorbereiten

Stellen Sie sicher, dass sich folgende Dateien im gleichen Ordner auf Ihrem Server befinden:

  • Dockerfile
  • docker-compose.yml
  • Der gesamte Code-Ordner

2. Konfiguration anpassen

Kopieren Sie .env.example nach .env und tragen Sie dort die Geheimnisse ein. Die .env-Datei wird nicht eingecheckt:

ADMIN_PASSWORD=IhrSicheresLieblingsPasswort123
SESSION_SECRET=EineUnabhaengigeZufaelligeZeichenfolgeMitMindestens32Zeichen
GEMINI_API_KEY=Ihr_Gemini_API_Schluessel

Der Admin-Login erzeugt eine auf 24 Stunden begrenzte, serverseitige Sitzung in einem HttpOnly-, Secure- und SameSite=Strict-Cookie. Ein Container-Neustart beendet aktive Sitzungen. Das Passwort selbst wird nicht im Browser gespeichert. Ohne ADMIN_PASSWORD und SESSION_SECRET startet die Anwendung im Produktionsmodus bewusst nicht.

3. Container starten

Führen Sie im entsprechenden Verzeichnis folgenden Befehl aus:

docker compose up -d --build

Die Anwendung baut das Image und startet die Autoren-Zentrale im Hintergrund. Sie ist nun direkt auf Port 3000 Ihres Webservers erreichbar!

Reverse Proxy Tipp:

Sie können ganz hervorragend einen Reverse Proxy wie Nginx Proxy Manager, Traefik oder Caddy davorhängen, um SSL-Zertifikate (Let's Encrypt) zuzuweisen und Ihre Domain auf den Container-Port 3000 umzuleiten.

Wenn genau ein vertrauenswürdiger Reverse Proxy vor dem Container sitzt und Port 3000 nicht direkt aus dem Internet erreichbar ist, setzen Sie zusätzlich TRUST_PROXY=1 in .env. So verwendet das Login-Limit die ursprüngliche Client-IP. Bei direkter Veröffentlichung des Containerports darf diese Option nicht aktiviert werden.


💾 Manuelle Installation ohne Docker (Alternativ)

Sollten Sie die Software direkt auf Ihrem Server (ohne Docker) starten wollen:

  1. Voraussetzung: Installieren Sie Node.js (v18 oder neuer) auf Ihrem Linux- oder Windows-Server.
  2. Abhängigkeiten installieren:
    npm install
    
  3. Produktions-Build ausführen:
    npm run build
    
  4. Umgebungsvariablen setzen: Erstellen Sie eine .env-Datei oder exportieren Sie diese im Terminal:
    export ADMIN_PASSWORD="IhrSicheresPasswort"
    export SESSION_SECRET="EineUnabhaengigeZufaelligeZeichenfolgeMitMindestens32Zeichen"
    export GEMINI_API_KEY="Ihr_Gemini_API_Schlüssel"
    
  5. Starten:
    npm start
    

🧱 Datensicherung / Backups

Alle Ihre Inhalte (Biografien, Projektfortschritte und Bücherregal-Einträge) liegen als lesbares JSON in Ihrem Projektordner unter: ./data/database.json

Da wir in der docker-compose.yml ein lokales Volume gemountet haben (./data:/app/data), wird diese Datei direkt auf die Festplatte Ihres Servers geschrieben.

  • Backup erstellen: Sichern Sie einfach die Datei ./data/database.json.
  • Wiederherstellen: Platzieren Sie eine gesicherte database.json in den ./data/-Ordner vor dem Starten des Containers.

Beim Ergänzen neuer Datenfelder legt die Anwendung vor der Migration automatisch eine unveränderte Sicherung unter ./data/backups/ an. Schreibvorgänge erfolgen atomar und werden nacheinander verarbeitet, damit die Datei bei parallelen Änderungen nicht teilweise überschrieben wird. Das Docker-Volume ersetzt dennoch kein externes Backup des Hostsystems.


Betrieb & SEO

  • /health/live zeigt an, ob der Prozess läuft.
  • /health/ready zeigt an, ob die Daten erfolgreich geladen wurden und die Anwendung bereit ist.
  • Seitentitel, Beschreibung, Canonical URL, Open-Graph-Daten und strukturierte Personendaten werden passend zur aufgerufenen Autorendomain serverseitig ausgegeben.
  • /robots.txt und /sitemap.xml werden ebenfalls profilabhängig erzeugt; der Adminbereich ist mit noindex gekennzeichnet.
  • Optionale SEO-Felder können später je Profil gepflegt werden. Ohne sie werden die Angaben rückwärtskompatibel aus den vorhandenen Profildaten abgeleitet.

Bild-Uploads

Der Adminbereich akzeptiert JPEG, PNG, WebP, GIF und AVIF bis maximal 8 MB. Der Server prüft den tatsächlichen Dateikopf unabhängig von Dateiname und Browserangabe, erzeugt einen zufälligen nicht überschreibbaren Namen und begrenzt Uploads auf 30 Versuche pro Sitzung und Stunde. SVG, HTML und andere aktive Dateiformate werden weder angenommen noch aus dem Uploadverzeichnis ausgeliefert.

Qualitätschecks

npm run typecheck  # TypeScript ohne Ausgabe prüfen
npm test           # Produktionsbuild und Integrationstests
npm run check      # vollständiger Check aus TypeScript, Build und Tests

Die Integrationstests verwenden ausschließlich temporäre Datenverzeichnisse und einen kurzlebigen lokalen Server. Sie prüfen Produktions-Secrets, Admin-Sitzung und Logout, Origin-Schutz, Login-Limit, exaktes Domain-Routing sowie gültige und manipulierte Bild-Uploads.