From 554a268369e3c68cc1adf8a8a5905c81ae2ad428 Mon Sep 17 00:00:00 2001 From: lew Date: Wed, 29 Apr 2026 18:17:56 +0100 Subject: [PATCH] import favicons into all **.ily.rs sites --- assets/favicons/favicon.png | Bin 0 -> 15050 bytes assets/favicons/favicon.svg | 11 +++++++++++ hosts/lab/default.nix | 1 + hosts/lab/dokuwiki.nix | 2 ++ hosts/lab/forgejo.nix | 1 + hosts/lab/foundry.nix | 1 + hosts/lab/shlink.nix | 2 ++ hosts/lab/sites.nix | 2 ++ hosts/lab/tinyauth.nix | 1 + modules/favicons.nix | 18 ++++++++++++++++++ modules/site.nix | 6 ++++++ 11 files changed, 45 insertions(+) create mode 100644 assets/favicons/favicon.png create mode 100644 assets/favicons/favicon.svg create mode 100644 modules/favicons.nix diff --git a/assets/favicons/favicon.png b/assets/favicons/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..72f673f7379c2fbf54b56e56c2281be453a12321 GIT binary patch literal 15050 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 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon.svg b/assets/favicons/favicon.svg new file mode 100644 index 0000000..e99f3fe --- /dev/null +++ b/assets/favicons/favicon.svg @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/hosts/lab/default.nix b/hosts/lab/default.nix index daa272e..8a8f5bb 100644 --- a/hosts/lab/default.nix +++ b/hosts/lab/default.nix @@ -6,6 +6,7 @@ ./foundry.nix ./dokuwiki.nix ./forgejo.nix + ../../modules/favicons.nix ../../modules/site.nix ./sites.nix ./fail2ban.nix diff --git a/hosts/lab/dokuwiki.nix b/hosts/lab/dokuwiki.nix index 9a3d213..b70b40f 100644 --- a/hosts/lab/dokuwiki.nix +++ b/hosts/lab/dokuwiki.nix @@ -18,6 +18,8 @@ in { services.caddy.virtualHosts."wiki.ily.rs" = { extraConfig = '' + import favicons + @health path /health-ping handle @health { respond 200 diff --git a/hosts/lab/forgejo.nix b/hosts/lab/forgejo.nix index 26ed025..4bf72bb 100644 --- a/hosts/lab/forgejo.nix +++ b/hosts/lab/forgejo.nix @@ -11,6 +11,7 @@ in services.caddy.virtualHosts."git.ily.rs" = { extraConfig = '' + import favicons reverse_proxy localhost:${toString srv.HTTP_PORT} encode zstd gzip ''; diff --git a/hosts/lab/foundry.nix b/hosts/lab/foundry.nix index 2c64480..c3f71e2 100644 --- a/hosts/lab/foundry.nix +++ b/hosts/lab/foundry.nix @@ -2,6 +2,7 @@ { services.caddy.virtualHosts."foundry.ily.rs" = { extraConfig = '' + import favicons reverse_proxy localhost:30000 encode zstd gzip ''; diff --git a/hosts/lab/shlink.nix b/hosts/lab/shlink.nix index d73751f..010aeed 100644 --- a/hosts/lab/shlink.nix +++ b/hosts/lab/shlink.nix @@ -40,6 +40,8 @@ services.caddy.virtualHosts."links.ily.rs" = { extraConfig = '' + import favicons + @health path /health-ping handle @health { respond 200 diff --git a/hosts/lab/sites.nix b/hosts/lab/sites.nix index bd40fd7..6773029 100644 --- a/hosts/lab/sites.nix +++ b/hosts/lab/sites.nix @@ -49,6 +49,8 @@ in # (light_theme/dark_theme/extra_themes) needs 0.22+. Pull from unstable. extraBuildPackages = [ unstable.zola ]; caddyConfig = '' + import favicons + root * /srv/website/repo/public encode zstd gzip diff --git a/hosts/lab/tinyauth.nix b/hosts/lab/tinyauth.nix index cd782e3..b9ee9e2 100644 --- a/hosts/lab/tinyauth.nix +++ b/hosts/lab/tinyauth.nix @@ -16,6 +16,7 @@ services.caddy.virtualHosts."auth.ily.rs" = { extraConfig = '' + import favicons reverse_proxy localhost:3002 encode zstd gzip ''; diff --git a/modules/favicons.nix b/modules/favicons.nix new file mode 100644 index 0000000..840d388 --- /dev/null +++ b/modules/favicons.nix @@ -0,0 +1,18 @@ +{ ... }: +let + faviconRoot = ../assets/favicons; +in +{ + services.caddy.extraConfig = '' + (favicons) { + @favicon path /favicon.ico /favicon.svg /favicon.png /apple-touch-icon.png /apple-touch-icon-precomposed.png + handle @favicon { + root * ${faviconRoot} + @needs_png path /favicon.ico /apple-touch-icon.png /apple-touch-icon-precomposed.png + rewrite @needs_png /favicon.png + header Cache-Control "public, max-age=86400" + file_server + } + } + ''; +} diff --git a/modules/site.nix b/modules/site.nix index bd41de7..223145c 100644 --- a/modules/site.nix +++ b/modules/site.nix @@ -176,11 +176,13 @@ in ${site.domain}.extraConfig = if site.caddyConfig != null then site.caddyConfig else if site.static then '' + import favicons root * ${site.dataDir}/repo/${site.buildOutputDir} encode zstd gzip try_files {path} /index.html file_server '' else '' + import favicons reverse_proxy localhost:${toString site.port} encode zstd gzip ''; @@ -193,6 +195,8 @@ in ) cfg) ++ (mapAttrsToList (name: site: let previewDataDir = "/srv/${name}-preview"; in { ${site.preview.domain}.extraConfig = if site.static then '' + import favicons + @health path /health-ping handle @health { respond 200 @@ -205,6 +209,8 @@ in file_server } '' else '' + import favicons + @health path /health-ping handle @health { respond 200