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