1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.riak;
8
9in
10
11{
12
13 ###### interface
14
15 options = {
16
17 services.riak = {
18
19 enable = mkEnableOption "riak";
20
21 package = mkOption {
22 type = types.package;
23 default = pkgs.riak;
24 defaultText = literalExpression "pkgs.riak";
25 description = ''
26 Riak package to use.
27 '';
28 };
29
30 nodeName = mkOption {
31 type = types.str;
32 default = "riak@127.0.0.1";
33 description = ''
34 Name of the Erlang node.
35 '';
36 };
37
38 distributedCookie = mkOption {
39 type = types.str;
40 default = "riak";
41 description = ''
42 Cookie for distributed node communication. All nodes in the
43 same cluster should use the same cookie or they will not be able to
44 communicate.
45 '';
46 };
47
48 dataDir = mkOption {
49 type = types.path;
50 default = "/var/db/riak";
51 description = ''
52 Data directory for Riak.
53 '';
54 };
55
56 logDir = mkOption {
57 type = types.path;
58 default = "/var/log/riak";
59 description = ''
60 Log directory for Riak.
61 '';
62 };
63
64 extraConfig = mkOption {
65 type = types.lines;
66 default = "";
67 description = ''
68 Additional text to be appended to <filename>riak.conf</filename>.
69 '';
70 };
71
72 extraAdvancedConfig = mkOption {
73 type = types.lines;
74 default = "";
75 description = ''
76 Additional text to be appended to <filename>advanced.config</filename>.
77 '';
78 };
79
80 };
81
82 };
83
84 ###### implementation
85
86 config = mkIf cfg.enable {
87
88 environment.systemPackages = [ cfg.package ];
89 environment.etc."riak/riak.conf".text = ''
90 nodename = ${cfg.nodeName}
91 distributed_cookie = ${cfg.distributedCookie}
92
93 platform_log_dir = ${cfg.logDir}
94 platform_etc_dir = /etc/riak
95 platform_data_dir = ${cfg.dataDir}
96
97 ${cfg.extraConfig}
98 '';
99
100 environment.etc."riak/advanced.config".text = ''
101 ${cfg.extraAdvancedConfig}
102 '';
103
104 users.users.riak = {
105 name = "riak";
106 uid = config.ids.uids.riak;
107 group = "riak";
108 description = "Riak server user";
109 };
110
111 users.groups.riak.gid = config.ids.gids.riak;
112
113 systemd.services.riak = {
114 description = "Riak Server";
115
116 wantedBy = [ "multi-user.target" ];
117 after = [ "network.target" ];
118
119 path = [
120 pkgs.util-linux # for `logger`
121 pkgs.bash
122 ];
123
124 environment.HOME = "${cfg.dataDir}";
125 environment.RIAK_DATA_DIR = "${cfg.dataDir}";
126 environment.RIAK_LOG_DIR = "${cfg.logDir}";
127 environment.RIAK_ETC_DIR = "/etc/riak";
128
129 preStart = ''
130 if ! test -e ${cfg.logDir}; then
131 mkdir -m 0755 -p ${cfg.logDir}
132 chown -R riak ${cfg.logDir}
133 fi
134
135 if ! test -e ${cfg.dataDir}; then
136 mkdir -m 0700 -p ${cfg.dataDir}
137 chown -R riak ${cfg.dataDir}
138 fi
139 '';
140
141 serviceConfig = {
142 ExecStart = "${cfg.package}/bin/riak console";
143 ExecStop = "${cfg.package}/bin/riak stop";
144 StandardInput = "tty";
145 User = "riak";
146 Group = "riak";
147 PermissionsStartOnly = true;
148 # Give Riak a decent amount of time to clean up.
149 TimeoutStopSec = 120;
150 LimitNOFILE = 65536;
151 };
152
153 unitConfig.RequiresMountsFor = [
154 "${cfg.dataDir}"
155 "${cfg.logDir}"
156 "/etc/riak"
157 ];
158 };
159
160 };
161
162}