From 61011dc352b9d65b94233e13159f386bbcd5c0ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 10 May 2026 14:57:37 +0000 Subject: [PATCH 2/3] Fix qbittorrent restart loop on aarch64: remove /dev/stdout redirect, align run script with LSIO upstream Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/3ce233ea-82a8-4032-92ee-5bf0a7616f74 Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com> --- qbittorrent/CHANGELOG.md | 4 +++ qbittorrent/Dockerfile | 4 +-- qbittorrent/config.yaml | 2 +- .../s6-overlay/s6-rc.d/svc-qbittorrent/run | 31 +++++++++++++------ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/qbittorrent/CHANGELOG.md b/qbittorrent/CHANGELOG.md index 68bb71478c..f8e15103b2 100644 --- a/qbittorrent/CHANGELOG.md +++ b/qbittorrent/CHANGELOG.md @@ -1,4 +1,8 @@ +## 5.2.0-2 (2026-05-10) +- Fix qbittorrent restart loop on aarch64/ARM64 devices (e.g. odroid-c2): remove `> /dev/stdout` redirect in service run script that could fail on certain container runtimes, align with upstream LSIO run script (read WebUI address from config, honour LSIO_NON_ROOT_USER) +- Fix Dockerfile: add missing `-i` flag to `sed '11,13d'` so default config lines are actually removed at build time + ## 5.2.0-1 (2026-05-10) - Fix qbittorrent-nox path (/usr/bin → /app) after LSIO image update diff --git a/qbittorrent/Dockerfile b/qbittorrent/Dockerfile index bc70c27c07..ef7301c647 100644 --- a/qbittorrent/Dockerfile +++ b/qbittorrent/Dockerfile @@ -46,8 +46,8 @@ RUN \ # Set download folder to /share sed -i 's|/downloads/|/share/qBittorrent/|g' /defaults/qBittorrent.conf \ \ - # Remove fixed folders, allows connection to webUI - && sed '11,13d' /defaults/qBittorrent.conf \ + # Remove fixed folders (SavePath/ScanDirsV2/TempPath), handled by init script + && sed -i '11,13d' /defaults/qBittorrent.conf \ && echo 'WebUI\HostHeaderValidation=false' >> /defaults/qBittorrent.conf \ && echo 'WebUI\LocalHostAuth=false' >> /defaults/qBittorrent.conf \ \ diff --git a/qbittorrent/config.yaml b/qbittorrent/config.yaml index 559a7ad4f0..9b987cc09b 100644 --- a/qbittorrent/config.yaml +++ b/qbittorrent/config.yaml @@ -143,4 +143,4 @@ schema: slug: qbittorrent udev: true url: https://github.com/alexbelgium/hassio-addons -version: "5.2.0-1" +version: "5.2.0-2" diff --git a/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run b/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run index 3f9c6b71f5..7455b23854 100644 --- a/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run +++ b/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run @@ -4,6 +4,12 @@ WEBUI_PORT=${WEBUI_PORT:-8080} export PATH="/usr/local/sbin:/usr/local/bin:${PATH}" +# Read WebUI bind address from config (mirrors upstream LSIO approach) +WEBUI_ADDRESS=$(grep -Po "^WebUI\\\\Address=\K(.*)" /config/qBittorrent/qBittorrent.conf 2>/dev/null || echo "") +if [[ -z ${WEBUI_ADDRESS} ]] || [[ ${WEBUI_ADDRESS} == "*" ]]; then + WEBUI_ADDRESS="localhost" +fi + # --- Configuration & Pre-checks --- if bashio::config.true 'silent'; then @@ -36,14 +42,21 @@ fi # --- Launch qBittorrent --- -# Determine log output based on silent mode -QB_OUTPUT="/dev/stdout" -if bashio::config.true 'silent'; then - QB_OUTPUT="/dev/null" -fi - bashio::log.info "Starting qBittorrent..." -exec \ - s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z localhost ${WEBUI_PORT}" \ - s6-setuidgid abc /app/qbittorrent-nox --webui-port="${WEBUI_PORT}" > "${QB_OUTPUT}" +# Suppress output in silent mode by redirecting the current shell's stdout/stderr +# before exec replaces the process (avoids opening /dev/stdout which may fail on +# some ARM platforms / container runtimes). +if bashio::config.true 'silent'; then + exec >/dev/null 2>&1 +fi + +if [[ -z ${LSIO_NON_ROOT_USER} ]]; then + exec \ + s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z ${WEBUI_ADDRESS} ${WEBUI_PORT}" \ + s6-setuidgid abc /app/qbittorrent-nox --webui-port="${WEBUI_PORT}" +else + exec \ + s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z ${WEBUI_ADDRESS} ${WEBUI_PORT}" \ + /app/qbittorrent-nox --webui-port="${WEBUI_PORT}" +fi From cb6e9e0ecb4edab0ce3273f981d58164e98888b8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 10 May 2026 15:17:42 +0000 Subject: [PATCH 3/3] Merge origin/master: combine restart loop fixes into 5.2.0-3 Agent-Logs-Url: https://github.com/alexbelgium/hassio-addons/sessions/0b6f18f4-1da4-4284-86c4-a883db0a8e04 Co-authored-by: alexbelgium <44178713+alexbelgium@users.noreply.github.com> --- mealie/CHANGELOG.md | 3 ++ mealie/config.yaml | 3 +- qbittorrent/CHANGELOG.md | 7 ++- qbittorrent/config.yaml | 2 +- .../s6-overlay/s6-rc.d/svc-qbittorrent/run | 22 +++++--- seafile/CHANGELOG.md | 3 ++ seafile/config.yaml | 2 +- seafile/rootfs/etc/cont-init.d/99-run.sh | 51 +++++++++++++++++++ 8 files changed, 81 insertions(+), 12 deletions(-) diff --git a/mealie/CHANGELOG.md b/mealie/CHANGELOG.md index 4a2af1d445..a600e14194 100644 --- a/mealie/CHANGELOG.md +++ b/mealie/CHANGELOG.md @@ -1,4 +1,7 @@ +## v3.17.0-1 (2026-05-10) +- Fix sidebar panel not visible to non-admin HA users (remove duplicate panel_admin key, keep panel_admin: false) + ## v3.17.0 (2026-05-09) - Update to latest version from mealie-recipes/mealie (changelog : https://github.com/mealie-recipes/mealie/releases) diff --git a/mealie/config.yaml b/mealie/config.yaml index 8d3d79a503..966056eb0f 100644 --- a/mealie/config.yaml +++ b/mealie/config.yaml @@ -94,7 +94,6 @@ options: ssl: false panel_admin: false panel_icon: mdi:silverware-fork-knife -panel_admin: false ports: 9001/tcp: 9090 ports_description: @@ -115,4 +114,4 @@ schema: slug: mealie udev: true url: https://github.com/alexbelgium/hassio-addons -version: "v3.17.0" +version: "v3.17.0-1" diff --git a/qbittorrent/CHANGELOG.md b/qbittorrent/CHANGELOG.md index f8e15103b2..ef1dc986d2 100644 --- a/qbittorrent/CHANGELOG.md +++ b/qbittorrent/CHANGELOG.md @@ -1,7 +1,10 @@ +## 5.2.0-3 (2026-05-10) +- Fix qBittorrent restart loop: remove s6-notifyoncheck (notification-fd 3 EBADF when not running under s6-rc), discover binary path dynamically across LSIO image layouts, remove `/dev/stdout` redirect that fails on some ARM runtimes, align with upstream LSIO run script (WebUI address from config, LSIO_NON_ROOT_USER) +- Fix Dockerfile: add missing `-i` flag to `sed '11,13d'` so default config lines are actually removed at build time + ## 5.2.0-2 (2026-05-10) -- Fix qbittorrent restart loop on aarch64/ARM64 devices (e.g. odroid-c2): remove `> /dev/stdout` redirect in service run script that could fail on certain container runtimes, align with upstream LSIO run script (read WebUI address from config, honour LSIO_NON_ROOT_USER) -- Fix Dockerfile: add missing `-i` flag to `sed '11,13d'` so default config lines are actually removed at build time +- Fix qBittorrent restart loop: remove s6-notifyoncheck (avoids notification-fd EBADF crash) and discover binary path dynamically across LSIO image layouts ## 5.2.0-1 (2026-05-10) - Fix qbittorrent-nox path (/usr/bin → /app) after LSIO image update diff --git a/qbittorrent/config.yaml b/qbittorrent/config.yaml index 9b987cc09b..78eca23a9f 100644 --- a/qbittorrent/config.yaml +++ b/qbittorrent/config.yaml @@ -143,4 +143,4 @@ schema: slug: qbittorrent udev: true url: https://github.com/alexbelgium/hassio-addons -version: "5.2.0-2" +version: "5.2.0-3" diff --git a/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run b/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run index 7455b23854..160b921e63 100644 --- a/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run +++ b/qbittorrent/rootfs/etc/s6-overlay/s6-rc.d/svc-qbittorrent/run @@ -42,6 +42,20 @@ fi # --- Launch qBittorrent --- +# Find qbittorrent-nox binary across different LSIO image layouts +QB_BIN="" +for candidate in /app/qbittorrent-nox /usr/bin/qbittorrent-nox /usr/local/bin/qbittorrent-nox; do + if [[ -x "${candidate}" ]]; then + QB_BIN="${candidate}" + break + fi +done + +if [[ -z "${QB_BIN}" ]]; then + bashio::log.fatal "qbittorrent-nox binary not found" + exit 1 +fi + bashio::log.info "Starting qBittorrent..." # Suppress output in silent mode by redirecting the current shell's stdout/stderr @@ -52,11 +66,7 @@ if bashio::config.true 'silent'; then fi if [[ -z ${LSIO_NON_ROOT_USER} ]]; then - exec \ - s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z ${WEBUI_ADDRESS} ${WEBUI_PORT}" \ - s6-setuidgid abc /app/qbittorrent-nox --webui-port="${WEBUI_PORT}" + exec s6-setuidgid abc "${QB_BIN}" --webui-port="${WEBUI_PORT}" else - exec \ - s6-notifyoncheck -d -n 300 -w 1000 -c "nc -z ${WEBUI_ADDRESS} ${WEBUI_PORT}" \ - /app/qbittorrent-nox --webui-port="${WEBUI_PORT}" + exec "${QB_BIN}" --webui-port="${WEBUI_PORT}" fi diff --git a/seafile/CHANGELOG.md b/seafile/CHANGELOG.md index 48b98f2d96..a0a709eaca 100644 --- a/seafile/CHANGELOG.md +++ b/seafile/CHANGELOG.md @@ -1,4 +1,7 @@ +## 12.0.18-4 (2026-05-10) +- Fix admin account creation by writing `conf/admin.txt` and seeding `seafile.env` with `SEAFILE_ADMIN_EMAIL`/`SEAFILE_ADMIN_PASSWORD` so the upstream `check_init_admin.py` no longer falls back to an interactive prompt (#2685) + ## 12.0.18-3 (2026-05-10) - Fix MariaDB connection on HAOS >=17.3 by forcing IPv4 host resolution (#2688) diff --git a/seafile/config.yaml b/seafile/config.yaml index 2dc5ab8b2e..c016c9a733 100644 --- a/seafile/config.yaml +++ b/seafile/config.yaml @@ -128,5 +128,5 @@ services: slug: seafile udev: true url: https://github.com/alexbelgium/hassio-addons/tree/master/seafile -version: "12.0.18-3" +version: "12.0.18-4" webui: http://[HOST]:[PORT:8000] diff --git a/seafile/rootfs/etc/cont-init.d/99-run.sh b/seafile/rootfs/etc/cont-init.d/99-run.sh index 242504217d..287c8a78e5 100755 --- a/seafile/rootfs/etc/cont-init.d/99-run.sh +++ b/seafile/rootfs/etc/cont-init.d/99-run.sh @@ -94,6 +94,57 @@ sed -i "s|/shared|$DATA_LOCATION|g" /docker_entrypoint.sh sed -i "s|/shared|$DATA_LOCATION|g" /home/seafile/*.sh #sed -i "s=cp -r ./media $DATA_LOCATION/=chown -R seafile:seafile $DATA_LOCATION/* && chmod -R 777 $DATA_LOCATION/media && cp -rnf ./media/. $DATA_LOCATION/media ||true=g" /home/seafile/*.sh +##################### +# Admin credentials # +##################### + +# Seafile's check_init_admin.py looks for SEAFILE_ADMIN_EMAIL and +# SEAFILE_ADMIN_PASSWORD in the env, then falls back to conf/admin.txt, and +# only prompts interactively if neither is available. The upstream init.sh +# writes admin.txt, but it is skipped when conf/ccnet.conf or conf/revision +# already exist (e.g. after a partial previous install) and the env vars do +# not always reach the seahub subprocess via su. Write admin.txt directly and +# inject the values into seafile.env so admin creation succeeds (#2685). +ADMIN_EMAIL_VAL="$(bashio::config 'SEAFILE_ADMIN_EMAIL')" +ADMIN_PASSWORD_VAL="$(bashio::config 'SEAFILE_ADMIN_PASSWORD')" + +if [[ -n "${ADMIN_EMAIL_VAL}" && "${ADMIN_EMAIL_VAL}" != "null" \ + && -n "${ADMIN_PASSWORD_VAL}" && "${ADMIN_PASSWORD_VAL}" != "null" ]]; then + bashio::log.info "Seeding admin credentials" + + mkdir -p "${DATA_LOCATION}/conf" + + ADMIN_FILE="${DATA_LOCATION}/conf/admin.txt" + jq -n --arg email "${ADMIN_EMAIL_VAL}" --arg password "${ADMIN_PASSWORD_VAL}" \ + '{email: $email, password: $password}' > "${ADMIN_FILE}" + chown seafile:seafile "${ADMIN_FILE}" + chmod 600 "${ADMIN_FILE}" + + SEAFILE_ENV_FILE="${DATA_LOCATION}/conf/seafile.env" + touch "${SEAFILE_ENV_FILE}" + sed -i '/^SEAFILE_ADMIN_EMAIL=/d' "${SEAFILE_ENV_FILE}" + sed -i '/^SEAFILE_ADMIN_PASSWORD=/d' "${SEAFILE_ENV_FILE}" + + case "${ADMIN_EMAIL_VAL}" in + *$'\n'*|*$'\r'*) + bashio::exit.nok "SEAFILE_ADMIN_EMAIL must not contain newlines" + ;; + esac + + case "${ADMIN_PASSWORD_VAL}" in + *$'\n'*|*$'\r'*) + bashio::exit.nok "SEAFILE_ADMIN_PASSWORD must not contain newlines" + ;; + esac + + { + printf 'SEAFILE_ADMIN_EMAIL=%s\n' "${ADMIN_EMAIL_VAL}" + printf 'SEAFILE_ADMIN_PASSWORD=%s\n' "${ADMIN_PASSWORD_VAL}" + } >> "${SEAFILE_ENV_FILE}" + chown seafile:seafile "${SEAFILE_ENV_FILE}" + chmod 600 "${SEAFILE_ENV_FILE}" +fi + ############################################# # Configure service URL and file server root # #############################################