(define-module (gn services ratspub-container)) (use-modules (gnu) (gn packages ratspub) (gn packages bioinformatics) (guix modules) (guix records) (ice-9 match)) (use-service-modules networking shepherd) (use-package-modules certs) (define-record-type* ratspub-configuration make-ratspub-configuration ratspub-configuration? (package ratspub-configuration-package ; package (default ratspub)) (deploy-directory ratspub-configuration-deploy-directory (default "/srv/http"))) (define ratspub-activation (match-lambda (($ package deploy-directory) #~(begin (use-modules (guix build utils)) (when (directory-exists? #$deploy-directory) ;; Not 'delete-file-recursively' because the directory might be empty. (and (string-append #$coreutils "/bin/rm" "-r " #$deploy-directory "/*") (delete-file #$deploy-directory))) (mkdir-p #$deploy-directory) (copy-recursively #$package #$deploy-directory))))) (define ratspub-shepherd-service (match-lambda (($ package deploy-directory) (with-imported-modules (source-module-closure '((gnu build shepherd) (gnu system file-systems))) (list (shepherd-service (provision '(ratspub)) (requirement '(networking)) (modules '((gnu build shepherd) (gnu system file-systems))) (start #~(make-forkexec-constructor '("./server.py") #:directory "/srv/http" #:environment-variables '("EDIRECT_PUBMED_MASTER=/export2/PubMed" "NLTK_DATA=/export2/PubMed/nltk_data" "PERL_LWP_SSL_CA_FILE=/run/current-system/profile/etc/ssl/certs/ca-certificates.crt" ;"PATH=/run/current-system/profile/bin" ) #:mappings (list (file-system-mapping (source "/export2/PubMed") (target source) (writable? #t)) ) )) (stop #~(make-kill-destructor)))))))) (define ratspub-service-type (service-type (name 'ratspub) (extensions (list (service-extension activation-service-type ratspub-activation) (service-extension shepherd-root-service-type ratspub-shepherd-service) ;; Make sure RatsPub doesn't get garbage collected. (service-extension profile-service-type (compose list ratspub-configuration-package)))) (default-value (ratspub-configuration)) (description "Run a RatsPub Webserver."))) (operating-system ;(host-name "ratspub") (host-name "penguin2") ; hardcoded in ratspub.py (timezone "Etc/UTC") (locale "en_US.utf8") (bootloader (bootloader-configuration (bootloader grub-bootloader) (target "does-not-matter"))) (file-systems %base-file-systems) ;; No firmware for VMs. (firmware '()) ;; We don't need any packages inside the container. ;(packages '()) (packages (list edirect-gn sed nss-certs)) (services (list (service dhcp-client-service-type) (service ratspub-service-type))))