at 15.09-beta 4.4 kB view raw
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}