{ config, lib, pkgs, ... }: with lib; let cfg = config.services.rethinkdb; rethinkdb = cfg.package; in { ###### interface options = { services.rethinkdb = { enable = mkEnableOption "RethinkDB server"; #package = mkOption { # default = pkgs.rethinkdb; # description = "Which RethinkDB derivation to use."; #}; user = mkOption { default = "rethinkdb"; description = "User account under which RethinkDB runs."; }; group = mkOption { default = "rethinkdb"; description = "Group which rethinkdb user belongs to."; }; dbpath = mkOption { default = "/var/db/rethinkdb"; description = "Location where RethinkDB stores its data, 1 data directory per instance."; }; pidpath = mkOption { default = "/run/rethinkdb"; description = "Location where each instance's pid file is located."; }; #cfgpath = mkOption { # default = "/etc/rethinkdb/instances.d"; # description = "Location where RethinkDB stores it config files, 1 config file per instance."; #}; # TODO: currently not used by our implementation. #instances = mkOption { # type = types.attrsOf types.str; # default = {}; # description = "List of named RethinkDB instances in our cluster."; #}; }; }; ###### implementation config = mkIf config.services.rethinkdb.enable { environment.systemPackages = [ rethinkdb ]; systemd.services.rethinkdb = { description = "RethinkDB server"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { # TODO: abstract away 'default', which is a per-instance directory name # allowing end user of this nix module to provide multiple instances, # and associated directory per instance ExecStart = "${rethinkdb}/bin/rethinkdb -d ${cfg.dbpath}/default"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; User = cfg.user; Group = cfg.group; PIDFile = "${cfg.pidpath}/default.pid"; PermissionsStartOnly = true; }; preStart = '' if ! test -e ${cfg.dbpath}; then install -d -m0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dbpath} install -d -m0755 -o ${cfg.user} -g ${cfg.group} ${cfg.dbpath}/default chown -R ${cfg.user}:${cfg.group} ${cfg.dbpath} fi if ! test -e "${cfg.pidpath}/default.pid"; then install -D -o ${cfg.user} -g ${cfg.group} /dev/null "${cfg.pidpath}/default.pid" fi ''; }; users.users.rethinkdb = mkIf (cfg.user == "rethinkdb") { name = "rethinkdb"; description = "RethinkDB server user"; isSystemUser = true; }; users.groups = optionalAttrs (cfg.group == "rethinkdb") (singleton { name = "rethinkdb"; }); }; }