diff options
Diffstat (limited to 'nixos/modules/services/amqp')
-rw-r--r-- | nixos/modules/services/amqp/activemq/ActiveMQBroker.java | 19 | ||||
-rw-r--r-- | nixos/modules/services/amqp/activemq/default.nix | 131 | ||||
-rw-r--r-- | nixos/modules/services/amqp/rabbitmq.nix | 94 |
3 files changed, 244 insertions, 0 deletions
diff --git a/nixos/modules/services/amqp/activemq/ActiveMQBroker.java b/nixos/modules/services/amqp/activemq/ActiveMQBroker.java new file mode 100644 index 000000000000..c0f5d16ea11a --- /dev/null +++ b/nixos/modules/services/amqp/activemq/ActiveMQBroker.java @@ -0,0 +1,19 @@ +import org.apache.activemq.broker.BrokerService; +import org.apache.activemq.broker.BrokerFactory; +import java.net.URI; + +public class ActiveMQBroker { + + public static void main(String[] args) throws Throwable { + URI uri = new URI((args.length > 0) ? args[0] : "xbean:activemq.xml"); + BrokerService broker = BrokerFactory.createBroker(uri); + broker.start(); + if (broker.waitUntilStarted()) { + broker.waitUntilStopped(); + } else { + System.out.println("Failed starting broker"); + System.exit(-1); + }; + } + +} diff --git a/nixos/modules/services/amqp/activemq/default.nix b/nixos/modules/services/amqp/activemq/default.nix new file mode 100644 index 000000000000..915d179e6999 --- /dev/null +++ b/nixos/modules/services/amqp/activemq/default.nix @@ -0,0 +1,131 @@ +{ config, pkgs, ... }: + +with pkgs.lib; +with pkgs; + +let + + cfg = config.services.activemq; + + activemqBroker = stdenv.mkDerivation { + name = "activemq-broker"; + phases = [ "installPhase" ]; + buildInputs = [ jdk ]; + installPhase = '' + ensureDir $out/lib + source ${activemq}/lib/classpath.env + export CLASSPATH + ln -s "${./ActiveMQBroker.java}" ActiveMQBroker.java + javac -d $out/lib ActiveMQBroker.java + ''; + }; + +in { + + options = { + services.activemq = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Enable the Apache ActiveMQ message broker service. + ''; + }; + configurationDir = mkOption { + default = "${activemq}/conf"; + description = '' + The base directory for ActiveMQ's configuration. + By default, this directory is searched for a file named activemq.xml, + which should contain the configuration for the broker service. + ''; + }; + configurationURI = mkOption { + type = types.string; + default = "xbean:activemq.xml"; + description = '' + The URI that is passed along to the BrokerFactory to + set up the configuration of the ActiveMQ broker service. + You should not need to change this. For custom configuration, + set the <literal>configurationDir</literal> instead, and create + an activemq.xml configuration file in it. + ''; + }; + baseDir = mkOption { + type = types.string; + default = "/var/activemq"; + description = '' + The base directory where ActiveMQ stores its persistent data and logs. + This will be overridden if you set "activemq.base" and "activemq.data" + in the <literal>javaProperties</literal> option. You can also override + this in activemq.xml. + ''; + }; + javaProperties = mkOption { + type = types.attrs; + default = { }; + example = { + "java.net.preferIPv4Stack" = "true"; + }; + apply = attrs: { + "activemq.base" = "${cfg.baseDir}"; + "activemq.data" = "${cfg.baseDir}/data"; + "activemq.conf" = "${cfg.configurationDir}"; + "activemq.home" = "${activemq}"; + } // attrs; + description = '' + Specifies Java properties that are sent to the ActiveMQ + broker service with the "-D" option. You can set properties + here to change the behaviour and configuration of the broker. + All essential properties that are not set here are automatically + given reasonable defaults. + ''; + }; + extraJavaOptions = mkOption { + type = types.string; + default = ""; + example = "-Xmx2G -Xms2G -XX:MaxPermSize=512M"; + description = '' + Add extra options here that you want to be sent to the + Java runtime when the broker service is started. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + users.extraUsers.activemq = { + description = "ActiveMQ server user"; + group = "activemq"; + uid = config.ids.uids.activemq; + }; + + users.extraGroups.activemq.gid = config.ids.gids.activemq; + + systemd.services.activemq_init = { + wantedBy = [ "activemq.service" ]; + partOf = [ "activemq.service" ]; + before = [ "activemq.service" ]; + serviceConfig.Type = "oneshot"; + script = '' + mkdir -p "${cfg.javaProperties."activemq.data"}" + chown -R activemq "${cfg.javaProperties."activemq.data"}" + ''; + }; + + systemd.services.activemq = { + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + path = [ jre ]; + serviceConfig.User = "activemq"; + script = '' + source ${activemq}/lib/classpath.env + export CLASSPATH=${activemqBroker}/lib:${cfg.configurationDir}:$CLASSPATH + exec java \ + ${concatStringsSep " \\\n" (mapAttrsToList (name: value: "-D${name}=${value}") cfg.javaProperties)} \ + ${cfg.extraJavaOptions} ActiveMQBroker "${cfg.configurationURI}" + ''; + }; + + }; + +} diff --git a/nixos/modules/services/amqp/rabbitmq.nix b/nixos/modules/services/amqp/rabbitmq.nix new file mode 100644 index 000000000000..696b5ad43797 --- /dev/null +++ b/nixos/modules/services/amqp/rabbitmq.nix @@ -0,0 +1,94 @@ +{ config, pkgs, ... }: + +with pkgs.lib; + +let + + cfg = config.services.rabbitmq; + + run = cmd: "${pkgs.sudo}/bin/sudo -E -u rabbitmq ${cmd}"; + +in + +{ + + + ###### interface + + options = { + + services.rabbitmq = { + + enable = mkOption { + default = false; + description = '' + Whether to enable the RabbitMQ server, an Advanced Message + Queuing Protocol (AMQP) broker. + ''; + }; + + listenAddress = mkOption { + default = "127.0.0.1"; + example = ""; + description = '' + IP address on which RabbitMQ will listen for AMQP + connections. Set to the empty string to listen on all + interfaces. Note that RabbitMQ creates a user named + <literal>guest</literal> with password + <literal>guest</literal> by default, so you should delete + this user if you intend to allow external access. + ''; + }; + + }; + + }; + + + ###### implementation + + config = mkIf cfg.enable { + + environment.systemPackages = [ pkgs.rabbitmq_server ]; + + users.extraUsers.rabbitmq = { + description = "RabbitMQ server user"; + home = "/var/empty"; + group = "rabbitmq"; + uid = config.ids.uids.rabbitmq; + }; + + users.extraGroups.rabbitmq.gid = config.ids.gids.rabbitmq; + + jobs.rabbitmq = { + description = "RabbitMQ server"; + + startOn = "started network-interfaces"; + + preStart = + '' + mkdir -m 0700 -p /var/lib/rabbitmq + chown rabbitmq /var/lib/rabbitmq + + mkdir -m 0700 -p /var/log/rabbitmq + chown rabbitmq /var/log/rabbitmq + ''; + + environment.HOME = "/var/lib/rabbitmq"; + environment.RABBITMQ_NODE_IP_ADDRESS = cfg.listenAddress; + environment.SYS_PREFIX = ""; + + exec = + '' + ${run "${pkgs.rabbitmq_server}/sbin/rabbitmq-server"} + ''; + + preStop = + '' + ${run "${pkgs.rabbitmq_server}/sbin/rabbitmqctl stop"} + ''; + }; + + }; + +} |