diff --git a/porting/kasmvnc/Dockerfile b/apps/kasmvnc/Dockerfile
similarity index 84%
rename from porting/kasmvnc/Dockerfile
rename to apps/kasmvnc/Dockerfile
index ac18a7b5b..9982c75ed 100644
--- a/porting/kasmvnc/Dockerfile
+++ b/apps/kasmvnc/Dockerfile
@@ -1,4 +1,4 @@
-FROM ghcr.io/trueforge-org/python-node:3.13.12 AS wwwstage
+FROM ghcr.io/trueforge-org/python-node:3.14.4 AS wwwstage
ARG KASMWEB_RELEASE="46412d23aff1f45dffa83fafb04a683282c8db58"
USER root
@@ -26,7 +26,7 @@ RUN \
if [ -f index.html ]; then cp index.html vnc.html; elif [ -f vnc.html ]; then cp vnc.html index.html; fi && \
mkdir Downloads
-FROM ghcr.io/trueforge-org/ubuntu:24.04 AS buildstage
+FROM ghcr.io/trueforge-org/ubuntu:26.04 AS buildstage
ARG KASMVNC_COMMIT="e04731870baebd2784983fb48197a2416c7d3519"
USER root
@@ -74,6 +74,7 @@ RUN \
libssl-dev \
libpixman-1-dev \
libpam0g-dev \
+ libcrypt-dev \
procps \
passwd \
libwayland-dev \
@@ -105,11 +106,13 @@ RUN \
sed -i \
-e '/find_package(FLTK/s@^@#@' \
-e '/add_subdirectory(tests/s@^@#@' \
+ -e '/cmake_policy(SET CMP0022 OLD)/s@^@#@' \
CMakeLists.txt && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DBUILD_VIEWER:BOOL=OFF \
-DENABLE_GNUTLS:BOOL=OFF \
+ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
. && \
make -j4 && \
echo "**** build xorg ****" && \
@@ -163,7 +166,7 @@ RUN \
cp /src/unix/xserver/hw/vnc/Xvnc.man man/man1/Xvnc.1 && \
mkdir lib && \
cd lib && \
- ln -s /usr/lib/xorg/modules/dri dri && \
+ ln -s "/usr/lib/$(uname -m)-linux-gnu/dri" dri && \
cd /src && \
mkdir -p builder/www && \
cp -ax /www/* builder/www/ && \
@@ -214,7 +217,7 @@ RUN \
rm -f package-lock.json
# runtime stage
-FROM ghcr.io/trueforge-org/ubuntu:24.04
+FROM ghcr.io/trueforge-org/python-node:3.14.4
# set version label
ARG VERSION
@@ -235,8 +238,24 @@ ENV DISPLAY=:1 \
# copy over build output
COPY --from=nodebuilder /kclient /kclient
+RUN rm -f /usr/local/man
COPY --from=buildstage /build-out/ /
+# rebuild kclient native modules for current node version
+RUN \
+ echo "**** rebuild kclient for runtime node version ****" && \
+ apt-get update && \
+ apt-get install -y --no-install-recommends \
+ build-essential \
+ python3 \
+ libpulse-dev && \
+ cd /kclient && \
+ npm rebuild && \
+ apt-get remove -y build-essential python3 libpulse-dev && \
+ apt-get autoremove -y && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
RUN \
echo "**** install deps ****" && \
apt-get update && \
@@ -258,13 +277,13 @@ RUN \
libjpeg-turbo8 \
libnotify-bin \
libstdc++6 \
- libwebp6 \
+ libwebp7 \
libxfont2 \
libxshmfence1 \
- mcookie \
+ util-linux \
libgl1-mesa-dri \
libgbm1 \
- libgl1-mesa-glx \
+ libgl1 \
mesa-vulkan-drivers \
nginx \
openbox \
@@ -284,21 +303,19 @@ RUN \
xserver-xorg-video-intel \
xserver-xorg-video-nouveau \
xserver-xorg-video-qxl \
- xkbcomp \
- xkeyboard-config \
- xterm \
- cups-pdf && \
- echo "**** printer config ****" && \
- sed -i \
- "s:^#Out.*:Out /home/kasm-user/PDF:" \
- /etc/cups/cups-pdf.conf && \
- sed -i \
- 's/^SystemGroup .*/SystemGroup lpadmin root/' \
- /etc/cups/cups-files.conf && \
+ xkb-data \
+ xterm && \
echo "**** filesystem setup ****" && \
ln -s /usr/local/share/kasmvnc /usr/share/kasmvnc && \
ln -s /usr/local/etc/kasmvnc /etc/kasmvnc && \
ln -s /usr/local/lib/kasmvnc /usr/lib/kasmvncserver && \
+ mkdir -p /var/lib/nginx/body /var/lib/nginx/fastcgi /var/lib/nginx/proxy /var/lib/nginx/scgi /var/lib/nginx/uwsgi && \
+ chown -R apps:apps /var/lib/nginx && \
+ mkdir -p /etc/nginx/conf.d && \
+ chown -R apps:apps /etc/nginx/conf.d && \
+ mkdir -p /var/log/nginx && \
+ chown -R apps:apps /var/log/nginx && \
+ sed -i 's|pid /run/nginx.pid;|pid /tmp/nginx.pid;|g' /etc/nginx/nginx.conf && \
echo "**** openbox tweaks ****" && \
sed -i \
-e 's/NLIMC/NLMC/g' \
@@ -308,20 +325,21 @@ RUN \
echo "**** user perms ****" && \
echo "apps:apps" | chpasswd && \
usermod -s /bin/bash apps && \
+ groupadd wheel && \
echo '%wheel ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/wheel && \
adduser apps wheel && \
echo "**** proot-apps ****" && \
mkdir /proot-apps/ && \
- PAPPS_RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/proot-apps/releases/latest" \
+ (PAPPS_RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/proot-apps/releases/latest" \
| awk '/tag_name/{print $4;exit}' FS='[""]') && \
curl -L https://github.com/linuxserver/proot-apps/releases/download/${PAPPS_RELEASE}/proot-apps-$TARGETARCH.tar.gz \
| tar -xzf - -C /proot-apps/ && \
- echo "${PAPPS_RELEASE}" > /proot-apps/pversion && \
+ echo "${PAPPS_RELEASE}" > /proot-apps/pversion) || echo "proot-apps download failed, skipping" && \
echo "**** kasm support ****" && \
- useradd \
+ (id kasm-user >/dev/null 2>&1 || useradd \
-u 1000 -U \
-d /home/kasm-user \
- -s /bin/bash kasm-user && \
+ -s /bin/bash kasm-user) && \
echo "kasm-user:kasm" | chpasswd && \
adduser kasm-user wheel && \
mkdir -p /home/kasm-user && \
@@ -347,8 +365,8 @@ RUN \
usermod -aG docker apps && \
echo 'hosts: files dns' > /etc/nsswitch.conf && \
echo "**** theme ****" && \
- curl -s https://raw.githubusercontent.com/thelamer/lang-stash/master/theme.tar.gz \
- | tar xzvf - -C /usr/share/themes/Clearlooks/openbox-3/ && \
+ (curl -s https://raw.githubusercontent.com/thelamer/lang-stash/master/theme.tar.gz \
+ | tar xzvf - -C /usr/share/themes/Clearlooks/openbox-3/) || echo "theme download failed, skipping" && \
echo "**** cleanup ****" && \
rm -rf \
/tmp/* && \
@@ -357,6 +375,7 @@ RUN \
# add local files
USER apps
+COPY --chmod=0755 ./root/ /
COPY --chmod=0755 . /
diff --git a/apps/kasmvnc/container-test.yaml b/apps/kasmvnc/container-test.yaml
new file mode 100644
index 000000000..c0fca3b68
--- /dev/null
+++ b/apps/kasmvnc/container-test.yaml
@@ -0,0 +1,5 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/trueforge-org/forgetool/refs/heads/main/pkg/containers/test/container-test.schema.json
+
+tcp:
+- port: '3000'
+- port: '3001'
diff --git a/porting/kasmvnc/docker-bake.hcl b/apps/kasmvnc/docker-bake.hcl
similarity index 100%
rename from porting/kasmvnc/docker-bake.hcl
rename to apps/kasmvnc/docker-bake.hcl
diff --git a/porting/kasmvnc/root/defaults/autostart b/apps/kasmvnc/root/defaults/autostart
similarity index 100%
rename from porting/kasmvnc/root/defaults/autostart
rename to apps/kasmvnc/root/defaults/autostart
diff --git a/porting/kasmvnc/root/defaults/default.conf b/apps/kasmvnc/root/defaults/default.conf
similarity index 100%
rename from porting/kasmvnc/root/defaults/default.conf
rename to apps/kasmvnc/root/defaults/default.conf
diff --git a/porting/kasmvnc/root/defaults/menu.xml b/apps/kasmvnc/root/defaults/menu.xml
similarity index 100%
rename from porting/kasmvnc/root/defaults/menu.xml
rename to apps/kasmvnc/root/defaults/menu.xml
diff --git a/porting/kasmvnc/root/defaults/startwm.sh b/apps/kasmvnc/root/defaults/startwm.sh
similarity index 100%
rename from porting/kasmvnc/root/defaults/startwm.sh
rename to apps/kasmvnc/root/defaults/startwm.sh
diff --git a/porting/kasmvnc/root/etc/cups/ppd/kasm.ppd b/apps/kasmvnc/root/etc/cups/ppd/kasm.ppd
similarity index 100%
rename from porting/kasmvnc/root/etc/cups/ppd/kasm.ppd
rename to apps/kasmvnc/root/etc/cups/ppd/kasm.ppd
diff --git a/porting/kasmvnc/root/etc/cups/start_cups.sh b/apps/kasmvnc/root/etc/cups/start_cups.sh
similarity index 100%
rename from porting/kasmvnc/root/etc/cups/start_cups.sh
rename to apps/kasmvnc/root/etc/cups/start_cups.sh
diff --git a/porting/kasmvnc/root/kasminit b/apps/kasmvnc/root/kasminit
similarity index 100%
rename from porting/kasmvnc/root/kasminit
rename to apps/kasmvnc/root/kasminit
diff --git a/porting/kasmvnc/root/usr/local/bin/dockerd-entrypoint.sh b/apps/kasmvnc/root/usr/local/bin/dockerd-entrypoint.sh
similarity index 100%
rename from porting/kasmvnc/root/usr/local/bin/dockerd-entrypoint.sh
rename to apps/kasmvnc/root/usr/local/bin/dockerd-entrypoint.sh
diff --git a/porting/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml b/apps/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml
similarity index 100%
rename from porting/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml
rename to apps/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml
diff --git a/porting/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml.lsio b/apps/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml.lsio
similarity index 100%
rename from porting/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml.lsio
rename to apps/kasmvnc/root/usr/local/etc/kasmvnc/kasmvnc.yaml.lsio
diff --git a/apps/kasmvnc/settings.yaml b/apps/kasmvnc/settings.yaml
new file mode 100644
index 000000000..34553e906
--- /dev/null
+++ b/apps/kasmvnc/settings.yaml
@@ -0,0 +1,32 @@
+# yaml-language-server: $schema=https://raw.githubusercontent.com/trueforge-org/forgetool/refs/heads/main/schemas/container-settings.schema.json
+schema_version: 1
+upstream_env_url: "https://github.com/kasmtech/KasmVNC"
+ports:
+ - port: 3000
+ protocol: tcp
+ required: false
+ - port: 3001
+ protocol: tcp
+ required: false
+env:
+ - name: TZ
+ default: "Etc/UTC"
+ required: false
+ - name: CUSTOM_PORT
+ default: "3000"
+ required: false
+ - name: CUSTOM_HTTPS_PORT
+ default: "3001"
+ required: false
+ - name: CUSTOM_USER
+ default: "apps"
+ required: false
+ - name: PASSWORD
+ default: ""
+ required: false
+ - name: SUBFOLDER
+ default: "/"
+ required: false
+volumes:
+ - path: /config
+ required: true
diff --git a/apps/kasmvnc/start.sh b/apps/kasmvnc/start.sh
new file mode 100755
index 000000000..8ecb640e6
--- /dev/null
+++ b/apps/kasmvnc/start.sh
@@ -0,0 +1,167 @@
+#!/usr/bin/env bash
+
+# default file copies first run
+if [[ ! -f /config/.config/openbox/autostart ]]; then
+ mkdir -p /config/.config/openbox
+ cp /defaults/autostart /config/.config/openbox/autostart
+ chown -R apps:apps /config/.config/openbox
+fi
+if [[ ! -f /config/.config/openbox/menu.xml ]]; then
+ mkdir -p /config/.config/openbox
+ cp /defaults/menu.xml /config/.config/openbox/menu.xml
+ chown -R apps:apps /config/.config
+fi
+
+# XDG Home
+export XDG_RUNTIME_DIR="${HOME}/.XDG"
+if [ ! -d "${XDG_RUNTIME_DIR}" ]; then
+ mkdir -p "${XDG_RUNTIME_DIR}"
+ chown apps:apps "${XDG_RUNTIME_DIR}"
+fi
+
+# Create cache directory for openbox
+if [ ! -d "/config/.cache/openbox" ]; then
+ mkdir -p "/config/.cache/openbox"
+ chown -R apps:apps "/config/.cache"
+fi
+
+# Locale Support
+if [ ! -z ${LC_ALL+x} ]; then
+ export LANGUAGE="${LC_ALL%.UTF-8}"
+ export LANG="${LC_ALL}"
+fi
+
+# Remove window borders (write to /tmp since /etc is read-only with --read-only)
+if [[ ! -z ${NO_DECOR+x} ]] && [[ ! -f /tmp/decorlock ]]; then
+ if [ -w /etc/xdg/openbox/rc.xml ]; then
+ sed -i \
+ 's|| no \n|' \
+ /etc/xdg/openbox/rc.xml
+ fi
+ touch /tmp/decorlock
+fi
+
+# Fullscreen everything in openbox unless the user explicitly disables it
+if [[ ! -z ${NO_FULL+x} ]] && [[ ! -f /tmp/fulllock ]]; then
+ if [ -w /etc/xdg/openbox/rc.xml ]; then
+ sed -i \
+ '/yes<\/maximized><\/application>/d' \
+ /etc/xdg/openbox/rc.xml
+ fi
+ touch /tmp/fulllock
+fi
+
+# Add proot-apps if available
+if [ -d /proot-apps ] && [ "$(ls -A /proot-apps 2>/dev/null)" ]; then
+ if [ ! -f "${HOME}/.local/bin/proot-apps" ]; then
+ mkdir -p ${HOME}/.local/bin/
+ cp /proot-apps/* ${HOME}/.local/bin/ 2>/dev/null || true
+ echo 'export PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc
+ chown -R apps:apps ${HOME}/.local/ ${HOME}/.bashrc 2>/dev/null || true
+ elif [ -f /proot-apps/pversion ] && [ -f ${HOME}/.local/bin/pversion ] && ! diff -q /proot-apps/pversion ${HOME}/.local/bin/pversion > /dev/null 2>&1; then
+ cp /proot-apps/* ${HOME}/.local/bin/ 2>/dev/null || true
+ chown -R apps:apps ${HOME}/.local/bin/ 2>/dev/null || true
+ fi
+fi
+
+# nginx Path - use /tmp since we may not be able to write to /etc/nginx
+NGINX_CONFIG=/tmp/nginx-default.conf
+
+# user passed env vars
+CPORT="${CUSTOM_PORT:-3000}"
+CHPORT="${CUSTOM_HTTPS_PORT:-3001}"
+CUSER="${CUSTOM_USER:-apps}"
+SFOLDER="${SUBFOLDER:-/}"
+
+# create self signed cert
+if [ ! -f "/config/ssl/cert.pem" ]; then
+ mkdir -p /config/ssl
+ openssl req -new -x509 \
+ -days 3650 -nodes \
+ -out /config/ssl/cert.pem \
+ -keyout /config/ssl/cert.key \
+ -subj "/C=US/ST=CA/L=Carlsbad/O=Linuxserver.io/OU=LSIO Server/CN=*"
+ chmod 600 /config/ssl/cert.key
+ chown -R apps:apps /config/ssl
+fi
+
+# modify nginx config
+cp /defaults/default.conf ${NGINX_CONFIG}
+sed -i "s/3000/$CPORT/g" ${NGINX_CONFIG}
+sed -i "s/3001/$CHPORT/g" ${NGINX_CONFIG}
+sed -i "s|SUBFOLDER|$SFOLDER|g" ${NGINX_CONFIG}
+if [ ! -z ${DISABLE_IPV6+x} ]; then
+ sed -i '/listen \[::\]/d' ${NGINX_CONFIG}
+fi
+if [ ! -z ${PASSWORD+x} ]; then
+ mkdir -p /tmp/nginx
+ printf "${CUSER}:$(openssl passwd -apr1 ${PASSWORD})\n" > /tmp/nginx/.htpasswd
+ sed -i 's/#//g' ${NGINX_CONFIG}
+ sed -i "s|/etc/nginx/.htpasswd|/tmp/nginx/.htpasswd|g" ${NGINX_CONFIG}
+fi
+
+# Copy nginx config to the right place if writable
+if [ -w /etc/nginx/conf.d/ ]; then
+ cp ${NGINX_CONFIG} /etc/nginx/conf.d/default.conf
+elif [ -d /etc/nginx/http.d/ ] && [ -w /etc/nginx/http.d/ ]; then
+ cp ${NGINX_CONFIG} /etc/nginx/http.d/default.conf
+fi
+
+# Set DISPLAY for X server
+export DISPLAY=:1
+
+# Start PulseAudio in the background
+/usr/bin/pulseaudio \
+ --log-level=0 \
+ --log-target=stderr \
+ --exit-idle-time=-1 > /dev/null 2>&1 &
+
+# Start Xvnc server in background
+# Pass gpu flags if mounted
+HW3D=""
+if ls /dev/dri/renderD* 1> /dev/null 2>&1 && [ -z ${DISABLE_DRI+x} ] && ! which nvidia-smi > /dev/null 2>&1; then
+ HW3D="-hw3d"
+fi
+DRINODE="${DRINODE:-/dev/dri/renderD128}"
+
+/usr/local/bin/Xvnc $DISPLAY \
+ ${HW3D} \
+ -PublicIP 127.0.0.1 \
+ -drinode ${DRINODE} \
+ -disableBasicAuth \
+ -SecurityTypes None \
+ -AlwaysShared \
+ -http-header Cross-Origin-Embedder-Policy=require-corp \
+ -http-header Cross-Origin-Opener-Policy=same-origin \
+ -geometry 1024x768 \
+ -sslOnly 0 \
+ -RectThreads 0 \
+ -websocketPort 6901 \
+ -interface 0.0.0.0 \
+ -Log *:stdout:10 &
+
+# Wait for X server to be ready
+sleep 2
+
+# Start window manager
+cd $HOME
+/bin/bash /defaults/startwm.sh &
+
+# Wait for window manager to start
+sleep 2
+
+# Start nginx (kill any zombie processes first)
+if pgrep -f "[n]ginx:" >/dev/null; then
+ echo "Zombie nginx processes detected, cleaning up"
+ pkill -ef '[n]ginx:' 2>/dev/null || true
+ sleep 1
+fi
+
+# Start nginx in background
+if [ -f /etc/nginx/conf.d/default.conf ] || [ -f /etc/nginx/http.d/default.conf ] || [ -f ${NGINX_CONFIG} ]; then
+ /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf &
+fi
+
+# Start kclient Node.js wrapper in foreground (this becomes our main process)
+cd /kclient
+exec node index.js
diff --git a/porting/kasmvnc/start.sh b/porting/kasmvnc/start.sh
deleted file mode 100755
index 8ebb82246..000000000
--- a/porting/kasmvnc/start.sh
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/env bash
-
-
-# default file copies first run
-if [[ ! -f /config/.config/openbox/autostart ]]; then
- mkdir -p /config/.config/openbox
- cp /defaults/autostart /config/.config/openbox/autostart
- chown -R apps:apps /config/.config/openbox
-fi
-if [[ ! -f /config/.config/openbox/menu.xml ]]; then
- mkdir -p /config/.config/openbox && \
- cp /defaults/menu.xml /config/.config/openbox/menu.xml && \
- chown -R apps:apps /config/.config
-fi
-if [[ -f /usr/local/etc/kasmvnc/kasmvnc.yaml.lsio ]]; then
- mv \
- /usr/local/etc/kasmvnc/kasmvnc.yaml.lsio \
- /usr/local/etc/kasmvnc/kasmvnc.yaml
-fi
-
-# XDG Home
-printf "${HOME}/.XDG" > /run/s6/container_environment/XDG_RUNTIME_DIR
-if [ ! -d "${HOME}/.XDG" ]; then
- mkdir -p ${HOME}/.XDG
- chown apps:apps ${HOME}/.XDG
-fi
-
-# Locale Support
-if [ ! -z ${LC_ALL+x} ]; then
- printf "${LC_ALL%.UTF-8}" > /run/s6/container_environment/LANGUAGE
- printf "${LC_ALL}" > /run/s6/container_environment/LANG
-fi
-
-# Remove window borders
-if [[ ! -z ${NO_DECOR+x} ]] && [[ ! -f /decorlock ]]; then
- sed -i \
- 's|| no \n|' \
- /etc/xdg/openbox/rc.xml
- touch /decorlock
-fi
-
-# Fullscreen everything in openbox unless the user explicitly disables it
-if [[ ! -z ${NO_FULL+x} ]] && [[ ! -f /fulllock ]]; then
- sed -i \
- '/yes<\/maximized><\/application>/d' \
- /etc/xdg/openbox/rc.xml
- touch /fulllock
-fi
-
-# Add proot-apps
-if [ ! -f "${HOME}/.local/bin/proot-apps" ]; then
- mkdir -p ${HOME}/.local/bin/
- cp /proot-apps/* ${HOME}/.local/bin/
- echo 'export PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc
- chown apps:apps \
- ${HOME}/.bashrc \
- ${HOME}/.local/ \
- ${HOME}/.local/bin \
- ${HOME}/.local/bin/{ncat,proot-apps,proot,jq,pversion}
-elif ! diff -q /proot-apps/pversion ${HOME}/.local/bin/pversion > /dev/null; then
- cp /proot-apps/* ${HOME}/.local/bin/
- chown apps:apps ${HOME}/.local/bin/{ncat,proot-apps,proot,jq,pversion}
-fi
-
-# nginx Path
-NGINX_CONFIG=/etc/nginx/http.d/default.conf
-
-# user passed env vars
-CPORT="${CUSTOM_PORT:-3000}"
-CHPORT="${CUSTOM_HTTPS_PORT:-3001}"
-CUSER="${CUSTOM_USER:-apps}"
-SFOLDER="${SUBFOLDER:-/}"
-
-# create self signed cert
-if [ ! -f "/config/ssl/cert.pem" ]; then
- mkdir -p /config/ssl
- openssl req -new -x509 \
- -days 3650 -nodes \
- -out /config/ssl/cert.pem \
- -keyout /config/ssl/cert.key \
- -subj "/C=US/ST=CA/L=Carlsbad/O=Linuxserver.io/OU=LSIO Server/CN=*"
- chmod 600 /config/ssl/cert.key
- chown -R apps:apps /config/ssl
-fi
-
-# modify nginx config
-cp /defaults/default.conf ${NGINX_CONFIG}
-sed -i "s/3000/$CPORT/g" ${NGINX_CONFIG}
-sed -i "s/3001/$CHPORT/g" ${NGINX_CONFIG}
-sed -i "s|SUBFOLDER|$SFOLDER|g" ${NGINX_CONFIG}
-if [ ! -z ${DISABLE_IPV6+x} ]; then
- sed -i '/listen \[::\]/d' ${NGINX_CONFIG}
-fi
-if [ ! -z ${PASSWORD+x} ]; then
- printf "${CUSER}:$(openssl passwd -apr1 ${PASSWORD})\n" > /etc/nginx/.htpasswd
- sed -i 's/#//g' ${NGINX_CONFIG}
-fi
-
-cd $HOME
-exec /bin/bash /defaults/startwm.sh
-
-# We need to wait for kclient to be full up as docker init breaks audio
-sleep 5
-
-## Do we even want this?
-# Make sure this is a priv container
-if [ -e /dev/cpu_dma_latency ]; then
- if [ "${START_DOCKER}" == "true" ]; then
- exec /usr/local/bin/dockerd-entrypoint.sh -l error
- else
- sleep infinity
- fi
-fi
-
-# if anything goes wrong with Docker don't loop
-sleep infinity
-
-
-
-
-# Pass gpu flags if mounted
-if ls /dev/dri/renderD* 1> /dev/null 2>&1 && [ -z ${DISABLE_DRI+x} ] && ! which nvidia-smi; then
- HW3D="-hw3d"
-fi
-if [ -z ${DRINODE+x} ]; then
- DRINODE="/dev/dri/renderD128"
-fi
-
-exec \
- /usr/local/bin/Xvnc $DISPLAY \
- ${HW3D} \
- -PublicIP 127.0.0.1 \
- -drinode ${DRINODE} \
- -disableBasicAuth \
- -SecurityTypes None \
- -AlwaysShared \
- -http-header Cross-Origin-Embedder-Policy=require-corp \
- -http-header Cross-Origin-Opener-Policy=same-origin \
- -geometry 1024x768 \
- -sslOnly 0 \
- -RectThreads 0 \
- -websocketPort 6901 \
- -interface 0.0.0.0 \
- -Log *:stdout:10
-
-
-
-
-# Mic Setup
-if [ ! -f '/dev/shm/mic.lock' ]; then
- until [ -f /defaults/pid ]; do
- sleep .5
- done
- with-contenv pactl \
- load-module module-pipe-source \
- source_name=virtmic \
- file=/defaults/mic.sock \
- source_properties=device.description=LSIOMic \
- format=s16le \
- rate=44100 \
- channels=1
- with-contenv pactl \
- set-default-source virtmic
- touch /dev/shm/mic.lock
-fi
-
-# NodeJS wrapper
-cd /kclient
-exec \
- node index.js
-
-
-
-
-
-if pgrep -f "[n]ginx:" >/dev/null; then
- echo "Zombie nginx processes detected, sending SIGTERM"
- pkill -ef [n]ginx:
- sleep 1
-fi
-
-if pgrep -f "[n]ginx:" >/dev/null; then
- echo "Zombie nginx processes still active, sending SIGKILL"
- pkill -9 -ef [n]ginx:
- sleep 1
-fi
-
-exec /usr/sbin/nginx -g 'daemon off;'
-
-
-
-
-exec \
- /usr/bin/pulseaudio \
- --log-level=0 \
- --log-target=stderr \
- --exit-idle-time=-1 > /dev/null 2>&1
-