Compare commits
102 Commits
dev-sunshi
...
0.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4cad0aab0 | ||
|
|
12cc16459a | ||
|
|
c651034d13 | ||
|
|
93718e1855 | ||
|
|
5a1d20daf5 | ||
|
|
15512a485f | ||
|
|
eeca08ce38 | ||
|
|
96d318ebd0 | ||
|
|
8b11bca749 | ||
|
|
9d43f152b9 | ||
|
|
0dd343aea9 | ||
|
|
37f7280dba | ||
|
|
7552680a01 | ||
|
|
9a460b27e6 | ||
|
|
c452e67fd7 | ||
|
|
22cf7e5980 | ||
|
|
20c6b515ed | ||
|
|
ae88645245 | ||
|
|
868def8906 | ||
|
|
5cef857d34 | ||
|
|
b5cb3fb0db | ||
|
|
3867701a6b | ||
|
|
35722dfa84 | ||
|
|
acee2481c1 | ||
|
|
cc8bc1b02d | ||
|
|
cb751f5a80 | ||
|
|
aa1edd48e0 | ||
|
|
771c47d602 | ||
|
|
0981af0a17 | ||
|
|
608f772ccc | ||
|
|
60fa2363eb | ||
|
|
7513c19bfd | ||
|
|
e4cf09dcb0 | ||
|
|
3cce8f79f8 | ||
|
|
90510bd8ea | ||
|
|
c8d613da5b | ||
|
|
63137d43ec | ||
|
|
3faf8df134 | ||
|
|
c3480448ff | ||
|
|
e0dc046470 | ||
|
|
269e71a0db | ||
|
|
97613b227f | ||
|
|
39d4ce0a0c | ||
|
|
b7bb479635 | ||
|
|
b89e2f565d | ||
|
|
1b7873833c | ||
|
|
890b9d22d2 | ||
|
|
2f118e4a51 | ||
|
|
dd3f079d71 | ||
|
|
c925ff8c87 | ||
|
|
aea4d51159 | ||
|
|
1454b704a2 | ||
|
|
d899ebd965 | ||
|
|
b51036a697 | ||
|
|
8ad830d5e4 | ||
|
|
2c8f6150e9 | ||
|
|
6be269a3bb | ||
|
|
ee4fd33e72 | ||
|
|
c671ba85cc | ||
|
|
4f94568262 | ||
|
|
fed3000700 | ||
|
|
c731e2e0a0 | ||
|
|
02a94566b2 | ||
|
|
5837843aa2 | ||
|
|
ac7dc533e7 | ||
|
|
577d0ef299 | ||
|
|
ca5821774b | ||
|
|
edab557c20 | ||
|
|
0414726448 | ||
|
|
d2b4d2cae7 | ||
|
|
53af510b45 | ||
|
|
cfeb39c268 | ||
|
|
6913938585 | ||
|
|
9c3497d73a | ||
|
|
658b18a634 | ||
|
|
d386c282e6 | ||
|
|
af1c17fdfd | ||
|
|
b75b496283 | ||
|
|
659bde74f5 | ||
|
|
23c5df2996 | ||
|
|
9fe592672a | ||
|
|
932e15314a | ||
|
|
3be80a920e | ||
|
|
35de069bf1 | ||
|
|
8da0bd023d | ||
|
|
26b775f66e | ||
|
|
555bd8991d | ||
|
|
42ebc826b8 | ||
|
|
0b600108f7 | ||
|
|
8d43f93b55 | ||
|
|
f92fb55290 | ||
|
|
417ab4488b | ||
|
|
fc700e2200 | ||
|
|
df9423ccad | ||
|
|
68244060ff | ||
|
|
8c6051aec7 | ||
|
|
4896a5bc36 | ||
|
|
5577410923 | ||
|
|
6a2d55196b | ||
|
|
98a4425fce | ||
|
|
d4e7048745 | ||
|
|
7505ef3b23 |
@@ -1,4 +1,2 @@
|
|||||||
config
|
config
|
||||||
devops
|
devops
|
||||||
docs/compose-files/default
|
|
||||||
docs/compose-files/sunshine
|
|
||||||
|
|||||||
48
.github/workflows/build_ci.yml
vendored
48
.github/workflows/build_ci.yml
vendored
@@ -18,6 +18,10 @@ jobs:
|
|||||||
|
|
||||||
name: Build Docker Image
|
name: Build Docker Image
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
flavour: ["debian", "arch"]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# Fetch shallow git repository
|
# Fetch shallow git repository
|
||||||
@@ -43,28 +47,35 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
id: prepare
|
id: prepare
|
||||||
run: |
|
run: |
|
||||||
echo "GITHUB_REF:${GITHUB_REF}"
|
FLAVOUR=${{ matrix.flavour }}
|
||||||
echo "GITHUB_REPOSITORY:${GITHUB_REPOSITORY}"
|
echo "FLAVOUR='${FLAVOUR}'"
|
||||||
|
echo "GITHUB_REF='${GITHUB_REF}'"
|
||||||
|
echo "GITHUB_REPOSITORY='${GITHUB_REPOSITORY}'"
|
||||||
DOCKER_IMAGE=docker.io/josh5/steam-headless
|
DOCKER_IMAGE=docker.io/josh5/steam-headless
|
||||||
VERSION_TAG=${GITHUB_REF#refs/*/}
|
VERSION_TAG=${GITHUB_REF#refs/*/}
|
||||||
|
|
||||||
DOCKER_TAGS=""
|
DOCKER_TAGS=""
|
||||||
if [[ ${VERSION_TAG%/merge} == 'master' ]]; then
|
if [[ ${VERSION_TAG%/merge} == 'master' ]]; then
|
||||||
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
|
if [[ ${FLAVOUR} == 'debian' ]]; then
|
||||||
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
|
||||||
|
fi
|
||||||
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR},"
|
||||||
elif [[ ${VERSION_TAG%/merge} == 'staging' ]]; then
|
elif [[ ${VERSION_TAG%/merge} == 'staging' ]]; then
|
||||||
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:staging,"
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-staging,"
|
||||||
elif [[ ${VERSION_TAG%/merge} =~ "dev-"* ]]; then
|
elif [[ ${VERSION_TAG%/merge} =~ "dev-"* ]]; then
|
||||||
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${VERSION_TAG%/merge},"
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION_TAG%/merge},"
|
||||||
fi
|
fi
|
||||||
if [[ ${GITHUB_REF} == refs/tags/* ]]; then
|
if [[ ${GITHUB_REF} == refs/tags/* ]]; then
|
||||||
VERSION=${GITHUB_REF#refs/tags/}
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
if [[ ${VERSION} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[-\w]*$ ]]; then
|
if [[ ${VERSION} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}[-\w]*$ ]]; then
|
||||||
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${VERSION},"
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:${FLAVOUR}-${VERSION},"
|
||||||
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
|
if [[ ${FLAVOUR} == 'debian' ]]; then
|
||||||
|
DOCKER_TAGS="${DOCKER_TAGS}${DOCKER_IMAGE}:latest,"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
echo "DOCKER_TAGS='${DOCKER_TAGS}'"
|
||||||
|
|
||||||
echo "Build: [$(date +"%F %T")] [${GITHUB_REF_NAME}] [${GITHUB_SHA}]" > ./overlay/version.txt
|
echo "Build: [$(date +"%F %T")] [${GITHUB_REF_NAME}] [${GITHUB_SHA}] [${FLAVOUR}]" > ./overlay/version.txt
|
||||||
|
|
||||||
DOCKER_PUSH="true"
|
DOCKER_PUSH="true"
|
||||||
if [[ ${DOCKER_IMAGE} != 'docker.io/josh5/steam-headless' ]]; then
|
if [[ ${DOCKER_IMAGE} != 'docker.io/josh5/steam-headless' ]]; then
|
||||||
@@ -76,11 +87,16 @@ jobs:
|
|||||||
if [[ ${VERSION_TAG%/merge} =~ ^[0-9]+$ ]]; then
|
if [[ ${VERSION_TAG%/merge} =~ ^[0-9]+$ ]]; then
|
||||||
DOCKER_PUSH="false"
|
DOCKER_PUSH="false"
|
||||||
fi
|
fi
|
||||||
|
if [[ "X${DOCKER_TAGS}" == "X" ]]; then
|
||||||
|
DOCKER_PUSH="false"
|
||||||
|
fi
|
||||||
|
echo "DOCKER_PUSH='${DOCKER_PUSH}'"
|
||||||
|
cat ./overlay/version.txt
|
||||||
|
|
||||||
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
echo "docker_image=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT
|
||||||
echo ::set-output name=docker_tags::$(echo ${DOCKER_TAGS} | sed 's/,$//')
|
echo "docker_tags=$(echo ${DOCKER_TAGS} | sed 's/,$//')" >> $GITHUB_OUTPUT
|
||||||
echo ::set-output name=docker_platforms::linux/amd64
|
echo "docker_platforms=linux/amd64" >> $GITHUB_OUTPUT
|
||||||
echo ::set-output name=docker_push::${DOCKER_PUSH}
|
echo "docker_push=${DOCKER_PUSH}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# Cache the build
|
# Cache the build
|
||||||
- name: Cache Docker layers
|
- name: Cache Docker layers
|
||||||
@@ -88,9 +104,9 @@ jobs:
|
|||||||
id: cache
|
id: cache
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ matrix.flavour }}-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-${{ matrix.flavour }}-
|
||||||
|
|
||||||
# Login to Docker Hub
|
# Login to Docker Hub
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
@@ -106,7 +122,7 @@ jobs:
|
|||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: Dockerfile
|
file: Dockerfile.${{ matrix.flavour }}
|
||||||
pull: true
|
pull: true
|
||||||
platforms: ${{ steps.prepare.outputs.docker_platforms }}
|
platforms: ${{ steps.prepare.outputs.docker_platforms }}
|
||||||
push: ${{ steps.prepare.outputs.docker_push }}
|
push: ${{ steps.prepare.outputs.docker_push }}
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1 @@
|
|||||||
config
|
config
|
||||||
docs/compose-files/default
|
|
||||||
docs/compose-files/sunshine
|
|
||||||
|
|||||||
360
Dockerfile.arch
360
Dockerfile.arch
@@ -34,6 +34,7 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -41,15 +42,25 @@ RUN \
|
|||||||
RUN \
|
RUN \
|
||||||
echo "**** Install tools ****" \
|
echo "**** Install tools ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
|
base-devel \
|
||||||
bash \
|
bash \
|
||||||
bash-completion \
|
bash-completion \
|
||||||
curl \
|
curl \
|
||||||
|
docbook-xml \
|
||||||
|
docbook-xsl \
|
||||||
|
fakeroot \
|
||||||
git \
|
git \
|
||||||
|
jq \
|
||||||
less \
|
less \
|
||||||
|
locate \
|
||||||
man-db \
|
man-db \
|
||||||
nano \
|
nano \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
pciutils \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
|
procps \
|
||||||
|
psmisc \
|
||||||
|
psutils \
|
||||||
rsync \
|
rsync \
|
||||||
screen \
|
screen \
|
||||||
sudo \
|
sudo \
|
||||||
@@ -67,6 +78,42 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Configure default user and set user env
|
||||||
|
ENV \
|
||||||
|
PUID=99 \
|
||||||
|
PGID=100 \
|
||||||
|
UMASK=000 \
|
||||||
|
USER="default" \
|
||||||
|
USER_PASSWORD="password" \
|
||||||
|
USER_HOME="/home/default" \
|
||||||
|
TZ="Pacific/Auckland" \
|
||||||
|
USER_LOCALES="en_US.UTF-8 UTF-8"
|
||||||
|
RUN \
|
||||||
|
echo "**** Configure default user '${USER}' ****" \
|
||||||
|
&& mkdir -p \
|
||||||
|
${USER_HOME} \
|
||||||
|
&& useradd -d ${USER_HOME} -s /bin/bash ${USER} \
|
||||||
|
&& chown -R ${USER} \
|
||||||
|
${USER_HOME} \
|
||||||
|
&& echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Install yay
|
||||||
|
RUN \
|
||||||
|
echo "**** Install Yay ****" \
|
||||||
|
&& pacman -Sy \
|
||||||
|
&& su - default -c 'git clone https://aur.archlinux.org/yay.git /tmp/yay && cd /tmp/yay && makepkg --noconfirm --syncdeps --install' \
|
||||||
|
&& \
|
||||||
|
echo "**** Section cleanup ****" \
|
||||||
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
|
&& rm -rf \
|
||||||
|
/tmp/yay* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -78,6 +125,7 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -90,6 +138,7 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -101,18 +150,20 @@ RUN \
|
|||||||
libva-mesa-driver \
|
libva-mesa-driver \
|
||||||
mesa-utils \
|
mesa-utils \
|
||||||
mesa-vdpau \
|
mesa-vdpau \
|
||||||
opencl-mesa \
|
|
||||||
pciutils \
|
pciutils \
|
||||||
vulkan-mesa-layers \
|
vulkan-mesa-layers \
|
||||||
|
vdpauinfo \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install X Server requirements
|
# Install X Server requirements
|
||||||
# TODO: Remove doubles
|
ENV \
|
||||||
# TODO: Things that are not required
|
XORG_SOCKET_DIR="/tmp/.X11-unix" \
|
||||||
|
XDG_RUNTIME_DIR="/tmp/.X11-unix/run"
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Install X Server requirements ****" \
|
echo "**** Install X Server requirements ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
@@ -139,62 +190,106 @@ RUN \
|
|||||||
xorg-xrandr \
|
xorg-xrandr \
|
||||||
xorg-xsetroot \
|
xorg-xsetroot \
|
||||||
xorg-xwininfo \
|
xorg-xwininfo \
|
||||||
|
xterm \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# pacman -Syu --noconfirm --needed \
|
|
||||||
# xorg-server \
|
|
||||||
# xorg-server-xephyr \
|
|
||||||
# xorg-xwininfo \
|
|
||||||
# xorg-xhost \
|
|
||||||
# xorg-xinit \
|
|
||||||
# xorg-xinput \
|
|
||||||
# xorg-xrandr \
|
|
||||||
# xorg-xprop \
|
|
||||||
# xorg-xkill \
|
|
||||||
# xorg-xbacklight \
|
|
||||||
# xorg-xsetroot
|
|
||||||
# s
|
|
||||||
# pacman -Syu --noconfirm --needed autorandr xdg-desktop-portal xdg-desktop-portal-gtk wmctrl xbindkeys xdotool xautolock
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# pacman -Syu --noconfirm --needed gestures
|
|
||||||
# pacman -Syu --noconfirm --needed numlockx
|
|
||||||
#
|
|
||||||
# echo 'Server = https://mirror.fsmg.org.nz/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist
|
|
||||||
#
|
|
||||||
# Server = https://mirror.pkgbuild.com/$repo/os/$arch
|
|
||||||
# Server = https://mirror.rackspace.com/archlinux/$repo/os/$arch
|
|
||||||
# Server = https://mirror.leaseweb.net/archlinux/$repo/os/$arch
|
|
||||||
|
|
||||||
# Install audio requirements
|
# Install audio requirements
|
||||||
|
ENV \
|
||||||
|
PULSE_SOCKET_DIR="/tmp/pulse" \
|
||||||
|
PULSE_SERVER="unix:/tmp/pulse/pulse-socket"
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Install X Server requirements ****" \
|
echo "**** Install X Server requirements ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
|
alsa-utils \
|
||||||
|
pavucontrol \
|
||||||
pulseaudio \
|
pulseaudio \
|
||||||
|
pulseaudio-alsa \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install openssh server
|
# Install desktop environment
|
||||||
|
# TODO: Install equivelent of 'msttcorefonts' and 'fonts-vlgothic'
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Install openssh server ****" \
|
echo "**** Install desktop environment ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
openssh \
|
gedit \
|
||||||
&& echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config \
|
xfce4 \
|
||||||
|
xfce4-goodies \
|
||||||
|
xfce4-terminal \
|
||||||
|
ttf-liberation \
|
||||||
|
# Delete these as they are not needed at all
|
||||||
|
&& rm -f \
|
||||||
|
/usr/share/applications/software-properties-drivers.desktop \
|
||||||
|
/usr/share/applications/xfce4-about.desktop \
|
||||||
|
/usr/share/applications/xfce4-session-logout.desktop \
|
||||||
|
# Hide these apps. They can be displayed if a user really wants them.
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-accessibility-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-color-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-mail-reader.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/vim.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/thunar-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/thunar.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/pavucontrol.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/x11vnc.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xterm.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/uxterm.desktop \
|
||||||
|
# Force these apps to be "System" Apps rather than "Categories=System;Utility;Core;GTK;Filesystem;"
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/xfce4-appfinder.desktop \
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/thunar-bulk-rename.desktop \
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/org.gnome.gedit.desktop \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# TODO: Add support for flatpaks
|
||||||
|
# Note: Debian Bullseye had bubblewrap v0.4.1 which worked fine in the Nvidia docker runtime
|
||||||
|
# At the moment this is only working beacuse /proc is being mounted again in 10-setup_user.sh
|
||||||
|
# Need to find a better solution for this...
|
||||||
|
ARG BUBBLEWRAP_VERSION=0.8.0
|
||||||
|
ENV \
|
||||||
|
XDG_DATA_DIRS="/home/default/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/"
|
||||||
|
RUN \
|
||||||
|
echo "**** Install flatpak support ****" \
|
||||||
|
&& pacman -Syu --noconfirm --needed \
|
||||||
|
flatpak \
|
||||||
|
gnome-software \
|
||||||
|
xdg-desktop-portal-gtk \
|
||||||
|
&& \
|
||||||
|
#echo "**** Build and install custom bubblewrap ****" \
|
||||||
|
# && cd /tmp \
|
||||||
|
# && wget -O /tmp/bubblewrap-${BUBBLEWRAP_VERSION:?}.tar.xz https://github.com/containers/bubblewrap/releases/download/v${BUBBLEWRAP_VERSION:?}/bubblewrap-${BUBBLEWRAP_VERSION:?}.tar.xz \
|
||||||
|
# && tar -xvf /tmp/bubblewrap-${BUBBLEWRAP_VERSION:?}.tar.xz \
|
||||||
|
# && cd /tmp/bubblewrap-${BUBBLEWRAP_VERSION:?} \
|
||||||
|
# && sed -i 's|die ("Unexpected capabilities but not setuid, old file caps config?");|printf ("Unexpected capabilities but not setuid, old file caps config?");|' ./bubblewrap.c \
|
||||||
|
# && ./autogen.sh \
|
||||||
|
# && make clean \
|
||||||
|
# && make \
|
||||||
|
# && make install
|
||||||
|
#&& \
|
||||||
|
echo "**** Configure flatpak ****" \
|
||||||
|
&& chmod u-s /usr/bin/bwrap \
|
||||||
|
&& flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo \
|
||||||
|
&& \
|
||||||
|
echo "**** Section cleanup ****" \
|
||||||
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install noVNC
|
# Install noVNC
|
||||||
# TODO: Add nginx
|
# TODO: Add nginx or remove the whole proxy setup and just connect directly for audio (I think that is the better option)
|
||||||
ARG NOVNC_VERSION=1.2.0
|
ARG NOVNC_VERSION=1.2.0
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Fetch noVNC ****" \
|
echo "**** Fetch noVNC ****" \
|
||||||
@@ -220,10 +315,18 @@ RUN \
|
|||||||
&& sed -i '/ document.title =/c\ document.title = "Steam Headless - noVNC";' \
|
&& sed -i '/ document.title =/c\ document.title = "Steam Headless - noVNC";' \
|
||||||
/opt/noVNC/app/ui.js \
|
/opt/noVNC/app/ui.js \
|
||||||
&& \
|
&& \
|
||||||
|
echo "**** Install nginx support ****" \
|
||||||
|
&& pacman -Syu --noconfirm --needed \
|
||||||
|
nginx \
|
||||||
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& rm -rf \
|
&& rm -rf \
|
||||||
/tmp/noVNC* \
|
/tmp/noVNC* \
|
||||||
/tmp/novnc.tar.gz
|
/tmp/novnc.tar.gz \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
# Install Websockify
|
# Install Websockify
|
||||||
ARG WEBSOCKETIFY_VERSION=0.10.0
|
ARG WEBSOCKETIFY_VERSION=0.10.0
|
||||||
@@ -247,176 +350,97 @@ RUN \
|
|||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& rm -rf \
|
&& rm -rf \
|
||||||
/tmp/websockify-* \
|
/tmp/websockify-* \
|
||||||
/tmp/websockify.tar.gz
|
/tmp/websockify.tar.gz \
|
||||||
|
|
||||||
# Install firefox
|
|
||||||
# TODO: MOve under de
|
|
||||||
RUN \
|
|
||||||
echo "**** Install firefox ****" \
|
|
||||||
&& pacman -Syu --noconfirm --needed \
|
|
||||||
firefox \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& pacman -Scc --noconfirm \
|
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# # Install Steam
|
# Setup browser audio streaming deps
|
||||||
# RUN \
|
|
||||||
# echo "**** Install steam ****" \
|
|
||||||
# && pacman -Syu --noconfirm --needed \
|
|
||||||
# lib32-vulkan-icd-loader
|
|
||||||
# steam \
|
|
||||||
# vulkan-icd-loader \
|
|
||||||
# && \
|
|
||||||
# echo "**** Section cleanup ****" \
|
|
||||||
# && pacman -Scc --noconfirm \
|
|
||||||
# && \
|
|
||||||
# echo
|
|
||||||
|
|
||||||
# Install desktop environment
|
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Install desktop environment ****" \
|
echo "**** Install audio streaming deps ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
gedit \
|
bzip2 \
|
||||||
xfce4 \
|
gst-libav \
|
||||||
xfce4-terminal \
|
gst-plugins-bad \
|
||||||
|
gst-plugins-base \
|
||||||
|
gst-plugins-good \
|
||||||
|
gst-plugins-ugly \
|
||||||
|
&& \
|
||||||
|
echo "**** Fetch ucspi-tcp ****" \
|
||||||
|
&& mkdir -p /tmp/ucspi-tcp-0.88 \
|
||||||
|
&& cd /tmp \
|
||||||
|
#&& wget -O /tmp/ucspi-tcp.tar.gz https://github.com/trafficgate/ucspi-tcp/archive/refs/heads/master.tar.gz \
|
||||||
|
&& wget -O /tmp/ucspi-tcp.tar.gz http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz \
|
||||||
|
&& cd /tmp/ucspi-tcp-0.88 \
|
||||||
|
&& tar -xvf /tmp/ucspi-tcp.tar.gz --strip-components=1 \
|
||||||
|
&& \
|
||||||
|
echo "**** Build and install ucspi-tcp ****" \
|
||||||
|
&& wget -O /tmp/ucspi-tcp-0.88/ucspi-tcp-0.88.errno.patch https://git.alpinelinux.org/aports/plain/testing/ucspi-tcp/ucspi-tcp-0.88.errno.patch \
|
||||||
|
&& wget -O /tmp/ucspi-tcp-0.88/ucspi-tcp-0.88.a_record.patch https://git.alpinelinux.org/aports/plain/testing/ucspi-tcp/ucspi-tcp-0.88.a_record.patch \
|
||||||
|
&& patch -p1 --input=ucspi-tcp-0.88.errno.patch \
|
||||||
|
&& patch -p1 --input=ucspi-tcp-0.88.a_record.patch \
|
||||||
|
&& sed -i 's|^/usr/local|/usr|' /tmp/ucspi-tcp-0.88/conf-home \
|
||||||
|
&& make \
|
||||||
|
&& for f in tcpserver tcprules tcprulescheck argv0 recordio tcpclient *\@ tcpcat mconnect mconnect-io addcr delcr fixcrio rblsmtpd; do \
|
||||||
|
cp $f /usr/bin/$f; \
|
||||||
|
done \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
|
&& rm -rf \
|
||||||
|
/tmp/ucspi-tcp-* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
# Install Steam
|
||||||
# Add support for flatpaks
|
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Install flatpak support ****" \
|
echo "**** Install X Server requirements ****" \
|
||||||
&& pacman -Syu --noconfirm --needed \
|
&& pacman -Syu --noconfirm --needed \
|
||||||
flatpak \
|
steam \
|
||||||
xdg-desktop-portal-gtk \
|
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& pacman -Scc --noconfirm \
|
&& pacman -Scc --noconfirm \
|
||||||
|
&& rm -fr /var/lib/pacman/sync/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
|
||||||
# TODO Append to tools
|
|
||||||
RUN \
|
|
||||||
echo "**** Install flatpak support ****" \
|
|
||||||
&& pacman -Syu --noconfirm --needed \
|
|
||||||
patch \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& pacman -Scc --noconfirm \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# # Install desktop environment
|
|
||||||
# RUN \
|
|
||||||
# echo "**** Install desktop environment ****" \
|
|
||||||
# && pacman -Syu --noconfirm --needed \
|
|
||||||
# kde-system-meta \
|
|
||||||
# konsole \
|
|
||||||
# plasma-desktop \
|
|
||||||
# && \
|
|
||||||
# echo "**** Section cleanup ****" \
|
|
||||||
# && pacman -Scc --noconfirm \
|
|
||||||
# && \
|
|
||||||
# echo
|
|
||||||
|
|
||||||
# # Install desktop environment
|
|
||||||
# RUN \
|
|
||||||
# echo "**** Install desktop environment ****" \
|
|
||||||
# && pacman -Syu --noconfirm --needed \
|
|
||||||
# cinnamon \
|
|
||||||
# polkit-gnome \
|
|
||||||
# gnome-terminal \
|
|
||||||
# && \
|
|
||||||
# echo "**** Section cleanup ****" \
|
|
||||||
# && pacman -Scc --noconfirm \
|
|
||||||
# && \
|
|
||||||
# echo
|
|
||||||
|
|
||||||
# # Setup browser audio streaming deps
|
|
||||||
# RUN \
|
|
||||||
# echo "**** Update apt database ****" \
|
|
||||||
# && apt-get update \
|
|
||||||
# && \
|
|
||||||
# echo "**** Install audio streaming deps ****" \
|
|
||||||
# && apt-get install -y --no-install-recommends \
|
|
||||||
# bzip2 \
|
|
||||||
# gstreamer1.0-alsa \
|
|
||||||
# gstreamer1.0-gl \
|
|
||||||
# gstreamer1.0-gtk3 \
|
|
||||||
# gstreamer1.0-libav \
|
|
||||||
# gstreamer1.0-plugins-base \
|
|
||||||
# gstreamer1.0-plugins-good \
|
|
||||||
# gstreamer1.0-pulseaudio \
|
|
||||||
# gstreamer1.0-qt5 \
|
|
||||||
# gstreamer1.0-tools \
|
|
||||||
# gstreamer1.0-x \
|
|
||||||
# libgstreamer1.0-0 \
|
|
||||||
# libncursesw5 \
|
|
||||||
# libopenal1 \
|
|
||||||
# libsdl-image1.2 \
|
|
||||||
# libsdl-ttf2.0-0 \
|
|
||||||
# libsdl1.2debian \
|
|
||||||
# libsndfile1 \
|
|
||||||
# ucspi-tcp \
|
|
||||||
# && \
|
|
||||||
# echo "**** Section cleanup ****" \
|
|
||||||
# && apt-get clean autoclean -y \
|
|
||||||
# && apt-get autoremove -y \
|
|
||||||
# && rm -rf \
|
|
||||||
# /var/lib/apt/lists/* \
|
|
||||||
# /var/tmp/* \
|
|
||||||
# /tmp/* \
|
|
||||||
# && \
|
|
||||||
# echo
|
|
||||||
|
|
||||||
# Configure default user and set env
|
|
||||||
ENV \
|
|
||||||
USER="default" \
|
|
||||||
USER_PASSWORD="password" \
|
|
||||||
USER_HOME="/home/default" \
|
|
||||||
TZ="Pacific/Auckland" \
|
|
||||||
USER_LOCALES="en_US.UTF-8 UTF-8"
|
|
||||||
RUN \
|
|
||||||
echo "**** Configure default user '${USER}' ****" \
|
|
||||||
&& mkdir -p \
|
|
||||||
${USER_HOME} \
|
|
||||||
&& useradd -d ${USER_HOME} -s /bin/bash ${USER} \
|
|
||||||
&& chown -R ${USER} \
|
|
||||||
${USER_HOME} \
|
|
||||||
&& echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
|
||||||
|
|
||||||
# Add FS overlay
|
# Add FS overlay
|
||||||
COPY overlay /
|
COPY overlay /
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
echo "**** Setup Steam Supervisor ****" \
|
||||||
|
&& sed -i 's#/usr/games/steam#/usr/bin/steam#g' /etc/supervisor.d/steam.ini \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
# Set display environment variables
|
# Set display environment variables
|
||||||
ENV \
|
ENV \
|
||||||
DISPLAY_CDEPTH="24" \
|
DISPLAY_CDEPTH="24" \
|
||||||
DISPLAY_DPI="96" \
|
DISPLAY_REFRESH="120" \
|
||||||
DISPLAY_REFRESH="60" \
|
|
||||||
DISPLAY_SIZEH="900" \
|
DISPLAY_SIZEH="900" \
|
||||||
DISPLAY_SIZEW="1600" \
|
DISPLAY_SIZEW="1600" \
|
||||||
DISPLAY_VIDEO_PORT="DFP" \
|
DISPLAY_VIDEO_PORT="DFP" \
|
||||||
DISPLAY=":55" \
|
DISPLAY=":55"
|
||||||
|
ENV \
|
||||||
NVIDIA_DRIVER_CAPABILITIES="all" \
|
NVIDIA_DRIVER_CAPABILITIES="all" \
|
||||||
NVIDIA_VISIBLE_DEVICES="all"
|
NVIDIA_VISIBLE_DEVICES="all"
|
||||||
|
|
||||||
# Set container configuration environment variables
|
# Set container configuration environment variables
|
||||||
ENV \
|
ENV \
|
||||||
MODE="primary" \
|
MODE="primary" \
|
||||||
ENABLE_VNC_AUDIO="true"
|
WEB_UI_MODE="vnc" \
|
||||||
|
ENABLE_VNC_AUDIO="true" \
|
||||||
|
NEKO_PASSWORD=neko \
|
||||||
|
NEKO_PASSWORD_ADMIN=admin \
|
||||||
|
ENABLE_STEAM="true" \
|
||||||
|
STEAM_ARGS="-silent" \
|
||||||
|
ENABLE_SUNSHINE="false" \
|
||||||
|
ENABLE_EVDEV_INPUTS="false"
|
||||||
|
|
||||||
# Configure required ports
|
# Configure required ports
|
||||||
ENV \
|
ENV \
|
||||||
PORT_SSH="" \
|
PORT_NOVNC_WEB="8083" \
|
||||||
PORT_NOVNC_WEB="8083"
|
NEKO_NAT1TO1=""
|
||||||
|
|
||||||
# Expose the required ports
|
# Expose the required ports
|
||||||
EXPOSE 8083
|
EXPOSE 8083
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
FROM debian:bullseye-slim
|
FROM debian:bookworm-slim
|
||||||
LABEL maintainer="Josh.5 <jsunnex@gmail.com>"
|
LABEL maintainer="Josh.5 <jsunnex@gmail.com>"
|
||||||
|
|
||||||
# Update package repos
|
# Update package repos
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& sed -i '/^.*main/ s/$/ contrib non-free/' /etc/apt/sources.list \
|
&& sed -i '/^Components: main/ s/$/ contrib non-free/' /etc/apt/sources.list.d/debian.sources \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -64,21 +64,26 @@ RUN \
|
|||||||
bash-completion \
|
bash-completion \
|
||||||
curl \
|
curl \
|
||||||
git \
|
git \
|
||||||
|
jq \
|
||||||
less \
|
less \
|
||||||
man-db \
|
man-db \
|
||||||
mlocate \
|
mlocate \
|
||||||
nano \
|
nano \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
p7zip-full \
|
||||||
patch \
|
patch \
|
||||||
pciutils \
|
pciutils \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
procps \
|
procps \
|
||||||
|
psmisc \
|
||||||
|
psutils \
|
||||||
rsync \
|
rsync \
|
||||||
screen \
|
screen \
|
||||||
sudo \
|
sudo \
|
||||||
unzip \
|
unzip \
|
||||||
vim \
|
vim \
|
||||||
wget \
|
wget \
|
||||||
|
xmlstarlet \
|
||||||
xz-utils \
|
xz-utils \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Install python ****" \
|
echo "**** Install python ****" \
|
||||||
@@ -87,6 +92,7 @@ RUN \
|
|||||||
python3-numpy \
|
python3-numpy \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
python3-setuptools \
|
python3-setuptools \
|
||||||
|
python3-venv \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
@@ -98,6 +104,27 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
# Configure default user and set user env
|
||||||
|
ENV \
|
||||||
|
PUID=99 \
|
||||||
|
PGID=100 \
|
||||||
|
UMASK=000 \
|
||||||
|
USER="default" \
|
||||||
|
USER_PASSWORD="password" \
|
||||||
|
USER_HOME="/home/default" \
|
||||||
|
TZ="Pacific/Auckland" \
|
||||||
|
USER_LOCALES="en_US.UTF-8 UTF-8"
|
||||||
|
RUN \
|
||||||
|
echo "**** Configure default user '${USER}' ****" \
|
||||||
|
&& mkdir -p \
|
||||||
|
${USER_HOME} \
|
||||||
|
&& useradd -d ${USER_HOME} -s /bin/bash ${USER} \
|
||||||
|
&& chown -R ${USER} \
|
||||||
|
${USER_HOME} \
|
||||||
|
&& echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
# Install supervisor
|
# Install supervisor
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
@@ -118,6 +145,8 @@ RUN \
|
|||||||
echo
|
echo
|
||||||
|
|
||||||
# Install mesa and vulkan requirements
|
# Install mesa and vulkan requirements
|
||||||
|
# TODO: Strip this section back to only what is required for all GPU types.
|
||||||
|
# Anything only required for Intel/AMD/NVIDIA should go in the container init.
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& dpkg --add-architecture i386 \
|
&& dpkg --add-architecture i386 \
|
||||||
@@ -159,6 +188,11 @@ RUN \
|
|||||||
echo
|
echo
|
||||||
|
|
||||||
# Install X Server requirements
|
# Install X Server requirements
|
||||||
|
# TODO: Refine this list of packages to only what is required.
|
||||||
|
ENV \
|
||||||
|
XORG_SOCKET_DIR="/tmp/.X11-unix" \
|
||||||
|
XDG_RUNTIME_DIR="/tmp/.X11-unix/run" \
|
||||||
|
XDG_SESSION_TYPE="x11"
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
@@ -169,10 +203,21 @@ RUN \
|
|||||||
dbus-x11 \
|
dbus-x11 \
|
||||||
libxcomposite-dev \
|
libxcomposite-dev \
|
||||||
libxcursor1 \
|
libxcursor1 \
|
||||||
|
wmctrl \
|
||||||
|
libfuse2 \
|
||||||
|
x11-utils \
|
||||||
x11-xfs-utils \
|
x11-xfs-utils \
|
||||||
|
x11-xkb-utils \
|
||||||
|
x11-xserver-utils \
|
||||||
x11vnc \
|
x11vnc \
|
||||||
xauth \
|
xauth \
|
||||||
|
xbindkeys \
|
||||||
|
xclip \
|
||||||
|
xcvt \
|
||||||
|
xdotool \
|
||||||
|
xfishtank \
|
||||||
xfonts-base \
|
xfonts-base \
|
||||||
|
xinit \
|
||||||
xorg \
|
xorg \
|
||||||
xserver-xorg-core \
|
xserver-xorg-core \
|
||||||
xserver-xorg-input-evdev \
|
xserver-xorg-input-evdev \
|
||||||
@@ -180,7 +225,6 @@ RUN \
|
|||||||
xserver-xorg-legacy \
|
xserver-xorg-legacy \
|
||||||
xserver-xorg-video-all \
|
xserver-xorg-video-all \
|
||||||
xserver-xorg-video-dummy \
|
xserver-xorg-video-dummy \
|
||||||
xvfb \
|
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
@@ -193,6 +237,9 @@ RUN \
|
|||||||
echo
|
echo
|
||||||
|
|
||||||
# Install audio requirements
|
# Install audio requirements
|
||||||
|
ENV \
|
||||||
|
PULSE_SOCKET_DIR="/tmp/pulse" \
|
||||||
|
PULSE_SERVER="unix:/tmp/pulse/pulse-socket"
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
@@ -214,15 +261,49 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install openssh server
|
# Install desktop environment
|
||||||
|
# TODO: Specify all needed packages and add '--no-install-recommends'
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Install openssh server ****" \
|
echo "**** Install desktop environment ****" \
|
||||||
&& apt-get install -y \
|
&& apt-get install -y \
|
||||||
openssh-server \
|
fonts-vlgothic \
|
||||||
&& echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config \
|
gedit \
|
||||||
|
imagemagick \
|
||||||
|
msttcorefonts \
|
||||||
|
xdg-utils \
|
||||||
|
xfce4 \
|
||||||
|
xfce4-terminal \
|
||||||
|
# Delete these as they are not needed at all
|
||||||
|
&& rm -f \
|
||||||
|
/usr/share/applications/software-properties-drivers.desktop \
|
||||||
|
/usr/share/applications/xfce4-about.desktop \
|
||||||
|
/usr/share/applications/xfce4-session-logout.desktop \
|
||||||
|
# Hide these apps. They can be displayed if a user really wants them.
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-accessibility-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-color-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-mail-reader.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/xfce4-web-browser.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/vim.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/thunar-settings.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/thunar.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/pavucontrol.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/x11vnc.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/display-im6.q16.desktop \
|
||||||
|
# These are named specifically for Debain
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/debian-xterm.desktop \
|
||||||
|
&& sed -i '/[Desktop Entry]/a\NoDisplay=true' /usr/share/applications/debian-uxterm.desktop \
|
||||||
|
# Force these apps to be "System" Apps rather than "Categories=System;Utility;Core;GTK;Filesystem;"
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/xfce4-appfinder.desktop \
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/thunar-bulk-rename.desktop \
|
||||||
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/org.gnome.gedit.desktop \
|
||||||
|
&& \
|
||||||
|
echo "**** Install WoL Manager requirements ****" \
|
||||||
|
&& apt-get install -y \
|
||||||
|
tcpdump \
|
||||||
|
xprintidle \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
@@ -234,54 +315,74 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install Neko server
|
# Add support for flatpaks
|
||||||
COPY --from=m1k1o/neko:base /usr/bin/neko /usr/bin/neko
|
ENV \
|
||||||
COPY --from=m1k1o/neko:base /var/www /var/www
|
XDG_DATA_DIRS="/home/default/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/"
|
||||||
|
|
||||||
# Install noVNC
|
|
||||||
ARG NOVNC_VERSION=1.2.0
|
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Fetch noVNC ****" \
|
|
||||||
&& cd /tmp \
|
|
||||||
&& wget -O /tmp/novnc.tar.gz https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.tar.gz \
|
|
||||||
&& \
|
|
||||||
echo "**** Extract noVNC ****" \
|
|
||||||
&& cd /tmp \
|
|
||||||
&& tar -xvf /tmp/novnc.tar.gz \
|
|
||||||
&& \
|
|
||||||
echo "**** Configure noVNC ****" \
|
|
||||||
&& cd /tmp/noVNC-${NOVNC_VERSION} \
|
|
||||||
&& sed -i 's/credentials: { password: password } });/credentials: { password: password },\n wsProtocols: ["'"binary"'"] });/g' app/ui.js \
|
|
||||||
&& mkdir -p /opt \
|
|
||||||
&& rm -rf /opt/noVNC \
|
|
||||||
&& cd /opt \
|
|
||||||
&& mv -f /tmp/noVNC-${NOVNC_VERSION} /opt/noVNC \
|
|
||||||
&& cd /opt/noVNC \
|
|
||||||
&& ln -s vnc.html index.html \
|
|
||||||
&& chmod -R 755 /opt/noVNC \
|
|
||||||
&& \
|
|
||||||
echo "**** Modify noVNC title ****" \
|
|
||||||
&& sed -i '/ document.title =/c\ document.title = "Steam Headless - noVNC";' \
|
|
||||||
/opt/noVNC/app/ui.js \
|
|
||||||
&& \
|
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Install nginx support ****" \
|
echo "**** Install flatpak support ****" \
|
||||||
&& apt-get install -y \
|
&& apt-get install -y --no-install-recommends \
|
||||||
nginx \
|
flatpak \
|
||||||
|
gnome-software-plugin-flatpak \
|
||||||
|
&& \
|
||||||
|
echo "**** Configure flatpak ****" \
|
||||||
|
&& flatpak remote-add flathub https://flathub.org/repo/flathub.flatpakrepo \
|
||||||
|
&& dpkg-statoverride --update --add root root 0755 /usr/bin/bwrap \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
&& apt-get autoremove -y \
|
&& apt-get autoremove -y \
|
||||||
&& rm -rf \
|
&& rm -rf \
|
||||||
/var/lib/apt/lists/* \
|
/var/lib/apt/lists/* \
|
||||||
/tmp/noVNC* \
|
/var/tmp/* \
|
||||||
/tmp/novnc.tar.gz
|
/tmp/* \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# TODO: Deprecate neko
|
||||||
|
# Install Neko server
|
||||||
|
COPY --from=m1k1o/neko:base /usr/bin/neko /usr/bin/neko
|
||||||
|
COPY --from=m1k1o/neko:base /var/www /var/www
|
||||||
|
|
||||||
|
# Install Web Frontend
|
||||||
|
ARG FRONTEND_VERSION=a8eb92f
|
||||||
|
RUN \
|
||||||
|
echo "**** Fetch Web Frontend ****" \
|
||||||
|
&& mkdir -p /opt \
|
||||||
|
&& cd /opt \
|
||||||
|
&& rm -rf /opt/frontend \
|
||||||
|
&& git clone https://github.com/Steam-Headless/frontend.git --branch master /opt/frontend \
|
||||||
|
&& cd /opt/frontend \
|
||||||
|
&& git checkout ${FRONTEND_VERSION} 2> /dev/null \
|
||||||
|
&& git submodule init \
|
||||||
|
&& git submodule update --depth 1 --recursive \
|
||||||
|
&& rm -rf /opt/frontend/.git \
|
||||||
|
&& \
|
||||||
|
echo "**** Configure Web Frontend ****" \
|
||||||
|
&& echo '<!DOCTYPE html>' > /opt/frontend/index.html \
|
||||||
|
&& echo '<html><head><meta http-equiv="refresh" content="0;url=./web/"></head><body><p>If you are not redirected, <a href="./web/">click here</a>.</p></body></html>' >> /opt/frontend/index.html \
|
||||||
|
&& chmod -R 755 /opt/frontend \
|
||||||
|
&& convert /opt/frontend/web/images/icons/novnc-ios-180.png -resize "128x128" /tmp/steam-headless.png \
|
||||||
|
&& xdg-icon-resource install --novendor --size 128 /tmp/steam-headless.png \
|
||||||
|
&& \
|
||||||
|
echo "**** Section cleanup ****" \
|
||||||
|
&& rm -f /tmp/steam-headless.png
|
||||||
|
|
||||||
# Install Websockify
|
# Install Websockify
|
||||||
ARG WEBSOCKETIFY_VERSION=0.10.0
|
ARG WEBSOCKETIFY_VERSION=0.11.0
|
||||||
RUN \
|
RUN \
|
||||||
|
echo "**** Update apt database ****" \
|
||||||
|
&& apt-get update \
|
||||||
|
&& \
|
||||||
|
echo "**** Install Websockify dependencies ****" \
|
||||||
|
&& apt-get install -y \
|
||||||
|
python3-numpy \
|
||||||
|
python3-requests \
|
||||||
|
python3-jwcrypto \
|
||||||
|
python3-redis \
|
||||||
|
&& \
|
||||||
echo "**** Fetch Websockify ****" \
|
echo "**** Fetch Websockify ****" \
|
||||||
&& cd /tmp \
|
&& cd /tmp \
|
||||||
&& wget -O /tmp/websockify.tar.gz https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.tar.gz \
|
&& wget -O /tmp/websockify.tar.gz https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.tar.gz \
|
||||||
@@ -290,110 +391,18 @@ RUN \
|
|||||||
&& cd /tmp \
|
&& cd /tmp \
|
||||||
&& tar -xvf /tmp/websockify.tar.gz \
|
&& tar -xvf /tmp/websockify.tar.gz \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Install Websockify to main ****" \
|
echo "**** Install Websockify to Web Frontend path ****" \
|
||||||
&& cd /tmp/websockify-${WEBSOCKETIFY_VERSION} \
|
|
||||||
&& python3 ./setup.py install \
|
|
||||||
&& \
|
|
||||||
echo "**** Install Websockify to noVNC path ****" \
|
|
||||||
&& cd /tmp \
|
&& cd /tmp \
|
||||||
&& mv -v /tmp/websockify-${WEBSOCKETIFY_VERSION} /opt/noVNC/utils/websockify \
|
&& mv -v /tmp/websockify-${WEBSOCKETIFY_VERSION} /opt/frontend/utils/websockify \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
|
&& apt-get clean autoclean -y \
|
||||||
|
&& apt-get autoremove -y \
|
||||||
&& rm -rf \
|
&& rm -rf \
|
||||||
|
/var/lib/apt/lists/* \
|
||||||
/tmp/websockify-* \
|
/tmp/websockify-* \
|
||||||
/tmp/websockify.tar.gz
|
/tmp/websockify.tar.gz
|
||||||
|
|
||||||
# Add support for flatpaks
|
|
||||||
RUN \
|
|
||||||
echo "**** Update apt database ****" \
|
|
||||||
&& apt-get update \
|
|
||||||
&& \
|
|
||||||
echo "**** Install flatpak support ****" \
|
|
||||||
&& apt-get install -y \
|
|
||||||
bridge-utils \
|
|
||||||
flatpak \
|
|
||||||
libpam-cgfs \
|
|
||||||
libvirt0 \
|
|
||||||
lxc \
|
|
||||||
uidmap \
|
|
||||||
&& \
|
|
||||||
echo "**** Configure flatpak ****" \
|
|
||||||
&& chmod u+s /usr/bin/bwrap \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& apt-get clean autoclean -y \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& rm -rf \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
/tmp/* \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Install desktop environment
|
|
||||||
RUN \
|
|
||||||
echo "**** Update apt database ****" \
|
|
||||||
&& apt-get update \
|
|
||||||
&& \
|
|
||||||
echo "**** Install desktop environment ****" \
|
|
||||||
&& apt-get install -y \
|
|
||||||
xfce4 \
|
|
||||||
xfce4-terminal \
|
|
||||||
msttcorefonts \
|
|
||||||
fonts-vlgothic \
|
|
||||||
gedit \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& apt-get clean autoclean -y \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& rm -rf \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
/tmp/* \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Install Steam
|
|
||||||
RUN \
|
|
||||||
echo "**** Install steam ****" \
|
|
||||||
&& dpkg --add-architecture i386 \
|
|
||||||
&& apt-get update \
|
|
||||||
&& echo steam steam/question select "I AGREE" | debconf-set-selections \
|
|
||||||
&& echo steam steam/license note '' | debconf-set-selections \
|
|
||||||
&& apt-get install -y \
|
|
||||||
&& apt-get install -y \
|
|
||||||
steam \
|
|
||||||
steam-devices \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& apt-get clean autoclean -y \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& rm -rf \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
/tmp/* \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Install firefox
|
|
||||||
RUN \
|
|
||||||
echo "**** Update apt database ****" \
|
|
||||||
&& apt-get update \
|
|
||||||
&& \
|
|
||||||
echo "**** Install firefox ****" \
|
|
||||||
&& apt-get install -y \
|
|
||||||
firefox-esr \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& apt-get clean autoclean -y \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& rm -rf \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
/tmp/* \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Setup audio streaming deps
|
# Setup audio streaming deps
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
@@ -434,30 +443,6 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Install sunshine
|
|
||||||
ARG SUNSHINE_VERSION=0.11.1
|
|
||||||
RUN \
|
|
||||||
echo "**** Fetch Sunshine deb package ****" \
|
|
||||||
&& cd /tmp \
|
|
||||||
&& wget -O /tmp/sunshine-debian.deb \
|
|
||||||
https://github.com/loki-47-6F-64/sunshine/releases/download/v${SUNSHINE_VERSION}/sunshine-debian.deb \
|
|
||||||
&& \
|
|
||||||
echo "**** Update apt database ****" \
|
|
||||||
&& apt-get update \
|
|
||||||
&& \
|
|
||||||
echo "**** Install Sunshine ****" \
|
|
||||||
&& apt-get install -y /tmp/sunshine-debian.deb \
|
|
||||||
&& \
|
|
||||||
echo "**** Section cleanup ****" \
|
|
||||||
&& apt-get clean autoclean -y \
|
|
||||||
&& apt-get autoremove -y \
|
|
||||||
&& rm -rf \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
/tmp/* \
|
|
||||||
&& \
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Setup video streaming deps
|
# Setup video streaming deps
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Update apt database ****" \
|
echo "**** Update apt database ****" \
|
||||||
@@ -468,7 +453,6 @@ RUN \
|
|||||||
intel-media-va-driver-non-free \
|
intel-media-va-driver-non-free \
|
||||||
i965-va-driver-shaders \
|
i965-va-driver-shaders \
|
||||||
libva2 \
|
libva2 \
|
||||||
vainfo \
|
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
@@ -480,37 +464,17 @@ RUN \
|
|||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# Setup dind
|
# Install tools for monitoring hardware
|
||||||
# Ref:
|
|
||||||
# - https://github.com/docker-library/docker/blob/master/20.10/dind/Dockerfile
|
|
||||||
# - https://docs.nvidia.com/ai-enterprise/deployment-guide/dg-docker.html
|
|
||||||
ARG DOCKER_VERSION=20.10.18
|
|
||||||
ARG DOCKER_COMPOSE_VERSION=v2.11.2
|
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Fetch Docker static binary package ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& cd /tmp \
|
|
||||||
&& wget -O /tmp/docker-${DOCKER_VERSION}.tgz \
|
|
||||||
https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz \
|
|
||||||
&& \
|
|
||||||
echo "**** Extract static binaries ****" \
|
|
||||||
&& mkdir -p /usr/local/bin \
|
|
||||||
&& tar --extract \
|
|
||||||
--file /tmp/docker-${DOCKER_VERSION}.tgz \
|
|
||||||
--strip-components 1 \
|
|
||||||
--directory /usr/local/bin/ \
|
|
||||||
--no-same-owner \
|
|
||||||
&& \
|
|
||||||
echo "**** Install docker-compose ****" \
|
|
||||||
&& wget -O /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-Linux-x86_64" \
|
|
||||||
&& chmod +x /usr/local/bin/docker-compose \
|
|
||||||
&& \
|
|
||||||
echo "**** Install nvidia runtime ****" \
|
|
||||||
&& distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
|
|
||||||
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - \
|
|
||||||
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list \
|
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& apt-get install -y \
|
&& \
|
||||||
nvidia-container-toolkit \
|
echo "**** Install useful HW monitoring tools ****" \
|
||||||
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
cpu-x \
|
||||||
|
htop \
|
||||||
|
vainfo \
|
||||||
|
vdpauinfo \
|
||||||
&& \
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
@@ -521,27 +485,68 @@ RUN \
|
|||||||
/tmp/* \
|
/tmp/* \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
VOLUME /var/lib/docker
|
|
||||||
|
|
||||||
|
# Install Sunshine
|
||||||
# Configure default user and set env
|
COPY --from=lizardbyte/sunshine:b00d7af-debian-bookworm /sunshine.deb /usr/src/sunshine.deb
|
||||||
ENV \
|
|
||||||
PUID=99 \
|
|
||||||
PGID=100 \
|
|
||||||
UMASK=000 \
|
|
||||||
USER="default" \
|
|
||||||
USER_PASSWORD="password" \
|
|
||||||
USER_HOME="/home/default" \
|
|
||||||
TZ="Pacific/Auckland" \
|
|
||||||
USER_LOCALES="en_US.UTF-8 UTF-8"
|
|
||||||
RUN \
|
RUN \
|
||||||
echo "**** Configure default user '${USER}' ****" \
|
echo "**** Update apt database ****" \
|
||||||
&& mkdir -p \
|
&& apt-get update \
|
||||||
${USER_HOME} \
|
&& \
|
||||||
&& useradd -d ${USER_HOME} -s /bin/bash ${USER} \
|
echo "**** Install Sunshine requirements ****" \
|
||||||
&& chown -R ${USER} \
|
&& apt-get install -y \
|
||||||
${USER_HOME} \
|
va-driver-all \
|
||||||
&& echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
|
&& \
|
||||||
|
echo "**** Install Sunshine ****" \
|
||||||
|
&& apt-get install -y \
|
||||||
|
/usr/src/sunshine.deb \
|
||||||
|
&& \
|
||||||
|
echo "**** Section cleanup ****" \
|
||||||
|
&& apt-get clean autoclean -y \
|
||||||
|
&& apt-get autoremove -y \
|
||||||
|
&& rm -rf \
|
||||||
|
/var/lib/apt/lists/* \
|
||||||
|
/var/tmp/* \
|
||||||
|
/tmp/* \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Install Steam
|
||||||
|
RUN \
|
||||||
|
echo "**** Update apt database ****" \
|
||||||
|
&& apt-get update \
|
||||||
|
&& \
|
||||||
|
echo "**** Install Steam ****" \
|
||||||
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
steam \
|
||||||
|
&& ln -sf /usr/games/steam /usr/bin/steam \
|
||||||
|
&& \
|
||||||
|
echo "**** Section cleanup ****" \
|
||||||
|
&& apt-get clean autoclean -y \
|
||||||
|
&& apt-get autoremove -y \
|
||||||
|
&& rm -rf \
|
||||||
|
/var/lib/apt/lists/* \
|
||||||
|
/var/tmp/* \
|
||||||
|
/tmp/* \
|
||||||
|
&& \
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Various other tools
|
||||||
|
ARG DUMB_INIT_VERSION=1.2.5
|
||||||
|
ARG DUMB_UDEV_VERSION=64d1427
|
||||||
|
RUN \
|
||||||
|
echo "**** Install dumb-init ****" \
|
||||||
|
&& wget --no-check-certificate --no-cookies --quiet \
|
||||||
|
-O /usr/bin/dumb-init \
|
||||||
|
https://github.com/Yelp/dumb-init/releases/download/v${DUMB_INIT_VERSION}/dumb-init_${DUMB_INIT_VERSION}_x86_64 \
|
||||||
|
&& chmod +x /usr/bin/dumb-init \
|
||||||
|
&& \
|
||||||
|
echo "**** Install dumb-udev ****" \
|
||||||
|
&& python3 -m pip install \
|
||||||
|
--break-system-packages \
|
||||||
|
--pre \
|
||||||
|
--upgrade \
|
||||||
|
--no-cache-dir \
|
||||||
|
git+https://github.com/Steam-Headless/dumb-udev.git@${DUMB_UDEV_VERSION} \
|
||||||
&& \
|
&& \
|
||||||
echo
|
echo
|
||||||
|
|
||||||
@@ -551,21 +556,14 @@ COPY overlay /
|
|||||||
# Set display environment variables
|
# Set display environment variables
|
||||||
ENV \
|
ENV \
|
||||||
DISPLAY_CDEPTH="24" \
|
DISPLAY_CDEPTH="24" \
|
||||||
DISPLAY_DPI="96" \
|
DISPLAY_REFRESH="120" \
|
||||||
DISPLAY_REFRESH="60" \
|
|
||||||
DISPLAY_SIZEH="900" \
|
DISPLAY_SIZEH="900" \
|
||||||
DISPLAY_SIZEW="1600" \
|
DISPLAY_SIZEW="1600" \
|
||||||
DISPLAY_VIDEO_PORT="DFP" \
|
DISPLAY_VIDEO_PORT="DFP" \
|
||||||
DISPLAY=":55" \
|
DISPLAY=":55"
|
||||||
NVIDIA_DRIVER_CAPABILITIES="all" \
|
|
||||||
NVIDIA_VISIBLE_DEVICES="all" \
|
|
||||||
XORG_SOCKET_DIR="/tmp/.X11-unix" \
|
|
||||||
XDG_RUNTIME_DIR="/tmp/.X11-unix/run"
|
|
||||||
|
|
||||||
# Set pulseaudio environment variables
|
|
||||||
ENV \
|
ENV \
|
||||||
PULSE_SOCKET_DIR="/tmp/pulse" \
|
NVIDIA_DRIVER_CAPABILITIES="all" \
|
||||||
PULSE_SERVER="unix:/tmp/pulse/pulse-socket"
|
NVIDIA_VISIBLE_DEVICES="all"
|
||||||
|
|
||||||
# Set container configuration environment variables
|
# Set container configuration environment variables
|
||||||
ENV \
|
ENV \
|
||||||
@@ -574,12 +572,14 @@ ENV \
|
|||||||
ENABLE_VNC_AUDIO="true" \
|
ENABLE_VNC_AUDIO="true" \
|
||||||
NEKO_PASSWORD=neko \
|
NEKO_PASSWORD=neko \
|
||||||
NEKO_PASSWORD_ADMIN=admin \
|
NEKO_PASSWORD_ADMIN=admin \
|
||||||
ENABLED_PLUGINS="" \
|
ENABLE_STEAM="true" \
|
||||||
ENABLE_EVDEV_INPUTS="false"
|
STEAM_ARGS="-silent" \
|
||||||
|
ENABLE_SUNSHINE="true" \
|
||||||
|
ENABLE_EVDEV_INPUTS="true" \
|
||||||
|
ENABLE_WOL_POWER_MANAGER="false"
|
||||||
|
|
||||||
# Configure required ports
|
# Configure required ports
|
||||||
ENV \
|
ENV \
|
||||||
PORT_SSH="" \
|
|
||||||
PORT_NOVNC_WEB="8083" \
|
PORT_NOVNC_WEB="8083" \
|
||||||
NEKO_NAT1TO1=""
|
NEKO_NAT1TO1=""
|
||||||
|
|
||||||
16
README.md
16
README.md
@@ -2,14 +2,22 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Play your games in the browser with audio. Connect another device and use it with Steam Remote Play. Easily deploy a Steam Docker instance in seconds.
|
Remote Game Streaming Server.
|
||||||
|
|
||||||
|
Play your games either in the browser with audio or via Steam Link or Moonlight. Play from another Steam Client with Steam Remote Play.
|
||||||
|
|
||||||
|
Easily deploy a Steam Docker instance in seconds.
|
||||||
|
|
||||||
## Features:
|
## Features:
|
||||||
- NVIDIA GPU support
|
- Steam Client configured for running on Linux with Proton
|
||||||
- AMD GPU support
|
- Moonlight compatible server for easy remote desktop streaming
|
||||||
|
- One click installation of EmeDeck, Heroic and Lutris
|
||||||
- Full video/audio noVNC web access to a Xfce4 Desktop
|
- Full video/audio noVNC web access to a Xfce4 Desktop
|
||||||
|
- NVIDIA, AMD and Intel GPU support
|
||||||
|
- Full controller support
|
||||||
|
- Support for Flatpak and Appimage installation
|
||||||
- Root access
|
- Root access
|
||||||
|
- Based on Debian Bookworm
|
||||||
|
|
||||||
---
|
---
|
||||||
## Notes:
|
## Notes:
|
||||||
|
|||||||
@@ -114,7 +114,6 @@ cmd="docker run -d --name='${container_name}' \
|
|||||||
-e TZ='Pacific/Auckland' \
|
-e TZ='Pacific/Auckland' \
|
||||||
-e USER_LOCALES='en_US.UTF-8 UTF-8' \
|
-e USER_LOCALES='en_US.UTF-8 UTF-8' \
|
||||||
-e DISPLAY_CDEPTH='24' \
|
-e DISPLAY_CDEPTH='24' \
|
||||||
-e DISPLAY_DPI='96' \
|
|
||||||
-e DISPLAY_REFRESH='60' \
|
-e DISPLAY_REFRESH='60' \
|
||||||
-e DISPLAY_SIZEH='720' \
|
-e DISPLAY_SIZEH='720' \
|
||||||
-e DISPLAY_SIZEW='1280' \
|
-e DISPLAY_SIZEW='1280' \
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ TZ='Pacific/Auckland'
|
|||||||
USER_LOCALES='en_US.UTF-8 UTF-8'
|
USER_LOCALES='en_US.UTF-8 UTF-8'
|
||||||
DISPLAY=':55'
|
DISPLAY=':55'
|
||||||
SHM_SIZE='2G'
|
SHM_SIZE='2G'
|
||||||
|
|
||||||
## DOCKER_RUNTIME:
|
## DOCKER_RUNTIME:
|
||||||
## Options: ['runc', 'nvidia']
|
## Options: ['runc', 'nvidia']
|
||||||
## Description: The name of an implementation of OCI Runtime Spec
|
## Description: The name of an implementation of OCI Runtime Spec
|
||||||
@@ -31,6 +30,20 @@ PGID='1000'
|
|||||||
UMASK='000'
|
UMASK='000'
|
||||||
USER_PASSWORD='password'
|
USER_PASSWORD='password'
|
||||||
|
|
||||||
|
# __ __ _
|
||||||
|
# | \/ | ___ __| | ___
|
||||||
|
# | |\/| |/ _ \ / _` |/ _ \
|
||||||
|
# | | | | (_) | (_| | __/
|
||||||
|
# |_| |_|\___/ \__,_|\___|
|
||||||
|
#
|
||||||
|
#
|
||||||
|
## MODE:
|
||||||
|
## Options: ['primary', 'secondary']
|
||||||
|
## Description: Steam Headless containers can run in a secondary mode that will only start
|
||||||
|
## a Steam process that will then use the X server of either the host or another
|
||||||
|
## Steam Headless container running in 'primary' mode.
|
||||||
|
MODE='primary'
|
||||||
|
|
||||||
# ____ _
|
# ____ _
|
||||||
# / ___| ___ _ ____ _(_) ___ ___ ___
|
# / ___| ___ _ ____ _(_) ___ ___ ___
|
||||||
# \___ \ / _ \ '__\ \ / / |/ __/ _ \/ __|
|
# \___ \ / _ \ '__\ \ / / |/ __/ _ \/ __|
|
||||||
@@ -38,54 +51,63 @@ USER_PASSWORD='password'
|
|||||||
# |____/ \___|_| \_/ |_|\___\___||___/
|
# |____/ \___|_| \_/ |_|\___\___||___/
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Mode
|
|
||||||
## MODE:
|
|
||||||
## Options: ['primary', 'secondary']
|
|
||||||
## Description: Steam Headless containers can run in a secondary mode that will only start
|
|
||||||
## a Steam process that will then use the X server of either the host or another
|
|
||||||
## Steam Headless container running in 'primary' mode.
|
|
||||||
MODE='primary'
|
|
||||||
|
|
||||||
# Web UI
|
# Web UI
|
||||||
## WEB_UI_MODE:
|
## WEB_UI_MODE:
|
||||||
## Options: ['vnc', 'neko', 'none']
|
## Options: ['vnc', 'neko', 'none']
|
||||||
## Description: Configures the WebUI to use for accessing the virtual desktop.
|
## Description: Configures the WebUI to use for accessing the virtual desktop.
|
||||||
|
## Supported Modes: ['primary']
|
||||||
WEB_UI_MODE='vnc'
|
WEB_UI_MODE='vnc'
|
||||||
## ENABLE_VNC_AUDIO:
|
## ENABLE_VNC_AUDIO:
|
||||||
## Options: ['true', 'false']
|
## Options: ['true', 'false']
|
||||||
## Description: Enables audio over for the VNC Web UI if 'WEB_UI_MODE' is set to 'vnc'.
|
## Description: Enables audio over for the VNC Web UI if 'WEB_UI_MODE' is set to 'vnc'.
|
||||||
ENABLE_VNC_AUDIO='true'
|
ENABLE_VNC_AUDIO='true'
|
||||||
## PORT_NOVNC_WEB:
|
## PORT_NOVNC_WEB:
|
||||||
## Description: Configure the port to use for the WebUI.
|
## Description: Configure the port to use for the WebUI.
|
||||||
PORT_NOVNC_WEB='8083'
|
PORT_NOVNC_WEB='8083'
|
||||||
## NEKO_NAT1TO1:
|
## NEKO_NAT1TO1:
|
||||||
## Description: Configure nat1to1 for the neko WebUI if it is enabled by setting 'WEB_UI_MODE' to 'neko'. This will need to be the IP address of the host.
|
## Description: Configure nat1to1 for the neko WebUI if it is enabled by setting 'WEB_UI_MODE' to 'neko'.
|
||||||
|
## This will need to be the IP address of the host.
|
||||||
NEKO_NAT1TO1=''
|
NEKO_NAT1TO1=''
|
||||||
|
|
||||||
|
# Steam
|
||||||
|
## ENABLE_STEAM:
|
||||||
|
## Options: ['true', 'false']
|
||||||
|
## Description: Enable Steam to run on start. This will also cause steam to restart automatically if closed.
|
||||||
|
## Supported Modes: ['primary', 'secondary']
|
||||||
|
ENABLE_STEAM='true'
|
||||||
|
## STEAM_ARGS:
|
||||||
|
## Description: Additional steam execution arguments.
|
||||||
|
#STEAM_ARGS='-silent -bigpicture'
|
||||||
|
|
||||||
# Sunshine
|
# Sunshine
|
||||||
## ENABLE_SUNSHINE:
|
## ENABLE_SUNSHINE:
|
||||||
## Options: ['true', 'false']
|
## Options: ['true', 'false']
|
||||||
## Description: Enable Sunshine streaming service.
|
## Description: Enable Sunshine streaming service.
|
||||||
|
## Supported Modes: ['primary']
|
||||||
ENABLE_SUNSHINE='false'
|
ENABLE_SUNSHINE='false'
|
||||||
## SUNSHINE_USER:
|
## SUNSHINE_USER:
|
||||||
## Description: Set the Sunshine service username.
|
## Description: Set the Sunshine service username.
|
||||||
#SUNSHINE_USER='admin'
|
#SUNSHINE_USER='admin'
|
||||||
## SUNSHINE_PASS:
|
## SUNSHINE_PASS:
|
||||||
## Description: Set the Sunshine service password.
|
## Description: Set the Sunshine service password.
|
||||||
#SUNSHINE_PASS='admin'
|
#SUNSHINE_PASS='admin'
|
||||||
|
|
||||||
# Xorg
|
# Xorg
|
||||||
## ENABLE_EVDEV_INPUTS:
|
## ENABLE_EVDEV_INPUTS:
|
||||||
## Options: ['true', 'false']
|
## Available Options: ['true', 'false']
|
||||||
## Description: Enable Keyboard and Mouse Passthrough. This will configure the Xorg server to catch all evdev events for Keyboard, Mouse, etc.
|
## Description: Enable Keyboard and Mouse Passthrough. This will configure the Xorg server to catch all
|
||||||
|
## evdev events for Keyboard, Mouse, etc.
|
||||||
|
## Supported Modes: ['primary']
|
||||||
ENABLE_EVDEV_INPUTS='true'
|
ENABLE_EVDEV_INPUTS='true'
|
||||||
|
|
||||||
# Nvidia specific config (not required for non Nvidia GPUs)
|
# Nvidia specific config (not required for non Nvidia GPUs)
|
||||||
## NVIDIA_DRIVER_CAPABILITIES:
|
## NVIDIA_DRIVER_CAPABILITIES:
|
||||||
## Options: ['all', 'compute', 'compat32', 'graphics', 'utility', 'video', 'display']
|
## Options: ['all', 'compute', 'compat32', 'graphics', 'utility', 'video', 'display']
|
||||||
## Description: Controls which driver libraries/binaries will be mounted inside the container.
|
## Description: Controls which driver libraries/binaries will be mounted inside the container.
|
||||||
|
## Supported Modes: ['primary', 'secondary']
|
||||||
NVIDIA_DRIVER_CAPABILITIES='all'
|
NVIDIA_DRIVER_CAPABILITIES='all'
|
||||||
## NVIDIA_DRIVER_CAPABILITIES:
|
## NVIDIA_DRIVER_CAPABILITIES:
|
||||||
## Options: ['all', 'none', '<GPU UUID>']
|
## Available Options: ['all', 'none', '<GPU UUID>']
|
||||||
## Description: Controls which GPUs will be made accessible inside the container.
|
## Description: Controls which GPUs will be made accessible inside the container.
|
||||||
|
## Supported Modes: ['primary', 'secondary']
|
||||||
NVIDIA_VISIBLE_DEVICES='all'
|
NVIDIA_VISIBLE_DEVICES='all'
|
||||||
|
|||||||
@@ -4,19 +4,21 @@ services:
|
|||||||
image: josh5/steam-headless:latest
|
image: josh5/steam-headless:latest
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
runtime: ${DOCKER_RUNTIME}
|
runtime: ${DOCKER_RUNTIME}
|
||||||
## NOTE: Requires privileged access to host to be able to access the required devices
|
|
||||||
privileged: true
|
|
||||||
shm_size: ${SHM_SIZE}
|
shm_size: ${SHM_SIZE}
|
||||||
ipc: host # Could also be set to 'shareable'
|
ipc: host # Could also be set to 'shareable'
|
||||||
ulimits:
|
ulimits:
|
||||||
nofile:
|
nofile:
|
||||||
soft: 1024
|
soft: 1024
|
||||||
hard: 524288
|
hard: 524288
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- SYS_ADMIN
|
||||||
|
- SYS_NICE
|
||||||
|
security_opt:
|
||||||
|
- seccomp:unconfined
|
||||||
|
- apparmor:unconfined
|
||||||
|
|
||||||
# NETWORK:
|
# NETWORK:
|
||||||
## NOTE: Steam headless always requires the use of the host network.
|
|
||||||
## If we do not use the host network, then device input is not possible
|
|
||||||
## and your controllers will not work in steam games.
|
|
||||||
network_mode: host
|
network_mode: host
|
||||||
hostname: ${NAME}
|
hostname: ${NAME}
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
@@ -26,15 +28,37 @@ services:
|
|||||||
## Read all config variables from the .env file
|
## Read all config variables from the .env file
|
||||||
env_file: .env
|
env_file: .env
|
||||||
|
|
||||||
|
# DEVICES:
|
||||||
|
devices:
|
||||||
|
# Use the host fuse device.
|
||||||
|
- /dev/fuse
|
||||||
|
# Add the host uinput device.
|
||||||
|
- /dev/uinput
|
||||||
|
# Add AMD/Intel HW accelerated video encoding/decoding devices (optional)
|
||||||
|
#- /dev/dri
|
||||||
|
# Ensure container access to devices 13:*
|
||||||
|
device_cgroup_rules:
|
||||||
|
- 'c 13:* rmw'
|
||||||
|
|
||||||
# VOLUMES:
|
# VOLUMES:
|
||||||
volumes:
|
volumes:
|
||||||
# The location of your home directory.
|
# The location of your home directory.
|
||||||
- /opt/container-data/steam-headless/home/:/home/default/:rw
|
- /opt/container-data/steam-headless/home/:/home/default/:rw
|
||||||
|
|
||||||
# The location where all games should be installed.
|
# The location where all games should be installed.
|
||||||
|
# This path needs to be set as a library path in Steam after logging in.
|
||||||
|
# Otherwise, Steam will store games in the home directory above.
|
||||||
- /mnt/games/:/mnt/games/:rw
|
- /mnt/games/:/mnt/games/:rw
|
||||||
# Input devices used for mouse and joypad support inside the container.
|
|
||||||
- /dev/input/:/dev/input/:ro
|
|
||||||
# The Xorg socket. This will be shared with other containers so they can access the X server.
|
# The Xorg socket. This will be shared with other containers so they can access the X server.
|
||||||
- /opt/container-data/steam-headless/.X11-unix/:/tmp/.X11-unix/:rw
|
# Select only one option or leave commented out to not share the Xorg socket with any other Docker containers.
|
||||||
|
# Option #1) Start a X server in the container to share with any other containers.
|
||||||
|
#- /opt/container-data/steam-headless/.X11-unix/:/tmp/.X11-unix/:rw
|
||||||
|
# Option #2) Use an existing X server running on the host.
|
||||||
|
#- /tmp/.X11-unix/:/tmp/.X11-unix/:rw
|
||||||
|
|
||||||
# Pulse audio socket. This will be shared with other containers so they can access the audio sink.
|
# Pulse audio socket. This will be shared with other containers so they can access the audio sink.
|
||||||
- /opt/container-data/steam-headless/pulse/:/tmp/pulse/:rw
|
# Leave commented out to not share the pulse socket with any other Docker containers.
|
||||||
|
#- /opt/container-data/steam-headless/pulse/:/tmp/pulse/:rw
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
51
docs/compose-files/docker-compose.privileged.yml
Normal file
51
docs/compose-files/docker-compose.privileged.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
steam-headless:
|
||||||
|
image: josh5/steam-headless:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
runtime: ${DOCKER_RUNTIME}
|
||||||
|
## NOTE: This config uses privileged to access to host to be able to access the required devices
|
||||||
|
privileged: true
|
||||||
|
shm_size: ${SHM_SIZE}
|
||||||
|
ipc: host # Could also be set to 'shareable'
|
||||||
|
ulimits:
|
||||||
|
nofile:
|
||||||
|
soft: 1024
|
||||||
|
hard: 524288
|
||||||
|
|
||||||
|
# NETWORK:
|
||||||
|
## NOTE: With this configuration, if we do not use the host network, then physical device input
|
||||||
|
## is not possible and your USB connected controllers will not work in steam games.
|
||||||
|
network_mode: host
|
||||||
|
hostname: ${NAME}
|
||||||
|
extra_hosts:
|
||||||
|
- "${NAME}:127.0.0.1"
|
||||||
|
|
||||||
|
# ENVIRONMENT:
|
||||||
|
## Read all config variables from the .env file
|
||||||
|
env_file: .env
|
||||||
|
|
||||||
|
# VOLUMES:
|
||||||
|
volumes:
|
||||||
|
# The location of your home directory.
|
||||||
|
- /opt/container-data/steam-headless/home/:/home/default/:rw
|
||||||
|
|
||||||
|
# The location where all games should be installed.
|
||||||
|
# This path needs to be set as a library path in Steam after logging in.
|
||||||
|
# Otherwise, Steam will store games in the home directory above.
|
||||||
|
- /mnt/games/:/mnt/games/:rw
|
||||||
|
|
||||||
|
# The Xorg socket. This will be shared with other containers so they can access the X server.
|
||||||
|
# Select only one option:
|
||||||
|
# Option #1) Start a X server in the container to share with any other containers.
|
||||||
|
#- /opt/container-data/steam-headless/.X11-unix/:/tmp/.X11-unix/:rw
|
||||||
|
# Option #2) Use an existing X server running on the host.
|
||||||
|
#- /tmp/.X11-unix/:/tmp/.X11-unix/:rw
|
||||||
|
|
||||||
|
# Pulse audio socket. This will be shared with other containers so they can access the audio sink.
|
||||||
|
# Leave commented out to not share the pulse socket with any other Docker containers.
|
||||||
|
#- /opt/container-data/steam-headless/pulse/:/tmp/pulse/:rw
|
||||||
|
|
||||||
|
# Input devices used for mouse and joypad support inside the container.
|
||||||
|
- /dev/input/:/dev/input/:ro
|
||||||
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
---
|
|
||||||
# --memory='8g'
|
|
||||||
# --ulimit nofile=1024:524288
|
|
||||||
services:
|
|
||||||
steam-headless:
|
|
||||||
image: josh5/steam-headless:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
runtime: ${DOCKER_RUNTIME}
|
|
||||||
## NOTE: Requires privileged access to host to be able to access the required devices
|
|
||||||
privileged: true
|
|
||||||
shm_size: ${SHM_SIZE}
|
|
||||||
ipc: host # Could also be set to 'shareable'
|
|
||||||
|
|
||||||
# NETWORK:
|
|
||||||
## NOTE: Steam headless always required the use of the host network
|
|
||||||
network_mode: host
|
|
||||||
hostname: ${HOSTNAME}
|
|
||||||
extra_hosts:
|
|
||||||
- "${HOSTNAME}:127.0.0.1"
|
|
||||||
|
|
||||||
# ENVIRONMENT:
|
|
||||||
## Read all config variables from the .env file
|
|
||||||
env_file: .env
|
|
||||||
|
|
||||||
# VOLUMES:
|
|
||||||
volumes:
|
|
||||||
# The location of your home directory.
|
|
||||||
# TODO: Make this '/opt/container-data/steam-headless/home/:/home/default/'
|
|
||||||
- ./default/:/home/default/:rw
|
|
||||||
# The location where all games should be installed.
|
|
||||||
- /mnt/Games/:/mnt/games/:rw
|
|
||||||
# Input devices used for mouse and joypad support inside the container.
|
|
||||||
- /dev/input/:/dev/input/:ro
|
|
||||||
# The Xorg socket. This will be shared with other containers so they can access the X server.
|
|
||||||
- /opt/container-data/steam-headless/.X11-unix/:/tmp/.X11-unix/:rw
|
|
||||||
# Pulse audio socket. This will be shared with other containers so they can access the audio sink.
|
|
||||||
- /opt/container-data/steam-headless/pulse/:/tmp/pulse/:rw
|
|
||||||
|
|
||||||
####################
|
|
||||||
# Sunshine is the heart of the streaming setup; it takes your desktop and
|
|
||||||
# encodes it for delivery over the network
|
|
||||||
|
|
||||||
sunshine:
|
|
||||||
depends_on:
|
|
||||||
- steam-headless
|
|
||||||
image: ghcr.io/games-on-whales/sunshine:edge
|
|
||||||
runtime: ${DOCKER_RUNTIME}
|
|
||||||
ports:
|
|
||||||
- 47984-47990:47984-47990/tcp
|
|
||||||
- 48010:48010
|
|
||||||
- 47998-48000:47998-48000/udp
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
# The location of your homle directory.
|
|
||||||
# TODO: Make this '/opt/container-data/steam-headless/home/:/home/retro/'
|
|
||||||
- ./sunshine/:/home/retro/:rw
|
|
||||||
# The Xorg socket.
|
|
||||||
- /opt/container-data/steam-headless/.X11-unix/:/tmp/.X11-unix/:rw
|
|
||||||
# Pulse audio socket.
|
|
||||||
- /opt/container-data/steam-headless/pulse/:/tmp/pulse/:rw
|
|
||||||
# OPTIONAL: host dbus used by avahi in order to publish Sunshine for auto network discovery
|
|
||||||
- /run/dbus/:/run/dbus/:ro
|
|
||||||
ipc: host
|
|
||||||
|
|
||||||
# ENVIRONMENT:
|
|
||||||
## Read all config variables from the .env fie
|
|
||||||
env_file: .env
|
|
||||||
environment:
|
|
||||||
LOG_LEVEL: INFO
|
|
||||||
GOW_REQUIRED_DEVICES: /dev/uinput /dev/input/event* /dev/dri/*
|
|
||||||
# Username and password for the web-ui at https://xxx.xxx.xxx.xxx:47990
|
|
||||||
SUNSHINE_USER: admin
|
|
||||||
SUNSHINE_PASS: admin
|
|
||||||
XDG_RUNTIME_DIR: /tmp/.X11-unix/run
|
|
||||||
# Intel specific config
|
|
||||||
LIBVA_DRIVER_NAME: i965
|
|
||||||
LIBVA_DRIVERS_PATH: /usr/lib/x86_64-linux-gnu/dri/
|
|
||||||
# Configure the pulseaudio socket
|
|
||||||
PULSE_SERVER: unix:/tmp/pulse/pulse-socket
|
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ Follow these instructions to configure a docker-compose.yml for your system.
|
|||||||
> Depending on how you have installed this, the commands to execute docker compose may vary.
|
> Depending on how you have installed this, the commands to execute docker compose may vary.
|
||||||
|
|
||||||
|
|
||||||
## PREPARE DIRECTORY:
|
## PREPARE DIRECTORIES:
|
||||||
|
|
||||||
> __Warning__
|
> __Warning__
|
||||||
>
|
>
|
||||||
@@ -18,17 +18,24 @@ Follow these instructions to configure a docker-compose.yml for your system.
|
|||||||
> If you do run these commands as root, you may need to manually fix the permissions and ownership after.
|
> If you do run these commands as root, you may need to manually fix the permissions and ownership after.
|
||||||
|
|
||||||
Create a directory for your service:
|
Create a directory for your service:
|
||||||
```
|
```shell
|
||||||
sudo mkdir -p /opt/container-services/steam-headless
|
sudo mkdir -p /opt/container-services/steam-headless
|
||||||
sudo chown -R $(id -u):$(id -g) /opt/container-services/steam-headless
|
sudo chown -R $(id -u):$(id -g) /opt/container-services/steam-headless
|
||||||
```
|
```
|
||||||
|
|
||||||
Create a directory for your service config data:
|
Create a directory for your service config data:
|
||||||
```
|
```shell
|
||||||
sudo mkdir -p /opt/container-data/steam-headless/{home,.X11-unix,pulse}
|
sudo mkdir -p /opt/container-data/steam-headless/{home,.X11-unix,pulse}
|
||||||
sudo chown -R $(id -u):$(id -g) /opt/container-data/steam-headless
|
sudo chown -R $(id -u):$(id -g) /opt/container-data/steam-headless
|
||||||
```
|
```
|
||||||
|
|
||||||
|
(Optional) Create a directory for your game install location:
|
||||||
|
```shell
|
||||||
|
sudo mkdir /mnt/games
|
||||||
|
sudo chmod -R 777 /mnt/games
|
||||||
|
sudo chown -R $(id -u):$(id -g) /mnt/games
|
||||||
|
```
|
||||||
|
|
||||||
Create a Steam Headless `/opt/container-services/steam-headless/docker-compose.yml` file.
|
Create a Steam Headless `/opt/container-services/steam-headless/docker-compose.yml` file.
|
||||||
|
|
||||||
Populate this file with the contents of the default [Docker Compose File](./compose-files/docker-compose.default.yml).
|
Populate this file with the contents of the default [Docker Compose File](./compose-files/docker-compose.default.yml).
|
||||||
@@ -39,3 +46,15 @@ Populate this file with the contents of the default [Docker Compose File](./comp
|
|||||||
Create a Steam Headless `/opt/container-services/steam-headless/.env` file with the contents found in this example [Environment File](./compose-files/.env).
|
Create a Steam Headless `/opt/container-services/steam-headless/.env` file with the contents found in this example [Environment File](./compose-files/.env).
|
||||||
|
|
||||||
Edit these variables as required.
|
Edit these variables as required.
|
||||||
|
|
||||||
|
## EXECUTE:
|
||||||
|
|
||||||
|
Navigate to your compose location and execute it.
|
||||||
|
```shell
|
||||||
|
cd /opt/container-services/steam-headless
|
||||||
|
sudo docker-compose up -d --force-recreate
|
||||||
|
```
|
||||||
|
|
||||||
|
After container executes successfully, navigate to your docker host URL in your browser on port 8083 and click connect.
|
||||||
|
`http://<host-ip>:8083/`
|
||||||
|

|
||||||
|
|||||||
BIN
docs/images/disk_write_error.png
Normal file
BIN
docs/images/disk_write_error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/images/web_connect.png
Normal file
BIN
docs/images/web_connect.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
25
docs/k8s-files/pvc.yaml
Normal file
25
docs/k8s-files/pvc.yaml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: games
|
||||||
|
spec:
|
||||||
|
storageClassName: ssd #Adjust your storageclass as needed
|
||||||
|
volumeMode: Filesystem
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 400Gi
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: home
|
||||||
|
spec:
|
||||||
|
volumeMode: Filesystem
|
||||||
|
storageClassName: nvme-replicated #Adjust your storageclass as needed
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 50Gi
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
96
docs/k8s-files/statefulset.yaml
Normal file
96
docs/k8s-files/statefulset.yaml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: steam-headless
|
||||||
|
spec:
|
||||||
|
serviceName: "steam-headless"
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: steam-headless
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: steam-headless
|
||||||
|
spec:
|
||||||
|
hostNetwork: true
|
||||||
|
securityContext:
|
||||||
|
fsGroup: 1000
|
||||||
|
containers:
|
||||||
|
- name: steam-headless
|
||||||
|
securityContext:
|
||||||
|
privileged: true
|
||||||
|
image: josh5/steam-headless:latest
|
||||||
|
resources: #Change CPU and Memory below
|
||||||
|
requests:
|
||||||
|
memory: "24G"
|
||||||
|
cpu: "6"
|
||||||
|
limits:
|
||||||
|
memory: "24G"
|
||||||
|
cpu: "6"
|
||||||
|
nvidia.com/gpu: 1 #If you're using a nvidia GPU, add it here
|
||||||
|
volumeMounts:
|
||||||
|
- name: home-dir
|
||||||
|
mountPath: /home/default/
|
||||||
|
- name: games-dir
|
||||||
|
mountPath: /mnt/games/
|
||||||
|
- name: input-devices
|
||||||
|
mountPath: /dev/input/
|
||||||
|
- name: dshm
|
||||||
|
mountPath: /dev/shm
|
||||||
|
env: #Environmental Vars
|
||||||
|
- name: NAME
|
||||||
|
value: 'SteamHeadless'
|
||||||
|
- name: TZ
|
||||||
|
value: 'America/New_York'
|
||||||
|
- name: USER_LOCALES
|
||||||
|
value: 'en_US.UTF-8 UTF-8'
|
||||||
|
- name: DISPLAY
|
||||||
|
value: ':55'
|
||||||
|
- name: SHM_SIZE
|
||||||
|
value: '2G'
|
||||||
|
- name: DOCKER_RUNTIME
|
||||||
|
value: 'nvidia'
|
||||||
|
- name: PUID
|
||||||
|
value: '1000'
|
||||||
|
- name: PGID
|
||||||
|
value: '1000'
|
||||||
|
- name: UMASK
|
||||||
|
value: '000'
|
||||||
|
- name: USER_PASSWORD
|
||||||
|
value: 'password' #changeme
|
||||||
|
- name: MODE
|
||||||
|
value: 'primary'
|
||||||
|
- name: WEB_UI_MODE
|
||||||
|
value: 'none'
|
||||||
|
- name: ENABLE_VNC_AUDIO
|
||||||
|
value: 'false'
|
||||||
|
- name: PORT_NOVNC_WEB
|
||||||
|
value: '8083'
|
||||||
|
- name: NEKO_NAT1TO1
|
||||||
|
value: ''
|
||||||
|
- name: ENABLE_SUNSHINE
|
||||||
|
value: 'true'
|
||||||
|
- name: SUNSHINE_USER
|
||||||
|
value: 'sam'
|
||||||
|
- name: SUNSHINE_PASS
|
||||||
|
value: 'password'
|
||||||
|
- name: ENABLE_EVDEV_INPUTS
|
||||||
|
value: 'true'
|
||||||
|
- name: NVIDIA_DRIVER_CAPABILITIES
|
||||||
|
value: 'all'
|
||||||
|
- name: NVIDIA_VISIBLE_DEVICES
|
||||||
|
value: 'all'
|
||||||
|
volumes:
|
||||||
|
- name: home-dir
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: home
|
||||||
|
- name: games-dir
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: games
|
||||||
|
- name: input-devices
|
||||||
|
hostPath:
|
||||||
|
path: /dev/input/
|
||||||
|
- name: dshm
|
||||||
|
emptyDir:
|
||||||
|
medium: Memory
|
||||||
16
docs/k8s.md
Normal file
16
docs/k8s.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Kubernetes
|
||||||
|
|
||||||
|
Have a cluster at home and want to add steam headless to it?
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
- NVIDIA Device plugin (if using nvidia GPU) https://github.com/NVIDIA/k8s-device-plugin
|
||||||
|
- A storageclass
|
||||||
|
|
||||||
|
Tasks
|
||||||
|
1. Configure the statefulset to your liking. Things to note:
|
||||||
|
- CPU & Memory
|
||||||
|
- Env vars (see compose-files/.env for documentation)
|
||||||
|
2. Change the PVC to your liking. Things to note:
|
||||||
|
- Storage Class
|
||||||
|
- Size
|
||||||
|
3. Deploy it: `kubectl create -f k8s-files/*`
|
||||||
30
docs/troubleshooting.md
Normal file
30
docs/troubleshooting.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
## Flatpaks not working
|
||||||
|
|
||||||
|
Steam runs with Flatpak. These Flatpaks are instlled into the `default` user's home directory so they persist between container updates. Sometimes Flatpaks can get into a knot between major Steam Headless updates. In such cases, it may not work correctly. To fix this, just delete the Flatpak runtime in your `default` user's home directory a restart the container.
|
||||||
|
|
||||||
|
1) Stop the container.
|
||||||
|
2) Delete the directory `<SteamHeadless Home>/.local/share/flatpak`
|
||||||
|
3) Re-create the container. Don't just restart it. This will trigger an update of the required Flatpak runtimes in the home directory.
|
||||||
|
4) Reinstall any missing Flatpaks from the Software app.
|
||||||
|
|
||||||
|
Once your Flatpak refresh is complete, everything should work correctly and your configuration for each application should have remained intact.
|
||||||
|
|
||||||
|
## An error occurred while installing <game>: "disk write error"
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1) Stop the container
|
||||||
|
2) Verify your mounted /mnt/games volume is owned by the executing UID/GID, and 777 permissions are set.
|
||||||
|
3) Verify the `steamapps` directory exists within the library location.
|
||||||
|
|
||||||
|
> __Note__
|
||||||
|
>
|
||||||
|
> The directory in the below commands are the default /mnt/games library locations installed upon first execution of this container.
|
||||||
|
>
|
||||||
|
> Depending on how you have installed this, the directory path may vary.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo mkdir /mnt/games/GameLibrary/SteamLibrary/steamapps
|
||||||
|
sudo chmod -R 777 /mnt/games
|
||||||
|
sudo chown -R $(id -u):$(id -g) /mnt/games
|
||||||
|
```
|
||||||
@@ -25,41 +25,43 @@ fi
|
|||||||
# Execute all container init scripts
|
# Execute all container init scripts
|
||||||
for init_script in /etc/cont-init.d/*.sh ; do
|
for init_script in /etc/cont-init.d/*.sh ; do
|
||||||
echo
|
echo
|
||||||
echo "[ ${init_script}: executing... ]"
|
echo -e "\e[34m[ ${init_script:?}: executing... ]\e[0m"
|
||||||
sed -i 's/\r$//' "${init_script}"
|
sed -i 's/\r$//' "${init_script:?}"
|
||||||
source "${init_script}"
|
source "${init_script:?}"
|
||||||
done
|
done
|
||||||
|
touch /tmp/.first-run-init-scripts
|
||||||
|
|
||||||
# Execute any user generated init scripts
|
# Execute any user generated init scripts
|
||||||
mkdir -p ${USER_HOME}/init.d
|
mkdir -p ${USER_HOME:?}/init.d
|
||||||
chown -R ${USER} ${USER_HOME}/init.d
|
chown -R ${USER:?} ${USER_HOME:?}/init.d
|
||||||
for user_init_script in ${USER_HOME}/init.d/*.sh ; do
|
for user_init_script in ${USER_HOME:?}/init.d/*.sh ; do
|
||||||
|
|
||||||
# Check that a file was found
|
# Check that a file was found
|
||||||
# (If no files exist in this directory, then user_init_script will be empty)
|
# (If no files exist in this directory, then user_init_script will be empty)
|
||||||
if [[ -e "${user_init_script}" ]]; then
|
if [[ -e "${user_init_script:?}" ]]; then
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "[ USER:${user_init_script}: executing... ]"
|
echo -e "\e[34m[ USER:${user_init_script:?}: executing... ]\e[0m"
|
||||||
sed -i 's/\r$//' "${user_init_script}"
|
sed -i 's/\r$//' "$(readlink -e "${user_init_script:?}")"
|
||||||
|
|
||||||
# Execute user script in sub process.
|
# Execute user script in sub process with 'set +e'.
|
||||||
# This way if it is messed up, we dont get caught in an init loop
|
# This way if it is messed up, we dont get caught in an init loop.
|
||||||
chmod +x "${user_init_script}"
|
chmod +x "${user_init_script:?}"
|
||||||
cat "${user_init_script}" | bash
|
(
|
||||||
|
set +e
|
||||||
|
"${user_init_script:?}" || echo -e "\e[31mERROR: \e[33mFailed to execute user script '${user_init_script:?}'\e[0m"
|
||||||
|
)
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
done
|
done
|
||||||
|
touch /tmp/.first-run-user-init-scripts
|
||||||
# Ensure all scripts are executable
|
|
||||||
chmod a+rwx /opt/scripts/*.sh
|
|
||||||
|
|
||||||
# Start supervisord
|
# Start supervisord
|
||||||
echo
|
echo
|
||||||
echo "**** Starting supervisord ****";
|
echo "**** Starting supervisord ****";
|
||||||
echo "Logging all root services to '/var/log/supervisor/'"
|
echo "Logging all root services to '/var/log/supervisor/'"
|
||||||
echo "Logging all user services to '/home/${USER}/.cache/log/'"
|
echo "Logging all user services to '/home/${USER:?}/.cache/log/'"
|
||||||
echo
|
echo
|
||||||
mkdir -p /var/log/supervisor
|
mkdir -p /var/log/supervisor
|
||||||
chmod a+rw /var/log/supervisor
|
chmod a+rw /var/log/supervisor
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
# File Created: Friday, 12th January 2022 8:54:01 am
|
# File Created: Friday, 12th January 2022 8:54:01 am
|
||||||
# Author: Josh.5 (jsunnex@gmail.com)
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
# -----
|
# -----
|
||||||
# Last Modified: Tuesday, 4th October 2022 11:27:10 am
|
# Last Modified: Monday, 10th July 2023 5:56:17 pm
|
||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
||||||
###
|
###
|
||||||
|
|
||||||
PUID=${PUID:-99}
|
PUID=${PUID:-99}
|
||||||
@@ -21,11 +21,14 @@ usermod -o -u "${PUID}" ${USER}
|
|||||||
groupmod -o -g "${PGID}" ${USER}
|
groupmod -o -g "${PGID}" ${USER}
|
||||||
|
|
||||||
|
|
||||||
echo "Adding default user to video, audio, input and pulse groups"
|
|
||||||
usermod -a -G video,audio,input,pulse ${USER}
|
|
||||||
|
|
||||||
|
|
||||||
echo "Adding default user to any additional required device groups"
|
echo "Adding default user to any additional required device groups"
|
||||||
|
additional_groups=( video audio input pulse )
|
||||||
|
for group_name in "${additional_groups[@]}"; do
|
||||||
|
if [ $(getent group ${group_name:?}) ]; then
|
||||||
|
echo "Adding user '${USER}' to group: '${group_name}'"
|
||||||
|
usermod -aG ${group_name:?} ${USER}
|
||||||
|
fi
|
||||||
|
done
|
||||||
device_nodes=( /dev/uinput /dev/input/event* /dev/dri/* )
|
device_nodes=( /dev/uinput /dev/input/event* /dev/dri/* )
|
||||||
added_groups=""
|
added_groups=""
|
||||||
for dev in "${device_nodes[@]}"; do
|
for dev in "${device_nodes[@]}"; do
|
||||||
@@ -52,7 +55,7 @@ for dev in "${device_nodes[@]}"; do
|
|||||||
# Add group to user
|
# Add group to user
|
||||||
if [[ "${added_groups}" != *"${dev_group}"* ]]; then
|
if [[ "${added_groups}" != *"${dev_group}"* ]]; then
|
||||||
echo "Adding user '${USER}' to group: '${dev_group}' for device: ${dev}"
|
echo "Adding user '${USER}' to group: '${dev_group}' for device: ${dev}"
|
||||||
usermod -a -G ${dev_group} ${USER}
|
usermod -aG ${dev_group} ${USER}
|
||||||
added_groups=" ${added_groups} ${dev_group} "
|
added_groups=" ${added_groups} ${dev_group} "
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -70,22 +73,12 @@ mkdir -p ${XDG_RUNTIME_DIR}
|
|||||||
chown -R ${PUID}:${PGID} ${XDG_RUNTIME_DIR}
|
chown -R ${PUID}:${PGID} ${XDG_RUNTIME_DIR}
|
||||||
# Ensure only the 'default' user can access this directory
|
# Ensure only the 'default' user can access this directory
|
||||||
chmod 700 ${XDG_RUNTIME_DIR}
|
chmod 700 ${XDG_RUNTIME_DIR}
|
||||||
export XDG_DATA_DIRS="${XDG_DATA_DIRS}:/var/lib/flatpak/exports/share:/home/${USER}/.local/share/flatpak/exports/share"
|
# Set the default background
|
||||||
# Ensure the start-desktop.sh script is executable
|
|
||||||
chmod +x /usr/bin/start-desktop.sh
|
|
||||||
# Set the default background for gnome based desktop
|
|
||||||
mkdir -p /etc/alternatives
|
mkdir -p /etc/alternatives
|
||||||
ln -sf /usr/share/backgrounds/steam.jpg /etc/alternatives/desktop-background
|
ln -sf /usr/share/backgrounds/steam.jpg /etc/alternatives/desktop-background
|
||||||
chmod a+r /etc/alternatives/desktop-background
|
chmod a+r /etc/alternatives/desktop-background
|
||||||
|
|
||||||
|
|
||||||
# Setup home directory and permissions
|
|
||||||
echo "Adding default home directory template"
|
|
||||||
mkdir -p ${USER_HOME}
|
|
||||||
chown -R ${PUID}:${PGID} /etc/home_directory_template
|
|
||||||
rsync -aq --ignore-existing /etc/home_directory_template/ ${USER_HOME}/
|
|
||||||
|
|
||||||
|
|
||||||
# Setup services log path
|
# Setup services log path
|
||||||
echo "Setting ownership of all log files in '${USER_HOME}/.cache/log'"
|
echo "Setting ownership of all log files in '${USER_HOME}/.cache/log'"
|
||||||
mkdir -p "${USER_HOME}/.cache/log"
|
mkdir -p "${USER_HOME}/.cache/log"
|
||||||
|
|||||||
26
overlay/etc/cont-init.d/11-setup_sysctl_values.sh
Normal file
26
overlay/etc/cont-init.d/11-setup_sysctl_values.sh
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: 11-setup_sysctl_values.sh
|
||||||
|
# Project: cont-init.d
|
||||||
|
# File Created: Friday, 1st September 2023 3:56:17 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Monday, 1st September 2023 3:56:17 pm
|
||||||
|
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
|
||||||
|
echo "**** Configure some system kernel parameters ****"
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$(cat /proc/sys/vm/max_map_count)" -ge 524288 ]; then
|
||||||
|
if [ -w "/proc/sys/vm/max_map_count" ]; then
|
||||||
|
echo "Setting the maximum number of memory map areas a process can create to 524288"
|
||||||
|
echo 524288 > /proc/sys/vm/max_map_count
|
||||||
|
else
|
||||||
|
echo "WARNING: Unable to set max_map_count on unprivileged container"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "NOTE: vm.max_map_count is already greater than '524288'"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
echo "**** Configure SSH server ****"
|
|
||||||
|
|
||||||
if [[ "X${PORT_SSH:-}" != "X" ]]; then
|
|
||||||
# Generate new SSH host keys if they dont exist
|
|
||||||
if [[ ! -f /etc/ssh/ssh_host_rsa_key ]]; then
|
|
||||||
echo "**** Generating SSH keys ****";
|
|
||||||
/usr/bin/ssh-keygen -A
|
|
||||||
fi
|
|
||||||
mkdir -p /run/sshd
|
|
||||||
chmod 744 /run/sshd
|
|
||||||
|
|
||||||
echo "Set port to '${PORT_SSH}'"
|
|
||||||
sed -i "s|^# Port 22.*$|Port ${PORT_SSH}|" /etc/ssh/ssh_config
|
|
||||||
else
|
|
||||||
echo "Disable SSH server"
|
|
||||||
# Disable supervisord script
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/sshd.ini
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "DONE"
|
|
||||||
@@ -1,26 +1,32 @@
|
|||||||
|
|
||||||
# Configure dbus
|
# Configure dbus
|
||||||
echo "**** Configure container dbus ****";
|
echo "**** Configure container dbus ****";
|
||||||
if [[ "${HOST_DBUS}" == "true" ]]; then
|
|
||||||
echo "Container configured to use the host dbus";
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
# Disable supervisord script
|
if [[ "${HOST_DBUS}" == "true" ]]; then
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
echo "Container configured to use the host dbus";
|
||||||
|
# Disable supervisord script
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
||||||
|
else
|
||||||
|
echo "Container configured to run its own dbus";
|
||||||
|
# Enable supervisord script
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dbus.ini
|
||||||
|
# Configure dbus to run as USER
|
||||||
|
sed -i "/ <user>/c\ <user>${USER}</user>" /usr/share/dbus-1/system.conf
|
||||||
|
# Remove old dbus session
|
||||||
|
rm -rf ${USER_HOME}/.dbus/session-bus/* 2> /dev/null
|
||||||
|
# Remove old dbus pids
|
||||||
|
mkdir -p /var/run/dbus
|
||||||
|
chown -R ${PUID}:${PGID} /var/run/dbus/
|
||||||
|
chmod -R 770 /var/run/dbus/
|
||||||
|
# Generate a dbus machine ID
|
||||||
|
dbus-uuidgen > /var/lib/dbus/machine-id
|
||||||
|
# Remove old lockfiles
|
||||||
|
find /var/run/dbus -name "pid" -exec rm -f {} \;
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "Container configured to run its own dbus";
|
echo "Dbus service not available when container is run in 'secondary' mode."
|
||||||
# Enable supervisord script
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dbus.ini
|
|
||||||
# Configure dbus to run as USER
|
|
||||||
sed -i "/ <user>/c\ <user>${USER}</user>" /usr/share/dbus-1/system.conf
|
|
||||||
# Remove old dbus session
|
|
||||||
rm -rf ${USER_HOME}/.dbus/session-bus/* 2> /dev/null
|
|
||||||
# Remove old dbus pids
|
|
||||||
mkdir -p /var/run/dbus
|
|
||||||
chown -R ${PUID}:${PGID} /var/run/dbus/
|
|
||||||
chmod -R 770 /var/run/dbus/
|
|
||||||
# Generate a dbus machine ID
|
|
||||||
dbus-uuidgen > /var/lib/dbus/machine-id
|
|
||||||
# Remove old lockfiles
|
|
||||||
find /var/run/dbus -name "pid" -exec rm -f {} \;
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DONE"
|
echo "DONE"
|
||||||
|
|||||||
@@ -9,32 +9,44 @@
|
|||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
###
|
###
|
||||||
|
|
||||||
# Running udev only works in privileged container
|
# Since this container may also be run with CAP_SYS_ADMIN, ensure we can actually execute "udevadm trigger"
|
||||||
# Source: https://github.com/balena-io-playground/balena-base-images/
|
run_dumb_udev="false"
|
||||||
tmp_mount='/tmp/privileged_test'
|
if [ ! -w /sys ]; then
|
||||||
mkdir -p "${tmp_mount}"
|
# Disable supervisord script since we are not able to write to sysfs
|
||||||
if mount -t devtmpfs none "${tmp_mount}" &> /dev/null; then
|
echo "**** Disable udevd - /sys is mounted RO ****";
|
||||||
is_privileged=true
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini
|
||||||
umount "${tmp_mount}"
|
run_dumb_udev="true"
|
||||||
else
|
elif [ ! -d /run/udev ]; then
|
||||||
is_privileged=false
|
# Disable supervisord script since we are not able to write to udev/data path
|
||||||
fi
|
echo "**** Disable udevd - /run/udev does not exist ****";
|
||||||
rm -rf "${tmp_mount}"
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini
|
||||||
|
run_dumb_udev="true"
|
||||||
|
elif [ ! -w /run/udev ]; then
|
||||||
if [[ "${is_privileged}" == "true" ]]; then
|
# Disable supervisord script since we are not able to write to udev/data path
|
||||||
|
echo "**** Disable udevd - /run/udev is mounted RO ****";
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini
|
||||||
|
run_dumb_udev="false"
|
||||||
|
elif udevadm trigger &> /dev/null; then
|
||||||
echo "**** Configure container to run udev management ****";
|
echo "**** Configure container to run udev management ****";
|
||||||
# Enable supervisord script
|
# Enable supervisord script
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini
|
||||||
# Make startup script executable
|
|
||||||
chmod +x /usr/bin/start-udev.sh
|
|
||||||
# Configure udev permissions
|
# Configure udev permissions
|
||||||
if [[ -f /lib/udev/rules.d/60-steam-input.rules ]]; then
|
if [[ -f /lib/udev/rules.d/60-steam-input.rules ]]; then
|
||||||
sed -i 's/MODE="0660"/MODE="0666"/' /lib/udev/rules.d/60-steam-input.rules
|
sed -i 's/MODE="0660"/MODE="0666"/' /lib/udev/rules.d/60-steam-input.rules
|
||||||
fi
|
fi
|
||||||
|
run_dumb_udev="false"
|
||||||
else
|
else
|
||||||
# Disable supervisord script
|
# Disable supervisord script since we are not able to execute "udevadm trigger"
|
||||||
|
echo "**** Disable udev service due to privilege restrictions ****";
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/udev.ini
|
||||||
|
run_dumb_udev="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${run_dumb_udev}" = "true" ]; then
|
||||||
|
# Enable dumb-udev instead of udevd
|
||||||
|
echo "**** Enable dumb-udev service ****";
|
||||||
|
sed -i 's|^command.*=.*$|command=start-dumb-udev.sh|' /etc/supervisor.d/udev.ini
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ if [ "${current_local}" != "${USER_LOCALES}" ]; then
|
|||||||
export LANGUAGE="${user_local}"
|
export LANGUAGE="${user_local}"
|
||||||
export LANG="${user_local}"
|
export LANG="${user_local}"
|
||||||
export LC_ALL="${user_local}" 2> /dev/null
|
export LC_ALL="${user_local}" 2> /dev/null
|
||||||
sleep 2
|
sleep 0.5
|
||||||
locale-gen
|
locale-gen
|
||||||
update-locale LC_ALL="${user_local}"
|
update-locale LC_ALL="${user_local}"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
echo "**** Configure pulseaudio ****"
|
echo "**** Configure pulseaudio ****"
|
||||||
|
|
||||||
|
# Always enable the pulseaudio service
|
||||||
|
echo "Enable pulseaudio service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/pulseaudio.ini
|
||||||
|
|
||||||
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
||||||
echo "Configure pulseaudio as simple dummy audio"
|
echo "Configure pulseaudio as simple dummy audio"
|
||||||
sed -i 's|^; autospawn.*$|autospawn = no|' /etc/pulse/client.conf
|
sed -i 's|^; autospawn.*$|autospawn = no|' /etc/pulse/client.conf
|
||||||
@@ -13,9 +17,9 @@ else
|
|||||||
# Ensure pulseaudio directories have the correct permissions
|
# Ensure pulseaudio directories have the correct permissions
|
||||||
mkdir -p \
|
mkdir -p \
|
||||||
${PULSE_SOCKET_DIR} \
|
${PULSE_SOCKET_DIR} \
|
||||||
/home/${USER}/.config/pulse
|
${USER_HOME:?}/.config/pulse
|
||||||
chmod -R a+rw ${PULSE_SOCKET_DIR}
|
chmod -R a+rw ${PULSE_SOCKET_DIR}
|
||||||
chown -R ${PUID}:${PGID} /home/${USER}/.config/pulse
|
chown -R ${PUID}:${PGID} ${USER_HOME:?}/.config/pulse
|
||||||
|
|
||||||
# Configure the palse audio socket
|
# Configure the palse audio socket
|
||||||
sed -i "s|^; default-server.*$|default-server = ${PULSE_SERVER}|" /etc/pulse/client.conf
|
sed -i "s|^; default-server.*$|default-server = ${PULSE_SERVER}|" /etc/pulse/client.conf
|
||||||
@@ -30,9 +34,6 @@ else
|
|||||||
if [ "X${DEBUGGING:-}" == "X" ]; then
|
if [ "X${DEBUGGING:-}" == "X" ]; then
|
||||||
sed -i 's|^; log-level.*$|log-level = debug|' /etc/pulse/daemon.conf
|
sed -i 's|^; log-level.*$|log-level = debug|' /etc/pulse/daemon.conf
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make startup script executable
|
|
||||||
chmod +x /usr/bin/start-pulseaudio.sh
|
|
||||||
fi
|
fi
|
||||||
chown -R ${USER} /etc/pulse
|
chown -R ${USER} /etc/pulse
|
||||||
|
|
||||||
|
|||||||
@@ -1,83 +1,155 @@
|
|||||||
|
|
||||||
# Fech NVIDIA GPU device (if one exists)
|
# Fech NVIDIA GPU device (if one exists)
|
||||||
if [ "${NVIDIA_VISIBLE_DEVICES:-}" == "all" ]; then
|
if [ "${NVIDIA_VISIBLE_DEVICES:-}" = "all" ]; then
|
||||||
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
||||||
elif [ -z "${NVIDIA_VISIBLE_DEVICES:-}" ]; then
|
elif [ "${NVIDIA_VISIBLE_DEVICES:-}X" = "X" ]; then
|
||||||
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
||||||
else
|
else
|
||||||
export gpu_select=$(nvidia-smi --format=csv --id=$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1) --query-gpu=uuid | sed -n 2p)
|
export gpu_select=$(nvidia-smi --format=csv --id=$(echo "$NVIDIA_VISIBLE_DEVICES" | cut -d ',' -f1) --query-gpu=uuid | sed -n 2p)
|
||||||
if [ -z "$gpu_select" ]; then
|
if [ "${gpu_select:-}X" = "X" ]; then
|
||||||
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
export gpu_select=$(nvidia-smi --format=csv --query-gpu=uuid 2> /dev/null | sed -n 2p)
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# NVIDIA Params
|
# NVIDIA Params
|
||||||
export nvidia_pci_address="$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select}" 2> /dev/null | sed -n 2p | cut -d ':' -f2,3)"
|
export nvidia_pci_address="$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select:?}" 2> /dev/null | sed -n 2p | cut -d ':' -f2,3)"
|
||||||
export nvidia_gpu_name=$(nvidia-smi --format=csv --query-gpu=name --id="${gpu_select}" 2> /dev/null | sed -n 2p)
|
export nvidia_gpu_name=$(nvidia-smi --format=csv --query-gpu=name --id="${gpu_select:?}" 2> /dev/null | sed -n 2p)
|
||||||
export nvidia_host_driver_version="$(nvidia-smi 2> /dev/null | grep NVIDIA-SMI | cut -d ' ' -f3)"
|
export nvidia_host_driver_version="$(nvidia-smi 2> /dev/null | grep NVIDIA-SMI | cut -d ' ' -f3)"
|
||||||
|
|
||||||
# Intel params
|
# Intel params
|
||||||
|
# This figures out if it's an intel CPU with integrated GPU
|
||||||
export intel_cpu_model="$(lscpu | grep 'Model name:' | grep -i intel | cut -d':' -f2 | xargs)"
|
export intel_cpu_model="$(lscpu | grep 'Model name:' | grep -i intel | cut -d':' -f2 | xargs)"
|
||||||
|
# We need to check if the user has an intel ARC GPU as well
|
||||||
|
export intel_gpu_model="$(lspci | grep -i "VGA compatible controller: Intel" | cut -d':' -f3 | xargs)"
|
||||||
|
|
||||||
# AMD params
|
# AMD params
|
||||||
export amd_cpu_model="$(lscpu | grep 'Model name:' | grep -i amd | cut -d':' -f2 | xargs)"
|
export amd_cpu_model="$(lscpu | grep 'Model name:' | grep -i amd | cut -d':' -f2 | xargs)"
|
||||||
export amd_gpu_model="$(lspci | grep -i vga | grep -i amd)"
|
export amd_gpu_model="$(lspci | grep -i vga | grep -i amd)"
|
||||||
|
|
||||||
function download_driver {
|
function download_driver {
|
||||||
mkdir -p ${USER_HOME}/Downloads
|
mkdir -p "${USER_HOME:?}/Downloads"
|
||||||
chown -R ${USER} ${USER_HOME}/Downloads
|
chown -R ${USER:?} "${USER_HOME:?}/Downloads"
|
||||||
|
|
||||||
if [[ ! -f "${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run" ]]; then
|
if [[ ! -f "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" ]]; then
|
||||||
echo "Downloading driver v${nvidia_host_driver_version}"
|
echo "Downloading driver v${nvidia_host_driver_version:?}"
|
||||||
wget -q --show-progress --progress=bar:force:noscroll \
|
wget -q --show-progress --progress=bar:force:noscroll \
|
||||||
-O /tmp/NVIDIA.run \
|
-O /tmp/NVIDIA.run \
|
||||||
http://download.nvidia.com/XFree86/Linux-x86_64/${nvidia_host_driver_version}/NVIDIA-Linux-x86_64-${nvidia_host_driver_version}.run
|
"http://download.nvidia.com/XFree86/Linux-x86_64/${nvidia_host_driver_version:?}/NVIDIA-Linux-x86_64-${nvidia_host_driver_version:?}.run"
|
||||||
[[ $? -gt 0 ]] && echo "Error downloading driver. Exit!" && return 1
|
[[ $? -gt 0 ]] && echo "Error downloading driver. Exit!" && return 1
|
||||||
|
|
||||||
mv /tmp/NVIDIA.run ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run
|
mv /tmp/NVIDIA.run "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_nvidia_driver {
|
function install_nvidia_driver {
|
||||||
# Check here if the currently installed version matches using nvidia-settings
|
# Check here if the currently installed version matches using nvidia-settings
|
||||||
nvidia_settings_version=$(nvidia-settings --version 2> /dev/null | grep version | cut -d ' ' -f 4)
|
nvidia_settings_version=$(nvidia-settings --version 2> /dev/null | grep version | cut -d ' ' -f 4)
|
||||||
[[ "${nvidia_settings_version}x" == "${nvidia_host_driver_version}x" ]] && return 0;
|
if [ "${nvidia_settings_version:-}X" != "${nvidia_host_driver_version:-}X" ]; then
|
||||||
|
# Download the driver (if it does not yet exist locally)
|
||||||
|
download_driver
|
||||||
|
|
||||||
# Download the driver (if it does not yet exist locally)
|
# if command -v pacman &> /dev/null; then
|
||||||
download_driver
|
# echo "Install NVIDIA vulkan utils" \
|
||||||
|
# && pacman -Syu --noconfirm --needed \
|
||||||
|
# lib32-nvidia-utils \
|
||||||
|
# lib32-vulkan-icd-loader
|
||||||
|
# nvidia-utils \
|
||||||
|
# vulkan-icd-loader \
|
||||||
|
# && echo
|
||||||
|
# fi
|
||||||
|
if (($(echo $nvidia_host_driver_version | cut -d '.' -f 1) > 500)); then
|
||||||
|
echo "Installing NVIDIA driver v${nvidia_host_driver_version:?} to match what is running on the host"
|
||||||
|
chmod +x "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run"
|
||||||
|
"${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" \
|
||||||
|
--silent \
|
||||||
|
--accept-license \
|
||||||
|
--skip-depmod \
|
||||||
|
--skip-module-unload \
|
||||||
|
--no-kernel-modules \
|
||||||
|
--no-kernel-module-source \
|
||||||
|
--install-compat32-libs \
|
||||||
|
--no-nouveau-check \
|
||||||
|
--no-nvidia-modprobe \
|
||||||
|
--no-systemd \
|
||||||
|
--no-distro-scripts \
|
||||||
|
--no-rpms \
|
||||||
|
--no-backup \
|
||||||
|
--no-check-for-alternate-installs \
|
||||||
|
--no-libglx-indirect \
|
||||||
|
--no-install-libglvnd \
|
||||||
|
> "${USER_HOME:?}/Downloads/nvidia_gpu_install.log" 2>&1
|
||||||
|
else
|
||||||
|
echo "Installing Legacy NVIDIA driver v${nvidia_host_driver_version:?} to match what is running on the host"
|
||||||
|
chmod +x "${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run"
|
||||||
|
"${USER_HOME:?}/Downloads/NVIDIA_${nvidia_host_driver_version:?}.run" \
|
||||||
|
--silent \
|
||||||
|
--accept-license \
|
||||||
|
--skip-depmod \
|
||||||
|
--skip-module-unload \
|
||||||
|
--no-kernel-module \
|
||||||
|
--no-kernel-module-source \
|
||||||
|
--install-compat32-libs \
|
||||||
|
--no-nouveau-check \
|
||||||
|
--no-nvidia-modprobe \
|
||||||
|
--no-systemd \
|
||||||
|
--no-distro-scripts \
|
||||||
|
--no-rpms \
|
||||||
|
--no-backup \
|
||||||
|
--no-check-for-alternate-installs \
|
||||||
|
--no-libglx-indirect \
|
||||||
|
--no-install-libglvnd \
|
||||||
|
> "${USER_HOME:?}/Downloads/nvidia_gpu_install.log" 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# if command -v pacman &> /dev/null; then
|
function patch_nvidia_driver {
|
||||||
# echo "Install NVIDIA vulkan utils" \
|
# REF: https://github.com/keylase/nvidia-patch#docker-support
|
||||||
# && pacman -Syu --noconfirm --needed \
|
if [ "${NVIDIA_PATCH_VERSION:-}X" != "X" ]; then
|
||||||
# lib32-nvidia-utils \
|
# Don't fail boot if something goes wrong here. Set +e
|
||||||
# lib32-vulkan-icd-loader
|
(
|
||||||
# nvidia-utils \
|
set +e
|
||||||
# vulkan-icd-loader \
|
if [ ! -f "${USER_HOME:?}/Downloads/nvidia-patch.${NVIDIA_PATCH_VERSION:?}.sh" ]; then
|
||||||
# && echo
|
echo "Fetch NVIDIA NVENC patch"
|
||||||
# fi
|
wget -q --show-progress --progress=bar:force:noscroll \
|
||||||
|
-O "${USER_HOME:?}/Downloads/nvidia-patch.${NVIDIA_PATCH_VERSION:?}.sh" \
|
||||||
|
"https://raw.githubusercontent.com/keylase/nvidia-patch/${NVIDIA_PATCH_VERSION:?}/patch.sh"
|
||||||
|
fi
|
||||||
|
if [ ! -f "${USER_HOME:?}/Downloads/nvidia-patch-fbc.${NVIDIA_PATCH_VERSION:?}.sh" ]; then
|
||||||
|
echo "Fetch NVIDIA NvFBC patch"
|
||||||
|
wget -q --show-progress --progress=bar:force:noscroll \
|
||||||
|
-O "${USER_HOME:?}/Downloads/nvidia-patch-fbc.${NVIDIA_PATCH_VERSION:?}.sh" \
|
||||||
|
"https://raw.githubusercontent.com/keylase/nvidia-patch/${NVIDIA_PATCH_VERSION:?}/patch-fbc.sh"
|
||||||
|
fi
|
||||||
|
chmod +x \
|
||||||
|
"${USER_HOME:?}/Downloads/nvidia-patch.${NVIDIA_PATCH_VERSION:?}.sh" \
|
||||||
|
"${USER_HOME:?}/Downloads/nvidia-patch-fbc.${NVIDIA_PATCH_VERSION:?}.sh"
|
||||||
|
|
||||||
echo "Installing NVIDIA driver v${nvidia_host_driver_version} to match what is running on the host"
|
echo "Install NVIDIA driver patches"
|
||||||
chmod +x ${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run
|
echo "/patched-lib" > /etc/ld.so.conf.d/000-patched-lib.conf
|
||||||
${USER_HOME}/Downloads/NVIDIA_${nvidia_host_driver_version}.run \
|
mkdir -p "/patched-lib"
|
||||||
--silent \
|
PATCH_OUTPUT_DIR="/patched-lib" "${USER_HOME:?}/Downloads/nvidia-patch.${NVIDIA_PATCH_VERSION:?}.sh"
|
||||||
--accept-license \
|
PATCH_OUTPUT_DIR="/patched-lib" "${USER_HOME:?}/Downloads/nvidia-patch-fbc.${NVIDIA_PATCH_VERSION:?}.sh"
|
||||||
--no-kernel-module \
|
|
||||||
--install-compat32-libs \
|
pushd "/patched-lib" &> /dev/null || { echo "Error: Failed to push directory to /patched-lib"; exit 1; }
|
||||||
--no-nouveau-check \
|
for f in * ; do
|
||||||
--no-nvidia-modprobe \
|
suffix="${f##*.so}"
|
||||||
--no-rpms \
|
name="$(basename "$f" "$suffix")"
|
||||||
--no-backup \
|
[ -h "$name" ] || ln -sf "$f" "$name"
|
||||||
--no-check-for-alternate-installs \
|
[ -h "$name" ] || ln -sf "$f" "$name.1"
|
||||||
--no-libglx-indirect \
|
done
|
||||||
--no-install-libglvnd \
|
ldconfig
|
||||||
> ${USER_HOME}/Downloads/nvidia_gpu_install.log 2>&1
|
popd &> /dev/null || { echo "Error: Failed to pop directory out of /patched-lib"; exit 1; }
|
||||||
|
)
|
||||||
|
else
|
||||||
|
echo "Leaving NVIDIA driver stock without patching"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_amd_gpu_driver {
|
function install_amd_gpu_driver {
|
||||||
echo "Install AMD vulkan driver"
|
echo "Install AMD vulkan driver"
|
||||||
if command -v pacman &> /dev/null; then
|
if command -v pacman &> /dev/null; then
|
||||||
pacman -Syu --noconfirm --needed \
|
pacman -Syu --noconfirm --needed \
|
||||||
lib32-mesa \
|
|
||||||
lib32-vulkan-icd-loader \
|
lib32-vulkan-icd-loader \
|
||||||
lib32-vulkan-radeon \
|
lib32-vulkan-radeon \
|
||||||
vulkan-icd-loader \
|
vulkan-icd-loader \
|
||||||
@@ -97,7 +169,6 @@ function install_intel_gpu_driver {
|
|||||||
echo "Install Intel vulkan driver"
|
echo "Install Intel vulkan driver"
|
||||||
if command -v pacman &> /dev/null; then
|
if command -v pacman &> /dev/null; then
|
||||||
pacman -Syu --noconfirm --needed \
|
pacman -Syu --noconfirm --needed \
|
||||||
lib32-mesa \
|
|
||||||
lib32-vulkan-icd-loader \
|
lib32-vulkan-icd-loader \
|
||||||
lib32-vulkan-intel \
|
lib32-vulkan-intel \
|
||||||
vulkan-icd-loader \
|
vulkan-icd-loader \
|
||||||
@@ -113,26 +184,30 @@ function install_intel_gpu_driver {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# NVIDIA GPU
|
# Intel Arc GPU or Intel CPU with possible iGPU
|
||||||
if [[ ! -z ${nvidia_pci_address} ]]; then
|
if [ "${intel_gpu_model:-}X" != "X" ]; then
|
||||||
echo "**** Found NVIDIA device '${nvidia_gpu_name}' ****";
|
echo "**** Found Intel device '${intel_gpu_model:?}' ****"
|
||||||
install_nvidia_driver
|
install_intel_gpu_driver
|
||||||
else
|
elif [ "${intel_cpu_model:-}X" != "X" ]; then
|
||||||
echo "**** No NVIDIA device found ****";
|
echo "**** Found Intel device '${intel_cpu_model:?}' ****"
|
||||||
fi
|
|
||||||
# Intel GPU
|
|
||||||
if [[ ! -z ${intel_cpu_model} ]]; then
|
|
||||||
echo "**** Found Intel device '${intel_cpu_model}' ****";
|
|
||||||
install_intel_gpu_driver
|
install_intel_gpu_driver
|
||||||
else
|
else
|
||||||
echo "**** No Intel device found ****";
|
echo "**** No Intel device found ****"
|
||||||
fi
|
fi
|
||||||
# AMD GPU
|
# AMD GPU
|
||||||
if [[ ! -z ${amd_gpu_model} ]]; then
|
if [ "${amd_gpu_model:-}X" != "X" ]; then
|
||||||
echo "**** Found AMD device '${amd_gpu_model}' ****";
|
echo "**** Found AMD device '${amd_gpu_model:?}' ****"
|
||||||
install_amd_gpu_driver
|
install_amd_gpu_driver
|
||||||
else
|
else
|
||||||
echo "**** No AMD device found ****";
|
echo "**** No AMD device found ****"
|
||||||
|
fi
|
||||||
|
# NVIDIA GPU
|
||||||
|
if [ "${nvidia_pci_address:-}X" != "X" ]; then
|
||||||
|
echo "**** Found NVIDIA device '${nvidia_gpu_name:?}' ****"
|
||||||
|
install_nvidia_driver
|
||||||
|
patch_nvidia_driver
|
||||||
|
else
|
||||||
|
echo "**** No NVIDIA device found ****"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DONE"
|
echo "DONE"
|
||||||
|
|||||||
22
overlay/etc/cont-init.d/70-configure_desktop.sh
Normal file
22
overlay/etc/cont-init.d/70-configure_desktop.sh
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
echo "**** Configure Desktop ****"
|
||||||
|
|
||||||
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
echo "Enable Desktop service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/desktop.ini
|
||||||
|
else
|
||||||
|
echo "Desktop service not available when container is run in 'secondary' mode."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/desktop.ini
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Setup home directory
|
||||||
|
if [[ ! -f /tmp/.home-directory-template-updated ]]; then
|
||||||
|
echo "Ensure home directory template is owned by the default user."
|
||||||
|
chown -R ${PUID}:${PGID} /templates/home_directory_template
|
||||||
|
echo "Installing default home directory template"
|
||||||
|
mkdir -p "${USER_HOME:?}"
|
||||||
|
rsync -aq /templates/home_directory_template/ "${USER_HOME:?}"/
|
||||||
|
touch /tmp/.home-directory-template-updated
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -13,13 +13,18 @@ fi
|
|||||||
|
|
||||||
export nvidia_gpu_hex_id=$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select}" 2> /dev/null | sed -n 2p)
|
export nvidia_gpu_hex_id=$(nvidia-smi --format=csv --query-gpu=pci.bus_id --id="${gpu_select}" 2> /dev/null | sed -n 2p)
|
||||||
|
|
||||||
|
export monitor_connected=$(cat /sys/class/drm/card*/status | awk '/^connected/ { print $1; }' | head -n1)
|
||||||
|
|
||||||
# Fech current configuration (if modified in UI)
|
# Fech current configuration (if modified in UI)
|
||||||
if [ -f "${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml" ]; then
|
if [ -f "${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml" ]; then
|
||||||
new_display_sizew=$(cat ${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml | grep Resolution | head -n1 | grep -oP '(?<=value=").*?(?=")' | cut -d'x' -f1)
|
new_display_sizew=$(cat ${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml | grep Resolution | head -n1 | grep -oP '(?<=value=").*?(?=")' | cut -d'x' -f1)
|
||||||
new_display_sizeh=$(cat ${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml | grep Resolution | head -n1 | grep -oP '(?<=value=").*?(?=")' | cut -d'x' -f2)
|
new_display_sizeh=$(cat ${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml | grep Resolution | head -n1 | grep -oP '(?<=value=").*?(?=")' | cut -d'x' -f2)
|
||||||
if [ "${new_display_sizew}x" != "x" ] && [ "${new_display_sizeh}x" != "x" ]; then
|
new_display_refresh=$(cat ${USER_HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml | grep RefreshRate | head -n1 | grep -oP '(?<=value=").*?(?=")' | cut -d'x' -f2)
|
||||||
|
if [ "${new_display_sizew}x" != "x" ] && [ "${new_display_sizeh}x" != "x" ] && [ "${new_display_refresh}x" != "x" ]; then
|
||||||
export DISPLAY_SIZEW="${new_display_sizew}"
|
export DISPLAY_SIZEW="${new_display_sizew}"
|
||||||
export DISPLAY_SIZEH="${new_display_sizeh}"
|
export DISPLAY_SIZEH="${new_display_sizeh}"
|
||||||
|
# Round refresh rate to closest multiple of 60
|
||||||
|
export DISPLAY_REFRESH="$(echo ${new_display_refresh} | awk '{rounded = int(($1 + 30) / 60) * 60; if (rounded < 30) rounded += 60; print rounded}')"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -33,24 +38,37 @@ function configure_nvidia_x_server {
|
|||||||
echo "Configuring X11 with PCI bus ID: '${bus_id}'"
|
echo "Configuring X11 with PCI bus ID: '${bus_id}'"
|
||||||
export MODELINE=$(cvt -r "${DISPLAY_SIZEW}" "${DISPLAY_SIZEH}" "${DISPLAY_REFRESH}" | sed -n 2p)
|
export MODELINE=$(cvt -r "${DISPLAY_SIZEW}" "${DISPLAY_SIZEH}" "${DISPLAY_REFRESH}" | sed -n 2p)
|
||||||
echo "Writing X11 config with ${MODELINE}"
|
echo "Writing X11 config with ${MODELINE}"
|
||||||
nvidia-xconfig --virtual="${DISPLAY_SIZEW}x${DISPLAY_SIZEH}" --depth="${DISPLAY_CDEPTH}" --mode=$(echo "${MODELINE}" | awk '{print $2}' | tr -d '"') --allow-empty-initial-configuration --no-probe-all-gpus --busid="${bus_id}" --only-one-x-screen --connected-monitor="${DISPLAY_VIDEO_PORT}"
|
connected_monitor="--use-display-device=None"
|
||||||
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
|
if [[ "X${DISPLAY_VIDEO_PORT:-}" != "X" ]]; then
|
||||||
|
connected_monitor="--connected-monitor=${DISPLAY_VIDEO_PORT:?}"
|
||||||
|
fi
|
||||||
|
nvidia-xconfig --virtual="${DISPLAY_SIZEW:?}x${DISPLAY_SIZEH:?}" --depth="${DISPLAY_CDEPTH:?}" --mode=$(echo "${MODELINE:?}" | awk '{print $2}' | tr -d '"') --allow-empty-initial-configuration --no-probe-all-gpus --busid="${bus_id:?}" --no-multigpu --no-sli --no-base-mosaic --only-one-x-screen ${connected_monitor:?}
|
||||||
|
sed -i '/Driver\s\+"nvidia"/a\ Option "ModeValidation" "NoMaxPClkCheck, NoEdidMaxPClkCheck, NoMaxSizeCheck, NoHorizSyncCheck, NoVertRefreshCheck, NoVirtualSizeCheck, NoTotalSizeCheck, NoDualLinkDVICheck, NoDisplayPortBandwidthCheck, AllowNon3DVisionModes, AllowNonHDMI3DModes, AllowNonEdidModes, NoEdidHDMI2Check, AllowDpInterlaced"\n Option "HardDPMS" "False"' /etc/X11/xorg.conf
|
||||||
sed -i '/Section\s\+"Monitor"/a\ '"${MODELINE}" /etc/X11/xorg.conf
|
sed -i '/Section\s\+"Monitor"/a\ '"${MODELINE}" /etc/X11/xorg.conf
|
||||||
|
# Prevent interference between GPUs
|
||||||
|
echo -e "Section \"ServerFlags\"\n Option \"AutoAddGPU\" \"false\"\nEndSection" | tee -a /etc/X11/xorg.conf > /dev/null
|
||||||
|
# Configure primary GPU
|
||||||
|
sed -i '/Driver\s\+"nvidia"/a\ Option "AllowEmptyInitialConfiguration"\n Option "PrimaryGPU" "yes"' /usr/share/X11/xorg.conf.d/nvidia-drm-outputclass.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
# Allow anybody for running x server
|
# Allow anybody for running x server
|
||||||
function configure_x_server {
|
function configure_x_server {
|
||||||
# Configure x to be run by anyone
|
# Configure x to be run by anyone
|
||||||
if grep -Fxq "allowed_users=console" /etc/X11/Xwrapper.config; then
|
if [[ ! -f /etc/X11/Xwrapper.config ]]; then
|
||||||
|
echo "Create Xwrapper.config"
|
||||||
|
echo 'allowed_users=anybody' > /etc/X11/Xwrapper.config
|
||||||
|
echo 'needs_root_rights=yes' >> /etc/X11/Xwrapper.config
|
||||||
|
elif grep -Fxq "allowed_users=console" /etc/X11/Xwrapper.config; then
|
||||||
echo "Configure Xwrapper.config"
|
echo "Configure Xwrapper.config"
|
||||||
sed -i "s/allowed_users=console/allowed_users=anybody/" /etc/X11/Xwrapper.config
|
sed -i "s/allowed_users=console/allowed_users=anybody/" /etc/X11/Xwrapper.config
|
||||||
|
echo 'needs_root_rights=yes' >> /etc/X11/Xwrapper.config
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove previous Xorg config
|
# Remove previous Xorg config
|
||||||
rm -f /etc/X11/xorg.conf
|
rm -f /etc/X11/xorg.conf
|
||||||
|
|
||||||
# Ensure the X socket path exists
|
# Ensure the X socket path exists
|
||||||
mkdir -p ${XORG_SOCKET_DIR}
|
mkdir -p ${XORG_SOCKET_DIR:?}
|
||||||
|
|
||||||
# Clear out old lock files
|
# Clear out old lock files
|
||||||
display_file=${XORG_SOCKET_DIR}/X${DISPLAY#:}
|
display_file=${XORG_SOCKET_DIR}/X${DISPLAY#:}
|
||||||
@@ -76,6 +94,9 @@ function configure_x_server {
|
|||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
||||||
# Enable xvfb supervisord script
|
# Enable xvfb supervisord script
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/xvfb.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/xvfb.ini
|
||||||
|
else
|
||||||
|
echo "Configure container with no X server"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Enable KB/Mouse input capture with Xorg if configured
|
# Enable KB/Mouse input capture with Xorg if configured
|
||||||
@@ -86,7 +107,7 @@ function configure_x_server {
|
|||||||
echo "Leaving evdev inputs disabled"
|
echo "Leaving evdev inputs disabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_connected=$(cat /sys/class/drm/card*/status | awk '/^connected/ { print $1; }' | head -n1)
|
# Configure dummy config if no monitor is connected (not applicable to NVIDIA)
|
||||||
if [[ "X${monitor_connected}" == "X" ]]; then
|
if [[ "X${monitor_connected}" == "X" ]]; then
|
||||||
echo "No monitors connected. Installing dummy xorg.conf"
|
echo "No monitors connected. Installing dummy xorg.conf"
|
||||||
# Use a dummy display input
|
# Use a dummy display input
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
echo "**** Configure Dockerd ****"
|
|
||||||
|
|
||||||
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
|
||||||
if [ ! -S /var/run/docker.sock ]; then
|
|
||||||
echo "Enable Dockerd daemon"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dind.ini
|
|
||||||
chmod +x /usr/bin/start-dind.sh
|
|
||||||
else
|
|
||||||
echo "Docker socket has been passed in from host. Using that instead"
|
|
||||||
fi
|
|
||||||
# Configure 'default' user to run docker commands without sudo
|
|
||||||
if ! getent group docker &> /dev/null; then
|
|
||||||
echo "Add user '${USER}' to docker group for sudoless execution"
|
|
||||||
groupadd docker
|
|
||||||
usermod -aG docker ${USER}
|
|
||||||
mkdir -p /home/${USER}/.docker
|
|
||||||
chown -R ${PUID}:${PGID} /home/${USER}/.docker
|
|
||||||
chmod -R g+rwx /home/${USER}/.docker
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Dockerd daemon not available when container is run in 'secondary' mode"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "DONE"
|
|
||||||
13
overlay/etc/cont-init.d/80-configure_flatpak.sh
Normal file
13
overlay/etc/cont-init.d/80-configure_flatpak.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
echo "**** Configure Flatpak ****"
|
||||||
|
|
||||||
|
if [ "X${NVIDIA_VISIBLE_DEVICES:-}" != "X" ]; then
|
||||||
|
# Fix some flatpak quirks (not sure what is happening here) for NVIDIA containers
|
||||||
|
mount -t proc none /proc
|
||||||
|
flatpak list
|
||||||
|
echo "Flatpak configured for running inside a Docker container"
|
||||||
|
else
|
||||||
|
echo "Flatpak already configured for running inside a Docker container"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
echo "**** Configure Plugins ****"
|
|
||||||
|
|
||||||
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
|
||||||
if [ "X${ENABLED_PLUGINS:-}" != "X" ]; then
|
|
||||||
echo "Enable Plugins"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/plugins.ini
|
|
||||||
chmod +x /usr/bin/start-plugins.sh
|
|
||||||
else
|
|
||||||
echo "Disable Plugins"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Plugins not available when container is run in 'secondary' mode"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "DONE"
|
|
||||||
35
overlay/etc/cont-init.d/90-configure_steam.sh
Normal file
35
overlay/etc/cont-init.d/90-configure_steam.sh
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
echo "**** Configure Steam ****"
|
||||||
|
|
||||||
|
steam_autostart_desktop="$(cat <<EOF
|
||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=Application
|
||||||
|
Name=Steam
|
||||||
|
Comment=Launch steam on login
|
||||||
|
Exec=/usr/games/steam %U ${STEAM_ARGS:-}
|
||||||
|
Icon=steam
|
||||||
|
OnlyShowIn=XFCE;
|
||||||
|
RunHook=0
|
||||||
|
StartupNotify=false
|
||||||
|
Terminal=false
|
||||||
|
Hidden=false
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
|
||||||
|
if [ "${ENABLE_STEAM:-}" = "true" ]; then
|
||||||
|
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
||||||
|
echo "Enable Steam supervisor.d service"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/steam.ini
|
||||||
|
else
|
||||||
|
echo "Enable Steam auto-start script"
|
||||||
|
mkdir -p "${USER_HOME:?}/.config/autostart"
|
||||||
|
echo "${steam_autostart_desktop:?}" > "${USER_HOME:?}/.config/autostart/Steam.desktop"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/steam.ini
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Disable Steam service"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/steam.ini
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -5,7 +5,6 @@ if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
|||||||
if [ "${ENABLE_SUNSHINE:-}" = "true" ]; then
|
if [ "${ENABLE_SUNSHINE:-}" = "true" ]; then
|
||||||
echo "Enable Sunshine server"
|
echo "Enable Sunshine server"
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/sunshine.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/sunshine.ini
|
||||||
chmod +x /usr/bin/start-sunshine.sh
|
|
||||||
else
|
else
|
||||||
echo "Disable Sunshine server"
|
echo "Disable Sunshine server"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -15,55 +15,22 @@ function get_next_unused_port() {
|
|||||||
# Note: Ports 32035-32248 are unallocated port ranges. We should be able to find something in here that we can use
|
# Note: Ports 32035-32248 are unallocated port ranges. We should be able to find something in here that we can use
|
||||||
# REF: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?&page=130
|
# REF: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?&page=130
|
||||||
DYNAMIC_PORT_VNC=$(get_next_unused_port 32035)
|
DYNAMIC_PORT_VNC=$(get_next_unused_port 32035)
|
||||||
DYNAMIC_PORT_NOVNC_SERVICE=$(get_next_unused_port ${DYNAMIC_PORT_VNC})
|
|
||||||
DYNAMIC_PORT_AUDIO_WEBSOCKET=$(get_next_unused_port ${DYNAMIC_PORT_NOVNC_SERVICE})
|
|
||||||
DYNAMIC_PORT_AUDIO_STREAM=$(get_next_unused_port ${DYNAMIC_PORT_AUDIO_WEBSOCKET})
|
|
||||||
export PORT_VNC=${PORT_VNC:-$DYNAMIC_PORT_VNC}
|
export PORT_VNC=${PORT_VNC:-$DYNAMIC_PORT_VNC}
|
||||||
echo "Configure VNC service port '${PORT_VNC}'"
|
echo "Configure VNC service port '${PORT_VNC}'"
|
||||||
export PORT_NOVNC_SERVICE=${PORT_NOVNC_SERVICE:-$DYNAMIC_PORT_NOVNC_SERVICE}
|
DYNAMIC_PORT_AUDIO_STREAM=$(get_next_unused_port ${DYNAMIC_PORT_VNC})
|
||||||
echo "Configure noVNC service port '${PORT_NOVNC_SERVICE}'"
|
|
||||||
export PORT_AUDIO_WEBSOCKET=${PORT_AUDIO_WEBSOCKET:-$DYNAMIC_PORT_AUDIO_WEBSOCKET}
|
|
||||||
echo "Configure audio websocket port '${PORT_AUDIO_WEBSOCKET}'"
|
|
||||||
export PORT_AUDIO_STREAM=${PORT_AUDIO_STREAM:-$DYNAMIC_PORT_AUDIO_STREAM}
|
export PORT_AUDIO_STREAM=${PORT_AUDIO_STREAM:-$DYNAMIC_PORT_AUDIO_STREAM}
|
||||||
echo "Configure pulseaudio encoded stream port '${PORT_AUDIO_STREAM}'"
|
echo "Configure pulseaudio encoded stream port '${PORT_AUDIO_STREAM}'"
|
||||||
|
|
||||||
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
|
||||||
if [ ${WEB_UI_MODE} = "vnc" ]; then
|
if [ "${WEB_UI_MODE:-}" = "vnc" ]; then
|
||||||
echo "Enable VNC server"
|
echo "Enable VNC server"
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc.ini
|
||||||
|
|
||||||
# Configure Nginx proxy for the websocket and VNC
|
# TODO: Remove this... Always enable VNC audio
|
||||||
cp -f /opt/noVNC/nginx.template.conf /opt/noVNC/nginx.conf
|
|
||||||
sed -i "s|<USER>|${USER}|" /opt/noVNC/nginx.conf
|
|
||||||
sed -i "s|<PORT_NOVNC_WEB>|${PORT_NOVNC_WEB}|" /opt/noVNC/nginx.conf
|
|
||||||
sed -i "s|<PORT_NOVNC_SERVICE>|${PORT_NOVNC_SERVICE}|" /opt/noVNC/nginx.conf
|
|
||||||
sed -i "s|<PORT_AUDIO_WEBSOCKET>|${PORT_AUDIO_WEBSOCKET}|" /opt/noVNC/nginx.conf
|
|
||||||
mkdir -p /var/log/vncproxy
|
|
||||||
chown -R ${USER} /var/log/vncproxy
|
|
||||||
|
|
||||||
if [[ "${ENABLE_VNC_AUDIO}" == "true" ]]; then
|
if [[ "${ENABLE_VNC_AUDIO}" == "true" ]]; then
|
||||||
# Credits for this audio patch:
|
|
||||||
# - https://github.com/novnc/noVNC/issues/302
|
|
||||||
# - https://github.com/vexingcodes/dwarf-fortress-docker
|
|
||||||
# - https://github.com/calebj/noVNC
|
|
||||||
if [ -f /opt/noVNC/audio.patch ]; then
|
|
||||||
echo "Patching noVNC with audio websocket"
|
|
||||||
# Update port specification in patch file
|
|
||||||
sed -i "s|<PORT_AUDIO_WEBSOCKET>|${PORT_AUDIO_WEBSOCKET}|" /opt/noVNC/audio.patch
|
|
||||||
# Apply patch
|
|
||||||
pushd /opt/noVNC/ &> /dev/null
|
|
||||||
patch -p1 --input=/opt/noVNC/audio.patch --batch --quiet
|
|
||||||
popd &> /dev/null
|
|
||||||
rm /opt/noVNC/audio.patch
|
|
||||||
fi
|
|
||||||
# Enable supervisord script
|
# Enable supervisord script
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc-audio.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc-audio.ini
|
||||||
|
|
||||||
# Remove x11vnc from applications menu
|
|
||||||
if ! grep -q 'Hidden=true' /usr/share/applications/x11vnc.desktop; then
|
|
||||||
echo 'Hidden=true' >> /usr/share/applications/x11vnc.desktop
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
echo "Disable audio stream"
|
echo "Disable audio stream"
|
||||||
echo "Disable audio websock"
|
echo "Disable audio websock"
|
||||||
@@ -72,9 +39,13 @@ if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Disable VNC server"
|
echo "Disable VNC server"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "VNC server not available when container is run in 'secondary' mode"
|
echo "VNC server not available when container is run in 'secondary' mode"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DONE"
|
echo "DONE"
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
|
||||||
echo "Configure container as secondary"
|
|
||||||
# Disable dbus
|
|
||||||
echo " - Disable dbus"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
|
||||||
# Disable desktop
|
|
||||||
echo " - Disable desktop"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/desktop.ini
|
|
||||||
# Disable sshd
|
|
||||||
echo " - Disable sshd"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/sshd.ini
|
|
||||||
# Disable vnc
|
|
||||||
echo " - Disable vnc"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
|
||||||
# Disable vnc
|
|
||||||
echo " - Disable vnc"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
|
||||||
# Disable vnc-audio
|
|
||||||
echo " - Disable vnc audio stream"
|
|
||||||
echo " - Disable vnc audio websock"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
|
||||||
# Disable xorg
|
|
||||||
echo " - Disable xorg"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
|
||||||
|
|
||||||
# Enable pulseaudio
|
|
||||||
echo " - Enable pulseaudio"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/pulseaudio.ini
|
|
||||||
# Enable steam
|
|
||||||
echo " - Enable steam"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/steam.ini
|
|
||||||
# Enable udev
|
|
||||||
echo " - Enable udev"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "DONE"
|
|
||||||
34
overlay/etc/cont-init.d/95-setup_wol.sh
Normal file
34
overlay/etc/cont-init.d/95-setup_wol.sh
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: 10-setup_user.sh
|
||||||
|
# Project: cont-init.d
|
||||||
|
# File Created: Tuesday, 5th September 2023 6:15:12 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 5th September 2023 6:39:32 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
|
||||||
|
echo "**** Configure WoL Manager ****"
|
||||||
|
|
||||||
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
if [ "${ENABLE_WOL_POWER_MANAGER:-}" = "true" ]; then
|
||||||
|
if [ -f "/tmp/.wol-monitor" ]; then
|
||||||
|
echo "Container started in WoL Manager mode. Disabling all other services."
|
||||||
|
for init_config in /etc/supervisor.d/*.ini ; do
|
||||||
|
init_config_basename=$(basename "${init_config:?}")
|
||||||
|
init_name="${init_config_basename%.*}"
|
||||||
|
[ "${init_name:?}" = "wol-power-manager" ] && continue
|
||||||
|
echo " - Disable ${init_name:?}"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' "${init_config:?}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
echo "Enable WoL Manager service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/wol-power-manager.ini
|
||||||
|
else
|
||||||
|
echo "Disable WoL Manager service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/wol-power-manager.ini
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "WoL Manager service not available when container is run in 'secondary' mode."
|
||||||
|
fi
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Encoding=UTF-8
|
|
||||||
Version=0.9.4
|
|
||||||
Type=Application
|
|
||||||
Name=Steam
|
|
||||||
Comment=launch steam on login
|
|
||||||
Exec=/usr/games/steam %U -silent
|
|
||||||
Icon=steam
|
|
||||||
OnlyShowIn=XFCE;
|
|
||||||
RunHook=0
|
|
||||||
StartupNotify=false
|
|
||||||
Terminal=false
|
|
||||||
Hidden=false
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
|
|
||||||
[program:dind]
|
|
||||||
priority=20
|
|
||||||
autostart=false
|
|
||||||
autorestart=true
|
|
||||||
user=root
|
|
||||||
command=/usr/bin/start-dind.sh
|
|
||||||
environment=DISPLAY="%(ENV_DISPLAY)s",DISPLAY_DPI="%(ENV_DISPLAY_DPI)s",XDG_RUNTIME_DIR="/tmp/runtime-root"
|
|
||||||
stopsignal=INT
|
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/dind.log
|
|
||||||
stdout_logfile_maxbytes=10MB
|
|
||||||
stdout_logfile_backups=7
|
|
||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/dind.err.log
|
|
||||||
stderr_logfile_maxbytes=10MB
|
|
||||||
stderr_logfile_backups=7
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
[program:plugins]
|
|
||||||
priority=50
|
|
||||||
autostart=false
|
|
||||||
autorestart=false
|
|
||||||
user=%(ENV_USER)s
|
|
||||||
directory=/home/%(ENV_USER)s
|
|
||||||
command=/usr/bin/start-plugins.sh
|
|
||||||
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
|
||||||
stopsignal=INT
|
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/plugins.log
|
|
||||||
stdout_logfile_maxbytes=10MB
|
|
||||||
stdout_logfile_backups=7
|
|
||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/plugins.err.log
|
|
||||||
stderr_logfile_maxbytes=10MB
|
|
||||||
stderr_logfile_backups=7
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
[program:sshd]
|
|
||||||
priority=10
|
|
||||||
autostart=true
|
|
||||||
autorestart=true
|
|
||||||
user=root
|
|
||||||
command=/usr/sbin/sshd -Ddp "%(ENV_PORT_SSH)s"
|
|
||||||
stopsignal=INT
|
|
||||||
stdout_logfile=/var/log/supervisor/sshd.log
|
|
||||||
stdout_logfile_maxbytes=10MB
|
|
||||||
stdout_logfile_backups=7
|
|
||||||
stderr_logfile=/var/log/supervisor/sshd.err.log
|
|
||||||
stderr_logfile_maxbytes=10MB
|
|
||||||
stderr_logfile_backups=7
|
|
||||||
@@ -10,8 +10,7 @@ autorestart=true
|
|||||||
startretries=50
|
startretries=50
|
||||||
user=%(ENV_USER)s
|
user=%(ENV_USER)s
|
||||||
directory=/home/%(ENV_USER)s
|
directory=/home/%(ENV_USER)s
|
||||||
# command=/usr/games/steam -bigpicture
|
command=/usr/games/steam %(ENV_STEAM_ARGS)s
|
||||||
command=/usr/games/steam
|
|
||||||
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s"
|
||||||
stopsignal=INT
|
stopsignal=INT
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/steam.log
|
stdout_logfile=/home/%(ENV_USER)s/.cache/log/steam.log
|
||||||
|
|||||||
@@ -12,17 +12,3 @@ stdout_logfile_backups=7
|
|||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/audiostream.err.log
|
stderr_logfile=/home/%(ENV_USER)s/.cache/log/audiostream.err.log
|
||||||
stderr_logfile_maxbytes=10MB
|
stderr_logfile_maxbytes=10MB
|
||||||
stderr_logfile_backups=7
|
stderr_logfile_backups=7
|
||||||
|
|
||||||
[program:audiowebsock]
|
|
||||||
priority=40
|
|
||||||
autostart=false
|
|
||||||
autorestart=true
|
|
||||||
user=%(ENV_USER)s
|
|
||||||
command=/usr/local/bin/websockify %(ENV_PORT_AUDIO_WEBSOCKET)s localhost:%(ENV_PORT_AUDIO_STREAM)s
|
|
||||||
stopsignal=INT
|
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/audiowebsock.log
|
|
||||||
stdout_logfile_maxbytes=10MB
|
|
||||||
stdout_logfile_backups=7
|
|
||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/audiowebsock.err.log
|
|
||||||
stderr_logfile_maxbytes=10MB
|
|
||||||
stderr_logfile_backups=7
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
priority=30
|
priority=30
|
||||||
autostart=false
|
autostart=false
|
||||||
autorestart=true
|
autorestart=true
|
||||||
user=%(ENV_USER)s
|
user=root
|
||||||
command=/usr/bin/start-x11vnc.sh
|
command=/usr/bin/start-x11vnc.sh
|
||||||
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s",PORT_VNC="%(ENV_PORT_VNC)s"
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s",DISPLAY="%(ENV_DISPLAY)s",PORT_VNC="%(ENV_PORT_VNC)s"
|
||||||
stopsignal=INT
|
stopsignal=INT
|
||||||
@@ -14,12 +14,12 @@ stderr_logfile=/home/%(ENV_USER)s/.cache/log/x11vnc.err.log
|
|||||||
stderr_logfile_maxbytes=10MB
|
stderr_logfile_maxbytes=10MB
|
||||||
stderr_logfile_backups=7
|
stderr_logfile_backups=7
|
||||||
|
|
||||||
[program:novnc]
|
[program:frontend]
|
||||||
priority=30
|
priority=30
|
||||||
autostart=false
|
autostart=false
|
||||||
autorestart=true
|
autorestart=true
|
||||||
user=%(ENV_USER)s
|
user=root
|
||||||
command=/opt/noVNC/utils/launch.sh --vnc localhost:%(ENV_PORT_VNC)s --listen %(ENV_PORT_NOVNC_SERVICE)s
|
command=/opt/frontend/utils/run.sh --web-port %(ENV_PORT_NOVNC_WEB)s --remote-host localhost --vnc-port %(ENV_PORT_VNC)s --audio-port %(ENV_PORT_AUDIO_STREAM)s
|
||||||
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
||||||
stopsignal=INT
|
stopsignal=INT
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/novnc.log
|
stdout_logfile=/home/%(ENV_USER)s/.cache/log/novnc.log
|
||||||
@@ -28,20 +28,3 @@ stdout_logfile_backups=7
|
|||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/novnc.err.log
|
stderr_logfile=/home/%(ENV_USER)s/.cache/log/novnc.err.log
|
||||||
stderr_logfile_maxbytes=10MB
|
stderr_logfile_maxbytes=10MB
|
||||||
stderr_logfile_backups=7
|
stderr_logfile_backups=7
|
||||||
|
|
||||||
[program:vncproxy]
|
|
||||||
priority=30
|
|
||||||
autostart=false
|
|
||||||
autorestart=true
|
|
||||||
numprocs=1
|
|
||||||
startsecs=0
|
|
||||||
user=%(ENV_USER)s
|
|
||||||
command=/usr/sbin/nginx -c /opt/noVNC/nginx.conf
|
|
||||||
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
|
||||||
stopsignal=INT
|
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/vncproxy.log
|
|
||||||
stdout_logfile_maxbytes=10MB
|
|
||||||
stdout_logfile_backups=7
|
|
||||||
stderr_logfile=/home/%(ENV_USER)s/.cache/log/vncproxy.err.log
|
|
||||||
stderr_logfile_maxbytes=10MB
|
|
||||||
stderr_logfile_backups=7
|
|
||||||
|
|||||||
15
overlay/etc/supervisor.d/wol-power-manager.ini
Normal file
15
overlay/etc/supervisor.d/wol-power-manager.ini
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
[program:wol-power-manager]
|
||||||
|
priority=60
|
||||||
|
autostart=false
|
||||||
|
autorestart=true
|
||||||
|
user=root
|
||||||
|
command=/usr/bin/steam-headless-wol-power-manager
|
||||||
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
||||||
|
stopsignal=INT
|
||||||
|
stdout_logfile=/home/%(ENV_USER)s/.cache/log/wol-power-manager.log
|
||||||
|
stdout_logfile_maxbytes=10MB
|
||||||
|
stdout_logfile_backups=7
|
||||||
|
stderr_logfile=/home/%(ENV_USER)s/.cache/log/wol-power-manager.err.log
|
||||||
|
stderr_logfile_maxbytes=10MB
|
||||||
|
stderr_logfile_backups=7
|
||||||
@@ -5,7 +5,7 @@ autostart=false
|
|||||||
autorestart=true
|
autorestart=true
|
||||||
user=root
|
user=root
|
||||||
command=/usr/bin/start-xorg.sh
|
command=/usr/bin/start-xorg.sh
|
||||||
environment=DISPLAY="%(ENV_DISPLAY)s",DISPLAY_DPI="%(ENV_DISPLAY_DPI)s",XDG_RUNTIME_DIR="/tmp/runtime-root"
|
environment=DISPLAY="%(ENV_DISPLAY)s",XDG_RUNTIME_DIR="/tmp/runtime-root"
|
||||||
stopsignal=INT
|
stopsignal=INT
|
||||||
stdout_logfile=/home/%(ENV_USER)s/.cache/log/xorg.log
|
stdout_logfile=/home/%(ENV_USER)s/.cache/log/xorg.log
|
||||||
stdout_logfile_maxbytes=10MB
|
stdout_logfile_maxbytes=10MB
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
daemon off;
|
|
||||||
worker_processes auto;
|
|
||||||
pid /tmp/vncproxy.pid;
|
|
||||||
error_log /home/<USER>/.cache/log/vncproxy.err.log;
|
|
||||||
|
|
||||||
events {
|
|
||||||
}
|
|
||||||
|
|
||||||
http {
|
|
||||||
server {
|
|
||||||
listen <PORT_NOVNC_WEB> default_server;
|
|
||||||
|
|
||||||
access_log /home/<USER>/.cache/log/vncproxy.log;
|
|
||||||
client_body_temp_path /tmp/client_body;
|
|
||||||
fastcgi_temp_path /tmp/fastcgi_temp;
|
|
||||||
proxy_temp_path /tmp/proxy_temp;
|
|
||||||
scgi_temp_path /tmp/scgi_temp;
|
|
||||||
uwsgi_temp_path /tmp/uwsgi_temp;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://127.0.0.1:<PORT_NOVNC_SERVICE>/;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /websockify {
|
|
||||||
proxy_pass http://127.0.0.1:<PORT_NOVNC_SERVICE>/;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "Upgrade";
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /audiowebsock {
|
|
||||||
proxy_pass http://127.0.0.1:<PORT_AUDIO_WEBSOCKET>/;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection "Upgrade";
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: install_heroic.sh
|
|
||||||
# Project: scripts
|
|
||||||
# File Created: Thursday, 1st January 1970 12:00:00 pm
|
|
||||||
# Author: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Wednesday, 31st August 2022 10:01:31 pm
|
|
||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
|
|
||||||
pkg=heroic
|
|
||||||
script_path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd );
|
|
||||||
script_name=$( basename "${BASH_SOURCE[0]}" )
|
|
||||||
|
|
||||||
github_get_all_release() {
|
|
||||||
REPO="${1}";
|
|
||||||
curl --silent "https://api.github.com/repos/${REPO}/releases" \
|
|
||||||
| grep '"tag_name":' \
|
|
||||||
| sed -E 's/.*"([^"]+)".*/\1/';
|
|
||||||
}
|
|
||||||
github_get_release_download_url() {
|
|
||||||
REPO="${1}";
|
|
||||||
TAG="${2}";
|
|
||||||
TYPE="${3}";
|
|
||||||
IGNORE="${4}";
|
|
||||||
curl --silent "https://api.github.com/repos/${REPO}/releases/tags/${TAG}" \
|
|
||||||
| grep '"browser_download_url":' \
|
|
||||||
| sed -E 's/.*"([^"]+)".*/\1/' \
|
|
||||||
| grep -P "${TYPE}" \
|
|
||||||
| grep -P "${TYPE}" \
|
|
||||||
| head -n1;
|
|
||||||
}
|
|
||||||
|
|
||||||
install() {
|
|
||||||
|
|
||||||
# Download Heroic deb package if it does not yet exist
|
|
||||||
__latest_heroic_release=$(github_get_all_release "Heroic-Games-Launcher/HeroicGamesLauncher" | head -n1)
|
|
||||||
if [[ ! -f "/home/${USER}/Downloads/heroic-${__latest_heroic_release}.deb" ]]; then
|
|
||||||
__heroic_download_link=$(github_get_release_download_url "Heroic-Games-Launcher/HeroicGamesLauncher" "${__latest_heroic_release}" ".deb")
|
|
||||||
wget -O /tmp/heroic.deb "${__heroic_download_link}"
|
|
||||||
[[ $? -gt 0 ]] && echo "Error downloading pacakge. Exit!" && return 1
|
|
||||||
mv /tmp/heroic.deb "/home/${USER}/Downloads/heroic-${__latest_heroic_release}.deb"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Install/Update the latest version of Heroic
|
|
||||||
[[ "${APT_UPDATED:-false}" == 'false' ]] && apt-get update && APT_UPDATED=true
|
|
||||||
apt-get install -y "/home/${USER}/Downloads/heroic-${__latest_heroic_release}.deb"
|
|
||||||
|
|
||||||
# Install/Update deps for HeroicBashLauncher
|
|
||||||
[[ "${APT_UPDATED:-false}" == 'false' ]] && apt-get update && APT_UPDATED=true
|
|
||||||
apt-get install -y zenity
|
|
||||||
|
|
||||||
# Install/Update the latest version HeroicBashLauncher
|
|
||||||
__latest_hbl_release=$(github_get_all_release "redromnon/HeroicBashLauncher" | head -n1)
|
|
||||||
if [[ ! -e "/home/${USER}/HeroicBashLauncher/.${__latest_hbl_release}" ]]; then
|
|
||||||
# Download HeroicBashLauncher
|
|
||||||
if [[ ! -f "/home/${USER}/Downloads/HeroicBashLauncher-${__latest_hbl_release}.zip" ]]; then
|
|
||||||
__hbl_download_link=$(github_get_release_download_url "redromnon/HeroicBashLauncher" "${__latest_hbl_release}" "\d\.zip")
|
|
||||||
wget -O /tmp/hbl.zip "${__hbl_download_link}"
|
|
||||||
[[ $? -gt 0 ]] && echo "Error downloading pacakge. Exit!" && return 1
|
|
||||||
mv /tmp/hbl.zip "/home/${USER}/Downloads/HeroicBashLauncher-${__latest_hbl_release}.zip"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Extract HeroicBashLauncher
|
|
||||||
mkdir -p "/home/${USER}/HeroicBashLauncher"
|
|
||||||
rm -rf "/tmp/hbl"
|
|
||||||
su ${USER} -c "mkdir -p /tmp/hbl && cd /tmp/hbl && unzip -o /home/${USER}/Downloads/HeroicBashLauncher-${__latest_hbl_release}.zip"
|
|
||||||
su ${USER} -c "cp -rfv /tmp/hbl/HeroicBashLauncher*/HeroicBashLauncher/* /home/${USER}/HeroicBashLauncher/"
|
|
||||||
chmod +x "/home/${USER}/HeroicBashLauncher/HeroicBashLauncher"
|
|
||||||
|
|
||||||
# Setup script in user PATH
|
|
||||||
su ${USER} -c "mkdir -p /home/default/.local/bin"
|
|
||||||
su ${USER} -c "ln -sf /home/${USER}/HeroicBashLauncher/HeroicBashLauncher /home/${USER}/.local/bin/HeroicBashLauncher"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove installer shortcut
|
|
||||||
rm -f /usr/share/applications/install.heroic.desktop
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#INSTALLER:
|
|
||||||
source "${script_path}/installer.sh"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: install_legendary.sh
|
|
||||||
# Project: scripts
|
|
||||||
# File Created: Thursday, 1st January 1970 12:00:00 pm
|
|
||||||
# Author: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Sunday, 16th January 2022 5:44:25 am
|
|
||||||
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
|
|
||||||
pkg=legendary
|
|
||||||
script_path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd );
|
|
||||||
script_name=$( basename "${BASH_SOURCE[0]}" )
|
|
||||||
|
|
||||||
github_get_all_release() {
|
|
||||||
REPO="${1}";
|
|
||||||
curl --silent "https://api.github.com/repos/${REPO}/releases" \
|
|
||||||
| grep '"tag_name":' \
|
|
||||||
| sed -E 's/.*"([^"]+)".*/\1/';
|
|
||||||
}
|
|
||||||
|
|
||||||
install() {
|
|
||||||
if ! command -v ${pkg} >/dev/null; then
|
|
||||||
# Download/install the latest legendary binary
|
|
||||||
latest_release=$(github_get_all_release derrod/legendary | head -n1)
|
|
||||||
download_url="https://github.com/derrod/legendary/releases/download/${latest_release}/legendary"
|
|
||||||
wget -O "/tmp/legendary-${latest_release}" "${download_url}"
|
|
||||||
chmod +x /tmp/legendary-${latest_release}
|
|
||||||
cp -f /tmp/legendary-${latest_release} /usr/bin/legendary-${latest_release}
|
|
||||||
rm -f /usr/bin/legendary
|
|
||||||
ln -s /usr/bin/legendary-${latest_release} /usr/bin/legendary
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v rare >/dev/null; then
|
|
||||||
# Install rare for a gui
|
|
||||||
python3 -m pip install Rare
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v steam-legendary-wrapper >/dev/null; then
|
|
||||||
# Download/install the steam-legendary-wrapper script
|
|
||||||
wget -O "/tmp/steam-legendary-wrapper.sh" \
|
|
||||||
"https://raw.githubusercontent.com/toalex77/steam-legendary-wrapper/main/steam-legendary-wrapper.sh"
|
|
||||||
chmod +x /tmp/steam-legendary-wrapper.sh
|
|
||||||
rm -f /usr/bin/steam-legendary-wrapper
|
|
||||||
cp -f /tmp/steam-legendary-wrapper.sh /usr/bin/steam-legendary-wrapper
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove installer shortcut
|
|
||||||
rm -f /usr/share/applications/install.legendary.desktop
|
|
||||||
|
|
||||||
# Add launcher shortcut
|
|
||||||
cat << EOF > /usr/share/applications/rare.desktop
|
|
||||||
[Desktop Entry]
|
|
||||||
Name=Rare - (Epic Games Store)
|
|
||||||
Comment=A frontend for legendary, the open source Epic Games Store alternative
|
|
||||||
GenericName=Rare - (Epic Games Store)
|
|
||||||
X-GNOME-FullName=Rare - (Epic Games Store)
|
|
||||||
Exec=/usr/local/bin/rare %u
|
|
||||||
Terminal=false
|
|
||||||
X-MultipleArgs=false
|
|
||||||
Type=Application
|
|
||||||
Icon=rare
|
|
||||||
Categories=Game;
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#INSTALLER:
|
|
||||||
source "${script_path}/installer.sh"
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: install_lutris.sh
|
|
||||||
# Project: scripts
|
|
||||||
# File Created: Thursday, 1st January 1970 12:45:00 pm
|
|
||||||
# Author: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Sunday, 16th January 2022 4:54:11 am
|
|
||||||
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
|
|
||||||
pkg=lutris
|
|
||||||
script_path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd );
|
|
||||||
script_name=$( basename "${BASH_SOURCE[0]}" )
|
|
||||||
|
|
||||||
|
|
||||||
install() {
|
|
||||||
if ! dpkg --get-selections | grep -q "^$pkg[[:space:]]*install$" >/dev/null; then
|
|
||||||
echo "deb http://download.opensuse.org/repositories/home:/strycore/Debian_10/ ./" | tee /etc/apt/sources.list.d/lutris.list
|
|
||||||
wget -q https://download.opensuse.org/repositories/home:/strycore/Debian_10/Release.key -O- | apt-key add -
|
|
||||||
apt-get update
|
|
||||||
apt-get -y install \
|
|
||||||
lutris \
|
|
||||||
python3-dbus
|
|
||||||
|
|
||||||
sed -i '/Exec=lutris %U/c\Exec=/usr/games/lutris %U' /usr/share/applications/net.lutris.Lutris.desktop
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove installer shortcut
|
|
||||||
rm -f /usr/share/applications/install.lutris.desktop
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#INSTALLER:
|
|
||||||
source "${script_path}/installer.sh"
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: install_protonup.sh
|
|
||||||
# Project: scripts
|
|
||||||
# File Created: Thursday, 1st January 1970 12:45:00 pm
|
|
||||||
# Author: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Sunday, 16th January 2022 4:55:12 am
|
|
||||||
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
|
|
||||||
pkg=protonup-ng
|
|
||||||
script_path=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd );
|
|
||||||
script_name=$( basename "${BASH_SOURCE[0]}" )
|
|
||||||
|
|
||||||
|
|
||||||
install() {
|
|
||||||
if ! command -v ${pkg} >/dev/null; then
|
|
||||||
# Install application
|
|
||||||
python3 -m pip install ${pkg}
|
|
||||||
# Set installation path as user
|
|
||||||
# Note: Run command with su because init processes are run as root but this is a user thing...
|
|
||||||
su ${USER} -c "${pkg} -d '/home/${USER}/.steam/root/compatibilitytools.d/'"
|
|
||||||
# Update to the latest version on startup using the users Downloads directory
|
|
||||||
su ${USER} -c "${pkg} -y -o '/home/${USER}/Downloads/'" &
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove installer shortcut
|
|
||||||
rm -f /usr/share/applications/install.protonup.desktop
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#INSTALLER:
|
|
||||||
source "${script_path}/installer.sh"
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
if [[ "${script_path}" == *"opt/script"* ]]; then
|
|
||||||
while true; do
|
|
||||||
echo
|
|
||||||
read -p "Would you like to configure this container to install ${pkg^} on startup? (Y/N) " ans
|
|
||||||
|
|
||||||
case $ans in
|
|
||||||
[Yy]* ) break;;
|
|
||||||
[Nn]* ) exit;;
|
|
||||||
* ) echo "Please answer yes or no.";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# Install this script to the home directory init.d
|
|
||||||
dest_file="/home/${USER}/init.d/${script_name}"
|
|
||||||
cp -f "${script_path}/${script_name}" "${dest_file}"
|
|
||||||
# Remove anything under '#INSTALLER:'
|
|
||||||
sed -i '/^#INSTALLER.*$/Q' "${dest_file}"
|
|
||||||
# Append 'install' command
|
|
||||||
echo 'install' >> "${dest_file}"
|
|
||||||
echo
|
|
||||||
echo
|
|
||||||
echo "Installed init script '${dest_file}'"
|
|
||||||
echo "This script will install ${pkg^} when you next restart the container."
|
|
||||||
echo
|
|
||||||
read -s -p "Press enter to continue"
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
@@ -12,5 +12,3 @@ PS1='[\u@\h \W]\$ '
|
|||||||
PATH=$PATH:$HOME/.local/bin:$HOME/bin
|
PATH=$PATH:$HOME/.local/bin:$HOME/bin
|
||||||
# Export /usr/games
|
# Export /usr/games
|
||||||
PATH=$PATH:/usr/games
|
PATH=$PATH:/usr/games
|
||||||
# Export flatpak data directories
|
|
||||||
XDG_DATA_DIRS="${XDG_DATA_DIRS}:/var/lib/flatpak/exports/share:/home/${USER}/.local/share/flatpak/exports/share"
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[Default Applications]
|
||||||
|
x-scheme-handler/http=xfce4-web-browser.desktop
|
||||||
|
x-scheme-handler/https=xfce4-web-browser.desktop
|
||||||
|
|
||||||
|
[Added Associations]
|
||||||
|
x-scheme-handler/http=xfce4-web-browser.desktop;
|
||||||
|
x-scheme-handler/https=xfce4-web-browser.desktop;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
WebBrowser=custom-WebBrowser
|
||||||
@@ -47,4 +47,25 @@
|
|||||||
</property>
|
</property>
|
||||||
</property>
|
</property>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="desktop-icons" type="empty">
|
||||||
|
<property name="style" type="int" value="0"/>
|
||||||
|
<property name="icon-size" type="uint" value="48"/>
|
||||||
|
<property name="show-tooltips" type="bool" value="true"/>
|
||||||
|
<property name="show-thumbnails" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="last" type="empty">
|
||||||
|
<property name="window-width" type="int" value="653"/>
|
||||||
|
<property name="window-height" type="int" value="558"/>
|
||||||
|
</property>
|
||||||
|
<property name="windowlist-menu" type="empty">
|
||||||
|
<property name="show-icons" type="bool" value="true"/>
|
||||||
|
<property name="show-add-remove-workspaces" type="bool" value="false"/>
|
||||||
|
<property name="show-workspace-names" type="bool" value="false"/>
|
||||||
|
<property name="show" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
|
<property name="desktop-menu" type="empty">
|
||||||
|
<property name="show-delete" type="bool" value="false"/>
|
||||||
|
<property name="show-icons" type="bool" value="true"/>
|
||||||
|
<property name="show" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
</channel>
|
</channel>
|
||||||
@@ -7,15 +7,14 @@
|
|||||||
<property name="dark-mode" type="bool" value="true"/>
|
<property name="dark-mode" type="bool" value="true"/>
|
||||||
<property name="panel-1" type="empty">
|
<property name="panel-1" type="empty">
|
||||||
<property name="position" type="string" value="p=6;x=0;y=0"/>
|
<property name="position" type="string" value="p=6;x=0;y=0"/>
|
||||||
<property name="length" type="uint" value="100"/>
|
<property name="length" type="double" value="100"/>
|
||||||
<property name="position-locked" type="bool" value="true"/>
|
<property name="position-locked" type="bool" value="true"/>
|
||||||
<property name="icon-size" type="uint" value="16"/>
|
<property name="icon-size" type="uint" value="36"/>
|
||||||
<property name="size" type="uint" value="26"/>
|
<property name="size" type="uint" value="40"/>
|
||||||
<property name="plugin-ids" type="array">
|
<property name="plugin-ids" type="array">
|
||||||
<value type="int" value="1"/>
|
<value type="int" value="1"/>
|
||||||
<value type="int" value="2"/>
|
<value type="int" value="2"/>
|
||||||
<value type="int" value="3"/>
|
<value type="int" value="3"/>
|
||||||
<value type="int" value="4"/>
|
|
||||||
<value type="int" value="5"/>
|
<value type="int" value="5"/>
|
||||||
<value type="int" value="6"/>
|
<value type="int" value="6"/>
|
||||||
<value type="int" value="8"/>
|
<value type="int" value="8"/>
|
||||||
@@ -23,13 +22,17 @@
|
|||||||
<value type="int" value="11"/>
|
<value type="int" value="11"/>
|
||||||
<value type="int" value="12"/>
|
<value type="int" value="12"/>
|
||||||
<value type="int" value="13"/>
|
<value type="int" value="13"/>
|
||||||
<value type="int" value="14"/>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="background-style" type="uint" value="0"/>
|
<property name="background-style" type="uint" value="0"/>
|
||||||
|
<property name="mode" type="uint" value="0"/>
|
||||||
|
<property name="autohide-behavior" type="uint" value="0"/>
|
||||||
|
<property name="nrows" type="uint" value="1"/>
|
||||||
</property>
|
</property>
|
||||||
</property>
|
</property>
|
||||||
<property name="plugins" type="empty">
|
<property name="plugins" type="empty">
|
||||||
<property name="plugin-1" type="string" value="applicationsmenu"/>
|
<property name="plugin-1" type="string" value="applicationsmenu">
|
||||||
|
<property name="button-icon" type="string" value="steam-headless"/>
|
||||||
|
</property>
|
||||||
<property name="plugin-2" type="string" value="tasklist">
|
<property name="plugin-2" type="string" value="tasklist">
|
||||||
<property name="grouping" type="uint" value="1"/>
|
<property name="grouping" type="uint" value="1"/>
|
||||||
</property>
|
</property>
|
||||||
@@ -37,7 +40,6 @@
|
|||||||
<property name="expand" type="bool" value="true"/>
|
<property name="expand" type="bool" value="true"/>
|
||||||
<property name="style" type="uint" value="0"/>
|
<property name="style" type="uint" value="0"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="plugin-4" type="string" value="pager"/>
|
|
||||||
<property name="plugin-5" type="string" value="separator">
|
<property name="plugin-5" type="string" value="separator">
|
||||||
<property name="style" type="uint" value="0"/>
|
<property name="style" type="uint" value="0"/>
|
||||||
</property>
|
</property>
|
||||||
@@ -53,10 +55,11 @@
|
|||||||
<property name="plugin-11" type="string" value="separator">
|
<property name="plugin-11" type="string" value="separator">
|
||||||
<property name="style" type="uint" value="0"/>
|
<property name="style" type="uint" value="0"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="plugin-12" type="string" value="clock"/>
|
<property name="plugin-12" type="string" value="clock">
|
||||||
|
<property name="mode" type="uint" value="2"/>
|
||||||
|
</property>
|
||||||
<property name="plugin-13" type="string" value="separator">
|
<property name="plugin-13" type="string" value="separator">
|
||||||
<property name="style" type="uint" value="0"/>
|
<property name="style" type="uint" value="0"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="plugin-14" type="string" value="actions"/>
|
|
||||||
</property>
|
</property>
|
||||||
</channel>
|
</channel>
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<channel name="xfwm4" version="1.0">
|
||||||
|
<property name="general" type="empty">
|
||||||
|
<property name="activate_action" type="string" value="bring"/>
|
||||||
|
<property name="borderless_maximize" type="bool" value="true"/>
|
||||||
|
<property name="box_move" type="bool" value="false"/>
|
||||||
|
<property name="box_resize" type="bool" value="false"/>
|
||||||
|
<property name="button_layout" type="string" value="O|SHMC"/>
|
||||||
|
<property name="button_offset" type="int" value="0"/>
|
||||||
|
<property name="button_spacing" type="int" value="0"/>
|
||||||
|
<property name="click_to_focus" type="bool" value="true"/>
|
||||||
|
<property name="cycle_apps_only" type="bool" value="false"/>
|
||||||
|
<property name="cycle_draw_frame" type="bool" value="true"/>
|
||||||
|
<property name="cycle_raise" type="bool" value="false"/>
|
||||||
|
<property name="cycle_hidden" type="bool" value="true"/>
|
||||||
|
<property name="cycle_minimum" type="bool" value="true"/>
|
||||||
|
<property name="cycle_minimized" type="bool" value="false"/>
|
||||||
|
<property name="cycle_preview" type="bool" value="true"/>
|
||||||
|
<property name="cycle_tabwin_mode" type="int" value="0"/>
|
||||||
|
<property name="cycle_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="double_click_action" type="string" value="maximize"/>
|
||||||
|
<property name="double_click_distance" type="int" value="5"/>
|
||||||
|
<property name="double_click_time" type="int" value="250"/>
|
||||||
|
<property name="easy_click" type="string" value="Alt"/>
|
||||||
|
<property name="focus_delay" type="int" value="250"/>
|
||||||
|
<property name="focus_hint" type="bool" value="true"/>
|
||||||
|
<property name="focus_new" type="bool" value="true"/>
|
||||||
|
<property name="frame_opacity" type="int" value="100"/>
|
||||||
|
<property name="frame_border_top" type="int" value="0"/>
|
||||||
|
<property name="full_width_title" type="bool" value="true"/>
|
||||||
|
<property name="horiz_scroll_opacity" type="bool" value="false"/>
|
||||||
|
<property name="inactive_opacity" type="int" value="100"/>
|
||||||
|
<property name="maximized_offset" type="int" value="0"/>
|
||||||
|
<property name="mousewheel_rollup" type="bool" value="true"/>
|
||||||
|
<property name="move_opacity" type="int" value="100"/>
|
||||||
|
<property name="placement_mode" type="string" value="center"/>
|
||||||
|
<property name="placement_ratio" type="int" value="20"/>
|
||||||
|
<property name="popup_opacity" type="int" value="100"/>
|
||||||
|
<property name="prevent_focus_stealing" type="bool" value="false"/>
|
||||||
|
<property name="raise_delay" type="int" value="250"/>
|
||||||
|
<property name="raise_on_click" type="bool" value="true"/>
|
||||||
|
<property name="raise_on_focus" type="bool" value="false"/>
|
||||||
|
<property name="raise_with_any_button" type="bool" value="true"/>
|
||||||
|
<property name="repeat_urgent_blink" type="bool" value="false"/>
|
||||||
|
<property name="resize_opacity" type="int" value="100"/>
|
||||||
|
<property name="scroll_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="shadow_delta_height" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_width" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_x" type="int" value="0"/>
|
||||||
|
<property name="shadow_delta_y" type="int" value="-3"/>
|
||||||
|
<property name="shadow_opacity" type="int" value="50"/>
|
||||||
|
<property name="show_app_icon" type="bool" value="false"/>
|
||||||
|
<property name="show_dock_shadow" type="bool" value="true"/>
|
||||||
|
<property name="show_frame_shadow" type="bool" value="true"/>
|
||||||
|
<property name="show_popup_shadow" type="bool" value="false"/>
|
||||||
|
<property name="snap_resist" type="bool" value="false"/>
|
||||||
|
<property name="snap_to_border" type="bool" value="true"/>
|
||||||
|
<property name="snap_to_windows" type="bool" value="false"/>
|
||||||
|
<property name="snap_width" type="int" value="10"/>
|
||||||
|
<property name="vblank_mode" type="string" value="auto"/>
|
||||||
|
<property name="theme" type="string" value="Default-xhdpi"/>
|
||||||
|
<property name="tile_on_move" type="bool" value="true"/>
|
||||||
|
<property name="title_alignment" type="string" value="center"/>
|
||||||
|
<property name="title_font" type="string" value="Sans Bold 9"/>
|
||||||
|
<property name="title_horizontal_offset" type="int" value="0"/>
|
||||||
|
<property name="titleless_maximize" type="bool" value="false"/>
|
||||||
|
<property name="title_shadow_active" type="string" value="false"/>
|
||||||
|
<property name="title_shadow_inactive" type="string" value="false"/>
|
||||||
|
<property name="title_vertical_offset_active" type="int" value="0"/>
|
||||||
|
<property name="title_vertical_offset_inactive" type="int" value="0"/>
|
||||||
|
<property name="toggle_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="unredirect_overlays" type="bool" value="true"/>
|
||||||
|
<property name="urgent_blink" type="bool" value="false"/>
|
||||||
|
<property name="use_compositing" type="bool" value="true"/>
|
||||||
|
<property name="workspace_count" type="int" value="1"/>
|
||||||
|
<property name="wrap_cycle" type="bool" value="false"/>
|
||||||
|
<property name="wrap_layout" type="bool" value="false"/>
|
||||||
|
<property name="wrap_resistance" type="int" value="10"/>
|
||||||
|
<property name="wrap_windows" type="bool" value="false"/>
|
||||||
|
<property name="wrap_workspaces" type="bool" value="false"/>
|
||||||
|
<property name="zoom_desktop" type="bool" value="true"/>
|
||||||
|
<property name="zoom_pointer" type="bool" value="true"/>
|
||||||
|
<property name="workspace_names" type="array">
|
||||||
|
<value type="string" value="Workspace 1"/>
|
||||||
|
<value type="string" value="Workspace 2"/>
|
||||||
|
<value type="string" value="Workspace 3"/>
|
||||||
|
<value type="string" value="Workspace 4"/>
|
||||||
|
</property>
|
||||||
|
<property name="margin_top" type="int" value="0"/>
|
||||||
|
</property>
|
||||||
|
</channel>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<property name="EnableInputFeedbackSounds" type="empty"/>
|
<property name="EnableInputFeedbackSounds" type="empty"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="Xft" type="empty">
|
<property name="Xft" type="empty">
|
||||||
<property name="DPI" type="empty"/>
|
<property name="DPI" type="int" value="110"/>
|
||||||
<property name="Antialias" type="empty"/>
|
<property name="Antialias" type="empty"/>
|
||||||
<property name="Hinting" type="empty"/>
|
<property name="Hinting" type="empty"/>
|
||||||
<property name="HintStyle" type="empty"/>
|
<property name="HintStyle" type="empty"/>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<property name="MenuImages" type="empty"/>
|
<property name="MenuImages" type="empty"/>
|
||||||
<property name="ButtonImages" type="empty"/>
|
<property name="ButtonImages" type="empty"/>
|
||||||
<property name="MenuBarAccel" type="empty"/>
|
<property name="MenuBarAccel" type="empty"/>
|
||||||
<property name="CursorThemeName" type="empty"/>
|
<property name="CursorThemeName" type="string" value="default"/>
|
||||||
<property name="CursorThemeSize" type="empty"/>
|
<property name="CursorThemeSize" type="empty"/>
|
||||||
<property name="DecorationLayout" type="empty"/>
|
<property name="DecorationLayout" type="empty"/>
|
||||||
<property name="DialogsUseHeader" type="empty"/>
|
<property name="DialogsUseHeader" type="empty"/>
|
||||||
@@ -41,4 +41,8 @@
|
|||||||
<property name="Gdk" type="empty">
|
<property name="Gdk" type="empty">
|
||||||
<property name="WindowScalingFactor" type="empty"/>
|
<property name="WindowScalingFactor" type="empty"/>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="Xfce" type="empty">
|
||||||
|
<property name="LastCustomDPI" type="int" value="110"/>
|
||||||
|
<property name="SyncThemes" type="bool" value="true"/>
|
||||||
|
</property>
|
||||||
</channel>
|
</channel>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
"libraryfolders"
|
||||||
|
[Desktop Entry]
|
||||||
|
NoDisplay=true
|
||||||
|
Version=1.0
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=X-XFCE-Helper
|
||||||
|
X-XFCE-Category=WebBrowser
|
||||||
|
X-XFCE-CommandsWithParameter=/home/default/.local/share/flatpak/exports/bin/org.mozilla.firefox "%s"
|
||||||
|
Icon=org.mozilla.firefox
|
||||||
|
Name=org.mozilla.firefox
|
||||||
|
X-XFCE-Commands=/home/default/.local/share/flatpak/exports/bin/org.mozilla.firefox
|
||||||
@@ -4,11 +4,30 @@
|
|||||||
},
|
},
|
||||||
"apps": [
|
"apps": [
|
||||||
{
|
{
|
||||||
"name": "Steam BigPicture",
|
"name": "Desktop",
|
||||||
"output": "steam.txt",
|
"image-path": "desktop.png",
|
||||||
"cmd": "",
|
"exclude-global-prep-cmd": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steam Big Picture",
|
||||||
|
"image-path": "steam.png",
|
||||||
|
"exclude-global-prep-cmd": "true",
|
||||||
"detached": [
|
"detached": [
|
||||||
"\/usr\/games\/steam steam:\/\/open\/bigpicture"
|
"\/usr\/bin\/sunshine-run \/usr\/games\/steam steam:\/\/open\/bigpicture"
|
||||||
|
],
|
||||||
|
"prep-cmd": [
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "sh -c \"sleep 7 && pkill -f -2 \/usr\/bin\/sunshine\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "\/usr\/bin\/sunshine-stop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"do": "",
|
||||||
|
"undo": "\/usr\/bin\/xfce4-close-all-windows"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -28,6 +28,10 @@
|
|||||||
#
|
#
|
||||||
min_log_level = info
|
min_log_level = info
|
||||||
|
|
||||||
|
# A list of commands to be run before/after all applications.
|
||||||
|
# If any of the prep-commands fail, starting the application is aborted.
|
||||||
|
global_prep_cmd = [{"do":"/usr/bin/xfce4-minimise-all-windows","undo":"/usr/bin/sunshine-stop"}]
|
||||||
|
|
||||||
# The origin of the remote endpoint address that is not denied for HTTP method /pin
|
# The origin of the remote endpoint address that is not denied for HTTP method /pin
|
||||||
# Could be any of the following values:
|
# Could be any of the following values:
|
||||||
# pc|lan|wan
|
# pc|lan|wan
|
||||||
@@ -95,7 +99,7 @@ min_log_level = info
|
|||||||
# ping_timeout = 10000
|
# ping_timeout = 10000
|
||||||
|
|
||||||
# The file where configuration for the different applications that Sunshine can run during a stream
|
# The file where configuration for the different applications that Sunshine can run during a stream
|
||||||
file_apps = /home/default/sunshine/apps.json
|
file_apps = apps.json
|
||||||
|
|
||||||
# Percentage of error correcting packets per data packet in each video frame
|
# Percentage of error correcting packets per data packet in each video frame
|
||||||
# Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage
|
# Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage
|
||||||
@@ -111,7 +115,7 @@ file_apps = /home/default/sunshine/apps.json
|
|||||||
#
|
#
|
||||||
# Unlike simply broadcasting to multiple Client, this will generate distinct video streams.
|
# Unlike simply broadcasting to multiple Client, this will generate distinct video streams.
|
||||||
# Note, CPU usage increases for each distinct video stream generated
|
# Note, CPU usage increases for each distinct video stream generated
|
||||||
# channels = 1
|
channels = 2
|
||||||
|
|
||||||
# The back/select button on the controller
|
# The back/select button on the controller
|
||||||
# On the Shield, the home and powerbutton are not passed to Moonlight
|
# On the Shield, the home and powerbutton are not passed to Moonlight
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
Section "Device"
|
Section "Device"
|
||||||
Identifier "Configured Video Device"
|
Identifier "Configured Video Device"
|
||||||
Driver "dummy"
|
Driver "dummy"
|
||||||
|
VideoRam 256000
|
||||||
EndSection
|
EndSection
|
||||||
|
|
||||||
Section "Monitor"
|
Section "Monitor"
|
||||||
Identifier "Configured Monitor"
|
Identifier "Configured Monitor"
|
||||||
HorizSync 31.5-48.5
|
HorizSync 5.0 - 1000.0
|
||||||
VertRefresh 50-70
|
VertRefresh 5.0 - 200.0
|
||||||
|
ModeLine "1920x1080" 148.50 1920 2448 2492 2640 1080 1084 1089 1125 +Hsync +Vsync
|
||||||
EndSection
|
EndSection
|
||||||
|
|
||||||
Section "Screen"
|
Section "Screen"
|
||||||
@@ -16,6 +18,6 @@ Section "Screen"
|
|||||||
DefaultDepth 24
|
DefaultDepth 24
|
||||||
SubSection "Display"
|
SubSection "Display"
|
||||||
Depth 24
|
Depth 24
|
||||||
Modes "1600x900"
|
Modes "1920x1080" "1280x800" "1024x768" "1920x1080" "1600x900" "1440x900"
|
||||||
EndSubSection
|
EndSubSection
|
||||||
EndSection
|
EndSection
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ wait_for_x() {
|
|||||||
wait_for_udev() {
|
wait_for_udev() {
|
||||||
MAX=10
|
MAX=10
|
||||||
CT=0
|
CT=0
|
||||||
while [ ! -f /tmp/.udev-started ]; do
|
while [ ! -e /run/udev/control ]; do
|
||||||
sleep 1
|
sleep 1
|
||||||
CT=$(( CT + 1 ))
|
CT=$(( CT + 1 ))
|
||||||
if [ "$CT" -ge "$MAX" ]; then
|
if [ "$CT" -ge "$MAX" ]; then
|
||||||
@@ -53,6 +53,20 @@ wait_for_docker() {
|
|||||||
echo "DOCKERD RUNNING!"
|
echo "DOCKERD RUNNING!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Wait for desktop to start
|
||||||
|
wait_for_desktop() {
|
||||||
|
MAX=30
|
||||||
|
CT=0
|
||||||
|
while [ ! -f /tmp/.started-desktop ]; do
|
||||||
|
sleep 1
|
||||||
|
CT=$(( CT + 1 ))
|
||||||
|
if [ "$CT" -ge "$MAX" ]; then
|
||||||
|
echo "FATAL: $0: Gave up waiting for Desktop to start"
|
||||||
|
exit 11
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
# Fech NVIDIA GPU device (if one exists)
|
# Fech NVIDIA GPU device (if one exists)
|
||||||
get_nvidia_gpu_id() {
|
get_nvidia_gpu_id() {
|
||||||
if [ "${NVIDIA_VISIBLE_DEVICES:-}" == "all" ]; then
|
if [ "${NVIDIA_VISIBLE_DEVICES:-}" == "all" ]; then
|
||||||
@@ -67,3 +81,24 @@ get_nvidia_gpu_id() {
|
|||||||
fi
|
fi
|
||||||
echo ${gpu_select}
|
echo ${gpu_select}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export_desktop_dbus_session() {
|
||||||
|
if [ ! -f /tmp/.dbus-desktop-session.env ]; then
|
||||||
|
echo "$(dbus-launch)" > /tmp/.dbus-desktop-session.env
|
||||||
|
fi
|
||||||
|
export $(cat /tmp/.dbus-desktop-session.env)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Wait for desktop dbus session to start
|
||||||
|
wait_for_desktop_dbus_session() {
|
||||||
|
MAX=10
|
||||||
|
CT=0
|
||||||
|
while [ ! -f /tmp/.dbus-desktop-session.env ]; do
|
||||||
|
sleep 1
|
||||||
|
CT=$(( CT + 1 ))
|
||||||
|
if [ "$CT" -ge "$MAX" ]; then
|
||||||
|
echo "FATAL: $0: Gave up waiting for Desktop dbus-launch session to be created"
|
||||||
|
exit 11
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|||||||
31
overlay/usr/bin/install_firefox.sh
Executable file
31
overlay/usr/bin/install_firefox.sh
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "**** Installing/upgrading Firefox via flatpak ****"
|
||||||
|
|
||||||
|
# Install Firefox
|
||||||
|
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak --user install --assumeyes --or-update flathub org.mozilla.firefox
|
||||||
|
|
||||||
|
# Configure Firefox as the default browser
|
||||||
|
echo "Configure Firefox..."
|
||||||
|
custom_webbrowser="$(cat <<EOF
|
||||||
|
"libraryfolders"
|
||||||
|
[Desktop Entry]
|
||||||
|
NoDisplay=true
|
||||||
|
Version=1.0
|
||||||
|
Encoding=UTF-8
|
||||||
|
Type=X-XFCE-Helper
|
||||||
|
X-XFCE-Category=WebBrowser
|
||||||
|
X-XFCE-CommandsWithParameter=${USER_HOME:?}/.local/share/flatpak/exports/bin/org.mozilla.firefox "%s"
|
||||||
|
Icon=org.mozilla.firefox
|
||||||
|
Name=org.mozilla.firefox
|
||||||
|
X-XFCE-Commands=${USER_HOME:?}/.local/share/flatpak/exports/bin/org.mozilla.firefox
|
||||||
|
EOF
|
||||||
|
)"
|
||||||
|
if [[ ! -f "${USER_HOME:?}/.local/share/xfce4/helpers/custom-WebBrowser.desktop" ]]; then
|
||||||
|
mkdir -p "${USER_HOME:?}/.local/share/xfce4/helpers"
|
||||||
|
echo "${custom_webbrowser}" > "${USER_HOME:?}/.local/share/xfce4/helpers/custom-WebBrowser.desktop"
|
||||||
|
gio mime x-scheme-handler/http org.mozilla.firefox.desktop
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
14
overlay/usr/bin/install_flatseal.sh
Executable file
14
overlay/usr/bin/install_flatseal.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "**** Installing/upgrading Flatseal via flatpak ****"
|
||||||
|
|
||||||
|
# Install Flatseal
|
||||||
|
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak --user install --assumeyes --or-update com.github.tchx84.Flatseal
|
||||||
|
|
||||||
|
# Configure Flatseal
|
||||||
|
echo "Configure Flatseal..."
|
||||||
|
sed -i 's/^Categories=.*$/Categories=Utility;/' \
|
||||||
|
${USER_HOME}/.local/share/flatpak/exports/share/applications/com.github.tchx84.Flatseal.desktop
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
14
overlay/usr/bin/install_protonup.sh
Executable file
14
overlay/usr/bin/install_protonup.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo "**** Installing/upgrading ProtonUp-Qt via flatpak ****"
|
||||||
|
|
||||||
|
# Install ProtonUp-Qt
|
||||||
|
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||||
|
flatpak --user install --assumeyes --or-update net.davidotek.pupgui2
|
||||||
|
|
||||||
|
# Configure ProtonUp-Qt
|
||||||
|
echo "Configure ProtonUp-Qt..."
|
||||||
|
sed -i 's/^Categories=.*$/Categories=Utility;/' \
|
||||||
|
${USER_HOME}/.local/share/flatpak/exports/share/applications/net.davidotek.pupgui2.desktop
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
# File Created: Thursday, 1st January 1970 12:00:00 pm
|
# File Created: Thursday, 1st January 1970 12:00:00 pm
|
||||||
# Author: Console and webGui login account (jsunnex@gmail.com)
|
# Author: Console and webGui login account (jsunnex@gmail.com)
|
||||||
# -----
|
# -----
|
||||||
# Last Modified: Wednesday, 26th January 2022 5:38:23 pm
|
# Last Modified: Saturday, 8th July 2023 6:16:47 pm
|
||||||
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
# Modified By: Console and webGui login account (jsunnex@gmail.com)
|
||||||
###
|
###
|
||||||
set -e
|
set -e
|
||||||
@@ -19,28 +19,35 @@ trap _term SIGTERM SIGINT
|
|||||||
|
|
||||||
|
|
||||||
# CONFIGURE:
|
# CONFIGURE:
|
||||||
XDG_DATA_DIRS="${XDG_DATA_DIRS}:/var/lib/flatpak/exports/share:/home/${USER}/.local/share/flatpak/exports/share"
|
# Remove lockfile
|
||||||
export $(dbus-launch)
|
rm -f /tmp/.started-desktop
|
||||||
|
# Start a session bus instance of dbus-daemon
|
||||||
|
# Note: This script should be the only one that waits for X after exporting this dbus session
|
||||||
|
rm -fv /tmp/.dbus-desktop-session.env
|
||||||
|
export_desktop_dbus_session
|
||||||
|
# Configure some XDG environment variables
|
||||||
|
export XDG_CACHE_HOME="${USER_HOME:?}/.cache"
|
||||||
|
export XDG_CONFIG_HOME="${USER_HOME:?}/.config"
|
||||||
|
export XDG_DATA_HOME="${USER_HOME:?}/.local/share"
|
||||||
|
|
||||||
# EXECUTE PROCESS:
|
# EXECUTE PROCESS:
|
||||||
# Wait for the X server to start
|
# Wait for the X server to start
|
||||||
wait_for_x
|
wait_for_x
|
||||||
# Run the desktop environment in order of priority
|
# Install/Upgrade user apps
|
||||||
if [[ -e /usr/bin/cinnamon-session ]]; then
|
if [[ ! -f /tmp/.desktop-apps-updated ]]; then
|
||||||
/usr/bin/cinnamon-session --display=${DISPLAY} &
|
xterm -geometry 200x50+0+0 -ls -e /bin/bash -c "
|
||||||
desktop_pid=$!
|
source /usr/bin/install_firefox.sh;
|
||||||
elif [[ -e /usr/bin/mate-session ]]; then
|
source /usr/bin/install_protonup.sh;
|
||||||
/usr/bin/mate-session &
|
sleep 1;
|
||||||
desktop_pid=$!
|
"
|
||||||
elif [[ -e /usr/bin/startplasma-x11 ]]; then
|
touch /tmp/.desktop-apps-updated
|
||||||
/usr/bin/startplasma-x11 &
|
|
||||||
desktop_pid=$!
|
|
||||||
elif [[ -e /usr/bin/startxfce4 ]]; then
|
|
||||||
/usr/bin/startxfce4 &
|
|
||||||
desktop_pid=$!
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Run the desktop environment
|
||||||
|
echo "**** Starting Xfce4 ****"
|
||||||
|
/usr/bin/startxfce4 &
|
||||||
|
desktop_pid=$!
|
||||||
|
touch /tmp/.started-desktop
|
||||||
|
|
||||||
# WAIT FOR CHILD PROCESS:
|
# WAIT FOR CHILD PROCESS:
|
||||||
wait "$desktop_pid"
|
wait "$desktop_pid"
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: start-dind.sh
|
|
||||||
# Project: bin
|
|
||||||
# File Created: Saturday, 8th October 2022 1:49:45 pm
|
|
||||||
# Author: Josh.5 (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Saturday, 8th October 2022 1:49:45 pm
|
|
||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
set -e
|
|
||||||
|
|
||||||
|
|
||||||
# CATCH TERM SIGNAL:
|
|
||||||
_term() {
|
|
||||||
kill -TERM "$docker_pid" 2>/dev/null
|
|
||||||
}
|
|
||||||
trap _term SIGTERM SIGINT
|
|
||||||
|
|
||||||
|
|
||||||
# CONFIGURE:
|
|
||||||
# Refrences:
|
|
||||||
# - https://raw.githubusercontent.com/docker/docker/42b1175eda071c0e9121e1d64345928384a93df1/hack/dind
|
|
||||||
#
|
|
||||||
# apparmor sucks and Docker needs to know that it's in a container (c) @tianon
|
|
||||||
export container=docker
|
|
||||||
if [ -d /sys/kernel/security ] && ! mountpoint -q /sys/kernel/security; then
|
|
||||||
mount -t securityfs none /sys/kernel/security || {
|
|
||||||
echo >&2 'Could not mount /sys/kernel/security.'
|
|
||||||
echo >&2 'AppArmor detection and --privileged mode might break.'
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
# cgroup v2: enable nesting
|
|
||||||
if [ -f /sys/fs/cgroup/cgroup.controllers ]; then
|
|
||||||
# move the processes from the root group to the /init group,
|
|
||||||
# otherwise writing subtree_control fails with EBUSY.
|
|
||||||
# An error during moving non-existent process (i.e., "cat") is ignored.
|
|
||||||
mkdir -p /sys/fs/cgroup/init
|
|
||||||
xargs -rn1 < /sys/fs/cgroup/cgroup.procs > /sys/fs/cgroup/init/cgroup.procs || :
|
|
||||||
# enable controllers
|
|
||||||
sed -e 's/ / +/g' -e 's/^/+/' < /sys/fs/cgroup/cgroup.controllers \
|
|
||||||
> /sys/fs/cgroup/cgroup.subtree_control
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# EXECUTE PROCESS:
|
|
||||||
/usr/local/bin/dockerd &
|
|
||||||
docker_pid=$!
|
|
||||||
|
|
||||||
|
|
||||||
# WAIT FOR CHILD PROCESS:
|
|
||||||
wait "$docker_pid"
|
|
||||||
26
overlay/usr/bin/start-dumb-udev.sh
Executable file
26
overlay/usr/bin/start-dumb-udev.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: start-dumb-udev.sh
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 12th January 2022 8:46:47 am
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Friday, 14th January 2022 9:21:00 am
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# CATCH TERM SIGNAL:
|
||||||
|
_term() {
|
||||||
|
kill -TERM "$dumb_udev_pid" 2>/dev/null
|
||||||
|
}
|
||||||
|
trap _term SIGTERM SIGINT
|
||||||
|
|
||||||
|
|
||||||
|
# EXECUTE PROCESS:
|
||||||
|
# Start dumb-udev
|
||||||
|
dumb-udev &
|
||||||
|
dumb_udev_pid=$!
|
||||||
|
|
||||||
|
# WAIT FOR CHILD PROCESS:
|
||||||
|
wait "$dumb_udev_pid"
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
###
|
|
||||||
# File: start-plugins.sh
|
|
||||||
# Project: bin
|
|
||||||
# File Created: Sunday, 5th February 2023 10:07:02 pm
|
|
||||||
# Author: Josh.5 (jsunnex@gmail.com)
|
|
||||||
# -----
|
|
||||||
# Last Modified: Sunday, 5th February 2023 11:55:11 pm
|
|
||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
|
||||||
###
|
|
||||||
set -e
|
|
||||||
source /usr/bin/common-functions.sh
|
|
||||||
|
|
||||||
|
|
||||||
# CATCH TERM SIGNAL:
|
|
||||||
_term() {
|
|
||||||
kill -TERM "$plugins_pid" 2>/dev/null
|
|
||||||
}
|
|
||||||
trap _term SIGTERM SIGINT
|
|
||||||
|
|
||||||
|
|
||||||
echo "USER: $USER"
|
|
||||||
echo "HOME: $HOME"
|
|
||||||
echo "ENABLED_PLUGINS: $ENABLED_PLUGINS"
|
|
||||||
|
|
||||||
# CONFIGURE:
|
|
||||||
# Set the plugins project directory
|
|
||||||
plugins_dir="/home/${USER}/.local/share/steam-headless-plugins2"
|
|
||||||
# Clone plugins project
|
|
||||||
mkdir -p "/home/${USER}/.local/share"
|
|
||||||
if [[ ! -d "${plugins_dir}" ]]; then
|
|
||||||
git clone --depth=1 \
|
|
||||||
https://github.com/Steam-Headless/plugins.git \
|
|
||||||
"${plugins_dir}"
|
|
||||||
fi
|
|
||||||
# Pull latest project
|
|
||||||
pushd "${plugins_dir}" &> /dev/null || exit 1
|
|
||||||
git clean -fdx
|
|
||||||
git checkout . 2> /dev/null
|
|
||||||
git checkout master 2> /dev/null
|
|
||||||
git pull origin master 2> /dev/null
|
|
||||||
popd &> /dev/null || exit 1
|
|
||||||
|
|
||||||
|
|
||||||
# EXECUTE PROCESS:
|
|
||||||
# Wait for the X server to start
|
|
||||||
wait_for_docker
|
|
||||||
pushd "${plugins_dir}" &> /dev/null || exit 1
|
|
||||||
## # Pull latest Docker images
|
|
||||||
## ${plugins_dir}/plugins-run pull
|
|
||||||
## # Run docker images (not in background)
|
|
||||||
## ${plugins_dir}/plugins-run up &
|
|
||||||
sleep 300
|
|
||||||
plugins_pid=$!
|
|
||||||
popd &> /dev/null || exit 1
|
|
||||||
|
|
||||||
|
|
||||||
# WAIT FOR CHILD PROCESS:
|
|
||||||
wait "$plugins_pid"
|
|
||||||
@@ -19,7 +19,6 @@ trap _term SIGTERM SIGINT
|
|||||||
|
|
||||||
# EXECUTE PROCESS:
|
# EXECUTE PROCESS:
|
||||||
echo "PULSEAUDIO: Starting pulseaudio service"
|
echo "PULSEAUDIO: Starting pulseaudio service"
|
||||||
sleep 5
|
|
||||||
#/usr/bin/pulseaudio --disallow-module-loading --disallow-exit --exit-idle-time=-1 &
|
#/usr/bin/pulseaudio --disallow-module-loading --disallow-exit --exit-idle-time=-1 &
|
||||||
/usr/bin/pulseaudio --exit-idle-time=-1 &
|
/usr/bin/pulseaudio --exit-idle-time=-1 &
|
||||||
pulseaudio_pid=$!
|
pulseaudio_pid=$!
|
||||||
|
|||||||
@@ -13,42 +13,61 @@ source /usr/bin/common-functions.sh
|
|||||||
|
|
||||||
# CATCH TERM SIGNAL:
|
# CATCH TERM SIGNAL:
|
||||||
_term() {
|
_term() {
|
||||||
kill -TERM "$sunshine_pid" 2>/dev/null
|
kill -INT "$sunshine_pid" 2>/dev/null
|
||||||
|
sleep 0.5
|
||||||
|
counter=0
|
||||||
|
while kill -0 "$sunshine_pid"; do
|
||||||
|
kill -TERM "$sunshine_pid" 2>/dev/null
|
||||||
|
counter=$((counter + 1))
|
||||||
|
[ "$counter" -gt 8 ] && break
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
counter=0
|
||||||
|
while kill -0 "$sunshine_pid"; do
|
||||||
|
kill -KILL "$sunshine_pid" 2>/dev/null
|
||||||
|
counter=$((counter + 1))
|
||||||
|
[ "$counter" -gt 4 ] && break
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
}
|
}
|
||||||
trap _term SIGTERM SIGINT
|
trap _term SIGTERM SIGINT
|
||||||
|
|
||||||
|
|
||||||
# CONFIGURE:
|
# CONFIGURE:
|
||||||
# Install default configurations
|
# Install default configurations
|
||||||
mkdir -p /home/${USER}/sunshine
|
mkdir -p "${USER_HOME:?}/.config/sunshine"
|
||||||
if [[ ! -f /home/${USER}/sunshine/sunshine.conf ]]; then
|
if [ ! -f "${USER_HOME:?}/.config/sunshine/sunshine.conf" ]; then
|
||||||
cp -vf /templates/sunshine/* /home/${USER}/sunshine/
|
cp -vf /templates/sunshine/sunshine.conf "${USER_HOME:?}/.config/sunshine/sunshine.conf"
|
||||||
# TODO: Set the default encoder '# encoder = nvenc'
|
fi
|
||||||
# nvidia_gpu_id=$(get_nvidia_gpu_id)
|
if [ ! -f "${USER_HOME:?}/.config/sunshine/apps.json" ]; then
|
||||||
# if [[ "X${nvidia_gpu_id:-}" != "X" ]]; then
|
cp -vf /templates/sunshine/apps.json "${USER_HOME:?}/.config/sunshine/apps.json"
|
||||||
# if [[ "all video" == *"${NVIDIA_DRIVER_CAPABILITIES}"* ]]; then
|
fi
|
||||||
# # Check if we have a nvidia GPU available
|
if [ ! -f "${USER_HOME:?}/.config/sunshine/sunshine_state.json" ]; then
|
||||||
# sed -i 's|^# encoder.*=.*$|encoder = nvenc|' /home/${USER}/sunshine/sunshine.conf
|
echo "{}" > "${USER_HOME:?}/.config/sunshine/sunshine_state.json"
|
||||||
# fi
|
|
||||||
# else
|
|
||||||
# # TODO: Enable the vaapi device if not using nvenc
|
|
||||||
# # vainfo --display drm --device /dev/dri/renderD128 2> /dev/null | grep -E "((VAProfileH264High|VAProfileHEVCMain|VAProfileHEVCMain10).*VAEntrypointEncSlice)"
|
|
||||||
# # Loop over any render devices
|
|
||||||
# echo
|
|
||||||
# fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Reset the default username/password
|
# Reset the default username/password
|
||||||
if ([ "X${SUNSHINE_USER:-}" != "X" ] && [ "X${SUNSHINE_PASS:-}" != "X" ]); then
|
if ([ "X${SUNSHINE_USER:-}" != "X" ] && [ "X${SUNSHINE_PASS:-}" != "X" ]); then
|
||||||
sunshine /home/${USER}/sunshine/sunshine.conf --creds ${SUNSHINE_USER:-} ${SUNSHINE_PASS:-}
|
/usr/bin/sunshine "${USER_HOME:?}/.config/sunshine/sunshine.conf" --creds "${SUNSHINE_USER:?}" "${SUNSHINE_PASS:?}"
|
||||||
|
fi
|
||||||
|
# Remove any auto-start scripts from user's .local dir
|
||||||
|
if [ -f "${USER_HOME:?}/.config/autostart/Sunshine.desktop" ]; then
|
||||||
|
rm -fv "${USER_HOME:?}/.config/autostart/Sunshine.desktop"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# EXECUTE PROCESS:
|
# EXECUTE PROCESS:
|
||||||
# Wait for the X server to start
|
# Wait for the X server to start
|
||||||
wait_for_x
|
wait_for_x
|
||||||
|
|
||||||
|
# Start a session bus instance of dbus-daemon
|
||||||
|
wait_for_desktop_dbus_session
|
||||||
|
export_desktop_dbus_session
|
||||||
|
|
||||||
|
# Wait for the desktop to start
|
||||||
|
wait_for_desktop
|
||||||
|
|
||||||
# Start the sunshine server
|
# Start the sunshine server
|
||||||
sunshine /home/${USER}/sunshine/sunshine.conf &
|
/usr/bin/dumb-init /usr/bin/sunshine "${USER_HOME:?}/.config/sunshine/sunshine.conf" &
|
||||||
sunshine_pid=$!
|
sunshine_pid=$!
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,7 @@ _term() {
|
|||||||
}
|
}
|
||||||
trap _term SIGTERM SIGINT
|
trap _term SIGTERM SIGINT
|
||||||
|
|
||||||
|
|
||||||
# EXECUTE PROCESS:
|
# EXECUTE PROCESS:
|
||||||
# Remove lockfile
|
|
||||||
rm -f /tmp/.udev-started
|
|
||||||
# Start udev
|
# Start udev
|
||||||
if command -v udevd &>/dev/null; then
|
if command -v udevd &>/dev/null; then
|
||||||
unshare --net udevd --daemon &>/dev/null
|
unshare --net udevd --daemon &>/dev/null
|
||||||
@@ -29,11 +26,8 @@ fi
|
|||||||
# Monitor kernel uevents
|
# Monitor kernel uevents
|
||||||
udevadm monitor &
|
udevadm monitor &
|
||||||
monitor_pid=$!
|
monitor_pid=$!
|
||||||
# Touch lockfile
|
# Wait for 5 seconds, then request device events from the kernel
|
||||||
sleep 1
|
sleep 5
|
||||||
touch /tmp/.udev-started
|
|
||||||
# Wait for 10 seconds, then request device events from the kernel
|
|
||||||
sleep 10
|
|
||||||
udevadm trigger
|
udevadm trigger
|
||||||
|
|
||||||
# WAIT FOR CHILD PROCESS:
|
# WAIT FOR CHILD PROCESS:
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
# Modified By: Josh.5 (jsunnex@gmail.com)
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
###
|
###
|
||||||
set -e
|
set -e
|
||||||
|
source /usr/bin/common-functions.sh
|
||||||
|
|
||||||
# CATCH TERM SIGNAL:
|
# CATCH TERM SIGNAL:
|
||||||
_term() {
|
_term() {
|
||||||
@@ -19,18 +20,31 @@ trap _term SIGTERM SIGINT
|
|||||||
|
|
||||||
# EXECUTE PROCESS:
|
# EXECUTE PROCESS:
|
||||||
# Wait for udev
|
# Wait for udev
|
||||||
MAX=10
|
if [ $(grep autostart /etc/supervisor.d/udev.ini 2> /dev/null) == "autostart=true" ]; then
|
||||||
CT=0
|
wait_for_udev
|
||||||
while [ ! -f /tmp/.udev-started ]; do
|
fi
|
||||||
sleep 1
|
|
||||||
CT=$(( CT + 1 ))
|
|
||||||
if [ "$CT" -ge "$MAX" ]; then
|
|
||||||
LOG "FATAL: $0: Gave up waiting for udev server to start"
|
|
||||||
exit 11
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
# Run X server
|
# Run X server
|
||||||
/usr/bin/Xorg -ac -noreset -novtswitch -sharevts -dpi "${DISPLAY_DPI}" +extension "GLX" +extension "RANDR" +extension "RENDER" vt7 "${DISPLAY}" &
|
/usr/bin/Xorg \
|
||||||
|
-ac \
|
||||||
|
-noreset \
|
||||||
|
-novtswitch \
|
||||||
|
-sharevts \
|
||||||
|
+extension RANDR \
|
||||||
|
+extension RENDER \
|
||||||
|
+extension GLX \
|
||||||
|
+extension XVideo \
|
||||||
|
+extension DOUBLE-BUFFER \
|
||||||
|
+extension SECURITY \
|
||||||
|
+extension DAMAGE \
|
||||||
|
+extension X-Resource \
|
||||||
|
-extension XINERAMA -xinerama \
|
||||||
|
+extension Composite +extension COMPOSITE \
|
||||||
|
-dpms \
|
||||||
|
-s off \
|
||||||
|
-nolisten tcp \
|
||||||
|
-iglx \
|
||||||
|
-verbose \
|
||||||
|
vt7 "${DISPLAY:?}" &
|
||||||
xorg_pid=$!
|
xorg_pid=$!
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
84
overlay/usr/bin/steam-headless-wol-power-manager
Executable file
84
overlay/usr/bin/steam-headless-wol-power-manager
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: steam-headless-wol-power-manager
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 5th September 2023 5:35:38 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 5th September 2023 5:35:38 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Function to execute restart to WoL monitor
|
||||||
|
restart_to_wol_monitor() {
|
||||||
|
# Create WoL monitor lock file. This will be read during the next restart and will trigger a singluar WoL monitor service.
|
||||||
|
touch /tmp/.wol-monitor
|
||||||
|
|
||||||
|
# Stop all processes inside the container by sending a SIGINT to the main supervisord process (PID 1)
|
||||||
|
kill -2 1
|
||||||
|
|
||||||
|
# Exit script
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to execute restart to Desktop
|
||||||
|
restart_to_desktop_mode() {
|
||||||
|
# Remove WoL monitor lock file.
|
||||||
|
rm -f /tmp/.wol-monitor
|
||||||
|
|
||||||
|
# Stop all processes inside the container by sending a SIGINT to the main supervisord process (PID 1)
|
||||||
|
kill -2 1
|
||||||
|
|
||||||
|
# Exit script
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to monitor for no user input
|
||||||
|
start_idle_monitor() {
|
||||||
|
# Set the idle timeout in milliseconds (60 minutes = 3600000 milliseconds)
|
||||||
|
local idle_timeout=3600000
|
||||||
|
|
||||||
|
# Monitor input. After an hour of no input
|
||||||
|
echo "Starting idle inputs monitor service..."
|
||||||
|
while true; do
|
||||||
|
# Sleep for a short interval (e.g., 1 minute) before checking
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# Get the current idle time in milliseconds using xprintidle
|
||||||
|
idle_time=$(xprintidle)
|
||||||
|
|
||||||
|
# Check if the idle time exceeds the specified timeout
|
||||||
|
if [ "${idle_time:?}" -ge "${idle_timeout:?}" ]; then
|
||||||
|
# TODO: Check if any sessions exist in sunshine
|
||||||
|
|
||||||
|
# Execute restart to WoL monitor function
|
||||||
|
echo "No user activity for over 60 minutes. Entering WoL Monitor Mode."
|
||||||
|
restart_to_wol_monitor
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to monitor for WoL events
|
||||||
|
start_wol_monitor() {
|
||||||
|
# Specify port to listen to (9 is the default WoL port).
|
||||||
|
listen_port=9
|
||||||
|
|
||||||
|
# Start the WoL monitor service
|
||||||
|
echo "Starting WoL monitor service..."
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
# Listen for WoL magic packets on the specified port
|
||||||
|
tcpdump -i any -n -l -c 1 -q "udp port $listen_port and (udp[8:4] = 0xFFFFFFFF)"
|
||||||
|
|
||||||
|
# Execute restart to desktop function
|
||||||
|
echo "WoL event received. Entering Desktop Mode."
|
||||||
|
restart_to_desktop_mode
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -f "/tmp/.wol-monitor" ]; then
|
||||||
|
start_wol_monitor
|
||||||
|
else
|
||||||
|
start_idle_monitor
|
||||||
|
fi
|
||||||
158
overlay/usr/bin/sunshine-run
Executable file
158
overlay/usr/bin/sunshine-run
Executable file
@@ -0,0 +1,158 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: sunshine-run
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 23rd August 2023 3:28:52 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Friday, 23rd August 2023 4:21:00 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
exec >> >(tee -a ${USER_HOME:?}/.cache/log/sunshine_run.log) 2>&1
|
||||||
|
echo
|
||||||
|
echo "-------------------------------"
|
||||||
|
echo
|
||||||
|
date
|
||||||
|
echo
|
||||||
|
echo "-------------------------------"
|
||||||
|
echo
|
||||||
|
echo "**** Execute sunshine-run ****"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Trap SIGINT, SIGQUIT, SIGHUP, SIGTERM to forward signals to the child process
|
||||||
|
_term() {
|
||||||
|
if [ -n "${proc_pid}" ]; then
|
||||||
|
# Read all child processes of proc_pid first
|
||||||
|
child_pids=$(pgrep -P $proc_pid)
|
||||||
|
# Forward the signal proc_pid
|
||||||
|
echo " - Checking for status of main process ${proc_pid}"
|
||||||
|
if kill -0 "${proc_pid}" 2>/dev/null; then
|
||||||
|
echo " - Forwarding signal $1 to process ${proc_pid}"
|
||||||
|
kill -s "${1}" "${proc_pid}"
|
||||||
|
else
|
||||||
|
echo " - Process ${proc_pid} is already stopped. Nothing to do here."
|
||||||
|
fi
|
||||||
|
for child_pid in ${child_pids:-}; do
|
||||||
|
echo " - Checking for status of child process ${child_pid}"
|
||||||
|
if kill -0 "${child_pid}" 2>/dev/null; then
|
||||||
|
echo " - Forwarding signal $1 to process ${child_pid}"
|
||||||
|
kill -s "${1}" "${child_pid}"
|
||||||
|
else
|
||||||
|
echo " - Process ${child_pid} is already stopped. Nothing to do here."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap '_term INT' SIGINT
|
||||||
|
trap '_term QUIT' SIGQUIT
|
||||||
|
trap '_term HUP' SIGHUP
|
||||||
|
trap '_term TERM' SIGTERM
|
||||||
|
|
||||||
|
# Record sunshine-run PID
|
||||||
|
echo " - Recording sunshine-run PID '$$' in /tmp/sunshine-exec-run.pid"
|
||||||
|
echo "$$" > /tmp/sunshine-exec-run.pid
|
||||||
|
|
||||||
|
# Wipe session config
|
||||||
|
echo "" > /tmp/sunshine-exec-run.conf
|
||||||
|
|
||||||
|
# Update display resolution and refresh reate if client provided the required details
|
||||||
|
if ([ "X${SUNSHINE_CLIENT_WIDTH:-}" != "X" ] && [ "X${SUNSHINE_CLIENT_HEIGHT:-}" != "X" ] && [ "X${SUNSHINE_CLIENT_FPS:-}" != "X" ]); then
|
||||||
|
# Don't fail script if something goes wrong here. Set +e in subprocess
|
||||||
|
(
|
||||||
|
set +e
|
||||||
|
echo " - Setting display resolution to ${SUNSHINE_CLIENT_WIDTH:?}x${SUNSHINE_CLIENT_HEIGHT:?} ${SUNSHINE_CLIENT_FPS:?}Hz"
|
||||||
|
|
||||||
|
# Read current display mode and extract resolution and refresh rate from the mode string
|
||||||
|
__xrandr_out="$(xrandr -q)"
|
||||||
|
__current_current_mode=$(echo "${__xrandr_out:?}" | awk '/\*/ {print $0}')
|
||||||
|
__current_resolution=$(echo ${__current_current_mode:?} | awk '{print $1}')
|
||||||
|
__current_refresh_rate=$(echo ${__current_current_mode:?} | awk '{sub(/\*/, "", $2); print $2}')
|
||||||
|
|
||||||
|
# Get the primary output device
|
||||||
|
__primary_output="$(echo "${__xrandr_out:?}" | grep primary | awk '{print $1}')"
|
||||||
|
|
||||||
|
# Get the modeline from cvt and extract the second line (which contains the modeline)
|
||||||
|
__client_modeline=$(cvt "${SUNSHINE_CLIENT_WIDTH:?}" "${SUNSHINE_CLIENT_HEIGHT:?}" "${SUNSHINE_CLIENT_FPS:?}" | grep Modeline | sed -e 's/Modeline //')
|
||||||
|
# Create a new mode for this. This allows us to force a set refresh rate that may not be supported by the display
|
||||||
|
__client_mode=$(echo "${__client_modeline:?}" | awk -F '"' '{print $2}')
|
||||||
|
|
||||||
|
# Check if this custom mode is already created
|
||||||
|
if ! echo "${__xrandr_out:?}" | grep -q "${__client_mode:?}"; then
|
||||||
|
# Custom mode does not yet exist. Create it
|
||||||
|
echo " - Adding new mode '${__client_mode:?}' with new modeline '${__client_modeline:?}'"
|
||||||
|
xrandr --newmode "${__client_mode:?}" ${__client_modeline##*\"}
|
||||||
|
if [ $? -gt 0 ]; then
|
||||||
|
echo " - WARNING: Failed to add new mode '${__client_mode:?}'."
|
||||||
|
else
|
||||||
|
echo " - SUCCESS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " - Custom mode '${__client_mode:?}' already exists."
|
||||||
|
fi
|
||||||
|
# Check if custom mode exists
|
||||||
|
__xrandr_out="$(xrandr -q)"
|
||||||
|
if echo "${__xrandr_out:?}" | grep -q "${__client_mode:?}"; then
|
||||||
|
# Check if this mode is already added to the primary display
|
||||||
|
if ! echo "${__xrandr_out:?}" | sed -n "/${__primary_output:?}/,/^[^[:space:]]/ {/^[[:space:]]/p}" | grep -q "${__client_mode:?}"; then
|
||||||
|
# Custom mode exists, but is not yet added to the primary output device. Add it
|
||||||
|
echo " - Adding custom mode '${__client_mode:?}' to device '${__primary_output:?}'"
|
||||||
|
xrandr --addmode "${__primary_output:?}" "${__client_mode:?}"
|
||||||
|
__mode_added=$?
|
||||||
|
if [ "${__mode_added:-0}" -gt 0 ]; then
|
||||||
|
echo " - WARNING: Failed to assign custom mode to primary output device '${__primary_output:?}'."
|
||||||
|
else
|
||||||
|
echo " - SUCCESS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " - Custom mode '${__client_mode:?}' is already configured for the primary output device."
|
||||||
|
__mode_added=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " - WARNING: Custom mode '${__client_mode:?}' does not exist."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the current resoultion to the new mode
|
||||||
|
if ([ "X${__mode_added:-}" = "X" ] || [ "${__mode_added:-0}" -gt 0 ]); then
|
||||||
|
echo " - Attempting to set the display mode to a supported '${SUNSHINE_CLIENT_WIDTH:?}x${SUNSHINE_CLIENT_HEIGHT:?}' mode. Note that this may not support the configured refresh rate."
|
||||||
|
xrandr --output "${__primary_output:?}" --mode ${SUNSHINE_CLIENT_WIDTH:?}x${SUNSHINE_CLIENT_HEIGHT:?} --refresh ${SUNSHINE_CLIENT_FPS:?}
|
||||||
|
if [ $? -gt 0 ]; then
|
||||||
|
echo " - WARNING: Failed to set current output to mode '${SUNSHINE_CLIENT_WIDTH:?}x${SUNSHINE_CLIENT_HEIGHT:?}' on device '${__primary_output:?}'."
|
||||||
|
else
|
||||||
|
echo " - SUCCESS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " - Setting the display mode to '${__client_mode:?}'"
|
||||||
|
xrandr --output "${__primary_output:?}" --mode "${__client_mode:?}" --rate "${SUNSHINE_CLIENT_FPS:?}"
|
||||||
|
if [ $? -gt 0 ]; then
|
||||||
|
echo " - WARNING: Failed to set current output to custom mode '${__client_mode:?}' on device '${__primary_output:?}'."
|
||||||
|
else
|
||||||
|
echo " - SUCCESS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save original display settings to config file. This will be read and used to restore the original display settings when the client disconnects.
|
||||||
|
echo "primary_output='${__primary_output:?}'" >> /tmp/sunshine-exec-run.conf
|
||||||
|
echo "display_mode='${__current_resolution:?}'" >> /tmp/sunshine-exec-run.conf
|
||||||
|
echo "display_rate='${__current_refresh_rate:?}'" >> /tmp/sunshine-exec-run.conf
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run child process
|
||||||
|
/usr/bin/dumb-init "${@}" &
|
||||||
|
proc_pid=$!
|
||||||
|
|
||||||
|
# Wait for child process to exit:
|
||||||
|
echo " - Waiting for PID '${proc_pid}' to exit"
|
||||||
|
wait "$proc_pid"
|
||||||
|
|
||||||
|
# Clean up PID file
|
||||||
|
if [ -f /tmp/sunshine-exec-run.pid ]; then
|
||||||
|
echo " - Removing sunshine-run pidfile."
|
||||||
|
rm -f /tmp/sunshine-exec-run.pid
|
||||||
|
else
|
||||||
|
echo " - WARNING: No sunshine-run pidfile found for removal."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
110
overlay/usr/bin/sunshine-stop
Executable file
110
overlay/usr/bin/sunshine-stop
Executable file
@@ -0,0 +1,110 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: sunshine-stop
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 23rd August 2023 3:28:52 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Friday, 23rd August 2023 4:21:00 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
exec >> >(tee -a ${USER_HOME:?}/.cache/log/sunshine_stop.log) 2>&1
|
||||||
|
echo
|
||||||
|
echo "-------------------------------"
|
||||||
|
echo
|
||||||
|
date
|
||||||
|
echo
|
||||||
|
echo "-------------------------------"
|
||||||
|
echo
|
||||||
|
echo "**** Execute sunshine-stop ****"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Read the run config
|
||||||
|
if [ -f /tmp/sunshine-exec-run.conf ]; then
|
||||||
|
echo " - Reading sunshine-run config."
|
||||||
|
. /tmp/sunshine-exec-run.conf
|
||||||
|
else
|
||||||
|
echo " - WARNING: No sunshine-run config found for import."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Read the process PID
|
||||||
|
if [ -f /tmp/sunshine-exec-run.pid ]; then
|
||||||
|
main_process_pid="$(cat /tmp/sunshine-exec-run.pid)"
|
||||||
|
echo " - Found initial sunshine-run PID '${main_process_pid}'."
|
||||||
|
else
|
||||||
|
echo " - WARNING: No sunshine-run PID found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Send a INT signal to the PID (if it is found)
|
||||||
|
if [ "X${main_process_pid:-}" != "X" ]; then
|
||||||
|
echo " - Sending SIGINT to PID '${main_process_pid}'."
|
||||||
|
kill -INT "${main_process_pid}" || true
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run a loop to check for any other "sunshine-run" processes and send them also a INT signal
|
||||||
|
echo " - Checking for other sunshine-run processes..."
|
||||||
|
for process_pid in $(ps aux | grep -v grep | grep sunshine-run | awk '{print $2}'); do
|
||||||
|
# Ensure this process is still running
|
||||||
|
if ! kill -0 "$process_pid" 2>/dev/null; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo " - Stopping PID '${process_pid}' - $(ps -p ${process_pid} -o command | awk 'NR>1')"
|
||||||
|
# Send this process a SIGINT
|
||||||
|
echo " - Sending SIGINT to PID '${process_pid}'."
|
||||||
|
kill -INT "${process_pid}" 2>/dev/null || true
|
||||||
|
sleep 0.5
|
||||||
|
# Send this process a SIGTERM every 2 seconds util stopped or until it has sent 3 signals
|
||||||
|
counter=0
|
||||||
|
while kill -0 "$process_pid" 2>/dev/null; do
|
||||||
|
echo " - Sending SIGTERM to PID '${process_pid}'."
|
||||||
|
kill -TERM "$process_pid" 2>/dev/null || true
|
||||||
|
counter=$((counter + 1))
|
||||||
|
[ "$counter" -gt 2 ] && break
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
# Send this process a SIGKILL every second until stopped or until it has sent 3 signals
|
||||||
|
counter=0
|
||||||
|
while kill -0 "$process_pid" 2>/dev/null; do
|
||||||
|
echo " - Sending SIGKILL to PID '${process_pid}'."
|
||||||
|
kill -KILL "$process_pid" 2>/dev/null || true
|
||||||
|
counter=$((counter + 1))
|
||||||
|
[ "$counter" -gt 2 ] && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
if ! kill -0 "$process_pid" 2>/dev/null; then
|
||||||
|
echo " - PID '${process_pid}' stopped."
|
||||||
|
else
|
||||||
|
echo " - ERROR: Failed to kill PID '${process_pid}'."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo " - All sunshine-run related processes are stopped."
|
||||||
|
|
||||||
|
# Check if the required information was stored for resetting the display resolution and refresh rate
|
||||||
|
if ([ "X${primary_output:-}" != "X" ] && [ "X${display_mode:-}" != "X" ] && [ "X${display_rate:-}" != "X" ]); then
|
||||||
|
# Reset display resolution and refresh rate
|
||||||
|
echo " - Resetting display resolution to ${display_mode:?} ${display_rate:?}Hz"
|
||||||
|
xrandr --output "${primary_output:?}" --mode "${display_mode:?}" --rate "${display_rate:?}"
|
||||||
|
else
|
||||||
|
echo " - WARNING: original display config not found. Resolution will not be reset."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up config file
|
||||||
|
if [ -f /tmp/sunshine-exec-run.conf ]; then
|
||||||
|
echo " - Removing sunshine-run config."
|
||||||
|
rm -f /tmp/sunshine-exec-run.conf
|
||||||
|
else
|
||||||
|
echo " - WARNING: No sunshine-run config found for removal."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up PID file
|
||||||
|
if [ -f /tmp/sunshine-exec-run.pid ]; then
|
||||||
|
echo " - Removing sunshine-run pidfile."
|
||||||
|
rm -f /tmp/sunshine-exec-run.pid
|
||||||
|
else
|
||||||
|
echo " - WARNING: No sunshine-run pidfile found for removal."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
23
overlay/usr/bin/xfce4-close-all-windows
Executable file
23
overlay/usr/bin/xfce4-close-all-windows
Executable file
@@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: xfce4-close-all-windows
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 22nd August 2023 3:28:52 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 22nd August 2023 3:28:52 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Get a list of open windows
|
||||||
|
WINDOW_IDS=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
|
||||||
|
# Close each window
|
||||||
|
for i in ${WINDOW_IDS}; do
|
||||||
|
wmctrl -ic "$i";
|
||||||
|
done
|
||||||
|
# Keep checking and waiting until all windows are closed
|
||||||
|
while [ "X${WINDOW_IDS:-}" != "X" ]; do
|
||||||
|
sleep 0.2;
|
||||||
|
WINDOW_IDS=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
|
||||||
|
done
|
||||||
19
overlay/usr/bin/xfce4-minimise-all-windows
Executable file
19
overlay/usr/bin/xfce4-minimise-all-windows
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: xfce4-minimise-all-windows
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 22nd August 2023 3:28:52 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 22nd August 2023 3:28:52 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Get a list of open windows
|
||||||
|
WINDOW_IDS=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
|
||||||
|
# Minimise each window
|
||||||
|
for i in ${WINDOW_IDS}; do
|
||||||
|
wmctrl -ir "$i" -b add,hidden;
|
||||||
|
sleep 0.2
|
||||||
|
done
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Installer - Heroic (Epic Games Launcher)
|
|
||||||
Categories=Game;
|
|
||||||
Exec=/opt/scripts/install_heroic.sh %U
|
|
||||||
Icon=installsoftware
|
|
||||||
Terminal=true
|
|
||||||
Type=Application
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Installer - Rare/Legendary (Epic Games Commandline Launcher)
|
|
||||||
Categories=Game;
|
|
||||||
Exec=/opt/scripts/install_legendary.sh %U
|
|
||||||
Icon=installsoftware
|
|
||||||
Terminal=true
|
|
||||||
Type=Application
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Installer - Lutris
|
|
||||||
Categories=Game;
|
|
||||||
Exec=/opt/scripts/install_lutris.sh %U
|
|
||||||
Icon=installsoftware
|
|
||||||
Terminal=true
|
|
||||||
Type=Application
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Installer - Protonup
|
|
||||||
Categories=Game;
|
|
||||||
Exec=/opt/scripts/install_protonup.sh %U
|
|
||||||
Icon=installsoftware
|
|
||||||
Terminal=true
|
|
||||||
Type=Application
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"file_format_version" : "1.0.0",
|
|
||||||
"ICD": {
|
|
||||||
"library_path": "libGLX_nvidia.so.0",
|
|
||||||
"api_version" : "1.2.155"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user