Skip to main content

Installing Twenty-One Encoder Docker

Twenty-One Encoder for ProxMox VE on Ubuntu

Pre-requisites:

  • Ubuntu 24.04 LTS AMD64
  • Linux Kernel 6.x - 2.6
  • PCI passthrough of Connectx network card
  • PCI passthrough of Nvidia GPU

1. Disable nouveau driver

sudo modprobe -r nouveau

2. Blacklist nouveau at boot

echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist.conf

3. Upgrade OS

sudo apt upgrade -y

4. Install Nvidia GPU driver

sudo apt-get update
sudo apt install nvidia-headless-535 nvidia-utils-535 libnvidia-encode-535
sudo modprobe nvidia
nvidia-smi

5. Install Docker CE

curl https://get.docker.com | sh && sudo systemctl --now enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
groups

6. Install Nvidia Container Toolkit

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update

export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
sudo apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

sudo nvidia-ctk runtime configure --runtime=docker

sudo systemctl restart docker

7. Install Docker Compose

sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version

8. Adjust firewall rules (if applicable)

sudo ufw allow 22/tcp comment 'accept SSH'
sudo ufw allow 80/tcp comment 'accept HTTP & HLS'
sudo ufw allow 443/tcp comment 'accept HTTPS & HLS'
sudo ufw allow 5353:7999/tcp comment 'accept NDI TCP'
sudo ufw allow 5353:7999/udp comment 'accept NDI UDP'
sudo ufw allow 1024:65535/udp comment 'accept MPEG-TS UDP/RTP/SRT'
sudo ufw allow 1935/tcp comment 'accept RTMP inputs'
sudo ufw allow from 192.168.0.0/24 to 224.0.0.0/24 proto igmp comment 'accept IGMP'
sudo ufw allow 319:320/udp comment 'accept PTP messages'
sudo ufw --force enable
sudo ufw status

Or disable:

sudo ufw disable
sudo ufw status

9. Increase max UDP kernel buffer size

SYSCTL_CONF="/etc/sysctl.d/10-udp-buffer-size.conf"
sudo sh -c "echo '#kernel send a receive windows buffer sizes' > $SYSCTL_CONF"
sudo sh -c "echo 'net.core.rmem_max=262144000' >> $SYSCTL_CONF"
sudo sh -c "echo 'net.core.wmem_max=262144000' >> $SYSCTL_CONF"
sudo sh -c "echo 'net.core.rmem_default=262144000' >> $SYSCTL_CONF"
sudo sh -c "echo 'net.core.wmem_default=262144000' >> $SYSCTL_CONF"
sudo sh -c "echo '' >> $SYSCTL_CONF"
sudo sysctl -p $SYSCTL_CONF

10. Increase txqueuelen for network interfaces

sudo bash -c 'cat > /etc/udev/rules.d/80-txqueuelen.rules' << EOF
SUBSYSTEM=="net", ACTION=="add|change", KERNEL=="e*", ATTR{tx_queue_len}="10000"
EOF

sudo udevadm control --reload-rules && sudo udevadm trigger

11. Install DOCA-OFED for Nvidia ConnectX

wget https://www.mellanox.com/downloads/DOCA/DOCA_v3.0.0/host/doca-host_3.0.0-058000-25.04-debian125_amd64.deb
sudo dpkg -i doca-host_3.0.0-058000-25.04-debian125_amd64.deb
sudo apt-get update
sudo apt-get -y install doca-all
sudo reboot

12. Install ptp4l

sudo apt install linuxptp

13. Create ptp4l.conf

sudo bash -c 'cat > /etc/linuxptp/ptp4l.conf' << EOF
[global]
domainNumber 127
priority1 255
priority2 255
slaveOnly 1
time_stamping hardware
tx_timestamp_timeout 30
use_syslog 1
logging_level 6
summary_interval 0
dscp_event 46
dscp_general 46
delay_mechanism E2E
hybrid_e2e 0
network_transport UDPv4
logAnnounceInterval -2
announceReceiptTimeout 3
logSyncInterval -3
logMinDelayReqInterval -3
message_tag [ptp4l:0:127]

[ens16f0np0]
EOF

14. Assign static IP addr to the Connectx NICs

sudo nano /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
ens18:
dhcp4: true
ens16f0np0:
dhcp4: no
addresses:
- 192.168.20.237/24
ens16f1np1:
dhcp4: no
addresses:
- 192.168.30.237/24
sudo netplan apply
sudo ip link set ens16f0np0 up
sudo ip link set ens16f1np1 up

Ping Grand Master to check connectivity.

15. phc2sys configuration

sudo bash -c 'cat > /etc/linuxptp/phc2sys.conf' << EOF
[global]
domainNumber 127
use_syslog 1
logging_level 6

# Socket for communication between ptp4l and phc2sys.

message_tag [ptp4l:0:127]
EOF

16. phc2sys systemd configuration

sudo nano /etc/systemd/system/phc2sys.service
[Unit]
Description=Synchronize system clock from PTP Hardware Clock via ptp4l
After=ptp4l.service
Requires=ptp4l.service

[Service]
ExecStart=/usr/sbin/phc2sys -a -r -f /etc/linuxptp/phc2sys.conf

[Install]
WantedBy=multi-user.target

17. ptp4l system configuration

sudo nano /etc/systemd/system/ptp4l.service
[Unit]
Description=PTP Boundary Clock Daemon (ptp4l)
After=network.target

[Service]
ExecStart=/usr/sbin/ptp4l -f /etc/linuxptp/ptp4l.conf -i ens16f0np0 -m
Restart=on-failure

[Install]
WantedBy=multi-user.target

18. Enable/Start ptp4l and phc2sys

sudo systemctl daemon-reload
sudo systemctl enable ptp4l.service
sudo systemctl enable phc2sys.service
sudo systemctl start ptp4l.service
sudo systemctl start phc2sys.service

19. Check status and sync of PTP

sudo systemctl status ptp4l.service
sudo systemctl status phc2sys.service

20. Expose C Groups v1

sudo nano /etc/default/grub

Edit line:

GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=0"
sudo update-grub
sudo reboot

Check if C Groups v1 are now exposed:

mount | grep '^cgroup' | awk '{print $1}' | uniq

21. Docker login

docker login --username comprimato

Token on transcoder dashboard.

22. Upload docker-compose.yml

Please contact support@comprimato.com for the docker-compose.yml for the Twenty-One Encoder docker, this differs from the docker-compose.yml for Live Transcoder that is available on the transcoder dashboard.

The example of 21 encoder's docker-compose yaml file is available HERE.

23. Start the 21 Encoder docker container

docker compose -f <RECEIVED-DOCKER-COMPOSE-FILE> up -d

24. Upload Rivermax.lic to container

After the 23rd step, the directory named rivermax is created in the directory where the received docker file is placed. Copy your rivermax.lic file into this folder by:

sudo cp rivermax.lic <YOUR-COMPOSE-FILE-DIRECTORY>/rivermax/

When it is done, the docker container does not need to be redeployed, and the 2110 pipelines can be used.