diff options
| -rw-r--r-- | default.nix | 17 | ||||
| -rw-r--r-- | www/caddy.nix | 24 | ||||
| -rw-r--r-- | www/flake-module.nix | 46 | ||||
| -rw-r--r-- | www/framework/default.nix | 134 | ||||
| -rw-r--r-- | www/html.nix | 57 | ||||
| -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) | bin | 33207 -> 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) | bin | 325031 -> 325031 bytes | |||
| -rw-r--r-- | www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf (renamed from www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf) | bin | 51362 -> 51362 bytes |
9 files changed, 262 insertions, 16 deletions
diff --git a/default.nix b/default.nix index 1e20ba6..0e8e2d5 100644 --- a/default.nix +++ b/default.nix @@ -23,15 +23,26 @@ flake-parts.lib.mkFlake inherit (flake) self; } ( - { self, lib, ... }: + { + self, + lib, + options, + config, + ... + }: { flake.inputs = flake.inputs; imports = with lib.fileset; toList ( # Alle Nix-Dateien in diesem Projekt sind Flake-Parts-Module - difference (fileFilter (file: file.hasExt "nix" && file.name != "flake.nix") ./.) ./default.nix - ); + difference (fileFilter (file: file.hasExt "nix") ./.) (unions [ + ./flake.nix + ./default.nix + ./www/framework + ]) + ) + ++ [ flake-parts.flakeModules.modules ]; systems = [ "x86_64-linux" ]; } ) 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 Binary files differindex 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 diff --git a/www/html/Kalender/Kindertag in der Mehrwertkultur_html_7312c2696b940296.png b/www/html/Kalender/Kindertag-in-der-Mehrwertkultur_html_7312c2696b940296.png Binary files differindex 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 diff --git a/www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf b/www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf Binary files differindex a57f18c..a57f18c 100644 --- a/www/html/img/Stadtteilbeirat Heimfeld Oktober 20.pdf +++ b/www/html/img/Stadtteilbeirat-Heimfeld-Oktober-20.pdf |
