Starting Dataverse-Globus app in production

85 views
Skip to first unread message

Kirill Batyuk

unread,
Jul 24, 2025, 10:39:52 AMJul 24
to dataverse...@googlegroups.com

Hello,

I was able to run dataverse-globus app (https://github.com/gdcc/dataverse-globus) on my local machine. However, I do not understand the last step in bringing it to production.

After I do this step: “To build run ng build --base-href=path_to_globus_app” what do I do next? What is needed to run it on the server? What starts the app and from where?

Thank you,

 

Kirill Batyuk A button for name playback in email signature

Systems Librarian

MBLWHOI Library

Data Library and Archives

Woods Hole Oceanographic Institution

508-289-2850

kba...@whoi.edu

mblwhoilibrary.org -- whoi.edu

 

Philip Durbin

unread,
Jul 31, 2025, 9:11:53 AMJul 31
to dataverse...@googlegroups.com
Hi Kirill,

It's a good question. It sounds like the documentation needs to be improved. Can you please open an issue at https://github.com/gdcc/dataverse-globus/issues ?

Thanks!

Phil

p.s. I think it's just a static site that runs client-side, but I could be wrong!

--
You received this message because you are subscribed to the Google Groups "Dataverse Users Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dataverse-commu...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/dataverse-community/SJ2PR16MB57966A2D3CCC4DDB256806FAC25EA%40SJ2PR16MB5796.namprd16.prod.outlook.com.


--

Kirill Batyuk

unread,
Jul 31, 2025, 9:24:00 AMJul 31
to dataverse...@googlegroups.com

Hi Phil,

I think I was able to run it. I can write documentation once I get everything sorted out.

I’m trying to sort out a problem I’ve run into with Dataverse not accepting a signed URL from dataverse-globus app server. At least that's what I think is happening. Once I figure it out, I should be able to write everything up.

The app is running, with nginx serving it on a dedicated server. So that’s a great progress. But, it fails on the very last step when it returns a signed url to the Dataverse.

-Kirill

 

Kirill Batyuk A button for name playback in email signature

Systems Librarian

MBLWHOI Library

Data Library and Archives

Woods Hole Oceanographic Institution

508-289-2850

kba...@whoi.edu

mblwhoilibrary.org -- whoi.edu

 

 

 

From: dataverse...@googlegroups.com <dataverse...@googlegroups.com> On Behalf Of Philip Durbin
Sent: Thursday, July 31, 2025 9:12 AM
To: dataverse...@googlegroups.com
Subject: [EXTERNAL] Re: [Dataverse-Users] Starting Dataverse-Globus app in production

 

This email originated outside of WHOI. Please use caution if clicking on links or opening attachments.

James Myers

unread,
Aug 1, 2025, 9:35:33 AMAug 1
to dataverse...@googlegroups.com
You should be able to turn on fine logging for the SignerUtil class via payaya and see what Dataverse is receiving and how it is different from what's expected. I'm out of office at the moment and can't easily provide details on how to do those steps. 
--  Jim


From: dataverse...@googlegroups.com <dataverse...@googlegroups.com> on behalf of Kirill Batyuk <kba...@whoi.edu>
Sent: Thursday, July 31, 2025 9:23:52 AM
To: dataverse...@googlegroups.com <dataverse...@googlegroups.com>
Subject: RE: [EXTERNAL] Re: [Dataverse-Users] Starting Dataverse-Globus app in production
 

Philip Durbin

unread,
Aug 1, 2025, 10:04:45 AMAug 1
to dataverse...@googlegroups.com

Kirill Batyuk

unread,
Aug 1, 2025, 10:18:23 AMAug 1
to dataverse...@googlegroups.com

Thank you! I don’t see an option for SignerUrl when I run ./asadmin list-log-levels

 

Here is what I get. Is it under a different logging parameter?
./asadmin list-log-levels

ShoalLogger     <CONFIG>

com.hazelcast   <WARNING>

com.sun.enterprise.server.logging.GFFileHandler <ALL>

com.sun.enterprise.server.logging.SyslogHandler <ALL>

jakarta.mail    <INFO>

java.util.logging.ConsoleHandler        <FINEST>

javax.enterprise.resource.corba <INFO>

javax.enterprise.resource.javamail      <INFO>

javax.enterprise.resource.jdo   <INFO>

javax.enterprise.resource.jms   <INFO>

javax.enterprise.resource.jta   <INFO>

javax.enterprise.resource.resourceadapter       <INFO>

javax.enterprise.resource.sqltrace      <FINE>

javax.enterprise.resource.webcontainer.jsf.application  <INFO>

javax.enterprise.resource.webcontainer.jsf.config       <INFO>

javax.enterprise.resource.webcontainer.jsf.context      <INFO>

javax.enterprise.resource.webcontainer.jsf.facelets     <INFO>

javax.enterprise.resource.webcontainer.jsf.lifecycle    <INFO>

javax.enterprise.resource.webcontainer.jsf.managedbean  <INFO>

javax.enterprise.resource.webcontainer.jsf.renderkit    <INFO>

javax.enterprise.resource.webcontainer.jsf.resource     <INFO>

javax.enterprise.resource.webcontainer.jsf.taglib       <INFO>

javax.enterprise.resource.webcontainer.jsf.timing       <INFO>

javax.enterprise.system.container.cmp   <INFO>

javax.enterprise.system.container.ejb   <INFO>

javax.enterprise.system.container.ejb.mdb       <INFO>

javax.enterprise.system.container.web   <INFO>

javax.enterprise.system.core.classloading       <INFO>

javax.enterprise.system.core.config     <INFO>

javax.enterprise.system.core    <INFO>

javax.enterprise.system.core.security   <INFO>

javax.enterprise.system.core.selfmanagement     <INFO>

javax.enterprise.system.core.transaction        <INFO>

javax.enterprise.system <INFO>

javax.enterprise.system.ssl.security    <INFO>

javax.enterprise.system.tools.admin     <INFO>

javax.enterprise.system.tools.backup    <INFO>

javax.enterprise.system.tools.deployment.common <WARNING>

javax.enterprise.system.tools.deployment.dol    <WARNING>

javax.enterprise.system.tools.deployment        <INFO>

javax.enterprise.system.util    <INFO>

javax.enterprise.system.webservices.registry    <INFO>

javax.enterprise.system.webservices.rpc <INFO>

javax.enterprise.system.webservices.saaj        <INFO>

javax   <INFO>

javax.mail      <INFO>

javax.org.glassfish.persistence <INFO>

org.apache.catalina     <INFO>

org.apache.coyote       <INFO>

org.eclipse.persistence.session <INFO>

org.glassfish.admingui  <INFO>

org.glassfish.naming    <INFO>

org.glassfish.wasp      <INFO>

org.jvnet.hk2.osgiadapter       <INFO>

 

 

Thank you,

-Kirill.

Philip Durbin

unread,
Aug 1, 2025, 11:18:14 AMAug 1
to dataverse...@googlegroups.com
Hmm, are you using a classic or Docker-based installation of Dataverse?

Also, it might be easier to chat in https://chat.dataverse.org . You could start a topic in #troubleshooting and we could summarize back here on the mailing list afterwards. Up to you.

Kirill Batyuk

unread,
Aug 1, 2025, 11:19:30 AMAug 1
to dataverse...@googlegroups.com

James Myers

unread,
Aug 1, 2025, 12:07:48 PMAug 1
to dataverse...@googlegroups.com
It doesn't list any classes that haven't been set before. 
Asadmin set-log-levels edu.harvard.iq.dataverse.util
SignerUtil=FINE 
Hopefully. It won't complain if you have the path/name wrong, so check the code base.
Sent: Friday, August 1, 2025 11:19:22 AM

Kirill Batyuk

unread,
Aug 1, 2025, 2:06:48 PMAug 1
to dataverse...@googlegroups.com

Thank you, Jim,

After after adding  logging I see the following:


[2025-08-01T13:59:38.036-0400] [Payara 6.2025.2] [FINE] [] [edu.harvard.iq.dataverse.util.UrlSignerUtil] [tid: _ThreadID=77 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1754071178036] [levelValue: 500] [CLASSNAME: edu.harvard.iq.dataverse.util.UrlSignerUtil] [METHODNAME: isValidUrl] [[String to hash: http://dataverse.whoi.edu/api/v1/datasets/4266/globusUploadParameters?locale=en&until=2025-08-01T14:04:30.897&user=kbatyuk&method=GET&token=<key>]]

 

[2025-08-01T13:59:38.036-0400] [Payara 6.2025.2] [FINE] [] [edu.harvard.iq.dataverse.util.UrlSignerUtil] [tid: _ThreadID=77 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1754071178036] [levelValue: 500] [CLASSNAME: ed                                                                                                                        u.harvard.iq.dataverse.util.UrlSignerUtil] [METHODNAME: isValidUrl] [[Calculated Hash: OMITTED JUST IN CASE]]

 

[2025-08-01T13:59:38.036-0400] [Payara 6.2025.2] [FINE] [] [edu.harvard.iq.dataverse.util.UrlSignerUtil] [tid: _ThreadID=77 _ThreadName=http-thread-pool::http-listener-1(4)] [timeMillis: 1754071178036] [levelValue: 500] [CLASSNAME: ed                                                                                                                        u.harvard.iq.dataverse.util.UrlSignerUtil] [METHODNAME: isValidUrl] [[Hash doesn't match]]

 

-Kirill.

Kirill Batyuk

unread,
Aug 5, 2025, 10:25:47 AMAug 5
to dataverse...@googlegroups.com

Got this figured out, the problem with the signed URL was caused by AJP not being implemented. Since this configuration was described in the Shibboleth installation, and we currently do not use Shibboleth with our installation, I have skipped this part of the documentation.

This part: https://guides.dataverse.org/en/latest/installation/shibboleth.html#ajp

After I added  “ProxyPass / ajp://localhost:8009/” to ssl.conf, everything started to work.

Message has been deleted

Leonid Andreev

unread,
Aug 7, 2025, 5:31:13 PMAug 7
to Dataverse Users Community
It sounds like you got it to work by now. But just for reference, this is how we have it installed on our own prod. servers: 
We have the webapp built and served, as static content, under Apache: 

$ find /var/www/html/globus -type f 
/var/www/html/globus/cloud.png
/var/www/html/globus/main.js
/var/www/html/globus/polyfills.js
/var/www/html/globus/styles.css
/var/www/html/globus/runtime.js
/var/www/html/globus/vendor.js
/var/www/html/globus/main.js.map
/var/www/html/globus/polyfills.js.map
/var/www/html/globus/styles.css.map
/var/www/html/globus/runtime.js.map
/var/www/html/globus/vendor.js.map
/var/www/html/globus/favicon.ico
/var/www/html/globus/assets/cloud.png
/var/www/html/globus/assets/config.json
/var/www/html/globus/assets/recycleBin.png
/var/www/html/globus/assets/i18n/en.json
/var/www/html/globus/assets/i18n/fr.json
/var/www/html/globus/index.html

This is what I have in the index.html file: 

$ cat /var/www/html/globus/index.html 
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Globus</title>
  <base href="https://dataverse.harvard.edu/globus/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&amp;display=swap" rel="stylesheet">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="styles.css"></head>
<body class="mat-typography">
  <app-root></app-root>
<script src="runtime.js" type="module"></script><script src="polyfills.js" type="module"></script><script src="vendor.js" type="module"></script><script src="main.js" type="module"></script></body>
</html>

Then I had to add the following rewrite rules to my Apache configuration to get it to work: 

RewriteRule  ^/globus/upload     https://dataverse.harvard.edu/globus/index.html   [PT]
RewriteRule  ^/globus/download     https://dataverse.harvard.edu/globus/index.html   [PT]

Finally, I am making sure that requests for the globus webapp are not sent to Payara/Dataverse via ajp, with an extra ProxyPassMatch rule (but you must be doing that already): 

...
ProxyPassMatch ^/globus !
...
# pass everything else to Payara:
ProxyPass / ajp://localhost:8009/ timeout=1800
Best of luck with this stuff!
As I said in the github issue, I'm interested in comparing notes. Since this Globus integration is still pretty wild and exotic and not widely adopted. 

Kirill Batyuk

unread,
Aug 7, 2025, 7:23:00 PMAug 7
to dataverse...@googlegroups.com

Here is how I have it installed. It lives on its own little VM machine running RHEL 9. 2CPUs, 6GB of RAM and 80 GB of storage.

The dataverse-globus app is served by Nginx.

The app files are location:
/usr/share/nginx/html/globus/3rdpartylicenses.txt

/usr/share/nginx/html/globus/assets/cloud.png

/usr/share/nginx/html/globus/assets/config.json

/usr/share/nginx/html/globus/assets/i18n/en.json

/usr/share/nginx/html/globus/assets/i18n/fr.json

/usr/share/nginx/html/globus/assets/recycleBin.png

/usr/share/nginx/html/globus/assets/sample-mp4-file.mp4

/usr/share/nginx/html/globus/cloud.5064fa9a0a6569b6.png

/usr/share/nginx/html/globus/favicon.ico

/usr/share/nginx/html/globus/index.html

/usr/share/nginx/html/globus/main.abf74d8958a5fe41.js

/usr/share/nginx/html/globus/polyfills.400950b57abdf2e9.js

/usr/share/nginx/html/globus/runtime.0ccea38e6c987fc6.js

/usr/share/nginx/html/globus/styles.fe09e559e65ef7e1.css

 

Note that the file names have additional characters in them; this is because the app was compiled for production.

 

Here is the Nginx config. Nothing fancy at all in it.

 

server {

    listen 443 ssl;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    ssl_certificate /etc/pki/tls/certs/dvglobus_whoi_edu_cert.cer;

    ssl_certificate_key /etc/pki/tls/private/key.key;

    server_name dvglobus.whoi.edu;

 

    root /usr/share/nginx/html/globus/;

 

    # Serve index.html for all not-found paths

    location / {

        proxy_set_header X-Forwarded-Proto https;

        try_files $uri $uri/ /index.html;

    }

 

    # Serve static assets with proper cache headers

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {

        expires 30d;

        add_header Cache-Control "public, no-transform";

    }

}

 

 

In Apache ssl.conf on the Dataverse app server I have added right at the end before </VirtualHost>


ProxyPass / ajp://localhost:8009/

 

I’ve also created a pull request into the app instructions on how to move it to production:

See section Deploying production with NGINX: https://github.com/gdcc/dataverse-globus

 

Let me know if you would like info on how my Dataverse JVM options are set up.

Leonid Andreev

unread,
Aug 11, 2025, 12:07:38 AMAug 11
to Dataverse Users Community
Thank you for sharing! 
(also, please note that I'm away on vacation this week)
Reply all
Reply to author
Forward
0 new messages