Open OnDemand 4.0 install on SUSE Linux 15.6

Posted on Sun 12 October 2025 by Pavlo Khmel

Open OnDemand 4.0 does not support SUSE Linux. But it is still possible to install RPMs for Rocky Linux 9 with some adjustments.

This will be simplified configuration without Slurm. With basic apache2 authentication. And VNC Desktop and terminal will start on the same server.

Install SUSE Linux Enterprise Server 15.6 (Text Mode): - Basesystem Module - Server Application Module

Set hostname:

hostnamectl set-hostname ood-suse
systemctl disable apparmor
systemctl mask apparmor
systemctl stop apparmor
systemctl disable firewalld
systemctl stop firewalld

Adding open source software repository (OSS) + update + ruby:

zypper addrepo https://download.opensuse.org/distribution/leap/15.6/repo/oss/ opensuse-leap-main-15.6-oss
zypper addrepo https://download.opensuse.org/update/leap/15.6/sle/ opensuse-leap-update-15.6-sle
zypper addrepo https://download.opensuse.org/repositories/devel:languages:ruby/15.6/devel:languages:ruby.repo
zypper repos
zypper refresh

Install apache2:

zypper install apache2 apache2-devel apache2-mod_auth_openidc

Enable apache2 modules:

a2enmod headers
a2enmod auth_openidc
a2enmod proxy
a2enmod proxy_http
a2enmod lua
a2enmod ldap
a2enmod authnz_ldap
a2enmod rewrite

Important to install updated apache2. Release 2.4.58 works. Lower releases have issues with websocket csrf.

# rpm -qa | grep apache2
apache2-mod_auth_openidc-2.3.8-lp156.6.9.x86_64
apache2-prefork-2.4.58-150600.5.35.1.x86_64
apache2-devel-2.4.58-150600.5.35.1.x86_64
apache2-2.4.58-150600.5.35.1.x86_64
apache2-utils-2.4.58-150600.5.35.1.x86_64

Install Ruby 3.3:

zypper install ruby3.3 ruby3.3-devel

With option Solution 1: install ruby-common-3.2.1-lp156.173.1.noarch from vendor obs://build.opensuse.org/devel:languages:ruby

Change ruby and gem default versions:

mv /usr/bin/ruby /usr/bin/ruby.system
mv /usr/bin/gem /usr/bin/gem.system
update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby.system 25
update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby.ruby3.3 33
update-alternatives --install /usr/bin/gem gem /usr/bin/gem.system 25
update-alternatives --install /usr/bin/gem gem /usr/bin/gem.ruby3.3 33
update-alternatives --config ruby

# Change to 33 manual mode
#   1            /usr/bin/ruby.ruby3.3   33        manual mode

update-alternatives --config gem

# Change to 33 manual mode
  1            /usr/bin/gem.ruby3.3   33        manual mode

Check:

ruby -v
ruby 3.3.9 (2025-07-24 revision f5c772fc7c) [x86_64-linux-gnu]

gem -v
3.5.22

Installed nodejs 20.

zypper install nodejs20

Install Certbot 5.x version:

zypper install python311 python311-devel
zypper install augeas-devel
pip3.11 install certbot-apache

Check:

# certbot --version
certbot 5.1.0

Download Open OnDemand RPMs:

curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-4.0.7-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-ruby-4.0.3-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-passenger-6.0.23-3.ood4.0.3.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-runtime-4.0.3-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-dex-2.41.1-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-nginx-1.26.1-3.p6.0.23.ood4.0.3.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-nodejs-4.0.3-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-apache-4.0.3-1.el9.x86_64.rpm
curl -LJO https://yum.osc.edu/ondemand/4.0/web/el9/x86_64/ondemand-gems-4.0.7-1.el9.x86_64.rpm

Install RPMs. Most of them will complain. Select solution 2 "Solution 2: break ... by ignoring some of its dependencies":

zypper install lua-luaposix
zypper install ./ondemand-4.0.7-1.el9.x86_64.rpm
zypper install ./ondemand-runtime-4.0.3-1.el9.x86_64.rpm
zypper install ./ondemand-nginx-1.26.1-3.p6.0.23.ood4.0.3.el9.x86_64.rpm 
zypper install ./ondemand-nodejs-4.0.3-1.el9.x86_64.rpm
zypper install ./ondemand-ruby-4.0.3-1.el9.x86_64.rpm
zypper install ./ondemand-passenger-6.0.23-3.ood4.0.3.el9.x86_64.rpm 
zypper install ./ondemand-passenger-6.0.23-3.ood4.0.3.el9.x86_64.rpm
zypper install ./ondemand-apache-4.0.3-1.el9.x86_64.rpm
zypper install ./ondemand-dex-2.41.1-1.el9.x86_64.rpm

To avoid error:

error while loading shared libraries: libcrypt.so.2: cannot open shared object file: No such file or directory

Make soft link:

ln -s /usr/lib64/libcrypt.so.1 /usr/lib64/libcrypt.so.2

Install gems

gem install actioncable -v 7.0.8.5
gem install actionmailbox -v 7.0.8.5
gem install actionmailer -v 7.0.8.5
gem install actionpack -v 7.0.8.5
gem install actiontext -v 7.0.8.5
gem install actionview -v 7.0.8.5
gem install activejob -v 7.0.8.5
gem install activemodel -v 7.0.8.5
gem install activerecord -v 7.0.8.5
gem install activestorage -v 7.0.8.5
gem install activesupport -v 7.0.8.5
gem install addressable -v 2.8.7
gem install autoprefixer-rails -v 10.2.5.1
gem install bcrypt
gem install bigdecimal
gem install bootstrap_form -v 5.0.0
gem install browser -v 2.7.1
gem install builder -v 3.3.0
gem install bundler
gem install climate_control -v 0.2.0
gem install coffee-rails -v 5.0.0
gem install coffee-script -v 2.4.1
gem install coffee-script-source -v 1.12.2
gem install concurrent-ruby -v 1.3.4
gem install crass -v 1.0.6
gem install cssbundling-rails -v 1.4.1
gem install dalli -v 3.2.8
gem install date -v 3.4.1
gem install domain_name -v 0.6.20240107
gem install dotenv -v 2.8.1
gem install dotenv-rails -v 2.8.1
gem install dotiw -v 5.3.3
gem install erubi -v 1.13.1
gem install execjs -v 2.10.0
gem install ffi -v 1.16.3
gem install globalid -v 1.2.1
gem install http-accept -v 1.7.0
gem install http-cookie -v 1.0.8
gem install i18n -v 1.14.6
gem install jbuilder -v 2.13.0
gem install jsbundling-rails -v 1.3.1
gem install local_time -v 1.0.3
gem install logger -v 1.6.4
gem install lograge -v 0.14.0
gem install loofah -v 2.24.0
gem install mail -v 2.8.1
gem install marcel -v 1.0.4
gem install method_source -v 1.1.0
gem install mime-types -v 3.6.0
gem install mime-types-data -v 3.2024.1203
gem install mini_mime -v 1.1.5
gem install mini_portile2 -v 2.8.8
gem install minitest -v 5.25.4
gem install multi_json -v 1.15.0
gem install mustermann -v 3.0.3
gem install net-imap -v 0.3.7
gem install net-smtp -v 0.5.0
gem install netrc -v 0.11.0
gem install nio4r -v 2.7.4
gem install nokogiri -v 1.15.7
gem install ood_appkit -v 2.1.6
gem install ood_core -v 0.27.1
gem install ood_support -v 0.0.5
gem install public_suffix -v 5.1.1
gem install racc -v 1.8.1
gem install rack -v 2.2.10
gem install rack-protection -v 3.2.0
gem install rack-test -v 2.2.0
gem install rails -v 7.0.8.5
gem install rails-dom-testing -v 2.2.0
gem install rails-html-sanitizer -v 1.6.2
gem install railties -v 7.0.8.5
gem install rake -v 13.2.1
gem install redcarpet -v 3.6.0
gem install request_store -v 1.7.0
gem install rest-client -v 2.1.0
gem install rexml -v 3.4.0
gem install sinatra -v 3.2.0
gem install sinatra-contrib -v 3.2.0
gem install sprockets -v 4.2.1
gem install sprockets-rails -v 3.5.2
gem install thor -v 1.3.2
gem install tilt -v 2.5.0
gem install timeout -v 0.4.3
gem install turbo-rails -v 2.0.7
gem install tzinfo -v 2.0.6
gem install websocket-driver -v 0.7.7
gem install websocket-extensions -v 0.1.5
gem install zeitwerk -v 2.6.18
gem install zip_kit -v 6.3.1

replace apache with wwwrun in 3 files:

sed -i 's/apache/wwwrun/g' /opt/ood/nginx_stage/lib/nginx_stage/configuration.rb
sed -i 's/apache/wwwrun/g' /etc/sudoers.d/ood
sed -i 's/16color/256color/g' /var/www/ood/apps/sys/shell/app.js

Create directory:

mkdir /etc/ood/config/clusters.d/

Create file /etc/ood/config/clusters.d/myhpc.yml

---
v2:
  metadata:
    title: "myhpc"
  login:
    host: "ood-suse"
  job:
    adapter: "systemd"
    submit_host: "ood-suse"
    ssh_hosts:
      - ood-suse
    site_timeout: 7200
    debug: true
    strict_host_checking: false
  batch_connect:
    basic:
      script_wrapper: |
        module purge
        %s
      set_host: "host=$(hostname -s | awk '{print $1}')"
    vnc:
      script_wrapper: |
        module purge
        export PATH="/opt/TurboVNC/bin:$PATH"
        export WEBSOCKIFY_CMD="/usr/bin/websockify"
        %s
      set_host: "host=$(hostname -s | awk '{print $1}')"

Configuration with basic apache2 authentication /etc/ood/config/ood_portal.yml

---
servername: apps.myhpc.no
host_regex: '[^/]+'
node_uri: '/node'
rnode_uri: '/rnode'
auth:
  - 'AuthType Basic'
  - 'AuthName "private"'
  - 'AuthUserFile "/etc/apache2/.htpasswd"'
  - 'RequestHeader unset Authorization'
  - 'Require valid-user'
user_map_match: '^(.+)$'

Change first match:

# grep "DEFAULT_PREFIX" /opt/ood/ood-portal-generator/Rakefile
  DEFAULT_PREFIX = '/etc/httpd/conf.d'
. . .

To /etc/apache2/conf.d:

# grep "DEFAULT_PREFIX" /opt/ood/ood-portal-generator/Rakefile
  DEFAULT_PREFIX = '/etc/apache2/conf.d'
. . .

Change '/etc/httpd/conf.d/ood-portal.conf' to '/etc/apache2/conf.d/ood-portal.conf'

in the file: /opt/ood/ood-portal-generator/lib/ood_portal_generator/application.rb

. . .
        path = if OodPortalGenerator.debian?
                 '/etc/apache2/sites-available/ood-portal.conf'
               else
                 '/etc/httpd/conf.d/ood-portal.conf'
               end
. . .

Create log directory:

mkdir /srv/www/logs

Add local user and apache HTTP Basic auth user:

useradd -m bob
passwd bob
htpasswd -c /etc/apache2/.htpasswd bob

Also create ssh key for user bob so user can login to the same server. It is needed to start desktop locally.

su - bob
ssh-keygen
ssh-copy-id localhos

Optional settings for terminal applications. Create file: /etc/ood/config/apps/shell/env

OOD_SHELL_ORIGIN_CHECK='off'
OOD_SSHHOST_ALLOWLIST="localhost:server1:server2"
#OOD_SSH_WRAPPER=/var/www/ood/apps/sys/app_terminal/ssh_wrapper.sh
OOD_SHELL_INACTIVE_TIMEOUT_MS=36000000
OOD_SHELL_MAX_DURATION_MS=8640000000
OOD_SHELL_PING_PONG=true

Uncomment OOD_SSH_WRAPPER if you want to use tmux. tmux should be installed on the compute node.

Create directory:

mkdir -p /var/www/ood/apps/sys/app_terminal/

Wrapper file /var/www/ood/apps/sys/app_terminal/ssh_wrapper.sh:

#!/bin/bash
tmux_path=/usr/bin/
cmd="export TMPDIR=/tmp/\$USER/\$SLURM_JOB_ID ; \
test -d /tmp/\$USER/job_\$SLURM_JOB_ID/tmp/ && export TMPDIR=/tmp/\$USER/job_\$SLURM_JOB_ID/tmp; mkdir -p \$TMPDIR ; \
test -f /dev/shm/\$USER/\$SLURM_JOB_ID/persist_ssh && \
{ export PATH=\"$tmux_path:\$PATH\" ;  \
    { \
        test -f /dev/shm/\$USER/\$SLURM_JOB_ID/custom_tmux_conf && export _CSC_TMUX_CONF=\"\" \
        ||\
        export _CSC_TMUX_CONF='-f <(echo -e \"set -g status off\nsetw -g mouse on\"    )'  \
    ;} ; \
    { \
        tmux ls 2>/dev/null && tmux attach -t \$SLURM_JOB_ID &>/dev/null \
    ;} \
    || eval \"tmux \$_CSC_TMUX_CONF new-session -s \$SLURM_JOB_ID\" \
;} \
|| bash"
if [[ -z "$(echo "$@" | grep 'login'  )" ]]; then
    /usr/bin/ssh $@ -tt "$cmd"
else
    /usr/bin/ssh $@
fi

Make executable:

chmod +x /var/www/ood/apps/sys/app_terminal/ssh_wrapper.sh

Add line with cluster name to desktop app:

# head -n 2 /var/www/ood/apps/sys/bc_desktop/form.yml 
---
cluster: "myhpc"

On a SUSE compute node or node where ou will connect install:

zypper addrepo http://download.opensuse.org/distribution/leap/15.6/repo/oss/ opensuse-leap-oss
zypper refresh
zypper install tmux
zypper install xfce4-panel xfce4-session xfce4-settings xfconf thunar xfdesktop xfwm4 xfce4-terminal
curl -LJO https://github.com/TurboVNC/turbovnc/releases/download/3.2/turbovnc-3.2.x86_64.rpm
zypper install ./turbovnc-3.2.x86_64.rpm
pip3 install websockify