aboutsummaryrefslogtreecommitdiff
;; See dockerfile for some clarification about choices:
;; https://github.com/icebert/docker_ucsc_genome_browser/blob/master/Dockerfile
;; http://genome.ucsc.edu/goldenPath/help/mirrorManual.html
(define-module (gn services genome-browser))

(use-modules (gnu)
             (guix build utils)
             (guix packages)
             (gn packages bioinformatics))
(use-service-modules
  databases
  networking
  web)
(use-package-modules
  bash
  databases
  ghostscript
  wget)

(define %hg.conf
  (mixed-text-file "hg.conf"
                   "browser.documentRoot=" ucsc-genome-browser "/html\n"
                   ;"db.host=localhost\n"
                   ;"db.user=readonly\n"
                   ;"db.password=access\n"
                   "db.host=tux02\n"
                   "db.user=webqtlout\n"
                   "db.password=webqtlout\n"
                   "db.trackDb=trackDb\n"
                   ;"db.port=13306\n"
                   "gbdbLoc1=/gbdb/\n"
                   "gbdbLoc2=http://hgdownload.soe.ucsc.edu/gbdb/\n"
                   ;# To disable on-the-fly loading of mysql data, comment out these lines.
                   "slow-db.host=genome-mysql.soe.ucsc.edu\n"
                   "slow-db.user=genomep\n"
                   "slow-db.password=password\n"
                   "defaultGenome=Mouse\n"
                   "central.db=hgcentral\n"
                   ;"central.host=localhost\n"
                   ;"central.socket=/run/mysqld/mysqld.sock\n"   ; default for mysql service
                   ;"central.user=readwrite\n"
                   ;"central.password=update\n"
                   "central.host=tux02\n"
                   "central.user=webqtlout\n"
                   "central.password=webqtlout\n"
                   "central.domain=\n"
                   "backupcentral.db=hgcentral\n"
                   "backupcentral.host=tux02\n"
                   "backupcentral.user=webqtlout\n"
                   "backupcentral.password=webqtlout\n"
                   "backupcentral.domain=\n"
                   "freeType=on\n"
                   "freeTypeDir=" gs-fonts "/share/fonts/type1/ghostscript\n"
                   ;"hgc.psxyPath=" gmt "/bin/psxy"
                   ;"hgc.ps2rasterPath=" gmt "/bin/ps2raster"
                   "hgc.ghostscriptPath=" ghostscript "/bin/gs\n"   ; needed?
                   "udc.cacheDir=/var/cache/genome/udcCache\n"))    ; default is /tmp/udcCache

(define %startup-script
  (mixed-text-file "create_databases.sh"
                   wget "/bin/wget http://hgdownload.soe.ucsc.edu/admin/hgcentral.sql\n"
                   bash-minimal "/bin/sh " (package-source ucsc-genome-browser) "/src/product/ex.MySQLUserPerms.sh\n"
                   mariadb "/bin/mysql -e \"create database hgcentral;\" mysql\n"
                   mariadb "/bin/mysql hgcentral < hgcentral.sql\n"
                   coreutils-minimal "/bin/mkdir -p /var/cache/genome\n"
                   coreutils-minimal "/bin/chown -R httpd:httpd /var/www\n"))

;; This might be useful as a one-off shepherd job.
;(define %genome-activation-script
;  #~(begin
;      ;(unless (file-exists? "/var/lib/mysql/hgcentral")
;      ;  (invoke #$(file-append wget "/bin/wget") "http://hgdownload.soe.ucsc.edu/admin/hgcentral.sql" "-O" "/var/lib/mysql/hgcentral.sql")
;      ;  ;(invoke "sh" #$(file-append (package-source ucsc-genome-browser) "/src/product/ex.MySQLUserPerms.sh"))
;      ;  (invoke #$(file-append mariadb "/bin/mysql") "-e" "\"create database hgcentral;\"" "mysql")
;      ;  (invoke #$(file-append mariadb "/bin/mysql") "hgcentral" "<" "/var/lib/mysql/hgcentral.sql"))
;      (unless (file-exists? "/var/www/html/trash")
;        (mkdir-p "/var/www/html/trash"))
;      (unless (file-exists? "/var/cache/genome")
;        (mkdir-p "/var/cache/genome"))
;      (for-each (lambda (file)
;                  (chown file (passwd:uid "httpd") (passwd:gid "httpd")))
;                (append (find-files "/var/cache/genome" #:directories? #t)
;                        (find-files "/var/www/html/trash" #:directories? #t)))
;      (for-each (lambda (file)
;                  (chown file (passwd:uid "mysql") (passwd:gid "mysql")))
;                (find-files "/var/lib/mysql" #:directories? #t))))

;(define %one-month-files
;  (let ((%one-month (* 60 60 24 30)))
;    (find-files "/var/cache/genome" (lambda (file stat)
;                                      (> (stat:atime stat) %one-month)))))

;; TODO:
;;  create 'daily clean' mcron scripts. Only needed in /var/cache/genome grows too large.
;;  use rsync to make sure mouse genome data is kept up-to-date.

(define ucsc-genome-browser-port 4323)

(operating-system
  (host-name "genome-browser")
  (timezone "Etc/UTC")
  (locale "en_US.utf8")

  (bootloader (bootloader-configuration
               (bootloader grub-bootloader)
               (targets '("does-not-matter"))))
  (file-systems %base-file-systems)
  ;; No firmware for VMs
  (firmware '())
  (packages (cons* mariadb  ; for create-db script, interacting with database if necessary
                   %base-packages))
  (services
    (list ;(service mysql-service-type
          ;         (mysql-configuration
          ;           (port 13306))) ; don't overlap with tux02's mariadb
          (service special-files-service-type
                   `(;("/root/create_hgcentral" ,%startup-script)
                     ("/var/lib/genome/hg.conf" ,%hg.conf)))
          (service inetd-service-type
                   (inetd-configuration
                     (entries
                       (list
                         (inetd-entry
                           (node "127.0.0.1")
                           (name "blat")    ; yes, it's named blat
                           (socket-type 'stream)
                           (protocol "tcp") ; probably?
                           (wait? #f)
                           (user "httpd:httpd") ; or dedicated user. Needs write access.
                           (program (file-append ucsc-genome-browser "/bin/gfServer"))
                           (arguments
                             '("gfServer" "dynserver" "/gbdb")))))))
          (service syslog-service-type)  ; needed by inetd
          (service httpd-service-type
                   (httpd-configuration
                     (config
                       (httpd-config-file
                         (document-root (file-append ucsc-genome-browser "/html"))
                         (server-name "Genome_Browser")
                         (listen (list (number->string ucsc-genome-browser-port)))
                         (modules
                           (cons*
                             (httpd-module
                               (name "cgid_module")
                               (file "modules/mod_cgid.so"))
                             (httpd-module
                               (name "include_module")
                               (file "modules/mod_include.so"))
                             %default-httpd-modules))
                         (extra-config (list "\
TypesConfig etc/httpd/mime.types
# More logs for more debugging.
LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common
CustomLog /var/log/httpd/combined_log common
#LogLevel debug
# cgid.sock needs to be creatable, not in the store
ScriptSock /var/run/cgid.sock
#XBitHack needs to not be inside the VirtualHost block.
XBitHack On
# same as 'listen' above
<VirtualHost *:" (number->string ucsc-genome-browser-port) ">
  DocumentRoot " ucsc-genome-browser "/html
  Alias /bin " ucsc-genome-browser "/bin
  #Alias /cgi-bin " ucsc-genome-browser "/cgi-bin   # causes cgi scripts to fail to render
  Alias /favicon.ico " ucsc-genome-browser "/html/faviconRR.ico
  Alias /htdocs " ucsc-genome-browser "/htdocs
  #Alias /htdocs " ucsc-genome-browser "/html
  Alias /var/www/html/trash /var/cache/genome
  Alias /var/cache/genome /var/cache/genome
  <Directory " ucsc-genome-browser "/html>
    Options +Includes
    #Options +Includes +FollowSymLinks +Indexes
    AllowOverride None
    <IfModule mod_authz_host.c>
      Require all granted
      SSILegacyExprParser on
    </IfModule>
  </Directory>

  ScriptAlias /cgi-bin " ucsc-genome-browser "/cgi-bin
  <Directory " ucsc-genome-browser "/cgi-bin>
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    #Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch +Includes +FollowSymlinks
    Order allow,deny
    #SetHandler cgi-script
    Require all granted
    Allow from all
  </Directory>

  <Directory /var/cache/genome>
    Options MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
  # Upstream default location, possibly expected by software
  <Directory /var/www/html/trash>
    Options MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>")))))))))

;; guix system container -L /path/to/guix-past/modules/ -L /path/to/guix-bioinformatics/ /path/to/guix-bioinformatics/gn/services/genome-browser.scm --network --share=/export/efraimf/UCSC_Genome/gbdb=/gbdb --share=/export/efraimf/UCSC_Genome/var-lib-mysql=/var/lib/mysql --share=/export/efraimf/UCSC_Genome/var-cache-genome=/var/cache/genome --share=/export/efraimf/UCSC_Genome/var-cache-genome=/var/www/html/trash
;; xdg-open http://localhost:4322