From 3ee94b83d69dba9aa5c4cdca0a0d64476e249427 Mon Sep 17 00:00:00 2001 From: thespad Date: Fri, 27 Mar 2026 11:08:12 +0000 Subject: [PATCH] Lots of init changes --- Dockerfile | 24 +++++++++++++++---- Dockerfile.aarch64 | 24 +++++++++++++++---- README.md | 11 ++++++--- readme-vars.yml | 8 +++++-- .../s6-overlay/s6-rc.d/init-config-kasm/run | 5 ++++ root/etc/s6-overlay/s6-rc.d/svc-docker/run | 11 --------- .../dependencies.d/svc-docker} | 0 .../s6-overlay/s6-rc.d/svc-kasm-wizard/run | 7 ++---- .../dependencies.d/svc-docker} | 0 root/etc/s6-overlay/s6-rc.d/svc-kasm/down | 1 + root/etc/s6-overlay/s6-rc.d/svc-kasm/finish | 4 ++++ root/etc/s6-overlay/s6-rc.d/svc-kasm/run | 15 ++++++++++++ root/etc/s6-overlay/s6-rc.d/svc-kasm/type | 1 + root/etc/s6-overlay/s6-rc.d/svc-kasm/up | 1 + .../contents.d/svc-kasm} | 0 15 files changed, 81 insertions(+), 31 deletions(-) rename root/etc/s6-overlay/s6-rc.d/{svc-docker/dependencies.d/init-config-kasm => svc-kasm-wizard/dependencies.d/svc-docker} (100%) rename root/etc/s6-overlay/s6-rc.d/{svc-kasm-wizard/dependencies.d/init-config-kasm => svc-kasm/dependencies.d/svc-docker} (100%) create mode 100644 root/etc/s6-overlay/s6-rc.d/svc-kasm/down create mode 100755 root/etc/s6-overlay/s6-rc.d/svc-kasm/finish create mode 100755 root/etc/s6-overlay/s6-rc.d/svc-kasm/run create mode 100644 root/etc/s6-overlay/s6-rc.d/svc-kasm/type create mode 100644 root/etc/s6-overlay/s6-rc.d/svc-kasm/up rename root/etc/s6-overlay/s6-rc.d/{svc-kasm-wizard/dependencies.d/init-services => user/contents.d/svc-kasm} (100%) diff --git a/Dockerfile b/Dockerfile index 53177bf..7a369a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ RUN \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ tee /etc/apt/sources.list.d/nvidia-container-toolkit.list && \ curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - printf "Package: docker-ce docker-ce-cli docker-ce-rootless-extras\nPin: version 5:28.* \nPin-Priority: 1001" > /etc/apt/preferences.d/docker && \ + printf "Package: docker-ce docker-ce-cli docker-ce-rootless-extras\nPin: version 5:29.* \nPin-Priority: 1001" > /etc/apt/preferences.d/docker && \ apt-get install -y --no-install-recommends \ btrfs-progs \ build-essential \ @@ -59,13 +59,13 @@ RUN \ https://raw.githubusercontent.com/moby/moby/master/hack/dind && \ chmod +x /usr/local/bin/dind && \ echo 'hosts: files dns' > /etc/nsswitch.conf && \ - echo "**** setup wizard ****" && \ mkdir -p /wizard && \ if [ -z ${KASM_VERSION+x} ]; then \ KASM_VERSION=$(curl -sX GET 'https://api.github.com/repos/kasmtech/kasm-install-wizard/releases/latest' \ | jq -r '.name'); \ fi && \ echo "${KASM_VERSION}" > /version.txt && \ + echo "**** add wizard ****" && \ curl -o \ /tmp/wizard.tar.gz -L \ # "https://github.com/kasmtech/kasm-install-wizard/archive/refs/tags/${KASM_VERSION}.tar.gz" && \ @@ -77,7 +77,7 @@ RUN \ sed -i "/installFlags = \[.*/a \ installFlags.push('-O');" /wizard/index.js && \ cd /wizard && \ npm install && \ - echo "**** add installer ****" && \ + echo "**** add image definitions ****" && \ curl -o \ /tmp/images.tar.gz -L \ #"https://kasm-ci.s3.amazonaws.com/${KASM_VERSION}-images-combined.tar.gz" && \ @@ -85,10 +85,10 @@ RUN \ tar xf \ /tmp/images.tar.gz -C \ / && \ + echo "**** add installer ****" && \ curl -o \ /tmp/kasm.tar.gz -L \ - # "https://github.com/kasmtech/kasm-install-wizard/releases/download/${KASM_VERSION}/kasm_release.tar.gz" && \ - "https://kasm-static-content.s3.amazonaws.com/kasm_release_1.18.1.tar.gz" && \ + "https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz" && \ tar xf \ /tmp/kasm.tar.gz -C \ / && \ @@ -96,11 +96,25 @@ RUN \ sed -i \ '/alembic_version/s/.*/alembic_version: '${ALVERSION}'/' \ /kasm_release/conf/database/seed_data/default_images_a* && \ + # Don't check for open ports sed -i 's/-N -e -H/-N -B -e -H/g' /kasm_release/upgrade.sh && \ echo "exit 0" > /kasm_release/install_dependencies.sh && \ + # Add our customisations /kasm_release/bin/utils/yq_$(uname -m) -i \ '.services.proxy.volumes += "/kasm_release/www/img/thumbnails:/srv/www/img/thumbnails"' \ /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.proxy.depends_on = {"kasm_manager":{"condition": "service_healthy"},"kasm_api":{"condition": "service_healthy"},"kasm_agent":{"condition": "service_started"},"kasm_guac":{"condition": "service_started"},"kasm_rdp_https_gateway":{"condition": "service_started"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_manager.depends_on = {"db":{"condition": "service_healthy"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_api.depends_on = {"db":{"condition": "service_healthy"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_rdp_https_gateway.depends_on = {"proxy":{"condition": "service_started"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ echo "**** copy assets ****" && \ cp \ /kasm_release/www/img/thumbnails/*.png /kasm_release/www/img/thumbnails/*.svg \ diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 index 094becd..96ae46d 100644 --- a/Dockerfile.aarch64 +++ b/Dockerfile.aarch64 @@ -28,7 +28,7 @@ RUN \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ tee /etc/apt/sources.list.d/nvidia-container-toolkit.list && \ curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - printf "Package: docker-ce docker-ce-cli docker-ce-rootless-extras\nPin: version 5:28.* \nPin-Priority: 1001" > /etc/apt/preferences.d/docker && \ + printf "Package: docker-ce docker-ce-cli docker-ce-rootless-extras\nPin: version 5:29.* \nPin-Priority: 1001" > /etc/apt/preferences.d/docker && \ apt-get install -y --no-install-recommends \ btrfs-progs \ build-essential \ @@ -59,13 +59,13 @@ RUN \ https://raw.githubusercontent.com/moby/moby/master/hack/dind && \ chmod +x /usr/local/bin/dind && \ echo 'hosts: files dns' > /etc/nsswitch.conf && \ - echo "**** setup wizard ****" && \ mkdir -p /wizard && \ if [ -z ${KASM_VERSION+x} ]; then \ KASM_VERSION=$(curl -sX GET 'https://api.github.com/repos/kasmtech/kasm-install-wizard/releases/latest' \ | jq -r '.name'); \ fi && \ echo "${KASM_VERSION}" > /version.txt && \ + echo "**** add wizard ****" && \ curl -o \ /tmp/wizard.tar.gz -L \ # "https://github.com/kasmtech/kasm-install-wizard/archive/refs/tags/${KASM_VERSION}.tar.gz" && \ @@ -77,7 +77,7 @@ RUN \ sed -i "/installFlags = \[.*/a \ installFlags.push('-O');" /wizard/index.js && \ cd /wizard && \ npm install && \ - echo "**** add installer ****" && \ + echo "**** add image definitions ****" && \ curl -o \ /tmp/images.tar.gz -L \ #"https://kasm-ci.s3.amazonaws.com/${KASM_VERSION}-images-combined.tar.gz" && \ @@ -85,10 +85,10 @@ RUN \ tar xf \ /tmp/images.tar.gz -C \ / && \ + echo "**** add installer ****" && \ curl -o \ /tmp/kasm.tar.gz -L \ - # "https://github.com/kasmtech/kasm-install-wizard/releases/download/${KASM_VERSION}/kasm_release.tar.gz" && \ - "https://kasm-static-content.s3.amazonaws.com/kasm_release_1.18.1.tar.gz" && \ + "https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz" && \ tar xf \ /tmp/kasm.tar.gz -C \ / && \ @@ -96,11 +96,25 @@ RUN \ sed -i \ '/alembic_version/s/.*/alembic_version: '${ALVERSION}'/' \ /kasm_release/conf/database/seed_data/default_images_a* && \ + # Don't check for open ports sed -i 's/-N -e -H/-N -B -e -H/g' /kasm_release/upgrade.sh && \ echo "exit 0" > /kasm_release/install_dependencies.sh && \ + # Add our customisations /kasm_release/bin/utils/yq_$(uname -m) -i \ '.services.proxy.volumes += "/kasm_release/www/img/thumbnails:/srv/www/img/thumbnails"' \ /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.proxy.depends_on = {"kasm_manager":{"condition": "service_healthy"},"kasm_api":{"condition": "service_started"},"kasm_agent":{"condition": "service_started"},"kasm_guac":{"condition": "service_started"},"kasm_rdp_https_gateway":{"condition": "service_started"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_manager.depends_on = {"db":{"condition": "service_healthy"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_api.depends_on = {"db":{"condition": "service_healthy"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ + /kasm_release/bin/utils/yq_$(uname -m) -i \ + '.services.kasm_rdp_https_gateway.depends_on = {"proxy":{"condition": "service_started"},"rdp_gateway":{"condition": "service_healthy"}}' \ + /kasm_release/docker/docker-compose-all.yaml && \ echo "**** copy assets ****" && \ cp \ /kasm_release/www/img/thumbnails/*.png /kasm_release/www/img/thumbnails/*.svg \ diff --git a/README.md b/README.md index e1cef78..f272234 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,11 @@ Access the installation wizard at https://`your ip`:3000 and follow the instruct Currently Synology systems are not supported due to them blocking CPU scheduling in their Kernel. -### Updating KASM +### Upgrading KASM -In order to update kasm, first make sure you are using the latest docker image, and then perform the in app update in the admin panel. Docker image update and recreation of container alone won't update kasm. +In order to upgrade kasm, first make sure you are using the latest docker image, and then perform the in app update in the admin panel. Docker image update and recreation of container alone won't upgrade kasm. + +Following the upgrade, you will need to update any workspace image tags to match the new version. ### GPU Support @@ -127,6 +129,7 @@ services: ports: - 3000:3000 - 443:443 + stop_grace_period: "90s" #optional restart: unless-stopped ``` @@ -147,6 +150,7 @@ docker run -d \ -v /path/to/kasm/profiles:/profiles `#optional` \ -v /dev/input:/dev/input `#optional` \ -v /run/udev/data:/run/udev/data `#optional` \ + --stop-timeout="90s" `#optional` \ --restart unless-stopped \ lscr.io/linuxserver/kasm:latest ``` @@ -167,6 +171,7 @@ Containers are configured using parameters passed at runtime (such as those abov | `-v /profiles` | Optionally specify a path for persistent profile storage. | | `-v /dev/input` | Optional for gamepad support. | | `-v /run/udev/data` | Optional for gamepad support. | +| `--stop-timeout=` | Increase container shutdown delay to give Kasm services time to stop cleanly. | | `--security-opt apparmor=rootlesskit` | Some hosts require this on top of privileged for namespacing to work properly inside the DinD layer. | ## Environment variables from files (Docker secrets) @@ -313,7 +318,7 @@ Once registered you can define the dockerfile to use with `-f Dockerfile.aarch64 ## Versions -* **22.03.26:** - Update for 1.18.1 release. Use rolling service images. Update docker pin to v29. +* **22.03.26:** - Update for 1.18.1 release. Use rolling service images. * **13.11.25:** - Pin docker to v28 to avoid API deprecation issues. * **22.10.25:** - Update for 1.18.0 release. * **08.06.25:** - Deprecate develop branch. diff --git a/readme-vars.yml b/readme-vars.yml index 2069b3b..85cbe89 100644 --- a/readme-vars.yml +++ b/readme-vars.yml @@ -42,6 +42,8 @@ opt_param_volumes: opt_security_opt_param: true opt_security_opt_param_vars: - {run_var: "apparmor=rootlesskit", compose_var: "apparmor:rootlesskit", desc: "Some hosts require this on top of privileged for namespacing to work properly inside the DinD layer."} +opt_custom_params: + - {name: "stop-timeout", name_compose: "stop_grace_period", value: "90s", desc: "Increase container shutdown delay to give Kasm services time to stop cleanly."} unraid_template: false privileged: true # application setup block @@ -60,9 +62,11 @@ app_setup_block: | Currently Synology systems are not supported due to them blocking CPU scheduling in their Kernel. - ### Updating KASM + ### Upgrading KASM - In order to update kasm, first make sure you are using the latest docker image, and then perform the in app update in the admin panel. Docker image update and recreation of container alone won't update kasm. + In order to upgrade kasm, first make sure you are using the latest docker image, and then perform the in app update in the admin panel. Docker image update and recreation of container alone won't upgrade kasm. + + Following the upgrade, you will need to update any workspace image tags to match the new version. ### GPU Support diff --git a/root/etc/s6-overlay/s6-rc.d/init-config-kasm/run b/root/etc/s6-overlay/s6-rc.d/init-config-kasm/run index f72dd96..24015ae 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-config-kasm/run +++ b/root/etc/s6-overlay/s6-rc.d/init-config-kasm/run @@ -8,6 +8,11 @@ fi # Workaround for running in a rootless docker environment sed -i '/set -e/d' /etc/init.d/docker +# Clean up old socket +if [[ -S /var/run/docker.sock ]]; then + rm -f /var/run/docker.sock +fi + # Login to Dockerhub if [[ -n "${DOCKER_HUB_USERNAME}" ]]; then docker login --username "${DOCKER_HUB_USERNAME}" --password "${DOCKER_HUB_PASSWORD}" diff --git a/root/etc/s6-overlay/s6-rc.d/svc-docker/run b/root/etc/s6-overlay/s6-rc.d/svc-docker/run index 710a540..418368b 100755 --- a/root/etc/s6-overlay/s6-rc.d/svc-docker/run +++ b/root/etc/s6-overlay/s6-rc.d/svc-docker/run @@ -1,14 +1,3 @@ #!/usr/bin/with-contenv bash -_term() { - if [ -f "/opt/kasm/bin/stop" ]; then - echo "Caught SIGTERM signal!" - echo "Stopping Kasm Containers" - /opt/kasm/bin/stop - pid=$(pidof stop) - # terminate when the stop process dies - tail --pid=${pid} -f /dev/null - fi -} - exec /usr/local/bin/dockerd-entrypoint.sh -l error --data-root /opt/docker diff --git a/root/etc/s6-overlay/s6-rc.d/svc-docker/dependencies.d/init-config-kasm b/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/svc-docker similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/svc-docker/dependencies.d/init-config-kasm rename to root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/svc-docker diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/run b/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/run index a3dd2ea..eabe414 100755 --- a/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/run +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/run @@ -1,11 +1,8 @@ #!/usr/bin/with-contenv bash # Wait for docker to be up -while true; do - if [[ -S "/var/run/docker.sock" ]]; then - break - fi - sleep 1 +while [[ ! -S /var/run/docker.sock ]]; do + sleep 1 done # Don't do anything if wizard is disabled diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/init-config-kasm b/root/etc/s6-overlay/s6-rc.d/svc-kasm/dependencies.d/svc-docker similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/init-config-kasm rename to root/etc/s6-overlay/s6-rc.d/svc-kasm/dependencies.d/svc-docker diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm/down b/root/etc/s6-overlay/s6-rc.d/svc-kasm/down new file mode 100644 index 0000000..062ffef --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm/down @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/svc-kasm/finish \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm/finish b/root/etc/s6-overlay/s6-rc.d/svc-kasm/finish new file mode 100755 index 0000000..e99a399 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm/finish @@ -0,0 +1,4 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +/opt/kasm/bin/stop diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm/run b/root/etc/s6-overlay/s6-rc.d/svc-kasm/run new file mode 100755 index 0000000..4ee01b5 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm/run @@ -0,0 +1,15 @@ +#!/usr/bin/with-contenv bash +# shellcheck shell=bash + +while [[ ! -S /var/run/docker.sock ]]; do + sleep 1 +done + +# Stop any running containers that shouldn't be +docker ps -q | xargs docker stop &> /dev/null + +if [[ -f /opt/kasm/bin/start ]]; then + /opt/kasm/bin/start +else + sleep infinity +fi diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm/type b/root/etc/s6-overlay/s6-rc.d/svc-kasm/type new file mode 100644 index 0000000..3d92b15 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm/type @@ -0,0 +1 @@ +oneshot \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm/up b/root/etc/s6-overlay/s6-rc.d/svc-kasm/up new file mode 100644 index 0000000..7198185 --- /dev/null +++ b/root/etc/s6-overlay/s6-rc.d/svc-kasm/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/svc-kasm/run \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/init-services b/root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-kasm similarity index 100% rename from root/etc/s6-overlay/s6-rc.d/svc-kasm-wizard/dependencies.d/init-services rename to root/etc/s6-overlay/s6-rc.d/user/contents.d/svc-kasm