blob: bc6460ffa2405e2f94d213d3c78ece883ada78fd (
plain) (
tree)
|
|
{ lib, config, pkgs, ... }:
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
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.Slice = "redis.slice";
services.spiped = {
enable = true;
config.redis = {
decrypt = true;
source = "0.0.0.0:16379";
target = "/run/redis/redis.sock";
keyfile = "${config.secrets.location}/redis/spiped_keyfile";
};
};
systemd.services.spiped_redis = {
description = "Secure pipe 'redis'";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Slice = "redis.slice";
Restart = "always";
User = "spiped";
PermissionsStartOnly = true;
SupplementaryGroups = "keys";
};
script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
};
services.filesWatcher.predixy = {
restart = true;
paths = [ "${config.secrets.location}/redis/predixy.conf" ];
};
networking.firewall.allowedTCPPorts = [ 7617 16379 ];
secrets.keys = [
{
dest = "redis/predixy.conf";
user = "redis";
group = "redis";
permissions = "0400";
text = ''
Name Predixy
Bind 127.0.0.1:7617
ClientTimeout 300
WorkerThreads 1
Authority {
Auth "${config.myEnv.databases.redis.predixy.read}" {
Mode read
}
}
StandaloneServerPool {
Databases 16
RefreshMethod fixed
Group shard001 {
+ ${config.myEnv.databases.redis.socket}
}
}
'';
}
{
dest = "redis/spiped_keyfile";
user = "spiped";
group = "spiped";
permissions = "0400";
text = config.myEnv.databases.redis.spiped_key;
}
];
systemd.slices.redis = {
description = "Redis slice";
};
systemd.services.predixy = {
description = "Redis proxy";
wantedBy = [ "multi-user.target" ];
after = [ "redis.service" ];
serviceConfig = {
Slice = "redis.slice";
User = "redis";
Group = "redis";
SupplementaryGroups = "keys";
Type = "simple";
ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.location}/redis/predixy.conf";
};
};
};
}
|