admin page
This commit is contained in:
1 parent
5abad7c475
commit
b84349c037
33 files changed
+2504
-110
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# 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.
|
||||
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 auf der Platte, gepflegt werden sie über ein paar Admin-Seiten, die nur im Heimnetz erreichbar sind.
|
||||
|
||||
## Entwicklung
|
||||
|
||||
@@ -8,76 +8,65 @@ Node 24 (siehe `.nvmrc`).
|
||||
|
||||
```sh
|
||||
npm install
|
||||
npm run dev # http://localhost:3000, baut CSS/JS bei Änderungen neu
|
||||
ADMIN_PASSWORD=test npm run dev # Seite auf :3000, Admin auf :3001/admin
|
||||
npm test
|
||||
```
|
||||
|
||||
Im Dev-Modus sind Einträge mit `draft: true` sichtbar und bekommen ein Entwurf-Badge.
|
||||
Im Dev-Modus sind Entwürfe auf der Seite sichtbar und bekommen ein Badge. Ohne `ADMIN_PASSWORD` bleiben die Admin-Seiten aus.
|
||||
|
||||
## Inhalte
|
||||
|
||||
Es gibt zwei Ordner:
|
||||
|
||||
- `content/` im Repo: Startinhalte und alles, was es im Admin nicht gibt (Texte und Kacheln der Startseite in `home.yml`).
|
||||
- `data/` auf dem Server, nicht im Repo: alles, was über die Admin-Seiten bearbeitet wird.
|
||||
|
||||
Beim allerersten Start wird der bearbeitbare Teil von `content/` nach `data/` kopiert (Projekte, Werdegang, Profil, Homelab). Danach gilt nur noch `data/`, spätere Änderungen an diesen Dateien im Repo werden ignoriert.
|
||||
|
||||
```
|
||||
content/
|
||||
data/
|
||||
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 <name>.de.md / <name>.en.md
|
||||
projects/<slug>/ ein Ordner pro Projekt
|
||||
projects/<slug>/ meta.yml, de.md, en.md und die Bilder
|
||||
```
|
||||
|
||||
Texte, die in beiden Sprachen gleich sind, stehen einfach als String. Sonst:
|
||||
Die Dateien lassen sich auch von Hand bearbeiten, die Seite lädt sie bei Änderungen neu. Texte, die in beiden Sprachen gleich sind, stehen als einfacher String, sonst als `{ de, en }`.
|
||||
|
||||
```yaml
|
||||
title:
|
||||
de: Videoschnitt
|
||||
en: Video editing
|
||||
## Admin-Seiten
|
||||
|
||||
Laufen im selben Container auf einem eigenen Port (im Container 3001, auf dem Server `ADMIN_HOST_PORT`, Standard 3051). Über `lux.harlelux.de` gibt es kein `/admin`. Der Port wird von der FRITZ!Box nicht freigegeben, ist also nur im Heimnetz erreichbar:
|
||||
|
||||
```
|
||||
http://<server-ip>:3051/admin
|
||||
```
|
||||
|
||||
### Neues Projekt
|
||||
Zusätzlich lässt die App dort nur private Adressen durch und verlangt das Passwort aus `ADMIN_PASSWORD`. Nach zehn Fehlversuchen ist der Login eine Viertelstunde gesperrt.
|
||||
|
||||
`content/projects/mein-projekt/meta.yml`:
|
||||
Unter derselben Adresse zeigt `/de/` die ganze Seite mit Entwürfen, als Vorschau.
|
||||
|
||||
```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 (``), die Seite erzeugt automatisch kleinere WebP-Versionen.
|
||||
Hochgeladene Bilder werden auf höchstens 2400 px verkleinert und neu gespeichert, dabei fallen EXIF-Daten wie der Aufnahmeort weg.
|
||||
|
||||
## 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
|
||||
cd ~/stacks
|
||||
git clone https://git.harlelux.de/Harlekin/Personal-Website.git personal_website
|
||||
cd personal_website
|
||||
mkdir data # muss dem Container-User (UID 1000) gehören
|
||||
cp .env.example .env # ADMIN_PASSWORD eintragen
|
||||
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:
|
||||
Code-Updates: `git pull` und `docker compose up -d --build`. Wer statt Git mit `rsync` hochlädt, muss `data` und `.env` ausschließen, sonst sind die Inhalte weg.
|
||||
|
||||
- **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`.
|
||||
**`data/` gehört ins Backup.** Dort liegt alles, was über die Admin-Seiten angelegt wurde.
|
||||
|
||||
## Lizenz
|
||||
|
||||
Der Code steht unter der MIT-Lizenz (siehe `LICENSE`). Texte und Bilder in `content/` sind davon ausgenommen.
|
||||
Der Code steht unter der MIT-Lizenz (siehe `LICENSE`). Texte und Bilder in `content/` und `data/` sind davon ausgenommen.
|
||||
Reference in new issue
Block a user