{ lib, config, ... }: let cfg = config.myServices.databases.redis; in { options.myServices.databases.redis = { enable = lib.mkOption { default = false; example = true; description = "Whether to enable redis database"; type = lib.types.bool; }; socketsDir = lib.mkOption { type = lib.types.path; default = "/run/redis"; description = '' The directory where Redis puts sockets. ''; }; # Output variables systemdRuntimeDirectory = lib.mkOption { type = lib.types.str; # Use ReadWritePaths= instead if socketsDir is outside of /run default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; lib.strings.removePrefix "/run/" cfg.socketsDir; description = '' Adjusted redis sockets directory for systemd ''; readOnly = true; }; sockets = lib.mkOption { type = lib.types.attrsOf lib.types.path; default = { redis = "${cfg.socketsDir}/redis.sock"; }; readOnly = true; description = '' Redis sockets ''; }; }; config = lib.mkIf cfg.enable { users.users.redis.uid = config.ids.uids.redis; users.groups.redis.gid = config.ids.gids.redis; services.redis = rec { enable = true; bind = "127.0.0.1"; unixSocket = cfg.sockets.redis; extraConfig = '' unixsocketperm 777 maxclients 1024 ''; }; systemd.services.redis.serviceConfig.RuntimeDirectory = cfg.systemdRuntimeDirectory; }; }