---
title: Nix Package Manager (Advanced)
description: Install Jellyseerr using Nix
sidebar_position: 3
---

import { JellyseerrVersion, NixpkgVersion } from '@site/src/components/JellyseerrVersion';
import Admonition from '@theme/Admonition';

# Nix Package Manager (Advanced)
:::info
This method is not recommended for most users. It is intended for advanced users who are using Nix as their package manager.
:::

export const VersionMismatchWarning = () => {
  const jellyseerrVersion = JellyseerrVersion();
  const nixpkgVersion = NixpkgVersion();

  const isUpToDate = jellyseerrVersion === nixpkgVersion;

  return (
    <>
      {!isUpToDate ? (
        <Admonition type="warning">
          The <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/servers/jellyseerr/default.nix#L14">upstream Jellyseerr Nix Package (v{nixpkgVersion})</a> is not <b>up-to-date</b>. If you want to use <b>Jellyseerr v{jellyseerrVersion}</b>, you will need to <a href="#overriding-the-package-derivation">override the package derivation</a>.
        </Admonition>
      ) : (
        <Admonition type="success">
          The <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/servers/jellyseerr/default.nix#L14">upstream Jellyseerr Nix Package (v{nixpkgVersion})</a> is <b>up-to-date</b> with <b>Jellyseerr v{jellyseerrVersion}</b>.
        </Admonition>
      )}
    </>
  );
};

<VersionMismatchWarning />

## Installation
To get up and running with jellyseerr using Nix, you can add the following to your `configuration.nix`:

```nix
{ config, pkgs, ... }:

{
  services.jellyseerr.enable = true;
}
```

If you want more advanced configuration options, you can use the following:

```nix
{ config, pkgs, ... }:

{
  services.jellyseerr = {
    enable = true;
    port = 5055;
    openFirewall = true;
  };
}
```

After adding the configuration to your `configuration.nix`, you can run the following command to install jellyseerr:

```bash
nixos-rebuild switch
```
After rebuild is complete jellyseerr should be running, verify that it is with the following command.
```bash
systemctl status jellyseerr
```

:::info
You can now access Jellyseerr by visiting `http://localhost:5055` in your web browser.
:::



import CodeBlock from '@theme/CodeBlock';

## Overriding the package derivation
export const VersionMatch = () => {
  const jellyseerrVersion = JellyseerrVersion();
  const nixpkgVersion = NixpkgVersion();

  const code = `{ config, pkgs, ... }:
{
  nixpkgs.config.packageOverrides = pkgs: {
    jellyseerr = pkgs.jellyseerr.overrideAttrs (oldAttrs: rec {
      version = "${jellyseerrVersion}";

      src = pkgs.fetchFromGitHub {
        rev = "v\${version}";
        sha256 = pkgs.lib.fakeSha256;
      };

      offlineCache = pkgs.fetchYarnDeps {
        sha256 = pkgs.lib.fakeSha256;
      };
    });
  };
}`;

  const module = `{ config, pkgs, lib, ... }:

with lib;
let
  cfg = config.services.jellyseerr;
in
{
  meta.maintainers = [ maintainers.camillemndn ];

  disabledModules = [ "services/misc/jellyseerr.nix" ];

  options.services.jellyseerr = {
    enable = mkEnableOption (mdDoc ''Jellyseerr, a requests manager for Jellyfin'');

    openFirewall = mkOption {
      type = types.bool;
      default = false;
      description = mdDoc ''Open port in the firewall for the Jellyseerr web interface.'';
    };

    port = mkOption {
      type = types.port;
      default = 5055;
      description = mdDoc ''The port which the Jellyseerr web UI should listen to.'';
    };

    package = mkOption {
        type = types.package;
        default = pkgs.jellyseerr;
        defaultText = literalExpression "pkgs.jellyseerr";
        description = lib.mdDoc ''
          Jellyseerr package to use.
        '';
      };
  };

  config = mkIf cfg.enable {
    systemd.services.jellyseerr = {
      description = "Jellyseerr, a requests manager for Jellyfin";
      after = [ "network.target" ];
      wantedBy = [ "multi-user.target" ];
      environment.PORT = toString cfg.port;
      serviceConfig = {
        Type = "exec";
        StateDirectory = "jellyseerr";
        WorkingDirectory = "\${cfg.package}/libexec/jellyseerr/deps/jellyseerr";
        DynamicUser = true;
        ExecStart = "\${cfg.package}/bin/jellyseerr";
        BindPaths = [ "/var/lib/jellyseerr/:\${cfg.package}/libexec/jellyseerr/deps/jellyseerr/config/" ];
        Restart = "on-failure";
        ProtectHome = true;
        ProtectSystem = "strict";
        PrivateTmp = true;
        PrivateDevices = true;
        ProtectHostname = true;
        ProtectClock = true;
        ProtectKernelTunables = true;
        ProtectKernelModules = true;
        ProtectKernelLogs = true;
        ProtectControlGroups = true;
        NoNewPrivileges = true;
        RestrictRealtime = true;
        RestrictSUIDSGID = true;
        RemoveIPC = true;
        PrivateMounts = true;
      };
    };

    networking.firewall = mkIf cfg.openFirewall {
      allowedTCPPorts = [ cfg.port ];
    };
  };
}`;

  const configuration = `{ config, pkgs, ... }:
{
    imports = [ ./jellyseerr-module.nix ]

    services.jellyseerr = {
        enable = true;
        port = 5055;
        openFirewall = true;
        package = (pkgs.callPackage (import ../../../pkgs/jellyseerr) { });
    };
}`;

  const isUpToDate = jellyseerrVersion === nixpkgVersion;

  return (
    <>
      {isUpToDate ? (
        <>
          <p>The latest version of Jellyseerr <strong>({jellyseerrVersion})</strong> and the Jellyseerr nixpkg package version <strong>({nixpkgVersion})</strong> is <strong>up-to-date</strong>.</p>
          <p>There is no need to override the package derivation.</p>
        </>
      ) : (
        <>
          <p>The latest version of Jellyseerr <strong>({jellyseerrVersion})</strong> and the Jellyseerr nixpkg version <strong>(v{nixpkgVersion})</strong> is <strong>out-of-date</strong>.
          If you want to use <b>Jellyseerr v{jellyseerrVersion}</b>, you will need to override the package derivation.</p>
          <p>In order to override the package derivation:</p>
          <ol>
            <li style={{ marginBottom: '1rem' }}>Grab the <a href="https://raw.githubusercontent.com/NixOS/nixpkgs/nixos-unstable/pkgs/servers/jellyseerr/default.nix">latest nixpkg derivation for Jellyseerr</a></li>
            <li style={{ marginBottom: '1rem' }}>Grab the latest <a href="https://raw.githubusercontent.com/Fallenbagel/jellyseerr/main/package.json">package.json</a> for Jellyseerr</li>
            <li style={{ marginBottom: '1rem' }}>Add it to the same directory as the nixpkg derivation</li>
            <li style={{ marginBottom: '1rem' }}>Update the `src` and `offlineCache` attributes in the nixpkg derivation:</li>
            <CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{code}</CodeBlock>
            <Admonition type="tip" style={{ marginBottom: '1rem' }}>You can replace the <b>sha256</b> with the actual hash that <b>nixos-rebuild</b> outputs when you run the command.</Admonition>
            <li style={{ marginBottom: '1rem' }}>Grab this module and import it in your `configuration.nix`</li>
            <CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{module}</CodeBlock>
            <Admonition type="tip" style={{ marginBottom: '1rem' }}>We are using a custom module because the upstream module does not have a package option.</Admonition>
            <li style={{ marginBottom: '1rem' }}>Call the new package in your `configuration.nix`</li>
            <CodeBlock className="language-nix" style={{ marginBottom: '1rem' }}>{configuration}</CodeBlock>
          </ol>
        </>
      )}
    </>
  );

};

<VersionMatch />

