#!/usr/bin/env bash # setup_mediamtx.sh — Install and configure MediaMTX for TechDJ # Run on the remote server as a user with sudo access: # bash setup_mediamtx.sh set -e LISTENER_PORT=5001 SRT_PATH=aussie_dj MEDIAMTX_CONF=/usr/local/etc/mediamtx/mediamtx.yml echo "==> Detecting architecture..." ARCH=$(uname -m) case "$ARCH" in x86_64) ARCH_LABEL="amd64" ;; aarch64) ARCH_LABEL="arm64" ;; armv7l) ARCH_LABEL="armv7" ;; *) echo "ERROR: Unsupported architecture: $ARCH"; exit 1 ;; esac echo " Architecture: $ARCH_LABEL" echo "==> Fetching latest MediaMTX version..." LATEST=$(curl -fsSL https://api.github.com/repos/bluenviron/mediamtx/releases/latest \ | grep '"tag_name"' | head -1 | sed 's/.*"v\([^"]*\)".*/\1/') if [ -z "$LATEST" ]; then echo "ERROR: Could not fetch latest version. Check internet connectivity." exit 1 fi echo " Latest version: v$LATEST" # Check if already installed and up to date if command -v mediamtx &>/dev/null; then INSTALLED=$(mediamtx --version 2>&1 | grep -oP '\d+\.\d+\.\d+' | head -1 || true) if [ "$INSTALLED" = "$LATEST" ]; then echo "==> MediaMTX v$LATEST already installed, skipping download." else echo "==> Updating MediaMTX from v$INSTALLED to v$LATEST..." INSTALL=1 fi else INSTALL=1 fi if [ "${INSTALL:-0}" = "1" ]; then TARBALL="mediamtx_v${LATEST}_linux_${ARCH_LABEL}.tar.gz" URL="https://github.com/bluenviron/mediamtx/releases/download/v${LATEST}/${TARBALL}" echo "==> Downloading $TARBALL..." curl -fsSL "$URL" -o "/tmp/$TARBALL" echo "==> Installing to /usr/local/bin..." sudo tar -xzf "/tmp/$TARBALL" -C /usr/local/bin mediamtx rm "/tmp/$TARBALL" echo " Installed: $(mediamtx --version 2>&1 | head -1)" fi echo "==> Writing MediaMTX config to $MEDIAMTX_CONF..." sudo mkdir -p "$(dirname "$MEDIAMTX_CONF")" cat << YAMLEOF | sudo tee "$MEDIAMTX_CONF" > /dev/null logLevel: info logDestinations: [stdout] paths: ${SRT_PATH}: runOnReady: "curl -s -X POST http://127.0.0.1:${LISTENER_PORT}/api/webhook -H 'Content-Type: application/json' -d '{\"event\":\"publish\",\"path\":\"${SRT_PATH}\"}'" runOnNotReady: "curl -s -X POST http://127.0.0.1:${LISTENER_PORT}/api/webhook -H 'Content-Type: application/json' -d '{\"event\":\"unpublish\",\"path\":\"${SRT_PATH}\"}'" YAMLEOF echo " Config written." echo "==> Writing systemd service..." sudo tee /etc/systemd/system/mediamtx.service > /dev/null << 'SVCEOF' [Unit] Description=MediaMTX Real-time Media Server After=network.target [Service] ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx/mediamtx.yml Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target SVCEOF echo "==> Enabling and starting mediamtx service..." sudo systemctl daemon-reload sudo systemctl enable mediamtx sudo systemctl restart mediamtx echo "==> Opening firewall ports..." if command -v ufw &>/dev/null; then sudo ufw allow "${SRT_PORT}/udp" && echo " UFW: opened ${SRT_PORT}/udp (SRT)" sudo ufw allow "${HLS_PORT}/tcp" && echo " UFW: opened ${HLS_PORT}/tcp (HLS)" else echo " UFW not found — open ports ${SRT_PORT}/udp and ${HLS_PORT}/tcp manually." fi echo "" echo "==> Waiting for service to start..." sleep 2 sudo systemctl status mediamtx --no-pager | head -20 echo "" echo "================================================================" echo " MediaMTX setup complete!" echo " SRT ingest : srt://$(hostname -f):${SRT_PORT}?streamid=${SRT_PATH}" echo " HLS output : http://$(hostname -f):${HLS_PORT}/${SRT_PATH}/index.m3u8" echo " Webhook : http://127.0.0.1:${LISTENER_PORT}/api/webhook" echo "================================================================"