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.