From be480311c7316aa067b24657b853d96cf60fcaf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Sun, 15 Jan 2023 18:55:16 +0100 Subject: [PATCH] extract intel gpu support from dockerfile. --- .docker/base/Dockerfile | 15 +- .docker/base/Dockerfile.intel | 146 +++++++++++++++++++ .docker/base/{ => intel}/add-render-group.sh | 0 .docker/base/intel/supervisord.conf | 69 +++++++++ .docker/base/supervisord.conf | 13 -- 5 files changed, 217 insertions(+), 26 deletions(-) create mode 100644 .docker/base/Dockerfile.intel rename .docker/base/{ => intel}/add-render-group.sh (100%) create mode 100644 .docker/base/intel/supervisord.conf diff --git a/.docker/base/Dockerfile b/.docker/base/Dockerfile index 920d52e9..9896b6dc 100644 --- a/.docker/base/Dockerfile +++ b/.docker/base/Dockerfile @@ -61,11 +61,6 @@ ARG USER_UID=1000 ARG USER_GID=$USER_UID RUN set -eux; \ - # - # add non-free repo for intel drivers - echo deb http://deb.debian.org/debian bullseye main contrib non-free > /etc/apt/sources.list; \ - echo deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free >> /etc/apt/sources.list; \ - echo deb http://deb.debian.org/debian bullseye-updates main contrib non-free >> /etc/apt/sources.list; \ apt-get update; \ # # install dependencies @@ -73,13 +68,9 @@ RUN set -eux; \ apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \ apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \ # - # intel driver + vaapi - apt-get install -y --no-install-recommends intel-media-va-driver-non-free libva2 vainfo; \ - # - # gst + vaapi plugin + # gst apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ - gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio \ - gstreamer1.0-vaapi ;\ + gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio; \ # # install fonts apt-get install -y --no-install-recommends \ @@ -122,7 +113,6 @@ COPY .docker/base/dbus /usr/bin/dbus COPY .docker/base/default.pa /etc/pulse/default.pa COPY .docker/base/supervisord.conf /etc/neko/supervisord.conf COPY .docker/base/xorg.conf /etc/neko/xorg.conf -COPY .docker/base/add-render-group.sh /usr/bin/add-render-group.sh # # set default envs @@ -131,7 +121,6 @@ ENV DISPLAY=:99.0 ENV NEKO_PASSWORD=neko ENV NEKO_PASSWORD_ADMIN=admin ENV NEKO_BIND=:8080 -ENV RENDER_GID= # # copy static files from previous stages diff --git a/.docker/base/Dockerfile.intel b/.docker/base/Dockerfile.intel new file mode 100644 index 00000000..fd818d9a --- /dev/null +++ b/.docker/base/Dockerfile.intel @@ -0,0 +1,146 @@ +# +# STAGE 1: SERVER +# +FROM golang:1.18-bullseye as server +WORKDIR /src + +# +# install dependencies +RUN set -eux; apt-get update; \ + apt-get install -y --no-install-recommends git cmake make libx11-dev libxrandr-dev libxtst-dev \ + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly; \ + # + # install libclipboard + set -eux; \ + cd /tmp; \ + git clone --depth=1 https://github.com/jtanx/libclipboard; \ + cd libclipboard; \ + cmake .; \ + make -j4; \ + make install; \ + rm -rf /tmp/libclipboard; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# build server +COPY server/ . +RUN go get -v -t -d . && go build -o bin/neko cmd/neko/main.go + +# +# STAGE 2: CLIENT +# +FROM node:14-bullseye-slim as client +WORKDIR /src + +# +# install dependencies +COPY client/package*.json ./ +RUN npm install + +# +# build client +COPY client/ . +RUN npm run build + +# +# STAGE 3: RUNTIME +# +FROM debian:bullseye-slim + +# +# avoid warnings by switching to noninteractive +ENV DEBIAN_FRONTEND=noninteractive + +# +# set custom user +ARG USERNAME=neko +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +RUN set -eux; \ + # + # add non-free repo for intel drivers + echo deb http://deb.debian.org/debian bullseye main contrib non-free > /etc/apt/sources.list; \ + echo deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free >> /etc/apt/sources.list; \ + echo deb http://deb.debian.org/debian bullseye-updates main contrib non-free >> /etc/apt/sources.list; \ + apt-get update; \ + # + # install dependencies + apt-get install -y --no-install-recommends wget ca-certificates supervisor; \ + apt-get install -y --no-install-recommends pulseaudio dbus-x11 xserver-xorg-video-dummy; \ + apt-get install -y --no-install-recommends libcairo2 libxcb1 libxrandr2 libxv1 libopus0 libvpx6; \ + # + # intel driver + vaapi + apt-get install -y --no-install-recommends intel-media-va-driver-non-free libva2 vainfo; \ + # + # gst + vaapi plugin + apt-get install -y --no-install-recommends libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \ + gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-pulseaudio \ + gstreamer1.0-vaapi; \ + # + # install fonts + apt-get install -y --no-install-recommends \ + # Google emojis + fonts-noto-color-emoji \ + # Japanese fonts + fonts-takao-mincho \ + # Chinese fonts + fonts-wqy-zenhei; \ + # + # 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; \ + # + # setup pulseaudio + mkdir -p /home/$USERNAME/.config/pulse/; \ + echo "default-server=unix:/tmp/pulseaudio.socket" > /home/$USERNAME/.config/pulse/client.conf; \ + # + # 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; \ + chmod 1777 /var/log/neko; \ + chown $USERNAME /var/log/neko/; \ + chown -R $USERNAME:$USERNAME /home/$USERNAME; \ + # + # clean up + apt-get clean -y; \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# +# copy config files +COPY .docker/base/dbus /usr/bin/dbus +COPY .docker/base/default.pa /etc/pulse/default.pa +COPY .docker/base/intel/supervisord.conf /etc/neko/supervisord.conf +COPY .docker/base/xorg.conf /etc/neko/xorg.conf +COPY .docker/base/intel/add-render-group.sh /usr/bin/add-render-group.sh + +# +# set default envs +ENV USER=$USERNAME +ENV DISPLAY=:99.0 +ENV NEKO_PASSWORD=neko +ENV NEKO_PASSWORD_ADMIN=admin +ENV NEKO_BIND=:8080 +ENV RENDER_GID= + +# +# copy static files from previous stages +COPY --from=server /src/bin/neko /usr/bin/neko +COPY --from=client /src/dist/ /var/www + +HEALTHCHECK --interval=10s --timeout=5s --retries=8 \ + CMD wget -O - http://localhost:${NEKO_BIND#*:}/health || exit 1 + +# +# run neko +CMD ["/usr/bin/supervisord", "-c", "/etc/neko/supervisord.conf"] diff --git a/.docker/base/add-render-group.sh b/.docker/base/intel/add-render-group.sh similarity index 100% rename from .docker/base/add-render-group.sh rename to .docker/base/intel/add-render-group.sh diff --git a/.docker/base/intel/supervisord.conf b/.docker/base/intel/supervisord.conf new file mode 100644 index 00000000..35ff776b --- /dev/null +++ b/.docker/base/intel/supervisord.conf @@ -0,0 +1,69 @@ +[supervisord] +nodaemon=true +user=root +pidfile=/var/run/supervisord.pid +logfile=/dev/null +logfile_maxbytes=0 +loglevel=debug + +[include] +files=/etc/neko/supervisord/*.conf + +[program:rendergroup-init] +environment=RENDER_GID="%(ENV_RENDER_GID)s",USER="%(ENV_USER)s" +command=/usr/bin/add-render-group.sh +startsecs=0 +startretries=0 +autorestart=false +priority=10 +user=root +stdout_logfile=/var/log/neko/rendergroup.log +stdout_logfile_maxbytes=1MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:dbus] +environment=HOME="/root",USER="root" +command=/usr/bin/dbus +autorestart=true +priority=100 +user=root +stdout_logfile=/var/log/neko/dbus.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:x-server] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s" +command=/usr/bin/X -config /etc/neko/xorg.conf %(ENV_DISPLAY)s +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/xorg.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:pulseaudio] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/pulseaudio --log-level=info --disallow-module-loading --disallow-exit --exit-idle-time=-1 +autorestart=true +priority=300 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/pulseaudio.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true + +[program:neko] +environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s" +command=/usr/bin/neko serve --static "/var/www" +stopsignal=INT +stopwaitsecs=5 +autorestart=true +priority=800 +user=%(ENV_USER)s +stdout_logfile=/var/log/neko/neko.log +stdout_logfile_maxbytes=100MB +stdout_logfile_backups=10 +redirect_stderr=true diff --git a/.docker/base/supervisord.conf b/.docker/base/supervisord.conf index 35ff776b..b4286fc5 100644 --- a/.docker/base/supervisord.conf +++ b/.docker/base/supervisord.conf @@ -9,19 +9,6 @@ loglevel=debug [include] files=/etc/neko/supervisord/*.conf -[program:rendergroup-init] -environment=RENDER_GID="%(ENV_RENDER_GID)s",USER="%(ENV_USER)s" -command=/usr/bin/add-render-group.sh -startsecs=0 -startretries=0 -autorestart=false -priority=10 -user=root -stdout_logfile=/var/log/neko/rendergroup.log -stdout_logfile_maxbytes=1MB -stdout_logfile_backups=10 -redirect_stderr=true - [program:dbus] environment=HOME="/root",USER="root" command=/usr/bin/dbus