services: Add rshiny service.

* gnu/services/science.scm: New file.
(<rshiny-configuration>): New record.
(rshiny-shepherd-service-type): New variable.
* doc/guix.texi (Miscellaneous Services): Document it.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
This commit is contained in:
Efraim Flashner 2020-06-21 16:20:16 +03:00
parent 0dfc461272
commit 8f19e63f76
No known key found for this signature in database
GPG key ID: 41AAE7DCCA3D8351
3 changed files with 107 additions and 0 deletions

View file

@ -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

View file

@ -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 \

57
gnu/services/science.scm Normal file
View file

@ -0,0 +1,57 @@
(define-module (gnu services science)
#:export (<rshiny-configuration>
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>
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
(($ <rshiny-configuration> 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.")))