mirror of
https://github.com/m1k1o/neko.git
synced 2026-11-03 08:21:50 -06:00
020def0305
* intel: fix VA-API encoders not registering (no element "vah264enc") The intel images fail to stream with a hardware encoder on stock config: every client connect ends with '(pipeline error) no element "vah264enc"'. There are three problems, all of which are needed to fix it: 1. The render group never reaches the neko process. supervisord resolves the supplementary groups of each program from /etc/group when it spawns it, but 'rendergroup-init' (which calls usermod) is spawned in the same pass, so the neko process usually starts before the group has been assigned and cannot access /dev/dri/render*. Assign the group in an entrypoint, before supervisord starts, instead. 2. libva does not initialize the X11 display without an explicitly selected driver in this image, it fails with 'vaGetDriverNames() failed'. Set LIBVA_DRIVER_NAME=iHD, which is the only driver installed by the intel image. 3. GStreamer only registers the VA-API elements if a usable VA display is found while the plugins are scanned for the first time, and the outcome is cached in the user's registry. neko performs that scan at startup, before the X server is ready, so the cache ends up without vah264enc/vah264dec and stays that way. Wait for VA to be usable and drop the stale registry before starting neko. * intel: keep the wrapper and the supervisord override in the intel image Per the review on #721: no wrapper in every flavour with a runtime 'vainfo' check, it should only be in the intel image. - neko-serve moved to runtime/intel/neko-serve and is copied only by Dockerfile.intel. The 'command -v vainfo' check is dropped, only the intel image ships it. - The [program:neko] block is overridden with runtime/intel/supervisord.neko.conf, copied to /etc/neko/supervisord/neko.conf. [include] is parsed after the main config and the last definition of a program wins, so supervisord.conf keeps 'neko serve' and it does not have to be touched. Same mechanism as supervisord.nvidia.conf in the app images. - runtime/supervisord.conf, runtime/Dockerfile and runtime/Dockerfile.nvidia are back to their previous content.
127 lines
4.2 KiB
Docker
127 lines
4.2 KiB
Docker
ARG BASE_IMAGE=debian:trixie-slim
|
|
FROM $BASE_IMAGE AS runtime
|
|
|
|
#
|
|
# set custom user
|
|
ARG USERNAME=neko
|
|
ARG USER_UID=1000
|
|
ARG USER_GID=$USER_UID
|
|
|
|
#
|
|
# install dependencies
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
RUN set -eux; \
|
|
#
|
|
# add non-free repo for intel drivers
|
|
echo deb http://deb.debian.org/debian trixie main contrib non-free > /etc/apt/sources.list; \
|
|
echo deb http://deb.debian.org/debian-security/ trixie-security main contrib non-free >> /etc/apt/sources.list; \
|
|
echo deb http://deb.debian.org/debian trixie-updates main contrib non-free >> /etc/apt/sources.list; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends \
|
|
wget ca-certificates supervisor \
|
|
pulseaudio dbus-x11 xserver-xorg-video-dummy \
|
|
libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx9 libx264-164 libvo-aacenc0 librtmp1 libxcvt0 \
|
|
#
|
|
# intel driver + vaapi
|
|
intel-media-va-driver-non-free libva2 vainfo \
|
|
#
|
|
# needed for profile upload preStop hook
|
|
zip curl \
|
|
#
|
|
# file chooser handler, clipboard, drop
|
|
xdotool xclip libgtk-3-0 \
|
|
#
|
|
# gst
|
|
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
|
|
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
|
|
gstreamer1.0-pulseaudio gstreamer1.0-vaapi; \
|
|
#
|
|
# create a non-root user
|
|
groupadd --gid $USER_GID $USERNAME; \
|
|
useradd --uid $USER_UID --gid $USERNAME --shell /bin/bash --create-home $USERNAME; \
|
|
adduser $USERNAME audio; \
|
|
adduser $USERNAME video; \
|
|
adduser $USERNAME pulse; \
|
|
#
|
|
# workaround for an X11 problem: http://blog.tigerteufel.de/?p=476
|
|
mkdir /tmp/.X11-unix; \
|
|
chmod 1777 /tmp/.X11-unix; \
|
|
chown $USERNAME /tmp/.X11-unix/; \
|
|
#
|
|
# make directories for neko
|
|
mkdir -p /etc/neko /var/www /var/log/neko \
|
|
/tmp/runtime-$USERNAME \
|
|
/home/$USERNAME/.config/pulse \
|
|
/home/$USERNAME/.local/share/xorg; \
|
|
chmod 1777 /var/log/neko; \
|
|
chmod 0700 /tmp/runtime-$USERNAME; \
|
|
chown $USERNAME /var/log/neko/ /tmp/runtime-$USERNAME; \
|
|
chown -R $USERNAME:$USERNAME /home/$USERNAME; \
|
|
#
|
|
# install fonts
|
|
apt-get install -y --no-install-recommends \
|
|
# Emojis
|
|
fonts-noto-color-emoji \
|
|
# Chinese fonts
|
|
fonts-arphic-ukai fonts-arphic-uming \
|
|
fonts-wqy-zenhei xfonts-intl-chinese xfonts-wqy \
|
|
# Japanese fonts
|
|
fonts-ipafont-mincho fonts-ipafont-gothic \
|
|
fonts-takao-mincho \
|
|
# Korean fonts
|
|
fonts-unfonts-core \
|
|
fonts-wqy-microhei \
|
|
# Indian fonts
|
|
fonts-indic; \
|
|
#
|
|
# clean up
|
|
apt-get clean -y; \
|
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
|
|
|
#
|
|
# copy runtime configs
|
|
COPY --chown=neko:neko .Xresources /home/$USERNAME/.Xresources
|
|
COPY dbus /usr/bin/dbus
|
|
COPY intel/neko-serve /usr/bin/neko-serve
|
|
COPY default.pa /etc/pulse/default.pa
|
|
COPY supervisord.conf /etc/neko/supervisord.conf
|
|
COPY supervisord.dbus.conf /etc/neko/supervisord.dbus.conf
|
|
COPY intel/supervisord.neko.conf /etc/neko/supervisord/neko.conf
|
|
COPY xorg.conf /etc/neko/xorg.conf
|
|
COPY intel/add-render-group.sh /usr/bin/add-render-group.sh
|
|
COPY intel/entrypoint.sh /usr/bin/entrypoint.sh
|
|
|
|
#
|
|
# copy runtime folders
|
|
COPY --chown=neko:neko icon-theme /home/$USERNAME/.icons/default
|
|
COPY fontconfig/* /etc/fonts/conf.d/
|
|
COPY fonts /usr/local/share/fonts
|
|
|
|
#
|
|
# set default envs
|
|
ENV USER=$USERNAME
|
|
ENV DISPLAY=:99.0
|
|
ENV PULSE_SERVER=unix:/tmp/pulseaudio.socket
|
|
ENV XDG_RUNTIME_DIR=/tmp/runtime-$USERNAME
|
|
ENV NEKO_SERVER_BIND=:8080
|
|
ENV NEKO_PLUGINS_ENABLED=true
|
|
ENV NEKO_PLUGINS_DIR=/etc/neko/plugins/
|
|
ENV NEKO_HWENC=VAAPI
|
|
ENV RENDER_GID=
|
|
# libva does not initialize the X11 display without an explicitly selected
|
|
# driver here ('vaGetDriverNames() failed'), and the GStreamer VA plugin scan
|
|
# uses X11. This image only ships the iHD driver (intel-media-va-driver-non-free).
|
|
ENV LIBVA_DRIVER_NAME=iHD
|
|
|
|
#
|
|
# add healthcheck
|
|
HEALTHCHECK --interval=10s --timeout=5s --retries=8 \
|
|
CMD wget -O - http://localhost:${NEKO_SERVER_BIND#*:}/health || \
|
|
wget --no-check-certificate -O - https://localhost:${NEKO_SERVER_BIND#*:}/health || \
|
|
exit 1
|
|
|
|
#
|
|
# run neko
|
|
ENTRYPOINT ["/usr/bin/entrypoint.sh"]
|
|
CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"]
|