Merge 8e8a794380 into haskell-updates
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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: |
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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" (
|
||||
|
||||
@@ -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" { };
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.";
|
||||
};
|
||||
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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" // {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -46,7 +46,7 @@ in
|
||||
};
|
||||
|
||||
listenPort = mkOption {
|
||||
type = types.int;
|
||||
type = types.port;
|
||||
default = 8081;
|
||||
description = "Port to listen on.";
|
||||
};
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user