1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.solr;
8
9in
10
11{
12 options = {
13 services.solr = {
14 enable = mkEnableOption "Solr";
15
16 package = mkOption {
17 type = types.package;
18 default = pkgs.solr;
19 defaultText = "pkgs.solr";
20 description = "Which Solr package to use.";
21 };
22
23 port = mkOption {
24 type = types.int;
25 default = 8983;
26 description = "Port on which Solr is ran.";
27 };
28
29 stateDir = mkOption {
30 type = types.path;
31 default = "/var/lib/solr";
32 description = "The solr home directory containing config, data, and logging files.";
33 };
34
35 extraJavaOptions = mkOption {
36 type = types.listOf types.str;
37 default = [];
38 description = "Extra command line options given to the java process running Solr.";
39 };
40
41 user = mkOption {
42 type = types.str;
43 default = "solr";
44 description = "User under which Solr is ran.";
45 };
46
47 group = mkOption {
48 type = types.str;
49 default = "solr";
50 description = "Group under which Solr is ran.";
51 };
52 };
53 };
54
55 config = mkIf cfg.enable {
56
57 environment.systemPackages = [ cfg.package ];
58
59 systemd.services.solr = {
60 after = [ "network.target" "remote-fs.target" "nss-lookup.target" "systemd-journald-dev-log.socket" ];
61 wantedBy = [ "multi-user.target" ];
62
63 environment = {
64 SOLR_HOME = "${cfg.stateDir}/data";
65 LOG4J_PROPS = "${cfg.stateDir}/log4j2.xml";
66 SOLR_LOGS_DIR = "${cfg.stateDir}/logs";
67 SOLR_PORT = "${toString cfg.port}";
68 };
69 path = with pkgs; [
70 gawk
71 procps
72 ];
73 preStart = ''
74 mkdir -p "${cfg.stateDir}/data";
75 mkdir -p "${cfg.stateDir}/logs";
76
77 if ! test -e "${cfg.stateDir}/data/solr.xml"; then
78 install -D -m0640 ${cfg.package}/server/solr/solr.xml "${cfg.stateDir}/data/solr.xml"
79 install -D -m0640 ${cfg.package}/server/solr/zoo.cfg "${cfg.stateDir}/data/zoo.cfg"
80 fi
81
82 if ! test -e "${cfg.stateDir}/log4j2.xml"; then
83 install -D -m0640 ${cfg.package}/server/resources/log4j2.xml "${cfg.stateDir}/log4j2.xml"
84 fi
85 '';
86
87 serviceConfig = {
88 User = cfg.user;
89 Group = cfg.group;
90 ExecStart="${cfg.package}/bin/solr start -f -a \"${concatStringsSep " " cfg.extraJavaOptions}\"";
91 ExecStop="${cfg.package}/bin/solr stop";
92 };
93 };
94
95 users.users = optionalAttrs (cfg.user == "solr") {
96 solr = {
97 group = cfg.group;
98 home = cfg.stateDir;
99 createHome = true;
100 uid = config.ids.uids.solr;
101 };
102 };
103
104 users.groups = optionalAttrs (cfg.group == "solr") {
105 solr.gid = config.ids.gids.solr;
106 };
107
108 };
109
110}