1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.aerospike;
8
9 aerospikeConf = pkgs.writeText "aerospike.conf" ''
10 # This stanza must come first.
11 service {
12 user aerospike
13 group aerospike
14 paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
15 proto-fd-max 15000
16 work-directory ${cfg.workDir}
17 }
18 logging {
19 console {
20 context any info
21 }
22 }
23 mod-lua {
24 system-path ${cfg.package}/share/udf/lua
25 user-path ${cfg.workDir}/udf/lua
26 }
27 network {
28 ${cfg.networkConfig}
29 }
30 ${cfg.extraConfig}
31 '';
32
33in
34
35{
36
37 ###### interface
38
39 options = {
40
41 services.aerospike = {
42 enable = mkEnableOption (lib.mdDoc "Aerospike server");
43
44 package = mkOption {
45 default = pkgs.aerospike;
46 defaultText = literalExpression "pkgs.aerospike";
47 type = types.package;
48 description = lib.mdDoc "Which Aerospike derivation to use";
49 };
50
51 workDir = mkOption {
52 type = types.str;
53 default = "/var/lib/aerospike";
54 description = lib.mdDoc "Location where Aerospike stores its files";
55 };
56
57 networkConfig = mkOption {
58 type = types.lines;
59 default = ''
60 service {
61 address any
62 port 3000
63 }
64
65 heartbeat {
66 address any
67 mode mesh
68 port 3002
69 interval 150
70 timeout 10
71 }
72
73 fabric {
74 address any
75 port 3001
76 }
77
78 info {
79 address any
80 port 3003
81 }
82 '';
83 description = lib.mdDoc "network section of configuration file";
84 };
85
86 extraConfig = mkOption {
87 type = types.lines;
88 default = "";
89 example = ''
90 namespace test {
91 replication-factor 2
92 memory-size 4G
93 default-ttl 30d
94 storage-engine memory
95 }
96 '';
97 description = lib.mdDoc "Extra configuration";
98 };
99 };
100
101 };
102
103
104 ###### implementation
105
106 config = mkIf config.services.aerospike.enable {
107
108 users.users.aerospike = {
109 name = "aerospike";
110 group = "aerospike";
111 uid = config.ids.uids.aerospike;
112 description = "Aerospike server user";
113 };
114 users.groups.aerospike.gid = config.ids.gids.aerospike;
115
116 systemd.services.aerospike = rec {
117 description = "Aerospike server";
118
119 wantedBy = [ "multi-user.target" ];
120 after = [ "network.target" ];
121
122 serviceConfig = {
123 ExecStart = "${cfg.package}/bin/asd --fgdaemon --config-file ${aerospikeConf}";
124 User = "aerospike";
125 Group = "aerospike";
126 LimitNOFILE = 100000;
127 PermissionsStartOnly = true;
128 };
129
130 preStart = ''
131 if [ $(echo "$(${pkgs.procps}/bin/sysctl -n kernel.shmall) < 4294967296" | ${pkgs.bc}/bin/bc) == "1" ]; then
132 echo "kernel.shmall too low, setting to 4G pages"
133 ${pkgs.procps}/bin/sysctl -w kernel.shmall=4294967296
134 fi
135 if [ $(echo "$(${pkgs.procps}/bin/sysctl -n kernel.shmmax) < 1073741824" | ${pkgs.bc}/bin/bc) == "1" ]; then
136 echo "kernel.shmmax too low, setting to 1GB"
137 ${pkgs.procps}/bin/sysctl -w kernel.shmmax=1073741824
138 fi
139 if [ $(echo "$(cat /proc/sys/net/core/rmem_max) < 15728640" | ${pkgs.bc}/bin/bc) == "1" ]; then
140 echo "increasing socket buffer limit (/proc/sys/net/core/rmem_max): $(cat /proc/sys/net/core/rmem_max) -> 15728640"
141 echo 15728640 > /proc/sys/net/core/rmem_max
142 fi
143 if [ $(echo "$(cat /proc/sys/net/core/wmem_max) < 5242880" | ${pkgs.bc}/bin/bc) == "1" ]; then
144 echo "increasing socket buffer limit (/proc/sys/net/core/wmem_max): $(cat /proc/sys/net/core/wmem_max) -> 5242880"
145 echo 5242880 > /proc/sys/net/core/wmem_max
146 fi
147 install -d -m0700 -o ${serviceConfig.User} -g ${serviceConfig.Group} "${cfg.workDir}"
148 install -d -m0700 -o ${serviceConfig.User} -g ${serviceConfig.Group} "${cfg.workDir}/smd"
149 install -d -m0700 -o ${serviceConfig.User} -g ${serviceConfig.Group} "${cfg.workDir}/udf"
150 install -d -m0700 -o ${serviceConfig.User} -g ${serviceConfig.Group} "${cfg.workDir}/udf/lua"
151 '';
152 };
153
154 };
155
156}