#!/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}" MEDIA_ROOT="${MEDIA_ROOT:-/mnt/user}" usage() { cat </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')" MEDIA_ROOT="$(echo -n "$MEDIA_ROOT" | sed 's:/*$::')" 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 "$MEDIA_ROOT" ]; then echo "Fout: media-root bestaat niet: $MEDIA_ROOT" 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 # Bootstrap paths must live under media-root so they are visible in-container case "$MOVIES" in "$MEDIA_ROOT"|"$MEDIA_ROOT"/*) ;; *) echo "Waarschuwing: --movies ligt niet onder --media-root ($MEDIA_ROOT). Admin-paden gebruiken host-paden onder die root." ;; esac 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 # Broad media-root mount: nieuwe Unraid-shares zijn zichtbaar zonder herinstall. # docker.sock: Admin → Herstart kan de container herstarten. VOLUMES=( -v "$APPDATA/config:/etc/media-node" -v "$APPDATA/data:/var/lib/media-node" -v "$BIN_PATH:/usr/local/bin/media-node:rw" -v "$APPDATA/bin:/opt/media-node-bin:rw" -v /etc/ssl/certs:/etc/ssl/certs:ro -v "$MEDIA_ROOT:$MEDIA_ROOT:ro" ) if [ -S /var/run/docker.sock ]; then VOLUMES+=(-v /var/run/docker.sock:/var/run/docker.sock) fi ENV_SERIES="" if [ -n "$SERIES" ]; then ENV_SERIES="$SERIES" fi echo "Container starten (media-root=$MEDIA_ROOT)..." # docker.sock is often root:docker — give nobody that group so Admin→Herstart works. DOCKER_GID="" if [ -S /var/run/docker.sock ]; then DOCKER_GID="$(stat -c '%g' /var/run/docker.sock 2>/dev/null || true)" fi GROUP_ARGS=() if [ -n "$DOCKER_GID" ] && [ "$DOCKER_GID" != "0" ]; then GROUP_ARGS+=(--group-add "$DOCKER_GID") fi 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=$MOVIES" \ -e "MEDIA_NODE_SERIES=$ENV_SERIES" \ -e "MEDIA_NODE_ENROLLMENT_TOKEN=$TOKEN" \ -e "MEDIA_NODE_FULL_SCAN_INTERVAL=off" \ -e "MEDIA_NODE_FULL_SCAN_AT=03:30" \ -e "MEDIA_NODE_CONTAINER_NAME=media-node" \ -e "MEDIA_NODE_BIN_DIR=/opt/media-node-bin" \ -e "TZ=${TZ:-Europe/Amsterdam}" \ --user 99:100 \ "${GROUP_ARGS[@]}" \ "${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 "Paden: Admin → Nodes → Edit (bijv. $MEDIA_ROOT/NL Films)" echo echo "Na succes: token staat opgeslagen in appdata — herstart zonder nieuwe token is ok."