(use-modules (gnu) (gn services databases) (gnu packages admin) (gnu services shepherd) (guix derivations) (guix monads) (guix profiles) (guix search-paths) (guix records) (guix store) (ice-9 match)) (define genenetwork3 (load "guix.scm")) (define (packages->profile packages) "Return profile with PACKAGES." (with-store store (run-with-store store (mlet* %store-monad ((prof-drv (profile-derivation (packages->manifest packages))) (profile -> (derivation->output-path prof-drv))) (mbegin %store-monad (built-derivations (list prof-drv)) (return profile)))))) (define (packages->environment-variables packages) "Return environment variables of a profile with PACKAGES. Return value is an association list mapping the names of environment variables to their values." (map (match-lambda ((search-path . value) (cons (search-path-specification-variable search-path) value))) (profile-search-paths (packages->profile packages)))) (define (packages->profile-environment packages) "Return environment of a profile with PACKAGES. Return value is a list of environment variables suitable as input to the environ function." (map (match-lambda ((search-path . value) (string-append (search-path-specification-variable search-path) "=" value))) (profile-search-paths (packages->profile packages)))) (define-record-type* genenetwork3-configuration make-genenetwork3-configuration genenetwork3-configuration? (package genenetwork3-configuration-package (default genenetwork3)) (port genenetwork3-configuration-port (default 5000))) (define %genenetwork3-accounts (list (user-group (name "genenetwork3") (system? #t)) (user-account (name "genenetwork3") (group "genenetwork3") (system? #t) (comment "GeneNetwork 3 user") (home-directory "/var/empty") (shell (file-append shadow "/sbin/nologin"))))) ;; FIXME: Factorize this service into two. We should have a gunicorn ;; service that is extended by the genenetwork service. This way, the ;; app is better decoupled from the deployment. (define genenetwork3-shepherd-service (match-lambda (($ package port) (shepherd-service (documentation "Run GeneNetwork 3.") (provision '(genenetwork3)) (requirement '(networking virtuoso)) (start #~(begin ;; Reference the profile. #$(packages->profile (list package)) ;; Start the gunicorn process. (make-forkexec-constructor (list #$(file-append gunicorn "/bin/gunicorn") "-b" #$(string-append "127.0.0.1:" (number->string port)) "gn3.app:create_app()") #:user "genenetwork3" #:group "genenetwork3" #:environment-variables '#$(packages->profile-environment (list package))))) (stop #~(make-kill-destructor)))))) (define genenetwork3-service-type (service-type (name 'genenetwork3) (description "Run GeneNetwork 3.") (extensions (list (service-extension account-service-type (const %genenetwork3-accounts)) (service-extension shepherd-root-service-type (compose list genenetwork3-shepherd-service)))) (default-value (genenetwork3-configuration)))) (operating-system (host-name "genenetwork3") (timezone "UTC") (locale "en_US.utf8") (bootloader (bootloader-configuration (bootloader grub-bootloader) (targets (list "/dev/sdX")))) (file-systems (cons (file-system (device "root") (mount-point "/") (type "ext4")) %base-file-systems)) (users %base-user-accounts) (packages %base-packages) (services (cons* (service virtuoso-service-type (virtuoso-configuration (http-server-port 8891))) (service genenetwork3-service-type (genenetwork3-configuration (port 5000))) %base-services)))