stremio/deploy/node/install-unraid.sh
Jos Vooges | STH eb8ae1e85a Fix Stremio playback, folder-aware scan, and remove STH branding.
Parse Plex-style Title (Year) and Show/Season folders; restore notWebReady with direct node stream URLs; hide unavailable titles by default.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 02:16:46 +02:00

165 lines
4.8 KiB
Bash

#!/bin/bash
# Unraid media-node installer — geen image build, alleen download + docker run
set -euo pipefail
MASTER_URL="${MASTER_URL:-__MASTER_PUBLIC_URL__}"
TOKEN=""
NAME=""
PUBLIC_URL=""
MOVIES=""
SERIES=""
PORT="${PORT:-8080}"
APPDATA="${APPDATA:-/mnt/user/appdata/media-node}"
usage() {
cat <<EOF
Gebruik:
curl -fsSL ${MASTER_URL}/install/unraid.sh | bash -s -- \\
--token=TOKEN --name=Unraid-01 \\
--public-url=https://node01.example.com \\
--movies=/mnt/user/movies [--series=/mnt/user/series]
Opties:
--token= Enrollment token uit Admin → Nodes
--name= Node-naam
--public-url= Publieke HTTPS-URL via NPM (poort 8080)
--movies= Unraid-pad naar films (share)
--series= Unraid-pad naar series (optioneel)
--port= Host-poort (default 8080)
--appdata= Appdata-map (default /mnt/user/appdata/media-node)
--master= Master-URL (default: ${MASTER_URL})
EOF
}
for arg in "$@"; do
case "$arg" in
--token=*) TOKEN="${arg#*=}" ;;
--name=*) NAME="${arg#*=}" ;;
--public-url=*) PUBLIC_URL="${arg#*=}" ;;
--movies=*) MOVIES="${arg#*=}" ;;
--series=*) SERIES="${arg#*=}" ;;
--port=*) PORT="${arg#*=}" ;;
--appdata=*) APPDATA="${arg#*=}" ;;
--master=*) MASTER_URL="${arg#*=}" ;;
-h|--help) usage; exit 0 ;;
*) echo "Onbekende optie: $arg"; usage; exit 1 ;;
esac
done
if ! command -v docker >/dev/null 2>&1; then
echo "Docker niet gevonden. Op Unraid: Docker service aanzetten."
exit 1
fi
prompt() {
local label="$1" var="$2" current="$3" flag="$4"
if [ -n "$current" ]; then
eval "$var=\"\$current\""
return
fi
if [ -t 0 ]; then
local val=""
printf "%s" "$label"
read -r val
eval "$var=\"\$val\""
return
fi
echo "Ontbrekende optie: $flag (bij curl|bash alle flags meegeven)."
usage
exit 1
}
echo "=== Media Node — Unraid install ==="
echo "Master: $MASTER_URL"
echo
prompt "Enrollment token: " TOKEN "$TOKEN" "--token"
prompt "Node-naam [Unraid-Node-01]: " NAME "${NAME}" "--name"
if [ -z "$NAME" ]; then NAME="Unraid-Node-01"; fi
prompt "Publieke URL (https://node01....): " PUBLIC_URL "$PUBLIC_URL" "--public-url"
prompt "Films-pad [/mnt/user/movies]: " MOVIES "${MOVIES}" "--movies"
if [ -z "$MOVIES" ] && [ -t 0 ]; then MOVIES="/mnt/user/movies"; fi
if [ -z "$MOVIES" ]; then
echo "Ontbrekende optie: --movies"
exit 1
fi
if [ -t 0 ] && [ -z "$SERIES" ]; then
printf "Series-pad (leeg = overslaan): "
read -r SERIES || true
fi
TOKEN="$(echo -n "$TOKEN" | tr -d '\r\n')"
NAME="$(echo -n "$NAME" | tr -d '\r\n')"
PUBLIC_URL="$(echo -n "$PUBLIC_URL" | sed 's:/*$::')"
MOVIES="$(echo -n "$MOVIES" | tr -d '\r\n')"
SERIES="$(echo -n "$SERIES" | tr -d '\r\n')"
MASTER_URL="$(echo -n "$MASTER_URL" | sed 's:/*$::')"
if [ -z "$TOKEN" ] || [ -z "$NAME" ] || [ -z "$PUBLIC_URL" ] || [ -z "$MOVIES" ]; then
echo "Token, naam, public-url en movies zijn verplicht."
exit 1
fi
if [ ! -d "$MOVIES" ]; then
echo "Waarschuwing: films-pad bestaat niet: $MOVIES"
fi
if [ -n "$SERIES" ] && [ ! -d "$SERIES" ]; then
echo "Waarschuwing: series-pad bestaat niet: $SERIES"
fi
ARCH="$(uname -m)"
case "$ARCH" in
x86_64|amd64) BIN_NAME="media-node-linux-amd64" ;;
aarch64|arm64) BIN_NAME="media-node-linux-arm64" ;;
*) echo "Niet-ondersteunde architectuur: $ARCH"; exit 1 ;;
esac
mkdir -p "$APPDATA/config/credentials" "$APPDATA/data" "$APPDATA/bin"
chown -R 99:100 "$APPDATA" 2>/dev/null || true
BIN_PATH="$APPDATA/bin/media-node"
echo "Binary downloaden ($BIN_NAME)..."
curl -fsSL "$MASTER_URL/install/$BIN_NAME" -o "$BIN_PATH"
chmod +x "$BIN_PATH"
# Oude container weg
docker rm -f media-node >/dev/null 2>&1 || true
# Alpine met gemounte static binary — geen custom image build
VOLUMES=(
-v "$APPDATA/config:/etc/media-node"
-v "$APPDATA/data:/var/lib/media-node"
-v "$BIN_PATH:/usr/local/bin/media-node:ro"
-v /etc/ssl/certs:/etc/ssl/certs:ro
-v "$MOVIES:/media/movies:ro"
)
ENV_SERIES=""
if [ -n "$SERIES" ]; then
VOLUMES+=(-v "$SERIES:/media/series:ro")
ENV_SERIES="/media/series"
fi
echo "Container starten..."
docker run -d \
--name media-node \
--restart unless-stopped \
-p "${PORT}:8080" \
-e "MEDIA_NODE_NAME=$NAME" \
-e "MEDIA_NODE_MASTER_URL=$MASTER_URL" \
-e "MEDIA_NODE_PUBLIC_URL=$PUBLIC_URL" \
-e "MEDIA_NODE_MOVIES=/media/movies" \
-e "MEDIA_NODE_SERIES=$ENV_SERIES" \
-e "MEDIA_NODE_ENROLLMENT_TOKEN=$TOKEN" \
-e "TZ=${TZ:-Europe/Amsterdam}" \
--user 99:100 \
"${VOLUMES[@]}" \
--entrypoint /usr/local/bin/media-node \
alpine:3.20 \
run
echo
echo "Klaar. Logs: docker logs -f media-node"
echo "Status: in Admin → Nodes (moet online worden)"
echo "NPM: $PUBLIC_URL → Unraid-LAN-IP:$PORT (buffering uit, Force SSL)"
echo
echo "Na succes: token staat opgeslagen in appdata — herstart zonder nieuwe token is ok."