# Steam Headless (Arch Linux) # (WIP) An Arch variant of the steam-headless image # It is curerently my intent to switch to arch as the main # image base once SteamOS 3 is released (pending review) # FROM archlinux:latest LABEL maintainer="Josh.5 " # Update package repos RUN \ echo "**** Update package manager ****" \ && sed -i 's/^NoProgressBar/#NoProgressBar/g' /etc/pacman.conf \ && echo -e "[multilib]\nInclude = /etc/pacman.d/mirrorlist" >> /etc/pacman.conf \ && \ echo # Update locale RUN \ echo "**** Configure locals ****" \ && echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen \ && locale-gen \ && \ echo ENV \ LANG=en_US.UTF-8 \ LANGUAGE=en_US:en \ LC_ALL=en_US.UTF-8 # Re-install certificates RUN \ echo "**** Install certificates ****" \ && pacman -Syu --noconfirm --needed \ ca-certificates \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install core packages RUN \ echo "**** Install tools ****" \ && pacman -Syu --noconfirm --needed \ base-devel \ bash \ bash-completion \ curl \ docbook-xml \ docbook-xsl \ fakeroot \ p7zip \ patch \ git \ jq \ less \ locate \ man-db \ nano \ net-tools \ pciutils \ pkg-config \ procps \ psmisc \ psutils \ rsync \ screen \ sudo \ unzip \ vim \ wget \ xmlstarlet \ xz \ && \ echo "**** Install python ****" \ && pacman -Syu --noconfirm --needed \ python \ python-numpy \ python-pip \ python-setuptools \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ 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 /home/default/.cache/yay \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && rm -rf /tmp/yay* \ && \ echo # Install supervisor RUN \ echo "**** Install supervisor ****" \ && pacman -Syu --noconfirm --needed \ supervisor \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install mscorefonts RUN \ echo "**** Install ms fonts ****" \ && su - default -c "yay -Syu --noconfirm --needed ttf-msfonts" \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /home/default/.cache/yay \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && rm -rf /tmp/yay* \ && \ echo # Install X Server requirements ENV \ XORG_SOCKET_DIR="/tmp/.X11-unix" \ XDG_RUNTIME_DIR="/tmp/.X11-unix/run" \ XDG_SESSION_TYPE="x11" \ FORCE_X11_DUMMY_CONFIG="false" RUN \ echo "**** Install X Server requirements ****" \ && pacman -Syu --noconfirm --needed \ avahi \ dbus \ lib32-fontconfig \ fuse2 \ x11vnc \ xorg \ xorg-apps \ xorg-font-util \ xorg-fonts-misc \ xorg-fonts-type1 \ xorg-server \ xorg-server-xephyr \ xorg-server-xvfb \ xorg-xauth \ xorg-xbacklight \ xorg-xhost \ xorg-xinit \ xorg-xinput \ xorg-xkill \ xorg-xprop \ xorg-xrandr \ xorg-xsetroot \ xorg-xwininfo \ xf86-input-evdev \ xterm \ gamescope \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install audio requirements ENV \ PULSE_SOCKET_DIR="/tmp/pulse" \ PULSE_SERVER="unix:/tmp/pulse/pulse-socket" RUN \ echo "**** Install X Server requirements ****" \ && pacman -Syu --noconfirm --needed \ alsa-utils \ pavucontrol \ pulseaudio \ pulseaudio-alsa \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install desktop environment # TODO: Install equivelent of 'msttcorefonts' and 'fonts-vlgothic' RUN \ echo "**** Install desktop environment ****" \ && pacman -Syu --noconfirm --needed \ gedit \ xfce4 \ xfce4-goodies \ xfce4-terminal \ ttf-liberation \ xdg-user-dirs \ xdg-utils \ imagemagick \ && \ echo "**** Install WoL Manager requirements ****" \ && pacman -Syu --noconfirm --needed \ tcpdump \ xprintidle \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Add support for flatpaks 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 \ xdg-desktop-portal-gtk \ gnome-software \ && \ echo "**** Configure flatpak ****" \ && chmod u-s /usr/bin/bwrap \ && flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo \ && su - default -c "flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo" \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ 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 '' > /opt/frontend/index.html \ && echo '

If you are not redirected, click here.

' >> /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 ARG WEBSOCKETIFY_VERSION=0.11.0 RUN \ echo "**** Fetch Websockify ****" \ && cd /tmp \ && wget -O /tmp/websockify.tar.gz https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.tar.gz \ && \ echo "**** Extract Websockify ****" \ && cd /tmp \ && tar -xvf /tmp/websockify.tar.gz \ && \ echo "**** Install Websockify to main ****" \ && cd /tmp/websockify-${WEBSOCKETIFY_VERSION} \ && python3 ./setup.py install \ && \ echo "**** Install Websockify to noVNC path ****" \ && cd /tmp \ && mkdir -p /opt/noVNC/utils \ && mv -v /tmp/websockify-${WEBSOCKETIFY_VERSION} /opt/noVNC/utils/websockify \ && \ echo "**** Section cleanup ****" \ && rm -rf \ /tmp/websockify-* \ /tmp/websockify.tar.gz \ && \ echo # Setup browser audio streaming deps RUN \ echo "**** Install audio streaming deps ****" \ && pacman -Syu --noconfirm --needed \ bzip2 \ gst-libav \ 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 ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Setup video streaming deps RUN \ echo "**** Install video streaming deps ****" \ && pacman -Syu --noconfirm --needed \ libva \ libva-mesa-driver \ libva-intel-driver \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install tools for monitoring hardware RUN \ echo "**** Install audio streaming deps ****" \ && pacman -Syu --noconfirm --needed \ #cpu-x \ htop \ libva-utils \ vdpauinfo \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install Sunshine RUN \ echo "**** Install stable sunshine ****" \ && su - default -c "yay -Syu --noconfirm --needed miniupnpc sunshine-bin" \ && setcap cap_sys_admin+p $(readlink -f $(which sunshine)) \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /home/default/.cache/yay \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && rm -rf /tmp/yay* \ && \ echo # Install Firefox RUN \ echo "**** Install Firefox ****" \ && pacman -Syu --noconfirm --needed \ firefox \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ echo # Install Steam RUN \ echo "**** Install Steam ****" \ && pacman -Syu --noconfirm --needed \ steam \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && \ 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 # Install Protonup replacement RUN \ echo "**** Install PorotonUP ****" \ && su - default -c "yay -Sy --noconfirm --needed --overwrite \"/usr/bin/normalizer\" protonup-qt" \ && \ echo "**** Section cleanup ****" \ && pacman -Scc --noconfirm \ && rm -fr /home/default/.cache/yay \ && rm -fr /var/lib/pacman/sync/* \ && rm -fr /var/cache/pacman/pkg/* \ && rm -rf /tmp/yay* \ && \ echo # Add FS overlay COPY overlay / # Tweaks as flatpak issue isn't sorted RUN \ echo "**** Tweaks for Arch ****" \ && sed -i d /usr/bin/install_firefox.sh \ && sed -i d /usr/bin/install_protonup.sh \ && sed -i d /templates/home_directory_template/.local/share/xfce4/helpers/custom-WebBrowser.desktop \ && \ echo # Set display environment variables ENV \ DISPLAY_CDEPTH="24" \ DISPLAY_REFRESH="120" \ DISPLAY_SIZEH="900" \ DISPLAY_SIZEW="1600" \ DISPLAY_VIDEO_PORT="DFP" \ DISPLAY=":55" ENV \ NVIDIA_DRIVER_CAPABILITIES="all" \ NVIDIA_VISIBLE_DEVICES="all" # Set container configuration environment variables # APPIMAGE_EXTRACT_AND_RUN="0" ENV \ MODE="primary" \ WEB_UI_MODE="vnc" \ ENABLE_VNC_AUDIO="true" \ NEKO_PASSWORD=neko \ NEKO_PASSWORD_ADMIN=admin \ ENABLE_STEAM="true" \ STEAM_ARGS="-silent" \ ENABLE_SUNSHINE="true" \ ENABLE_EVDEV_INPUTS="true" \ ENABLE_WOL_POWER_MANAGER="false" # Configure required ports ENV \ PORT_NOVNC_WEB="8083" \ NEKO_NAT1TO1="" # Expose the required ports EXPOSE 8083 # Set entrypoint RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]