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:
+4
-2
@@ -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>
|
||||
|
||||
Executable
+117
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user