1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.neo4j;
7
8 serverConfig = pkgs.writeText "neo4j-server.properties" ''
9 org.neo4j.server.database.location=${cfg.dataDir}/data/graph.db
10 org.neo4j.server.webserver.address=${cfg.host}
11 org.neo4j.server.webserver.port=${toString cfg.port}
12 ${optionalString cfg.enableHttps ''
13 org.neo4j.server.webserver.https.enabled=true
14 org.neo4j.server.webserver.https.port=${toString cfg.httpsPort}
15 org.neo4j.server.webserver.https.cert.location=${cfg.cert}
16 org.neo4j.server.webserver.https.key.location=${cfg.key}
17 org.neo4j.server.webserver.https.keystore.location=${cfg.dataDir}/data/keystore
18 ''}
19 org.neo4j.server.webadmin.rrdb.location=${cfg.dataDir}/data/rrd
20 org.neo4j.server.webadmin.data.uri=/db/data/
21 org.neo4j.server.webadmin.management.uri=/db/manage/
22 org.neo4j.server.db.tuning.properties=${cfg.package}/share/neo4j/conf/neo4j.properties
23 org.neo4j.server.manage.console_engines=shell
24 ${cfg.extraServerConfig}
25 '';
26
27 loggingConfig = pkgs.writeText "logging.properties" cfg.loggingConfig;
28
29 wrapperConfig = pkgs.writeText "neo4j-wrapper.conf" ''
30 wrapper.java.additional=-Dorg.neo4j.server.properties=${serverConfig}
31 wrapper.java.additional=-Djava.util.logging.config.file=${loggingConfig}
32 wrapper.java.additional=-XX:+UseConcMarkSweepGC
33 wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
34 wrapper.pidfile=${cfg.dataDir}/neo4j-server.pid
35 wrapper.name=neo4j
36 '';
37
38in {
39
40 ###### interface
41
42 options.services.neo4j = {
43 enable = mkOption {
44 description = "Whether to enable neo4j.";
45 default = false;
46 type = types.bool;
47 };
48
49 package = mkOption {
50 description = "Neo4j package to use.";
51 default = pkgs.neo4j;
52 type = types.package;
53 };
54
55 host = mkOption {
56 description = "Neo4j listen address.";
57 default = "127.0.0.1";
58 type = types.str;
59 };
60
61 port = mkOption {
62 description = "Neo4j port to listen for HTTP traffic.";
63 default = 7474;
64 type = types.int;
65 };
66
67 enableHttps = mkOption {
68 description = "Enable https for Neo4j.";
69 default = false;
70 type = types.bool;
71 };
72
73 httpsPort = mkOption {
74 description = "Neo4j port to listen for HTTPS traffic.";
75 default = 7473;
76 type = types.int;
77 };
78
79 cert = mkOption {
80 description = "Neo4j https certificate.";
81 default = "${cfg.dataDir}/conf/ssl/neo4j.cert";
82 type = types.path;
83 };
84
85 key = mkOption {
86 description = "Neo4j https certificate key.";
87 default = "${cfg.dataDir}/conf/ssl/neo4j.key";
88 type = types.path;
89 };
90
91 dataDir = mkOption {
92 description = "Neo4j data directory.";
93 default = "/var/lib/neo4j";
94 type = types.path;
95 };
96
97 loggingConfig = mkOption {
98 description = "Neo4j logging configuration.";
99 default = ''
100 handlers=java.util.logging.ConsoleHandler
101 .level=INFO
102 org.neo4j.server.level=INFO
103
104 java.util.logging.ConsoleHandler.level=INFO
105 java.util.logging.ConsoleHandler.formatter=org.neo4j.server.logging.SimpleConsoleFormatter
106 java.util.logging.ConsoleHandler.filter=org.neo4j.server.logging.NeoLogFilter
107 '';
108 type = types.lines;
109 };
110
111 extraServerConfig = mkOption {
112 description = "Extra configuration for neo4j server.";
113 default = "";
114 type = types.lines;
115 };
116
117 };
118
119 ###### implementation
120
121 config = mkIf cfg.enable {
122 systemd.services.neo4j = {
123 description = "Neo4j Daemon";
124 wantedBy = [ "multi-user.target" ];
125 after = [ "network-interfaces.target" ];
126 environment = { NEO4J_INSTANCE = cfg.dataDir; };
127 serviceConfig = {
128 ExecStart = "${cfg.package}/bin/neo4j console";
129 User = "neo4j";
130 PermissionsStartOnly = true;
131 };
132 preStart = ''
133 mkdir -m 0700 -p ${cfg.dataDir}/{data/graph.db,conf}
134 ln -fs ${wrapperConfig} ${cfg.dataDir}/conf/neo4j-wrapper.conf
135 if [ "$(id -u)" = 0 ]; then chown -R neo4j ${cfg.dataDir}; fi
136 '';
137 };
138
139 environment.systemPackages = [ pkgs.neo4j ];
140
141 users.extraUsers = singleton {
142 name = "neo4j";
143 uid = config.ids.uids.neo4j;
144 description = "Neo4j daemon user";
145 home = cfg.dataDir;
146 };
147 };
148
149}