From 92434a945dd425c0530228131e14de7ddcaf1652 Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:15:33 +0200 Subject: [PATCH] Add Unraid plugin package --- README.md | 36 +++++++++- build-plugin.sh | 27 ++++++++ packages/u-navigator-0.1.0.tgz | Bin 0 -> 12914 bytes .../plugins/u-navigator/U-Navigator.page | 39 +++++++++++ .../u-navigator/scripts/rc.u-navigator | 62 ++++++++++++++++++ server/server.js | 5 +- u-navigator.plg | 51 ++++++++++++++ u-navigator.plg.in | 51 ++++++++++++++ 8 files changed, 268 insertions(+), 3 deletions(-) create mode 100755 build-plugin.sh create mode 100644 packages/u-navigator-0.1.0.tgz create mode 100644 plugin-root/usr/local/emhttp/plugins/u-navigator/U-Navigator.page create mode 100644 plugin-root/usr/local/emhttp/plugins/u-navigator/scripts/rc.u-navigator create mode 100644 u-navigator.plg create mode 100644 u-navigator.plg.in diff --git a/README.md b/README.md index d107177..ccad001 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,41 @@ U-Navigator ist als Unraid-Plugin machbar. Empfohlen wird ein hybrider Aufbau au Naechster sinnvoller Schritt: -Unraid-Plugin-Paketierung fuer die bestehende Web-App und das Backend. +Go-Backend oder gebuendelte Runtime, damit das Plugin nicht mehr von einer vorhandenen Node.js-Installation abhaengt. + +## Unraid Plugin installieren + +Plugin-URL: + +```text +https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/u-navigator.plg +``` + +Installation per Unraid Terminal: + +```sh +installplg https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/u-navigator.plg +``` + +Oder im WebGUI: + +```text +Plugins -> Install Plugin -> URL einfuegen -> Install +``` + +Danach starten: + +```sh +rc.u-navigator start +``` + +Status pruefen: + +```sh +rc.u-navigator status +``` + +Wichtig: Dieser erste Plugin-Spike benoetigt `node` auf dem Unraid-System. Falls `rc.u-navigator start` meldet, dass Node.js fehlt, muss als naechster Schritt das Backend als Go-Binary gebaut oder Node.js separat bereitgestellt werden. ## Lokal starten diff --git a/build-plugin.sh b/build-plugin.sh new file mode 100755 index 0000000..06004de --- /dev/null +++ b/build-plugin.sh @@ -0,0 +1,27 @@ +#!/bin/sh +set -eu + +PLUGIN="u-navigator" +VERSION="0.1.0" +PKG_DIR="packages" +WORK_DIR=".plugin-build" +PKG_NAME="${PLUGIN}-${VERSION}.tgz" + +rm -rf "$WORK_DIR" +mkdir -p "$WORK_DIR/usr/local/emhttp/plugins/${PLUGIN}/app" "$PKG_DIR" + +cp -R plugin-root/usr "$WORK_DIR/" +cp package.json "$WORK_DIR/usr/local/emhttp/plugins/${PLUGIN}/app/" +cp -R public "$WORK_DIR/usr/local/emhttp/plugins/${PLUGIN}/app/" +cp -R server "$WORK_DIR/usr/local/emhttp/plugins/${PLUGIN}/app/" +find "$WORK_DIR" -name "*.test.js" -delete +chmod +x "$WORK_DIR/usr/local/emhttp/plugins/${PLUGIN}/scripts/rc.u-navigator" + +tar -czf "$PKG_DIR/$PKG_NAME" -C "$WORK_DIR" usr +rm -rf "$WORK_DIR" + +MD5="$(md5 -q "$PKG_DIR/$PKG_NAME" 2>/dev/null || md5sum "$PKG_DIR/$PKG_NAME" | awk '{print $1}')" +sed "s/__VERSION__/${VERSION}/g; s/__MD5__/${MD5}/g" u-navigator.plg.in > u-navigator.plg + +echo "Built $PKG_DIR/$PKG_NAME" +echo "MD5 $MD5" diff --git a/packages/u-navigator-0.1.0.tgz b/packages/u-navigator-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..963e76d915455e950365367c00fcc3c5b953ec60 GIT binary patch literal 12914 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 + +
+

+ U-Navigator laeuft als lokaler Dienst auf Port . + Falls der Rahmen leer bleibt, pruefe den Dienst mit rc.u-navigator status. +

+ +
+ diff --git a/plugin-root/usr/local/emhttp/plugins/u-navigator/scripts/rc.u-navigator b/plugin-root/usr/local/emhttp/plugins/u-navigator/scripts/rc.u-navigator new file mode 100644 index 0000000..91996bd --- /dev/null +++ b/plugin-root/usr/local/emhttp/plugins/u-navigator/scripts/rc.u-navigator @@ -0,0 +1,62 @@ +#!/bin/bash + +PLUGIN="u-navigator" +APP_DIR="/usr/local/emhttp/plugins/${PLUGIN}/app" +PID_FILE="/var/run/${PLUGIN}.pid" +LOG_FILE="/var/log/${PLUGIN}.log" +PORT="${U_NAV_PORT:-8088}" +ROOTS="${U_NAV_ROOTS:-/mnt/user}" +HOST="${U_NAV_HOST:-0.0.0.0}" + +is_running() { + [[ -f "$PID_FILE" ]] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null +} + +start() { + if is_running; then + echo "${PLUGIN} is already running with PID $(cat "$PID_FILE")" + return 0 + fi + + if ! command -v node >/dev/null 2>&1; then + echo "node is required but was not found. Install/provide Node.js before starting ${PLUGIN}." + return 1 + fi + + mkdir -p "$(dirname "$PID_FILE")" + U_NAV_ROOTS="$ROOTS" U_NAV_HOST="$HOST" PORT="$PORT" nohup node "${APP_DIR}/server/server.js" >>"$LOG_FILE" 2>&1 & + echo $! > "$PID_FILE" + echo "${PLUGIN} started on ${HOST}:${PORT} with roots ${ROOTS}" +} + +stop() { + if ! is_running; then + rm -f "$PID_FILE" + echo "${PLUGIN} is not running" + return 0 + fi + + kill "$(cat "$PID_FILE")" 2>/dev/null || true + rm -f "$PID_FILE" + echo "${PLUGIN} stopped" +} + +status() { + if is_running; then + echo "${PLUGIN} is running with PID $(cat "$PID_FILE")" + else + echo "${PLUGIN} is not running" + return 1 + fi +} + +case "$1" in + start) start ;; + stop) stop ;; + restart) stop; start ;; + status) status ;; + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 2 + ;; +esac diff --git a/server/server.js b/server/server.js index 480db9b..6956997 100644 --- a/server/server.js +++ b/server/server.js @@ -226,9 +226,10 @@ function statusError(status, message) { if (import.meta.url === `file://${process.argv[1]}`) { const port = Number(process.env.PORT || 8088); + const host = process.env.U_NAV_HOST || process.env.HOST || '127.0.0.1'; createApp({ env: process.env }).then((app) => { - http.createServer(app).listen(port, '127.0.0.1', () => { - console.log(`U-Navigator listening on http://127.0.0.1:${port}`); + http.createServer(app).listen(port, host, () => { + console.log(`U-Navigator listening on http://${host}:${port}`); }); }).catch((error) => { console.error(error.message); diff --git a/u-navigator.plg b/u-navigator.plg new file mode 100644 index 0000000..0a71860 --- /dev/null +++ b/u-navigator.plg @@ -0,0 +1,51 @@ + + + + +]> + + + +### &version; +- Initial U-Navigator plugin spike. +- Installs WebGUI page, Node.js prototype backend, in-app window manager and drag-and-drop file navigator. + + + +https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/packages/&package; +9d6e248cb70c803f04bf491b06520764 + + + + +mkdir -p /boot/config/plugins/&name; +tar -xzf /boot/config/plugins/&name;/&package; -C / +chmod +x /usr/local/emhttp/plugins/&name;/scripts/rc.u-navigator +ln -sf /usr/local/emhttp/plugins/&name;/scripts/rc.u-navigator /usr/local/sbin/rc.u-navigator +echo "" +echo "-----------------------------------------------------------" +echo " &name; &version; has been installed." +echo "" +echo " Start: rc.u-navigator start" +echo " Stop: rc.u-navigator stop" +echo " Status: rc.u-navigator status" +echo "" +echo " Note: This prototype requires Node.js to be available on Unraid." +echo "-----------------------------------------------------------" +echo "" + + + + + +rc.u-navigator stop 2>/dev/null || true +rm -f /usr/local/sbin/rc.u-navigator +rm -rf /usr/local/emhttp/plugins/&name; +rm -rf /boot/config/plugins/&name; +rm -f /var/run/&name;.pid +echo "&name; has been removed." + + + + diff --git a/u-navigator.plg.in b/u-navigator.plg.in new file mode 100644 index 0000000..bf3dce8 --- /dev/null +++ b/u-navigator.plg.in @@ -0,0 +1,51 @@ + + + + +]> + + + +### &version; +- Initial U-Navigator plugin spike. +- Installs WebGUI page, Node.js prototype backend, in-app window manager and drag-and-drop file navigator. + + + +https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/packages/&package; +__MD5__ + + + + +mkdir -p /boot/config/plugins/&name; +tar -xzf /boot/config/plugins/&name;/&package; -C / +chmod +x /usr/local/emhttp/plugins/&name;/scripts/rc.u-navigator +ln -sf /usr/local/emhttp/plugins/&name;/scripts/rc.u-navigator /usr/local/sbin/rc.u-navigator +echo "" +echo "-----------------------------------------------------------" +echo " &name; &version; has been installed." +echo "" +echo " Start: rc.u-navigator start" +echo " Stop: rc.u-navigator stop" +echo " Status: rc.u-navigator status" +echo "" +echo " Note: This prototype requires Node.js to be available on Unraid." +echo "-----------------------------------------------------------" +echo "" + + + + + +rc.u-navigator stop 2>/dev/null || true +rm -f /usr/local/sbin/rc.u-navigator +rm -rf /usr/local/emhttp/plugins/&name; +rm -rf /boot/config/plugins/&name; +rm -f /var/run/&name;.pid +echo "&name; has been removed." + + + +