about summary refs log tree commit diff
path: root/gn/services
diff options
context:
space:
mode:
Diffstat (limited to 'gn/services')
-rw-r--r--gn/services/pluto.scm134
1 files changed, 134 insertions, 0 deletions
diff --git a/gn/services/pluto.scm b/gn/services/pluto.scm
new file mode 100644
index 0000000..3df804c
--- /dev/null
+++ b/gn/services/pluto.scm
@@ -0,0 +1,134 @@
+(define-module (gn services pluto))
+
+(use-modules (gnu)
+             (gn packages julia)
+             (guix modules)
+             (guix records)
+             (ice-9 match))
+(use-service-modules shepherd)
+(use-package-modules
+  admin
+  certs)
+
+(define-record-type* <pluto-configuration>
+  pluto-configuration
+  make-pluto-configuration
+  pluto-configuration?
+  (package  pluto-configuration-package     ; package
+            (default julia-visuals))
+  (port     pluto-configuration-port        ; integer
+            (default 80)))
+
+(define %julia-account
+  (list (user-group
+          (name "julia")
+          ;(system? #t)
+          )
+        (user-account
+          (name "julia")
+          (group "julia")
+          ;(system? #t)
+          (comment "Julia User")
+          (home-directory "/home/jovyan")
+          ;(shell (file-append shadow "/sbin/nologin"))
+          )))
+
+;(define pluto-activation
+;  (match-lambda
+;    (($ <ratspub-configuration> package)
+;     #~(begin
+;         (let ((nltk_data "/var/cache/nltk_data/tokenizers")
+;               (data_dir "/export/ratspub"))
+;           (unless (file-exists? "/export2/PubMed")
+;             (mkdir-p "/export2/PubMed"))
+;           (unless (file-exists? nltk_data)
+;             (begin
+;               ;; The correct way would be to use python-nltk to download the data
+;               ;; python3 -m nltk.downloader -d /var/cache/nltk_data punkt
+;               (mkdir-p nltk_data)
+;               (chdir nltk_data)
+;               (invoke #$(file-append unzip "/bin/unzip") "-q" #$%punkt.zip)))
+;           (unless (file-exists? (string-append data_dir "/userspub.sqlite"))
+;             (begin
+;               (install-file #$(file-append package "/userspub.sqlite") data_dir)
+;               (chmod (string-append data_dir "/userspub.sqlite") #o554))))))))
+
+(define pluto-shepherd-service
+  (match-lambda
+    (($ <pluto-configuration> package port)
+     (with-imported-modules (source-module-closure
+                              '((gnu build shepherd)
+                                (gnu system file-systems)))
+       (list (shepherd-service
+               (provision '(pluto))
+               (requirement '(networking))
+               (modules '((gnu build shepherd)
+                          (gnu system file-systems)))
+               (start #~(make-forkexec-constructor/container
+                          (list #$(file-append package "/runpluto.sh") #$port)
+                          ;; Needs to run from the directory it is located in.
+                          ;#:directory #$package
+                          #:log-file "/var/log/pluto.log"
+                          ;; We don't need to set TMPDIR because we're inside a container.
+                          #:user "julia"
+                          #:group "julia"
+                          #:environment-variables
+                          '(;"JULIA_PROJECT=/home/jovyan"
+                            ;"JULIA_LOAD_PATH=/run/current-system/profile/share/julia/packages/"
+                            )
+                          #:mappings (list (file-system-mapping
+                                             (source "/home/jovyan")
+                                             (target source)
+                                             (writable? #t))
+                                           )
+                          ))
+               (stop  #~(make-kill-destructor))))))))
+
+(define pluto-service-type
+  (service-type
+    (name 'pluto)
+    (extensions
+      (list
+        (service-extension shepherd-root-service-type
+                           pluto-shepherd-service)
+        ;(service-extension activation-service-type
+        ;                   ratspub-activation)
+        (service-extension account-service-type
+                           (const %julia-account))
+        ;; Make sure we get all the dependencies of julia-visuals.
+        (service-extension profile-service-type
+                           (compose list pluto-configuration-package))))
+    (default-value (pluto-configuration))
+    (description
+     "Run a Pluto Jupyter Webserver.")))
+
+(operating-system
+  (host-name "pluto")
+  (timezone "Etc/UTC")
+  (locale "en_US.utf8")
+
+  (bootloader (bootloader-configuration
+               (bootloader grub-bootloader)
+               (target "does-not-matter")))
+  (file-systems (list (file-system
+                        (device "does-not-matter")
+                        (mount-point "/")
+                        (type "does-not-matter"))))
+  ;; TODO: A more minimal kernel for use in a docker image
+  ;; (kernel linux-libre-vm)
+  ;; No firmware for VMs.
+  (firmware '())
+  (packages ;(list nss-certs)
+    %base-packages
+            )
+
+  (services (list (service pluto-service-type
+                           (pluto-configuration
+                             (port "4343"))))))
+
+;; guix system container -L /path/to/guix-bioinformatics/ -L /path/to/guix-past/modules/ /path/to/guix-bioinformatics/gn/services/pluto.scm --network
+;; For docker it isn't necessary to list the shared folders at build time.
+;; guix system docker-image -L /path/to/guix-bioinformatics/ -L /path/to/guix-past/modules/ /path/to/guix-bioinformatics/gn/services/pluto.scm --network
+;; Docker instructions:
+;; docker load --input pluto-docker-image.tar.gz
+;; docker run -d --privileged --net=host --name pluto guix