From patchwork Thu Sep 23 02:22:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jesse Gibbons X-Patchwork-Id: 33250 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 7025F27BBE3; Thu, 23 Sep 2021 03:23:26 +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 AE2DE27BBE1 for ; Thu, 23 Sep 2021 03:23:25 +0100 (BST) Received: from localhost ([::1]:60758 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mTEOS-0001fn-QV for patchwork@mira.cbaines.net; Wed, 22 Sep 2021 22:23:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37926) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mTEO7-0001Ja-8R for guix-patches@gnu.org; Wed, 22 Sep 2021 22:23:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:40743) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mTEO7-0001KA-0s for guix-patches@gnu.org; Wed, 22 Sep 2021 22:23:03 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mTEO6-0000WS-Ss for guix-patches@gnu.org; Wed, 22 Sep 2021 22:23:02 -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: Thu, 23 Sep 2021 02:23:02 +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.16323637471928 (code B ref 50708); Thu, 23 Sep 2021 02:23:02 +0000 Received: (at 50708) by debbugs.gnu.org; 23 Sep 2021 02:22:27 +0000 Received: from localhost ([127.0.0.1]:52284 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTENX-0000V1-3e for submit@debbugs.gnu.org; Wed, 22 Sep 2021 22:22:27 -0400 Received: from mail-pl1-f176.google.com ([209.85.214.176]:34666) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mTENR-0000Ug-N3 for 50708@debbugs.gnu.org; Wed, 22 Sep 2021 22:22:25 -0400 Received: by mail-pl1-f176.google.com with SMTP id a7so3047436plm.1 for <50708@debbugs.gnu.org>; Wed, 22 Sep 2021 19:22:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:from:to:references:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=8sPeZDgv0Vip9tqe/g4x+kqDwUKViY2M6WEyMp5Vblk=; b=iv/5fduCGSKdEi/hpuc2hcs4+5luaN+FvyX98KgEjGmIu3MDuuUj6HojXZaWAD8TP0 Oy1/jTf6kNYdFeOor1GaiBeHvy+SSpJoiu/g/rFw0jeH0ImlumKvgBylUtz5qIu+iuzX i0fycjotvGy3ksXqY9awwsrfUmiLKwfoWoqaMyKbf3WuGtsYDJvqVJpPc6U+W2R1VQfb sblNQm8JayQRw9blFGVyPt/l8iTg1FNpPcjtx83W2APMdnXqiWj6TYaaa7EKrO0sFez6 K9nTa0pfp3UaGNEo0pk1w92dO76db3aS/dqYV3GJCyJJCHXLXnlJ5YXcE6Ho2DBEgEU3 SCkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:from:to:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=8sPeZDgv0Vip9tqe/g4x+kqDwUKViY2M6WEyMp5Vblk=; b=BoYz+NqvQokHVbkRtGBI/nZqG2Yd5c6wThjWirL8NYYjuDuLomgIrccR8GJhAgjMgb GUrrfIGXE8dc15ZAfNIUSZVLYdlFvEiI4KpQSzmwM/OuHEJ6FZ9fRWCJsW4e8CIKyYJD 9ZtvbN2ij7sy/4kcVys8f1fpX09Op3zoDgNNnRgA0xhdj7ySqWoLVCG4FlAoqTVsiKJF MaW919fn0ALKqI50jclsNucJqOWu1+G3rXyO0C8KyPcRkmAxzYUhHt491i6taIAblTCS dIP63/w1SQ5a3q3VIfMWdKdTOW+7bNN03BvIx2kxB4WZA/N//w0vBj7gDlxLVukYiEa3 BOTg== X-Gm-Message-State: AOAM532Wr/ZpX/TRh2l4HRd1q/w/jBeIqWflkQqYL7ilKBXCWMc4QMGJ OV5ACQVa6bHWjCWCPimChZMz5uH7pEcHhQ== X-Google-Smtp-Source: ABdhPJwCvZSZnqQURA3jXtQU7ieX1NOcvQsNO28bvde2SYRXAjlHZ0TrQ9HV538nU4nrFXm6Xo0zhQ== X-Received: by 2002:a17:902:f24b:b0:13a:5178:ef64 with SMTP id j11-20020a170902f24b00b0013a5178ef64mr1723921plc.14.1632363735244; Wed, 22 Sep 2021 19:22:15 -0700 (PDT) Received: from [192.168.1.220] ([38.141.58.134]) by smtp.gmail.com with ESMTPSA id g3sm3647600pfk.178.2021.09.22.19.22.14 for <50708@debbugs.gnu.org> (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 22 Sep 2021 19:22:14 -0700 (PDT) From: Jesse References: <565a1b21-aefa-4129-a024-52517fdff9bd@gmail.com> <74f78a5c-3f79-7485-0cf2-ae1fbb1969dd@gmail.com> Message-ID: Date: Wed, 22 Sep 2021 20:22:12 -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: <74f78a5c-3f79-7485-0cf2-ae1fbb1969dd@gmail.com> 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 yet another updated patch fixing a mistake in the added documentation. On 9/21/21 7:26 PM, Jesse wrote: > 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))))