diff --git a/modules/nixos/redis-cluster.nix b/modules/nixos/redis-cluster.nix index 5d45cd9..957afc9 100644 --- a/modules/nixos/redis-cluster.nix +++ b/modules/nixos/redis-cluster.nix @@ -227,10 +227,36 @@ in OOMScoreAdjust = "-900"; }; - in listToAttrs (map (serviceName: { - name = serviceName; - value = { inherit serviceConfig; }; - }) redisServices); + # Redis service optimizations + redisServiceConfigs = listToAttrs (map (serviceName: { + name = serviceName; + value = { inherit serviceConfig; }; + }) redisServices); + + # Cluster initialization service + clusterInitService = mkIf cfg.createCluster { + redis-cluster-init = { + description = "Initialize Redis Cluster"; + after = map (i: "redis-master-${toString i}.service") (range 0 (cfg.masters - 1)); + wants = map (i: "redis-master-${toString i}.service") (range 0 (cfg.masters - 1)); + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = let + masterNodes = concatStringsSep " " (map (i: + "${cfg.announceIp}:${toString (cfg.basePort + i)}" + ) (range 0 (cfg.masters - 1))); + in "${pkgs.redis}/bin/redis-cli --cluster create ${masterNodes} --cluster-replicas ${toString cfg.replicasPerMaster} --cluster-yes"; + + # Wait for Redis instances to be ready + ExecStartPre = "${pkgs.bash}/bin/bash -c 'for i in {1..30}; do ${pkgs.redis}/bin/redis-cli -p ${toString cfg.basePort} ping && break || sleep 2; done'"; + }; + }; + }; + + in redisServiceConfigs // clusterInitService; # Firewall configuration networking.firewall = mkIf cfg.openFirewall { @@ -244,27 +270,6 @@ in (map (i: cfg.basePort + cfg.masters + i + 10000) (range 0 (cfg.masters * cfg.replicasPerMaster - 1))); }; - # Cluster initialization script - systemd.services.redis-cluster-init = mkIf cfg.createCluster { - description = "Initialize Redis Cluster"; - after = map (i: "redis-master-${toString i}.service") (range 0 (cfg.masters - 1)); - wants = map (i: "redis-master-${toString i}.service") (range 0 (cfg.masters - 1)); - wantedBy = [ "multi-user.target" ]; - - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - ExecStart = let - masterNodes = concatStringsSep " " (map (i: - "${cfg.announceIp}:${toString (cfg.basePort + i)}" - ) (range 0 (cfg.masters - 1))); - in "${pkgs.redis}/bin/redis-cli --cluster create ${masterNodes} --cluster-replicas ${toString cfg.replicasPerMaster} --cluster-yes"; - - # Wait for Redis instances to be ready - ExecStartPre = "${pkgs.bash}/bin/bash -c 'for i in {1..30}; do ${pkgs.redis}/bin/redis-cli -p ${toString cfg.basePort} ping && break || sleep 2; done'"; - }; - }; - # Cluster management utilities environment.systemPackages = [ pkgs.redis ];