201 lines
6.3 KiB
Bash
201 lines
6.3 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}"
|
|
MEDIA_ROOT="${MEDIA_ROOT:-/mnt/user}"
|
|
|
|
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) — bootstrap; later via Admin uitbreiden
|
|
--series= Unraid-pad naar series (optioneel)
|
|
--media-root= Host-root die gemount wordt (default /mnt/user) zodat nieuwe shares
|
|
vanaf Admin toegevoegd kunnen worden zonder herinstall
|
|
--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#*=}" ;;
|
|
--media-root=*) MEDIA_ROOT="${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')"
|
|
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."
|