aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix-system.scm120
1 files changed, 120 insertions, 0 deletions
diff --git a/guix-system.scm b/guix-system.scm
new file mode 100644
index 0000000..c154d01
--- /dev/null
+++ b/guix-system.scm
@@ -0,0 +1,120 @@
+(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>
+ 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
+ (($ <genenetwork3-configuration> 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)))