Skip to content

Commit

Permalink
Merge pull request #266528 from lucasbergman/unifi-jvmoptions
Browse files Browse the repository at this point in the history
nixos/unifi: Add the ability to specify extra JVM options
  • Loading branch information
wegank authored Nov 15, 2023
2 parents d27d373 + 07828dc commit 1a85914
Showing 1 changed file with 46 additions and 36 deletions.
82 changes: 46 additions & 36 deletions nixos/modules/services/networking/unifi.nix
Original file line number Diff line number Diff line change
@@ -1,60 +1,61 @@
{ config, options, lib, pkgs, utils, ... }:
with lib;
let
cfg = config.services.unifi;
stateDir = "/var/lib/unifi";
cmd = ''
@${cfg.jrePackage}/bin/java java \
${optionalString (lib.versionAtLeast (lib.getVersion cfg.jrePackage) "16")
("--add-opens java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED "
+ "--add-opens java.base/sun.security.util=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED "
+ "--add-opens java.rmi/sun.rmi.transport=ALL-UNNAMED")} \
${optionalString (cfg.initialJavaHeapSize != null) "-Xms${(toString cfg.initialJavaHeapSize)}m"} \
${optionalString (cfg.maximumJavaHeapSize != null) "-Xmx${(toString cfg.maximumJavaHeapSize)}m"} \
-jar ${stateDir}/lib/ace.jar
'';
cmd = lib.escapeShellArgs ([ "@${cfg.jrePackage}/bin/java" "java" ]
++ lib.optionals (lib.versionAtLeast (lib.getVersion cfg.jrePackage) "16") [
"--add-opens=java.base/java.lang=ALL-UNNAMED"
"--add-opens=java.base/java.time=ALL-UNNAMED"
"--add-opens=java.base/sun.security.util=ALL-UNNAMED"
"--add-opens=java.base/java.io=ALL-UNNAMED"
"--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
]
++ (lib.optional (cfg.initialJavaHeapSize != null) "-Xms${(toString cfg.initialJavaHeapSize)}m")
++ (lib.optional (cfg.maximumJavaHeapSize != null) "-Xmx${(toString cfg.maximumJavaHeapSize)}m")
++ cfg.extraJvmOptions
++ [ "-jar" "${stateDir}/lib/ace.jar" ]);
in
{

options = {

services.unifi.enable = mkOption {
type = types.bool;
services.unifi.enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = lib.mdDoc ''
Whether or not to enable the unifi controller service.
'';
};

services.unifi.jrePackage = mkOption {
type = types.package;
services.unifi.jrePackage = lib.mkOption {
type = lib.types.package;
default = if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.5") then pkgs.jdk17_headless else if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.3") then pkgs.jdk11 else pkgs.jre8;
defaultText = literalExpression ''if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.5") then pkgs.jdk17_headless else if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.3" then pkgs.jdk11 else pkgs.jre8'';
defaultText = lib.literalExpression ''if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.5") then pkgs.jdk17_headless else if (lib.versionAtLeast (lib.getVersion cfg.unifiPackage) "7.3" then pkgs.jdk11 else pkgs.jre8'';
description = lib.mdDoc ''
The JRE package to use. Check the release notes to ensure it is supported.
'';
};

services.unifi.unifiPackage = mkOption {
type = types.package;
services.unifi.unifiPackage = lib.mkOption {
type = lib.types.package;
default = pkgs.unifi5;
defaultText = literalExpression "pkgs.unifi5";
defaultText = lib.literalExpression "pkgs.unifi5";
description = lib.mdDoc ''
The unifi package to use.
'';
};

services.unifi.mongodbPackage = mkOption {
type = types.package;
services.unifi.mongodbPackage = lib.mkOption {
type = lib.types.package;
default = pkgs.mongodb-4_4;
defaultText = literalExpression "pkgs.mongodb";
defaultText = lib.literalExpression "pkgs.mongodb";
description = lib.mdDoc ''
The mongodb package to use. Please note: unifi7 officially only supports mongodb up until 3.6 but works with 4.4.
'';
};

services.unifi.openFirewall = mkOption {
type = types.bool;
services.unifi.openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = lib.mdDoc ''
Whether or not to open the minimum required ports on the firewall.
Expand All @@ -65,8 +66,8 @@ in
'';
};

services.unifi.initialJavaHeapSize = mkOption {
type = types.nullOr types.int;
services.unifi.initialJavaHeapSize = lib.mkOption {
type = with lib.types; nullOr int;
default = null;
example = 1024;
description = lib.mdDoc ''
Expand All @@ -75,8 +76,8 @@ in
'';
};

services.unifi.maximumJavaHeapSize = mkOption {
type = types.nullOr types.int;
services.unifi.maximumJavaHeapSize = lib.mkOption {
type = with lib.types; nullOr int;
default = null;
example = 4096;
description = lib.mdDoc ''
Expand All @@ -85,9 +86,18 @@ in
'';
};

services.unifi.extraJvmOptions = lib.mkOption {
type = with lib.types; listOf str;
default = [ ];
example = lib.literalExpression ''["-Xlog:gc"]'';
description = lib.mdDoc ''
Set extra options to pass to the JVM.
'';
};

};

config = mkIf cfg.enable {
config = lib.mkIf cfg.enable {

users.users.unifi = {
isSystemUser = true;
Expand All @@ -97,7 +107,7 @@ in
};
users.groups.unifi = {};

networking.firewall = mkIf cfg.openFirewall {
networking.firewall = lib.mkIf cfg.openFirewall {
# https://help.ubnt.com/hc/en-us/articles/218506997
allowedTCPPorts = [
8080 # Port for UAP to inform controller.
Expand All @@ -123,8 +133,8 @@ in

serviceConfig = {
Type = "simple";
ExecStart = "${(removeSuffix "\n" cmd)} start";
ExecStop = "${(removeSuffix "\n" cmd)} stop";
ExecStart = "${cmd} start";
ExecStop = "${cmd} stop";
Restart = "on-failure";
TimeoutSec = "5min";
User = "unifi";
Expand Down Expand Up @@ -166,7 +176,7 @@ in
StateDirectory = "unifi";
RuntimeDirectory = "unifi";
LogsDirectory = "unifi";
CacheDirectory= "unifi";
CacheDirectory = "unifi";

TemporaryFileSystem = [
# required as we want to create bind mounts below
Expand All @@ -176,7 +186,7 @@ in
# We must create the binary directories as bind mounts instead of symlinks
# This is because the controller resolves all symlinks to absolute paths
# to be used as the working directory.
BindPaths = [
BindPaths = [
"/var/log/unifi:${stateDir}/logs"
"/run/unifi:${stateDir}/run"
"${cfg.unifiPackage}/dl:${stateDir}/dl"
Expand All @@ -194,7 +204,7 @@ in

};
imports = [
(mkRemovedOptionModule [ "services" "unifi" "dataDir" ] "You should move contents of dataDir to /var/lib/unifi/data" )
(mkRenamedOptionModule [ "services" "unifi" "openPorts" ] [ "services" "unifi" "openFirewall" ])
(lib.mkRemovedOptionModule [ "services" "unifi" "dataDir" ] "You should move contents of dataDir to /var/lib/unifi/data")
(lib.mkRenamedOptionModule [ "services" "unifi" "openPorts" ] [ "services" "unifi" "openFirewall" ])
];
}

0 comments on commit 1a85914

Please sign in to comment.