Refactor: PHP-Built-in-Server durch TypeScript-Binary (Bun Runtime) ersetzt

- src/*.ts: Port von mcp/*.php (helpers, tools, server)
- Bun.serve() statt php -S — production-grade HTTP, POST funktioniert
- dist/mua-1.0.0-x86_64-1.txz: Slackware-Paket (Binary + rc.mua + mua.page + PHP-Helper)
- plugin/mua.plg: .txz-Installation via upgradepkg
- scripts/rc.mua: Binary statt php -S
- scripts/mua.page: Binary-Info statt PHP-Version
- scripts/package.sh: .txz-Builder

Fix: MCP-POST-Endpunkt lieferte leeren Body (php -S Limitation).
Bun.serve() löst das Problem.
This commit is contained in:
Mikei386
2026-08-18 08:02:39 +02:00
parent 3de8cb055a
commit 7e925153fc
12 changed files with 1305 additions and 69 deletions
+4 -2
View File
@@ -14,6 +14,7 @@ Icon="cubes"
$plugin_dir = '/usr/local/emhttp/plugins/mua';
$port = 3002;
$pidfile = '/var/run/mua.pid';
$binary = '/usr/local/bin/mua';
$endpoint = 'http://' . ($_SERVER['SERVER_ADDR'] ?? '127.0.0.1') . ':' . $port . '/mcp';
// Status bestimmen
@@ -40,7 +41,7 @@ $health_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$health_ok = ($health_code === 200);
$php_version = PHP_VERSION;
$binary_exists = file_exists($binary);
$tool_count = 21;
$host_ip = $_SERVER['SERVER_ADDR'] ?? '127.0.0.1';
?>
@@ -74,7 +75,8 @@ $host_ip = $_SERVER['SERVER_ADDR'] ?? '127.0.0.1';
<table>
<tr><th>Plugin</th><td>MUA (Mikes Unraid Agent)</td></tr>
<tr><th>Version</th><td>1.0.0</td></tr>
<tr><th>PHP</th><td><?= $php_version ?></td></tr>
<tr><th>Runtime</th><td>TypeScript (Bun Runtime, kompiliertes Binary)</td></tr>
<tr><th>Binary</th><td><code><?= $binary ?></code> <?= $binary_exists ? '✅' : '❌ fehlt' ?></td></tr>
<tr><th>Port</th><td><?= $port ?></td></tr>
<tr><th>Host-IP</th><td><?= $host_ip ?></td></tr>
<tr><th>Tools</th><td><?= $tool_count ?> (Docker: 14, Netzwerk: 6, System: 1)</td></tr>
+117
View File
@@ -0,0 +1,117 @@
#!/bin/bash
# MUA - Mikes Unraid Agent
# package.sh — Baut das Slackware .txz-Paket
#
# Struktur des .txz:
# install/doinst.sh
# install/slack-desc
# usr/local/bin/mua (kompiliertes Binary)
# etc/rc.d/rc.mua (SysVinit-Service)
# usr/local/emhttp/plugins/mua/mua.page (WebGUI-Tab)
#
# Cross-Platform: .txz ist ein gzip-tar, funktioniert auf macOS + Linux.
set -euo pipefail
VERSION="${1:-1.0.0}"
PKG_NAME="mua"
ARCH="x86_64"
BUILD_NUM="1"
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BUILD_DIR="${ROOT}/build/pkg"
DIST_DIR="${ROOT}/dist"
echo "===================================================="
echo " MUA - Paket-Builder"
echo " Version: ${VERSION}"
echo "===================================================="
# 1. Binary bauen (falls nicht vorhanden)
if [ ! -f "${DIST_DIR}/mua" ]; then
echo " Kompiliere Binary..."
cd "${ROOT}"
bun build src/index.ts --compile --target=bun-linux-x64 --outfile "${DIST_DIR}/mua"
fi
chmod +x "${DIST_DIR}/mua"
echo " Binary: $(du -h "${DIST_DIR}/mua" | cut -f1)"
# 2. Paket-Struktur aufbauen
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}/install"
mkdir -p "${BUILD_DIR}/usr/local/bin"
mkdir -p "${BUILD_DIR}/etc/rc.d"
mkdir -p "${BUILD_DIR}/usr/local/emhttp/plugins/mua"
# Binary
cp "${DIST_DIR}/mua" "${BUILD_DIR}/usr/local/bin/mua"
chmod 755 "${BUILD_DIR}/usr/local/bin/mua"
# SysVinit-Service
cp "${ROOT}/scripts/rc.mua" "${BUILD_DIR}/etc/rc.d/rc.mua"
chmod 755 "${BUILD_DIR}/etc/rc.d/rc.mua"
# WebGUI-Tab
cp "${ROOT}/scripts/mua.page" "${BUILD_DIR}/usr/local/emhttp/plugins/mua/mua.page"
chmod 644 "${BUILD_DIR}/usr/local/emhttp/plugins/mua/mua.page"
# PHP-Helper (Write-Operationen: create/modify/update/rebuild)
cp "${ROOT}/scripts/unraid-docker-mcp-helper.php" "${BUILD_DIR}/usr/local/bin/unraid-docker-mcp-helper.php"
chmod 755 "${BUILD_DIR}/usr/local/bin/unraid-docker-mcp-helper.php"
# 3. doinst.sh (läuft nach Installation)
cat > "${BUILD_DIR}/install/doinst.sh" << 'DOEOF'
#!/bin/bash
# MUA doinst.sh — läuft nach Installation des .txz-Pakets
# Verzeichnisse
mkdir -p /var/log/plugins
touch /var/log/plugins/mua.log
mkdir -p /boot/config/plugins/mua
# Service starten
/etc/rc.d/rc.mua start 2>/dev/null || true
# Health-Check
sleep 2
if curl -sf "http://127.0.0.1:3002/health" > /dev/null 2>&1; then
echo ""
echo " Health-Check: OK"
echo " Endpunkt: http://$(hostname -I | awk '{print $1}'):3002/mcp"
else
echo ""
echo " WARNUNG: Health-Check fehlgeschlagen"
echo " Logs: tail -f /var/log/plugins/mua.log"
fi
DOEOF
chmod 755 "${BUILD_DIR}/install/doinst.sh"
# 4. slack-desc (Paket-Beschreibung)
cat > "${BUILD_DIR}/install/slack-desc" << DESCEOF
|${PKG_NAME} (${PKG_NAME})
|
|${PKG_NAME} - Mikes Unraid Agent
|MCP over HTTP (Streamable HTTP) Server für Unraid.
|21 Tools: Docker (14), Netzwerk (6), System (1).
|Port: 3002, Endpunkt: /mcp
|
|Runtime: TypeScript (Bun Runtime, kompiliertes Binary)
|Service: /etc/rc.d/rc.mua (SysVinit)
|WebGUI: Settings > MUA
|
|Version: ${VERSION}
|Arch: ${ARCH}
|Build: ${BUILD_NUM}
DESCEOF
# 5. .txz erstellen (gzip-tar)
mkdir -p "${DIST_DIR}"
TXZ_NAME="${PKG_NAME}-${VERSION}-${ARCH}-${BUILD_NUM}.txz"
echo " Erstelle ${TXZ_NAME}..."
( cd "${BUILD_DIR}" && tar czf "${DIST_DIR}/${TXZ_NAME}" . )
echo ""
echo "===================================================="
echo " Paket erstellt: dist/${TXZ_NAME}"
echo " Größe: $(du -h "${DIST_DIR}/${TXZ_NAME}" | cut -f1)"
echo " SHA256: $(shasum -a 256 "${DIST_DIR}/${TXZ_NAME}" | cut -d' ' -f1)"
echo "===================================================="
+7 -11
View File
@@ -3,30 +3,26 @@
# SysVinit-Service-Script (rc.mua)
# Unraid nutzt SysVinit, kein systemd.
# Wird installiert nach /etc/rc.d/rc.mua
#
# Läuft das kompilierte TypeScript-Binary (Bun Runtime) —
# kein PHP-Built-in-Server mehr.
PLUGIN_DIR="/usr/local/emhttp/plugins/mua"
SERVER="$PLUGIN_DIR/mcp/server.php"
DAEMON="/usr/local/bin/mua"
PIDFILE="/var/run/mua.pid"
LOGFILE="/var/log/plugins/mua.log"
PORT=3002
PHP_BIN="/usr/bin/php"
# PHP-Binary finden (Fallback)
if [ ! -x "$PHP_BIN" ]; then
PHP_BIN=$(command -v php 2>/dev/null)
fi
start() {
if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then
echo " MUA läuft bereits (PID $(cat "$PIDFILE"))"
return 0
fi
if [ ! -f "$SERVER" ]; then
echo " FEHLER: Server-Datei nicht gefunden: $SERVER"
if [ ! -x "$DAEMON" ]; then
echo " FEHLER: Binary nicht gefunden: $DAEMON"
return 1
fi
# Server starten (detached)
nohup "$PHP_BIN" -S 0.0.0.0:$PORT "$SERVER" >> "$LOGFILE" 2>&1 &
MUA_PORT=$PORT nohup "$DAEMON" >> "$LOGFILE" 2>&1 &
echo $! > "$PIDFILE"
sleep 1
if kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then