Skip to content

Commit

Permalink
nixos/jupyter: Updates jupyter notebook config to work correctly with…
Browse files Browse the repository at this point in the history
… current versions

Signed-off-by: Maximilian Ehlers <[email protected]>
  • Loading branch information
b-m-f committed Jan 2, 2025
1 parent 8c30dd4 commit 4382bd6
Showing 1 changed file with 45 additions and 20 deletions.
65 changes: 45 additions & 20 deletions nixos/modules/services/development/jupyter/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,38 @@
config,
lib,
pkgs,
options,
...
}:
let

cfg = config.services.jupyter;

package = cfg.package;
package = pkgs.python3.withPackages (
ps:
[
cfg.package
]
++ cfg.extraPackages
);

kernels = (
pkgs.jupyter-kernel.create {
definitions = if cfg.kernels != null then cfg.kernels else pkgs.jupyter-kernel.default;
}
);

notebookConfig = pkgs.writeText "jupyter_config.py" ''
${cfg.notebookConfig}
notebookConfig = pkgs.writeText "jupyter_server_config.py" ''
c.ServerApp.password = "${cfg.password}"
c.NotebookApp.password = ${cfg.password}
'';

in
{
meta.maintainers = with lib.maintainers; [ aborsu ];
meta.maintainers = with lib.maintainers; [
aborsu
b-m-f
];

options.services.jupyter = {
enable = lib.mkEnableOption "Jupyter development server";
Expand All @@ -37,14 +46,36 @@ in
'';
};

# NOTE: We don't use top-level jupyter because we don't
# want to pass in JUPYTER_PATH but use .environment instead,
# saving a rebuild.
package = lib.mkPackageOption pkgs [ "python3" "pkgs" "notebook" ] { };
package = lib.mkPackageOption pkgs [
"python3"
"pkgs"
"jupyter"
] { };

extraPackages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
example = lib.literalExpression ''
[
pkgs.python3.pkgs.nbconvert
pkgs.python3.pkgs.playwright
]
'';
description = ''Extra packages to be available in the jupyter runtime enviroment'';
};
extraEnvironmentVariables = lib.mkOption {
description = ''Extra enviroment variables to be set in the runtime context of jupyter notebook'';
default = { };
example = lib.literalExpression ''
PLAYWRIGHT_BROWSERS_PATH = "$${pkgs.playwright-driver.browsers}";
PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS = "true";
'';
inherit (options.environment.variables) type apply;
};

command = lib.mkOption {
type = lib.types.str;
default = "jupyter-notebook";
default = "jupyter notebook";
example = "jupyter-lab";
description = ''
Which command the service runs. Note that not all jupyter packages
Expand Down Expand Up @@ -93,14 +124,7 @@ in
type = lib.types.str;
description = ''
Password to use with notebook.
Can be generated using:
In [1]: from notebook.auth import passwd
In [2]: passwd('test')
Out[2]: 'sha1:1b961dc713fb:88483270a63e57d18d43cf337e629539de1436ba'
NOTE: you need to keep the single quote inside the nix string.
Or you can use a python oneliner:
"open('/path/secret_file', 'r', encoding='utf8').read().strip()"
It will be interpreted at the end of the notebookConfig.
Can be generated following: https://jupyter-server.readthedocs.io/en/stable/operators/public-server.html#preparing-a-hashed-password
'';
example = "'sha1:1b961dc713fb:88483270a63e57d18d43cf337e629539de1436ba'";
};
Expand Down Expand Up @@ -175,7 +199,7 @@ in

environment = {
JUPYTER_PATH = toString kernels;
};
} // cfg.extraEnvironmentVariables;

serviceConfig = {
Restart = "always";
Expand All @@ -185,7 +209,8 @@ in
--ip=${cfg.ip} \
--port=${toString cfg.port} --port-retries 0 \
--notebook-dir=${cfg.notebookDir} \
--NotebookApp.config_file=${notebookConfig}
--JupyterApp.config_file=${notebookConfig}
'';
User = cfg.user;
Group = cfg.group;
Expand Down

0 comments on commit 4382bd6

Please sign in to comment.