#!/bin/bash # Synology media-node installer — geen image build, alleen download + docker run # Werkt op DSM 7 + Container Manager (SSH). Meerdere NAS'en: unieke --name + --public-url. set -euo pipefail MASTER_URL="${MASTER_URL:-__MASTER_PUBLIC_URL__}" TOKEN="" NAME="" PUBLIC_URL="" MOVIES="" SERIES="" PORT="${PORT:-8080}" APPDATA="${APPDATA:-/volume1/docker/media-node}" MEDIA_ROOT="${MEDIA_ROOT:-/volume1}" PUID="${PUID:-1026}" PGID="${PGID:-100}" usage() { cat </dev/null 2>&1; then docker "$@" return fi if command -v sudo >/dev/null 2>&1 && sudo docker info >/dev/null 2>&1; then sudo docker "$@" return fi echo "Docker niet gevonden. Op Synology: Container Manager installeren + SSH inschakelen." echo "Draai dit script als root of een user in de docker-groep." exit 1 } 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 — Synology install ===" echo "Master: $MASTER_URL" echo prompt "Enrollment token: " TOKEN "$TOKEN" "--token" prompt "Node-naam [Synology-Node-01]: " NAME "${NAME}" "--name" if [ -z "$NAME" ]; then NAME="Synology-Node-01"; fi prompt "Publieke URL (https://node02....): " PUBLIC_URL "$PUBLIC_URL" "--public-url" prompt "Films-pad [/volume1/Media/Films/Films]: " MOVIES "${MOVIES}" "--movies" if [ -z "$MOVIES" ] && [ -t 0 ]; then MOVIES="/volume1/Media/Films/Films"; 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:/*$::')" APPDATA="$(echo -n "$APPDATA" | 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" echo "Gebruik bijv. --media-root=/volume1 of /volume2" 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 case "$MOVIES" in "$MEDIA_ROOT"|"$MEDIA_ROOT"/*) ;; *) echo "Waarschuwing: --movies ligt niet onder --media-root ($MEDIA_ROOT). Admin-paden moeten onder die root vallen." ;; 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 "${PUID}:${PGID}" "$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" chown "${PUID}:${PGID}" "$BIN_PATH" 2>/dev/null || true docker_cmd rm -f media-node >/dev/null 2>&1 || true VOLUMES=( -v "$APPDATA/config:/etc/media-node" -v "$APPDATA/data:/var/lib/media-node" -v "$BIN_PATH:/usr/local/bin/media-node:ro" -v "$MEDIA_ROOT:$MEDIA_ROOT:ro" ) if [ -d /etc/ssl/certs ]; then VOLUMES+=(-v /etc/ssl/certs:/etc/ssl/certs:ro) fi # Admin → Herstart via docker.sock (DSM: vaak root:root — group-add helpt niet altijd) 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 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 echo "Container starten (media-root=$MEDIA_ROOT, user=${PUID}:${PGID})..." docker_cmd 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 "TZ=${TZ:-Europe/Amsterdam}" \ --user "${PUID}:${PGID}" \ "${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 → Synology-LAN-IP:$PORT (buffering uit, Force SSL)" echo "Paden: Admin → Nodes → Edit (host-paden onder $MEDIA_ROOT)" echo "UID/GID: bij permission denied: --uid=/--gid= van 'id jouwuser'" echo echo "Na succes: credentials staan in $APPDATA — herstart zonder nieuwe token is ok." echo "Meerdere NAS'en: elk een eigen --name, --public-url en (indien nodig) --port."