#!/usr/bin/env bash set -euo pipefail IMAGE_URL="${IMAGE_URL:-https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/file/oa_sfu_docker/yzx-oa-sfu_0.1.0-live_linux-amd64.tar}" IMAGE_TAR="${IMAGE_TAR:-yzx-oa-sfu_0.1.0-live_linux-amd64.tar}" IMAGE_NAME="${SFU_IMAGE:-yzx-oa-sfu:0.1.0-live}" CONTAINER_NAME="${CONTAINER_NAME:-yzx-oa-sfu}" INSTALL_DIR="${INSTALL_DIR:-/opt/yzx_oa_sfu}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" get_env() { local key="$1" local default_value="$2" local line value line="$(grep -E "^${key}=" .env | tail -n 1 || true)" value="${line#*=}" value="${value%$'\r'}" value="${value#\'}" value="${value%\'}" value="${value#\"}" value="${value%\"}" if [ -n "$value" ]; then printf "%s" "$value" else printf "%s" "$default_value" fi } download_image() { if [ -f "$IMAGE_TAR" ]; then echo "Image tar already exists: $IMAGE_TAR" return fi echo "Downloading image tar:" echo " $IMAGE_URL" if command -v curl >/dev/null 2>&1; then curl -fL --retry 3 --retry-delay 3 -o "$IMAGE_TAR" "$IMAGE_URL" elif command -v wget >/dev/null 2>&1; then wget -O "$IMAGE_TAR" "$IMAGE_URL" else echo "Missing curl/wget. Please install one of them or upload $IMAGE_TAR manually." >&2 exit 1 fi } if ! command -v docker >/dev/null 2>&1; then echo "Docker is not installed or not in PATH." >&2 exit 1 fi mkdir -p "$INSTALL_DIR" cd "$INSTALL_DIR" if [ ! -f ".env" ]; then if [ -f "$SCRIPT_DIR/.env" ]; then cp "$SCRIPT_DIR/.env" .env echo "Created $INSTALL_DIR/.env from deploy/.env." echo "Please review .env before production use." else echo "Missing .env. Put deploy/.env next to this script or create $INSTALL_DIR/.env." >&2 exit 1 fi fi download_image echo "Loading Docker image..." docker load -i "$IMAGE_TAR" PORT="$(get_env PORT 4443)" RTC_MIN_PORT="$(get_env MEDIASOUP_RTC_MIN_PORT 40000)" RTC_MAX_PORT="$(get_env MEDIASOUP_RTC_MAX_PORT 40100)" echo "Restarting container: $CONTAINER_NAME" docker rm -f "$CONTAINER_NAME" 2>/dev/null || true docker run -d \ --name "$CONTAINER_NAME" \ --restart unless-stopped \ --security-opt seccomp=unconfined \ --env-file .env \ -p "${PORT}:${PORT}/tcp" \ -p "${RTC_MIN_PORT}-${RTC_MAX_PORT}:${RTC_MIN_PORT}-${RTC_MAX_PORT}/udp" \ -p "${RTC_MIN_PORT}-${RTC_MAX_PORT}:${RTC_MIN_PORT}-${RTC_MAX_PORT}/tcp" \ "$IMAGE_NAME" echo docker ps --filter "name=${CONTAINER_NAME}" echo echo "Health check:" if command -v curl >/dev/null 2>&1; then curl -fsS "http://127.0.0.1:${PORT}/healthz" || true echo else echo "curl not found; run: curl http://127.0.0.1:${PORT}/healthz" fi echo echo "Done. Logs:" echo " docker logs -f $CONTAINER_NAME"