at 18.09-beta 3.8 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.rabbitmq; 7 config_file = pkgs.writeText "rabbitmq.config" cfg.config; 8 config_file_wo_suffix = builtins.substring 0 ((builtins.stringLength config_file) - 7) config_file; 9 10in { 11 ###### interface 12 options = { 13 services.rabbitmq = { 14 15 enable = mkOption { 16 default = false; 17 description = '' 18 Whether to enable the RabbitMQ server, an Advanced Message 19 Queuing Protocol (AMQP) broker. 20 ''; 21 }; 22 23 listenAddress = mkOption { 24 default = "127.0.0.1"; 25 example = ""; 26 description = '' 27 IP address on which RabbitMQ will listen for AMQP 28 connections. Set to the empty string to listen on all 29 interfaces. Note that RabbitMQ creates a user named 30 <literal>guest</literal> with password 31 <literal>guest</literal> by default, so you should delete 32 this user if you intend to allow external access. 33 ''; 34 type = types.str; 35 }; 36 37 port = mkOption { 38 default = 5672; 39 description = '' 40 Port on which RabbitMQ will listen for AMQP connections. 41 ''; 42 type = types.int; 43 }; 44 45 dataDir = mkOption { 46 type = types.path; 47 default = "/var/lib/rabbitmq"; 48 description = '' 49 Data directory for rabbitmq. 50 ''; 51 }; 52 53 cookie = mkOption { 54 default = ""; 55 type = types.str; 56 description = '' 57 Erlang cookie is a string of arbitrary length which must 58 be the same for several nodes to be allowed to communicate. 59 Leave empty to generate automatically. 60 ''; 61 }; 62 63 config = mkOption { 64 default = ""; 65 type = types.str; 66 description = '' 67 Verbatim configuration file contents. 68 See http://www.rabbitmq.com/configure.html 69 ''; 70 }; 71 72 plugins = mkOption { 73 default = []; 74 type = types.listOf types.str; 75 description = "The names of plugins to enable"; 76 }; 77 }; 78 }; 79 80 81 ###### implementation 82 config = mkIf cfg.enable { 83 84 environment.systemPackages = [ pkgs.rabbitmq_server ]; 85 86 users.users.rabbitmq = { 87 description = "RabbitMQ server user"; 88 home = "${cfg.dataDir}"; 89 createHome = true; 90 group = "rabbitmq"; 91 uid = config.ids.uids.rabbitmq; 92 }; 93 94 users.groups.rabbitmq.gid = config.ids.gids.rabbitmq; 95 96 systemd.services.rabbitmq = { 97 description = "RabbitMQ Server"; 98 99 wantedBy = [ "multi-user.target" ]; 100 after = [ "network.target" ]; 101 102 path = [ pkgs.rabbitmq_server pkgs.procps ]; 103 104 environment = { 105 RABBITMQ_MNESIA_BASE = "${cfg.dataDir}/mnesia"; 106 RABBITMQ_NODE_IP_ADDRESS = cfg.listenAddress; 107 RABBITMQ_NODE_PORT = toString cfg.port; 108 RABBITMQ_LOGS = "-"; 109 RABBITMQ_SASL_LOGS = "-"; 110 RABBITMQ_PID_FILE = "${cfg.dataDir}/pid"; 111 SYS_PREFIX = ""; 112 RABBITMQ_ENABLED_PLUGINS_FILE = pkgs.writeText "enabled_plugins" '' 113 [ ${concatStringsSep "," cfg.plugins} ]. 114 ''; 115 } // optionalAttrs (cfg.config != "") { RABBITMQ_CONFIG_FILE = config_file_wo_suffix; }; 116 117 serviceConfig = { 118 ExecStart = "${pkgs.rabbitmq_server}/sbin/rabbitmq-server"; 119 ExecStop = "${pkgs.rabbitmq_server}/sbin/rabbitmqctl stop"; 120 User = "rabbitmq"; 121 Group = "rabbitmq"; 122 WorkingDirectory = cfg.dataDir; 123 }; 124 125 postStart = '' 126 rabbitmqctl wait ${cfg.dataDir}/pid 127 ''; 128 129 preStart = '' 130 ${optionalString (cfg.cookie != "") '' 131 echo -n ${cfg.cookie} > ${cfg.dataDir}/.erlang.cookie 132 chmod 600 ${cfg.dataDir}/.erlang.cookie 133 ''} 134 ''; 135 }; 136 137 }; 138 139}