diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 48cbc404a815..a20fbd69a2cb 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -646,6 +646,7 @@ ./services/misc/greenclip.nix ./services/misc/headphones.nix ./services/misc/heisenbridge.nix + ./services/misc/homepage-dashboard.nix ./services/misc/ihaskell.nix ./services/misc/input-remapper.nix ./services/misc/irkerd.nix diff --git a/nixos/modules/services/misc/homepage-dashboard.nix b/nixos/modules/services/misc/homepage-dashboard.nix new file mode 100644 index 000000000000..e68571253433 --- /dev/null +++ b/nixos/modules/services/misc/homepage-dashboard.nix @@ -0,0 +1,55 @@ +{ config +, pkgs +, lib +, ... +}: + +let + cfg = config.services.homepage-dashboard; +in +{ + options = { + services.homepage-dashboard = { + enable = lib.mkEnableOption (lib.mdDoc "Homepage Dashboard"); + + package = lib.mkPackageOptionMD pkgs "homepage-dashboard" { }; + + openFirewall = lib.mkOption { + type = lib.types.bool; + default = false; + description = lib.mdDoc "Open ports in the firewall for Homepage."; + }; + + listenPort = lib.mkOption { + type = lib.types.int; + default = 8082; + description = lib.mdDoc "Port for Homepage to bind to."; + }; + }; + }; + + config = lib.mkIf cfg.enable { + systemd.services.homepage-dashboard = { + description = "Homepage Dashboard"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + environment = { + HOMEPAGE_CONFIG_DIR = "/var/lib/homepage-dashboard"; + PORT = "${toString cfg.listenPort}"; + }; + + serviceConfig = { + Type = "simple"; + DynamicUser = true; + StateDirectory = "homepage-dashboard"; + ExecStart = "${lib.getExe cfg.package}"; + Restart = "on-failure"; + }; + }; + + networking.firewall = lib.mkIf cfg.openFirewall { + allowedTCPPorts = [ cfg.listenPort ]; + }; + }; +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 790de7bbdc47..723b030072e1 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -337,6 +337,7 @@ in { hbase3 = handleTest ./hbase.nix { package=pkgs.hbase3; }; hedgedoc = handleTest ./hedgedoc.nix {}; herbstluftwm = handleTest ./herbstluftwm.nix {}; + homepage-dashboard = handleTest ./homepage-dashboard.nix {}; installed-tests = pkgs.recurseIntoAttrs (handleTest ./installed-tests {}); invidious = handleTest ./invidious.nix {}; oci-containers = handleTestOn ["aarch64-linux" "x86_64-linux"] ./oci-containers.nix {}; diff --git a/nixos/tests/homepage-dashboard.nix b/nixos/tests/homepage-dashboard.nix new file mode 100644 index 000000000000..56e077f5ff6d --- /dev/null +++ b/nixos/tests/homepage-dashboard.nix @@ -0,0 +1,14 @@ +import ./make-test-python.nix ({ lib, ... }: { + name = "homepage-dashboard"; + meta.maintainers = with lib.maintainers; [ jnsgruk ]; + + nodes.machine = { pkgs, ... }: { + services.homepage-dashboard.enable = true; + }; + + testScript = '' + machine.wait_for_unit("homepage-dashboard.service") + machine.wait_for_open_port(8082) + machine.succeed("curl --fail http://localhost:8082/") + ''; +}) diff --git a/pkgs/servers/homepage-dashboard/default.nix b/pkgs/servers/homepage-dashboard/default.nix new file mode 100644 index 000000000000..1c8c283e9c3e --- /dev/null +++ b/pkgs/servers/homepage-dashboard/default.nix @@ -0,0 +1,82 @@ +{ buildNpmPackage +, fetchFromGitHub +, nodePackages +, python3 +, lib +, fetchpatch +, makeBinaryWrapper +, nixosTests +}: + +buildNpmPackage rec { + pname = "homepage-dashboard"; + version = "0.6.21"; + + src = fetchFromGitHub { + owner = "benphelps"; + repo = "homepage"; + rev = "v${version}"; + hash = "sha256-kjxA02hJj/GAQ0fM1xTtXAnZSQgVyE+EMRrXis1Vr+o="; + }; + + npmDepsHash = "sha256-O6SQYx5vxscMsbWv0ynUYqdUkOp/nMtdvlZ/Mp95sBY="; + + patches = [ + (fetchpatch { + name = "env-config-dir.patch"; + url = "https://github.com/benphelps/homepage/commit/ca396ce96bce52f6c06a321f292aa94a66ceeb97.patch"; + hash = "sha256-eNnW/ce4ytoKR6jH1Ztc4UTWOmL0uGRdY6nYBIVYM6k="; + }) + ]; + + preBuild = '' + mkdir -p config + ''; + + postBuild = '' + # Add a shebang to the server js file, then patch the shebang. + sed -i '1s|^|#!/usr/bin/env node\n|' .next/standalone/server.js + patchShebangs .next/standalone/server.js + ''; + + buildInputs = [ + nodePackages.node-gyp-build + ]; + + env.PYTHON = "${python3}/bin/python"; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp -r .next/standalone $out/bin + cp -r public $out/bin/public + + mkdir -p $out/bin/.next + cp -r .next/static $out/bin/.next/static + + mv $out/bin/server.js $out/bin/homepage + chmod +x $out/bin/homepage + + wrapProgram $out/bin/homepage \ + --set-default PORT 3000 \ + --set-default HOMEPAGE_CONFIG_DIR /var/lib/homepage-dashboard + + runHook postInstall + ''; + + doDist = false; + + passthru.tests = { + inherit (nixosTests) homepage; + }; + + meta = { + description = "A highly customisable dashboard with Docker and service API integrations."; + mainProgram = "homepage"; + homepage = "https://gethomepage.dev"; + license = lib.licenses.gpl3; + maintainers = with lib.maintainers; [ jnsgruk ]; + platforms = lib.platforms.all; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 995db33b4c3a..e569a2c5dacc 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5374,6 +5374,8 @@ with pkgs; home-manager = callPackage ../tools/package-management/home-manager { }; + homepage-dashboard = callPackage ../servers/homepage-dashboard { }; + hostsblock = callPackage ../tools/misc/hostsblock { }; hottext = callPackage ../tools/text/hottext { };