From patchwork Wed Sep 22 01:26:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jesse Gibbons X-Patchwork-Id: 33235 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id DD90C27BBE3; Wed, 22 Sep 2021 02:27:12 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,T_DKIM_INVALID,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 17E5527BBE1 for ; Wed, 22 Sep 2021 02:27:12 +0100 (BST) Received: from localhost ([::1]:44822 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mSr2U-0006PF-Vw for patchwork@mira.cbaines.net; Tue, 21 Sep 2021 21:27:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39116) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mSr2M-0006P6-43 for guix-patches@gnu.org; Tue, 21 Sep 2021 21:27:02 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:36796) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mSr2L-0005go-Se for guix-patches@gnu.org; Tue, 21 Sep 2021 21:27:01 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mSr2L-0006FA-Lu for guix-patches@gnu.org; Tue, 21 Sep 2021 21:27:01 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#50708] [PATCH] gnu: web: Add jupyter-service Resent-From: Jesse Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Wed, 22 Sep 2021 01:27:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 50708 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 50708@debbugs.gnu.org Received: via spool by 50708-submit@debbugs.gnu.org id=B50708.163227398323947 (code B ref 50708); Wed, 22 Sep 2021 01:27:01 +0000 Received: (at 50708) by debbugs.gnu.org; 22 Sep 2021 01:26:23 +0000 Received: from localhost ([127.0.0.1]:48342 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mSr1i-0006EB-Hs for submit@debbugs.gnu.org; Tue, 21 Sep 2021 21:26:23 -0400 Received: from mail-pg1-f181.google.com ([209.85.215.181]:40742) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mSr1g-0006Du-5C for 50708@debbugs.gnu.org; Tue, 21 Sep 2021 21:26:21 -0400 Received: by mail-pg1-f181.google.com with SMTP id h3so934002pgb.7 for <50708@debbugs.gnu.org>; Tue, 21 Sep 2021 18:26:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=rQ1PPxS5OUC/HpH6UFCLhJSMUtYbyS5RgTY1MRsj864=; b=R3sCI4Ju6fAej3rS1lKTC+IG7M+BoCVXXMvgd60sqD8YJWfSxYUP1X8x3+MzMp0DZ6 rfJ8sdz+E1ZIvluPK4inNRHndTCAQPLCb968dyshTLCRa9A3FCqKBV3XMoqBSxCNXJS1 NOVZEUPWyPp69rmRHUULJpabRlWnhMJtltB52v1NzWrkrCg+AVp+TbqMSWoPeMxqmR+E do6OtKOEzRl9v8WxMN+GiTO+wUOex98CjzYh7uNE5YPEUceHqFFqjSXWpOzjLBdRB8wS 0qGv0Do1Ip9GYxwv9GhbY2beXjh1QuThXjsRoFhrXLhjb8fvZSS2H/XtEA9cYreoHYsN 6J8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=rQ1PPxS5OUC/HpH6UFCLhJSMUtYbyS5RgTY1MRsj864=; b=wseXOdWkD/DloEgKbg5vSP+KCJBQdeCH7cpKqDqzpaOOuqnnsh0BVxBAPagM2zmvtQ Q0qmFYGEQIsIxNSBFEeEzBYxnP8RdZ2pSBbqf4FrQ1+qnUoQoDF5NtvAxv/h5v4sBZ31 ZxPEmgitfogp5kgjVALsTltokTFyjtm6f48e1mrHC+By4xvY/G344mKHpia/UgkWzDB+ rMYan05xb63XAPfLU18lZUG9MEOjrQzisnAztxVY3IpyirVOkLWmnz5ox0RvilAJSRnq 69g0pUBxQhQvcMknxhZ0l3vz7JMW6ToF2WibCkAPnC9tOM2pW5lJblL8iPKHalYTZW/h Nzvw== X-Gm-Message-State: AOAM533GEF8pFiasAnfTolpx0/IUuQ/g+YQ6/EZCRC+Z17DFq4C3TXol 1M9EWSKrCdBNwL6gYbYoshvOJsp0nNjpTg== X-Google-Smtp-Source: ABdhPJwiZ+xWP5DZPvSKbb3HsUMMgg+Qfv4v+36y4gKMTFwG0A+vPbd4v8UO16qGnGdmKIn8oHoCFQ== X-Received: by 2002:a63:9315:: with SMTP id b21mr1497781pge.306.1632273973923; Tue, 21 Sep 2021 18:26:13 -0700 (PDT) Received: from [192.168.1.220] ([38.141.58.134]) by smtp.gmail.com with ESMTPSA id e11sm309605pfv.201.2021.09.21.18.26.12 for <50708@debbugs.gnu.org> (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 21 Sep 2021 18:26:13 -0700 (PDT) References: <565a1b21-aefa-4129-a024-52517fdff9bd@gmail.com> From: Jesse Message-ID: <74f78a5c-3f79-7485-0cf2-ae1fbb1969dd@gmail.com> Date: Tue, 21 Sep 2021 19:26:11 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Icedove/78.13.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: "Guix-patches" X-getmail-retrieved-from-mailbox: Patches Attached is an updated patch. From d264da0811480a8d2acd5e73f58d320e15bfa9f3 Mon Sep 17 00:00:00 2001 From: Jesse Date: Mon, 20 Sep 2021 16:01:22 -0600 Subject: [PATCH] gnu: web: Add jupyter-service * gnu/services/web.scm (gitile-service-type): New variable. * doc/guix.texi (Version Control Services): Document it. --- doc/guix.texi | 52 +++++++++++++++++++ gnu/services/web.scm | 120 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 6436e83a7c..0f8aaca413 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -26197,6 +26197,58 @@ The file which should store the logging output of Agate. @end table @end deftp +@cindex jupyter +The Jupyter Notebook is a web application that allows you to create +and share documents that contain live code, equations, visualizations +and explanatory text. Uses include: data cleaning and transformation, +numerical simulation, statistical modeling, machine learning and much +more. + +@deffn (Scheme Variable) jupyter-service-type +This is the type of the agate service, whose value should be an +@code{jupyter-service-type} object, as in this example: + +@lisp +(service jupyter-service-type + (jupyter-configuration + (log-file "/var/log/jupyter.log") + (server-config + (kernels + (list jupyter-guile-kernel))))) + +@end lisp + +The example above tells the the Jupyter service to provide the +@code{jupyter-guile-kernel} as an optional kernel. +@end deffn + +@deftp {Data Type} jupyter-configuration +Data type representing the configuration of Agate. + +@table @asis +@item @code{jupyter-package} (default: @code{jupyter}) +The jupyter package to use. + + +@item @code{kernels} (default: @code{'()} +A list of kernel packages to use with the jupyter service. + +@item @code{root-dir} (default: @file{"/var/lib/jupyter/notebooks"}) +The directory where the jupyter server looks for jupyter notebooks. + +@item @code{log-file} (default: @code{#f}) +The location of the log file. If #f is given, no log is produced. + +@item @code{shell} (default: @code{(file-append bash "/bin/bash")} +The location of the shell used when starting a web terminal (if it is configured to allow terminals). + +@item @code{server-config} (default: @code{#f}) +A file contianing the jupyter server's config file. If @code{#f} is given, an empty file is produced, and the default settings are used. + +@end table +@end deftp + + @node Certificate Services @subsection Certificate Services diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 6a093cf4e4..2d2946f7a7 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -15,6 +15,7 @@ ;;; Copyright © 2020 Arun Isaac ;;; Copyright © 2020 Oleg Pykhalov ;;; Copyright © 2020, 2021 Alexandru-Sergiu Marton +;;; Copyright © 2020, 2021 Jesse Gibbons ;;; ;;; This file is part of GNU Guix. ;;; @@ -41,11 +42,13 @@ #:use-module (gnu system shadow) #:use-module (gnu packages admin) #:use-module (gnu packages base) + #:use-module (gnu packages bash) #:use-module (gnu packages databases) #:use-module (gnu packages web) #:use-module (gnu packages patchutils) #:use-module (gnu packages php) #:use-module (gnu packages python) + #:use-module (gnu packages python-xyz) #:use-module (gnu packages gnupg) #:use-module (gnu packages guile) #:use-module (gnu packages logging) @@ -91,6 +94,8 @@ httpd-service-type + jupyter-configuration + nginx-configuration nginx-configuration? nginx-configuration-nginx @@ -1994,3 +1999,118 @@ root=/srv/gemini (service-extension shepherd-root-service-type agate-shepherd-service))) (default-value (agate-configuration)))) + + +;;; Jupyter configuration +;;; Jupyter server configuration +;;; -> includes a list of kernels to allow in the jupyter server +;;; -> includes a list of configuration options specifically for the jupyter server +;;; --> These options can be concatenated to a python file +;;; --> Nested alist +;;; ---> '((NotebookApp (allow-remote-access #t))) -> "c.NotebookApp.allow_remote_access = True" +;;; -> Include some settings specifying how to run the daemon +;;; --> location of log file +;;; --> If a console should be allowed, the location of the shell to be used. +;;; --> The package containing the jupyter server itself, default jupyter +(define-public default-jupyter-config "#") + +(define-record-type* jupyter-configuration + this-jupyter-configuration jupyter-configuration? + (jupyter-package jupyter-configuration-jupyter-package + (default jupyter)) + (kernels jupyter-configuration-kernels + (default '())) + (root-dir jupyter-configuration-root-dir + (default "/var/lib/jupyter/notebooks")) + (log-file jupyter-configuration-log-file + (default #f)) + (shell jupyter-configuration-shell + (default (file-append bash "/bin/bash"))) + (server-config jupyter-configuration-server-config + (default #f))); TODO: Make configuration DSL. + + +(define (search-path-string search-path-pair) + (string-append (search-path-specification-variable (car search-path-pair)) + "=" + (cdr search-path-pair))) + +;;;TODO: Add actions to list jupyter servers, change passwords, etc. +(define (jupyter-shepherd-service config) + (list (shepherd-service + (provision '(jupyter)) ;TODO: Add magic to allow multiple Jupyter servers + (requirement '(loopback)) + (start #~(make-forkexec-constructor + (list "/run/current-system/profile/bin/jupyter" + "notebook" + (string-append "--config=" + #$(or (jupyter-configuration-server-config config) + (plain-file "jupyter_notebook_config.py" + default-jupyter-config)) + #$(jupyter-configuration-root-dir config))) + #:user "jupyter" + #:group "jupyter" + #:environment-variables ; TODO use search-paths magic instead of hard-coding these things. + (list "GI_TYPELIB_PATH=/run/current-system/profile/lib/girepository-1.0" + "GUILE_LOAD_COMPILED_PATH=/run/current-system/profile/lib/guile/3.0/site-ccache:/run/current-system/profile/share/guile/site/3.0" + "GUILE_LOAD_PATH=/run/current-system/profile/share/guile/site/3.0" + "HOME=/var/lib/jupyter" + "JUPYTER_PATH=/run/current-system/profile/share/jupyter" + "PATH=/run/current-system/profile/bin:/run/current-system/profile/sbin" + "PYTHONPATH=/run/current-system/profile/lib/python3.8/site-packages" + "R_LIBS_SITE=/run/current-system/profile/site-library/" + "TEXMF=/run/current-system/profile/share/texmf-dist" + "TEXMFCNF=/run/current-system/profile//share/texmf-dist/web2c" + "XDG_DATA_DIRS=/run/current-system/profile/share") + + #:directory #$(jupyter-configuration-root-dir config) + #:log-file #$(jupyter-configuration-log-file config))) + (stop #~(make-kill-destructor)) + (documentation "Runs a Jupyter Notebook server. A Jupyter Notebook is a web application that allows you to create and share documents that contain live code, equations, visualizations, and explanatory text.")))) + +(define (jupyter-account config) + (list + (user-account + (name "jupyter") + (group "jupyter") + (comment "Jupyter Notebook Server") + (home-directory "/var/lib/jupyter") + (shell (jupyter-configuration-shell config)) + (system? #t)) + (user-group + (name "jupyter") + (system? #t)))) + +(define (jupyter-profile config) + (cons* + (jupyter-configuration-jupyter-package config) + (jupyter-configuration-kernels config))) + +(define (jupyter-activation config) + #~(begin + (let ((root-dir #$(jupyter-configuration-root-dir config)) + (pw (getpwnam "jupyter"))) + (unless (file-exists? root-dir) + (mkdir root-dir) + (chown root-dir (passwd:uid pw) + (passwd:gid pw)) + (chmod root-dir #o700))))) + +;;; Jupyter service type +;;; -> Information vital to settinng up the server, like the port and accepted parameters +;;; -> list of kernels considered permissible. +;;; -> a shepherd service extension that runs the jupyter server +;;; --> shepherd service to list the running servers, set the password, etc. +;;; --> Make a log file only readable by root? +;;; -> an accounts service extension describing the user that runs the accounts +;;; --> group "jupyter" +(define-public jupyter-service-type + (service-type + (name "jupyter") + (extensions (list + (service-extension shepherd-root-service-type jupyter-shepherd-service) + (service-extension account-service-type jupyter-account) + (service-extension activation-service-type jupyter-activation) + (service-extension profile-service-type jupyter-profile))) + (description "Runs a Jupyter Notebook server. A Jupyter Notebook is a web application that allows you to create and share documents that contain live code, equations, visualizations, and explanatory text.") + (default-value (jupyter-configuration))))