81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| let
 | |
|   redisPort = 6379;
 | |
|   centrifugoPort = 8080;
 | |
|   nodes = [
 | |
|     "centrifugo1"
 | |
|     "centrifugo2"
 | |
|     "centrifugo3"
 | |
|   ];
 | |
| in
 | |
| { lib, ... }: {
 | |
|   name = "centrifugo";
 | |
|   meta.maintainers = [ lib.maintainers.tie ];
 | |
| 
 | |
|   nodes = lib.listToAttrs (lib.imap0
 | |
|     (index: name: {
 | |
|       inherit name;
 | |
|       value = { config, ... }: {
 | |
|         services.centrifugo = {
 | |
|           enable = true;
 | |
|           settings = {
 | |
|             inherit name;
 | |
|             port = centrifugoPort;
 | |
|             # See https://centrifugal.dev/docs/server/engines#redis-sharding
 | |
|             engine = "redis";
 | |
|             # Connect to local Redis shard via Unix socket.
 | |
|             redis_address =
 | |
|               let
 | |
|                 otherNodes = lib.take index nodes ++ lib.drop (index + 1) nodes;
 | |
|               in
 | |
|               map (name: "${name}:${toString redisPort}") otherNodes ++ [
 | |
|                 "unix://${config.services.redis.servers.centrifugo.unixSocket}"
 | |
|               ];
 | |
|             usage_stats_disable = true;
 | |
|             api_insecure = true;
 | |
|           };
 | |
|           extraGroups = [
 | |
|             config.services.redis.servers.centrifugo.user
 | |
|           ];
 | |
|         };
 | |
|         services.redis.servers.centrifugo = {
 | |
|           enable = true;
 | |
|           bind = null; # all interfaces
 | |
|           port = redisPort;
 | |
|           openFirewall = true;
 | |
|           settings.protected-mode = false;
 | |
|         };
 | |
|       };
 | |
|     })
 | |
|     nodes);
 | |
| 
 | |
|   testScript = ''
 | |
|     import json
 | |
| 
 | |
|     redisPort = ${toString redisPort}
 | |
|     centrifugoPort = ${toString centrifugoPort}
 | |
| 
 | |
|     start_all()
 | |
| 
 | |
|     for machine in machines:
 | |
|       machine.wait_for_unit("redis-centrifugo.service")
 | |
|       machine.wait_for_open_port(redisPort)
 | |
| 
 | |
|     for machine in machines:
 | |
|       machine.wait_for_unit("centrifugo.service")
 | |
|       machine.wait_for_open_port(centrifugoPort)
 | |
| 
 | |
|     # See https://centrifugal.dev/docs/server/server_api#info
 | |
|     def list_nodes(machine):
 | |
|       curl = "curl --fail-with-body --silent"
 | |
|       body = "{}"
 | |
|       resp = json.loads(machine.succeed(f"{curl} -d '{body}' http://localhost:{centrifugoPort}/api/info"))
 | |
|       return resp["result"]["nodes"]
 | |
|     machineNames = {m.name for m in machines}
 | |
|     for machine in machines:
 | |
|       nodes = list_nodes(machine)
 | |
|       assert len(nodes) == len(machines)
 | |
|       nodeNames = {n['name'] for n in nodes}
 | |
|       assert machineNames == nodeNames
 | |
|   '';
 | |
| }
 | 
