1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7let
8
9 cfg = config.services.serviio;
10
11 serviioStart = pkgs.writeScript "serviio.sh" ''
12 #!${pkgs.bash}/bin/sh
13
14 SERVIIO_HOME=${pkgs.serviio}
15
16 # Setup the classpath
17 SERVIIO_CLASS_PATH="$SERVIIO_HOME/lib/*:$SERVIIO_HOME/config"
18
19 # Setup Serviio specific properties
20 JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dorg.restlet.engine.loggerFacadeClass=org.restlet.ext.slf4j.Slf4jLoggerFacade
21 -Dderby.system.home=${cfg.dataDir}/library -Dserviio.home=${cfg.dataDir} -Dffmpeg.location=${pkgs.ffmpeg}/bin/ffmpeg -Ddcraw.location=${pkgs.dcraw}/bin/dcraw"
22
23 # Execute the JVM in the foreground
24 exec ${pkgs.jre}/bin/java -Xmx512M -Xms20M -XX:+UseG1GC -XX:GCTimeRatio=1 -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 $JAVA_OPTS -classpath "$SERVIIO_CLASS_PATH" org.serviio.MediaServer "$@"
25 '';
26
27in
28{
29
30 ###### interface
31 options = {
32 services.serviio = {
33
34 enable = lib.mkOption {
35 type = lib.types.bool;
36 default = false;
37 description = ''
38 Whether to enable the Serviio Media Server.
39 '';
40 };
41
42 dataDir = lib.mkOption {
43 type = lib.types.path;
44 default = "/var/lib/serviio";
45 description = ''
46 The directory where serviio stores its state, data, etc.
47 '';
48 };
49
50 };
51 };
52
53 ###### implementation
54
55 config = lib.mkIf cfg.enable {
56 systemd.services.serviio = {
57 description = "Serviio Media Server";
58 after = [ "network.target" ];
59 wantedBy = [ "multi-user.target" ];
60 path = [ pkgs.serviio ];
61 serviceConfig = {
62 User = "serviio";
63 Group = "serviio";
64 ExecStart = "${serviioStart}";
65 ExecStop = "${serviioStart} -stop";
66 };
67 };
68
69 users.users.serviio = {
70 group = "serviio";
71 home = cfg.dataDir;
72 description = "Serviio Media Server User";
73 createHome = true;
74 isSystemUser = true;
75 };
76
77 users.groups.serviio = { };
78
79 networking.firewall = {
80 allowedTCPPorts = [
81 8895 # serve UPnP responses
82 23423 # console
83 23424 # mediabrowser
84 ];
85 allowedUDPPorts = [
86 1900 # UPnP service discovery
87 ];
88 };
89 };
90}