Merge 8e8a794380 into haskell-updates

This commit is contained in:
nixpkgs-ci[bot]
2025-09-23 00:20:31 +00:00
committed by GitHub
494 changed files with 4609 additions and 3609 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ jobs:
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
- uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
with:
# Sandbox is disabled on MacOS by default.
extra_nix_config: sandbox = true
+1 -1
View File
@@ -96,7 +96,7 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
target-as-trusted-at: ${{ inputs.targetSha }}
- uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
- uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
+4 -4
View File
@@ -47,7 +47,7 @@ jobs:
ci/pinned.json
- name: Install Nix
uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- name: Load supported versions
id: versions
@@ -92,7 +92,7 @@ jobs:
target-as-trusted-at: ${{ inputs.targetSha }}
- name: Install Nix
uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
@@ -190,7 +190,7 @@ jobs:
merge-multiple: true
- name: Install Nix
uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- name: Combine all output paths and eval stats
run: |
@@ -350,7 +350,7 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- name: Install Nix
uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- name: Run misc eval tasks in parallel
run: |
+3 -3
View File
@@ -32,7 +32,7 @@ jobs:
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
- uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
# TODO: Figure out how to best enable caching for the treefmt job. Cachix won't work well,
# because the cache would be invalidated on every commit - treefmt checks every file.
@@ -66,7 +66,7 @@ jobs:
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
- uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
@@ -94,7 +94,7 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
target-as-trusted-at: ${{ inputs.targetSha }}
- uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
- uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
sparse-checkout: ci
- name: Install Nix
uses: cachix/install-nix-action@7be5dee1421f63d07e71ce6e0a9f8a4b07c2a487 # v31
uses: cachix/install-nix-action@a809471b5c7c913aa67bec8f459a11a0decc3fce # v31
- name: Build the requestReviews derivation
run: nix-build trusted/ci -A requestReviews
+6 -6
View File
@@ -9,9 +9,9 @@
},
"branch": "nixpkgs-unstable",
"submodules": false,
"revision": "641d909c4a7538f1539da9240dedb1755c907e40",
"url": "https://github.com/NixOS/nixpkgs/archive/641d909c4a7538f1539da9240dedb1755c907e40.tar.gz",
"hash": "10hpb1aw884k3zzcy1mhf47dqvfagiyx7kr6hg0p5xcwg04mkx8x"
"revision": "a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0",
"url": "https://github.com/NixOS/nixpkgs/archive/a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0.tar.gz",
"hash": "06lqp08pfgnsn8kb4kdpjmmjyhj4bgniv7yf9bjczg4kn25l1dz6"
},
"treefmt-nix": {
"type": "Git",
@@ -22,9 +22,9 @@
},
"branch": "main",
"submodules": false,
"revision": "7d81f6fb2e19bf84f1c65135d1060d829fae2408",
"url": "https://github.com/numtide/treefmt-nix/archive/7d81f6fb2e19bf84f1c65135d1060d829fae2408.tar.gz",
"hash": "1cg20q8ja8k2nb7mzy95hgmd8whxapc3fbyndh1ip5dr6d1grxfs"
"revision": "128222dc911b8e2e18939537bed1762b7f3a04aa",
"url": "https://github.com/numtide/treefmt-nix/archive/128222dc911b8e2e18939537bed1762b7f3a04aa.tar.gz",
"hash": "1p81chik0sb8aligng579m4h0klnndxv76z0p4gyhr4g3s9cydpw"
}
},
"version": 5
+20 -2
View File
@@ -1361,7 +1361,7 @@
name = "Amaan Qureshi";
};
amadaluzia = {
email = "amad@atl.tools";
email = "amadaluzia@disroot.org";
github = "amadaluzia";
githubId = 188314694;
name = "Artur Manuel";
@@ -8330,6 +8330,12 @@
keys = [ { fingerprint = "7391 BF2D A2C3 B2C9 BE25 ACA9 C7A7 4616 F302 5DF4"; } ];
matrix = "@felipeqq2:pub.solar";
};
felissedano = {
name = "Felis Sedano";
email = "contact@felissedano.com";
github = "felissedano";
githubId = 109383955;
};
felixalbrigtsen = {
email = "felix@albrigtsen.it";
github = "felixalbrigtsen";
@@ -15289,6 +15295,12 @@
githubId = 208297;
name = "Luz";
};
lwb-2021 = {
email = "lwb-2021@qq.com";
github = "lwb-2021";
githubId = 91705377;
name = "lwb-2021";
};
lx = {
email = "alex@adnab.me";
github = "Alexis211";
@@ -18697,7 +18709,7 @@
github = "Notarin";
githubId = 25104390;
keys = [ { fingerprint = "4E15 9433 48D9 7BA7 E8B8 B0FF C38F D346 AE36 36FB"; } ];
matrix = "@notarin:matrix.org";
matrix = "@notarin:matrix.squishcat.net";
};
NotAShelf = {
name = "NotAShelf";
@@ -24009,6 +24021,12 @@
githubId = 617130;
keys = [ { fingerprint = "C4F7 46C7 B560 38D8 210F 0288 5877 DEE9 7428 557F"; } ];
};
skohtv = {
name = "Skoh";
email = "contact@skoh.dev";
github = "skohtv";
githubId = 101289702;
};
skovati = {
github = "skovati";
githubId = 49844593;
@@ -72,6 +72,8 @@
- [Draupnir](https://github.com/the-draupnir-project/draupnir), a Matrix moderation bot. Available as [services.draupnir](#opt-services.draupnir.enable).
- [Pangolin](https://github.com/fosrl/pangolin), a tunneled reverse proxy server with access control. Available as [services.pangolin](#opt-services.pangolin.enable).
- [postfix-tlspol](https://github.com/Zuplu/postfix-tlspol), MTA-STS and DANE resolver and TLS policy server for Postfix. Available as [services.postfix-tlspol](#opt-services.postfix-tlspol.enable).
- [crowdsec](https://www.crowdsec.net/), a free, open-source and collaborative IPS. Available as [services.crowdsec](#opt-services.crowdsec.enable).
+2 -2
View File
@@ -31,7 +31,7 @@ in
description = ''
The user IDs used in NixOS.
'';
type = types.attrsOf types.int;
type = types.attrsOf types.ints.u32;
};
ids.gids = lib.mkOption {
@@ -39,7 +39,7 @@ in
description = ''
The group IDs used in NixOS.
'';
type = types.attrsOf types.int;
type = types.attrsOf types.ints.u32;
};
};
+2
View File
@@ -568,6 +568,7 @@
./services/desktops/gnome/sushi.nix
./services/desktops/gnome/tinysparql.nix
./services/desktops/gvfs.nix
./services/desktops/linyaps.nix
./services/desktops/malcontent.nix
./services/desktops/neard.nix
./services/desktops/pipewire/pipewire.nix
@@ -1292,6 +1293,7 @@
./services/networking/openvpn.nix
./services/networking/ostinato.nix
./services/networking/owamp.nix
./services/networking/pangolin.nix
./services/networking/pdns-recursor.nix
./services/networking/pdnsd.nix
./services/networking/peroxide.nix
+1 -1
View File
@@ -85,7 +85,7 @@ in
};
hostPort = mkOption {
default = 31022;
type = types.int;
type = types.port;
example = 22;
description = ''
The localhost host port to forward TCP to the guest port.
+1 -1
View File
@@ -12,7 +12,7 @@ let
cfg = config.programs.fish;
fishAbbrs = lib.concatStringsSep "\n" (
lib.mapAttrsToList (k: v: "abbr -ag ${k} ${lib.escapeShellArg v}") cfg.shellAbbrs
lib.mapAttrsToList (k: v: "abbr -a ${k} -- ${lib.escapeShellArg v}") cfg.shellAbbrs
);
fishAliases = lib.concatStringsSep "\n" (
+1 -6
View File
@@ -18,12 +18,7 @@ in
description = "The name of the command to use";
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.kubeswitch;
defaultText = lib.literalExpression "pkgs.kubeswitch";
description = "The package to install for kubeswitch";
};
package = lib.mkPackageOption pkgs "kubeswitch" { };
};
};
+8 -8
View File
@@ -77,49 +77,49 @@ in
SYS_UID_MIN = lib.mkOption {
description = "Range of user IDs used for the creation of system users by useradd or newusers.";
default = 400;
type = lib.types.int;
type = lib.types.ints.u32;
};
SYS_UID_MAX = lib.mkOption {
description = "Range of user IDs used for the creation of system users by useradd or newusers.";
default = 999;
type = lib.types.int;
type = lib.types.ints.u32;
};
UID_MIN = lib.mkOption {
description = "Range of user IDs used for the creation of regular users by useradd or newusers.";
default = 1000;
type = lib.types.int;
type = lib.types.ints.u32;
};
UID_MAX = lib.mkOption {
description = "Range of user IDs used for the creation of regular users by useradd or newusers.";
default = 29999;
type = lib.types.int;
type = lib.types.ints.u32;
};
SYS_GID_MIN = lib.mkOption {
description = "Range of group IDs used for the creation of system groups by useradd, groupadd, or newusers";
default = 400;
type = lib.types.int;
type = lib.types.ints.u32;
};
SYS_GID_MAX = lib.mkOption {
description = "Range of group IDs used for the creation of system groups by useradd, groupadd, or newusers";
default = 999;
type = lib.types.int;
type = lib.types.ints.u32;
};
GID_MIN = lib.mkOption {
description = "Range of group IDs used for the creation of regular groups by useradd, groupadd, or newusers.";
default = 1000;
type = lib.types.int;
type = lib.types.ints.u32;
};
GID_MAX = lib.mkOption {
description = "Range of group IDs used for the creation of regular groups by useradd, groupadd, or newusers.";
default = 29999;
type = lib.types.int;
type = lib.types.ints.u32;
};
TTYGROUP = lib.mkOption {
+1 -6
View File
@@ -58,12 +58,7 @@ in
Trusted Platform 2 userspace resource manager daemon
'';
package = lib.mkOption {
description = "tpm2-abrmd package to use";
type = lib.types.package;
default = pkgs.tpm2-abrmd;
defaultText = lib.literalExpression "pkgs.tpm2-abrmd";
};
package = lib.mkPackageOption pkgs "tpm2-abrmd" { };
};
pkcs11 = {
+27
View File
@@ -228,6 +228,33 @@ in
"initial_password:${cfg.initialPasswordFile}"
]
++ lib.optional cfg.emailServer.enable "email_password:${cfg.emailServer.passwordFile}";
AmbientCapabilities = "";
CapabilityBoundingSet = "";
LockPersonality = true;
MemoryDenyWriteExecute = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateMounts = true;
PrivateTmp = true;
ProtectClock = true;
ProtectControlGroups = true;
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectSystem = "full";
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_UNIX"
"AF_INET"
"AF_INET6"
];
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
UMask = 27;
};
};
@@ -182,7 +182,7 @@ in
pbPort = lib.mkOption {
default = 9989;
type = lib.types.either lib.types.str lib.types.int;
type = lib.types.either lib.types.str lib.types.port;
example = "'tcp:9990:interface=127.0.0.1'";
description = ''
The buildmaster will listen on a TCP port of your choosing
@@ -38,12 +38,7 @@ let
description = "Whether to enable this buildkite agent";
};
package = lib.mkOption {
default = pkgs.buildkite-agent;
defaultText = lib.literalExpression "pkgs.buildkite-agent";
description = "Which buildkite-agent derivation to use";
type = lib.types.package;
};
package = lib.mkPackageOption pkgs "buildkite-agent" { };
dataDir = lib.mkOption {
default = "/var/lib/buildkite-agent-${name}";
@@ -64,7 +64,7 @@ in
sslPort = mkOption {
default = 8154;
type = types.int;
type = types.port;
description = ''
Specifies port number on which the Go.CD server HTTPS interface listens.
'';
@@ -254,6 +254,33 @@ in
StateDirectory = lib.mkIf (lib.hasPrefix "/var/lib/jenkins" cfg.home) "jenkins";
# For (possible) socket use
RuntimeDirectory = "jenkins";
AmbientCapabilities = "";
CapabilityBoundingSet = "";
LockPersonality = true;
# MemoryDenyWriteExecute = false; Breaks execution;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateMounts = true;
PrivateTmp = true;
ProtectClock = true;
ProtectControlGroups = true;
ProtectHome = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectSystem = "full";
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_UNIX"
"AF_INET"
"AF_INET6"
];
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
UMask = 27;
};
};
};
@@ -415,7 +415,7 @@ in
};
jmxPort = mkOption {
type = types.int;
type = types.port;
default = 7199;
description = ''
Specifies the default port over which Cassandra will be available for
@@ -9,10 +9,10 @@ let
cfg = config.services.chromadb;
inherit (lib)
mkEnableOption
mkPackageOption
mkOption
mkIf
types
literalExpression
;
in
{
@@ -29,13 +29,7 @@ in
services.chromadb = {
enable = mkEnableOption "ChromaDB, an open-source AI application database.";
package = mkOption {
type = types.package;
example = literalExpression "pkgs.python3Packages.chromadb";
default = pkgs.python3Packages.chromadb;
defaultText = "pkgs.python3Packages.chromadb";
description = "ChromaDB package to use.";
};
package = mkPackageOption pkgs [ "python3Packages" "chromadb" ] { };
host = mkOption {
type = types.str;
@@ -18,13 +18,7 @@ in
services.ferretdb = {
enable = lib.mkEnableOption "FerretDB, an Open Source MongoDB alternative";
package = lib.mkOption {
type = lib.types.package;
example = lib.literalExpression "pkgs.ferretdb";
default = pkgs.ferretdb;
defaultText = "pkgs.ferretdb";
description = "FerretDB package to use.";
};
package = lib.mkPackageOption pkgs "ferretdb" { };
settings = lib.mkOption {
type = lib.types.submodule {
@@ -94,7 +94,7 @@ in
};
listenPortStart = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 4500;
description = ''
Starting port number for database listening sockets. Every FDB process binds to a
@@ -0,0 +1,60 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.linyaps;
in
{
meta = {
maintainers = pkgs.linyaps.meta.maintainers;
};
###### interface
options = {
services.linyaps = {
enable = lib.mkEnableOption "linyaps, a cross-distribution package manager with sandboxed apps and shared runtime";
package = lib.mkPackageOption pkgs "linyaps" { };
boxPackage = lib.mkPackageOption pkgs "linyaps-box" { };
};
};
###### implementation
config = lib.mkIf cfg.enable {
environment = {
profiles = [ "/var/lib/linglong/entries" ];
systemPackages = [
cfg.package
cfg.boxPackage
];
};
security.polkit.enable = true;
fonts.fontDir.enable = true;
services.dbus.packages = [ cfg.package ];
systemd = {
packages = [ cfg.package ];
tmpfiles.packages = [ cfg.package ];
};
# Create system user and group for linyaps/linglong
users = {
groups.deepin-linglong = { };
users.deepin-linglong = {
group = "deepin-linglong";
isSystemUser = true;
description = "Linyaps/Linglong system helper";
};
};
};
}
@@ -65,7 +65,7 @@ in
};
nice = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr (lib.types.ints.between (-20) 19);
default = null;
description = ''
Niceness of the compilation tasks.
+1 -8
View File
@@ -21,14 +21,7 @@ in
issued by the `lorri` command.
'';
};
package = lib.mkOption {
default = pkgs.lorri;
type = lib.types.package;
description = ''
The lorri package to use.
'';
defaultText = lib.literalExpression "pkgs.lorri";
};
package = lib.mkPackageOption pkgs "lorri" { };
};
};
@@ -12,9 +12,11 @@ let
xEnv = config.systemd.services.display-manager.environment;
sddm = cfg.package.override (old: {
withWayland = cfg.wayland.enable;
withLayerShellQt = cfg.wayland.compositor == "kwin";
extraPackages = old.extraPackages or [ ] ++ cfg.extraPackages;
extraPackages =
old.extraPackages or [ ]
++ lib.optionals cfg.wayland.enable [ pkgs.qt6.qtwayland ]
++ lib.optionals (cfg.wayland.compositor == "kwin") [ pkgs.kdePackages.layer-shell-qt ]
++ cfg.extraPackages;
});
iniFmt = pkgs.formats.ini { };
@@ -228,7 +230,7 @@ in
'';
};
package = mkPackageOption pkgs [ "libsForQt5" "sddm" ] { };
package = mkPackageOption pkgs [ "kdePackages" "sddm" ] { };
enableHidpi = mkOption {
type = types.bool;
+1 -8
View File
@@ -11,14 +11,7 @@ in
{
options.services.hardware.argonone = {
enable = lib.mkEnableOption "the driver for Argon One Raspberry Pi case fan and power button";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.argononed;
defaultText = lib.literalExpression "pkgs.argononed";
description = ''
The package implementing the Argon One driver
'';
};
package = lib.mkPackageOption pkgs "argononed" { };
};
config = lib.mkIf cfg.enable {
+1 -6
View File
@@ -67,12 +67,7 @@ in
'';
};
hardware.sane.backends-package = lib.mkOption {
type = lib.types.package;
default = pkgs.sane-backends;
defaultText = lib.literalExpression "pkgs.sane-backends";
description = "Backends driver package to use.";
};
hardware.sane.backends-package = lib.mkPackageOption pkgs "sane-backends" { };
hardware.sane.snapshot = lib.mkOption {
type = lib.types.bool;
@@ -72,7 +72,7 @@ in
package = lib.mkPackageOption pkgs "journalwatch" { };
priority = lib.mkOption {
type = lib.types.int;
type = lib.types.ints.between 0 7;
default = 6;
description = ''
Lowest priority of message to be considered.
@@ -19,14 +19,7 @@ in
services.mautrix-discord = {
enable = lib.mkEnableOption "Mautrix-Discord, a Matrix-Discord puppeting/relay-bot bridge";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.mautrix-discord;
defaultText = lib.literalExpression "pkgs.mautrix-discord";
description = ''
The mautrix-discord package to use.
'';
};
package = lib.mkPackageOption pkgs "mautrix-discord" { };
settings = lib.mkOption {
type = lib.types.submodule {
@@ -43,7 +43,7 @@ in
description = "Password for mining server";
};
threads = lib.mkOption {
type = lib.types.int;
type = lib.types.ints.unsigned;
default = 0;
description = "Number of miner threads, defaults to available processors";
};
@@ -51,12 +51,7 @@ in
'';
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.etebase-server;
defaultText = lib.literalExpression "pkgs.python3.pkgs.etebase-server";
description = "etebase-server package to use.";
};
package = lib.mkPackageOption pkgs "etebase-server" { };
dataDir = lib.mkOption {
type = lib.types.str;
+1 -1
View File
@@ -638,7 +638,7 @@ in
description = "External address used to access registry from the internet";
};
externalPort = mkOption {
type = types.int;
type = types.port;
description = "External port used to access registry from the internet";
};
};
+4 -4
View File
@@ -107,7 +107,7 @@ in
package = mkPackageOption pkgs "chromium" { };
maxQueueSize = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 0;
description = "Maximum queue size for chromium-based conversions. Setting to 0 disables the limit.";
};
@@ -143,7 +143,7 @@ in
description = "Deny accepting URLs from these domains in the `downloadFrom` API field. Accepts a regular expression.";
};
maxRetries = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 4;
description = "The maximum amount of times to retry downloading a file specified with `downloadFrom`.";
};
@@ -158,13 +158,13 @@ in
package = mkPackageOption pkgs "libreoffice" { };
restartAfter = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 10;
description = "Restart LibreOffice after this many conversions. Setting to 0 disables this feature.";
};
maxQueueSize = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 0;
description = "Maximum queue size for LibreOffice-based conversions. Setting to 0 disables the limit.";
};
@@ -23,7 +23,7 @@ in
};
listenPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 8082;
description = "Port for Homepage to bind to.";
};
@@ -70,14 +70,7 @@ in
for configuration options.
'';
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.invidious-router;
defaultText = lib.literalExpression "pkgs.invidious-router";
description = ''
The invidious-router package to use.
'';
};
package = lib.mkPackageOption pkgs "invidious-router" { };
nginx = {
enable = lib.mkEnableOption ''
Automatic nginx proxy configuration
+1 -6
View File
@@ -117,12 +117,7 @@ in
};
ldap = {
package = lib.mkOption {
type = lib.types.package;
default = pkgs.openldap;
defaultText = lib.literalExpression "pkgs.openldap";
description = "The OpenLDAP package to use.";
};
package = lib.mkPackageOption pkgs "openldap" { };
searchUserName = lib.mkOption {
type = lib.types.str;
+1 -1
View File
@@ -61,7 +61,7 @@ in
};
log-level = lib.mkOption {
type = lib.types.int;
type = lib.types.ints.between 0 4;
description = ''
Specify the log level (0:none, 1:error, 2:warning, 3:notice, 4:debug).
'';
@@ -329,7 +329,7 @@ in
};
listenPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 53589;
description = ''
Port number of the Taskserver.
@@ -98,12 +98,7 @@ in
'';
};
report_delay = lib.mkOption {
type = lib.types.enum [
1
2
3
4
];
type = lib.types.ints.between 1 4;
default = 3;
description = ''
The interval between system status reportings.
@@ -22,7 +22,7 @@ in
};
gatewayPort = mkOption {
type = types.int;
type = types.port;
default = 49000;
description = ''
The port of the FRITZ!Box UPnP service.
+1 -1
View File
@@ -110,7 +110,7 @@ in
graphitePort = lib.mkOption {
description = "Port of Graphite server (i.e. carbon-cache).";
default = null;
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
};
extraConfig = lib.mkOption {
@@ -81,7 +81,7 @@ in
};
mountdPort = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
default = null;
example = 4002;
description = ''
@@ -90,7 +90,7 @@ in
};
lockdPort = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
default = null;
example = 4001;
description = ''
@@ -101,7 +101,7 @@ in
};
statdPort = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
default = null;
example = 4000;
description = ''
@@ -140,7 +140,7 @@ in
sftpd.enable = lib.mkEnableOption "SFTP service";
sftpd.port = lib.mkOption {
default = null;
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
description = ''
The port on which the SFTP server will listen.
+2 -2
View File
@@ -83,7 +83,7 @@ in
'';
};
bindPort = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
default = null;
example = 3128;
description = ''
@@ -192,7 +192,7 @@ in
'';
};
targetPorts = lib.mkOption {
type = lib.types.listOf lib.types.int;
type = lib.types.listOf lib.types.port;
default = [ ];
example = [
80
@@ -33,7 +33,7 @@ in
description = "Name of the user the AutoSSH session should run as";
};
monitoringPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 0;
example = 20000;
description = ''
@@ -17,7 +17,7 @@ let
inherit (lib.options)
mkEnableOption
mkOption
literalExpression
mkPackageOption
;
cfg = config.services.ax25.axlisten;
@@ -29,12 +29,7 @@ in
enable = mkEnableOption "AX.25 axlisten daemon";
package = mkOption {
type = types.package;
default = pkgs.ax25-apps;
defaultText = literalExpression "pkgs.ax25-apps";
description = "The ax25-apps package to use.";
};
package = mkPackageOption pkgs "ax25-apps" { };
config = mkOption {
type = types.str;
+7 -7
View File
@@ -50,7 +50,7 @@ in
services.coturn = {
enable = lib.mkEnableOption "coturn TURN server";
listening-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 3478;
description = ''
TURN listener port for UDP and TCP.
@@ -59,7 +59,7 @@ in
'';
};
tls-listening-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 5349;
description = ''
TURN listener port for TLS.
@@ -74,7 +74,7 @@ in
'';
};
alt-listening-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = cfg.listening-port + 1;
defaultText = lib.literalExpression "listening-port + 1";
description = ''
@@ -89,7 +89,7 @@ in
'';
};
alt-tls-listening-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = cfg.tls-listening-port + 1;
defaultText = lib.literalExpression "tls-listening-port + 1";
description = ''
@@ -130,14 +130,14 @@ in
'';
};
min-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 49152;
description = ''
Lower bound of UDP relay endpoints
'';
};
max-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 65535;
description = ''
Upper bound of UDP relay endpoints
@@ -263,7 +263,7 @@ in
'';
};
cli-port = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 5766;
description = ''
CLI server port.
+1 -6
View File
@@ -21,12 +21,7 @@ in
enable = lib.mkEnableOption "deCONZ, a Zigbee gateway for use with ConBee/RaspBee hardware (https://phoscon.de/)";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.deconz;
defaultText = lib.literalExpression "pkgs.deconz";
description = "Which deCONZ package to use.";
};
package = lib.mkPackageOption pkgs "deconz" { };
device = lib.mkOption {
type = lib.types.nullOr lib.types.str;
@@ -101,14 +101,7 @@ in
{option}`${opt.singleNode.enable}` does this automatically when enabled
'';
package = lib.mkOption {
type = lib.types.package;
default = pkgs.syncstorage-rs;
defaultText = lib.literalExpression "pkgs.syncstorage-rs";
description = ''
Package to use.
'';
};
package = lib.mkPackageOption pkgs "syncstorage-rs" { };
database.name = lib.mkOption {
# the mysql module does not allow `-quoting without resorting to shell
@@ -15,7 +15,7 @@ in
enable = lib.mkEnableOption "Freenet daemon";
nice = lib.mkOption {
type = lib.types.int;
type = lib.types.ints.between (-20) 19;
default = 10;
description = "Set the nice level for the Freenet daemon";
};
@@ -274,7 +274,7 @@ in
channel = mkOption {
default = 0;
example = 11;
type = types.int;
type = types.ints.positive;
description = ''
The channel to operate on. Use 0 to enable ACS (Automatic Channel Selection).
Beware that not every device supports ACS in which case {command}`hostapd`
@@ -571,7 +571,7 @@ in
options = {
logLevel = mkOption {
default = 2;
type = types.int;
type = types.ints.between 0 4;
description = ''
Levels (minimum value for logged events):
0 = verbose debugging
@@ -957,7 +957,7 @@ in
vlanid = mkOption {
default = null;
example = 1;
type = types.nullOr types.int;
type = types.nullOr types.ints.unsigned;
description = "If this attribute is given, all clients using this entry will get tagged with the given VLAN ID.";
};
+3 -3
View File
@@ -667,7 +667,7 @@ in
description = "Upstream outproxy bind address.";
};
outproxyPort = mkOption {
type = types.int;
type = types.port;
default = 4444;
description = "Upstream outproxy bind port.";
};
@@ -686,7 +686,7 @@ in
{
options = {
destinationPort = mkOption {
type = with types; nullOr int;
type = with types; nullOr port;
default = null;
description = "Connect to particular port at destination.";
};
@@ -711,7 +711,7 @@ in
{
options = {
inPort = mkOption {
type = types.int;
type = types.port;
default = 0;
description = "Service port. Default to the tunnel's listen port.";
};
@@ -79,7 +79,7 @@ in
};
nice = mkOption {
type = types.int;
type = types.ints.between (-20) 19;
default = 5;
description = ''
The level of niceness to use.
@@ -71,13 +71,13 @@ in
rtc_config = {
port_range_start = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 50000;
description = "Start of UDP port range for WebRTC";
};
port_range_end = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 51000;
description = "End of UDP port range for WebRTC";
};
@@ -85,13 +85,13 @@ in
rtc = {
port_range_start = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 50000;
description = "Start of UDP port range for WebRTC";
};
port_range_end = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 51000;
description = "End of UDP port range for WebRTC";
};
+17 -14
View File
@@ -41,9 +41,9 @@ let
${lib.optionalString (cfg.registerHostname != "") "registerHostname=${cfg.registerHostname}"}
certrequired=${lib.boolToString cfg.clientCertRequired}
${lib.optionalString (cfg.sslCert != "") "sslCert=${cfg.sslCert}"}
${lib.optionalString (cfg.sslKey != "") "sslKey=${cfg.sslKey}"}
${lib.optionalString (cfg.sslCa != "") "sslCA=${cfg.sslCa}"}
${lib.optionalString (cfg.sslCert != null) "sslCert=${cfg.sslCert}"}
${lib.optionalString (cfg.sslKey != null) "sslKey=${cfg.sslKey}"}
${lib.optionalString (cfg.sslCa != null) "sslCA=${cfg.sslCa}"}
${lib.optionalString (cfg.dbus != null) "dbus=${cfg.dbus}"}
@@ -56,7 +56,7 @@ in
(lib.mkRemovedOptionModule [
"services"
"murmur"
"logfile"
"logFile"
] "This option has been superseded by services.murmur.logToFile")
];
@@ -238,20 +238,20 @@ in
clientCertRequired = lib.mkEnableOption "requiring clients to authenticate via certificates";
sslCert = lib.mkOption {
type = lib.types.str;
default = "";
type = lib.types.nullOr lib.types.path;
default = null;
description = "Path to your SSL certificate.";
};
sslKey = lib.mkOption {
type = lib.types.str;
default = "";
type = lib.types.nullOr lib.types.path;
default = null;
description = "Path to your SSL key.";
};
sslCa = lib.mkOption {
type = lib.types.str;
default = "";
type = lib.types.nullOr lib.types.path;
default = null;
description = "Path to your SSL CA certificate.";
};
@@ -355,7 +355,10 @@ in
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectSystem = "full";
ProtectSystem = "strict";
ReadWritePaths = [
cfg.stateDir
];
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
@@ -415,13 +418,13 @@ in
+ lib.optionalString cfg.logToFile ''
rw /var/log/murmur/murmurd.log,
''
+ lib.optionalString (cfg.sslCert != "") ''
+ lib.optionalString (cfg.sslCert != null) ''
r ${cfg.sslCert},
''
+ lib.optionalString (cfg.sslKey != "") ''
+ lib.optionalString (cfg.sslKey != null) ''
r ${cfg.sslKey},
''
+ lib.optionalString (cfg.sslCa != "") ''
+ lib.optionalString (cfg.sslCa != null) ''
r ${cfg.sslCa},
''
+ lib.optionalString (cfg.dbus != null) ''
@@ -39,12 +39,7 @@ in
default = false;
description = "Open the firewall for mycelium";
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.mycelium;
defaultText = lib.literalExpression ''"''${pkgs.mycelium}"'';
description = "The mycelium package to use";
};
package = lib.mkPackageOption pkgs "mycelium" { };
addHostedPublicNodes = lib.mkOption {
type = lib.types.bool;
default = true;
+38 -37
View File
@@ -6,39 +6,49 @@
}:
let
cfg = config.services.newt;
type =
with lib.types;
attrsOf (
nullOr (oneOf [
bool
int
float
str
path
(listOf type)
])
)
// {
description = "value coercible to CLI argument";
};
in
{
imports = [
(lib.mkRenamedOptionModule [ "services" "newt" "id" ] [ "services" "newt" "settings" "id" ])
(lib.mkRenamedOptionModule
[ "services" "newt" "logLevel" ]
[ "services" "newt" "settings" "log-level" ]
)
(lib.mkRenamedOptionModule
[ "services" "newt" "endpoint" ]
[ "services" "newt" "settings" "endpoint" ]
)
];
options = {
services.newt = {
enable = lib.mkEnableOption "Newt, user space tunnel client for Pangolin";
# needs to be changed when newt-go changes to fosrl-newt
package = lib.mkPackageOption pkgs "newt-go" { };
package = lib.mkPackageOption pkgs "fosrl-newt" { };
settings = lib.mkOption {
inherit type;
default = { };
example = {
endpoint = "pangolin.example.com";
id = "8yfsghj438a20ol";
};
description = "Settings for Newt module, see [Newt CLI docs](https://github.com/fosrl/newt?tab=readme-ov-file#cli-args) for more information.";
};
id = lib.mkOption {
type = with lib.types; nullOr str;
default = null;
description = ''
The Newt Id that will be used to communicate to Pangolin. This is generated on site creation in the dashboard.
'';
};
endpoint = lib.mkOption {
type = with lib.types; nullOr str;
default = null;
description = ''
The endpoint where both Gerbil and Pangolin reside in order to connect to the websocket. The url of your Pangolin dashboard.
'';
};
logLevel = lib.mkOption {
type = lib.types.enum [
"DEBUG"
"INFO"
"WARN"
"ERROR"
"FATAL"
];
default = "INFO";
description = "The log level to use.";
};
# provide path to file to keep secrets out of the nix store
environmentFile = lib.mkOption {
type = with lib.types; nullOr path;
@@ -72,17 +82,8 @@ in
HOME = "/var/lib/private/newt";
};
# the flag values will all be overwritten if also defined in the env file
script = "
exec ${lib.getExe pkgs.newt-go} \\\n
${lib.optionalString (
!isNull cfg.id
) "--id ${cfg.id} \\\n"}
${lib.optionalString (
!isNull cfg.endpoint
) "--endpoint ${cfg.endpoint} \\\n"}
--log-level ${cfg.logLevel}
";
serviceConfig = {
ExecStart = "${lib.getExe cfg.package} ${lib.cli.toGNUCommandLineShell { } cfg.settings}";
DynamicUser = true;
StateDirectory = "newt";
StateDirectoryMode = "0700";
+1 -1
View File
@@ -80,7 +80,7 @@ in
httpPort = mkOption {
default = 3000;
type = types.int;
type = types.port;
description = ''
Sets the HTTP port of the embedded web server.
'';
@@ -31,14 +31,7 @@ in
options.services.onedrive = {
enable = lib.mkEnableOption "OneDrive service";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.onedrive;
defaultText = lib.literalExpression "pkgs.onedrive";
description = ''
OneDrive package to use.
'';
};
package = lib.mkPackageOption pkgs "onedrive" { };
};
### Implementation
@@ -0,0 +1,555 @@
{
utils,
config,
options,
lib,
pkgs,
...
}:
let
cfg = config.services.pangolin;
format = pkgs.formats.yaml { };
finalSettings = lib.attrsets.recursiveUpdate pangolinConf cfg.settings;
cfgFile = format.generate "config.yml" finalSettings;
# override the type to allow for optionality
nullOrOpt = t: lib.types.nullOr t // { _optional = true; };
gerbil-wg0-fix-script = pkgs.writeShellApplication {
name = "gerbil-wg0-fix-script";
runtimeInputs = with pkgs; [
coreutils
iproute2
];
# will not work if the interface is renamed
# https://github.com/fosrl/newt/issues/37#issuecomment-3193385911
text = ''
if [ ! -f /var/lib/pangolin/config/wg0 ]; then
until ip l d wg0
do
sleep 2
done
touch /var/lib/pangolin/config/wg0
systemctl restart gerbil --no-block
fi
'';
};
pangolinConf = {
app.dashboard_url = "https://${cfg.dashboardDomain}";
domains.domain1 = {
base_domain = cfg.baseDomain;
prefer_wildcard_cert = false;
};
server = {
external_port = 3000;
internal_port = 3001;
next_port = 3002;
integration_port = 3004;
# needs to be set, otherwise this fails silently
# see https://github.com/fosrl/newt/issues/37
internal_hostname = "localhost";
};
gerbil.base_endpoint = cfg.dashboardDomain;
flags.enable_integration_api = false;
};
in
{
options.services = {
pangolin = {
enable = lib.mkEnableOption "Pangolin reverse proxy server";
package = lib.mkPackageOption pkgs "fosrl-pangolin" { };
settings = lib.mkOption {
inherit (format) type;
default = { };
description = ''
Additional attributes to be merged with the configuration options and written to Pangolin's `config.yml` file.
'';
example = {
app = {
save_logs = true;
};
server = {
external_port = 3007;
internal_port = 3008;
};
domains.domain1 = {
prefer_wildcard_cert = true;
};
};
};
openFirewall = lib.mkEnableOption "opening TCP ports 80 and 443, and UDP port 51820 in the firewall for the Pangolin service(s)";
baseDomain = lib.mkOption {
type = with lib.types; nullOr str;
default = null;
description = ''
Your base fully qualified domain name (without any subdomains).
'';
example = "example.com";
};
dashboardDomain = lib.mkOption {
type = lib.types.str;
default = if (isNull cfg.baseDomain) then "" else "pangolin.${cfg.baseDomain}";
defaultText = "pangolin.\${config.services.pangolin.baseDomain}";
description = ''
The domain where the application will be hosted. This is used for many things, including generating links. You can run Pangolin on a subdomain or root domain. Do not prefix with `http` or `https`.
'';
example = "auth.example.com";
};
letsEncryptEmail = lib.mkOption {
type = with lib.types; nullOr str;
default = config.security.acme.defaults.email;
defaultText = lib.literalExpression "config.security.acme.defaults.email";
description = ''
An email address for SSL certificate registration with Let's Encrypt. This should be an email you have access to.
'';
};
# this assumes that all domains are hosted by the same provider
dnsProvider = lib.mkOption {
type = nullOrOpt lib.types.str;
default = null;
description = ''
The DNS provider Traefik will request wildcard certificates from. See the [Traefik Documentation](https://doc.traefik.io/traefik/https/acme/#providers) for more information.
'';
};
# provide path to file to keep secrets out of the nix store
environmentFile = lib.mkOption {
type = with lib.types; nullOr path;
default = null;
description = ''
Path to a file containing sensitive environment variables for Pangolin. See the [Pangolin Documentation](https://docs.fossorial.io/Pangolin/Configuration/config) for more information.
These will overwrite anything defined in the config.
The file should contain environment-variable assignments like:
```
SERVER_SECRET=1234567890abc
```
'';
example = "/etc/nixos/secrets/pangolin.env";
};
dataDir = lib.mkOption {
type = lib.types.str;
default = "/var/lib/pangolin";
example = "/srv/pangolin";
description = "Path to variable state data directory for Pangolin.";
};
};
gerbil = {
port = lib.mkOption {
type = lib.types.port;
default = 3003;
description = ''
Specifies the port to listen on for Gerbil.
'';
};
environmentFile = lib.mkOption {
type = nullOrOpt lib.types.path;
default = null;
description = ''
Path to a file containing sensitive environment variables for Gerbil. See the [Gerbil Documentation](https://docs.fossorial.io/Pangolin/Configuration/config) for more information.
These will overwrite anything defined in the config.
'';
example = "/etc/nixos/secrets/gerbil.env";
};
};
};
config = lib.mkIf cfg.enable {
assertions =
(lib.mapAttrsToList (name: value: {
# check if the value is optional by looking at the type
assertion = (value == null) -> options.services.pangolin."${name}".type._optional or false;
message = "services.pangolin.${name} must be provided when Pangolin is enabled.";
}) cfg)
++ [
{
# wildcards implies (dnsProvider and traefikEnvironmentFile)
assertion =
(finalSettings.traefik.prefer_wildcard_cert or finalSettings.domains.domain1.prefer_wildcard_cert)
-> (cfg.dnsProvider != "" && config.services.traefik.environmentFiles != [ ]);
message = "services.pangolin.dnsProvider and services.traefik.environmentFile must be provided when prefer_wildcard_cert is true.";
}
];
networking.firewall = lib.mkIf cfg.openFirewall {
allowedTCPPorts = [
80
443
];
allowedUDPPorts = [ 51820 ];
};
users = {
users = {
pangolin = {
description = "Pangolin service user";
group = "fossorial";
isSystemUser = true;
packages = [ cfg.package ];
};
gerbil = {
description = "Gerbil service user";
group = "fossorial";
isSystemUser = true;
};
};
groups.fossorial = {
members = [
"pangolin"
"gerbil"
"traefik"
];
};
};
# order is as follows
# "pangolin.service"
# "gerbil.service"
# "traefik.service"
### TODO:
# make tunnels declarative by calling API
###
systemd = {
tmpfiles.settings."10-fossorial-paths" = {
"${cfg.dataDir}".d = {
user = "pangolin";
group = "fossorial";
mode = "0770";
};
"${cfg.dataDir}/config".d = {
user = "pangolin";
group = "fossorial";
mode = "0770";
};
"${cfg.dataDir}/config/letsencrypt".d = {
user = "traefik";
group = "fossorial";
mode = "0700";
};
};
services = {
pangolin = {
description = "Pangolin reverse proxy tunneling service";
wantedBy = [ "multi-user.target" ];
requires = [ "network.target" ];
after = [ "network.target" ];
preStart = ''
mkdir -p ${cfg.dataDir}/config
cp -f ${cfgFile} ${cfg.dataDir}/config/config.yml
'';
serviceConfig = {
User = "pangolin";
Group = "fossorial";
WorkingDirectory = cfg.dataDir;
Restart = "always";
EnvironmentFile = cfg.environmentFile;
# hardening
ProtectSystem = "full";
ProtectHome = true;
PrivateTmp = "disconnected";
PrivateDevices = true;
PrivateMounts = true;
ProtectKernelTunables = true;
ProtectKernelModules = true;
ProtectKernelLogs = true;
ProtectControlGroups = true;
LockPersonality = true;
RestrictRealtime = true;
ProtectClock = true;
ProtectProc = "noaccess";
ProtectHostname = true;
NoNewPrivileges = true;
RestrictSUIDSGID = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_NETLINK"
"AF_UNIX"
];
SocketBindDeny = [
"ipv4:tcp"
"ipv4:udp"
"ipv6:udp"
];
CapabilityBoundingSet = [
"~CAP_BLOCK_SUSPEND"
"~CAP_BPF"
"~CAP_CHOWN"
"~CAP_MKNOD"
"~CAP_NET_RAW"
"~CAP_PERFMON"
"~CAP_SYS_BOOT"
"~CAP_SYS_CHROOT"
"~CAP_SYS_MODULE"
"~CAP_SYS_NICE"
"~CAP_SYS_PACCT"
"~CAP_SYS_PTRACE"
"~CAP_SYS_TIME"
"~CAP_SYSLOG"
"~CAP_WAKE_ALARM"
];
SystemCallFilter = [
"~@chown:EPERM"
"~@clock:EPERM"
"~@cpu-emulation:EPERM"
"~@debug:EPERM"
"~@keyring:EPERM"
"~@memlock:EPERM"
"~@module:EPERM"
"~@mount:EPERM"
"~@obsolete:EPERM"
"~@pkey:EPERM"
"~@privileged:EPERM"
"~@raw-io:EPERM"
"~@reboot:EPERM"
"~@resources:EPERM"
"~@sandbox:EPERM"
"~@setuid:EPERM"
"~@swap:EPERM"
"~@timer:EPERM"
];
ExecStart = lib.getExe cfg.package;
};
};
gerbil = {
description = "Gerbil Service";
wantedBy = [ "multi-user.target" ];
after = [ "pangolin.service" ];
requires = [ "pangolin.service" ];
before = [ "traefik.service" ];
requiredBy = [ "traefik.service" ];
# restarting gerbil restarts traefik
upholds = [ "traefik.service" ];
# provide default to use correct port without envfile
environment = {
LISTEN = "localhost:" + toString config.services.gerbil.port;
};
serviceConfig = {
User = "gerbil";
Group = "fossorial";
WorkingDirectory = cfg.dataDir;
Restart = "always";
EnvironmentFile = cfg.environmentFile;
ReadWritePaths = "${cfg.dataDir}/config";
# hardening
AmbientCapabilities = [
"CAP_NET_ADMIN"
"CAP_SYS_MODULE"
];
CapabilityBoundingSet = [
"CAP_NET_ADMIN"
"CAP_SYS_MODULE"
"~CAP_BLOCK_SUSPEND"
"~CAP_BPF"
"~CAP_CHOWN"
"~CAP_MKNOD"
"~CAP_PERFMON"
"~CAP_SYS_BOOT"
"~CAP_SYS_CHROOT"
"~CAP_SYS_NICE"
"~CAP_SYS_PACCT"
"~CAP_SYS_PTRACE"
"~CAP_SYS_TIME"
"~CAP_SYS_TTY_CONFIG"
"~CAP_SYSLOG"
"~CAP_WAKE_ALARM"
];
ProtectSystem = "full";
ProtectHome = true;
PrivateTmp = "disconnected";
PrivateDevices = true;
PrivateMounts = true;
ProtectKernelTunables = true;
ProtectKernelModules = true;
ProtectKernelLogs = true;
ProtectControlGroups = true;
LockPersonality = true;
RestrictRealtime = true;
ProtectClock = true;
ProtectProc = "noaccess";
ProtectHostname = true;
NoNewPrivileges = true;
RestrictSUIDSGID = true;
MemoryDenyWriteExecute = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_NETLINK"
"AF_UNIX"
];
SystemCallFilter = [
"~@aio:EPERM"
"~@chown:EPERM"
"~@clock:EPERM"
"~@cpu-emulation:EPERM"
"~@debug:EPERM"
"~@keyring:EPERM"
"~@memlock:EPERM"
"~@mount:EPERM"
"~@obsolete:EPERM"
"~@pkey:EPERM"
"~@privileged:EPERM"
"~@raw-io:EPERM"
"~@reboot:EPERM"
"~@resources:EPERM"
"~@sandbox:EPERM"
"~@setuid:EPERM"
"~@swap:EPERM"
"~@sync:EPERM"
"~@timer:EPERM"
];
ExecStart = utils.escapeSystemdExecArgs [
(lib.getExe pkgs.fosrl-gerbil)
"--reachableAt=http://localhost:${toString config.services.gerbil.port}"
"--generateAndSaveKeyTo=${toString cfg.dataDir}/config/key"
"--remoteConfig=http://localhost:${toString finalSettings.server.internal_port}/api/v1/gerbil/get-config"
];
# will not work if the interface is renamed
# https://github.com/fosrl/newt/issues/37#issuecomment-3193385911
ExecStartPost = lib.getExe gerbil-wg0-fix-script;
};
};
traefik = {
wantedBy = [ "multi-user.target" ];
after = [ "gerbil.service" ];
requires = [ "gerbil.service" ];
partOf = [ "gerbil.service" ];
};
};
};
services.traefik = {
enable = true;
group = "fossorial";
dataDir = "${cfg.dataDir}/config/traefik";
staticConfigOptions = {
providers.http = {
endpoint = "http://localhost:${toString finalSettings.server.internal_port}/api/v1/traefik-config";
pollInterval = "5s";
};
# TODO to change this once #437073 is merged.
experimental.plugins.badger = {
moduleName = "github.com/fosrl/badger";
version = "v1.2.0";
};
certificatesResolvers.letsencrypt.acme =
(
if finalSettings.domains.domain1.prefer_wildcard_cert then
{
# see https://doc.traefik.io/traefik/https/acme/#providers
dnsChallenge.provider = cfg.dnsProvider;
}
else
{
httpChallenge.entryPoint = "web";
}
)
//
# common
{
email = cfg.letsEncryptEmail;
storage = "${cfg.dataDir}/config/letsencrypt/acme.json";
caServer = "https://acme-v02.api.letsencrypt.org/directory";
};
entryPoints = {
web.address = ":80";
websecure = {
address = ":443";
transport.respondingTimeouts.readTimeout = "30m";
http.tls.certResolver = "letsencrypt";
};
};
};
dynamicConfigOptions = {
http = {
middlewares.redirect-to-https.redirectScheme.scheme = "https";
routers = {
# HTTP to HTTPS redirect router
main-app-router-redirect = {
rule = "Host(`${cfg.dashboardDomain}`)";
service = "next-service";
entryPoints = [ "web" ];
middlewares = [ "redirect-to-https" ];
};
# Next.js router (handles everything except API and WebSocket paths)
next-router = {
rule = "Host(`${cfg.dashboardDomain}`) && !PathPrefix(`/api/v1`)";
service = "next-service";
entryPoints = [ "websecure" ];
tls =
lib.optionalAttrs (finalSettings.domains.domain1.prefer_wildcard_cert) {
domains = [
{ main = cfg.baseDomain; }
{ sans = "*.${cfg.baseDomain}"; }
];
}
//
# common
{
certResolver = "letsencrypt";
};
};
# API router (handles /api/v1 paths)
api-router = {
rule = "Host(`${cfg.dashboardDomain}`) && PathPrefix(`/api/v1`)";
service = "api-service";
entryPoints = [ "websecure" ];
tls.certResolver = "letsencrypt";
};
# WebSocket router
ws-router = {
rule = "Host(`${cfg.dashboardDomain}`)";
service = "api-service";
entryPoints = [ "websecure" ];
tls.certResolver = "letsencrypt";
};
# Integration API router
int-api-router-redirect = lib.mkIf (finalSettings.flags.enable_integration_api) {
rule = "Host(`api.${cfg.baseDomain}`)";
service = "int-api-service";
entryPoints = [ "web" ];
middlewares = [ "redirect-to-https" ];
};
int-api-router = lib.mkIf (finalSettings.flags.enable_integration_api) {
rule = "Host(`api.${cfg.baseDomain}`)";
service = "int-api-service";
entryPoints = [ "websecure" ];
tls.certResolver = "letsencrypt";
};
};
# could be map
services = {
# Next.js server
next-service.loadBalancer.servers = [
{ url = "http://localhost:${toString finalSettings.server.next_port}"; }
];
# API/WebSocket server
api-service.loadBalancer.servers = [
{ url = "http://localhost:${toString finalSettings.server.external_port}"; }
];
# Integration API server
int-api-service.loadBalancer.servers = lib.mkIf (finalSettings.flags.enable_integration_api) [
{ url = "http://localhost:${toString finalSettings.server.integration_port}"; }
];
};
};
};
};
};
meta.maintainers = with lib.maintainers; [
jackr
sigmasquadron
];
}
@@ -708,7 +708,7 @@ in
# HTTP server-related options
httpPorts = mkOption {
type = types.listOf types.int;
type = types.listOf types.port;
description = "Listening HTTP ports list for this service.";
default = [ 5280 ];
};
@@ -723,7 +723,7 @@ in
};
httpsPorts = mkOption {
type = types.listOf types.int;
type = types.listOf types.port;
description = "Listening HTTPS ports list for this service.";
default = [ 5281 ];
};
+1 -1
View File
@@ -39,7 +39,7 @@ in
package = mkPackageOption pkgs "radvd" { };
debugLevel = mkOption {
type = types.int;
type = types.ints.between 0 5;
default = 0;
example = 5;
description = ''
@@ -113,7 +113,7 @@ in
};
listeningPort = mkOption {
type = types.int;
type = types.port;
default = 0;
example = 44444;
description = ''
@@ -139,7 +139,7 @@ in
};
downloadLimit = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 0;
example = 1024;
description = ''
@@ -148,7 +148,7 @@ in
};
uploadLimit = mkOption {
type = types.int;
type = types.ints.unsigned;
default = 0;
example = 1024;
description = ''
@@ -166,7 +166,7 @@ in
};
httpListenPort = mkOption {
type = types.int;
type = types.port;
default = 9000;
description = ''
HTTP port to bind on.
@@ -24,12 +24,7 @@ in
:::
'';
};
package = lib.mkOption {
type = types.package;
default = pkgs.shorewall;
defaultText = lib.literalExpression "pkgs.shorewall";
description = "The shorewall package to use.";
};
package = lib.mkPackageOption pkgs "shorewall" { };
configs = lib.mkOption {
type = types.attrsOf types.lines;
default = { };
@@ -24,12 +24,7 @@ in
:::
'';
};
package = lib.mkOption {
type = types.package;
default = pkgs.shorewall;
defaultText = lib.literalExpression "pkgs.shorewall";
description = "The shorewall package to use.";
};
package = lib.mkPackageOption pkgs "shorewall" { };
configs = lib.mkOption {
type = types.attrsOf types.lines;
default = { };
@@ -18,12 +18,7 @@ in
description = "User account under which sitespeed-io runs.";
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.sitespeed-io;
defaultText = "pkgs.sitespeed-io";
description = "Sitespeed.io package to use.";
};
package = lib.mkPackageOption pkgs "sitespeed-io" { };
dataDir = lib.mkOption {
default = "/var/lib/sitespeed-io";
+1 -1
View File
@@ -145,7 +145,7 @@ in
};
proxyPort = mkOption {
type = types.int;
type = types.port;
default = 3128;
description = "TCP port on which squid will listen.";
};
@@ -290,14 +290,7 @@ in
'';
};
package = mkOption {
type = types.package;
default = pkgs.syncplay-nogui;
defaultText = literalExpression "pkgs.syncplay-nogui";
description = ''
Package to use for syncplay.
'';
};
package = mkPackageOption pkgs "syncplay-nogui" { };
};
};
@@ -336,7 +336,7 @@ in
};
localAnnouncePort = mkOption {
type = types.nullOr types.int;
type = types.nullOr types.port;
default = null;
description = ''
The port on which to listen and send IPv4 broadcast announcements to.
@@ -36,7 +36,7 @@ in
portMap = mkOption {
description = "Ports to map by default.";
default = { };
type = types.attrsOf types.int;
type = types.attrsOf types.port;
};
};
};
@@ -37,14 +37,7 @@ in
'';
};
package = mkOption {
type = types.package;
default = pkgs.x2goserver;
defaultText = literalExpression "pkgs.x2goserver";
description = ''
The x2goserver package to use.
'';
};
package = mkPackageOption pkgs "x2goserver" { };
superenicer = {
enable = mkEnableOption "superenicer" // {
+2 -6
View File
@@ -10,6 +10,7 @@ let
types
mkDefault
mkOption
mkPackageOption
;
json = pkgs.formats.json { };
@@ -22,12 +23,7 @@ in
services.zenohd = {
enable = lib.mkEnableOption "Zenoh daemon.";
package = mkOption {
description = "The zenoh package to use.";
type = types.package;
default = pkgs.zenoh;
defaultText = "pkgs.zenoh";
};
package = mkPackageOption pkgs "zenoh" { };
settings = mkOption {
description = ''
@@ -44,7 +44,7 @@ in
};
listenPort = mkOption {
type = types.int;
type = types.port;
default = 8000;
example = 1357;
description = ''
@@ -72,7 +72,7 @@ in
tcp_port = mkOption {
description = "Elasticsearch port for the node to node communication.";
default = 9300;
type = types.int;
type = types.port;
};
cluster_name = mkOption {
+1 -8
View File
@@ -154,14 +154,7 @@ in
logLevel = lib.mkOption {
default = 1;
type = lib.types.enum [
0
1
2
3
4
5
];
type = lib.types.ints.between 0 5;
description = "Log level (0 = DEBUG, 5 = FATAL).";
};
@@ -996,6 +996,9 @@ in
"-/etc/resolv.conf"
"-/etc/nsswitch.conf"
"-/etc/hosts"
"-/etc/passwd"
"-/etc/group"
"-/etc/shadow"
"-/etc/localtime"
"-/etc/kanidm"
"-/etc/static/kanidm"
@@ -108,13 +108,7 @@ in
};
LogLevel = lib.mkOption {
type = lib.types.enum [
0
1
2
3
4
];
type = lib.types.ints.between 0 4;
description = ''
Default log level from 0 to 4 (debug, info, important, warning,
error).
@@ -30,13 +30,13 @@ in
};
fastcgi.shibAuthorizerPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 9100;
description = "Port for shibauthorizer FastCGI process to bind to";
};
fastcgi.shibResponderPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 9101;
description = "Port for shibauthorizer FastCGI process to bind to";
};
+1 -6
View File
@@ -15,12 +15,7 @@ in
services.step-ca = {
enable = lib.mkEnableOption "the smallstep certificate authority server";
openFirewall = lib.mkEnableOption "opening the certificate authority server port";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.step-ca;
defaultText = lib.literalExpression "pkgs.step-ca";
description = "Which step-ca package to use.";
};
package = lib.mkPackageOption pkgs "step-ca" { };
address = lib.mkOption {
type = lib.types.str;
example = "127.0.0.1";
+1 -6
View File
@@ -11,12 +11,7 @@ in
options.services.tang = {
enable = lib.mkEnableOption "tang";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.tang;
defaultText = lib.literalExpression "pkgs.tang";
description = "The tang package to use.";
};
package = lib.mkPackageOption pkgs "tang" { };
listenStream = lib.mkOption {
type = with lib.types; listOf str;
@@ -197,12 +197,7 @@ in
package = lib.mkPackageOption pkgs "vaultwarden" { };
webVaultPackage = lib.mkOption {
type = lib.types.package;
default = pkgs.vaultwarden.webvault;
defaultText = lib.literalExpression "pkgs.vaultwarden.webvault";
description = "Web vault package to use.";
};
webVaultPackage = lib.mkPackageOption pkgs [ "vaultwarden" "webvault" ] { };
};
config = lib.mkIf cfg.enable {
@@ -36,13 +36,13 @@ in
};
compressionLevel = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr (lib.types.ints.between 0 16);
description = "The compression level for ZSTD compression (between 0 and 16)";
default = null;
};
jobs = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.ints.positive;
description = "Number of threads used for pushing store paths";
default = null;
};
@@ -225,7 +225,7 @@ in
};
smtpPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
description = "MTA port.";
default = 25;
};
+2 -17
View File
@@ -44,23 +44,8 @@ in
Name of the nginx virtualhost to use and setup. If null, do not setup any virtualhost.
'';
};
phpPackage = lib.mkOption {
type = lib.types.package;
default = pkgs.php;
defaultText = "pkgs.php";
description = ''
php package to use for php fpm daemon.
'';
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.baikal;
defaultText = "pkgs.baikal";
description = ''
Baikal package to use.
'';
};
phpPackage = lib.mkPackageOption pkgs "php" { };
package = lib.mkPackageOption pkgs "baikal" { };
};
};
config = lib.mkIf cfg.enable {
+1 -6
View File
@@ -32,12 +32,7 @@ in
options.services = {
castopod = {
enable = lib.mkEnableOption "Castopod, a hosting platform for podcasters";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.castopod;
defaultText = lib.literalMD "pkgs.castopod";
description = "Which Castopod package to use.";
};
package = lib.mkPackageOption pkgs "castopod" { };
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/castopod";
+2 -2
View File
@@ -75,12 +75,12 @@ in
description = "Address on which the Node.js server should listen";
};
httpPort = mkOption {
type = types.int;
type = types.port;
default = 3000;
description = "Port on which the Node.js server should listen";
};
websocketPort = mkOption {
type = types.int;
type = types.port;
default = 3003;
description = "Port for the websocket that needs to be separate";
};
@@ -95,6 +95,9 @@ let
${concatMapStringsSep "\n" (
template: "cp -r ${template}/. $out/application/views/invoice_templates/pdf/"
) cfg.invoiceTemplates}
${concatMapStringsSep "\n" (
template: "cp -r ${template}/. $out/application/views/quote_templates/pdf/"
) cfg.quoteTemplates}
'';
};
@@ -189,6 +192,38 @@ let
'';
};
quoteTemplates = mkOption {
type = types.listOf types.path;
default = [ ];
description = ''
List of path(s) to respective template(s) which are copied from the 'quote_templates/pdf' directory.
::: {.note}
These templates need to be packaged before use, see example.
:::
'';
example = literalExpression ''
let
# Let's package an example template
template-vtdirektmarketing = pkgs.stdenv.mkDerivation {
name = "vtdirektmarketing";
# Download the template from a public repository
src = pkgs.fetchgit {
url = "https://git.project-insanity.org/onny/invoiceplane-vtdirektmarketing.git";
sha256 = "1hh0q7wzsh8v8x03i82p6qrgbxr4v5fb05xylyrpp975l8axyg2z";
};
sourceRoot = ".";
# Installing simply means copying template php file to the output directory
installPhase = ""
mkdir -p $out
cp invoiceplane-vtdirektmarketing/vtdirektmarketing.php $out/
"";
};
# And then pass this package to the template list like this:
in [ template-vtdirektmarketing ]
'';
};
poolConfig = mkOption {
type =
with types;
@@ -102,7 +102,7 @@ in
};
listenPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 443;
description = ''
The port on which kasmweb should listen.
+1 -6
View File
@@ -706,12 +706,7 @@ in
};
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.mastodon;
defaultText = lib.literalExpression "pkgs.mastodon";
description = "Mastodon package to use.";
};
package = lib.mkPackageOption pkgs "mastodon" { };
extraConfig = lib.mkOption {
type = lib.types.attrs;
@@ -14,12 +14,7 @@ in
options.services.nextcloud.notify_push = {
enable = lib.mkEnableOption "Notify push";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.nextcloud-notify_push;
defaultText = lib.literalMD "pkgs.nextcloud-notify_push";
description = "Which package to use for notify_push";
};
package = lib.mkPackageOption pkgs "nextcloud-notify_push" { };
socketPath = lib.mkOption {
type = lib.types.str;
+1 -1
View File
@@ -46,7 +46,7 @@ in
};
listenPort = mkOption {
type = types.int;
type = types.port;
default = 8081;
description = "Port to listen on.";
};
+3 -8
View File
@@ -37,12 +37,7 @@ in
services.nifi = {
enable = lib.mkEnableOption "Apache NiFi";
package = lib.mkOption {
type = lib.types.package;
default = pkgs.nifi;
defaultText = lib.literalExpression "pkgs.nifi";
description = "Apache NiFi package to use.";
};
package = lib.mkPackageOption pkgs "nifi" { };
user = lib.mkOption {
type = lib.types.str;
@@ -74,7 +69,7 @@ in
};
listenPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = if cfg.enableHTTPS then 8443 else 8080;
defaultText = lib.literalExpression ''
if config.${opt.enableHTTPS}
@@ -96,7 +91,7 @@ in
};
proxyPort = lib.mkOption {
type = lib.types.nullOr lib.types.int;
type = lib.types.nullOr lib.types.port;
default = if cfg.enableHTTPS then 8443 else null;
defaultText = lib.literalExpression ''
if config.${opt.enableHTTPS}
+1 -6
View File
@@ -338,12 +338,7 @@ in
};
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.peertube;
defaultText = lib.literalExpression "pkgs.peertube";
description = "PeerTube package to use.";
};
package = lib.mkPackageOption pkgs "peertube" { };
};
config = lib.mkIf cfg.enable {
@@ -47,7 +47,7 @@ in
hkpPort = mkOption {
default = sksCfg.hkpPort;
defaultText = literalExpression "config.${sksOpt.hkpPort}";
type = types.int;
type = types.port;
description = ''
Which port the sks-keyserver is listening on.
'';
@@ -75,7 +75,7 @@ in
};
listenPort = mkOption {
type = types.int;
type = types.port;
default = 8080;
description = "Port to listen on.";
};
@@ -24,7 +24,7 @@ in
};
listenPort = lib.mkOption {
type = lib.types.int;
type = lib.types.port;
default = 3000;
description = "Port to listen on.";
};

Some files were not shown because too many files have changed in this diff Show More