- #!/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"
|