diff --git a/nixos/doc/manual/release-notes/rl-2505.section.md b/nixos/doc/manual/release-notes/rl-2505.section.md index 44af73915382..794ce781051f 100644 --- a/nixos/doc/manual/release-notes/rl-2505.section.md +++ b/nixos/doc/manual/release-notes/rl-2505.section.md @@ -99,6 +99,8 @@ - [Zipline](https://zipline.diced.sh/), a ShareX/file upload server that is easy to use, packed with features, and with an easy setup. Available as [services.zipline](#opt-services.zipline.enable). +- [Fider](https://fider.io/), an open platform to collect and prioritize feedback. Available as [services.fider](#opt-services.fider.enable). + - [mqtt-exporter](https://github.com/kpetremann/mqtt-exporter/), a Prometheus exporter for exposing messages from MQTT. Available as [services.prometheus.exporters.mqtt](#opt-services.prometheus.exporters.mqtt.enable). - [nvidia-gpu](https://github.com/utkuozdemir/nvidia_gpu_exporter), a Prometheus exporter that scrapes `nvidia-smi` for GPU metrics. Available as [services.prometheus.exporters.nvidia-gpu](#opt-services.prometheus.exporters.nvidia-gpu.enable). diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 7364d8c598db..6d91ad5d6b82 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -1474,6 +1474,7 @@ ./services/web-apps/eintopf.nix ./services/web-apps/engelsystem.nix ./services/web-apps/ethercalc.nix + ./services/web-apps/fider.nix ./services/web-apps/filesender.nix ./services/web-apps/firefly-iii.nix ./services/web-apps/firefly-iii-data-importer.nix diff --git a/nixos/modules/services/web-apps/fider.nix b/nixos/modules/services/web-apps/fider.nix new file mode 100644 index 000000000000..c716fb7bfd4e --- /dev/null +++ b/nixos/modules/services/web-apps/fider.nix @@ -0,0 +1,124 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.services.fider; + fiderCmd = lib.getExe cfg.package; +in +{ + options = { + + services.fider = { + enable = lib.mkEnableOption "the Fider server"; + package = lib.mkPackageOption pkgs "fider" { }; + + dataDir = lib.mkOption { + type = lib.types.str; + default = "/var/lib/fider"; + description = "Default data folder for Fider."; + example = "/mnt/fider"; + }; + + database = { + url = lib.mkOption { + type = lib.types.str; + default = "local"; + description = '' + URI to use for the main PostgreSQL database. If this needs to include + credentials that shouldn't be world-readable in the Nix store, set an + environment file on the systemd service and override the + `DATABASE_URL` entry. Pass the string + `local` to setup a database on the local server. + ''; + }; + }; + + environment = lib.mkOption { + type = lib.types.attrsOf lib.types.str; + default = { }; + example = { + PORT = "31213"; + BASE_URL = "https://fider.example.com"; + EMAIL = "smtp"; + EMAIL_NOREPLY = "fider@example.com"; + EMAIL_SMTP_USERNAME = "fider@example.com"; + EMAIL_SMTP_HOST = "mail.example.com"; + EMAIL_SMTP_PORT = "587"; + BLOB_STORAGE = "fs"; + }; + description = '' + Environment variables to set for the service. Secrets should be + specified using {option}`environmentFiles`. + Refer to + and + for available options. + ''; + }; + + environmentFiles = lib.mkOption { + type = lib.types.listOf lib.types.path; + default = [ ]; + example = "/run/secrets/fider.env"; + description = '' + Files to load environment variables from. Loaded variables override + values set in {option}`environment`. + ''; + }; + }; + }; + + config = lib.mkIf cfg.enable { + services.postgresql = lib.mkIf (cfg.database.url == "local") { + enable = true; + ensureUsers = [ + { + name = "fider"; + ensureDBOwnership = true; + } + ]; + ensureDatabases = [ "fider" ]; + }; + + systemd.services.fider = { + description = "Fider server"; + wantedBy = [ "multi-user.target" ]; + after = [ + "network.target" + ] ++ lib.optionals (cfg.database.url == "local") [ "postgresql.service" ]; + requires = lib.optionals (cfg.database.url == "local") [ "postgresql.service" ]; + environment = + let + localPostgresqlUrl = "postgres:///fider?host=/run/postgresql"; + in + { + DATABASE_URL = if (cfg.database.url == "local") then localPostgresqlUrl else cfg.database.url; + BLOB_STORAGE_FS_PATH = "${cfg.dataDir}"; + } + // cfg.environment; + serviceConfig = { + ExecStartPre = "${fiderCmd} migrate"; + ExecStart = fiderCmd; + StateDirectory = "fider"; + DynamicUser = true; + PrivateTmp = "yes"; + Restart = "on-failure"; + RuntimeDirectory = "fider"; + RuntimeDirectoryPreserve = true; + CacheDirectory = "fider"; + WorkingDirectory = "${cfg.package}"; + EnvironmentFile = cfg.environmentFiles; + }; + }; + }; + + meta = { + maintainers = with lib.maintainers; [ + drupol + niklaskorz + ]; + # doc = ./fider.md; + }; +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 622d43d4080b..10e591adcf71 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -336,6 +336,7 @@ in { fenics = handleTest ./fenics.nix {}; ferm = handleTest ./ferm.nix {}; ferretdb = handleTest ./ferretdb.nix {}; + fider = runTest ./fider.nix; filesender = handleTest ./filesender.nix {}; filesystems-overlayfs = runTest ./filesystems-overlayfs.nix; firefly-iii = handleTest ./firefly-iii.nix {}; diff --git a/nixos/tests/fider.nix b/nixos/tests/fider.nix new file mode 100644 index 000000000000..6db4777ce2bd --- /dev/null +++ b/nixos/tests/fider.nix @@ -0,0 +1,33 @@ +{ lib, ... }: + +{ + name = "fider-server"; + + nodes = { + machine = + { pkgs, ... }: + { + services.fider = { + enable = true; + environment = { + JWT_SECRET = "not_so_secret"; + BASE_URL = "/"; + EMAIL_NOREPLY = "noreply@fider.io"; + EMAIL_SMTP_HOST = "mailhog"; + EMAIL_SMTP_PORT = "1025"; + }; + }; + }; + }; + + testScript = '' + machine.start() + machine.wait_for_unit("fider.service") + machine.wait_for_open_port(3000) + ''; + + meta.maintainers = with lib.maintainers; [ + drupol + niklaskorz + ]; +} diff --git a/pkgs/by-name/fi/fider/package.nix b/pkgs/by-name/fi/fider/package.nix index 3fc6a3864efc..5efe096109fd 100644 --- a/pkgs/by-name/fi/fider/package.nix +++ b/pkgs/by-name/fi/fider/package.nix @@ -5,6 +5,8 @@ callPackage, esbuild, buildGoModule, + nixosTests, + nix-update-script, }: stdenvNoCC.mkDerivation (finalAttrs: { @@ -87,6 +89,13 @@ stdenvNoCC.mkDerivation (finalAttrs: { runHook postInstall ''; + passthru = { + tests = { + inherit (nixosTests) fider; + }; + updateScript = nix-update-script { }; + }; + meta = { description = "Open platform to collect and prioritize feedback"; homepage = "https://github.com/getfider/fider";