aboutsummaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
authorValentin <valentin@fricklerhandwerk.de>2025-12-09 17:48:21 +0100
committerValentin <valentin@fricklerhandwerk.de>2025-12-20 17:44:07 +0100
commit1a99a306ae044625e3f89e16d1d6f809ce8c12e0 (patch)
tree3a04bfee536d0cfe885e27dc7b916fd353380d5a /www
parent9a5020deaed97df8ab1307068f34a382b2e24b31 (diff)
Website-Erzeugung aus Nixpkgs-Modul statt Paket
Die Dateien für die Website mit Nix zu erzeugen ist zur Zeit der kleinste Schritt, um repetitive Muster weg zu abstrahieren. Alles andere bräuchte mehr Infrastruktur, während Nix bereits da ist und direkt verwendet werden kann. Es erlaubt jetzt einen nahtlosen Übergang zu einer strukturierteren Darstellung. Selbst falls das System sehr komplex wird, bevor es auf einen Anwendungsserver mit Datenbank usw. migriert werden kann, können im Prinzip Datentypen für die Sprache der Anwendung und sogar Nutzdaten im Zielformat aus den Modulsystem-Typen generiert werden. Das würde diese spätere Migration zumindest abmildern. Wichtig: Dateinamen dürfen keine Leerzeichen mehr enthalten, um genau zu sein siehe [0]. [0]: <https://github.com/NixOS/nix/commit/f1b4663805a9dbcb1ace64ec110092d17c9155e0>
Diffstat (limited to 'www')
-rw-r--r--www/caddy.nix24
-rw-r--r--www/flake-module.nix46
-rw-r--r--www/framework/default.nix134
-rw-r--r--www/html.nix57
-rw-r--r--www/html/Kalender/Kindertag-in-der-Mehrwertkultur.html (renamed from www/html/Kalender/Kindertag in der Mehrwertkultur.html)0
-rw-r--r--www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_290e08fdf9314385.jpg (renamed from www/html/Kalender/Kindertag in der Mehrwertkultur_html_290e08fdf9314385.jpg)bin33207 -> 33207 bytes
-rw-r--r--www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png (renamed from www/html/Kalender/Kindertag in der Mehrwertkultur_html_7312c2696b940296.png)bin325031 -> 325031 bytes
-rw-r--r--www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf (renamed from www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf)bin51362 -> 51362 bytes
8 files changed, 248 insertions, 13 deletions
diff --git a/www/caddy.nix b/www/caddy.nix
index 6721316..9a5bd50 100644
--- a/www/caddy.nix
+++ b/www/caddy.nix
@@ -1,16 +1,11 @@
{ self, lib, ... }:
-let
- html =
- with lib.fileset;
- toSource {
- root = ./html;
- fileset = ./html;
- };
-in
{
flake.machines.tharos = {
nixos =
- { lib, ... }:
+ { config, lib, ... }:
+ let
+ website = self.websites.${config.nixpkgs.hostPlatform.system}.${self.domain};
+ in
{
services.caddy.virtualHosts.${self.domain} = {
serverAliases = [ "www.${self.domain}" ];
@@ -18,13 +13,15 @@ in
file_server
root * /var/www/${self.domain}
encode gzip
+
+ ${website.redirects.caddy}
'';
};
systemd.tmpfiles.rules = [
# Verzeichnis für Web-Inhalte sofort anlegen, da der Webserver sonst nicht startet,
# aber nur wenn es noch nicht existiert.
- "C /var/www/${self.domain} - - - - ${html}"
+ "C /var/www/${self.domain} - - - - ${website.result}"
];
};
vm =
@@ -52,10 +49,14 @@ in
pkgs,
lib,
system,
+ config,
self',
...
}:
{
+ # Website aus Quellcode generiert
+ packages.html = self'.websites.${self.domain}.result;
+
# Website-Inhalte auf den Server hochladen
packages.publish = pkgs.writeShellApplication {
name = "publish";
@@ -66,9 +67,6 @@ in
};
# Lokale Vorschau
- packages.html = pkgs.runCommand "source" { } ''
- cp -r ${html} $out
- '';
packages.preview = pkgs.devmode.override {
buildArgs = ''
"$(${lib.getExe pkgs.git} rev-parse --show-toplevel)" -A packages.${system}.html -vv
diff --git a/www/flake-module.nix b/www/flake-module.nix
new file mode 100644
index 0000000..880b395
--- /dev/null
+++ b/www/flake-module.nix
@@ -0,0 +1,46 @@
+{
+ self,
+ config,
+ lib,
+ flake-parts-lib,
+ ...
+}:
+let
+ inherit (lib)
+ filterAttrs
+ mapAttrs
+ mkOption
+ optionalAttrs
+ types
+ ;
+ inherit (flake-parts-lib)
+ mkSubmoduleOptions
+ mkPerSystemOption
+ ;
+in
+{
+ options = {
+ flake = mkSubmoduleOptions {
+ websites = mkOption { };
+ };
+
+ perSystem = mkPerSystemOption (
+ { pkgs, ... }:
+ {
+ _file = ./option.nix;
+ options = {
+ websites = mkOption {
+ type =
+ with types;
+ lazyAttrsOf (submoduleWith {
+ specialArgs = { inherit pkgs; };
+ modules = [ ./framework ];
+ });
+ };
+ };
+ }
+ );
+ };
+
+ config.transposition.websites = { };
+}
diff --git a/www/framework/default.nix b/www/framework/default.nix
new file mode 100644
index 0000000..92e1ed8
--- /dev/null
+++ b/www/framework/default.nix
@@ -0,0 +1,134 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types;
+in
+{
+ imports =
+ with lib.fileset;
+ toList (difference (fileFilter (file: file.hasExt "nix") ./.) ./default.nix);
+
+ options = {
+ types = mkOption {
+ description = "Datentypen für Website-Inhalte";
+ type = with types; lazyAttrsOf deferredModule;
+ default = { };
+ };
+
+ files = mkOption {
+ description = ''
+ Dateien, aus denen die Website besteht, als Abbildung vom Dateipfad zum Inhalt
+ '';
+ type = with types; attrsOf (either path (submodule config.types.file));
+ };
+
+ redirects.raw = mkOption {
+ description = ''
+ Weiterleitungen aller historischen Dateipfade auf Kanonische Pfade
+ '';
+ type = with types; lazyAttrsOf str;
+ readOnly = true;
+ default =
+ with lib;
+ listToAttrs (
+ concatMap (
+ name:
+ if config.files.${name} ? locations then
+ map (loc: {
+ name = "/" + loc;
+ value = "/" + name;
+ }) (tail config.files.${name}.locations)
+ else
+ [ ]
+ ) (attrNames config.files)
+ );
+ };
+
+ redirects.caddy = mkOption {
+ description = ''
+ Weiterleitungen im Caddyfile-Format
+ '';
+ type = types.str;
+ readOnly = true;
+ default =
+ with lib;
+ let
+ lines = mapAttrsToList (name: value: ''redir "${name}" ${value} permanent'') config.redirects.raw;
+ in
+ concatStringsSep "\n" lines;
+ };
+
+ result = mkOption {
+ description = ''
+ Fertige Website als Verzeichnis
+ '';
+ type = types.package;
+ readOnly = true;
+ default =
+ let
+ script = ''
+ mkdir $out
+ ''
+ + lib.concatStringsSep "\n" copy;
+ copy = lib.mapAttrsToList (
+ path: file:
+ let
+ content = if file ? path then file.path else file;
+ in
+ ''
+ mkdir -p $out/$(dirname '${toString path}')
+ ${
+ "" # `--no-preserve-mode` ist erforderlich da Nix store paths read-only sind, und man andernfalls `cp -r` nicht durchführen kann.
+ }cp -r --no-preserve=mode ${content} $out/'${toString path}'
+ ''
+ ) config.files;
+ in
+ pkgs.runCommand "source" { } script;
+ };
+ };
+
+ config.types.document =
+ { lib, ... }:
+ let
+ inherit (lib) mkOption types;
+ in
+ {
+ options = {
+ locations = mkOption {
+ description = ''
+ Frühere Pfade dieses Dokuments
+
+ Einträge sind relative Pfade.
+ Der erste Eintrag ist der kanonische Pfad.
+ Alle anderen Elemente werden für Weiterleitungen zum kanonischen Pfad benutzt.
+ '';
+ type = with types; nonEmptyListOf str;
+ example = [
+ "about/overview"
+ "index"
+ ];
+ };
+ };
+ };
+
+ config.types.file =
+ { lib, ... }:
+ let
+ inherit (lib) mkOption types;
+ in
+ {
+ imports = [ config.types.document ];
+ options = {
+ path = mkOption {
+ type = types.path;
+ description = ''
+ Datei mit manuell gesteuertem Pfad
+ '';
+ };
+ };
+ };
+}
diff --git a/www/html.nix b/www/html.nix
new file mode 100644
index 0000000..6e48e2f
--- /dev/null
+++ b/www/html.nix
@@ -0,0 +1,57 @@
+{ self, ... }:
+{
+ perSystem =
+ { ... }:
+ {
+ websites.${self.domain} =
+ { lib, ... }:
+ let
+ inherit (lib) mkOption types;
+ in
+ {
+ files =
+ let
+ root = ./html;
+ files = lib.fileset.toList root;
+ redirects =
+ with lib;
+ mapAttrsToList
+ (name: value: {
+ name = head value.locations;
+ inherit value;
+ })
+ {
+ kindertag = {
+ path = ./html/Kalender/Kindertag-in-der-Mehrwertkultur.html;
+ locations = [
+ "Kalender/Kindertag-in-der-Mehrwertkultur.html"
+ "Kalender/Kindertag in der Mehrwertkultur.html"
+ ];
+ };
+ kinder-banner = {
+ path = ./html/Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png;
+ locations = [
+ "Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png"
+ "Kalender/Kindertag in der Mehrwertkultur_html_7312c2696b940296.png"
+ ];
+ };
+ contraZt-logo = {
+ path = ./html/Kalender/Kindertag-in-der-Mehrwertkultur_html_290e08fdf9314385.jpg;
+ locations = [
+ "Kalender/Kindertag-in-der-Mehrwertkultur_html_290e08fdf9314385.jpg"
+ "Kalender/Kindertag in der Mehrwertkultur_html_290e08fdf9314385.jpg"
+ ];
+ };
+ };
+ in
+ lib.listToAttrs (
+ redirects
+ ++ map (file: {
+ name = lib.path.removePrefix root file;
+ value = file;
+ }) files
+ );
+ };
+
+ };
+}
diff --git a/www/html/Kalender/Kindertag in der Mehrwertkultur.html b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur.html
index 39b693d..39b693d 100644
--- a/www/html/Kalender/Kindertag in der Mehrwertkultur.html
+++ b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur.html
diff --git a/www/html/Kalender/Kindertag in der Mehrwertkultur_html_290e08fdf9314385.jpg b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_290e08fdf9314385.jpg
index aae5162..aae5162 100644
--- a/www/html/Kalender/Kindertag in der Mehrwertkultur_html_290e08fdf9314385.jpg
+++ b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_290e08fdf9314385.jpg
Binary files differ
diff --git a/www/html/Kalender/Kindertag in der Mehrwertkultur_html_7312c2696b940296.png b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png
index e558cae..e558cae 100644
--- a/www/html/Kalender/Kindertag in der Mehrwertkultur_html_7312c2696b940296.png
+++ b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png
Binary files differ
diff --git a/www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf b/www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf
index a57f18c..a57f18c 100644
--- a/www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf
+++ b/www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf
Binary files differ