Add standalone Unraid ARR MCP package
This commit is contained in:
Executable
+86
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
# Baut und verwaltet ausschließlich den eigenständigen ARR-MCP-Container.
|
||||
set -Eeuo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
APPDATA_DIR=${ARR_MCP_APPDATA_DIR:-/mnt/nvme-storage/appdata/ARR-MCP}
|
||||
ENV_FILE=${ARR_MCP_ENV_FILE:-$APPDATA_DIR/arr-mcp.env}
|
||||
PUBLIC_PORT=${ARR_MCP_PUBLIC_PORT:-8207}
|
||||
TEMPLATE_SOURCE="$REPO_ROOT/config/unraid-templates/my-ARR-MCP.xml"
|
||||
TEMPLATE_DEST=${ARR_MCP_TEMPLATE_DEST:-/boot/config/plugins/dockerMan/templates-user/my-ARR-MCP.xml}
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Verwendung:
|
||||
./services/arr-mcp/install-on-unraid.sh
|
||||
./services/arr-mcp/install-on-unraid.sh uninstall
|
||||
|
||||
Der erste Lauf legt nur dann eine Beispielkonfiguration an, wenn noch keine
|
||||
existiert. Echte Schlüssel werden niemals überschrieben oder ausgegeben.
|
||||
EOF
|
||||
}
|
||||
|
||||
command=${1:-install}
|
||||
case "$command" in
|
||||
-h|--help) usage; exit 0 ;;
|
||||
install|uninstall) ;;
|
||||
*) usage >&2; exit 2 ;;
|
||||
esac
|
||||
|
||||
command -v docker >/dev/null 2>&1 || { echo "Docker wurde nicht gefunden." >&2; exit 1; }
|
||||
docker compose version >/dev/null 2>&1 || { echo "Docker Compose v2 wurde nicht gefunden." >&2; exit 1; }
|
||||
|
||||
compose=(docker compose -f "$SCRIPT_DIR/compose.yaml")
|
||||
|
||||
if [[ $command == uninstall ]]; then
|
||||
ARR_MCP_ENV_FILE="$ENV_FILE" ARR_MCP_PUBLIC_PORT="$PUBLIC_PORT" \
|
||||
"${compose[@]}" down --remove-orphans
|
||||
echo "ARR-MCP wurde entfernt. Appdata und Konfiguration bleiben erhalten: $APPDATA_DIR"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
install -d -m 0700 "$APPDATA_DIR"
|
||||
if [[ ! -e $ENV_FILE ]]; then
|
||||
install -m 0600 "$SCRIPT_DIR/arr-mcp.env.example" "$ENV_FILE"
|
||||
echo "Beispielkonfiguration angelegt: $ENV_FILE"
|
||||
echo "Bitte SONARR_TOKEN und RADARR_TOKEN eintragen und denselben Befehl erneut starten."
|
||||
exit 3
|
||||
fi
|
||||
|
||||
# Nur Vollständigkeit prüfen; Werte niemals ausgeben.
|
||||
for key in SONARR_TOKEN RADARR_TOKEN; do
|
||||
if ! grep -Eq "^${key}=[^[:space:]]+" "$ENV_FILE" \
|
||||
|| grep -Eq "^${key}=CHANGE_ME$" "$ENV_FILE"; then
|
||||
echo "In $ENV_FILE fehlt noch $key." >&2
|
||||
exit 3
|
||||
fi
|
||||
done
|
||||
|
||||
docker build \
|
||||
--build-arg ARR_MCP_VERSION=1.0.1 \
|
||||
-f "$SCRIPT_DIR/Dockerfile" \
|
||||
-t mike-ai/arr-mcp:1.0.0 \
|
||||
"$REPO_ROOT"
|
||||
|
||||
ARR_MCP_ENV_FILE="$ENV_FILE" ARR_MCP_PUBLIC_PORT="$PUBLIC_PORT" \
|
||||
"${compose[@]}" up -d --no-build
|
||||
|
||||
if [[ -d $(dirname "$TEMPLATE_DEST") ]]; then
|
||||
install -m 0644 "$TEMPLATE_SOURCE" "$TEMPLATE_DEST"
|
||||
fi
|
||||
|
||||
for _ in {1..30}; do
|
||||
health=$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' ARR-MCP 2>/dev/null || true)
|
||||
[[ $health == healthy ]] && break
|
||||
sleep 1
|
||||
done
|
||||
|
||||
health=$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' ARR-MCP 2>/dev/null || true)
|
||||
[[ $health == healthy ]] || {
|
||||
echo "ARR-MCP wurde gestartet, ist aber noch nicht healthy (Status: ${health:-unbekannt})." >&2
|
||||
echo "Prüfen mit: docker logs --tail 100 ARR-MCP" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "ARR-MCP läuft: http://$(hostname -I | awk '{print $1}'):$PUBLIC_PORT/mcp"
|
||||
Reference in New Issue
Block a user