python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / video / unifi-video.nix
blobfcc3cb02a1b0eb73b69084faaea7f23cafff5b8d
1 { config, lib, options, pkgs, utils, ... }:
2 with lib;
3 let
4   cfg = config.services.unifi-video;
5   opt = options.services.unifi-video;
6   mainClass = "com.ubnt.airvision.Main";
7   cmd = ''
8     ${pkgs.jsvc}/bin/jsvc \
9     -cwd ${stateDir} \
10     -debug \
11     -verbose:class \
12     -nodetach \
13     -user unifi-video \
14     -home ${cfg.jrePackage}/lib/openjdk \
15     -cp ${pkgs.commonsDaemon}/share/java/commons-daemon-1.2.4.jar:${stateDir}/lib/airvision.jar \
16     -pidfile ${cfg.pidFile} \
17     -procname unifi-video \
18     -Djava.security.egd=file:/dev/./urandom \
19     -Xmx${toString cfg.maximumJavaHeapSize}M \
20     -Xss512K \
21     -XX:+UseG1GC \
22     -XX:+UseStringDeduplication \
23     -XX:MaxMetaspaceSize=768M \
24     -Djava.library.path=${stateDir}/lib \
25     -Djava.awt.headless=true \
26     -Djavax.net.ssl.trustStore=${stateDir}/etc/ufv-truststore \
27     -Dfile.encoding=UTF-8 \
28     -Dav.tempdir=/var/cache/unifi-video
29   '';
31   mongoConf = pkgs.writeTextFile {
32     name = "mongo.conf";
33     executable = false;
34     text = ''
35       # for documentation of all options, see http://docs.mongodb.org/manual/reference/configuration-options/
37       storage:
38          dbPath: ${cfg.dataDir}/db
39          journal:
40             enabled: true
41          syncPeriodSecs: 60
43       systemLog:
44          destination: file
45          logAppend: true
46          path: ${stateDir}/logs/mongod.log
48       net:
49          port: 7441
50          bindIp: 127.0.0.1
51          http:
52             enabled: false
54       operationProfiling:
55          slowOpThresholdMs: 500
56          mode: off
57     '';
58   };
61   mongoWtConf = pkgs.writeTextFile {
62     name = "mongowt.conf";
63     executable = false;
64     text = ''
65       # for documentation of all options, see:
66       #   http://docs.mongodb.org/manual/reference/configuration-options/
68       storage:
69          dbPath: ${cfg.dataDir}/db-wt
70          journal:
71             enabled: true
72          wiredTiger:
73             engineConfig:
74                cacheSizeGB: 1
76       systemLog:
77          destination: file
78          logAppend: true
79          path: logs/mongod.log
81       net:
82          port: 7441
83          bindIp: 127.0.0.1
85       operationProfiling:
86          slowOpThresholdMs: 500
87          mode: off
88     '';
89   };
91   stateDir = "/var/lib/unifi-video";
96   options.services.unifi-video = {
98     enable = mkOption {
99       type = types.bool;
100       default = false;
101       description = lib.mdDoc ''
102         Whether or not to enable the unifi-video service.
103       '';
104     };
106     jrePackage = mkOption {
107       type = types.package;
108       default = pkgs.jre8;
109       defaultText = literalExpression "pkgs.jre8";
110       description = lib.mdDoc ''
111         The JRE package to use. Check the release notes to ensure it is supported.
112       '';
113     };
115     unifiVideoPackage = mkOption {
116       type = types.package;
117       default = pkgs.unifi-video;
118       defaultText = literalExpression "pkgs.unifi-video";
119       description = lib.mdDoc ''
120         The unifi-video package to use.
121       '';
122     };
124     mongodbPackage = mkOption {
125       type = types.package;
126       default = pkgs.mongodb-4_0;
127       defaultText = literalExpression "pkgs.mongodb";
128       description = lib.mdDoc ''
129         The mongodb package to use.
130       '';
131     };
133     logDir = mkOption {
134       type = types.str;
135       default = "${stateDir}/logs";
136       description = lib.mdDoc ''
137         Where to store the logs.
138       '';
139     };
141     dataDir = mkOption {
142       type = types.str;
143       default = "${stateDir}/data";
144       description = lib.mdDoc ''
145         Where to store the database and other data.
146       '';
147     };
149     openFirewall = mkOption {
150       type = types.bool;
151       default = true;
152       description = lib.mdDoc ''
153         Whether or not to open the required ports on the firewall.
154       '';
155     };
157     maximumJavaHeapSize = mkOption {
158       type = types.nullOr types.int;
159       default = 1024;
160       example = 4096;
161       description = lib.mdDoc ''
162         Set the maximimum heap size for the JVM in MB.
163       '';
164     };
166     pidFile = mkOption {
167       type = types.path;
168       default = "${cfg.dataDir}/unifi-video.pid";
169       defaultText = literalExpression ''"''${config.${opt.dataDir}}/unifi-video.pid"'';
170       description = lib.mdDoc "Location of unifi-video pid file.";
171     };
173   };
175   config = mkIf cfg.enable {
177     warnings = optional
178       (options.services.unifi-video.openFirewall.highestPrio >= (mkOptionDefault null).priority)
179       "The current services.unifi-video.openFirewall = true default is deprecated and will change to false in 22.11. Set it explicitly to silence this warning.";
181     users.users.unifi-video = {
182       description = "UniFi Video controller daemon user";
183       home = stateDir;
184       group = "unifi-video";
185       isSystemUser = true;
186     };
187     users.groups.unifi-video = {};
189     networking.firewall = mkIf cfg.openFirewall {
190       # https://help.ui.com/hc/en-us/articles/217875218-UniFi-Video-Ports-Used
191       allowedTCPPorts = [
192         7080 # HTTP portal
193         7443 # HTTPS portal
194         7445 # Video over HTTP (mobile app)
195         7446 # Video over HTTPS (mobile app)
196         7447 # RTSP via the controller
197         7442 # Camera management from cameras to NVR over WAN
198       ];
199       allowedUDPPorts = [
200         6666 # Inbound camera streams sent over WAN
201       ];
202     };
204     systemd.tmpfiles.rules = [
205       "d '${stateDir}' 0700 unifi-video unifi-video - -"
206       "d '/var/cache/unifi-video' 0700 unifi-video unifi-video - -"
208       "d '${stateDir}/logs' 0700 unifi-video unifi-video - -"
209       "C '${stateDir}/etc' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/etc"
210       "C '${stateDir}/webapps' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/webapps"
211       "C '${stateDir}/email' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/email"
212       "C '${stateDir}/fw' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/fw"
213       "C '${stateDir}/lib' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/lib"
215       "d '${stateDir}/data' 0700 unifi-video unifi-video - -"
216       "d '${stateDir}/data/db' 0700 unifi-video unifi-video - -"
217       "C '${stateDir}/data/system.properties' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/etc/system.properties"
219       "d '${stateDir}/bin' 0700 unifi-video unifi-video - -"
220       "f '${stateDir}/bin/evostreamms' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/evostreamms"
221       "f '${stateDir}/bin/libavcodec.so.54' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/libavcodec.so.54"
222       "f '${stateDir}/bin/libavformat.so.54' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/libavformat.so.54"
223       "f '${stateDir}/bin/libavutil.so.52' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/libavutil.so.52"
224       "f '${stateDir}/bin/ubnt.avtool' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/ubnt.avtool"
225       "f '${stateDir}/bin/ubnt.updater' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/bin/ubnt.updater"
226       "C '${stateDir}/bin/mongo' 0700 unifi-video unifi-video - ${cfg.mongodbPackage}/bin/mongo"
227       "C '${stateDir}/bin/mongod' 0700 unifi-video unifi-video - ${cfg.mongodbPackage}/bin/mongod"
228       "C '${stateDir}/bin/mongoperf' 0700 unifi-video unifi-video - ${cfg.mongodbPackage}/bin/mongoperf"
229       "C '${stateDir}/bin/mongos' 0700 unifi-video unifi-video - ${cfg.mongodbPackage}/bin/mongos"
231       "d '${stateDir}/conf' 0700 unifi-video unifi-video - -"
232       "C '${stateDir}/conf/evostream' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/evostream"
233       "Z '${stateDir}/conf/evostream' 0700 unifi-video unifi-video - -"
234       "L+ '${stateDir}/conf/mongodv3.0+.conf' 0700 unifi-video unifi-video - ${mongoConf}"
235       "L+ '${stateDir}/conf/mongodv3.6+.conf' 0700 unifi-video unifi-video - ${mongoConf}"
236       "L+ '${stateDir}/conf/mongod-wt.conf' 0700 unifi-video unifi-video - ${mongoWtConf}"
237       "L+ '${stateDir}/conf/catalina.policy' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/catalina.policy"
238       "L+ '${stateDir}/conf/catalina.properties' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/catalina.properties"
239       "L+ '${stateDir}/conf/context.xml' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/context.xml"
240       "L+ '${stateDir}/conf/logging.properties' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/logging.properties"
241       "L+ '${stateDir}/conf/server.xml' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/server.xml"
242       "L+ '${stateDir}/conf/tomcat-users.xml' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/tomcat-users.xml"
243       "L+ '${stateDir}/conf/web.xml' 0700 unifi-video unifi-video - ${pkgs.unifi-video}/lib/unifi-video/conf/web.xml"
244     ];
246     systemd.services.unifi-video = {
247       description = "UniFi Video NVR daemon";
248       wantedBy = [ "multi-user.target" ];
249       after = [ "network.target" ] ;
250       unitConfig.RequiresMountsFor = stateDir;
251       # Make sure package upgrades trigger a service restart
252       restartTriggers = [ cfg.unifiVideoPackage cfg.mongodbPackage ];
253       path = with pkgs; [ gawk coreutils busybox which jre8 lsb-release libcap util-linux ];
254       serviceConfig = {
255         Type = "simple";
256         ExecStart = "${(removeSuffix "\n" cmd)} ${mainClass} start";
257         ExecStop = "${(removeSuffix "\n" cmd)} stop ${mainClass} stop";
258         Restart = "on-failure";
259         UMask = "0077";
260         User = "unifi-video";
261         WorkingDirectory = "${stateDir}";
262       };
263     };
264   };
266   imports = [
267     (mkRenamedOptionModule [ "services" "unifi-video" "openPorts" ] [ "services" "unifi-video" "openFirewall" ])
268   ];
270   meta.maintainers = with lib.maintainers; [ rsynnest ];