at 22.05-pre 3.6 kB view raw
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}