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(seeconsul_http_max_conns_per_clientin 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_rootvor_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.dby settingcreate_system_profile_script=Falsein thehosts.inifile. -
Run the playbook with
use_become=Falseand manually copy the generated profile script to the/etc/profile.ddirectory. 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