# lux.harlelux.de Meine persönliche Website mit Portfolio. Node.js und Express, die Seiten werden mit Nunjucks auf dem Server gerendert. Inhalte liegen als YAML und Markdown in `content/`, ein CMS gibt es nicht. ## Entwicklung Node 24 (siehe `.nvmrc`). ```sh npm install npm run dev # http://localhost:3000, baut CSS/JS bei Änderungen neu npm test ``` Im Dev-Modus sind Einträge mit `draft: true` sichtbar und bekommen ein Entwurf-Badge. ## Inhalte ``` content/ site.yml Name, Pronomen, Links, Skills, "Gerade dran" home.yml Texte und Kacheln der Startseite journey.yml Stationen für den Werdegang homelab.yml Hardware und Dienste pages/ Werdegang und Homelab als .de.md / .en.md projects// ein Ordner pro Projekt ``` Texte, die in beiden Sprachen gleich sind, stehen einfach als String. Sonst: ```yaml title: de: Videoschnitt en: Video editing ``` ### Neues Projekt `content/projects/mein-projekt/meta.yml`: ```yaml date: 2026-09 # Jahr, Monat oder Tag tags: [homelab, docker] featured: true # auf der Startseite zeigen draft: true # online erst sichtbar, wenn das weg ist cover: cover.jpg video: https://youtu.be/... # oder eine Datei aus dem Ordner, z.B. clip.mp4 gallery: - screenshot.png - src: rack.jpg caption: de: Das Rack en: The rack links: - label: Repo url: https://git.harlelux.de/Harlekin/... ``` Dazu `de.md` und `en.md` mit `title` und `summary` im Frontmatter und dem Text darunter. Fehlt eine Sprache, wird die andere angezeigt. Bilder liegen im selben Ordner und werden relativ eingebunden (`![Beschreibung](bild.jpg)`), die Seite erzeugt automatisch kleinere WebP-Versionen. ## Deployment Läuft als Docker-Stack in Dockge hinter Nginx Proxy Manager. ```sh git clone https://git.harlelux.de/Harlekin/Personal-Website.git /opt/stacks/personal-website cd /opt/stacks/personal-website cp .env.example .env # nur nötig, wenn etwas vom Standard abweicht docker compose up -d --build ``` Im Nginx Proxy Manager einen Proxy Host für `lux.harlelux.de` auf `personal-website:3000` anlegen, mit Let's-Encrypt-Zertifikat und Force SSL. Der Container hängt im Netzwerk `nginx_default`, ein anderer Name lässt sich über `PROXY_NETWORK` in der `.env` setzen. Updates: - **Nur Inhalte geändert:** `git pull` reicht. `content/` ist in den Container gemountet und wird automatisch neu geladen. - **Code geändert:** `git pull` und `docker compose up -d --build`. Neu laden lässt sich der Inhalt auch von Hand mit `docker kill -s HUP personal-website`. ## Lizenz Der Code steht unter der MIT-Lizenz (siehe `LICENSE`). Texte und Bilder in `content/` sind davon ausgenommen.