diff --git a/doc/guix.texi b/doc/guix.texi index de34939248..ffc77cbb8b 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -26612,6 +26612,55 @@ setuid-root (@pxref{Setuid Programs}) such that unprivileged users can invoke @command{singularity run} and similar commands. @end defvr +@cindex rshiny +@subsubheading R-Shiny service + +The @code{(gnu services science)} module provides the following service. + +@defvr {Scheme Variable} rshiny-service-type + +This is a type of service which is used to run a webapp created with +@code{r-shiny}. This service sets the @code{R_LIBS_USER} environment +variable and runs the provided script to call @code{runApp}. + +@deftp {Data Type} rshiny-configuration +This is the data type representing the configuration of rshiny. + +@table @asis + +@item @code{package} (default: @code{r-shiny}) +The package to use. + +@item @code{binary} (defaunlt @code{"rshiny"}) +The name of the binary or shell script located at @code{package/bin/} to +run when the service is run. + +The common way to create this file is as follows: + +@lisp +@dots{} +(let* ((out (assoc-ref %outputs "out")) + (targetdir (string-append out "/share/" ,name)) + (app (string-append out "/bin/" ,name)) + (Rbin (string-append (assoc-ref %build-inputs "r-min") + "/bin/Rscript"))) +@dots{} + (mkdir-p (string-append out "/bin")) + (call-with-output-file app + (lambda (port) + (format port +"#!~a +library(shiny) +setwd(\"~a\") +runApp(launch.browser=0, port=4202)~%\n" + Rbin targetdir))) +@dots{} +@end lisp + +@end table +@end deftp +@end defvr + @cindex Nix @subsubheading Nix service diff --git a/gnu/local.mk b/gnu/local.mk index fb157c0ab1..8bb56010c2 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -599,6 +599,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/nix.scm \ %D%/services/nfs.scm \ %D%/services/pam-mount.scm \ + %D%/services/science.scm \ %D%/services/security-token.scm \ %D%/services/shepherd.scm \ %D%/services/sound.scm \ diff --git a/gnu/services/science.scm b/gnu/services/science.scm new file mode 100644 index 0000000000..94ff0f36f2 --- /dev/null +++ b/gnu/services/science.scm @@ -0,0 +1,57 @@ +(define-module (gnu services science) + #:export ( + rshiny-configuration + rshiny-configuration? + rshiny-configuration-package + rshiny-configuration-binary + rshiny-shepherd-service + rshiny-service-type)) + +(use-modules (gnu) + (guix records) + (ice-9 match)) +(use-service-modules shepherd) +(use-package-modules cran) + +(define-record-type* + rshiny-configuration + make-rshiny-configuration + rshiny-configuration? + (package rshiny-configuration-package ; package + (default r-shiny)) + (binary rshiny-configuration-binary ; string + (default "rshiny"))) + +(define rshiny-shepherd-service + (match-lambda + (($ package binary) + (list + (shepherd-service + (documentation (string-append "R-Shiny service for " binary)) + (provision (list (symbol-append 'rshiny- (string->symbol + (string-take binary 9))))) + (requirement '(networking)) + (start + #~(exec-command + (list + #$(string-append "/run/current-system/profile/bin/" binary)) + ;#:log-file #$(string-append "/var/log/" binary ".log") ; kills shepherd + #:environment-variables + (list "R_LIBS_USER=/run/current-system/profile/site-library/"))) + (stop #~(make-kill-destructor))))))) + +(define rshiny-service-type + (service-type + (name 'rshiny) + (extensions + (list + (service-extension shepherd-root-service-type + rshiny-shepherd-service) + (service-extension profile-service-type + ;; We want the package installed so that it + ;; pulls in the propagated inputs as well. + (lambda (config) + (list + (rshiny-configuration-package config)))))) + (description + "Run an R-Shiny webapp as a Guix Service.")))