From 4d186c69bc989466dede4f676cef1bd122fbc2ba Mon Sep 17 00:00:00 2001 From: David Crompton Date: Wed, 7 Feb 2024 17:20:01 -0500 Subject: [PATCH] JupyterHub: Added MATLAB Kernel & Web App --- machines/kcnhub/packages/matlab.nix | 14 ++- machines/kcnhub/servers/jupyterhub.nix | 149 ++++++++++++++++++++++++- 2 files changed, 156 insertions(+), 7 deletions(-) diff --git a/machines/kcnhub/packages/matlab.nix b/machines/kcnhub/packages/matlab.nix index c0bc775..7630216 100644 --- a/machines/kcnhub/packages/matlab.nix +++ b/machines/kcnhub/packages/matlab.nix @@ -134,11 +134,17 @@ in { environment.sessionVariables = { inherit MATLAB_INSTALL_DIR; }; - environment.systemPackages = (with nix-matlab.packages.x86_64-linux; [ + nixpkgs.overlays = [ + (final: prev: { + inherit matlab-update-script; + matlab = (matlab-run "matlab"); + matlab-mex = (matlab-run "mex"); + }) + ]; + environment.systemPackages =(with pkgs; [ matlab-update-script - (matlab-run "matlab") - (matlab-run "mex") - ]) ++ (with pkgs; [ + matlab + matlab-mex octaveFull ]); } diff --git a/machines/kcnhub/servers/jupyterhub.nix b/machines/kcnhub/servers/jupyterhub.nix index e4de74b..19b23b8 100644 --- a/machines/kcnhub/servers/jupyterhub.nix +++ b/machines/kcnhub/servers/jupyterhub.nix @@ -1,20 +1,161 @@ -{ config, pkgs, lib, ... }: { +{ config, pkgs, lib, ... }: let + aiomcache = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "aio-memcache"; + version = "0.8.1"; + + src = pkgs.fetchFromGitHub { + owner = "aio-libs"; + repo = "aiomcache"; + rev = "v${version}"; + hash = "sha256-oRMN1seEjFSsq4wjkIXHM7Osq8y/5WFExGCEr6eM9vc="; + }; + + propagatedBuildInputs = with pkgs.python3.pkgs; [ + python-memcached + ]; + + # Networking required + doCheck = false; + }; + aiohttp-session = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "aiohttp-session"; + version = "2.12.0"; + + src = pkgs.fetchFromGitHub { + owner = "aio-libs"; + repo = "aiohttp-session"; + rev = "v${version}"; + hash = "sha256-7MNah4OIQnoxLoZkLOdeu5uCwSyPMhc6Wsht8dFconc="; + }; + + propagatedBuildInputs = with pkgs.python3.pkgs; [ + aiohttp + aiomcache + cryptography + multidict + pynacl + redis + yarl + ]; + + # Checks require networking + doCheck = false; + }; + matlab-proxy = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "matlab_proxy"; + version = "0.12.1"; + format = "wheel"; + src = pkgs.python3.pkgs.fetchPypi { + inherit pname version format; + dist = "py3"; + python = "py3"; + hash = "sha256-TDZUJEXJYF5Vh2BG5o13H3wdh/WdVdoESXqL89ckc6I="; + }; + + propagatedBuildInputs = with pkgs.python3.pkgs; [ + aiohttp + aiohttp-session + psutil + + # For Xvfb, for plots and graphics + pkgs.xorg.xorgserver + ]; + }; + simpervisor = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "simpervisor"; + version = "1.0.0"; + format = "pyproject"; + + src = pkgs.fetchFromGitHub { + owner = "jupyterhub"; + repo = "simpervisor"; + rev = "v${version}"; + hash = "sha256-73vkiQtOT0M9Vww1nYZ76JR2koWt/NPIav46k1fHOzc="; + }; + + nativeBuildInputs = with pkgs.python3.pkgs; [ + hatchling + ]; + }; + jupyter-server-proxy = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "jupyter_server_proxy"; + version = "4.1.0"; + format = "pyproject"; + + src = pkgs.python3.pkgs.fetchPypi { + inherit pname version; + hash = "sha256-LPrDtCMv5xROjmApa0+GFwi08TspJgos8ol2v45hf3A="; + }; + + nativeBuildInputs = with pkgs.python3.pkgs; [ + hatchling + hatch-jupyter-builder + hatch-nodejs-version + jupyterlab + ]; + + propagatedBuildInputs = with pkgs.python3.pkgs; [ + notebook + simpervisor + aiohttp + ]; + + # tests require network + doCheck = false; + }; + + jupyter-matlab-proxy = pkgs.python3.pkgs.buildPythonPackage rec { + pname = "jupyter_matlab_proxy"; + version = "0.11.0"; + format = "wheel"; + + src = pkgs.python3.pkgs.fetchPypi { + inherit pname version format; + python = "py3"; + dist = "py3"; + hash = "sha256-KzQgs1zXGPjONCnLvCNQkQBkkkn9J29YFi8BHbh+D1I="; + }; + + propagatedBuildInputs = with pkgs.python3.pkgs; [ + jupyter-server-proxy + simpervisor + matlab-proxy + psutil + requests + ipykernel + ]; + }; + in { services.jupyterhub = { enable = true; port = 6501; # https://github.com/jupyterhub/systemdspawner # Configuration options defined ^ + # mem_limit must be higher to allow for MATLAB extraConfig = '' - c.SystemdSpawner.mem_limit = '2G' - c.SystemdSpawner.cpu_limit = 1.0 + c.SystemdSpawner.mem_limit = '8G' + c.SystemdSpawner.cpu_limit = 2.0 c.SystemdSpawner.isolate_devices = False c.SystemdSpawner.extra_paths = [ '${pkgs.buildEnv { name = "jupyterhub-system-spawner-env"; paths = with pkgs; [ gcc + # For MATLAB Kernel + matlab + # For matlab-proxy-app + (pkgs.python3.withPackages (p: with p; [ + # For pkg_resources + setuptools + matlab-proxy + jupyter-matlab-proxy + ])) ]; }}/bin'] + c.SystemdSpawner.environment["MATLAB_INSTALL_DIR"] = "${config.environment.sessionVariables.MATLAB_INSTALL_DIR}" + c.SystemdSpawner.environment["LM_LICENSE_FILE"] = "${config.environment.sessionVariables.LM_LICENSE_FILE}" + c.SystemdSpawner.environment["MLM_LICENSE_FILE"] = "${config.environment.sessionVariables.MLM_LICENSE_FILE}" + # c.SystemdSpawner.environment["MWI_JUPYTER_LOG_LEVEL"] = "DEBUG" ''; # Extra Paths used to add gcc et al for packages like Brian2 # https://github.com/jupyterhub/systemdspawner#extra_paths @@ -28,6 +169,8 @@ jupyter-console jupyterlab-lsp python-lsp-server + # MATLAB Proxy Needs to be here in order to modify and add the "launch matlab" etc. + jupyter-matlab-proxy # <-- This in effect adds the kernel ]); kernels = {