From 394d12a7b2f38605a68cc563228041fd8a7fed2f Mon Sep 17 00:00:00 2001 From: blake Date: Sun, 12 Oct 2025 14:55:09 -0500 Subject: [PATCH] clean up glance and try and add minecraft monitor --- flake.nix | 2 +- modules/homelab/services/glance/default.nix | 42 +--- .../{default.nix.WORKING => default.nix.bak} | 133 +++++----- .../services/glance/default.nix.hardswing | 230 ------------------ modules/homelab/services/glance/test.nix | 14 ++ modules/homelab/services/glance/yml.yaml | 97 ++++++++ .../homelab/services/yacreader/default.nix | 100 ++++++++ 7 files changed, 300 insertions(+), 318 deletions(-) rename modules/homelab/services/glance/{default.nix.WORKING => default.nix.bak} (57%) delete mode 100644 modules/homelab/services/glance/default.nix.hardswing create mode 100644 modules/homelab/services/glance/test.nix create mode 100644 modules/homelab/services/glance/yml.yaml create mode 100644 modules/homelab/services/yacreader/default.nix diff --git a/flake.nix b/flake.nix index 3969816..09780b9 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ # flake for blakes nixos config # define new devices in outputs -# generation: 363, timestamp: 2025-10-12 14:16:09 +# generation: 364, timestamp: 2025-10-12 14:54:50 { description = "blakes nix config"; inputs = { diff --git a/modules/homelab/services/glance/default.nix b/modules/homelab/services/glance/default.nix index f2635a4..4142861 100644 --- a/modules/homelab/services/glance/default.nix +++ b/modules/homelab/services/glance/default.nix @@ -98,7 +98,7 @@ in }; pages = [ { - name = "violet"; + name = "snowbelle"; hide-desktop-navigation = true; columns = [ { @@ -136,46 +136,30 @@ in cache = "1m"; title = "services"; sites = cfg.links.services; -# sites = [ -# { title = "jellyfin"; url = "https://media.blakedheld.xyz"; icon = "di:jellyfin"; } -# { title = "audiobookshelf"; url = "https://audiobooks.blakedheld.xyz"; icon = "di:audiobookshelf"; } -# { title = "yacreader"; url = "http://10.10.0.30:3434"; icon = "/assets/icons/yacreader.png"; } -# { title = "sonarr"; url = "http://10.10.0.30:3636"; icon = "di:sonarr"; } -# { title = "qbittorrent"; url = "http://10.10.0.40:3333"; icon = "di:qbittorrent"; } -# { title = "radarr"; url = "http://10.10.0.30:3737"; icon = "di:radarr"; } -# { title = "kiwix"; url = "http://10.10.0.30:5050"; icon = "di:kiwix"; } -# { title = "prowlarr"; url = "http://10.10.0.30:3535"; icon = "di:prowlarr"; } -# { title = "bazarr"; url = "http://10.10.0.30:3838"; icon = "di:bazarr"; } -# ]; } { type = "monitor"; cache = "1m"; title = "mediastack"; sites = cfg.links.mediastack; -# [ -# { title = "immich"; url = "https://pics.blakedheld.xyz"; icon = "di:immich"; } -# { title = "vaultwarden"; url = "https://pass.blakedheld.xyz"; icon = "di:vaultwarden"; } -# { title = "gitea"; url = "https://git.blakedheld.xyz"; icon = "di:gitea"; } -# { title = "home assistant"; url = "https://home.blakedheld.xyz"; icon = "di:home-assistant"; } -# { title = "zigbee2mqtt"; url = "http://10.10.0.30:4142"; icon = "di:zigbee2mqtt"; } -# { title = "syncthing"; url = "http://10.10.0.20:2222"; icon = "di:syncthing"; } -# { title = "archivebox"; url = "http://10.10.0.30:5656"; icon = "sh:archivebox"; } -# { title = "copyparty"; url = "http://10.10.0.20:3923"; icon = "sh:copyparty"; } -# ]; } { type = "monitor"; cache = "1m"; title = "system"; sites = cfg.links.system; -# [ -# { title = "proxmox"; url = "http://10.10.0.10:8006"; icon = "di:proxmox"; allow-insecure = true; } -# { title = "nginx"; url = "http://10.10.0.30:8080"; icon = "di:nginx"; } -# { title = "uptime kuma"; url = "http://10.10.0.30:8181"; icon = "di:uptime-kuma"; } -# { title = "tn holocron"; url = "https://10.10.0.20"; icon = "di:truenas"; allow-insecure = true; } -# { title = "bebe"; url = "https://10.10.0.1"; icon = "di:unifi"; allow-insecure = true; } -# ]; + } + { + type = "custom-api"; + title = "minecraft recpro"; + cache = "5s"; + allow-insecure = true; + url = "\${CRAFTY_URL}/api/v2/servers/\${CRAFTY_SERVER_ID}/stats"; + headers = { + Authorization = "Bearer \${CRAFTY_API_TOKEN}"; + Accept = "application/json"; + }; + template = "\n\n\n{{ $displayMOTD := true }}\n\n\n\n{{ $is_running := .JSON.Bool \"data.running\" }}\n{{ $online_players := .JSON.Int \"data.online\" | formatNumber }}\n{{ $max_players := .JSON.Int \"data.max\" | formatNumber }}\n{{ $name := .JSON.String \"data.world_name\" }}\n{{ $size := .JSON.String \"data.world_size\" }}\n{{ $version := .JSON.String \"data.version\" }}\n{{ $icon := .JSON.String \"data.icon\" }}\n{{ $server_ip := .JSON.String \"data.server_id.server_ip\" }}\n{{ $server_port := .JSON.String \"data.server_id.server_port\" }}\n{{ $motd := .JSON.String \"data.desc\" }}\n\n{{ $server_addr := \"\" }}\n{{ if and ($is_running) (eq $server_ip \"127.0.0.1\") }}\n {{ $server_addr = printf \"%s:%s\" (replaceMatches \"https?://\" \"\" \"\${CRAFTY_URL}\") $server_port }}\n{{ else if $is_running }}\n {{ $server_addr = printf \"%s:%s\" $server_ip $server_port }}\n{{ end }}\n\n{{ $starting := false }}\n{{ if and ($is_running) (eq $max_players \"0\") (eq $version \"False\") }}\n {{ $starting = true }}\n{{ end }}\n\n\n{{ $updating := .JSON.Bool \"data.updating\" }}\n{{ $importing := .JSON.Bool \"data.importing\" }}\n{{ $crashed := .JSON.Bool \"data.crashed\" }}\n\n
\n \n
\n {{ if eq $icon \"\" }}\n \"Server\n {{ else }}\n \"Server\n {{ end }}\n
\n\n \n
\n \n
\n \n {{ $name }}\n \n\n {{ if and ($is_running) (not $starting) (not (eq $server_addr \"\")) }}\n
\n \n {{ $server_addr }}\n \n
\n {{ end }}\n
\n\n \n {{ if and ($is_running) (not $starting) }}\n {{ if and (not (eq $motd \"\")) ($displayMOTD) }}\n
\n {{ replaceMatches \"§.\" \"\" $motd }}\n
\n {{ end }}\n\n
\n {{ $version }} - {{ $online_players }}/{{ $max_players }} players - {{ $size }}\n
\n\n \n {{ else if $starting }}\n
Server is starting up..
\n {{ else if $importing }}\n
Server is being imported..
\n {{ else if $updating }}\n
Server is being updated..
\n {{ else if $crashed }}\n
Server has crashed!
\n {{ else }}\n
Server is offline
\n {{ end }}\n
\n
"; } ]; } diff --git a/modules/homelab/services/glance/default.nix.WORKING b/modules/homelab/services/glance/default.nix.bak similarity index 57% rename from modules/homelab/services/glance/default.nix.WORKING rename to modules/homelab/services/glance/default.nix.bak index 30ce449..f2635a4 100644 --- a/modules/homelab/services/glance/default.nix.WORKING +++ b/modules/homelab/services/glance/default.nix.bak @@ -1,5 +1,21 @@ { pkgs, config, lib, ... }: +/* +this is a wrapper module for glance that allows you to +to pass monitor entries in with nix, all declaratively! + + | <8yy> | + V V + # add to glance + modules.services.glance.links.mediastack = [{ + title = service; + url = "https://${cfg.url}"; + error-url = "http://${homelab.host_ip}:${toString cfg.port}"; + check-url = "http://${homelab.host_ip}:${toString cfg.port}"; + icon = "di:${service}"; + allow-insecure = true; }]; +*/ + let service = "glance"; cfg = config.modules.services.${service}; @@ -36,20 +52,28 @@ in default = true; description = "enable backups for ${service}"; }; - pages = lib.mkOption { - type = lib.types.attrsOf (lib.types.submodule { - options.description = lib.mkOption { type = lib.types.str; }; - options.url = lib.mkOption { type = lib.types.str; }; - options.icon = lib.mkOption { type = lib.types.str; }; - options.category = lib.mkOption { type = lib.types.str; }; - }); - default = {}; - description = "configure the service for use in ${service}"; + links = { + services = lib.mkOption { + type = lib.types.listOf lib.types.attrs; + default = []; + description = "list of links for ${service}"; + }; + mediastack = lib.mkOption { + type = lib.types.listOf lib.types.attrs; + default = []; + description = "list of links for ${service}"; + }; + system = lib.mkOption { + type = lib.types.listOf lib.types.attrs; + default = []; + description = "list of links for ${service}"; + }; }; }; config = lib.mkIf cfg.enable { + # declare ${service} group users.groups.${service} = { gid = lib.mkForce cfg.ids; }; @@ -110,45 +134,48 @@ in { type = "monitor"; cache = "1m"; - title = "mediastack"; - sites = [ - { title = "jellyfin"; url = "https://media.blakedheld.xyz"; icon = "di:jellyfin"; } - { title = "audiobookshelf"; url = "https://audiobooks.blakedheld.xyz"; icon = "di:audiobookshelf"; } - { title = "yacreader"; url = "http://10.10.0.30:3434"; icon = "/assets/icons/yacreader.png"; } - { title = "sonarr"; url = "http://10.10.0.30:3636"; icon = "di:sonarr"; } - { title = "qbittorrent"; url = "http://10.10.0.40:3333"; icon = "di:qbittorrent"; } - { title = "radarr"; url = "http://10.10.0.30:3737"; icon = "di:radarr"; } - { title = "kiwix"; url = "http://10.10.0.30:5050"; icon = "di:kiwix"; } - { title = "prowlarr"; url = "http://10.10.0.30:3535"; icon = "di:prowlarr"; } - { title = "bazarr"; url = "http://10.10.0.30:3838"; icon = "di:bazarr"; } - ]; + title = "services"; + sites = cfg.links.services; +# sites = [ +# { title = "jellyfin"; url = "https://media.blakedheld.xyz"; icon = "di:jellyfin"; } +# { title = "audiobookshelf"; url = "https://audiobooks.blakedheld.xyz"; icon = "di:audiobookshelf"; } +# { title = "yacreader"; url = "http://10.10.0.30:3434"; icon = "/assets/icons/yacreader.png"; } +# { title = "sonarr"; url = "http://10.10.0.30:3636"; icon = "di:sonarr"; } +# { title = "qbittorrent"; url = "http://10.10.0.40:3333"; icon = "di:qbittorrent"; } +# { title = "radarr"; url = "http://10.10.0.30:3737"; icon = "di:radarr"; } +# { title = "kiwix"; url = "http://10.10.0.30:5050"; icon = "di:kiwix"; } +# { title = "prowlarr"; url = "http://10.10.0.30:3535"; icon = "di:prowlarr"; } +# { title = "bazarr"; url = "http://10.10.0.30:3838"; icon = "di:bazarr"; } +# ]; } { type = "monitor"; cache = "1m"; - title = "services"; - sites = [ - { title = "immich"; url = "https://pics.blakedheld.xyz"; icon = "di:immich"; } - { title = "vaultwarden"; url = "https://pass.blakedheld.xyz"; icon = "di:vaultwarden"; } - { title = "gitea"; url = "https://git.blakedheld.xyz"; icon = "di:gitea"; } - { title = "home assistant"; url = "https://home.blakedheld.xyz"; icon = "di:home-assistant"; } - { title = "zigbee2mqtt"; url = "http://10.10.0.30:4142"; icon = "di:zigbee2mqtt"; } - { title = "syncthing"; url = "http://10.10.0.20:2222"; icon = "di:syncthing"; } - { title = "archivebox"; url = "http://10.10.0.30:5656"; icon = "sh:archivebox"; } - { title = "copyparty"; url = "http://10.10.0.20:3923"; icon = "sh:copyparty"; } - ]; + title = "mediastack"; + sites = cfg.links.mediastack; +# [ +# { title = "immich"; url = "https://pics.blakedheld.xyz"; icon = "di:immich"; } +# { title = "vaultwarden"; url = "https://pass.blakedheld.xyz"; icon = "di:vaultwarden"; } +# { title = "gitea"; url = "https://git.blakedheld.xyz"; icon = "di:gitea"; } +# { title = "home assistant"; url = "https://home.blakedheld.xyz"; icon = "di:home-assistant"; } +# { title = "zigbee2mqtt"; url = "http://10.10.0.30:4142"; icon = "di:zigbee2mqtt"; } +# { title = "syncthing"; url = "http://10.10.0.20:2222"; icon = "di:syncthing"; } +# { title = "archivebox"; url = "http://10.10.0.30:5656"; icon = "sh:archivebox"; } +# { title = "copyparty"; url = "http://10.10.0.20:3923"; icon = "sh:copyparty"; } +# ]; } { type = "monitor"; cache = "1m"; title = "system"; - sites = [ - { title = "proxmox"; url = "http://10.10.0.10:8006"; icon = "di:proxmox"; allow-insecure = true; } - { title = "nginx"; url = "http://10.10.0.30:8080"; icon = "di:nginx"; } - { title = "uptime kuma"; url = "http://10.10.0.30:8181"; icon = "di:uptime-kuma"; } - { title = "tn holocron"; url = "https://10.10.0.20"; icon = "di:truenas"; allow-insecure = true; } - { title = "bebe"; url = "https://10.10.0.1"; icon = "di:unifi"; allow-insecure = true; } - ]; + sites = cfg.links.system; +# [ +# { title = "proxmox"; url = "http://10.10.0.10:8006"; icon = "di:proxmox"; allow-insecure = true; } +# { title = "nginx"; url = "http://10.10.0.30:8080"; icon = "di:nginx"; } +# { title = "uptime kuma"; url = "http://10.10.0.30:8181"; icon = "di:uptime-kuma"; } +# { title = "tn holocron"; url = "https://10.10.0.20"; icon = "di:truenas"; allow-insecure = true; } +# { title = "bebe"; url = "https://10.10.0.1"; icon = "di:unifi"; allow-insecure = true; } +# ]; } ]; } @@ -196,25 +223,6 @@ in # # open firewall # networking.firewall.allowedTCPPorts = [ cfg.port ]; - # internal reverse proxy entry - services.nginx.virtualHosts."${cfg.url}" = { - forceSSL = true; - sslCertificate = sec."ssl_blakedheld_crt".path; - sslCertificateKey = sec."ssl_blakedheld_key".path; - locations."/" = { - proxyPass = "http://127.0.0.1:${toString cfg.port}"; - }; - }; -# # external reverse proxy entry -# services.nginx.virtualHosts."${service}.blakedheld.xyz" = { -# forceSSL = true; -# sslCertificate = sec."ssl_blakedheld_crt".path; -# sslCertificateKey = sec."ssl_blakedheld_key".path; -# locations."/" = { -# proxyPass = "http://127.0.0.1:${toString cfg.port}"; -# }; -# }; -# # sops.secrets = { # "${service}_" = { # owner = "${service}"; @@ -222,6 +230,15 @@ in # }; # }; + # add to caddy for reverse proxy + services.caddy.virtualHosts."${cfg.url}" = { +# serverAliases = [ "${homelab.public_domain}" ]; + extraConfig = '' + tls ${sec."ssl_blakedheld_crt".path} ${sec."ssl_blakedheld_key".path} + reverse_proxy http://127.0.0.1:${toString cfg.port} + ''; + }; + # add to backups modules.system.backups.baks = { ${service} = { paths = [ cfg.data_dir ]; }; diff --git a/modules/homelab/services/glance/default.nix.hardswing b/modules/homelab/services/glance/default.nix.hardswing deleted file mode 100644 index 30ce449..0000000 --- a/modules/homelab/services/glance/default.nix.hardswing +++ /dev/null @@ -1,230 +0,0 @@ -{ pkgs, config, lib, ... }: - -let - service = "glance"; - cfg = config.modules.services.${service}; - sec = config.sops.secrets; - homelab = config.modules.homelab; -in -{ - options.modules.services.${service} = { - enable = lib.mkEnableOption "enables ${service}"; - - # set port options - port = lib.mkOption { - type = lib.types.int; - default = 7700; - description = "set port for ${service} (default: ${toString cfg.port}"; - }; - url = lib.mkOption { - type = lib.types.str; - default = "${homelab.base_domain}"; - description = "set domain for ${service}"; - }; - data_dir = lib.mkOption { - type = lib.types.str; - default = "/var/lib/${service}"; - description = "set data directory for ${service}"; - }; - ids = lib.mkOption { - type = lib.types.int; - default = cfg.port; - description = "set uid and pid of ${service} user (matches port by default)"; - }; - backup = lib.mkOption { - type = lib.types.bool; - default = true; - description = "enable backups for ${service}"; - }; - pages = lib.mkOption { - type = lib.types.attrsOf (lib.types.submodule { - options.description = lib.mkOption { type = lib.types.str; }; - options.url = lib.mkOption { type = lib.types.str; }; - options.icon = lib.mkOption { type = lib.types.str; }; - options.category = lib.mkOption { type = lib.types.str; }; - }); - default = {}; - description = "configure the service for use in ${service}"; - }; - }; - - config = lib.mkIf cfg.enable { - - # declare ${service} group - users.groups.${service} = { gid = lib.mkForce cfg.ids; }; - - # declare ${service} user - users.users.${service} = { - description = "${service} server user"; - uid = lib.mkForce cfg.ids; - isSystemUser = true; - home = cfg.data_dir; - createHome = true; - group = "${service}"; - extraGroups = []; - }; - - services.${service} = { - enable = true; - openFirewall = true; - settings = { - server = { - host = "0.0.0.0"; - port = cfg.port; - }; - pages = [ - { - name = "violet"; - hide-desktop-navigation = true; - columns = [ - { - size = "small"; - widgets = [ - { type = "calendar"; first-day-of-week = "monday"; } - { type = "server-stats"; servers = [ { type = "local"; name = "violet"; } ]; } - { - type = "clock"; - hour-format = "24h"; - timezones = [ - { timezone = "America/Chicago"; label = "HTX"; } - { timezone = "America/Denver"; label = "AF"; } - ]; - } - { type = "twitch-channels"; channels = [ "mang0" "SaltSSBM" "thewaffle77" "ironmouse" "linustech" ]; } - ]; - } - { - size = "full"; - widgets = [ - { - type = "search"; - autofocus = true; - search-engine = "https://www.ecosia.org/search?q={QUERY}"; - new-tab = true; - bangs = [ - { title = "YouTube"; shortcut = "!y"; url = "https://www.youtube.com/results?search_query={QUERY}"; } - { title = "Google"; shortcut = "!g"; url = "https://www.google.com/search?q={QUERY}"; } - { title = "Github"; shortcut = "!gh"; url = "https://github.com/search?q={QUERY}&type=repositories"; } - ]; - } - { - type = "monitor"; - cache = "1m"; - title = "mediastack"; - sites = [ - { title = "jellyfin"; url = "https://media.blakedheld.xyz"; icon = "di:jellyfin"; } - { title = "audiobookshelf"; url = "https://audiobooks.blakedheld.xyz"; icon = "di:audiobookshelf"; } - { title = "yacreader"; url = "http://10.10.0.30:3434"; icon = "/assets/icons/yacreader.png"; } - { title = "sonarr"; url = "http://10.10.0.30:3636"; icon = "di:sonarr"; } - { title = "qbittorrent"; url = "http://10.10.0.40:3333"; icon = "di:qbittorrent"; } - { title = "radarr"; url = "http://10.10.0.30:3737"; icon = "di:radarr"; } - { title = "kiwix"; url = "http://10.10.0.30:5050"; icon = "di:kiwix"; } - { title = "prowlarr"; url = "http://10.10.0.30:3535"; icon = "di:prowlarr"; } - { title = "bazarr"; url = "http://10.10.0.30:3838"; icon = "di:bazarr"; } - ]; - } - { - type = "monitor"; - cache = "1m"; - title = "services"; - sites = [ - { title = "immich"; url = "https://pics.blakedheld.xyz"; icon = "di:immich"; } - { title = "vaultwarden"; url = "https://pass.blakedheld.xyz"; icon = "di:vaultwarden"; } - { title = "gitea"; url = "https://git.blakedheld.xyz"; icon = "di:gitea"; } - { title = "home assistant"; url = "https://home.blakedheld.xyz"; icon = "di:home-assistant"; } - { title = "zigbee2mqtt"; url = "http://10.10.0.30:4142"; icon = "di:zigbee2mqtt"; } - { title = "syncthing"; url = "http://10.10.0.20:2222"; icon = "di:syncthing"; } - { title = "archivebox"; url = "http://10.10.0.30:5656"; icon = "sh:archivebox"; } - { title = "copyparty"; url = "http://10.10.0.20:3923"; icon = "sh:copyparty"; } - ]; - } - { - type = "monitor"; - cache = "1m"; - title = "system"; - sites = [ - { title = "proxmox"; url = "http://10.10.0.10:8006"; icon = "di:proxmox"; allow-insecure = true; } - { title = "nginx"; url = "http://10.10.0.30:8080"; icon = "di:nginx"; } - { title = "uptime kuma"; url = "http://10.10.0.30:8181"; icon = "di:uptime-kuma"; } - { title = "tn holocron"; url = "https://10.10.0.20"; icon = "di:truenas"; allow-insecure = true; } - { title = "bebe"; url = "https://10.10.0.1"; icon = "di:unifi"; allow-insecure = true; } - ]; - } - ]; - } - { - size = "small"; - widgets = [ - { type = "weather"; location = "Pearland, Texas, United States"; units = "imperial"; hour-format = "24h"; } - { - type = "markets"; - markets = [ - { symbol = "SPY"; name = "S&P 500"; } - { symbol = "XMR-USD"; name = "Monero"; } - { symbol = "NVDA"; name = "NVIDIA"; } - { symbol = "AAPL"; name = "Apple"; } - { symbol = "MSFT"; name = "Microsoft"; } - ]; - } - { - type = "releases"; - cache = "1d"; - repositories = [ - "glanceapp/glance" - "go-gitea/gitea" - "immich-app/immich" - "syncthing/syncthing" - ]; - } - ]; - } - ]; - } - ]; - }; - }; - - - - # override umask to make permissions work out - systemd.services.${service}.serviceConfig = { - UMask = lib.mkForce "0007"; -# User = "${service}"; -# Group = "${service}"; - }; - -# # open firewall -# networking.firewall.allowedTCPPorts = [ cfg.port ]; - - # internal reverse proxy entry - services.nginx.virtualHosts."${cfg.url}" = { - forceSSL = true; - sslCertificate = sec."ssl_blakedheld_crt".path; - sslCertificateKey = sec."ssl_blakedheld_key".path; - locations."/" = { - proxyPass = "http://127.0.0.1:${toString cfg.port}"; - }; - }; -# # external reverse proxy entry -# services.nginx.virtualHosts."${service}.blakedheld.xyz" = { -# forceSSL = true; -# sslCertificate = sec."ssl_blakedheld_crt".path; -# sslCertificateKey = sec."ssl_blakedheld_key".path; -# locations."/" = { -# proxyPass = "http://127.0.0.1:${toString cfg.port}"; -# }; -# }; -# -# sops.secrets = { -# "${service}_" = { -# owner = "${service}"; -# group = "${service}"; -# }; -# }; - - # add to backups - modules.system.backups.baks = { - ${service} = { paths = [ cfg.data_dir ]; }; - }; - }; -} diff --git a/modules/homelab/services/glance/test.nix b/modules/homelab/services/glance/test.nix new file mode 100644 index 0000000..2a59d73 --- /dev/null +++ b/modules/homelab/services/glance/test.nix @@ -0,0 +1,14 @@ +[ + { + type = "custom-api"; + title = "Crafty Controller — Minecraft Server"; + cache = "5s"; + allow-insecure = true; + url = "\${CRAFTY_URL}/api/v2/servers/\${CRAFTY_SERVER_ID}/stats"; + headers = { + Authorization = "Bearer \${CRAFTY_API_TOKEN}"; + Accept = "application/json"; + }; + template = "\n\n\n{{ $displayMOTD := true }}\n\n\n\n{{ $is_running := .JSON.Bool \"data.running\" }}\n{{ $online_players := .JSON.Int \"data.online\" | formatNumber }}\n{{ $max_players := .JSON.Int \"data.max\" | formatNumber }}\n{{ $name := .JSON.String \"data.world_name\" }}\n{{ $size := .JSON.String \"data.world_size\" }}\n{{ $version := .JSON.String \"data.version\" }}\n{{ $icon := .JSON.String \"data.icon\" }}\n{{ $server_ip := .JSON.String \"data.server_id.server_ip\" }}\n{{ $server_port := .JSON.String \"data.server_id.server_port\" }}\n{{ $motd := .JSON.String \"data.desc\" }}\n\n{{ $server_addr := \"\" }}\n{{ if and ($is_running) (eq $server_ip \"127.0.0.1\") }}\n {{ $server_addr = printf \"%s:%s\" (replaceMatches \"https?://\" \"\" \"\${CRAFTY_URL}\") $server_port }}\n{{ else if $is_running }}\n {{ $server_addr = printf \"%s:%s\" $server_ip $server_port }}\n{{ end }}\n\n{{ $starting := false }}\n{{ if and ($is_running) (eq $max_players \"0\") (eq $version \"False\") }}\n {{ $starting = true }}\n{{ end }}\n\n\n{{ $updating := .JSON.Bool \"data.updating\" }}\n{{ $importing := .JSON.Bool \"data.importing\" }}\n{{ $crashed := .JSON.Bool \"data.crashed\" }}\n\n
\n \n
\n {{ if eq $icon \"\" }}\n \"Server\n {{ else }}\n \"Server\n {{ end }}\n
\n\n \n
\n \n
\n \n {{ $name }}\n \n\n {{ if and ($is_running) (not $starting) (not (eq $server_addr \"\")) }}\n
\n \n {{ $server_addr }}\n \n
\n {{ end }}\n
\n\n \n {{ if and ($is_running) (not $starting) }}\n {{ if and (not (eq $motd \"\")) ($displayMOTD) }}\n
\n {{ replaceMatches \"§.\" \"\" $motd }}\n
\n {{ end }}\n\n
\n {{ $version }} - {{ $online_players }}/{{ $max_players }} players - {{ $size }}\n
\n\n \n {{ else if $starting }}\n
Server is starting up..
\n {{ else if $importing }}\n
Server is being imported..
\n {{ else if $updating }}\n
Server is being updated..
\n {{ else if $crashed }}\n
Server has crashed!
\n {{ else }}\n
Server is offline
\n {{ end }}\n
\n
"; + } +] diff --git a/modules/homelab/services/glance/yml.yaml b/modules/homelab/services/glance/yml.yaml new file mode 100644 index 0000000..41a106c --- /dev/null +++ b/modules/homelab/services/glance/yml.yaml @@ -0,0 +1,97 @@ +- type: custom-api + title: Crafty Controller — Minecraft Server + cache: 5s + allow-insecure: true + url: ${CRAFTY_URL}/api/v2/servers/${CRAFTY_SERVER_ID}/stats + headers: + Authorization: Bearer ${CRAFTY_API_TOKEN} + Accept: application/json + template: | + + + + {{ $displayMOTD := true }} + + + + {{ $is_running := .JSON.Bool "data.running" }} + {{ $online_players := .JSON.Int "data.online" | formatNumber }} + {{ $max_players := .JSON.Int "data.max" | formatNumber }} + {{ $name := .JSON.String "data.world_name" }} + {{ $size := .JSON.String "data.world_size" }} + {{ $version := .JSON.String "data.version" }} + {{ $icon := .JSON.String "data.icon" }} + {{ $server_ip := .JSON.String "data.server_id.server_ip" }} + {{ $server_port := .JSON.String "data.server_id.server_port" }} + {{ $motd := .JSON.String "data.desc" }} + + {{ $server_addr := "" }} + {{ if and ($is_running) (eq $server_ip "127.0.0.1") }} + {{ $server_addr = printf "%s:%s" (replaceMatches "https?://" "" "${CRAFTY_URL}") $server_port }} + {{ else if $is_running }} + {{ $server_addr = printf "%s:%s" $server_ip $server_port }} + {{ end }} + + {{ $starting := false }} + {{ if and ($is_running) (eq $max_players "0") (eq $version "False") }} + {{ $starting = true }} + {{ end }} + + + {{ $updating := .JSON.Bool "data.updating" }} + {{ $importing := .JSON.Bool "data.importing" }} + {{ $crashed := .JSON.Bool "data.crashed" }} + +
+ +
+ {{ if eq $icon "" }} + Server icon + {{ else }} + Server icon + {{ end }} +
+ + +
+ +
+ + {{ $name }} + + + {{ if and ($is_running) (not $starting) (not (eq $server_addr "")) }} +
+ + {{ $server_addr }} + +
+ {{ end }} +
+ + + {{ if and ($is_running) (not $starting) }} + {{ if and (not (eq $motd "")) ($displayMOTD) }} +
+ {{ replaceMatches "§." "" $motd }} +
+ {{ end }} + +
+ {{ $version }} - {{ $online_players }}/{{ $max_players }} players - {{ $size }} +
+ + + {{ else if $starting }} +
Server is starting up..
+ {{ else if $importing }} +
Server is being imported..
+ {{ else if $updating }} +
Server is being updated..
+ {{ else if $crashed }} +
Server has crashed!
+ {{ else }} +
Server is offline
+ {{ end }} +
+
diff --git a/modules/homelab/services/yacreader/default.nix b/modules/homelab/services/yacreader/default.nix new file mode 100644 index 0000000..052b58b --- /dev/null +++ b/modules/homelab/services/yacreader/default.nix @@ -0,0 +1,100 @@ +{ pkgs, config, lib, ... }: + +let + service = "yacreader"; + cfg = config.modules.services.${service}; + sec = config.sops.secrets; + homelab = config.modules.homelab; +in +{ + options.modules.services.${service} = { + enable = lib.mkEnableOption "enables ${service}"; + + # set port options + port = lib.mkOption { + type = lib.types.int; + default = 7102; + description = "set port for ${service} (default: ${toString cfg.port}"; + }; + url = lib.mkOption { + type = lib.types.str; + default = "manga.${homelab.base_domain}"; + description = "set domain for ${service}"; + }; + data_dir = lib.mkOption { + type = lib.types.str; + default = "/var/lib/${service}"; + description = "set data directory for ${service}"; + }; + ids = lib.mkOption { + type = lib.types.int; + default = cfg.port; + description = "set uid and pid of ${service} user (matches port by default)"; + }; + backup = lib.mkOption { + type = lib.types.bool; + default = true; + description = "enable backups for ${service}"; + }; + }; + + config = lib.mkIf cfg.enable { + + # declare ${service} group + users.groups.${service} = { gid = lib.mkForce cfg.ids; }; + + # declare ${service} user + users.users.${service} = { + description = "${service} server user"; + uid = lib.mkForce cfg.ids; + isSystemUser = true; + home = cfg.data_dir; + createHome = true; + group = "${service}"; + extraGroups = [ "media" ]; + }; + + # enable the ${service} service + services.${service} = { + enable = true; + openFirewall = true; + user = "${service}"; + group = "${service}"; + dataDir = cfg.data_dir; + settings = { + server.port = cfg.port; + }; + }; + + # override umask to make permissions work out + systemd.services.${service}.serviceConfig = { + UMask = lib.mkForce "0007"; +# User = "${service}"; +# Group = "${service}"; + }; + +# # open firewall +# networking.firewall.allowedTCPPorts = [ cfg.port ]; + + + # add to glance local service + modules.services.glance.links. = [{ + title = service; + url = "https://${cfg.url}"; + error-url = "http://${homelab.host_ip}:${toString cfg.port}"; + check-url = "http://${homelab.host_ip}:${toString cfg.port}"; + icon = "di:${service}"; }]; + +# sops.secrets = { +# "${service}_" = { +# owner = "${service}"; +# group = "${service}"; +# }; +# }; + + # add to backups + modules.system.backups.baks = { + ${service} = { paths = [ cfg.data_dir ]; }; + }; + }; +}