mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 16:55:37 +02:00
🐛 fix(server): Test out in the wild (#20)
## Description **What(what issue does this code solve/what feature does it add):** **How(how does it solve it):** ## Required Checklist: - [ ] I have added any necessary documentation and comments in my code (where appropriate) - [ ] I have added tests to make sure my code runs in all contexts ## Further comments
This commit is contained in:
@@ -1,28 +1,115 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
trap "echo TRAPed signal" HUP INT QUIT TERM
|
||||||
|
|
||||||
# Attempt to set capabilities
|
# Create and modify permissions of XDG_RUNTIME_DIR
|
||||||
# Gotten from https://git.dec05eba.com/gpu-screen-recorder/tree/install.sh
|
sudo -u user mkdir -pm700 /tmp/runtime-netris
|
||||||
#TODO: remove this
|
sudo chown user:user /tmp/runtime-netris
|
||||||
# setcap 'cap_sys_admin+ep' /usr/bin/gsr-kms-server
|
sudo -u user chmod 700 /tmp/runtime-netris
|
||||||
# setcap 'cap_sys_nice+ep' /usr/bin/gpu-screen-recorder
|
# Make user directory owned by the user in case it is not
|
||||||
|
sudo chown netris:netris /home/netris || sudo chown netris:netris /home/user/* || { echo "Failed to change user directory permissions. There may be permission issues."; }
|
||||||
|
# Remove directories to make sure the desktop environment starts
|
||||||
|
sudo rm -rf /tmp/.X* ~/.cache
|
||||||
|
# Change time zone from environment variable
|
||||||
|
sudo ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" | sudo tee /etc/timezone >/dev/null
|
||||||
|
# Add gamescope directory
|
||||||
|
export PATH="${PATH:+${PATH}:}/usr/local/games:/usr/games"
|
||||||
|
|
||||||
#Start dbus
|
# This symbolic link enables running Xorg inside a container with `-sharevts`
|
||||||
/etc/init.d/dbus start
|
sudo ln -snf /dev/ptmx /dev/tty7
|
||||||
|
# Start DBus without systemd
|
||||||
|
sudo /etc/init.d/dbus start
|
||||||
|
|
||||||
#Start Pulseaudio Reference: https://github.com/wanjohiryan/warp/blob/ad9cd38d21f0ac4332e64358e219b48e01871870/docker/nvidia/entrypoint.sh#L38
|
# Install NVIDIA userspace driver components including X graphic libraries
|
||||||
/usr/bin/pulseaudio -k >/dev/null 2>&1 || /usr/bin/pulseaudio --system --verbose --log-target=stderr -D --realtime=true --disallow-exit -L 'module-native-protocol-tcp auth-ip-acl=127.0.0.0/8 port=4713 auth-anonymous=1'
|
if ! command -v nvidia-xconfig &>/dev/null; then
|
||||||
pacmd load-module module-virtual-sink sink_name=vsink
|
# Driver version is provided by the kernel through the container toolkit
|
||||||
pacmd set-default-sink vsink
|
export DRIVER_ARCH="$(dpkg --print-architecture | sed -e 's/arm64/aarch64/' -e 's/armhf/32bit-ARM/' -e 's/i.*86/x86/' -e 's/amd64/x86_64/' -e 's/unknown/x86_64/')"
|
||||||
pacmd set-default-source vsink.monitor
|
export DRIVER_VERSION="$(head -n1 </proc/driver/nvidia/version | awk '{print $8}')"
|
||||||
|
cd /tmp
|
||||||
|
# If version is different, new installer will overwrite the existing components
|
||||||
|
if [ ! -f "/tmp/NVIDIA-Linux-${DRIVER_ARCH}-${DRIVER_VERSION}.run" ]; then
|
||||||
|
# Check multiple sources in order to probe both consumer and datacenter driver versions
|
||||||
|
curl -fsSL -O "https://international.download.nvidia.com/XFree86/Linux-${DRIVER_ARCH}/${DRIVER_VERSION}/NVIDIA-Linux-${DRIVER_ARCH}-${DRIVER_VERSION}.run" || curl -fsSL -O "https://international.download.nvidia.com/tesla/${DRIVER_VERSION}/NVIDIA-Linux-${DRIVER_ARCH}-${DRIVER_VERSION}.run" || {
|
||||||
|
echo "Failed NVIDIA GPU driver download. Exiting."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
# Extract installer before installing
|
||||||
|
sudo sh "NVIDIA-Linux-${DRIVER_ARCH}-${DRIVER_VERSION}.run" -x
|
||||||
|
cd "NVIDIA-Linux-${DRIVER_ARCH}-${DRIVER_VERSION}"
|
||||||
|
# Run installation without the kernel modules and host components
|
||||||
|
sudo ./nvidia-installer --silent \
|
||||||
|
--no-kernel-module \
|
||||||
|
--install-compat32-libs \
|
||||||
|
--no-nouveau-check \
|
||||||
|
--no-nvidia-modprobe \
|
||||||
|
--no-rpms \
|
||||||
|
--no-backup \
|
||||||
|
--no-check-for-alternate-installs
|
||||||
|
sudo rm -rf /tmp/NVIDIA* && cd ~
|
||||||
|
fi
|
||||||
|
|
||||||
# Create and modify permissions of XDG_RUNTIME_DIR Reference: https://github.com/selkies-project/docker-nvidia-glx-desktop/blob/94b139c5d04395e1171202bb41e5d6f60e576a39/entrypoint.sh#L9C1-L10C1
|
# Allow starting Xorg from a pseudoterminal instead of strictly on a tty console
|
||||||
mkdir -pm700 /tmp/runtime-user
|
if [ ! -f /etc/X11/Xwrapper.config ]; then
|
||||||
chown root:root /tmp/runtime-user
|
echo -e "allowed_users=anybody\nneeds_root_rights=yes" | sudo tee /etc/X11/Xwrapper.config >/dev/null
|
||||||
chmod 700 /tmp/runtime-user
|
fi
|
||||||
|
if grep -Fxq "allowed_users=console" /etc/X11/Xwrapper.config; then
|
||||||
|
sudo sed -i "s/allowed_users=console/allowed_users=anybody/;$ a needs_root_rights=yes" /etc/X11/Xwrapper.config
|
||||||
|
fi
|
||||||
|
|
||||||
#FIXME:
|
# Remove existing Xorg configuration
|
||||||
|
if [ -f "/etc/X11/xorg.conf" ]; then
|
||||||
|
sudo rm -f "/etc/X11/xorg.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
#Mangohud [Works]
|
# Get first GPU device if all devices are available or $(NVIDIA_VISIBLE_DEVICES) is not set
|
||||||
# Mangohud errors: Selected GPU 0: Tesla T4, type: DiscreteGpu [2024-04-14 23:52:57.098] [MANGOHUD] [error] [loader_nvctrl.cpp:39] Failed to open 64bit libXNVCtrl.so.0: libXNVCtrl.so.0: cannot open shared object file: No such file or directory [2024-04-14 23:52:57.098] [MANGOHUD] [error] [nvctrl.cpp:45] XNVCtrl loader failed to load
|
if [ "$NVIDIA_VISIBLE_DEVICES" == "all" ] || [ -z "$NVIDIA_VISIBLE_DEVICES" ]; then
|
||||||
# gpu-screen-recorder [Fails]: #/usr/games/gamescope -w 1920 -h 1080 -W 3440 -H 1440 -r 60 -f -F fsr -- mangohud vkcubeNo CAP_SYS_NICE, falling back to regular-priority compute and threads.Performance will be affected.wlserver: [backend/headless/backend.c:68] Creating headless backendvulkan: selecting physical device 'Tesla T4': queue family 2vulkan: physical device does not support DRM format modifiersvulkan: physical device has no render nodeFailed to initialize Vulkan
|
export GPU_SELECT="$(sudo nvidia-smi --query-gpu=uuid --format=csv | sed -n 2p)"
|
||||||
# TODO: replace gpu-screen-recorder with shadow-cast (has better documentation)
|
# Get first GPU device out of the visible devices in other situations
|
||||||
|
else
|
||||||
|
export GPU_SELECT="$(sudo nvidia-smi --id=$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1) --query-gpu=uuid --format=csv | sed -n 2p)"
|
||||||
|
if [ -z "$GPU_SELECT" ]; then
|
||||||
|
export GPU_SELECT="$(sudo nvidia-smi --query-gpu=uuid --format=csv | sed -n 2p)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$GPU_SELECT" ]; then
|
||||||
|
echo "No NVIDIA GPUs detected or nvidia-container-toolkit not configured. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Setting `VIDEO_PORT` to none disables RANDR/XRANDR, do not set this if using datacenter GPUs
|
||||||
|
if [ "${VIDEO_PORT,,}" = "none" ]; then
|
||||||
|
export CONNECTED_MONITOR="--use-display-device=None"
|
||||||
|
# The X server is otherwise deliberately set to a specific video port despite not being plugged to enable RANDR/XRANDR, monitor will display the screen if plugged to the specific port
|
||||||
|
else
|
||||||
|
export CONNECTED_MONITOR="--connected-monitor=${VIDEO_PORT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Bus ID from nvidia-smi is in hexadecimal format and should be converted to decimal format (including the domain) which Xorg understands, required because nvidia-xconfig doesn't work as intended in a container
|
||||||
|
HEX_ID="$(sudo nvidia-smi --query-gpu=pci.bus_id --id="$GPU_SELECT" --format=csv | sed -n 2p)"
|
||||||
|
IFS=":." ARR_ID=("$HEX_ID")
|
||||||
|
unset IFS
|
||||||
|
BUS_ID="PCI:$((16#${ARR_ID[1]}))@$((16#${ARR_ID[0]})):$((16#${ARR_ID[2]})):$((16#${ARR_ID[3]}))"
|
||||||
|
# A custom modeline should be generated because there is no monitor to fetch this information normally
|
||||||
|
export MODELINE="$(cvt -r "${SIZEW}" "${SIZEH}" "${REFRESH}" | sed -n 2p)"
|
||||||
|
# Generate /etc/X11/xorg.conf with nvidia-xconfig
|
||||||
|
sudo nvidia-xconfig --virtual="${SIZEW}x${SIZEH}" --depth="$CDEPTH" --mode="$(echo "$MODELINE" | awk '{print $2}' | tr -d '\"')" --allow-empty-initial-configuration --no-probe-all-gpus --busid="$BUS_ID" --include-implicit-metamodes --mode-debug --no-sli --no-base-mosaic --only-one-x-screen ${CONNECTED_MONITOR}
|
||||||
|
# Guarantee that the X server starts without a monitor by adding more options to the configuration
|
||||||
|
sudo sed -i '/Driver\s\+"nvidia"/a\ Option "ModeValidation" "NoMaxPClkCheck,NoEdidMaxPClkCheck,NoMaxSizeCheck,NoHorizSyncCheck,NoVertRefreshCheck,NoVirtualSizeCheck,NoExtendedGpuCapabilitiesCheck,NoTotalSizeCheck,NoDualLinkDVICheck,NoDisplayPortBandwidthCheck,AllowNon3DVisionModes,AllowNonHDMI3DModes,AllowNonEdidModes,NoEdidHDMI2Check,AllowDpInterlaced"' /etc/X11/xorg.conf
|
||||||
|
# Add custom generated modeline to the configuration
|
||||||
|
sudo sed -i '/Section\s\+"Monitor"/a\ '"$MODELINE" /etc/X11/xorg.conf
|
||||||
|
# Prevent interference between GPUs, add this to the host or other containers running Xorg as well
|
||||||
|
echo -e "Section \"ServerFlags\"\n Option \"AutoAddGPU\" \"false\"\nEndSection" | sudo tee -a /etc/X11/xorg.conf >/dev/null
|
||||||
|
|
||||||
|
# Default display is :0 across the container
|
||||||
|
export DISPLAY=":0"
|
||||||
|
# Run Xorg server with required extensions
|
||||||
|
/usr/bin/Xorg vt7 -noreset -novtswitch -sharevts -dpi "${DPI}" +extension "COMPOSITE" +extension "DAMAGE" +extension "GLX" +extension "RANDR" +extension "RENDER" +extension "MIT-SHM" +extension "XFIXES" +extension "XTEST" "${DISPLAY}" &
|
||||||
|
|
||||||
|
# Wait for X11 to start
|
||||||
|
echo "Waiting for X socket"
|
||||||
|
until [ -S "/tmp/.X11-unix/X${DISPLAY/:/}" ]; do sleep 1; done
|
||||||
|
echo "X socket is ready"
|
||||||
|
|
||||||
|
echo "Session Running. Press [Return] to exit."
|
||||||
|
read
|
||||||
|
|||||||
28
.scripts/supervisord.conf
Normal file
28
.scripts/supervisord.conf
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
[supervisord]
|
||||||
|
user=netris
|
||||||
|
nodaemon=true
|
||||||
|
loglevel=info
|
||||||
|
logfile=/tmp/supervisord.log
|
||||||
|
pidfile=/tmp/supervisord.pid
|
||||||
|
|
||||||
|
[program:entrypoint]
|
||||||
|
command=/usr/bin/netris/entrypoint.sh
|
||||||
|
logfile=/tmp/entrypoint.log
|
||||||
|
pidfile=/tmp/entrypoint.pid
|
||||||
|
stopsignal=INT
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
redirect_stderr=true
|
||||||
|
priority=1
|
||||||
|
|
||||||
|
[program:pulseaudio]
|
||||||
|
user=netris
|
||||||
|
command=bash -c "until [ -S \"/tmp/.X11-unix/X${DISPLAY/:/}\" ]; do sleep 1; done; sudo /usr/bin/pulseaudio -k >/dev/null 2>&1 || sudo /usr/bin/pulseaudio --system --verbose --log-target=stderr --realtime=true --disallow-exit -L 'module-native-protocol-tcp auth-ip-acl=127.0.0.0/8 port=4713 auth-anonymous=1'"
|
||||||
|
environment=DISPLAY=":0"
|
||||||
|
logfile=/tmp/pulseaudio.log
|
||||||
|
pidfile=/tmp/pulseaudio.pid
|
||||||
|
stopsignal=INT
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
redirect_stderr=true
|
||||||
|
priority=10
|
||||||
226
base.Dockerfile
226
base.Dockerfile
@@ -2,11 +2,205 @@
|
|||||||
# From https://git.dec05eba.com/gpu-screen-recorder
|
# From https://git.dec05eba.com/gpu-screen-recorder
|
||||||
FROM ubuntu:23.10
|
FROM ubuntu:23.10
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
|
TIMEZONE=Africa/Nairobi \
|
||||||
|
XDG_RUNTIME_DIR=/tmp/runtime-netris \
|
||||||
|
DISPLAY=:0 \
|
||||||
|
PULSE_SERVER=unix:/run/pulse/native
|
||||||
|
# WAYLAND_DISPLAY=wayland-0
|
||||||
|
|
||||||
# To run /usr/bin/gpu-screen-recorder.
|
# Install fundamental packages
|
||||||
# Add this to your runtime
|
RUN apt-get clean \
|
||||||
# docker run --rm --cap-add SYS_ADMIN --cap-add SYS_NICE netris/gpu-screen-recorder
|
&& apt-get update \
|
||||||
|
&& apt-get upgrade -y \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
|
apt-transport-https \
|
||||||
|
apt-utils \
|
||||||
|
build-essential \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
gnupg \
|
||||||
|
locales \
|
||||||
|
make \
|
||||||
|
software-properties-common \
|
||||||
|
wget \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& locale-gen en_US.UTF-8
|
||||||
|
|
||||||
|
# Set locales
|
||||||
|
ENV LANG=en_US.UTF-8 \
|
||||||
|
LANGUAGE=en_US:en \
|
||||||
|
LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
# Install operating system libraries or packages
|
||||||
|
RUN dpkg --add-architecture i386 \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
|
alsa-base \
|
||||||
|
alsa-utils \
|
||||||
|
cups-browsed \
|
||||||
|
cups-bsd \
|
||||||
|
cups-common \
|
||||||
|
cups-filters \
|
||||||
|
printer-driver-cups-pdf \
|
||||||
|
file \
|
||||||
|
bzip2 \
|
||||||
|
gzip \
|
||||||
|
xz-utils \
|
||||||
|
unar \
|
||||||
|
rar \
|
||||||
|
unrar \
|
||||||
|
zip \
|
||||||
|
unzip \
|
||||||
|
zstd \
|
||||||
|
gcc \
|
||||||
|
git \
|
||||||
|
jq \
|
||||||
|
python3 \
|
||||||
|
python3-cups \
|
||||||
|
python3-numpy \
|
||||||
|
ssl-cert \
|
||||||
|
nano \
|
||||||
|
vim \
|
||||||
|
htop \
|
||||||
|
fakeroot \
|
||||||
|
fonts-dejavu \
|
||||||
|
fonts-freefont-ttf \
|
||||||
|
fonts-hack \
|
||||||
|
fonts-liberation \
|
||||||
|
fonts-noto \
|
||||||
|
fonts-noto-cjk \
|
||||||
|
fonts-noto-cjk-extra \
|
||||||
|
fonts-noto-color-emoji \
|
||||||
|
fonts-noto-extra \
|
||||||
|
fonts-noto-ui-extra \
|
||||||
|
fonts-noto-hinted \
|
||||||
|
fonts-noto-mono \
|
||||||
|
fonts-noto-unhinted \
|
||||||
|
fonts-opensymbol \
|
||||||
|
fonts-symbola \
|
||||||
|
fonts-ubuntu \
|
||||||
|
lame \
|
||||||
|
less \
|
||||||
|
libavcodec-extra \
|
||||||
|
libpulse0 \
|
||||||
|
pulseaudio \
|
||||||
|
supervisor \
|
||||||
|
net-tools \
|
||||||
|
packagekit-tools \
|
||||||
|
pkg-config \
|
||||||
|
mesa-utils \
|
||||||
|
va-driver-all \
|
||||||
|
va-driver-all:i386 \
|
||||||
|
i965-va-driver-shaders \
|
||||||
|
i965-va-driver-shaders:i386 \
|
||||||
|
intel-media-va-driver-non-free \
|
||||||
|
intel-media-va-driver-non-free:i386 \
|
||||||
|
libva2 \
|
||||||
|
libva2:i386 \
|
||||||
|
vainfo \
|
||||||
|
vdpau-driver-all \
|
||||||
|
vdpau-driver-all:i386 \
|
||||||
|
vdpauinfo \
|
||||||
|
mesa-vulkan-drivers \
|
||||||
|
mesa-vulkan-drivers:i386 \
|
||||||
|
libvulkan-dev \
|
||||||
|
libvulkan-dev:i386 \
|
||||||
|
vulkan-tools \
|
||||||
|
ocl-icd-libopencl1 \
|
||||||
|
clinfo \
|
||||||
|
dbus-user-session \
|
||||||
|
dbus-x11 \
|
||||||
|
libdbus-c++-1-0v5 \
|
||||||
|
xkb-data \
|
||||||
|
xauth \
|
||||||
|
xbitmaps \
|
||||||
|
xdg-user-dirs \
|
||||||
|
xdg-utils \
|
||||||
|
xfonts-base \
|
||||||
|
xfonts-scalable \
|
||||||
|
xinit \
|
||||||
|
xsettingsd \
|
||||||
|
libxrandr-dev \
|
||||||
|
x11-xkb-utils \
|
||||||
|
x11-xserver-utils \
|
||||||
|
x11-utils \
|
||||||
|
x11-apps \
|
||||||
|
xserver-xorg-input-all \
|
||||||
|
xserver-xorg-input-wacom \
|
||||||
|
xserver-xorg-video-all \
|
||||||
|
xserver-xorg-video-intel \
|
||||||
|
xserver-xorg-video-qxl \
|
||||||
|
# Install OpenGL libraries
|
||||||
|
libxau6 \
|
||||||
|
libxau6:i386 \
|
||||||
|
libxdmcp6 \
|
||||||
|
libxdmcp6:i386 \
|
||||||
|
libxcb1 \
|
||||||
|
libxcb1:i386 \
|
||||||
|
libxext6 \
|
||||||
|
libxext6:i386 \
|
||||||
|
libx11-6 \
|
||||||
|
libx11-6:i386 \
|
||||||
|
libxv1 \
|
||||||
|
libxv1:i386 \
|
||||||
|
libxtst6 \
|
||||||
|
libxtst6:i386 \
|
||||||
|
libglvnd0 \
|
||||||
|
libglvnd0:i386 \
|
||||||
|
libgl1 \
|
||||||
|
libgl1:i386 \
|
||||||
|
libglx0 \
|
||||||
|
libglx0:i386 \
|
||||||
|
libegl1 \
|
||||||
|
libegl1:i386 \
|
||||||
|
libgles2 \
|
||||||
|
libgles2:i386 \
|
||||||
|
libglu1 \
|
||||||
|
libglu1:i386 \
|
||||||
|
libsm6 \
|
||||||
|
libsm6:i386 \
|
||||||
|
mesa-utils \
|
||||||
|
mesa-utils-extra \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf \
|
||||||
|
&& echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf \
|
||||||
|
# Configure OpenCL manually
|
||||||
|
&& mkdir -pm755 /etc/OpenCL/vendors \
|
||||||
|
&& echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd \
|
||||||
|
# Configure Vulkan manually
|
||||||
|
&& VULKAN_API_VERSION=$(dpkg -s libvulkan1 | grep -oP 'Version: [0-9|\.]+' | grep -oP '[0-9]+(\.[0-9]+)(\.[0-9]+)') \
|
||||||
|
&& mkdir -pm755 /etc/vulkan/icd.d/ \
|
||||||
|
&& echo "{\n\
|
||||||
|
\"file_format_version\" : \"1.0.0\",\n\
|
||||||
|
\"ICD\": {\n\
|
||||||
|
\"library_path\": \"libGLX_nvidia.so.0\",\n\
|
||||||
|
\"api_version\" : \"${VULKAN_API_VERSION}\"\n\
|
||||||
|
}\n\
|
||||||
|
}" > /etc/vulkan/icd.d/nvidia_icd.json \
|
||||||
|
# Configure EGL manually
|
||||||
|
&& mkdir -pm755 /usr/share/glvnd/egl_vendor.d/ \
|
||||||
|
&& echo "{\n\
|
||||||
|
\"file_format_version\" : \"1.0.0\",\n\
|
||||||
|
\"ICD\": {\n\
|
||||||
|
\"library_path\": \"libEGL_nvidia.so.0\"\n\
|
||||||
|
}\n\
|
||||||
|
}" > /usr/share/glvnd/egl_vendor.d/10_nvidia.json
|
||||||
|
|
||||||
|
# Expose NVIDIA libraries and paths
|
||||||
|
ENV PATH=/usr/local/nvidia/bin${PATH:+:${PATH}} \
|
||||||
|
LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}/usr/local/nvidia/lib:/usr/local/nvidia/lib64 \
|
||||||
|
XDG_SESSION_TYPE=x11 \
|
||||||
|
# Enable AppImage execution in containers
|
||||||
|
APPIMAGE_EXTRACT_AND_RUN=1
|
||||||
|
|
||||||
|
ENV \
|
||||||
|
# Make all NVIDIA GPUs visible by default
|
||||||
|
NVIDIA_VISIBLE_DEVICES=all \
|
||||||
|
# All NVIDIA driver capabilities should preferably be used, check `NVIDIA_DRIVER_CAPABILITIES` inside the container if things do not work
|
||||||
|
NVIDIA_DRIVER_CAPABILITIES=all \
|
||||||
|
# Disable VSYNC for NVIDIA GPUs
|
||||||
|
__GL_SYNC_TO_VBLANK=0
|
||||||
|
|
||||||
#Build and install gpu-screen-recorder
|
#Build and install gpu-screen-recorder
|
||||||
RUN apt-get update -y \
|
RUN apt-get update -y \
|
||||||
@@ -51,17 +245,17 @@ RUN apt-get update -y \
|
|||||||
libwayland-egl-backend-dev \
|
libwayland-egl-backend-dev \
|
||||||
wayland-protocols \
|
wayland-protocols \
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
#Install Cuda
|
#Install Nvrtc
|
||||||
&& cd /tmp && curl -fsSL -o nvidia_cuda_nvrtc_linux_x86_64.whl "https://developer.download.nvidia.com/compute/redist/nvidia-cuda-nvrtc/nvidia_cuda_nvrtc-11.0.221-cp36-cp36m-linux_x86_64.whl" \
|
&& NVRTC_VERSION="11.0.221" \
|
||||||
|
&& cd /tmp && curl -fsSL -o nvidia_cuda_nvrtc_linux_x86_64.whl "https://developer.download.nvidia.com/compute/redist/nvidia-cuda-nvrtc/nvidia_cuda_nvrtc-${NVRTC_VERSION}-cp36-cp36m-linux_x86_64.whl" \
|
||||||
&& unzip -joq -d ./nvrtc nvidia_cuda_nvrtc_linux_x86_64.whl && cd nvrtc && chmod 755 libnvrtc* \
|
&& unzip -joq -d ./nvrtc nvidia_cuda_nvrtc_linux_x86_64.whl && cd nvrtc && chmod 755 libnvrtc* \
|
||||||
&& find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; \
|
&& find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; \
|
||||||
&& mkdir -p /usr/local/nvidia/lib && mv -f libnvrtc* /usr/local/nvidia/lib \
|
&& mkdir -p /usr/local/nvidia/lib && mv -f libnvrtc* /usr/local/nvidia/lib \
|
||||||
&& echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf \
|
|
||||||
&& git clone https://repo.dec05eba.com/gpu-screen-recorder && cd gpu-screen-recorder \
|
&& git clone https://repo.dec05eba.com/gpu-screen-recorder && cd gpu-screen-recorder \
|
||||||
&& chmod +x ./build.sh ./install.sh \
|
&& chmod +x ./build.sh ./install.sh \
|
||||||
&& ./install.sh
|
&& ./install.sh
|
||||||
|
|
||||||
#Try building
|
#Try building shadow-cast
|
||||||
RUN git clone https://github.com/gmbeard/shadow-cast && cd shadow-cast \
|
RUN git clone https://github.com/gmbeard/shadow-cast && cd shadow-cast \
|
||||||
&& mkdir ./build && cd ./build \
|
&& mkdir ./build && cd ./build \
|
||||||
&& cmake -DCMAKE_CXX_FLAGS="-Wno-error=unused-result" -DCMAKE_C_FLAGS="-Wno-error=unused-result" .. \
|
&& cmake -DCMAKE_CXX_FLAGS="-Wno-error=unused-result" -DCMAKE_C_FLAGS="-Wno-error=unused-result" .. \
|
||||||
@@ -77,5 +271,17 @@ RUN apt-get update -y; \
|
|||||||
apt-get upgrade -y && apt-get dist-upgrade -y; \
|
apt-get upgrade -y && apt-get dist-upgrade -y; \
|
||||||
apt-get install ffmpeg -y; \
|
apt-get install ffmpeg -y; \
|
||||||
#
|
#
|
||||||
# Log out the ffmpeg version
|
# Log the ffmpeg version
|
||||||
ffmpeg -version
|
ffmpeg -version
|
||||||
|
|
||||||
|
# Install Xorg and NVIDIA driver installer dependencies
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
|
kmod \
|
||||||
|
libc6-dev \
|
||||||
|
libc6:i386 \
|
||||||
|
libpci3 \
|
||||||
|
libelf-dev \
|
||||||
|
pkg-config \
|
||||||
|
xorg \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
@@ -1,135 +1,56 @@
|
|||||||
#This contains all the necessary libs for the server to work.
|
#This contains all the necessary libs for the server to work.
|
||||||
#NOTE: KEEP THIS IMAGE AS LEAN AS POSSIBLE.
|
#NOTE: KEEP THIS IMAGE AS LEAN AS POSSIBLE.
|
||||||
FROM ghcr.io/wanjohiryan/netris/recorder:nightly as recorder
|
FROM ghcr.io/wanjohiryan/netris/base:nightly
|
||||||
|
|
||||||
FROM ghcr.io/wanjohiryan/netris/ffmpeg:nightly
|
ENV TZ=UTC \
|
||||||
|
SIZEW=1920 \
|
||||||
|
SIZEH=1080 \
|
||||||
|
REFRESH=60 \
|
||||||
|
DPI=96 \
|
||||||
|
CDEPTH=24 \
|
||||||
|
VIDEO_PORT=DFP
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive \
|
#Install Mangohud and gamescope
|
||||||
TIMEZONE=Africa/Nairobi
|
|
||||||
|
|
||||||
#Install base libs
|
|
||||||
RUN apt update && \
|
|
||||||
dpkg --add-architecture i386 && \
|
|
||||||
apt install -y \
|
|
||||||
software-properties-common \
|
|
||||||
curl \
|
|
||||||
libcap2-bin \
|
|
||||||
apt-transport-https \
|
|
||||||
apt-utils \
|
|
||||||
wget \
|
|
||||||
git \
|
|
||||||
jq \
|
|
||||||
locales \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& locale-gen en_US.UTF-8
|
|
||||||
|
|
||||||
#Set language variables
|
|
||||||
ENV LANG=en_US.UTF-8 \
|
|
||||||
LANGUAGE=en_US:en \
|
|
||||||
LC_ALL=en_US.UTF-8
|
|
||||||
|
|
||||||
# Expose NVIDIA libraries and paths
|
|
||||||
ENV PATH=/usr/local/nvidia/bin:${PATH} \
|
|
||||||
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}:/usr/local/nvidia/lib:/usr/local/nvidia/lib64 \
|
|
||||||
# Make all NVIDIA GPUs visible by default
|
|
||||||
NVIDIA_VISIBLE_DEVICES=all \
|
|
||||||
# All NVIDIA driver capabilities should preferably be used, check `NVIDIA_DRIVER_CAPABILITIES` inside the container if things do not work
|
|
||||||
NVIDIA_DRIVER_CAPABILITIES=all \
|
|
||||||
# Disable VSYNC
|
|
||||||
__GL_SYNC_TO_VBLANK=0
|
|
||||||
|
|
||||||
ENV XDG_RUNTIME_DIR=/tmp/runtime-user \
|
|
||||||
# DISPLAY=:0 \
|
|
||||||
WAYLAND_DISPLAY=wayland-0 \
|
|
||||||
PUID=0 \
|
|
||||||
PGID=0 \
|
|
||||||
HOME="/root" \
|
|
||||||
UNAME="root"
|
|
||||||
|
|
||||||
RUN apt-get update -y \
|
|
||||||
&& apt-get install -y --no-install-recommends \
|
|
||||||
libwayland-server0 \
|
|
||||||
libwayland-client0 \
|
|
||||||
xwayland \
|
|
||||||
xdg-user-dirs \
|
|
||||||
xdg-utils \
|
|
||||||
#Vulkan
|
|
||||||
mesa-vulkan-drivers \
|
|
||||||
mesa-vulkan-drivers:i386 \
|
|
||||||
libvulkan-dev \
|
|
||||||
libvulkan-dev:i386 \
|
|
||||||
vulkan-tools \
|
|
||||||
# Install OpenGL libraries
|
|
||||||
libglvnd0 \
|
|
||||||
libglvnd0:i386 \
|
|
||||||
libgl1 \
|
|
||||||
libgl1:i386 \
|
|
||||||
libglx0 \
|
|
||||||
libglx0:i386 \
|
|
||||||
libegl1 \
|
|
||||||
libegl1:i386 \
|
|
||||||
libgles2 \
|
|
||||||
libgles2:i386 \
|
|
||||||
libglu1 \
|
|
||||||
libglu1:i386 \
|
|
||||||
libsm6 \
|
|
||||||
libsm6:i386 \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf \
|
|
||||||
&& echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf \
|
|
||||||
# Configure Vulkan manually
|
|
||||||
&& VULKAN_API_VERSION=$(dpkg -s libvulkan1 | grep -oP 'Version: [0-9|\.]+' | grep -oP '[0-9]+(\.[0-9]+)(\.[0-9]+)') \
|
|
||||||
&& mkdir -pm755 /etc/vulkan/icd.d/ \
|
|
||||||
&& echo "{\n\
|
|
||||||
\"file_format_version\" : \"1.0.0\",\n\
|
|
||||||
\"ICD\": {\n\
|
|
||||||
\"library_path\": \"libGLX_nvidia.so.0\",\n\
|
|
||||||
\"api_version\" : \"${VULKAN_API_VERSION}\"\n\
|
|
||||||
}\n\
|
|
||||||
}" > /etc/vulkan/icd.d/nvidia_icd.json \
|
|
||||||
# Configure EGL manually
|
|
||||||
&& mkdir -pm755 /usr/share/glvnd/egl_vendor.d/ \
|
|
||||||
&& echo "{\n\
|
|
||||||
\"file_format_version\" : \"1.0.0\",\n\
|
|
||||||
\"ICD\": {\n\
|
|
||||||
\"library_path\": \"libEGL_nvidia.so.0\"\n\
|
|
||||||
}\n\
|
|
||||||
}" > /usr/share/glvnd/egl_vendor.d/10_nvidia.json \
|
|
||||||
# Prepare the XDG_RUNTIME_DIR for wayland
|
|
||||||
&& mkdir -p ${XDG_RUNTIME_DIR} && chmod 0700 ${XDG_RUNTIME_DIR}
|
|
||||||
|
|
||||||
#Install Mangohud, gamemode and gamescope
|
|
||||||
RUN apt-get update -y \
|
RUN apt-get update -y \
|
||||||
&& add-apt-repository -y multiverse \
|
&& add-apt-repository -y multiverse \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
flatpak \
|
|
||||||
mangohud \
|
mangohud \
|
||||||
gamescope \
|
gamescope \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
#Install pulseaudio
|
|
||||||
RUN apt-get update -y \
|
|
||||||
&& apt-get install -y --no-install-recommends \
|
|
||||||
alsa-utils \
|
|
||||||
libasound2 \
|
|
||||||
libasound2-plugins \
|
|
||||||
pulseaudio \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY .scripts/ /usr/bin/netris/
|
#Install wine
|
||||||
|
ARG WINE_BRANCH=staging
|
||||||
|
RUN mkdir -pm755 /etc/apt/keyrings && curl -fsSL -o /etc/apt/keyrings/winehq-archive.key "https://dl.winehq.org/wine-builds/winehq.key" \
|
||||||
|
&& curl -fsSL -o "/etc/apt/sources.list.d/winehq-$(grep UBUNTU_CODENAME= /etc/os-release | cut -d= -f2 | tr -d '\"').sources" "https://dl.winehq.org/wine-builds/ubuntu/dists/$(grep UBUNTU_CODENAME= /etc/os-release | cut -d= -f2 | tr -d '\"')/winehq-$(grep UBUNTU_CODENAME= /etc/os-release | cut -d= -f2 | tr -d '\"').sources" \
|
||||||
|
&& apt-get update && apt-get install --install-recommends -y winehq-${WINE_BRANCH}
|
||||||
|
|
||||||
|
#Install Proton
|
||||||
|
COPY .scripts/proton /usr/bin/netris/
|
||||||
|
RUN chmod +x /usr/bin/netris/proton \
|
||||||
|
&& /usr/bin/netris/proton -i
|
||||||
|
|
||||||
|
ARG USERNAME=netris
|
||||||
|
# Create user and assign adequate groups
|
||||||
|
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||||
|
sudo \
|
||||||
|
tzdata \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& groupadd -g 1000 $USERNAME \
|
||||||
|
&& useradd -ms /bin/bash $USERNAME -u 1000 -g 1000 \
|
||||||
|
&& usermod -a -G adm,audio,cdrom,dialout,dip,fax,floppy,input,lp,lpadmin,plugdev,pulse-access,render,scanner,ssl-cert,sudo,tape,tty,video,voice $USERNAME \
|
||||||
|
&& echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
|
||||||
|
&& chown $USERNAME:$USERNAME /home/$USERNAME \
|
||||||
|
&& ln -snf "/usr/share/zoneinfo/$TZ" /etc/localtime && echo "$TZ" > /etc/timezone
|
||||||
|
|
||||||
COPY warp /usr/bin/netris/
|
COPY warp /usr/bin/netris/
|
||||||
RUN ls -la /usr/bin/netris \
|
RUN chmod +x /usr/bin/netris/warp
|
||||||
&& chmod +x /usr/bin/netris/proton /usr/bin/netris/entrypoint.sh /usr/bin/netris/warp
|
COPY .scripts/entrypoint.sh .scripts/supervisord.conf /etc/netris/
|
||||||
|
RUN chmod 755 /etc/supervisord.conf /etc/entrypoint.sh
|
||||||
|
|
||||||
#Install proton
|
USER 1000
|
||||||
RUN /usr/bin/netris/proton -i
|
ENV SHELL=/bin/bash \
|
||||||
|
USER=${USERNAME}
|
||||||
|
|
||||||
ENV TINI_VERSION v0.19.0
|
WORKDIR /home/${USERNAME}
|
||||||
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
|
|
||||||
RUN chmod +x /tini
|
|
||||||
ENTRYPOINT ["/tini", "--"]
|
|
||||||
|
|
||||||
COPY --from=recorder /usr/bin/gpu-screen-recorder /usr/bin/gpu-screen-recorder
|
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||||
COPY --from=recorder /usr/bin/gsr-kms-server /usr/bin/gsr-kms-server
|
|
||||||
|
|
||||||
CMD [ "/usr/bin/netris/entrypoint.sh" ]
|
|
||||||
Reference in New Issue
Block a user