about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--genenetwork-local-container.scm302
-rwxr-xr-xgenenetwork-local-container.sh34
2 files changed, 236 insertions, 100 deletions
diff --git a/genenetwork-local-container.scm b/genenetwork-local-container.scm
index 3942383..8dc02c7 100644
--- a/genenetwork-local-container.scm
+++ b/genenetwork-local-container.scm
@@ -23,13 +23,13 @@
 (use-modules (gnu)
              (genenetwork services genenetwork)
              (gnu build linux-container)
-             ((gn packages genenetwork) #:select (genenetwork2 genenetwork3 gn-auth gn-libs))
+             ((gn packages genenetwork) #:select (genenetwork2 genenetwork3 gn-auth gn-libs gn-uploader))
              ((gnu packages admin) #:select (shepherd shadow))
              ((gnu packages certs) #:select (nss-certs))
              ((gnu packages bash) #:select (bash))
              ((gnu packages check) #:select (python-pylint python-hypothesis))
              ((gnu packages python-check) #:select (python-mypy python-mypy-extensions))
-             ((gnu packages python-web) #:select (gunicorn python-flask))
+             ((gnu packages python-web) #:select (gunicorn python-flask python-flask-cors))
              ((gnu packages version-control) #:select (git-minimal))
              ((gn packages guile) #:select (gn-guile))
              (gn services databases)
@@ -76,57 +76,69 @@
   (gn-guile-port genenetwork-configuration-gn-guile-port
                  (default 8091))
   (gn-doc-git-checkout genenetwork-configuration-gn-doc-git-checkout
-                       (default "/var/lib/gn-docs")))
+                       (default "/var/lib/gn-docs"))
+  (sql-uri genenetwork-configuration-sql-uri
+           (default
+             "mysql://webqtlout:webqtlout@localhost/db_webqtl_local?unix_socket=/run/mysqld/mysqld.sock&charset=utf8"))
+  (gn-uploader-data-directory genenetwork-configuration-gn-uploader-data-directory
+                              (default "/var/lib/gn-uploader/data"))
+  (gn-uploader-port genenetwork-configuration-gn-uploader-port
+                    (default 8085))
+  (gn-uploader-secrets genenetwork-configuration-gn-uploader-configuration-secrets
+                       (default "/etc/genenetwork/conf/gn-uploader/secrets.py"))
+  (gn-uploader-sessions-dir genenetwork-configuration-gn-uploader-sessions-dir
+                            (default "/var/lib/gn-uploader/sessions")))
+
 
 (define (genenetwork2-gexp config)
   "Return a G-expression that runs the latest genenetwork2 development
 server described by CONFIG, a <genenetwork-configuration> object."
   (match-record config <genenetwork-configuration>
-    (gn2-port gn2-secrets gn3-port gn-auth-port genotype-files)
-      (with-packages
-       (list coreutils git-minimal gunicorn nss-certs)
-       (with-imported-modules '((guix build utils))
-         #~(begin
-             (use-modules (guix build utils)
-                          (ice-9 ftw)
-                          (ice-9 match))
+                (sql-uri gn2-port gn2-secrets gn3-port gn-auth-port genotype-files)
+    (with-packages
+     (list coreutils git-minimal gunicorn nss-certs)
+     (with-imported-modules '((guix build utils))
+       #~(begin
+           (use-modules (guix build utils)
+                        (ice-9 ftw)
+                        (ice-9 match))
 
-             ;; Override the genenetwork3 used by genenetwork2.
-             (setenv "GN3_PYTHONPATH" "/genenetwork3")
-             (setenv "GN2_PROFILE" #$(profile
-                                      (content (package->development-manifest genenetwork2))
-                                      (allow-collisions? #t)))
-             (unless (file-exists? "/etc/genenetwork/conf/gn2.conf")
-               (with-output-to-file "/etc/genenetwork/conf/gn2.conf"
-                 (lambda ()
-                   (display #$(string-append
-                               "GN2_SECRETS=\"" gn2-secrets "\"\n"
-                               "AI_SEARCH_ENABLED=True\n"
-                               "TEST_FEATURE_SWITCH=True\n"
-                               "GN3_LOCAL_URL=\"http://localhost:" (number->string gn3-port) "\"\n"
-                               "GN_SERVER_URL=\"http://localhost:" (number->string gn3-port) "/api/\"\n"
-                               "AUTH_SERVER_URL=\"http://localhost:" (number->string gn-auth-port) "\"\n"
-                               "SQL_URI=\"mysql://webqtlout:webqtlout@localhost/db_webqtl_local?unix_socket=/run/mysqld/mysqld.sock&charset=utf8\"\n"
-                               "SSL_PRIVATE_KEY=\"/etc/genenetwork/conf/gn2/private.pem\"\n"
-                               "AUTH_SERVER_SSL_PUBLIC_KEY=\"/etc/genenetwork/conf/gn-auth/clients-public-keys/gn-auth.pem\"\n"))
-                   ;; We actually set here twice so that we can refer to it
-                   ;; when running things manually.
-                   (display "GN2_PROFILE=\"")
-                   (display #$(file-append (profile
-                                            (content (package->development-manifest genenetwork2))
-                                            (allow-collisions? #t))
-                                           "\"\n")))))
-             (setenv "GN2_SETTINGS" "/etc/genenetwork/conf/gn2.conf")
-             ;; Start genenetwork2.
-             (with-directory-excursion "/genenetwork2"
-               (invoke #$(file-append bash "/bin/sh")
-                       "bin/genenetwork2" "gn2/default_settings.py" "-gunicorn-dev")))))))
+           ;; Override the genenetwork3 used by genenetwork2.
+           (setenv "GN3_PYTHONPATH" "/genenetwork3")
+           (setenv "GN2_PROFILE" #$(profile
+                                    (content (package->development-manifest genenetwork2))
+                                    (allow-collisions? #t)))
+           (unless (file-exists? "/etc/genenetwork/conf/gn2.conf")
+             (with-output-to-file "/etc/genenetwork/conf/gn2.conf"
+               (lambda ()
+                 (display #$(string-append
+                             "GN2_SECRETS=\"" gn2-secrets "\"\n"
+                             "AI_SEARCH_ENABLED=True\n"
+                             "TEST_FEATURE_SWITCH=True\n"
+                             "GN3_LOCAL_URL=\"http://localhost:" (number->string gn3-port) "\"\n"
+                             "GN_SERVER_URL=\"http://localhost:" (number->string gn3-port) "/api/\"\n"
+                             "AUTH_SERVER_URL=\"http://localhost:" (number->string gn-auth-port) "\"\n"
+                             "SQL_URI=\"" sql-uri "\"\n"
+                             "SSL_PRIVATE_KEY=\"/etc/genenetwork/conf/gn2/private.pem\"\n"
+                             "AUTH_SERVER_SSL_PUBLIC_KEY=\"/etc/genenetwork/conf/gn-auth/clients-public-keys/gn-auth.pem\"\n"))
+                 ;; We actually set here twice so that we can refer to it
+                 ;; when running things manually.
+                 (display "GN2_PROFILE=\"")
+                 (display #$(file-append (profile
+                                          (content (package->development-manifest genenetwork2))
+                                          (allow-collisions? #t))
+                                         "\"\n")))))
+           (setenv "GN2_SETTINGS" "/etc/genenetwork/conf/gn2.conf")
+           ;; Start genenetwork2.
+           (with-directory-excursion "/genenetwork2"
+             (invoke #$(file-append bash "/bin/sh")
+                     "bin/genenetwork2" "gn2/default_settings.py" "-gunicorn-dev")))))))
 
 (define (genenetwork3-gexp config)
   "Return a G-expression that runs the latest genenetwork3 development
 server described by CONFIG, a <genenetwork-configuration> object."
   (match-record config <genenetwork-configuration>
-    (gn3-port gn3-secrets gn-auth-port sparql-endpoint data-directory xapian-db-path auth-db-path llm-db-path)
+    (sql-uri gn3-port gn3-secrets gn-auth-port sparql-endpoint data-directory xapian-db-path auth-db-path llm-db-path)
     (with-manifest (package->development-manifest genenetwork3)
       (with-imported-modules '((guix build utils))
         #~(begin
@@ -161,7 +173,7 @@ server described by CONFIG, a <genenetwork-configuration> object."
             (setenv "GN3_CONF" "/etc/genenetwork/conf/gn3.conf")
             (setenv "GN3_SECRETS" #$gn3-secrets)
             (setenv "HOME" "/tmp")
-            (setenv "SQL_URI" "mysql://webqtlout:webqtlout@localhost/db_webqtl_local?unix_socket=/run/mysqld/mysqld.sock")
+            (setenv "SQL_URI" sql-uri)
 
             (setenv "FLASK_ENV" "development")
             (setenv "FLASK_DEBUG" "1")
@@ -175,7 +187,7 @@ server described by CONFIG, a <genenetwork-configuration> object."
   "Return a G-expression that runs the latest gn-auth development
 server described by CONFIG, a <genenetwork-configuration> object."
   (match-record config <genenetwork-configuration>
-    (gn-auth-port auth-db-path gn-auth-secrets)
+    (sql-uri gn-auth-port auth-db-path gn-auth-secrets)
     (with-manifest (package->development-manifest gn-auth)
       (with-packages (list git-minimal nss-certs)
         (with-imported-modules '((guix build utils))
@@ -183,18 +195,18 @@ server described by CONFIG, a <genenetwork-configuration> object."
               (use-modules (guix build utils))
               ;; Configure gn-auth.
               (unless (file-exists? "/etc/genenetwork/conf/gn-auth.conf")
-              (with-output-to-file "/etc/genenetwork/conf/gn-auth.conf"
-                (lambda ()
-                  (display #$(string-append
-                         "LOGLEVEL=\"DEBUG\"\n"
-                         "SQL_URI=\"mysql://webqtlout:webqtlout@localhost/db_webqtl_local?unix_socket=/run/mysqld/mysqld.sock\"\n"
-                         "AUTH_DB=\"" auth-db-path "\"\n"
-                         "GN_AUTH_SECRETS=\"" gn-auth-secrets "\"\n"))
-                  (display "GN_AUTH_PROFILE=\"")
-                  (display #$(file-append (profile
-                                           (content (package->development-manifest gn-auth))
-                                           (allow-collisions? #t))
-                                          "\"\n")))))
+                (with-output-to-file "/etc/genenetwork/conf/gn-auth.conf"
+                  (lambda ()
+                    (display #$(string-append
+                                "LOGLEVEL=\"DEBUG\"\n"
+                                "SQL_URI=\"" sql-uri "\"\n"
+                                "AUTH_DB=\"" auth-db-path "\"\n"
+                                "GN_AUTH_SECRETS=\"" gn-auth-secrets "\"\n"))
+                    (display "GN_AUTH_PROFILE=\"")
+                    (display #$(file-append (profile
+                                             (content (package->development-manifest gn-auth))
+                                             (allow-collisions? #t))
+                                            "\"\n")))))
               (setenv "GN_AUTH_CONF" "/etc/genenetwork/conf/gn-auth.conf")
               (setenv "HOME" "/tmp")
               (setenv "AUTHLIB_INSECURE_TRANSPORT" "true")
@@ -205,43 +217,104 @@ server described by CONFIG, a <genenetwork-configuration> object."
                         "--workers" "8"
                         "gn_auth.wsgi:app"))))))))
 
-(define (genenetwork-activation config)
+(define (gn-uploader-gexp config)
   (match-record
       config <genenetwork-configuration>
-      (gn2-secrets gn3-secrets gn3-port gn-auth-port  auth-db-path gn-auth-secrets gn-doc-git-checkout)
-    (with-imported-modules '((guix build utils))
+      (sql-uri gn-uploader-port gn-uploader-data-directory
+               gn-uploader-secrets gn-auth-port
+               gn2-port gn-uploader-sessions-dir)
+    (with-manifest
+     (package->development-manifest gn-uploader)
+      (with-imported-modules '((guix build utils))
         #~(begin
             (use-modules (guix build utils)
                          (ice-9 ftw))
-            ;; Set ownership of files.
-            (for-each (lambda (file)
-                        (when (eq? (stat:type (stat file)) 'directory)
-                          (chmod file #o755))
-                        (chown file
-                               (passwd:uid (getpw "genenetwork"))
-                               (passwd:gid (getpw "genenetwork"))))
-                      (append
-                       '("/etc/genenetwork/conf" "/genenetwork2/flask_session")
-                       (find-files #$(dirname gn-auth-secrets)
-                                   #:directories? #t)
-                       (find-files #$(dirname gn2-secrets)
-                                   #:directories? #t)
-                       (find-files #$(dirname gn3-secrets)
-                                   #:directories? #t)
-                       (find-files #$(dirname auth-db-path)
-                                   #:directories? #t)
-                       (find-files #$(dirname gn-doc-git-checkout)
-                                   #:directories? #t)))
-            ;; Prevent other users from reading secret files.
-            (for-each (lambda (file)
-                        (chmod file #o600))
-                      (append
-                       (find-files #$gn-auth-secrets
-                                   #:directories? #f)
-                       (find-files #$gn2-secrets
-                                   #:directories? #f)
-                       (find-files #$gn3-secrets
-                                   #:directories? #f)))))))
+            (unless (file-exists? "/etc/genenetwork/conf/gn-uploader.conf")
+              (with-output-to-file "/etc/genenetwork/conf/gn-uploader.conf"
+                (lambda ()
+                  (display #$(string-append
+                              "UPLOADER_SECRETS=\"" gn-uploader-secrets "\"\n"
+                              "SQL_URI=\"" sql-uri "\"\n"
+                              "ASYNCHRONOUS_JOBS_SQLITE_DB=\"/var/genenetwork/gn-uploader.db\"\n"
+                              "UPLOAD_FOLDER=\"" gn-uploader-data-directory "\"\n"
+                              "AUTH_SERVER_URL=\"http://localhost:" (number->string gn-auth-port) "\"\n"
+                              "GN2_SERVER_URL=\"http://localhost:" (number->string gn2-port) "\"\n"
+                              "SESSION_FILESYSTEM_CACHE_PATH=\"" gn-uploader-sessions-dir "\"\n"))
+                  (display "GN_UPLOADER_PROFILE=\"")
+                  (display #$(file-append (profile
+                                           (content (package->development-manifest gn-uploader))
+                                           (allow-collisions? #t))
+                                          "\"\n")))))
+            ;; Run gn-uploader
+            (with-directory-excursion "/gn-uploader"
+              ;; Configure Uploader
+              (setenv "UPLOADER_CONF" "/etc/genenetwork/conf/gn-uploader.conf")
+              (setenv "FLASK_APP" "scripts/qcapp_wsgi.py")
+              (setenv "FLASK_ENV" "development")
+              (setenv "FLASK_DEBUG" "1")
+              (setenv "ASYNCHRONOUS_JOBS_SQLITE_DB" "/var/genenetwork/gn-uploader.db")
+              (setenv "GN_UPLOADER_ENVIRONMENT"
+                      #$(profile
+                         (content (package->development-manifest gn-uploader))
+                         (allow-collisions? #t)))
+              (invoke #$(file-append (profile
+                                      (content (package->development-manifest gn-uploader))
+                                      (allow-collisions? #t))
+                                     "/bin/flask")
+                      "run"
+                      #$(string-append "--port=" (number->string gn-uploader-port)))))))))
+
+(define (genenetwork-activation config)
+  (match-record
+      config <genenetwork-configuration>
+      (gn2-secrets
+       gn3-secrets gn3-port gn-auth-port
+       auth-db-path gn-auth-secrets gn-doc-git-checkout
+       gn-uploader-data-directory
+       gn-uploader-secrets
+       gn-uploader-sessions-dir)
+    (with-imported-modules '((guix build utils))
+      #~(begin
+          (use-modules (guix build utils)
+                       (ice-9 ftw))
+          ;; Set ownership of files.
+          (for-each (lambda (file)
+                      (when (eq? (stat:type (stat file)) 'directory)
+                        (chmod file #o755))
+                      (chown file
+                             (passwd:uid (getpw "genenetwork"))
+                             (passwd:gid (getpw "genenetwork"))))
+                    (append
+                     '("/etc/genenetwork/conf" "/genenetwork2/flask_session"
+                       "/gn-uploader/flask_session")
+                     (find-files #$(dirname gn-auth-secrets)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn2-secrets)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn3-secrets)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn-uploader-secrets)
+                                 #:directories? #t)
+                     (find-files #$(dirname auth-db-path)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn-doc-git-checkout)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn-uploader-data-directory)
+                                 #:directories? #t)
+                     (find-files #$(dirname gn-uploader-sessions-dir)
+                                 #:directories? #t)))
+          ;; Prevent other users from reading secret files.
+          (for-each (lambda (file)
+                      (chmod file #o600))
+                    (append
+                     (find-files #$gn-auth-secrets
+                                 #:directories? #f)
+                     (find-files #$gn2-secrets
+                                 #:directories? #f)
+                     (find-files #$gn3-secrets
+                                 #:directories? #f)
+                     (find-files #$gn-uploader-secrets
+                                 #:directories? #f)))))))
 
 (define (gn-guile-gexp gn-guile-port)
   (with-imported-modules '((guix build utils))
@@ -261,7 +334,15 @@ server described by CONFIG, a <genenetwork-configuration> object."
   "Return shepherd services to run the genenetwork development server
 described by CONFIG, a <genenetwork-configuration> object."
   (match-record config <genenetwork-configuration>
-                (gn2-port gn3-port gn-auth-port genotype-files data-directory xapian-db-path gn2-secrets auth-db-path gn-auth-secrets llm-db-path gn-doc-git-checkout gn-guile-port)
+                (gn2-port
+                 gn3-port gn-auth-port genotype-files
+                 data-directory xapian-db-path gn2-secrets
+                 auth-db-path gn-auth-secrets
+                 llm-db-path gn-doc-git-checkout
+                 gn-guile-port
+                 gn-uploader-port
+                 gn-uploader-data-directory
+                 gn-uploader-sessions-dir)
     (list (shepherd-service
            (documentation "Run gn-guile server.")
            (provision '(gn-guile))
@@ -424,6 +505,49 @@ described by CONFIG, a <genenetwork-configuration> object."
                      #:log-file "/var/log/genenetwork3.log"))
            (stop #~(make-kill-destructor)))
           (shepherd-service
+           (documentation "Run gn-uploader")
+           (provision '(gn-uploader))
+           (requirement '(networking))
+           (start #~(make-forkexec-constructor
+                     (list #$(least-authority-wrapper
+                              (program-file "gn-uploader"
+                                            (gn-uploader-gexp config))
+                              #:name "gn-uploader-pola-wrapper"
+                              #:mappings (list (file-system-mapping
+                                                (source "/gn-uploader")
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source "/run/mysqld")
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source "/tmp")
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source "/var/genenetwork/gn-uploader.db")
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source "/etc/genenetwork/conf")
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source gn-uploader-data-directory)
+                                                (target source)
+                                                (writable? #t))
+                                               (file-system-mapping
+                                                (source gn-uploader-sessions-dir)
+                                                (target source)
+                                                (writable? #t)))
+                              #:namespaces (delq 'net %namespaces))
+                           "127.0.0.1" #$(number->string gn-uploader-port))
+                     #:user "genenetwork"
+                     #:group "genenetwork"
+                     #:log-file "/var/log/gn-uploader.log"))
+           (stop #~(make-kill-destructor)))
+          (shepherd-service
            (documentation "Run gn-auth development server.")
            (provision '(gn-auth))
            (requirement '(networking))
diff --git a/genenetwork-local-container.sh b/genenetwork-local-container.sh
index 5a81e61..0108390 100755
--- a/genenetwork-local-container.sh
+++ b/genenetwork-local-container.sh
@@ -33,6 +33,8 @@ SYSTEM_DIRECTORIES=(
     "$BASE_DIR/var/lib/redis"
     "$BASE_DIR/var/lib/virtuoso"
     "$BASE_DIR/var/lib/data"
+    "$BASE_DIR/var/lib/gn-uploader/data"
+    "$BASE_DIR/var/lib/gn-uploader/sessions"
     "$BASE_DIR/var/lib/xapian"
     "$BASE_DIR/var/genenetwork/genotype-files/genotype/json"
     "$BASE_DIR/var/lib/genenetwork-sqlite"
@@ -46,15 +48,18 @@ GN_PROJECTS=(
     "gn-transform-databases:https://git.genenetwork.org/gn-transform-databases/"
     "gn-auth:https://git.genenetwork.org/gn-auth"
     "gn-docs:https://git.genenetwork.org/gn-docs"
+    "gn-uploader:https://git.genenetwork.org/gn-uploader"
 )
 
 # File mappings: source -> destination
 declare -A FILE_MAPPINGS=(
     ["etc/auth.db"]="$BASE_DIR/var/genenetwork/auth.db"
+    ["etc/gn-uploader.db"]="$BASE_DIR/var/genenetwork/gn-uploader.db"
     ["etc/llm.db"]="$BASE_DIR/var/lib/genenetwork-sqlite/llm.db"
     ["etc/gn2-secrets.py"]="$BASE_DIR/etc/genenetwork/conf/gn2/secrets.py"
     ["etc/gn3-secrets.py"]="$BASE_DIR/etc/genenetwork/conf/gn3/secrets.py"
     ["etc/gn-auth-secrets.py"]="$BASE_DIR/etc/genenetwork/conf/gn-auth/secrets.py"
+    ["etc/gn-uploader-secrets.py"]="$BASE_DIR/etc/genenetwork/conf/gn-uploader/secrets.py"
 )
 
 CONTAINER_SCM="genenetwork-local-container.scm"
@@ -197,18 +202,22 @@ if [ "$1" = "--init-container" ]; then
 	fi
     done
 
-    FLASK_SESSION="$BASE_DIR/genenetwork2/flask_session"
-    log "INFO" "Checking FLASK_SESSION directory: $FLASK_SESSION"
-    if [ ! -d "$FLASK_SESSION" ]; then
-	log "INFO" "Creating FLASK_SESSION directory: $FLASK_SESSION"
-	if ! mkdir -p "$FLASK_SESSION"; then
-            log "ERROR" "Failed to create FLASK_SESSION directory: $FLASK_SESSION"
-            exit 1
+    FLASK_SESSIONS=(
+	"gn-uploader:$BASE_DIR/gn-uploader/flask_session"
+	"genenetwork2:$BASE_DIR/genenetwork2/flask_session"
+    )
+    for flask_session in "${FLASK_SESSIONS[@]}"; do
+	IFS=':' read -r project session_dir <<< "$flask_session"
+	if [ ! -d "$session_dir" ]; then
+	    log "INFO" "Creating FLASK_SESSION directory: $session_dir"
+	    if ! mkdir -p "$session_dir"; then
+		log "ERROR" "Failed to create FLASK_SESSION directory: $session_dir"
+		exit 1
+	    fi
+	else
+	    log "DEBUG" "FLASK_SESSION directory already exists: $session_dir"
 	fi
-    else
-	log "DEBUG" "FLASK_SESSION directory already exists: $FLASK_SESSION"
-    fi
-
+    done
 
     # Verify container SCM file exists
     if [ ! -f "$CONTAINER_SCM" ]; then
@@ -226,8 +235,11 @@ if [ "$1" = "--init-container" ]; then
 	"--share=$BASE_DIR/var/lib/redis=/var/lib/redis"
 	"--share=$BASE_DIR/var/lib/virtuoso=/var/lib/virtuoso"
 	"--share=$BASE_DIR/var/lib/data=/var/lib/data"
+	"--share=$BASE_DIR/var/lib/gn-uploader/data=/var/lib/gn-uploader/data"
+	"--share=$BASE_DIR/var/lib/gn-uploader/sessions=/var/lib/gn-uploader/sessions"
 	"--share=$BASE_DIR/genenetwork2=/genenetwork2"
 	"--share=$BASE_DIR/genenetwork3=/genenetwork3"
+	"--share=$BASE_DIR/gn-uploader=/gn-uploader"
 	"--share=$BASE_DIR/gn-auth=/gn-auth"
 	"--share=$BASE_DIR/var/lib/xapian=/var/lib/xapian"
 	"--share=$BASE_DIR/var/lib/genenetwork-sqlite=/var/lib/genenetwork-sqlite"