See the official documentation here
In CentOS open the following yum package repository
#
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://couchdb.apache.org/repo/couchdb.repo
Edit the repo
vim /etc/yum.repos.d/couchdb.repo
Place the following text into the repo
[couchdb]
name=couchdb
baseurl=https://apache.jfrog.io/artifactory/couchdb-rpm/el$releasever/$basearch/
gpgkey=https://couchdb.apache.org/repo/keys.asc https://couchdb.apache.org/repo/rpm-package-key.asc
gpgcheck=1
repo_gpgcheck=1
enabled=1
In RedHat/CentOS run the command:
sudo yum -y install couchdb
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://couchdb.apache.org/repo/couchdb.repo
# Enable EPEL for the SpiderMonkey dependency
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release epel-next-release
sudo yum install -y mozjs78
sudo yum install -y couchdb
https://docs.couchdb.org/en/latest/install/upgrading.html
CouchDB 2.x and 3.x are explicitly designed to allow “mixed clusters” during the upgrade process. This allows you to perform a rolling restart across a cluster, upgrading one node at a time, for a zero downtime upgrade.
The update will update couchdb, make sure that the vm.args and local.ini are up to date.
Run the following snippet
erl -noshell -eval 'erlang:display(erlang:system_info(system_version))' -eval 'init:stop()'
sudo yum install erlang-reltool
sudo yum clean all
sudo yum -y install epel-release
sudo yum -y update
# if new kernel installed be sure it reboots
reboot now
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
wget --proxy=proxy_url 'http://proxy.dpw.gov.za:3128' https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git wget wxBase.x86_64
# now get the latest erlang package - we use 24 because clouseau needs it
wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_24.3.4.1-1~centos~7_amd64.rpm
rpm -i esl-erlang_24.3.4.1-1~centos~7_amd64.rpm
# If you get conflicts manually remove erlang 16
yum erase erlang-erts-R16B-03.18.el7.x86_64
# then install erlang again
rpm -i esl-erlang_24.3.4.1-1~centos~7_amd64.rpm
# in one case libodbc.so.2 needed, fix with
#error: Failed dependencies:
# libodbc.so.2()(64bit) is needed by esl-erlang-24.3.4.1-1.x86_64
yum install unixODBC
Configure couchdb installation
sudo vim /etc/systemd/system/clouseau.service
Add the following content, and remember to change the -Xmx parameter to the correct maximum memory that you require:
[Unit]
Description=Clouseau Search Engine
[Service]
User=couchdb
WorkingDirectory=/opt/clouseau
Environment="CLASSPATH=/opt/clouseau/*"
ExecStart=/usr/local/java/bin/java -server -Xmx12G -Dsun.net.inetaddr.ttl=30 -Dsun.net.inetaddr.negative.ttl=30 -Dlog4j.configuration=file:/opt/clouseau/log4j.properties -classpath '/opt/clouseau/*' com.cloudant.clouseau.Main /opt/clouseau/clouseau.ini
Restart=always
[Install]
WantedBy=multi-user.target
Reload and enable to start up automatically
sudo systemctl daemon-reload
sudo systemctl start clouseau
sudo systemctl enable clouseau
Check that it is working using:
sudo systemctl status clouseau
If the service fails with a message that the Unit clouseau.service could not be found, the problem may be with selinux
If SELinux is enforcing, it might block access. Temporarily test with SELinux disabled:
sudo setenforce 0
sudo systemctl start clouseau
If this works, restore SELinux and fix the context:
sudo restorecon -Rv /etc/systemd/system/clouseau.service
sudo setenforce 1
cat /etc/redhat-release
AlmaLinux release 8.10 (Cerulean Leopard)
[root@kwantustaging02 opt]# uname -m
x86_64
[root@kwantustaging02 opt]#
Perfect — thanks.
You are on AlmaLinux 8.10 (x86_64), which confirms exactly what we should use.
Because Erlang Solutions is gone (502 is expected now), the correct, supported, and currently working solution is the Team RabbitMQ Erlang RPM repository, which officially provides Erlang/OTP 26 for EL8 and works cleanly on AlmaLinux.
Below is a clean, copy-paste safe procedure that will work on your server.
✅ Install Erlang/OTP 26 on AlmaLinux 8.10 (x86_64)
1️⃣ Add Team RabbitMQ Erlang repository (EL8)
sudo tee /etc/yum.repos.d/rabbitmq-erlang.repo << 'EOF'
[rabbitmq-erlang]
name=RabbitMQ Erlang RPM Repository
baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
metadata_expire=300
EOF
✔️ This repo explicitly supports EL8 (RHEL, AlmaLinux, Rocky).
2️⃣ Refresh DNF metadata
sudo dnf clean all
sudo dnf makecache
If this fails, stop here and tell me — it means outbound HTTPS is blocked.
3️⃣ Inspect available Erlang versions (optional but useful)
dnf list --showduplicates erlang
You should see entries similar to:
erlang.x86_64 26.2.2-1.el8 rabbitmq-erlang
4️⃣ Install Erlang 26
sudo dnf install -y erlang
5️⃣ Verify Erlang version (MANDATORY)
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
Expected output:
"26"
Also confirm:
erl
You should see:
Erlang/OTP 26 [erts-14.x] ...
Exit:
q().
6️⃣ Lock Erlang to 26.x (VERY IMPORTANT)
Prevents accidental upgrade to OTP 27 later.
sudo dnf install -y dnf-plugins-core
sudo dnf versionlock add erlang*
Verify:
dnf versionlock list
7️⃣ Sanity-check runtime libraries (CouchDB / Clouseau safe)
ldd $(which beam.smp) | egrep 'ssl|crypto|ncurses'
You should see:
✅ This setup is SAFE for
CouchDB 3.4 / 3.5
Clouseau 3.x
RabbitMQ 3.12+
Production systemd services
❌ What you should NOT do
❌ Don’t Why
Use Erlang Solutions repo Discontinued (502 errors)
Use AppStream Erlang Too old (OTP 23/24)
Use asdf for system services systemd won’t see it
If DNF fails to reach packagecloud
Run:
curl -I https://packagecloud.io/rabbitmq/erlang/el/8/x86_64/repodata/repomd.xml
If blocked, I’ll give you:
an offline RPM bundle
or internal mirror instructions using reposync + createrepo
Next things I can do for you
Erlang VM tuning for Clouseau (heap, scheduler, async threads)
Ansible role to deploy Erlang 26 across all nodes
Validate CouchDB 3.5 + Erlang 26 before upgrade
Safe OTP 24/25 → 26 rolling upgrade plan
Just tell me what’s next.
sudo dnf versionlock add erlang*
No such command: versionlock. Please use /bin/dnf --help
It could be a DNF plugin command, try: "dnf install 'dnf-command(versionlock)'"
Perfect — that error is expected on AlmaLinux 8.
The versionlock plugin is not installed by default.
Let’s fix it cleanly.
✅ Enable dnf versionlock on AlmaLinux 8
1️⃣ Install the versionlock plugin
sudo dnf install -y dnf-plugins-core
This package provides:
dnf versionlock
Verify:
dnf versionlock --help
2️⃣ Lock Erlang to 26.x
Now run:
sudo dnf versionlock add erlang*
Verify:
dnf versionlock list
You should see something like:
erlang-26..
3️⃣ Confirm Erlang version (final sanity check)
erl -eval 'erlang:display(erlang:system_info(otp_release)), halt().' -noshell
Expected:
"26"
ℹ️ Notes (important in production)
This prevents OTP 27 from being installed later
Security updates within 26.x will still apply
Safe for CouchDB / Clouseau / RabbitMQ
If you ever need to unlock later
sudo dnf versionlock delete erlang*
Optional next steps (recommended for your stack)
Tune Erlang VM flags for Clouseau 3.x
Create an Ansible task to install + lock Erlang on all nodes
Verify CouchDB 3.5 + Erlang 26 runtime compatibility
Say the word and I’ll generate it for you.
dnf versionlock
No such command: versionlock. Please use /usr/bin/dnf --help
It could be a DNF plugin command, try: "dnf install 'dnf-command(versionlock)'"
You’re very close — this is just a package naming detail on AlmaLinux 8.
On AlmaLinux 8, dnf-plugins-core does not always pull in versionlock.
You must install the explicit command package.
✅ Fix: Enable dnf versionlock on AlmaLinux 8.10
1️⃣ Install the versionlock command explicitly
sudo dnf install -y 'dnf-command(versionlock)'
This installs:
/usr/libexec/dnf-plugins/versionlock.py
2️⃣ Verify the command is now available
dnf versionlock --help
You should now see the help output.
3️⃣ Lock Erlang to 26.x
sudo dnf versionlock add erlang*
Verify:
dnf versionlock list
Expected:
erlang-26.*
4️⃣ If you want to lock exactly the installed build
Check installed version:
rpm -qa | grep '^erlang'
Then lock precisely (example):
sudo dnf versionlock add erlang-26.2.2-1.el8.*
ℹ️ Why this happens on AlmaLinux 8
EL8 modular DNF split commands into dnf-command(...) packages
dnf-plugins-core ≠ all plugin commands
versionlock is opt-in
🔐 Alternative (manual lock – works even without plugins)
If you want a plugin-free fallback:
sudo tee /etc/dnf/plugins/versionlock.list << 'EOF'
erlang-26.*
EOF
DNF will honor this file automatically if the plugin is present.