{ config, containerCfg, pkgs, lib, builder, name,... }: let version = "latest"; serverCfg = config.syscfg.server; settings = pkgs.writers.writeYAML "settings.yaml" { title = "My Self-Hosted Dashboard"; description = ""; startUrl = "https://${containerCfg.subdomain}.${serverCfg.domain}"; background = { # image = "..."; blur = "sm"; #sm, md, xl,... # saturate = ""; # brightness = ""; # opacity = ""; }; cardBlur = "xs"; #xs, md, ... # favicon = ""; theme = "dark"; color = "slate"; pwa = { }; layout = { Admin = { style = "grid"; columns = 4; }; }; providers = { finnhub = "{{HOMEPAGE_VAR_FINNHUB}}"; }; headerStyle = "clean"; hideVersion = true; disableUpdateCheck = true; showStats = false; statusStyle = "dot"; hideErrors = true; }; widgets = pkgs.writers.writeYAML "widgets.yaml" [ {openmeteo = { latitude = "47.3769"; longitude = "8.5417"; timezone = "Europe/Zurich"; units = "metric"; cache = "15"; };} {search = { provider = "custom"; focus = true; showSearchSuggestions = true; target = "_blank"; } // (lib.optionalAttrs (serverCfg.containers?searxng) { url = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/search?q="; suggestionUrl = "https://${serverCfg.containers.searxng.subdomain}.${serverCfg.domain}/autocompleter?q="; }) } {stocks = { provider = "finnhub"; color = true; cache = 15; watchlist = containerCfg.extra.stocks or []; };} ]; bookmarks = pkgs.writers.writeYAML "bookmarks.yaml" [ ]; services = pkgs.writers.writeYAML "services.yaml" [ {Media = lib.flatten [ (lib.optional (serverCfg.containers?jellyfin) { Jellyfin={ icon = "jellyfin.png"; href = "https://${serverCfg.containers.jellyfin.subdomain}.${serverCfg.domain}"; widget = { type="jellyfin"; url = "http://jellyfin-server:8096"; key = "{{HOMEPAGE_VAR_JELLYFIN_API}}"; }; }; }) (lib.optional (serverCfg.containers?invidious) { Invidious={ icon = "invidious.png"; href = "https://${serverCfg.containers.invidious.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?miniflux) { Miniflux={ icon = "miniflux.png"; href = "https://${serverCfg.containers.miniflux.subdomain}.${serverCfg.domain}"; widget = { type="miniflux"; url = "http://miniflux-server"; key = "{{HOMEPAGE_VAR_MINIFLUX_API}}"; }; }; }) ];} {Cloud = lib.flatten [ (lib.optional (serverCfg.containers?nextcloud) { Nextcloud={ icon = "nextcloud.png"; href = "https://${serverCfg.containers.nextcloud.subdomain}.${serverCfg.domain}"; widget = { type="nextcloud"; url = "http://nextcloud-server:80"; key = "{{HOMEPAGE_VAR_NEXTCLOUD_API}}"; }; }; }) (lib.optional (serverCfg.containers?ethercalc) { Ethercalc={ icon = "ethercalc.png"; href = "https://${serverCfg.containers.ethercalc.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?etherpad) { Etherpad={ icon = "etherpad.png"; href = "https://${serverCfg.containers.etherpad.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?immich) { immich={ icon = "immich.png"; href = "https://${serverCfg.containers.immich.subdomain}.${serverCfg.domain}"; widget = { type="immich"; url = "http://immich-server:80"; key = "{{HOMEPAGE_VAR_IMMICH_API}}"; version = "2"; }; }; }) ];} {Dev = lib.flatten [ (lib.optional (serverCfg.containers?gitea) { Gitea={ icon = "gitea.png"; href = "https://${serverCfg.containers.gitea.subdomain}.${serverCfg.domain}"; # widget = { # type="gitea"; # url = "http://gitea-server:8080"; # key = "{{HOMEPAGE_VAR_GITEA_API}}"; # }; }; }) ];} {Admin = #lib.flatten [ #({permissions.groups = ["admin"];}) #({services = lib.flatten [ (lib.optional (serverCfg.containers?traefik) { Traefik={ icon = "traefik.png"; href = "https://${serverCfg.containers.traefik.subdomain}.${serverCfg.domain}"; widget = { type = "traefik"; url = "http://traefik-server:8080"; }; }; }) (lib.optional (serverCfg.containers?authentik) { Authentik={ icon = "authentik.png"; href = "https://${serverCfg.containers.authentik.subdomain}.${serverCfg.domain}"; widget = { type = "authentik"; url = "http://authentik-server:9000"; key = "{{HOMEPAGE_VAR_AUTHENTIK_API}}"; version = "2"; }; }; }) (lib.optional (serverCfg.containers?umami) { Umami={ icon = "umami.png"; href = "https://${serverCfg.containers.umami.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?influx) { Influx={ icon = "influx.png"; href = "https://${serverCfg.containers.influx.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?handbrake) { Handbrake={ icon = "handbrake.png"; href = "https://${serverCfg.containers.handbrake.subdomain}.${serverCfg.domain}"; }; }) (lib.optional (serverCfg.containers?transmission) { Transmission={ icon = "transmission.png"; href = "https://${serverCfg.containers.transmission.subdomain}.${serverCfg.domain}/transmission"; widget = { type = "transmission"; url = "http://transmission-server:9091"; rpcUrl = "/transmission/"; }; }; }) (lib.optional (serverCfg.containers?servarr) ( let modules = serverCfg.containers.servarr.extra.modules or ["prowlarr" "sonarr" "radarr" "flaresolverr" ]; in (lib.optional (builtins.elem "sonarr" modules) { Sonarr={ icon = "sonarr.png"; href = "https://${serverCfg.containers.servarr.subdomain}.${serverCfg.domain}/sonarr"; widget = { type = "sonarr"; url = "http://servarr-sonarr:8989"; key = "{{HOMEPAGE_VAR_SONARR_API}}"; }; }; }) ++ (lib.optional (builtins.elem "radarr" modules) { Radarr={ icon = "radarr.png"; href = "https://${serverCfg.containers.servarr.subdomain}.${serverCfg.domain}/radarr"; widget = { type = "radarr"; url = "http://servarr-radarr:8989"; key = "{{HOMEPAGE_VAR_RADARR_API}}"; }; }; }) ++ (lib.optional (builtins.elem "lidarr" modules) { Lidarr={ icon = "lidarr.png"; href = "https://${serverCfg.containers.servarr.subdomain}.${serverCfg.domain}/lidarr"; widget = { type = "lidarr"; url = "http://servarr-lidarr:8989"; key = "{{HOMEPAGE_VAR_LIDARR_API}}"; }; }; }) ++ (lib.optional (builtins.elem "prowlarr" modules) { Prowlarr={ icon = "prowlarr.png"; href = "https://${serverCfg.containers.servarr.subdomain}.${serverCfg.domain}/prowlarr"; widget = { type = "prowlarr"; url = "http://servarr-prowlarr:8989"; key = "{{HOMEPAGE_VAR_PROWLARR_API}}"; }; }; }) # Bazarr )) ];}#)];} ]; in { sops = false; db = false; containers = { server = builder.mkContainer { subdomain = containerCfg.subdomain; image = "ghcr.io/gethomepage/homepage:${version}"; port = 3000; extraEnv = { HOMEPAGE_VAR_TITLE="${serverCfg.domain}"; HOMEPAGE_ALLOWED_HOSTS = "${containerCfg.subdomain}.${serverCfg.domain},${builder.host}"; }; extraLabels = { "traefik.http.routers.${containerCfg.subdomain}.service" = "${containerCfg.subdomain}"; }; overrides = { environmentFiles = [ config.sops.secrets."CUSTOM".path ]; volumes = [ "${settings}:/app/config/settings.yaml:ro" "${services}:/app/config/services.yaml:ro" "${widgets}:/app/config/widgets.yaml:ro" "${bookmarks}:/app/config/bookmarks.yaml:ro" ]; }; }; }; }