From 2de51a7dfc9295fd9972d5770e6cc2457ee05d6d Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Tue, 23 Jul 2024 08:14:18 -0700 Subject: [PATCH 01/17] Initial copy --- asciidoc/components/kiosk.adoc | 74 ++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 asciidoc/components/kiosk.adoc diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc new file mode 100644 index 00000000..1c4f021d --- /dev/null +++ b/asciidoc/components/kiosk.adoc @@ -0,0 +1,74 @@ +[#guides-kiosk] += Building Kiosks with SUSE Edge +:experimental: + +ifdef::env-github[] +:imagesdir: ../images/ +:tip-caption: :bulb: +:note-caption: :information_source: +:important-caption: :heavy_exclamation_mark: +:caution-caption: :fire: +:warning-caption: :warning: +endif::[] + + + +TODO: write intro + +In this guide, we will demonstrate how to manage these workloads in a secure, scalable, and maintainable way. + +== Architecture + +TODO + +== Prerequisites + +To run this, you will need a system with: +- SLE Micro 5.5+ +- Either K3s or RKE2 +- Helm installed (if not using EIB or Fleet) +- A display attached (when running in a VM, make sure to use a virtual display instead of just the console) + +== Deployment + +The preferred way to deploy on Kubernetes is through the helm chart. TODO add link to chart once published. + +We need to install helm first with: +[,bash] +---- +curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash +---- + +Once helm is installed, install the chart by running: + +[,bash] +---- +helm upgrade --install kiosk --namespace kiosk --create-namespace oci://link-to-chart --version=0.1.0 +---- + +To change the URL that's loaded: + +[,bash] +---- +helm upgrade --install kiosk --namespace kiosk --create-namespace oci://link-to-chart --version=0.1.0 --set workload.url=http://.svc..cluster.local +---- + +=== Deployment with Fleet + + + +== Custom Workloads + +By default, we run Firefox in kiosk mode and use the "URL" + +== Integrations + +=== Integration with EIB + +With airgapped/disconnected devices, it might be best to use the Edge Image Builder to create an image that installs k3s along with your GUI workload + +=== Integration with Akri + +If you have more than one node in your cluster, you may want to only run this workload on nodes that have a display attached. + +TODO: once I have a flag to use Akri instead of DaemonSet \ No newline at end of file From 756f11afcdadcc3ca91a73e0b87a11e7c57ffc35 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Mon, 2 Dec 2024 10:45:20 -0800 Subject: [PATCH 02/17] Adding content --- asciidoc/components/kiosk.adoc | 106 +++++++++++++++++++++---- asciidoc/images/kiosk-architecture.png | Bin 0 -> 37460 bytes 2 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 asciidoc/images/kiosk-architecture.png diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 1c4f021d..c6b82cd2 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -12,26 +12,35 @@ ifdef::env-github[] endif::[] +Many times workloads running in edge environments need to have a way for users to interact with them through a graphical interface. To enable these workloads in SUSE Edge, we provide a set of containers and a helm chart to run your graphical applications within K3s or RKE2. -TODO: write intro +Running your kiosk (or other HID) applications this way allows for more explicit security boundaries along with allowing for a wider range of languages/frameworks when building your app. In this guide, we will demonstrate how to manage these workloads in a secure, scalable, and maintainable way. == Architecture -TODO +image::kiosk-architecture.png[] + +The Kubernetes Pod contains the three containers (X11, PulseAudio, and the workload itself) + +The workload communicates with both the X11 and PulseAudio containers through a unix socket that's created in EmptyDir to allow communication between containers. They also use an EmptyDir to share the Xauthority token. + +Both the PulseAudio and X11 containers use udev to communicate with the hardware. (That's a slight oversimplification...) == Prerequisites To run this, you will need a system with: -- SLE Micro 5.5+ -- Either K3s or RKE2 +- SLE Micro 5.5+ +- Either K3s or RKE2 1.29+ - Helm installed (if not using EIB or Fleet) -- A display attached (when running in a VM, make sure to use a virtual display instead of just the console) +- A display attached (when running in a VM, make sure to use a virtual display instead of the "console" output) == Deployment -The preferred way to deploy on Kubernetes is through the helm chart. TODO add link to chart once published. +The preferred way to deploy on Kubernetes is through the helm chart. + +TODO add link to chart once published. We need to install helm first with: [,bash] @@ -53,22 +62,89 @@ To change the URL that's loaded: helm upgrade --install kiosk --namespace kiosk --create-namespace oci://link-to-chart --version=0.1.0 --set workload.url=http://.svc..cluster.local ---- -=== Deployment with Fleet +== Custom Workloads +By default, the helm chart runs Firefox in kiosk mode and uses the `workload.url` value to specify what page to load. + +If you want to replace Firefox with your own application, you need to build your application into an OCI container image then specify it through the `workload.image.repository` and `workload.image.tag` values. + +The application container needs the appropriate libraries to be able to communicate with X11. As an example, here are the libraries required for Electron apps: + +- `libX11-xcb1` +- `libgtk-3-0` +- `mozilla-nss` +- `xorg-x11-fonts` +- `libpulse0` +- `libavcodec58` +- `libasound2` +- `npm-default` +- `nodejs-default` + +## Flow of Display Control on System Boot + +When the server is starting up, here's the order of which components control what's being shown on the display. + +- UEFI (Firmware) + +The first thing you see is determined by the system's firmware. Different system manufactures provide more or less control over this portion of the process. + +- Grub Bootloader + +Grub then takes over from the firmware and shows the boot menu. This step can be branded or skipped depending on needs. + +- Linux Framebuffer device + +Once the system starts booting and execution is handed from the bootloader to the linux kernel, the system will start displaying logs or other basic graphics. The logs can be removed by adding `quiet` to the kernel arguments and we can write an image directly to the framebuffer. + +- X11 + +When X11 starts up, it will take over the display and show a desktop. When we don't run a taskbar or any applications, you will only see the background. By replacing the background, you can change what's displayed while the application is starting. + +- Application + +Lastly, the application itself will be composited on top of the background. For most kiosk applications, you will likely want to have this be fullscreen so the background becomes hidden. + + +== FAQs + +=== How can I adjust what's displayed during boot? + +There are several parts of the boot process that can be branded based on your individual needs. + + +TODO: The Grub2 menu can be bypassed or branded [...] -== Custom Workloads -By default, we run Firefox in kiosk mode and use the "URL" +Adding `quiet` to your kernel bootargs will remove the text that is seen on boot of linux systems. -== Integrations +Masking `console-getty.service` and `getty@tty1.service` will remove the login prompt. -=== Integration with EIB +Doing both of these will show a blank screen with a flashing cursor in the top-left corner. To show something on screen between the GRUB splash screen, you could use `plymouth` or just `cat` a raw framebuffer file to `/dev/fb0`. (Check out https://github.com/zqb-all/convertfb for a tool on converting images to the right format) -With airgapped/disconnected devices, it might be best to use the Edge Image Builder to create an image that installs k3s along with your GUI workload +=== How can I turning off key combinations? -=== Integration with Akri +To disallow closing the application or otherwise tampering with the kiosk, it can be useful to remap or turn off certain keys. This can be done using (xmodmap)[https://linux.die.net/man/1/xmodmap] -If you have more than one node in your cluster, you may want to only run this workload on nodes that have a display attached. +The helm chart allows for customizing this file with values that looks like this: -TODO: once I have a flag to use Akri instead of DaemonSet \ No newline at end of file +[,yaml] +``` +X11: + keyboardModMap: | + clear control + clear mod1 + clear mod2 + clear mod3 + clear mod4 + clear mod5 + keycode 66 = + keycode 108 = + keycode 133 = + keycode 134 = + keycode 150 = + keycode 204 = + keycode 205 = + keycode 206 = + keycode 207 = +``` \ No newline at end of file diff --git a/asciidoc/images/kiosk-architecture.png b/asciidoc/images/kiosk-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..1f10574c7e99739e190e87cc1c62481e4f5d26cb GIT binary patch literal 37460 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 x}>w#dbNBZ%bd z9hb5GEc@34_C*}qh@V}!>}bYMI3KN&yW!J(0$o95i#dQIpsvalcc;5S0(i3r@h7bdW`WfFhb}wIM{6(Jp zLYl&P_*BG2vgwCHFFGVvuh4V%vIYZHXU6Gk!h}nsU+dRv7(l~}-1O{`2yV(UtrO*9 z`x?oCiN7rD;Yx?k^&Vsu;tIoO*0JvN!<=)zuL9bOOwPhM_6Z9=D~wFDm;sEeNkS|I z^i&GG##Y%cPYN2m71!L?=BiCq=oN9>>I{$((RMOS@19ysZRn`#bx|5-Y@1ens{S*+ z44FFm_Lk7NHByHUol=bwsmL9qb1bgy9J}A~3Vf`G`RbeYjo1yyG}N{U=vi^%MaC@} zCtQ0@xBT*zPbMdlM$+=+1AhuhftdWvJo)7(nlDZ(Fn{a#^zQb$_|J0M4|4}ljLVZ> zuGC=W`!`KgT|N!iwtyq1Ki?FZ3#pZ=FrKZ52Wb=t@f~7a;i!%sZfn`vuQeC0dpt>0 z?dl8X{z3HMK1ZGQ;xe2+BxdMoXJPAt)~suGpSzTn=b+HVmim&DfSI3;#LH26efXDD zdPEPhym9+>ORb2?^h9tDBHZK(D@7uR<>!V9HR1E~Q=XEv7>65SK{vk-99#-PaM#~N zbUGm~}Y5-6*vtqtPtXE#Y3>8eU_uj3@)qyh@m zbiqVmTL$@=uSr`jp&4I|3=7301T&ogEzycU=U2jYexq6Sl!NYL@e&XH6=O$<9QTN@ z9NG8EK&vcYaM?c$zn-%JSxZ%Q8uXvLYC z%J|uyK+xtlyG%Fg9dv)PWZnw)9r2&lyJDfVVrZj93L((Aj2P;P=uDG*iJjXlN=A=vlps1%V%bBR~yNqR@ z+GkVH38xzcF43v7JJnya@q~B|=5;H~ovV2haU}rdTw1IkReTF_|LGS6$N4SdSN1Eg z9;O|HO61jFnrfZlFPf8o;nCd>2@zx zw<>9xR;0P|5n@I&uMWtJfBJJxEEXYC?uE_GRerWM_M1*zs(wc4=yit^vBR>xm4ang z*d5s9M}L-|xhOX;K#8RFwP6ACiAnoiI~O%%`h3wzV-C2~yn{elF?o1C*lB}$IfY;K zdt14}#cG#x6cWjtWvUgFgQ%HjvCZ9!9yJokOvYn2eLSVq-GXcAuRjvGql6u;I!#qK z5qaok&hibU+~^n{dq5wy9jUr%Ev_9qnQ8*sH1p{_xheMGQ7V4V+5zaa`V^sH((v49 z_(O;oPZ>E&zl2$m0kF6>^@phS6;-Zf(4hvrLr2DF0R;@uN&CqEittZ^*Ep5xP-F7xQSCBna$_+W@M-B z;hye%h&CvabC25IALx<62M3e}R0x`et1$7_F*C`;7{|!O=++f?%i(UddxiME<;BAa z*jEgYj2>J3_Cf@p_aG@I5O}ZclIa<+#T4Y>LKn!h^eE`1;?E7mcDMp@H{*%G2>%G1 zecI^T&8G);jJ8i9nX18Ns}+hI74TlEfdb|^L`fP~`Io9{j*8~juzv!1f}iLu-X0*Q z8qocXRy&Rq-~vHeh0C%A)6uLXu)d+;B5~bgZdROf)abl)>K|~O;4jd_pQjK4s!b8(mcsD$eYiKNcFhHO)LPFr`z<W-Y}0N0d-^mjr!(i|+3^eOgbga1FKI zT3K+<{%=9}-xC78v;N5=?40n=R{1+H`XfjjI7h`lgoW1|?sIonJoIyb z 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 e|KA_<{J}ALG&Il`VJ}9aR8dY%w)p Date: Mon, 2 Dec 2024 10:47:22 -0800 Subject: [PATCH 03/17] Adding to edge book --- asciidoc/components/kiosk.adoc | 2 +- asciidoc/edge-book/edge.adoc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index c6b82cd2..2fb08083 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -1,4 +1,4 @@ -[#guides-kiosk] +[#component-kiosk] = Building Kiosks with SUSE Edge :experimental: diff --git a/asciidoc/edge-book/edge.adoc b/asciidoc/edge-book/edge.adoc index d00aa343..c7a6d50a 100755 --- a/asciidoc/edge-book/edge.adoc +++ b/asciidoc/edge-book/edge.adoc @@ -75,6 +75,8 @@ include::../components/metallb.adoc[leveloffset=+1] include::../components/virtualization.adoc[leveloffset=+1] +include::../components/kiosk.adoc[leveloffset=+1] + //-------------------------------------------- // Third-Party Integration //-------------------------------------------- From 9a03b9af9d2e2b21aa975fd49550ade244144528 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Mon, 2 Dec 2024 12:00:32 -0800 Subject: [PATCH 04/17] fixing typo --- asciidoc/components/kiosk.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 2fb08083..c25f84c8 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -122,7 +122,7 @@ Masking `console-getty.service` and `getty@tty1.service` will remove the login p Doing both of these will show a blank screen with a flashing cursor in the top-left corner. To show something on screen between the GRUB splash screen, you could use `plymouth` or just `cat` a raw framebuffer file to `/dev/fb0`. (Check out https://github.com/zqb-all/convertfb for a tool on converting images to the right format) -=== How can I turning off key combinations? +=== How can I turn off key combinations? To disallow closing the application or otherwise tampering with the kiosk, it can be useful to remap or turn off certain keys. This can be done using (xmodmap)[https://linux.die.net/man/1/xmodmap] From 1b703ebd42d5e92ab7d921259390cf7420db940f Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Thu, 5 Dec 2024 06:50:37 -0800 Subject: [PATCH 05/17] adding todo --- asciidoc/components/kiosk.adoc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index c25f84c8..0c915ff3 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -147,4 +147,8 @@ X11: keycode 205 = keycode 206 = keycode 207 = -``` \ No newline at end of file +``` + +=== How can I debug a web app while using Firefox + +TODO: write up how to attach Dev Tools through a remote socket with `--start-debugger-server` \ No newline at end of file From 3276a5c1b5e79d6be55b07c96395e1d2a13598b2 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Mon, 9 Dec 2024 11:29:51 -0800 Subject: [PATCH 06/17] adding note about routing --- asciidoc/components/kiosk.adoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 0c915ff3..d6ba2ff9 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -149,6 +149,12 @@ X11: keycode 207 = ``` +=== How can I access services from the browser or workload + +Like any kubernetes workload, the kiosk workload can access resources that are available to the pod. This includes other services in the same kubernetes cluster through `...cluster.local` and can be controlled through the cluster's NetworkPolicies. + +If you need to access services on the node that are outside of the cluster (such as Cockpit for local administration), you need to either know your node's ip address or provide a loopback address that's not already assigned. For example, you could add the non-routable address of `172.16.0.1` to each of your nodes' `lo` device. + === How can I debug a web app while using Firefox TODO: write up how to attach Dev Tools through a remote socket with `--start-debugger-server` \ No newline at end of file From c5735ab0af32312b6df84893a591f4229e1b33c7 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 28 May 2025 09:44:27 -0700 Subject: [PATCH 07/17] Catching up with helm chart changes --- asciidoc/components/kiosk.adoc | 143 +++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 6 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index d6ba2ff9..5c19fe80 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -78,10 +78,12 @@ The application container needs the appropriate libraries to be able to communic - `libpulse0` - `libavcodec58` - `libasound2` -- `npm-default` -- `nodejs-default` +- `libgbm1` +- `libxshmfence1` +- `libdrm` +- `libgbm1` -## Flow of Display Control on System Boot +== Flow of Display Control on System Boot When the server is starting up, here's the order of which components control what's being shown on the display. @@ -149,12 +151,141 @@ X11: keycode 207 = ``` -=== How can I access services from the browser or workload +=== How can I access services from the browser or workload? Like any kubernetes workload, the kiosk workload can access resources that are available to the pod. This includes other services in the same kubernetes cluster through `...cluster.local` and can be controlled through the cluster's NetworkPolicies. If you need to access services on the node that are outside of the cluster (such as Cockpit for local administration), you need to either know your node's ip address or provide a loopback address that's not already assigned. For example, you could add the non-routable address of `172.16.0.1` to each of your nodes' `lo` device. -=== How can I debug a web app while using Firefox +=== How can I debug a web app while using Firefox? + +TODO: write up how to attach Dev Tools through a remote socket with `--start-debugger-server` + + +=== How can I force custom hostnames? + +The helm chart allows for adding additional hostname resolution in case your workload needs to refer to static ip addresses: + +[,yaml] +``` +hostAliases: +- hostnames: + - "cockpit.local" + ip: "172.16.0.1" +``` + +=== How can I connect to a service that uses self signed certs? + +If your UI needs to load from locations that are secured with self-signed certificates, this is complicated by Chromium (and related stacks such as Electron) using it's own trust store for certificates so you need to load a new one in separately. + +To do this, you can build a generic secret with an nssdb files with a script that looks like this: + +[,yaml] +``` +#!/bin/bash +export NSSDB=/tmp/cert/nssdb + + +# Create new self-signed cert +openssl req -x509 -sha256 -days 36500 -keyout mycert.key -out mycert.crt -nodes -subj "/C=US/ST=CA/O=OC/OU=Org/CN=myhost.local" -addext "subjectAltName = DNS:myhost.local" + +# Create P12 cert from self-signed +openssl pkcs12 -export -out mycert.p12 -inkey mycert.key -in mycert.crt -passout pass: -name mycert + +# Create NSSDB files +mkdir -p $NSSDB +certutil -d sql:$NSSDB -N --empty-password + +# Import P12 cert to NSSDB and add permissions +pk12util -d sql:$NSSDB -i mycert.p12 -W "" +certutil -d sql:$NSSDB -M -n "mycert" -t "TCu,," + +# Create secret from files on disk +kubectl create secret generic nssdb -n kiosk --from-file=$NSSDB +``` + +Then add the following to your helm values: + +[,yaml] +``` +workload: + nssdbSecretName: nssdb +``` + +=== Forcing a specific resolution + +Most displays will negotiate the best resolution possible but sometimes you may want to force a specific resolution. To achieve this, you can overwrite the script that does the display setup with the xinitrcOverride helm value: +[,yaml] +``` +X11: + xinitrcOverride: | + #!/bin/bash + xset -dpms + xset s off + xset s noblank + DISPLAY=:0 + + # Don't edit this part + [ ! -d "/home/user/xauthority" ] && mkdir -p "/home/user/xauthority" + touch /home/user/xauthority/.xauth + xauth -i -f /home/user/xauthority/.xauth generate $DISPLAY . trusted timeout 0 + chown -R user:users /home/user/xauthority + + # Get output name (assumes a single display) + OUTPUT=`xrandr |grep "\ connected" | cut -d " " -f1` + + # Set resolution + xrandr --output $OUTPUT --mode 1920x1080 + + ( [ -f ~/.Xmodmap ] ) && xmodmap ~/.Xmodmap + + exec icewm-session-lite +``` + +=== Change /dev/shm size + +By default, we mount in an in-memory tmpfs to be used by the application. The limit for this volume is set to 256Mi but can be adjusted with the following helm values: + +[,yaml] +``` +workload: + shm: + sizeLimit: +``` + +If you don't want or need this volume for your application, you can disable it with: + +[,yaml] +``` +workload: + shm: + enabled: false +``` + +=== Run a VNC server to allow for development in VMs + +When doing development work on a GUI application, it may be needed to run inside VMs that wouldn't have a display attached. We can get around this issue by adding a VNC server. Please note that this is not recommended in production environments due to potential security issues. + +To add a VNC server, install the helm chart with the following values: + +[,yaml] +``` +additionalContainers: +- name: vnc + image: + repository: registry.opensuse.org/home/atgracey/wallboardos/15.6/vnc + tag: "latest" + pullPolicy: IfNotPresent + ports: + - name: vnc + targetPort: 5900 + servicePort: 5900 + accessDisplay: true +``` + +Then, from the computer you want to connect from, run: + +`kubectl port-forward 5900:5900 svc/svc-vnc -n kiosk` + +You should now be able to connect your VNC client to localhost:5900 -TODO: write up how to attach Dev Tools through a remote socket with `--start-debugger-server` \ No newline at end of file From b488c897314987ca96c6ea6d73f71b41c987d0f3 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 11 Jun 2025 10:08:18 -0700 Subject: [PATCH 08/17] Adding real chart links --- asciidoc/components/kiosk.adoc | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 5c19fe80..8afc8b0e 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -40,8 +40,6 @@ To run this, you will need a system with: The preferred way to deploy on Kubernetes is through the helm chart. -TODO add link to chart once published. - We need to install helm first with: [,bash] ---- @@ -52,14 +50,14 @@ Once helm is installed, install the chart by running: [,bash] ---- -helm upgrade --install kiosk --namespace kiosk --create-namespace oci://link-to-chart --version=0.1.0 +helm upgrade --install kiosk --namespace kiosk --create-namespace oci://registry.suse.com/suse/kiosk/kiosk-chart --version=1.0.0 ---- To change the URL that's loaded: [,bash] ---- -helm upgrade --install kiosk --namespace kiosk --create-namespace oci://link-to-chart --version=0.1.0 --set workload.url=http://.svc..cluster.local +helm upgrade --install kiosk --namespace kiosk --create-namespace oci://registry.suse.com/suse/kiosk/kiosk-chart --version=1.0.0 --set workload.url=http://.svc..cluster.local ---- @@ -82,6 +80,8 @@ The application container needs the appropriate libraries to be able to communic - `libxshmfence1` - `libdrm` - `libgbm1` +- `libgdm1` + == Flow of Display Control on System Boot @@ -108,9 +108,9 @@ When X11 starts up, it will take over the display and show a desktop. When we do Lastly, the application itself will be composited on top of the background. For most kiosk applications, you will likely want to have this be fullscreen so the background becomes hidden. -== FAQs +== Customizations -=== How can I adjust what's displayed during boot? +=== Adjusting what's displayed during boot There are several parts of the boot process that can be branded based on your individual needs. @@ -124,7 +124,7 @@ Masking `console-getty.service` and `getty@tty1.service` will remove the login p Doing both of these will show a blank screen with a flashing cursor in the top-left corner. To show something on screen between the GRUB splash screen, you could use `plymouth` or just `cat` a raw framebuffer file to `/dev/fb0`. (Check out https://github.com/zqb-all/convertfb for a tool on converting images to the right format) -=== How can I turn off key combinations? +=== Turning off key combinations To disallow closing the application or otherwise tampering with the kiosk, it can be useful to remap or turn off certain keys. This can be done using (xmodmap)[https://linux.die.net/man/1/xmodmap] @@ -151,18 +151,13 @@ X11: keycode 207 = ``` -=== How can I access services from the browser or workload? +=== Accessing services from the GUI workload Like any kubernetes workload, the kiosk workload can access resources that are available to the pod. This includes other services in the same kubernetes cluster through `...cluster.local` and can be controlled through the cluster's NetworkPolicies. If you need to access services on the node that are outside of the cluster (such as Cockpit for local administration), you need to either know your node's ip address or provide a loopback address that's not already assigned. For example, you could add the non-routable address of `172.16.0.1` to each of your nodes' `lo` device. -=== How can I debug a web app while using Firefox? - -TODO: write up how to attach Dev Tools through a remote socket with `--start-debugger-server` - - -=== How can I force custom hostnames? +=== How can I add custom hostnames? The helm chart allows for adding additional hostname resolution in case your workload needs to refer to static ip addresses: @@ -174,7 +169,7 @@ hostAliases: ip: "172.16.0.1" ``` -=== How can I connect to a service that uses self signed certs? +=== Connecting to a service that uses self signed certs If your UI needs to load from locations that are secured with self-signed certificates, this is complicated by Chromium (and related stacks such as Electron) using it's own trust store for certificates so you need to load a new one in separately. @@ -215,6 +210,7 @@ workload: === Forcing a specific resolution Most displays will negotiate the best resolution possible but sometimes you may want to force a specific resolution. To achieve this, you can overwrite the script that does the display setup with the xinitrcOverride helm value: + [,yaml] ``` X11: @@ -242,9 +238,9 @@ X11: exec icewm-session-lite ``` -=== Change /dev/shm size +=== Changing /dev/shm size -By default, we mount in an in-memory tmpfs to be used by the application. The limit for this volume is set to 256Mi but can be adjusted with the following helm values: +By default, the chart mounts in an in-memory tmpfs to be used by the application. The limit for this volume is set to 256Mi but can be adjusted with the following helm values: [,yaml] ``` @@ -262,11 +258,15 @@ workload: enabled: false ``` -=== Run a VNC server to allow for development in VMs -When doing development work on a GUI application, it may be needed to run inside VMs that wouldn't have a display attached. We can get around this issue by adding a VNC server. Please note that this is not recommended in production environments due to potential security issues. +=== Running additional sidecars in the same pod + +If you have additional workloads that need to get run as sidecars for your GUI application, you can do that by adding them to the `additionalContainers` section in the values file. If the container needs access to the display, you can achieve that with `accessDisplay: true`. + + +An example of where this can be useful is when doing development work on a GUI application. It may be needed to run inside VMs that wouldn't have a display attached. We can get around this issue by adding a VNC server. (Please note that this is not recommended in production environments due to potential security issues) -To add a VNC server, install the helm chart with the following values: +To add a VNC server, install the helm chart with the following values included: [,yaml] ``` From f5a53ea5ef9042bc0a768cf50fc88acd2116925c Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 11 Jun 2025 10:11:04 -0700 Subject: [PATCH 09/17] removing duplicate line --- asciidoc/components/kiosk.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 8afc8b0e..98d7a92a 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -79,7 +79,6 @@ The application container needs the appropriate libraries to be able to communic - `libgbm1` - `libxshmfence1` - `libdrm` -- `libgbm1` - `libgdm1` From 75639dfca23fe4fce7005fa6a589c08db65bf7b4 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 11 Jun 2025 10:14:39 -0700 Subject: [PATCH 10/17] restructuring a section --- asciidoc/components/kiosk.adoc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 98d7a92a..0824773a 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -154,11 +154,9 @@ X11: Like any kubernetes workload, the kiosk workload can access resources that are available to the pod. This includes other services in the same kubernetes cluster through `...cluster.local` and can be controlled through the cluster's NetworkPolicies. -If you need to access services on the node that are outside of the cluster (such as Cockpit for local administration), you need to either know your node's ip address or provide a loopback address that's not already assigned. For example, you could add the non-routable address of `172.16.0.1` to each of your nodes' `lo` device. +Note: If you need to access services on the node that are outside of the cluster (such as Cockpit for local administration), you need to either know your node's ip address or provide a loopback address that's not already assigned. For example, you could add the non-routable address of `172.16.0.1` to each of your nodes' `lo` device. -=== How can I add custom hostnames? - -The helm chart allows for adding additional hostname resolution in case your workload needs to refer to static ip addresses: +The helm chart allows for adding additional hostname resolution in case your workload needs to refer to static ip addresses: [,yaml] ``` From f0429fd8f4ff1663b67692781e2c6d0c04f97949 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 20 Aug 2025 17:09:02 -0600 Subject: [PATCH 11/17] Adding EIB section --- asciidoc/components/kiosk.adoc | 50 +++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 0824773a..3a3fd221 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -88,7 +88,7 @@ When the server is starting up, here's the order of which components control wha - UEFI (Firmware) -The first thing you see is determined by the system's firmware. Different system manufactures provide more or less control over this portion of the process. +The first thing you see is determined by the system's firmware. Different system manufacturers provide more or less control over this portion of the process. - Grub Bootloader @@ -113,9 +113,7 @@ Lastly, the application itself will be composited on top of the background. For There are several parts of the boot process that can be branded based on your individual needs. - -TODO: The Grub2 menu can be bypassed or branded [...] - +The Grub2 menu can be bypassed or branded as show in [https://documentation.suse.com/sles/15-SP6/html/SLES-all/cha-grub2.html] Adding `quiet` to your kernel bootargs will remove the text that is seen on boot of linux systems. @@ -286,3 +284,47 @@ Then, from the computer you want to connect from, run: You should now be able to connect your VNC client to localhost:5900 +=== Installing with with Edge Image Builder + +To build a full stack kiosk installation image, you can use Edge Image Builder (EIB) with the following steps: + +1. Setup a basic EIB project according to the documentation at [https://github.com/suse-edge/edge-image-builder/blob/main/docs/building-images.md] + +2. Add the kubernetes version you want to run along with the helm chart to your eib config.yaml: + +[,yaml] +``` +kubernetes: + version: {version-kubernetes-k3s} + helm: + charts: + - name: metallb + releaseName: metallb-deployment + version: 1.0.1 + repositoryName: suse-kiosk + valuesFile: kiosk-values.yaml + targetNamespace: kiosk + createNamespace: true + repositories: + - name: suse-kiosk + url: oci://registry.suse.com/suse/kiosk +``` + +3. Add your values file at `kubernetes/helm/values/kiosk-values.yaml` + +[,yaml] +``` +workload: + url: https://www.youtube.com/watch?v=Y5-dnGqbrDQ +``` + +1. Build the image with + +[,bash] +``` +podman run --rm -it -v $PWD:/eib \ + registry.suse.com/edge/{version-edge-registry}/edge-image-builder:{version-eib} \ + build --definition-file config.yaml +``` + +You can then burn and boot the resulting image to install a single node k8s cluster \ No newline at end of file From be2ee5887f3180a861fcc946449dd9a18d90d405 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 20 Aug 2025 17:09:46 -0600 Subject: [PATCH 12/17] finishing the sentence... --- asciidoc/components/kiosk.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 3a3fd221..7e2ecf1c 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -327,4 +327,5 @@ podman run --rm -it -v $PWD:/eib \ build --definition-file config.yaml ``` -You can then burn and boot the resulting image to install a single node k8s cluster \ No newline at end of file +You can then burn and boot the resulting image to install a single node k8s cluster running a kiosk workload. + \ No newline at end of file From feeb3a73a816db9237a27f61ba3318f67066b2a5 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Wed, 27 Aug 2025 12:04:34 -0600 Subject: [PATCH 13/17] fixing list? --- asciidoc/components/kiosk.adoc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 7e2ecf1c..4c347bc3 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -291,8 +291,7 @@ To build a full stack kiosk installation image, you can use Edge Image Builder ( 1. Setup a basic EIB project according to the documentation at [https://github.com/suse-edge/edge-image-builder/blob/main/docs/building-images.md] 2. Add the kubernetes version you want to run along with the helm chart to your eib config.yaml: - -[,yaml] ++ ``` kubernetes: version: {version-kubernetes-k3s} @@ -311,15 +310,15 @@ kubernetes: ``` 3. Add your values file at `kubernetes/helm/values/kiosk-values.yaml` - ++ [,yaml] ``` workload: url: https://www.youtube.com/watch?v=Y5-dnGqbrDQ ``` -1. Build the image with - +4. Build the image with ++ [,bash] ``` podman run --rm -it -v $PWD:/eib \ @@ -327,5 +326,4 @@ podman run --rm -it -v $PWD:/eib \ build --definition-file config.yaml ``` -You can then burn and boot the resulting image to install a single node k8s cluster running a kiosk workload. - \ No newline at end of file +You can then burn and boot the resulting image to setup a single node k8s cluster running a kiosk workload. From 3306009f7831153dcc5fb04dd1e2b776823929e1 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Thu, 11 Sep 2025 13:49:22 -0700 Subject: [PATCH 14/17] Adding Helm CRD example --- asciidoc/components/kiosk.adoc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 4c347bc3..5eb5099e 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -60,6 +60,25 @@ To change the URL that's loaded: helm upgrade --install kiosk --namespace kiosk --create-namespace oci://registry.suse.com/suse/kiosk/kiosk-chart --version=1.0.0 --set workload.url=http://.svc..cluster.local ---- +=== Deployment in K3s with the HelmChart Resource + +If you are using k3s, you can use this yaml to deploy the chart for you: + +[,yaml] +---- +apiVersion: helm.cattle.io/v1 +kind: HelmChart +metadata: + name: kiosk-chart + namespace: kube-system +spec: + chart: oci://registry.suse.com/suse/kiosk/kiosk-chart + targetNamespace: kiosk + createNamespace: true + valuesContent: + workload: + url: "http://.svc..cluster.local" +---- == Custom Workloads From 0d759278b4f06984e6d15929c53597efdf532e96 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Thu, 11 Sep 2025 13:53:06 -0700 Subject: [PATCH 15/17] cleaning up framebuffer paragraph --- asciidoc/components/kiosk.adoc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 5eb5099e..07522506 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -111,7 +111,7 @@ The first thing you see is determined by the system's firmware. Different system - Grub Bootloader -Grub then takes over from the firmware and shows the boot menu. This step can be branded or skipped depending on needs. +Grub then takes over from the firmware and shows the boot menu. This step can be branded or skipped depending on needs as shown - Linux Framebuffer device @@ -138,7 +138,9 @@ Adding `quiet` to your kernel bootargs will remove the text that is seen on boot Masking `console-getty.service` and `getty@tty1.service` will remove the login prompt. -Doing both of these will show a blank screen with a flashing cursor in the top-left corner. To show something on screen between the GRUB splash screen, you could use `plymouth` or just `cat` a raw framebuffer file to `/dev/fb0`. (Check out https://github.com/zqb-all/convertfb for a tool on converting images to the right format) +Doing both of these will show a blank screen with a flashing cursor in the top-left corner. + +How to show something on screen between the GRUB splash screen and X11 starting up is dependant on what hardware you are using. If your system has a framebuffer, you could use `plymouth` or just `cat` a raw framebuffer file to `/dev/fb0`. (Check out https://github.com/zqb-all/convertfb for a tool on converting images to the right format) === Turning off key combinations From d81aca43ae043c4c6ecb3ecabcac9c54717e6ab4 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Fri, 12 Sep 2025 07:43:05 -0700 Subject: [PATCH 16/17] Changing requirements for usage --- asciidoc/components/kiosk.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 07522506..1f48f735 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -30,11 +30,9 @@ Both the PulseAudio and X11 containers use udev to communicate with the hardware == Prerequisites -To run this, you will need a system with: -- SLE Micro 5.5+ -- Either K3s or RKE2 1.29+ -- Helm installed (if not using EIB or Fleet) -- A display attached (when running in a VM, make sure to use a virtual display instead of the "console" output) +To run this, you will need a SUSE Edge cluster with latest version available and a display attached + +NOTE: when running in a VM, make sure to use a virtual display instead of the "console" output == Deployment @@ -121,6 +119,8 @@ Once the system starts booting and execution is handed from the bootloader to th When X11 starts up, it will take over the display and show a desktop. When we don't run a taskbar or any applications, you will only see the background. By replacing the background, you can change what's displayed while the application is starting. +This can be done with + - Application Lastly, the application itself will be composited on top of the background. For most kiosk applications, you will likely want to have this be fullscreen so the background becomes hidden. From 657d016a08c882f764b11eab9480bb4692b89e60 Mon Sep 17 00:00:00 2001 From: Andrew Gracey Date: Fri, 12 Sep 2025 07:44:55 -0700 Subject: [PATCH 17/17] removing install of helm --- asciidoc/components/kiosk.adoc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/asciidoc/components/kiosk.adoc b/asciidoc/components/kiosk.adoc index 1f48f735..b69a3268 100644 --- a/asciidoc/components/kiosk.adoc +++ b/asciidoc/components/kiosk.adoc @@ -36,15 +36,9 @@ NOTE: when running in a VM, make sure to use a virtual display instead of the "c == Deployment -The preferred way to deploy on Kubernetes is through the helm chart. +The preferred way to deploy the kiosk solution on Kubernetes is through the provided helm chart. -We need to install helm first with: -[,bash] ----- -curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash ----- - -Once helm is installed, install the chart by running: +Install the chart by running: [,bash] ----