aboutsummaryrefslogtreecommitdiff
path: root/nixos
diff options
context:
space:
mode:
Diffstat (limited to 'nixos')
-rw-r--r--nixos/doc/manual/release-notes/rl-2103.xml13
-rw-r--r--nixos/modules/module-list.nix1
-rw-r--r--nixos/modules/services/misc/n8n.nix78
-rw-r--r--nixos/modules/services/misc/zigbee2mqtt.nix1
-rw-r--r--nixos/modules/system/boot/loader/grub/grub.nix2
-rw-r--r--nixos/tests/all-tests.nix1
-rw-r--r--nixos/tests/n8n.nix25
7 files changed, 120 insertions, 1 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2103.xml b/nixos/doc/manual/release-notes/rl-2103.xml
index 96061e9ca597..ffb00aa0362e 100644
--- a/nixos/doc/manual/release-notes/rl-2103.xml
+++ b/nixos/doc/manual/release-notes/rl-2103.xml
@@ -26,6 +26,19 @@
<listitem>
<para>GNOME desktop environment was upgraded to 3.38, see its <link xlink:href="https://help.gnome.org/misc/release-notes/3.38/">release notes</link>.</para>
</listitem>
+ <listitem>
+ <para>
+ <link xlink:href="https://www.gnuradio.org/">GNURadio</link> 3.8 was
+ <link xlink:href="https://github.com/NixOS/nixpkgs/issues/82263">finnally</link>
+ packaged, along with a rewrite to the Nix expressions, allowing users to
+ override the features upstream supports selecting to compile or not to.
+ Additionally, the attribute <code>gnuradio</code> and <code>gnuradio3_7</code>
+ now point to an externally wrapped by default derivations, that allow you to
+ also add `extraPythonPackages` to the Python interpreter used by GNURadio.
+ Missing environmental variables needed for operational GUI were also added
+ (<link xlink:href="https://github.com/NixOS/nixpkgs/issues/75478">#7547</link>).
+ </para>
+ </listitem>
</itemizedlist>
</section>
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index df8e5e1dd699..33d2bc3decc6 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -482,6 +482,7 @@
./services/misc/mediatomb.nix
./services/misc/metabase.nix
./services/misc/mwlib.nix
+ ./services/misc/n8n.nix
./services/misc/nix-daemon.nix
./services/misc/nix-gc.nix
./services/misc/nix-optimise.nix
diff --git a/nixos/modules/services/misc/n8n.nix b/nixos/modules/services/misc/n8n.nix
new file mode 100644
index 000000000000..516d0f70ef0b
--- /dev/null
+++ b/nixos/modules/services/misc/n8n.nix
@@ -0,0 +1,78 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+ cfg = config.services.n8n;
+ format = pkgs.formats.json {};
+ configFile = format.generate "n8n.json" cfg.settings;
+in
+{
+ options.services.n8n = {
+
+ enable = mkEnableOption "n8n server";
+
+ openFirewall = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Open ports in the firewall for the n8n web interface.";
+ };
+
+ settings = mkOption {
+ type = format.type;
+ default = {};
+ description = ''
+ Configuration for n8n, see <link xlink:href="https://docs.n8n.io/reference/configuration.html"/>
+ for supported values.
+ '';
+ };
+
+ };
+
+ config = mkIf cfg.enable {
+ services.n8n.settings = {
+ # We use this to open the firewall, so we need to know about the default at eval time
+ port = lib.mkDefault 5678;
+ };
+
+ systemd.services.n8n = {
+ description = "N8N service";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ environment = {
+ # This folder must be writeable as the application is storing
+ # its data in it, so the StateDirectory is a good choice
+ N8N_USER_FOLDER = "/var/lib/n8n";
+ N8N_CONFIG_FILES = "${configFile}";
+ };
+ serviceConfig = {
+ Type = "simple";
+ ExecStart = "${pkgs.n8n}/bin/n8n";
+ Restart = "on-failure";
+ StateDirectory = "n8n";
+
+ # Basic Hardening
+ NoNewPrivileges = "yes";
+ PrivateTmp = "yes";
+ PrivateDevices = "yes";
+ DevicePolicy = "closed";
+ DynamicUser = "true";
+ ProtectSystem = "strict";
+ ProtectHome = "read-only";
+ ProtectControlGroups = "yes";
+ ProtectKernelModules = "yes";
+ ProtectKernelTunables = "yes";
+ RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6 AF_NETLINK";
+ RestrictNamespaces = "yes";
+ RestrictRealtime = "yes";
+ RestrictSUIDSGID = "yes";
+ MemoryDenyWriteExecute = "yes";
+ LockPersonality = "yes";
+ };
+ };
+
+ networking.firewall = mkIf cfg.openFirewall {
+ allowedTCPPorts = [ cfg.settings.port ];
+ };
+ };
+}
diff --git a/nixos/modules/services/misc/zigbee2mqtt.nix b/nixos/modules/services/misc/zigbee2mqtt.nix
index 0957920f1a09..cd987eb76c76 100644
--- a/nixos/modules/services/misc/zigbee2mqtt.nix
+++ b/nixos/modules/services/misc/zigbee2mqtt.nix
@@ -70,6 +70,7 @@ in
description = "Zigbee2mqtt Service";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
+ environment.ZIGBEE2MQTT_DATA = cfg.dataDir;
serviceConfig = {
ExecStart = "${cfg.package}/bin/zigbee2mqtt";
User = "zigbee2mqtt";
diff --git a/nixos/modules/system/boot/loader/grub/grub.nix b/nixos/modules/system/boot/loader/grub/grub.nix
index 09f7641dc9d9..df5dfaa554bc 100644
--- a/nixos/modules/system/boot/loader/grub/grub.nix
+++ b/nixos/modules/system/boot/loader/grub/grub.nix
@@ -741,7 +741,7 @@ in
+ "'boot.loader.grub.mirroredBoots' to make the system bootable.";
}
{
- assertion = cfg.efiSupport || all (c: c < 2) (mapAttrsToList (_: c: c) bootDeviceCounters);
+ assertion = cfg.efiSupport || all (c: c < 2) (mapAttrsToList (n: c: if n == "nodev" then 0 else c) bootDeviceCounters);
message = "You cannot have duplicated devices in mirroredBoots";
}
{
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index 2e79a214569a..c58203cc481f 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -231,6 +231,7 @@ in
mysql-autobackup = handleTest ./mysql/mysql-autobackup.nix {};
mysql-backup = handleTest ./mysql/mysql-backup.nix {};
mysql-replication = handleTest ./mysql/mysql-replication.nix {};
+ n8n = handleTest ./n8n.nix {};
nagios = handleTest ./nagios.nix {};
nano = handleTest ./nano.nix {};
nar-serve = handleTest ./nar-serve.nix {};
diff --git a/nixos/tests/n8n.nix b/nixos/tests/n8n.nix
new file mode 100644
index 000000000000..ed93639f2a42
--- /dev/null
+++ b/nixos/tests/n8n.nix
@@ -0,0 +1,25 @@
+import ./make-test-python.nix ({ lib, ... }:
+
+with lib;
+
+let
+ port = 5678;
+in
+{
+ name = "n8n";
+ meta.maintainers = with maintainers; [ freezeboy ];
+
+ nodes.machine =
+ { pkgs, ... }:
+ {
+ services.n8n = {
+ enable = true;
+ };
+ };
+
+ testScript = ''
+ machine.wait_for_unit("n8n.service")
+ machine.wait_for_open_port("${toString port}")
+ machine.succeed("curl --fail http://localhost:${toString port}/")
+ '';
+})