#!/usr/bin/env bash set -e APP="ppv" BASE="/ppvgo" SERVICE="/etc/systemd/system/ppv.service" AMD_URL="https://ppv.168.us.kg/x/ru/ppv_amd" ARM_URL="https://ppv.168.us.kg/x/ru/ppv_arm" DEFAULT_PORT="4579" get_public_ip() { PUBLIC_IP=$(curl -4 -s --max-time 5 https://api.ipify.org || true) if [[ -z "$PUBLIC_IP" ]]; then PUBLIC_IP=$(curl -4 -s --max-time 5 https://ifconfig.me || true) fi if [[ -z "$PUBLIC_IP" ]]; then PUBLIC_IP="你的公网IP" fi } install_app() { echo echo "========================================" echo " PPVGO 安装 / 更新" echo "========================================" echo if [[ $EUID -ne 0 ]]; then echo "错误:请使用 root 运行" exit 1 fi # 检测 CPU 架构 ARCH=$(uname -m) case "$ARCH" in x86_64|amd64) BIN_URL="$AMD_URL" ARCH_NAME="AMD64" ;; aarch64|arm64) BIN_URL="$ARM_URL" ARCH_NAME="ARM64" ;; *) echo "错误:不支持的 CPU 架构:$ARCH" exit 1 ;; esac echo "CPU 架构:$ARCH_NAME" echo mkdir -p "$BASE" # 如果已经安装,读取原来的端口 if [[ -f "${BASE}/.env" ]]; then OLD_PORT=$(grep '^PORT=' "${BASE}/.env" 2>/dev/null | cut -d= -f2- || true) if [[ -n "$OLD_PORT" ]]; then DEFAULT_PORT="$OLD_PORT" fi fi # 输入端口 read -p "请输入监听端口 [${DEFAULT_PORT}]: " PORT if [[ -z "$PORT" ]]; then PORT="$DEFAULT_PORT" fi # 检查端口 if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then echo "错误:端口必须是数字" exit 1 fi if (( PORT < 1 || PORT > 65535 )); then echo "错误:端口范围必须是 1-65535" exit 1 fi echo echo "架构:$ARCH_NAME" echo "端口:$PORT" echo # 停止旧服务 echo "==> 停止旧服务" systemctl stop "$APP" 2>/dev/null || true # 下载 echo echo "==> 下载 PPV 二进制" echo "$BIN_URL" echo TMP="${BASE}/ppv.tmp" rm -f "$TMP" curl -fL \ --progress-bar \ "$BIN_URL" \ -o "$TMP" # 检查文件 if [[ ! -s "$TMP" ]]; then echo echo "错误:下载文件为空" rm -f "$TMP" exit 1 fi # 检查 ELF echo echo "==> 检查二进制" if ! file "$TMP" | grep -q "ELF"; then echo echo "错误:下载的文件不是 Linux ELF 二进制" file "$TMP" rm -f "$TMP" exit 1 fi mv "$TMP" "${BASE}/ppv" chmod +x "${BASE}/ppv" echo "二进制检查通过" # PROXY_SECRET echo echo "==> 检查 PROXY_SECRET" if [[ -f "${BASE}/.env" ]] && grep -q '^PROXY_SECRET=' "${BASE}/.env"; then PROXY_SECRET=$(grep '^PROXY_SECRET=' "${BASE}/.env" | cut -d= -f2-) echo "使用已有 PROXY_SECRET" else if ! command -v openssl >/dev/null 2>&1; then echo "错误:系统没有 openssl" echo "请先安装 openssl" exit 1 fi PROXY_SECRET=$(openssl rand -hex 32) echo "已生成新的 PROXY_SECRET" fi # 保存环境变量 cat > "${BASE}/.env" < 创建 systemd 服务" cat > "$SERVICE" < 获取公网 IPv4" get_public_ip # 完成 echo echo "========================================" echo " PPVGO 安装成功" echo "========================================" echo echo "CPU:${ARCH_NAME}" echo "目录:${BASE}" echo "端口:${PORT}" echo "公网 IP:${PUBLIC_IP}" echo echo "播放接口:" echo echo "http://${PUBLIC_IP}:${PORT}/healthz" echo "http://${PUBLIC_IP}:${PORT}/?proxy=1&id=247-cows" echo "http://${PUBLIC_IP}:${PORT}/playlist.m3u" echo echo "========================================" echo " 常用命令" echo "========================================" echo echo "查看状态:" echo "systemctl status ppv" echo echo "查看日志:" echo "journalctl -u ppv -f" echo echo "重启:" echo "systemctl restart ppv" echo echo "停止:" echo "systemctl stop ppv" echo echo "配置:" echo "${BASE}/.env" echo } start_app() { systemctl start ppv echo echo "PPVGO 已启动" echo } stop_app() { systemctl stop ppv echo echo "PPVGO 已停止" echo } restart_app() { systemctl restart ppv echo echo "PPVGO 已重启" echo } status_app() { systemctl status ppv --no-pager } logs_app() { journalctl -u ppv -f } uninstall_app() { echo echo "========================================" echo " 卸载 PPVGO" echo "========================================" echo read -p "确定卸载 PPVGO?[y/N]: " CONFIRM if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then echo "已取消" exit 0 fi systemctl stop ppv 2>/dev/null || true systemctl disable ppv 2>/dev/null || true rm -f "$SERVICE" systemctl daemon-reload systemctl reset-failed ppv 2>/dev/null || true rm -rf "$BASE" echo echo "========================================" echo " PPVGO 已卸载" echo "========================================" echo } menu() { clear echo "========================================" echo " PPVGO 一键管理脚本" echo "========================================" echo echo "1. 安装 / 更新" echo "2. 启动" echo "3. 停止" echo "4. 重启" echo "5. 查看状态" echo "6. 查看日志" echo "7. 卸载" echo "0. 退出" echo read -p "请选择: " NUM case "$NUM" in 1) install_app ;; 2) start_app ;; 3) stop_app ;; 4) restart_app ;; 5) status_app ;; 6) logs_app ;; 7) uninstall_app ;; 0) exit 0 ;; *) echo echo "无效选项" ;; esac } menu