# 📚 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: ```dotenv 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: ```bash 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:** ```bash npm install ``` 3. **Produktions-Build ausfĂŒhren:** ```bash npm run build ``` 4. **Umgebungsvariablen setzen:** Erstellen Sie eine `.env`-Datei oder exportieren Sie diese im Terminal: ```bash export ADMIN_PASSWORD="IhrSicheresPasswort" export SESSION_SECRET="EineUnabhaengigeZufaelligeZeichenfolgeMitMindestens32Zeichen" export GEMINI_API_KEY="Ihr_Gemini_API_SchlĂŒssel" ``` 5. **Starten:** ```bash 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 ```bash 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.