diff --git a/nixos/modules/services/databases/redis.nix b/nixos/modules/services/databases/redis.nix index 43829b13c6c0..49990dd736c7 100644 --- a/nixos/modules/services/databases/redis.nix +++ b/nixos/modules/services/databases/redis.nix @@ -1,52 +1,49 @@ { config, lib, pkgs, ... }: - -with lib; - let cfg = config.services.redis; mkValueString = value: if value == true then "yes" else if value == false then "no" - else generators.mkValueStringDefault { } value; + else lib.generators.mkValueStringDefault { } value; - redisConfig = settings: pkgs.writeText "redis.conf" (generators.toKeyValue { + redisConfig = settings: pkgs.writeText "redis.conf" (lib.generators.toKeyValue { listsAsDuplicateKeys = true; - mkKeyValue = generators.mkKeyValueDefault { inherit mkValueString; } " "; + mkKeyValue = lib.generators.mkKeyValueDefault { inherit mkValueString; } " "; } settings); - redisName = name: "redis" + optionalString (name != "") ("-"+name); - enabledServers = filterAttrs (name: conf: conf.enable) config.services.redis.servers; + redisName = name: "redis" + lib.optionalString (name != "") ("-"+name); + enabledServers = lib.filterAttrs (name: conf: conf.enable) config.services.redis.servers; in { imports = [ - (mkRemovedOptionModule [ "services" "redis" "user" ] "The redis module now is hardcoded to the redis user.") - (mkRemovedOptionModule [ "services" "redis" "dbpath" ] "The redis module now uses /var/lib/redis as data directory.") - (mkRemovedOptionModule [ "services" "redis" "dbFilename" ] "The redis module now uses /var/lib/redis/dump.rdb as database dump location.") - (mkRemovedOptionModule [ "services" "redis" "appendOnlyFilename" ] "This option was never used.") - (mkRemovedOptionModule [ "services" "redis" "pidFile" ] "This option was removed.") - (mkRemovedOptionModule [ "services" "redis" "extraConfig" ] "Use services.redis.servers.*.settings instead.") - (mkRenamedOptionModule [ "services" "redis" "enable"] [ "services" "redis" "servers" "" "enable" ]) - (mkRenamedOptionModule [ "services" "redis" "port"] [ "services" "redis" "servers" "" "port" ]) - (mkRenamedOptionModule [ "services" "redis" "openFirewall"] [ "services" "redis" "servers" "" "openFirewall" ]) - (mkRenamedOptionModule [ "services" "redis" "bind"] [ "services" "redis" "servers" "" "bind" ]) - (mkRenamedOptionModule [ "services" "redis" "unixSocket"] [ "services" "redis" "servers" "" "unixSocket" ]) - (mkRenamedOptionModule [ "services" "redis" "unixSocketPerm"] [ "services" "redis" "servers" "" "unixSocketPerm" ]) - (mkRenamedOptionModule [ "services" "redis" "logLevel"] [ "services" "redis" "servers" "" "logLevel" ]) - (mkRenamedOptionModule [ "services" "redis" "logfile"] [ "services" "redis" "servers" "" "logfile" ]) - (mkRenamedOptionModule [ "services" "redis" "syslog"] [ "services" "redis" "servers" "" "syslog" ]) - (mkRenamedOptionModule [ "services" "redis" "databases"] [ "services" "redis" "servers" "" "databases" ]) - (mkRenamedOptionModule [ "services" "redis" "maxclients"] [ "services" "redis" "servers" "" "maxclients" ]) - (mkRenamedOptionModule [ "services" "redis" "save"] [ "services" "redis" "servers" "" "save" ]) - (mkRenamedOptionModule [ "services" "redis" "slaveOf"] [ "services" "redis" "servers" "" "slaveOf" ]) - (mkRenamedOptionModule [ "services" "redis" "masterAuth"] [ "services" "redis" "servers" "" "masterAuth" ]) - (mkRenamedOptionModule [ "services" "redis" "requirePass"] [ "services" "redis" "servers" "" "requirePass" ]) - (mkRenamedOptionModule [ "services" "redis" "requirePassFile"] [ "services" "redis" "servers" "" "requirePassFile" ]) - (mkRenamedOptionModule [ "services" "redis" "appendOnly"] [ "services" "redis" "servers" "" "appendOnly" ]) - (mkRenamedOptionModule [ "services" "redis" "appendFsync"] [ "services" "redis" "servers" "" "appendFsync" ]) - (mkRenamedOptionModule [ "services" "redis" "slowLogLogSlowerThan"] [ "services" "redis" "servers" "" "slowLogLogSlowerThan" ]) - (mkRenamedOptionModule [ "services" "redis" "slowLogMaxLen"] [ "services" "redis" "servers" "" "slowLogMaxLen" ]) - (mkRenamedOptionModule [ "services" "redis" "settings"] [ "services" "redis" "servers" "" "settings" ]) + (lib.mkRemovedOptionModule [ "services" "redis" "user" ] "The redis module now is hardcoded to the redis user.") + (lib.mkRemovedOptionModule [ "services" "redis" "dbpath" ] "The redis module now uses /var/lib/redis as data directory.") + (lib.mkRemovedOptionModule [ "services" "redis" "dbFilename" ] "The redis module now uses /var/lib/redis/dump.rdb as database dump location.") + (lib.mkRemovedOptionModule [ "services" "redis" "appendOnlyFilename" ] "This option was never used.") + (lib.mkRemovedOptionModule [ "services" "redis" "pidFile" ] "This option was removed.") + (lib.mkRemovedOptionModule [ "services" "redis" "extraConfig" ] "Use services.redis.servers.*.settings instead.") + (lib.mkRenamedOptionModule [ "services" "redis" "enable"] [ "services" "redis" "servers" "" "enable" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "port"] [ "services" "redis" "servers" "" "port" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "openFirewall"] [ "services" "redis" "servers" "" "openFirewall" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "bind"] [ "services" "redis" "servers" "" "bind" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "unixSocket"] [ "services" "redis" "servers" "" "unixSocket" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "unixSocketPerm"] [ "services" "redis" "servers" "" "unixSocketPerm" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "logLevel"] [ "services" "redis" "servers" "" "logLevel" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "logfile"] [ "services" "redis" "servers" "" "logfile" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "syslog"] [ "services" "redis" "servers" "" "syslog" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "databases"] [ "services" "redis" "servers" "" "databases" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "maxclients"] [ "services" "redis" "servers" "" "maxclients" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "save"] [ "services" "redis" "servers" "" "save" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "slaveOf"] [ "services" "redis" "servers" "" "slaveOf" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "masterAuth"] [ "services" "redis" "servers" "" "masterAuth" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "requirePass"] [ "services" "redis" "servers" "" "requirePass" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "requirePassFile"] [ "services" "redis" "servers" "" "requirePassFile" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "appendOnly"] [ "services" "redis" "servers" "" "appendOnly" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "appendFsync"] [ "services" "redis" "servers" "" "appendFsync" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "slowLogLogSlowerThan"] [ "services" "redis" "servers" "" "slowLogLogSlowerThan" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "slowLogMaxLen"] [ "services" "redis" "servers" "" "slowLogMaxLen" ]) + (lib.mkRenamedOptionModule [ "services" "redis" "settings"] [ "services" "redis" "servers" "" "settings" ]) ]; ###### interface @@ -54,22 +51,22 @@ in { options = { services.redis = { - package = mkPackageOption pkgs "redis" { }; + package = lib.mkPackageOption pkgs "redis" { }; - vmOverCommit = mkEnableOption '' + vmOverCommit = lib.mkEnableOption '' set `vm.overcommit_memory` sysctl to 1 (Suggested for Background Saving: ) '' // { default = true; }; - servers = mkOption { - type = with types; attrsOf (submodule ({ config, name, ... }: { + servers = lib.mkOption { + type = with lib.types; attrsOf (submodule ({ config, name, ... }: { options = { - enable = mkEnableOption "Redis server"; + enable = lib.mkEnableOption "Redis server"; - user = mkOption { + user = lib.mkOption { type = types.str; default = redisName name; - defaultText = literalExpression '' + defaultText = lib.literalExpression '' if name == "" then "redis" else "redis-''${name}" ''; description = '' @@ -82,10 +79,10 @@ in { ''; }; - group = mkOption { + group = lib.mkOption { type = types.str; default = config.user; - defaultText = literalExpression "config.user"; + defaultText = lib.literalExpression "config.user"; description = '' Group account under which this instance of redis-server runs. @@ -96,17 +93,17 @@ in { ''; }; - port = mkOption { + port = lib.mkOption { type = types.port; default = if name == "" then 6379 else 0; - defaultText = literalExpression ''if name == "" then 6379 else 0''; + defaultText = lib.literalExpression ''if name == "" then 6379 else 0''; description = '' The TCP port to accept connections. If port 0 is specified Redis will not listen on a TCP socket. ''; }; - openFirewall = mkOption { + openFirewall = lib.mkOption { type = types.bool; default = false; description = '' @@ -114,14 +111,14 @@ in { ''; }; - extraParams = mkOption { + extraParams = lib.mkOption { type = with types; listOf str; default = []; description = "Extra parameters to append to redis-server invocation"; example = [ "--sentinel" ]; }; - bind = mkOption { + bind = lib.mkOption { type = with types; nullOr str; default = "127.0.0.1"; description = '' @@ -131,55 +128,55 @@ in { example = "192.0.2.1"; }; - unixSocket = mkOption { + unixSocket = lib.mkOption { type = with types; nullOr path; default = "/run/${redisName name}/redis.sock"; - defaultText = literalExpression '' + defaultText = lib.literalExpression '' if name == "" then "/run/redis/redis.sock" else "/run/redis-''${name}/redis.sock" ''; description = "The path to the socket to bind to."; }; - unixSocketPerm = mkOption { + unixSocketPerm = lib.mkOption { type = types.int; default = 660; description = "Change permissions for the socket"; example = 600; }; - logLevel = mkOption { + logLevel = lib.mkOption { type = types.str; default = "notice"; # debug, verbose, notice, warning example = "debug"; description = "Specify the server verbosity level, options: debug, verbose, notice, warning."; }; - logfile = mkOption { + logfile = lib.mkOption { type = types.str; default = "/dev/null"; description = "Specify the log file name. Also 'stdout' can be used to force Redis to log on the standard output."; example = "/var/log/redis.log"; }; - syslog = mkOption { + syslog = lib.mkOption { type = types.bool; default = true; description = "Enable logging to the system logger."; }; - databases = mkOption { + databases = lib.mkOption { type = types.int; default = 16; description = "Set the number of databases."; }; - maxclients = mkOption { + maxclients = lib.mkOption { type = types.int; default = 10000; description = "Set the max number of connected clients at the same time."; }; - save = mkOption { + save = lib.mkOption { type = with types; listOf (listOf int); default = [ [900 1] [300 10] [60 10000] ]; description = '' @@ -189,16 +186,16 @@ in { ''; }; - slaveOf = mkOption { + slaveOf = lib.mkOption { type = with types; nullOr (submodule ({ ... }: { options = { - ip = mkOption { + ip = lib.mkOption { type = str; description = "IP of the Redis master"; example = "192.168.1.100"; }; - port = mkOption { + port = lib.mkOption { type = port; description = "port of the Redis master"; default = 6379; @@ -211,7 +208,7 @@ in { example = { ip = "192.168.1.100"; port = 6379; }; }; - masterAuth = mkOption { + masterAuth = lib.mkOption { type = with types; nullOr str; default = null; description = ''If the master is password protected (using the requirePass configuration) @@ -220,7 +217,7 @@ in { (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)''; }; - requirePass = mkOption { + requirePass = lib.mkOption { type = with types; nullOr str; default = null; description = '' @@ -230,39 +227,39 @@ in { example = "letmein!"; }; - requirePassFile = mkOption { + requirePassFile = lib.mkOption { type = with types; nullOr path; default = null; description = "File with password for the database."; example = "/run/keys/redis-password"; }; - appendOnly = mkOption { + appendOnly = lib.mkOption { type = types.bool; default = false; description = "By default data is only periodically persisted to disk, enable this option to use an append-only file for improved persistence."; }; - appendFsync = mkOption { + appendFsync = lib.mkOption { type = types.str; default = "everysec"; # no, always, everysec description = "How often to fsync the append-only log, options: no, always, everysec."; }; - slowLogLogSlowerThan = mkOption { + slowLogLogSlowerThan = lib.mkOption { type = types.int; default = 10000; description = "Log queries whose execution take longer than X in milliseconds."; example = 1000; }; - slowLogMaxLen = mkOption { + slowLogMaxLen = lib.mkOption { type = types.int; default = 128; description = "Maximum number of items to keep in slow log."; }; - settings = mkOption { + settings = lib.mkOption { # TODO: this should be converted to freeformType type = with types; attrsOf (oneOf [ bool int str (listOf str) ]); default = {}; @@ -271,7 +268,7 @@ in { for details on supported values. ''; - example = literalExpression '' + example = lib.literalExpression '' { loadmodule = [ "/path/to/my_module.so" "/path/to/other_module.so" ]; } @@ -316,9 +313,9 @@ in { ###### implementation - config = mkIf (enabledServers != {}) { + config = lib.mkIf (enabledServers != {}) { - assertions = attrValues (mapAttrs (name: conf: { + assertions = lib.attrValues (lib.mapAttrs (name: conf: { assertion = conf.requirePass != null -> conf.requirePassFile == null; message = '' You can only set one services.redis.servers.${name}.requirePass @@ -326,32 +323,32 @@ in { ''; }) enabledServers); - boot.kernel.sysctl = mkIf cfg.vmOverCommit { + boot.kernel.sysctl = lib.mkIf cfg.vmOverCommit { "vm.overcommit_memory" = "1"; }; - networking.firewall.allowedTCPPorts = concatMap (conf: - optional conf.openFirewall conf.port - ) (attrValues enabledServers); + networking.firewall.allowedTCPPorts = lib.concatMap (conf: + lib.optional conf.openFirewall conf.port + ) (lib.attrValues enabledServers); environment.systemPackages = [ cfg.package ]; - users.users = mapAttrs' (name: conf: nameValuePair (redisName name) { + users.users = lib.mapAttrs' (name: conf: lib.nameValuePair (redisName name) { description = "System user for the redis-server instance ${name}"; isSystemUser = true; group = redisName name; }) enabledServers; - users.groups = mapAttrs' (name: conf: nameValuePair (redisName name) { + users.groups = lib.mapAttrs' (name: conf: lib.nameValuePair (redisName name) { }) enabledServers; - systemd.services = mapAttrs' (name: conf: nameValuePair (redisName name) { + systemd.services = lib.mapAttrs' (name: conf: lib.nameValuePair (redisName name) { description = "Redis Server - ${redisName name}"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { - ExecStart = "${cfg.package}/bin/${cfg.package.serverBin or "redis-server"} /var/lib/${redisName name}/redis.conf ${escapeShellArgs conf.extraParams}"; + ExecStart = "${cfg.package}/bin/${cfg.package.serverBin or "redis-server"} /var/lib/${redisName name}/redis.conf ${lib.escapeShellArgs conf.extraParams}"; ExecStartPre = "+"+pkgs.writeShellScript "${redisName name}-prep-conf" (let redisConfVar = "/var/lib/${redisName name}/redis.conf"; redisConfRun = "/run/${redisName name}/nixos.conf"; @@ -364,10 +361,10 @@ in { echo 'include "${redisConfRun}"' > "${redisConfVar}" fi echo 'include "${redisConfStore}"' > "${redisConfRun}" - ${optionalString (conf.requirePassFile != null) '' + ${lib.optionalString (conf.requirePassFile != null) '' { echo -n "requirepass " - cat ${escapeShellArg conf.requirePassFile} + cat ${lib.escapeShellArg conf.requirePassFile} } >> "${redisConfRun}" ''} ''); @@ -388,7 +385,7 @@ in { # Security NoNewPrivileges = true; # Process Properties - LimitNOFILE = mkDefault "${toString (conf.maxclients + 32)}"; + LimitNOFILE = lib.mkDefault "${toString (conf.maxclients + 32)}"; # Sandboxing ProtectSystem = "strict"; ProtectHome = true;