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}