#!/usr/bin/env bash set -euo pipefail usage() { cat <<'EOF' Usage: start-relay.sh Options via env: MYNETSPEEDER_RELAY_HOST relay 监听地址,默认 0.0.0.0 MYNETSPEEDER_RELAY_PORT relay 监听端口,默认 9009 MYNETSPEEDER_INSTALL_DIR 安装目录,默认 /opt/mynetspeeder MYNETSPEEDER_USER 运行用户,默认 mynetspeeder EOF } LISTEN_HOST="${MYNETSPEEDER_RELAY_HOST:-0.0.0.0}" LISTEN_PORT="${MYNETSPEEDER_RELAY_PORT:-9009}" TOKEN="${MYNETSPEEDER_RELAY_TOKEN:-${1:-}}" INSTALL_DIR="${MYNETSPEEDER_INSTALL_DIR:-/opt/mynetspeeder}" INSTALL_PARENT="$(dirname "$INSTALL_DIR")" PACKAGE_NAME="$(basename "$INSTALL_DIR")" RUNTIME_USER="${MYNETSPEEDER_USER:-mynetspeeder}" PID_FILE="/var/run/mynetspeeder-relay.pid" LOG_FILE="/var/log/mynetspeeder-relay.log" if [[ $EUID -ne 0 ]]; then echo "need root" exit 1 fi if [[ -z "$TOKEN" ]]; then usage exit 1 fi if [[ ! -d "$INSTALL_DIR" ]]; then echo "install dir not found: $INSTALL_DIR" exit 1 fi id -u "$RUNTIME_USER" >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin "$RUNTIME_USER" mkdir -p /var/log : > "$LOG_FILE" chown "$RUNTIME_USER":"$RUNTIME_USER" "$LOG_FILE" pkill -f 'python3 -m mynetspeeder relay' || true runuser -u "$RUNTIME_USER" -- bash -lc "export PYTHONUNBUFFERED=1; export PYTHONPATH=${INSTALL_PARENT}; cd ${INSTALL_PARENT} && exec nohup python3 -m ${PACKAGE_NAME} relay --listen-host ${LISTEN_HOST} --listen-port ${LISTEN_PORT} --token ${TOKEN}" >>"$LOG_FILE" 2>&1 & RELAY_PID=$! echo "$RELAY_PID" > "$PID_FILE" sleep 1 if ! ss -ln | grep -qE "[:.]${LISTEN_PORT}( |$)"; then echo "relay failed to listen on ${LISTEN_HOST}:${LISTEN_PORT}" tail -n 50 "$LOG_FILE" || true exit 1 fi echo "relay started on ${LISTEN_HOST}:${LISTEN_PORT}" echo "pid file: $PID_FILE" echo "log file: $LOG_FILE"