Compare commits

..

4 Commits

Author SHA1 Message Date
Alexandre
0fc84fa6da docs(claude_desktop): document Selkies ingress fix 2026-07-16 17:52:29 +02:00
Alexandre
0ee96086c3 chore(claude_desktop): bump version to 1.31 2026-07-16 17:51:12 +02:00
Alexandre
462767d34e fix(claude_desktop): proxy Selkies API websocket in ingress 2026-07-16 17:41:15 +02:00
Alexandre
32765daf99 fix(claude_desktop): proxy Selkies API websocket in ingress 2026-07-16 17:41:00 +02:00
32 changed files with 120 additions and 127 deletions

View File

@@ -1,7 +1,4 @@
## 1.82.1 (2026-07-16)
- Update to latest version from autobrr/autobrr (changelog : https://github.com/autobrr/autobrr/releases)
## 1.81.0 (2026-07-04)
- Update to latest version from autobrr/autobrr (changelog : https://github.com/autobrr/autobrr/releases)
## 1.80.0 (2026-06-05)

View File

@@ -16,7 +16,7 @@
ARG BUILD_FROM
ARG BUILD_VERSION
ARG BUILD_UPSTREAM="1.82.1"
ARG BUILD_UPSTREAM="1.81.0"
FROM ${BUILD_FROM}
##################

View File

@@ -108,4 +108,4 @@ schema:
slug: autobrr
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/autobrr
version: "1.82.1"
version: "1.81.0"

View File

@@ -1,8 +1,8 @@
{
"last_update": "2026-07-16",
"last_update": "2026-07-04",
"repository": "alexbelgium/hassio-addons",
"slug": "autborr",
"source": "github",
"upstream_repo": "autobrr/autobrr",
"upstream_version": "1.82.1"
"upstream_version": "1.81.0"
}

View File

@@ -1,5 +1,3 @@
## source-20260716.02 (16-07-2026)
- Minor bugs fixed
## source-20260716 (16-07-2026)
- Minor bugs fixed
## source-20260714 (14-07-2026)

View File

@@ -1,7 +1,4 @@
## 20260716 (2026-07-16)
- Update to latest version from tphakala/birdnet-go (changelog : https://github.com/tphakala/birdnet-go/releases)
## 20260712 (2026-07-13)
- Update to latest version from tphakala/birdnet-go (changelog : https://github.com/tphakala/birdnet-go/releases)
## nightly-20260615-4 (09-07-2026)

View File

@@ -128,4 +128,4 @@ slug: birdnet-go
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-go
usb: true
version: "20260716"
version: "20260712"

View File

@@ -2,10 +2,10 @@
"github_beta": true,
"github_exclude": "-4",
"github_fulltag": true,
"last_update": "2026-07-16",
"last_update": "2026-07-13",
"repository": "alexbelgium/hassio-addons",
"slug": "birdnet-go",
"source": "github",
"upstream_repo": "tphakala/birdnet-go",
"upstream_version": "20260716"
"upstream_version": "20260712"
}

View File

@@ -1,7 +1,4 @@
## 1.92.140-ls113 (2026-07-16)
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)
## 1.92.139-ls112 (2026-07-11)
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)

View File

@@ -69,5 +69,5 @@ slug: brave
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "1.92.140-ls113"
version: "1.92.139-ls112"
video: true

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "true",
"last_update": "2026-07-16",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "brave",
"source": "github",
"upstream_repo": "linuxserver/docker-brave",
"upstream_version": "1.92.140-ls113"
"upstream_version": "1.92.139-ls112"
}

View File

@@ -1,7 +1,4 @@
## version-ae9a7fca (2026-07-16)
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)
## version-30a7c401 (2026-07-11)
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)

View File

@@ -71,5 +71,5 @@ slug: chromium
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "version-ae9a7fca"
version: "version-30a7c401"
video: true

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "true",
"last_update": "2026-07-16",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "chromium",
"source": "github",
"upstream_repo": "linuxserver/docker-chromium",
"upstream_version": "version-ae9a7fca"
"upstream_version": "version-30a7c401"
}

View File

@@ -1,7 +1,4 @@
## 2.55.0 (2026-07-16)
- Update to latest version from browserless/chrome (changelog : https://github.com/browserless/chrome/releases)
## 2.54.2 (2026-07-04)
- Update to latest version from browserless/chrome (changelog : https://github.com/browserless/chrome/releases)

View File

@@ -86,5 +86,5 @@ schema:
slug: browserless_chrome
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/browserless_chrome
version: "2.55.0"
version: "2.54.2"
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]/docs"

View File

@@ -1,9 +1,9 @@
{
"github_tagfilter": "v",
"last_update": "2026-07-16",
"last_update": "2026-07-04",
"repository": "alexbelgium/hassio-addons",
"slug": "browserless_chrome",
"source": "github",
"upstream_repo": "browserless/chrome",
"upstream_version": "2.55.0"
"upstream_version": "2.54.2"
}

View File

@@ -1,6 +1,3 @@
## 0.55.8 (2026-07-16)
- Update to latest version from linuxserver/docker-changedetection.io (changelog : https://github.com/linuxserver/docker-changedetection.io/releases)
## 0.55.7 (2026-05-30)
- Update to latest version from linuxserver/docker-changedetection.io (changelog : https://github.com/linuxserver/docker-changedetection.io/releases)

View File

@@ -34,4 +34,4 @@ schema:
slug: changedetection.io
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/changedetection.io
version: "0.55.8"
version: "0.55.7"

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "false",
"last_update": "2026-07-16",
"last_update": "2026-05-30",
"repository": "alexbelgium/hassio-addons",
"slug": "changedetection.io",
"source": "github",
"upstream_repo": "linuxserver/docker-changedetection.io",
"upstream_version": "0.55.8"
"upstream_version": "0.55.7"
}

View File

@@ -1,7 +1,6 @@
## 1.31 (16-07-2026)
- Pin the LinuxServer selkies base image to a fixed version (`…-debianbookworm-45960cc3-ls113`) instead of the rolling `…-debianbookworm` tag. The rolling tag is rebuilt continuously (and itself installs selkies "latest" at base-build time), so the desktop/stream runtime could change under the add-on with no change to its own files — builds are now reproducible and the base only moves when this value is bumped deliberately. The pinned tags resolve to exactly the image the rolling tag currently points at (amd64 `sha256:6a4d5154…`, aarch64 `sha256:90914dfd…`).
- Fix Claude Desktop never appearing — the Selkies web client stayed on "waiting for stream" forever with `libEGL warning: failed to open /dev/dri/card0: Permission denied` in the log. The LinuxServer base image grants the desktop user (`abc`) access to the `/dev/dri` render nodes in its `init-video` s6 oneshot, but that oneshot is not a dependency of `svc-xorg`/`svc-selkies`/`svc-de`, so on Home Assistant those long-running services regularly start (via `s6-setuidgid abc`) *before* `abc` has been added to the render group. Xorg/Selkies/pixelflux then open the render device without permission, the video pipeline produces no frames, and the stream never starts. Prepare the exposed DRI nodes in a new `21-gpu_permissions.sh` cont-init script instead: `cont-init.d` runs to completion before any s6-rc service starts, so `abc` is added to each node's owning group (and the node is made world read/write as a timing-independent fallback) in time for the graphical services to use the GPU. Best-effort and a no-op on hosts that expose no GPU.
- Fix Home Assistant ingress remaining on `Waiting for stream`: current Selkies WebSocket mode connects through `/api/websockets`, while the add-on inherited an older nginx template that proxied only `/websocket`. Replace the template rewrite with an explicit ingress server that proxies `/api/` to Selkies on port 8082, retains `/websocket` compatibility, and declares `ingress_port: 3001` so nginx always receives a valid listen port.
## 1.30 (16-07-2026)

View File

@@ -1,6 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/linuxserver/baseimage-selkies:arm64v8-debianbookworm-45960cc3-ls113",
"amd64": "ghcr.io/linuxserver/baseimage-selkies:amd64-debianbookworm-45960cc3-ls113"
"aarch64": "ghcr.io/linuxserver/baseimage-selkies:arm64v8-debianbookworm",
"amd64": "ghcr.io/linuxserver/baseimage-selkies:amd64-debianbookworm"
}
}

View File

@@ -20,6 +20,7 @@ environment:
TITLE: Claude Desktop
image: ghcr.io/alexbelgium/claude_desktop-{arch}
ingress: true
ingress_port: 3001
init: false
hassio_api: true
hassio_role: manager

View File

@@ -1,52 +0,0 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
# Grant the shared desktop user (abc) access to the exposed GPU render nodes *before* the
# graphical services start.
#
# The LinuxServer base image already sets up /dev/dri group access, but it does so in its
# init-video s6 oneshot, which is NOT a dependency of svc-xorg/svc-selkies/svc-de. On Home
# Assistant those long-running services routinely start (as abc, via s6-setuidgid) before
# init-video has added abc to the render group, so Xorg/Selkies/pixelflux open the render
# device with the wrong credentials and fail:
#
# libEGL warning: failed to open /dev/dri/card0: Permission denied
#
# With no usable render node the video pipeline never produces frames, so the Selkies web
# client stays on "waiting for stream" indefinitely and Claude Desktop never appears.
#
# cont-init.d runs to completion before any s6-rc service is started, so preparing the DRI
# nodes here wins that race. Everything is best-effort: a host that exposes no GPU simply has
# no nodes to touch and this is a no-op.
shopt -s nullglob
dri_nodes=(/dev/dri/card* /dev/dri/render*)
if [ "${#dri_nodes[@]}" -eq 0 ]; then
bashio::log.info "No /dev/dri render nodes exposed; skipping GPU permission setup"
exit 0
fi
for node in "${dri_nodes[@]}"; do
[ -e "$node" ] || continue
# Mirror the base image's init-video logic (add abc to the node's owning group, creating
# the group when the GID is unnamed) but early enough that the s6-setuidgid at service
# start picks the membership up.
gid="$(stat -c '%g' "$node")"
gname="$(getent group "$gid" | awk -F: '{print $1}')"
if [ -z "$gname" ]; then
gname="dri${gid}"
groupadd -o -g "$gid" "$gname" 2> /dev/null || true
fi
if ! id -G abc 2> /dev/null | tr ' ' '\n' | grep -qx "$gid"; then
usermod -a -G "$gname" abc 2> /dev/null || true
fi
# Guarantee access even where group propagation is unreliable inside the add-on sandbox:
# this is a single-user desktop container, so world read/write on the local render node
# is acceptable and removes any dependency on group-membership timing.
chmod o+rw "$node" 2> /dev/null || true
bashio::log.info "GPU: prepared ${node} (group ${gname}:${gid}) for the desktop user"
done

View File

@@ -4,34 +4,105 @@ set -e
NGINX_CONFIG=/etc/nginx/sites-available/ingress.conf
SUBFOLDER="$(bashio::addon.ingress_entry)"
INGRESS_PORT="$(bashio::addon.ingress_port)"
DOWNLOADS_PATH="${HOME:-/config}"
# Ensure subfolder ends with a trailing slash (except for root)
# Home Assistant normally strips the ingress prefix before forwarding to the add-on,
# but keep the normalized value available for diagnostics and future-safe logging.
if [[ -n "${SUBFOLDER}" && "${SUBFOLDER}" != "/" ]]; then
[[ "${SUBFOLDER}" == */ ]] || SUBFOLDER="${SUBFOLDER}/"
else
SUBFOLDER="/"
fi
cp /defaults/default.conf "${NGINX_CONFIG}"
# Claude Desktop exposes only 3001/tcp in config.yaml. Older Supervisor/bashio
# combinations can return an empty ingress_port when it is not explicit, which would
# make nginx write an invalid `listen` directive. Fall back to the declared port.
if [[ -z "${INGRESS_PORT}" ]]; then
INGRESS_PORT="3001"
fi
# Keep only the first (non-SSL) server block
awk -v n=2 '/^[[:space:]]*server[[:space:]]*\{/{n--} n>0' "${NGINX_CONFIG}" > tmpfile
mv tmpfile "${NGINX_CONFIG}"
DOWNLOADS_PATH="${DOWNLOADS_PATH%/}"
# Disable IPv6 listeners for ingress proxying
sed -i '/listen \[::\]/d' "${NGINX_CONFIG}"
cat > "${NGINX_CONFIG}" <<EOF
server {
listen ${INGRESS_PORT} default_server;
client_max_body_size 10M;
# Adapt ports and upstream paths for Home Assistant ingress
sed -i "s|3000|$(bashio::addon.ingress_port)|g" "${NGINX_CONFIG}"
sed -i "s|SUBFOLDER|/|g" "${NGINX_CONFIG}"
sed -i "s|CWS|8082|g" "${NGINX_CONFIG}"
sed -i "s|REPLACE_HOME|${HOME:-/root}|g" "${NGINX_CONFIG}"
sed -i "s|REPLACE_DOWNLOADS_PATH|${HOME:-/config}|g" "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a proxy_set_header Accept-Encoding "";' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter_once off;' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter_types *;' "${NGINX_CONFIG}"
sed -i '/proxy_buffering/a sub_filter "vnc/index.html?autoconnect" "vnc/index.html?path=%%path%%/websockify?autoconnect";' "${NGINX_CONFIG}"
sed -i "s|%%path%%|${SUBFOLDER:1}|g" "${NGINX_CONFIG}"
location / {
alias /usr/share/selkies/web/;
index index.html index.htm;
try_files \$uri \$uri/ /index.html;
}
location /devmode {
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
proxy_pass http://127.0.0.1:5173;
}
# Current Selkies WebSocket mode connects to <base>/api/websockets.
# The older linuxserver default.conf only proxies /websocket, leaving the
# dashboard loaded but stuck on "waiting for stream" under Home Assistant ingress.
location /api/ {
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
proxy_pass http://127.0.0.1:8082;
}
# Keep compatibility with older Selkies/noVNC clients and linuxserver templates.
location /websocket {
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
proxy_buffering off;
proxy_set_header Accept-Encoding "";
proxy_pass http://127.0.0.1:8082;
}
location /files {
fancyindex on;
fancyindex_footer /nginx/footer.html;
fancyindex_header /nginx/header.html;
alias ${DOWNLOADS_PATH}/;
if (-f \$request_filename) {
add_header Content-Disposition "attachment";
add_header X-Content-Type-Options "nosniff";
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/selkies/web/;
}
}
EOF
# Avoid content encoding on proxied responses to keep Selkies happy (handled by proxy_set_header Accept-Encoding insertion above)
cp "${NGINX_CONFIG}" /etc/nginx/sites-enabled

View File

@@ -1,7 +1,4 @@
## 2.2.0 (2026-07-16)
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)
## 2.1.2 (2026-07-11)
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)

View File

@@ -101,4 +101,4 @@ schema:
slug: codex
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "2.2.0"
version: "2.1.2"

View File

@@ -1,9 +1,9 @@
{
"github_beta": "true",
"last_update": "2026-07-16",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "codex",
"source": "github",
"upstream_repo": "ajslater/codex",
"upstream_version": "2.2.0"
"upstream_version": "2.1.2"
}

View File

@@ -1,7 +1,4 @@
## 1.3.0 (2026-07-16)
- Update to latest version from CollaboraOnline/online (changelog : https://github.com/CollaboraOnline/online/releases)
## 1.2.2 (2026-07-04)
- Update to latest version from CollaboraOnline/online (changelog : https://github.com/CollaboraOnline/online/releases)

View File

@@ -45,5 +45,5 @@ schema:
username: str
slug: collabora
url: https://github.com/alexbelgium/hassio-addons
version: "1.3.0"
version: "1.2.2"
webui: "[PROTO:ssl]://[HOST]:[PORT:9980]/browser/dist/admin/admin.html"

View File

@@ -1,8 +1,8 @@
{
"last_update": "2026-07-16",
"last_update": "2026-07-04",
"repository": "alexbelgium/hassio-addons",
"slug": "collabora",
"source": "github",
"upstream_repo": "CollaboraOnline/online",
"upstream_version": "1.3.0"
"upstream_version": "1.2.2"
}

View File

@@ -114,4 +114,4 @@ schema:
slug: filebrowser_quantum
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "1.4.0.2"
version: "1.4.0-2"