Skip to content

System Requirements

Operating System

The following operating systems are supported:

  • Red Hat Enterprise Linux 8
  • Red Hat Enterprise Linux 9

Networking Requirements

DNS Configuration

All hosts should have properly configured DNS records, including:

  • Forward DNS records (A/AAAA records)
  • Reverse DNS pointer records (PTR records)

Forward and reverse DNS records are used by various system components to communicate with each other. Additionally, the Ansible playbook uses the ansible_fqdn variable as a default value, which requires a properly configured reverse DNS record.

Server Software Packages

Tip

If running the Ansible playbook with use_become=True, these packages are installed automatically.

The installation of VOR Stream requires the installation of common RHEL repository packages. These packages are enumerated by software component below.

All Servers (foundational)

To support a wide range of server OS versions as well as to be as self-contained as possible from other software that may be on the system, Python 3.11 is compiled from source. This requires the following packages.

  • autoconf
  • bzip2
  • bzip2-devel
  • expat-devel
  • findutils
  • gcc-c++
  • gdb
  • gdbm-devel
  • glibc-devel
  • gmp-devel
  • libffi-devel
  • libX11-devel
  • make
  • mesa-libGL-devel
  • ncurses-devel
  • net-tools
  • openssl
  • openssl-devel
  • pkgconf-pkg-config
  • python-rpm-macros
  • readline-devel
  • sqlite-devel
  • systemtap-sdt-devel
  • tar
  • tcl-devel
  • tk-devel
  • xz
  • xz-devel
  • zlib-devel

RHEL 9 package install notes

If installing on RHEL 9, the glibc-langpack-en package is required. Also, in RHEL 9, some packages have moved to the crb repository, which can be enabled with the --enablerepo=crb option when running the dnf command. If installing these packages using the provided Ansible playbook, the crb repository is enabled by default.

PostgreSQL

  • gcc
  • make (3.80 or later required)
  • openssl-devel (1.0.1 or later required)
  • readline
  • readline-devel
  • zlib

Packages required for generating PostgreSQL documentation

  • docbook-dtds
  • docbook-style-xsl
  • fop
  • libxslt

Compute Server

  • gcc
  • gcc-c++
  • gd-devel
  • openssh-server
  • unzip

Web Server

  • libicu (required for Syncfusion service)

Django

  • gcc
  • mailcap
  • openldap-devel
  • pcre
  • pcre-devel
  • unixODBC-devel

Additional packages needed for integration with Microsoft SQL Server

When deploying VOR Stream with Microsoft SQL Server as a backend for Django, the following packages are required:

  • unixODBC-devel
  • ODBC Driver 18 for SQL Server or later (see Microsoft's documentation for installation instructions). Prior versions of the driver will not work.

RabbitMQ

Erlang RPMs are available from the rabbitmq/erlang-rpm repository. VOR Stream ships with and uses Erlang 27.3.4.18. Install the appropriate RPM for your architecture.

OS Version Architecture RPM Download
RHEL 8 x86_64 erlang-27.3.4.18-1.el8.x86_64.rpm
RHEL 8 Arm erlang-27.3.4.18-1.el8.aarch64.rpm
RHEL 9 x86_64 erlang-27.3.4.18-1.el9.x86_64.rpm
RHEL 9 Arm erlang-27.3.4.18-1.el9.aarch64.rpm

Below is an example of how to install the Erlang RPM for RHEL 9 x86_64.

sudo dnf install https://github.com/rabbitmq/erlang-rpm/releases/download/v27.3.4.18/erlang-27.3.4.18-1.el9.x86_64.rpm

OS User and Group

The install user and group are defined in the hosts.ini file. The default values are vor_user=vrisk and vor_group=vrisk, but these can be overridden to use any user and group defined on the system. They must exist on the system before the Ansible playbook is run unless running as a priviledged user with use_become=True, in which case the user and group will be created by the Ansible playbook.

File Descriptor Limits

All VOR Stream services run under a single supervisord instance as the vor_user (default vrisk) and share that user's per-process open file (nofile) limit. The default limit on RHEL is 1024, which is too low for a production deployment:

  • RabbitMQ uses one file descriptor per client connection, plus descriptors for each classic queue's on-disk index and message store files. When it runs out, it logs Ranch acceptor reducing accept rate: out of file descriptors, refuses new connections, and crashes queues on startup with {error, emfile} ("too many open files").
  • Consul is given a connection cap that the Ansible deployment derives from this limit: at deploy time it subtracts 20 from the limit in effect then and takes whichever is lower, that figure or 10000, as http_max_conns_per_client (see consul_http_max_conns_per_client in the inventory file reference). A low limit therefore throttles Consul as well, and because the cap is computed at deploy time it can lag the running limit until the playbook is next applied.

Warning

Raise the nofile limit for the vor_user to at least 65536, the value recommended by RabbitMQ.

Tip

In a non-root deployment, running the Ansible playbook with use_become=True sets this automatically: the foundation playbook writes /etc/security/limits.d/99-vor-nofile.conf (configurable through the vor_user_max_open_files variable). Services pick the limit up from supervisord when it starts, so if supervisord was already running before the limit changed, restart it (or reboot the host) for the new value to reach RabbitMQ and the other services.

Because supervisord runs as the unprivileged vor_user when supervisord_root_deployment=False, it cannot raise its own hard limit, which is why this OS-level file is required.

In a root deployment (supervisord_root_deployment=True), supervisord runs as root and drops to the vor_user for each service without re-applying PAM limits, so the broker inherits root's file descriptor limits rather than this file. Raise root's nofile limit accordingly if you run in that mode.

To confirm the limit took effect on a running host, check the broker process directly:

sudo sh -c 'p=$(pgrep -u vrisk -o beam.smp); grep "Max open files" /proc/$p/limits'

If that still reports the old limit after a restart, check that PAM applies limits to the session that starts supervisord. Limits under /etc/security/limits.d only apply to sessions that run pam_limits.so, and supervisord is started from a @reboot crontab entry, so /etc/pam.d/crond must include it. This is the default on RHEL 8 and 9, but a hardened image may have removed it.

Server Directories

Tip

If running the Ansible playbook with use_become=True, these directories are created automatically.

The install user must have recursive ownership to the following directories defined in the hosts.ini file:

  • vor_root
  • vor_log_directory

System Profile Script

The system profile script is used to automatically set up environment variables for the user's shell when they log in. It is located at {{ vor_root }}/etc/profile.d/{{ vor_stream_profile_script_name }}.sh. By default, the playbook will try to copy this script to the /etc/profile.d directory.

If running as a non-root user, the playbook will fail if the contents of the file do not match the expected contents. There are a few approaches to handle this situation:

  • Disable copying the profile script to /etc/profile.d by setting create_system_profile_script=False in the hosts.ini file.
  • Run the playbook with use_become=False and manually copy the generated profile script to the /etc/profile.d directory. For example:

    sudo cp /opt/vor/etc/profile.d/vor-stream.sh /etc/profile.d
    

Warning

If the profile script is not copied to the /etc/profile.d directory, the environment variables will not be set for the user's shell when they log in. They will need to manually source the profile script in their shell using a command like the following:

source /opt/vor/etc/profile.d/vor-stream.sh