152 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, pkgs, lib, ... }:
 | 
						|
 | 
						|
with lib;
 | 
						|
 | 
						|
let
 | 
						|
  cfg = config.services.plex;
 | 
						|
in
 | 
						|
{
 | 
						|
  options = {
 | 
						|
    services.plex = {
 | 
						|
      enable = mkEnableOption "Plex Media Server";
 | 
						|
 | 
						|
      dataDir = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        default = "/var/lib/plex";
 | 
						|
        description = ''
 | 
						|
          The directory where Plex stores its data files.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      openFirewall = mkOption {
 | 
						|
        type = types.bool;
 | 
						|
        default = false;
 | 
						|
        description = ''
 | 
						|
          Open ports in the firewall for the media server.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      user = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        default = "plex";
 | 
						|
        description = ''
 | 
						|
          User account under which Plex runs.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      group = mkOption {
 | 
						|
        type = types.str;
 | 
						|
        default = "plex";
 | 
						|
        description = ''
 | 
						|
          Group under which Plex runs.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      managePlugins = mkOption {
 | 
						|
        type = types.bool;
 | 
						|
        default = true;
 | 
						|
        description = ''
 | 
						|
          If set to true, this option will cause all of the symlinks in Plex's
 | 
						|
          plugin directory to be removed and symlinks for paths specified in
 | 
						|
          <option>extraPlugins</option> to be added.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      extraPlugins = mkOption {
 | 
						|
        type = types.listOf types.path;
 | 
						|
        default = [];
 | 
						|
        description = ''
 | 
						|
          A list of paths to extra plugin bundles to install in Plex's plugin
 | 
						|
          directory. Every time the systemd unit for Plex starts up, all of the
 | 
						|
          symlinks in Plex's plugin directory will be cleared and this module
 | 
						|
          will symlink all of the paths specified here to that directory. If
 | 
						|
          this behavior is undesired, set <option>managePlugins</option> to
 | 
						|
          false.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      package = mkOption {
 | 
						|
        type = types.package;
 | 
						|
        default = pkgs.plex;
 | 
						|
        defaultText = "pkgs.plex";
 | 
						|
        description = ''
 | 
						|
          The Plex package to use. Plex subscribers may wish to use their own
 | 
						|
          package here, pointing to subscriber-only server versions.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
    # Most of this is just copied from the RPM package's systemd service file.
 | 
						|
    systemd.services.plex = {
 | 
						|
      description = "Plex Media Server";
 | 
						|
      after = [ "network.target" ];
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
 | 
						|
      serviceConfig = {
 | 
						|
        Type = "simple";
 | 
						|
        User = cfg.user;
 | 
						|
        Group = cfg.group;
 | 
						|
 | 
						|
        # Run the pre-start script with full permissions (the "!" prefix) so it
 | 
						|
        # can create the data directory if necessary.
 | 
						|
        ExecStartPre = let
 | 
						|
          preStartScript = pkgs.writeScript "plex-run-prestart" ''
 | 
						|
            #!${pkgs.bash}/bin/bash
 | 
						|
 | 
						|
            # Create data directory if it doesn't exist
 | 
						|
            if ! test -d "$PLEX_DATADIR"; then
 | 
						|
              echo "Creating initial Plex data directory in: $PLEX_DATADIR"
 | 
						|
              install -d -m 0755 -o "${cfg.user}" -g "${cfg.group}" "$PLEX_DATADIR"
 | 
						|
            fi
 | 
						|
         '';
 | 
						|
        in
 | 
						|
          "!${preStartScript}";
 | 
						|
 | 
						|
        ExecStart = "${cfg.package}/bin/plexmediaserver";
 | 
						|
        KillSignal = "SIGQUIT";
 | 
						|
        Restart = "on-failure";
 | 
						|
      };
 | 
						|
 | 
						|
      environment = {
 | 
						|
        # Configuration for our FHS userenv script
 | 
						|
        PLEX_DATADIR=cfg.dataDir;
 | 
						|
        PLEX_PLUGINS=concatMapStringsSep ":" builtins.toString cfg.extraPlugins;
 | 
						|
 | 
						|
        # The following variables should be set by the FHS userenv script:
 | 
						|
        #   PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR
 | 
						|
        #   PLEX_MEDIA_SERVER_HOME
 | 
						|
 | 
						|
        # Allow access to GPU acceleration; the Plex LD_LIBRARY_PATH is added
 | 
						|
        # by the FHS userenv script.
 | 
						|
        LD_LIBRARY_PATH="/run/opengl-driver/lib";
 | 
						|
 | 
						|
        PLEX_MEDIA_SERVER_MAX_PLUGIN_PROCS="6";
 | 
						|
        PLEX_MEDIA_SERVER_TMPDIR="/tmp";
 | 
						|
        PLEX_MEDIA_SERVER_USE_SYSLOG="true";
 | 
						|
        LC_ALL="en_US.UTF-8";
 | 
						|
        LANG="en_US.UTF-8";
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    networking.firewall = mkIf cfg.openFirewall {
 | 
						|
      allowedTCPPorts = [ 32400 3005 8324 32469 ];
 | 
						|
      allowedUDPPorts = [ 1900 5353 32410 32412 32413 32414 ];
 | 
						|
    };
 | 
						|
 | 
						|
    users.users = mkIf (cfg.user == "plex") {
 | 
						|
      plex = {
 | 
						|
        group = cfg.group;
 | 
						|
        uid = config.ids.uids.plex;
 | 
						|
      };
 | 
						|
    };
 | 
						|
 | 
						|
    users.groups = mkIf (cfg.group == "plex") {
 | 
						|
      plex = {
 | 
						|
        gid = config.ids.gids.plex;
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |