175 lines
5.9 KiB
Bash
175 lines
5.9 KiB
Bash
#!/bin/bash
|
|
# Upgrade media-node binary (download latest from Master + restart container).
|
|
# Op Synology: herstelt ook /opt/media-node-bin + MEDIA_NODE_BIN_DIR als die ontbreken
|
|
# (anders faalt Admin→Upgrade met docker.sock / media-node.new permission denied).
|
|
set -euo pipefail
|
|
|
|
MASTER_URL="${MASTER_URL:-__MASTER_PUBLIC_URL__}"
|
|
APPDATA="${APPDATA:-/mnt/user/appdata/media-node}"
|
|
CONTAINER="${CONTAINER:-media-node}"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Gebruik:
|
|
curl -fsSL ${MASTER_URL}/install/upgrade-node.sh | bash -s -- --appdata=/mnt/user/appdata/media-node
|
|
|
|
Synology voorbeeld:
|
|
curl -fsSL ${MASTER_URL}/install/upgrade-node.sh | bash -s -- --appdata=/volume1/docker/media-node
|
|
|
|
Opties:
|
|
--appdata= Appdata-map met bin/media-node (Unraid: /mnt/user/appdata/media-node, Synology: /volume1/docker/media-node)
|
|
--container= Docker-containernaam (default: media-node)
|
|
--master= Master-URL (default: ${MASTER_URL})
|
|
EOF
|
|
}
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--appdata=*) APPDATA="${arg#*=}" ;;
|
|
--container=*) CONTAINER="${arg#*=}" ;;
|
|
--master=*) MASTER_URL="${arg#*=}" ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) echo "Onbekende optie: $arg"; usage; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
MASTER_URL="$(echo -n "$MASTER_URL" | sed 's:/*$::')"
|
|
APPDATA="$(echo -n "$APPDATA" | tr -d '\r\n' | sed 's:/*$::')"
|
|
|
|
docker_cmd() {
|
|
if docker info >/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 of geen rechten. Draai als root (Synology: sudo -i)."
|
|
exit 1
|
|
}
|
|
|
|
if ! command -v docker >/dev/null 2>&1 && ! command -v sudo >/dev/null 2>&1; then
|
|
echo "Docker niet gevonden."
|
|
exit 1
|
|
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
|
|
|
|
BIN_DIR="$APPDATA/bin"
|
|
BIN_PATH="$BIN_DIR/media-node"
|
|
mkdir -p "$BIN_DIR"
|
|
|
|
echo "=== media-node upgrade ==="
|
|
echo "Master: $MASTER_URL"
|
|
echo "Binary: $BIN_PATH"
|
|
echo "Container: $CONTAINER"
|
|
echo
|
|
|
|
echo "Downloaden ($BIN_NAME)..."
|
|
curl -fsSL "$MASTER_URL/install/$BIN_NAME" -o "$BIN_PATH.new"
|
|
chmod +x "$BIN_PATH.new"
|
|
mv -f "$BIN_PATH.new" "$BIN_PATH"
|
|
|
|
# Herstel Admin→Upgrade op Synology: directory-mount + env (file-mount alleen is niet genoeg).
|
|
ensure_bin_mount() {
|
|
if ! docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
|
return 0
|
|
fi
|
|
|
|
local has_mount has_env
|
|
has_mount="$(docker_cmd inspect -f '{{range .Mounts}}{{if eq .Destination "/opt/media-node-bin"}}1{{end}}{{end}}' "$CONTAINER" 2>/dev/null || true)"
|
|
has_env="$(docker_cmd inspect -f '{{range .Config.Env}}{{println .}}{{end}}' "$CONTAINER" 2>/dev/null | grep -c '^MEDIA_NODE_BIN_DIR=' || true)"
|
|
|
|
if [ "$has_mount" = "1" ] && [ "${has_env:-0}" -gt 0 ]; then
|
|
return 0
|
|
fi
|
|
|
|
echo
|
|
echo "Container mist /opt/media-node-bin en/of MEDIA_NODE_BIN_DIR — opnieuw aanmaken zodat Admin→Upgrade werkt..."
|
|
|
|
local user port image
|
|
user="$(docker_cmd inspect -f '{{.Config.User}}' "$CONTAINER")"
|
|
[ -n "$user" ] || user="1026:100"
|
|
port="$(docker_cmd inspect -f '{{(index (index .HostConfig.PortBindings "8080/tcp") 0).HostPort}}' "$CONTAINER" 2>/dev/null || true)"
|
|
[ -n "$port" ] || port="8080"
|
|
image="$(docker_cmd inspect -f '{{.Config.Image}}' "$CONTAINER")"
|
|
[ -n "$image" ] || image="alpine:3.20"
|
|
|
|
# Env behouden, MEDIA_NODE_BIN_DIR forceren, enrollment-token weglaten (credentials bestaan al).
|
|
local -a env_args=()
|
|
local line
|
|
while IFS= read -r line; do
|
|
[ -z "$line" ] && continue
|
|
case "$line" in
|
|
MEDIA_NODE_ENROLLMENT_TOKEN=*) continue ;;
|
|
MEDIA_NODE_BIN_DIR=*) continue ;;
|
|
MEDIA_NODE_CONTAINER_NAME=*) continue ;;
|
|
esac
|
|
env_args+=(-e "$line")
|
|
done < <(docker_cmd inspect -f '{{range .Config.Env}}{{println .}}{{end}}' "$CONTAINER")
|
|
env_args+=(-e "MEDIA_NODE_BIN_DIR=/opt/media-node-bin")
|
|
env_args+=(-e "MEDIA_NODE_CONTAINER_NAME=$CONTAINER")
|
|
|
|
# Bestaande mounts behouden, behalve bin-paden die we zelf opnieuw zetten.
|
|
local -a vol_args=()
|
|
local src dst mode
|
|
while IFS=$'\t' read -r src dst mode; do
|
|
[ -z "$dst" ] && continue
|
|
case "$dst" in
|
|
/usr/local/bin/media-node|/opt/media-node-bin) continue ;;
|
|
esac
|
|
if [ "$mode" = "ro" ]; then
|
|
vol_args+=(-v "$src:$dst:ro")
|
|
else
|
|
vol_args+=(-v "$src:$dst")
|
|
fi
|
|
done < <(docker_cmd inspect -f '{{range .Mounts}}{{.Source}}{{"\t"}}{{.Destination}}{{"\t"}}{{if .RW}}rw{{else}}ro{{end}}{{"\n"}}{{end}}' "$CONTAINER")
|
|
|
|
vol_args+=(-v "$BIN_PATH:/usr/local/bin/media-node:rw")
|
|
vol_args+=(-v "$BIN_DIR:/opt/media-node-bin:rw")
|
|
|
|
local -a group_args=()
|
|
if [ -S /var/run/docker.sock ]; then
|
|
local docker_gid
|
|
docker_gid="$(stat -c '%g' /var/run/docker.sock 2>/dev/null || true)"
|
|
if [ -n "$docker_gid" ] && [ "$docker_gid" != "0" ]; then
|
|
group_args+=(--group-add "$docker_gid")
|
|
fi
|
|
fi
|
|
|
|
docker_cmd stop "$CONTAINER" >/dev/null
|
|
docker_cmd rm "$CONTAINER" >/dev/null
|
|
|
|
docker_cmd run -d \
|
|
--name "$CONTAINER" \
|
|
--restart unless-stopped \
|
|
-p "${port}:8080" \
|
|
--user "$user" \
|
|
"${group_args[@]}" \
|
|
"${env_args[@]}" \
|
|
"${vol_args[@]}" \
|
|
--entrypoint /usr/local/bin/media-node \
|
|
"$image" \
|
|
run
|
|
|
|
echo "Container opnieuw aangemaakt met /opt/media-node-bin (Admin→Upgrade zou nu moeten werken)."
|
|
return 0
|
|
}
|
|
|
|
if docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
|
ensure_bin_mount || true
|
|
if docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
|
# Als ensure_bin_mount al opnieuw startte, restart nog eens zodat verse binary zeker geladen is.
|
|
echo "Container herstarten..."
|
|
docker_cmd restart "$CONTAINER" >/dev/null
|
|
fi
|
|
echo "Klaar. Controleer versie in Admin → Nodes (verwacht ${MEDIA_NODE_VERSION:-1.3.12}+)."
|
|
else
|
|
echo "Waarschuwing: container '$CONTAINER' niet gevonden — binary is wel bijgewerkt."
|
|
fi
|