This commit is contained in:
eclipse 2025-06-11 12:17:01 +02:00
parent 289e18e505
commit 87d3e7d133

109
README.md Normal file
View File

@ -0,0 +1,109 @@
# Autorenwebseite tobias-radloff.de
Eine moderne statische Autorenwebseite mit Werksseiten, Neuigkeiten, Terminkalender, Newsletterabonnentenverwaltung und Kontaktformular auf Basis von [Pelican](https://getpelican.com).
## Dependencies
### Pelican
In einer eigenen `venv`-Umgebung verwende ich Pelican (v4.11.0) mit Markdown-Support, installiert mittels `pip install pelican[markdown]`. Pelican setzt `python3` voraus.
Plugins für Pelican:
* `pelican-yaml-metadata` ermöglicht das Einlesen von Metadaten im YAML-Format
* `pelican-image-process` erlaubt das Bearbeiten von Bildern beim Erzeugen der Seite
### CSS und Schriften
* [Pico CSS](https://picocss.com/) tatsächlich verwende ich einen [Fork](https://github.com/Yohn/PicoCSS), der zusätzlich Hamburger-Menüs unterstützt
* [Libertinus Sans](https://github.com/alerque/libertinus) im Development Mode greife ich auf lokale Dateien zurück, im Production Mode stammen sie von einem [CDN](https://www.cdnfonts.com/libertinus-sans.font)
### Werke und Texte
* TODO: die Sourcefiles für meine Werke und Texte sollen direkt aus der `the_works`-Datenbank erzeugt werden
### Termine
Das Script `utils/refresh-events.py` benötigt folgende Python-Packages (beide via `pip` installierbar):
* `caldav`
* `vobject`
### Bildverarbeitung
@TODO: benutze ich das Script überhaupt noch?
Das Script `utils/crop_image_to_bbox.py` setzt die Python-Bibliothek `PIL` voraus.
### Favicon
Um aus einer einzelnen SVG-Datei Favicons in allen nötigen Größen zu erzeugen, nutze ich das Script `utils/favicon-from-svg.sh`. Es setzt voraus:
* `inkscape`
* `pngquant`
* `image-magick`
### Deployment Tool
* `lftp`
### Auf dem Produktionsserver
* `php` (aktuell 8.1)
* Datenbanktreiber, aktuell `pdo_sqlite`
* `PHPMailer` (im Repository enthalten)
## Konfiguration
Das Projekt wird in diesen Dateien konfiguriert:
* `pelicanconf.py` und `publishconf.py` enthalten die Pelican-Konfiguration für Development bzw. Production Mode
* `config.ini` enthält die Zugangsdaten für Datenbank und SMTP-Server); üblicherweise ist diese Datei ein Symlink zu einer der folgenden Dateien
* `config.dev.ini` Werte für den Development Mode
* `config.prod.ini` Werte für den Production Mode
* und `config.example.ini` ist ein Beispieldatei mit Dummy-Werten
* `deploy.ini` FTP-Zugangsdaten für den Produktionsserver
* `events.ini` Zugangsdaten für den CalDAV-Server
## Ausführen
### Seite im Development Mode (neu) erzeugen
* `make clean` Output-Verzeichnis leeren
* `make html` alle HTML-Seiten neu erzeugen, die nicht im Output-Verzeichnis vorhanden sind oder deren Sourcefiles sich seit dem letzten Erzeugen verändert haben
* `make regenerate` auf Änderungen in Sourcefiles lauschen und entsprechende Seiten neu erzeugen
* `sudo lighttpd -f lighttpd.conf` Test-Webserver starten (Kontaktformular und Newsletteran-/-abmeldung erzeugen POST-Requests, doch der mit Pelican mitgelieferte Webserver verarbeitet nur GET-Requests; ich teste die Seite daher mit [lighttpd](https://www.lighttpd.net/))
* `utils/refresh-events.py` CalDAV-Termine neu einlesen
### Seite im Production Mode (neu) erzeugen
* `make clean` Output-Verzeichnis leeren
* `make publish` Seite mit Produktionsparametern neu erzeugen (liest automatisch Termine neu ein)
### Deployment
* `deploy-via-ftp.sh` Seite auf den Produktionsserver hochladen
## Dokumentation
### Aufbau der Webseite
Pelican kennt Artikel und Seiten. Ich verwende diese wie folgt:
* meine einzelnen Werke sowie News-Posts sind Artikel; die Sourcefiles liegen in `content/posts/`
* die Kategorie entspricht der Werksart (Romane, Kurzprosa, Lyrik, Weitere, News); alle Sourcefiles einer Kategorie liegen im gleichnamigen Unterverzeichnis (zB `content/posts/romane/`)
* Schlagworte entsprechen weitgehend den Genres, geben aber auch zB englischsprachige Texte an
* alles andere sind Seiten; die Sourcefiles liegen in `content/pages/`
### Templates
### Termine neu einlesen
## TODOs
* Seite schneller laden (lazy loading?)
* the_works anbinden, sodass die Werk-Seiten aus der DB automatisch übernommen werden