#!/usr/bin/env bash # 安装 Playwright Chromium(Linux 宝塔/无桌面服务器) # 用法: bash /www/wwwroot/douyin/backend/baota_playwright.sh set -euo pipefail BACKEND="$(cd "$(dirname "$0")" && pwd)" ROOT="$(cd "$BACKEND/.." && pwd)" # shellcheck source=lib/resolve_python.sh source "$BACKEND/lib/resolve_python.sh" PY="${KEFU_PYTHON:-}" if [ -z "$PY" ]; then PY="$(resolve_python "$BACKEND" "$ROOT")" fi export PLAYWRIGHT_BROWSERS_PATH="${PLAYWRIGHT_BROWSERS_PATH:-$ROOT/playwright-browsers}" mkdir -p "$PLAYWRIGHT_BROWSERS_PATH" chown -R www:www "$PLAYWRIGHT_BROWSERS_PATH" 2>/dev/null || true echo "========================================" echo " Playwright Chromium 安装" echo " Python: $PY" echo " 目录: $PLAYWRIGHT_BROWSERS_PATH" echo "========================================" echo "[1/4] 安装系统依赖(需 root)..." if [ "$(uname -s)" = "Linux" ]; then if [ "$(id -u)" -eq 0 ]; then # 优先用 dnf(阿里云 Linux 3 / Anolis / RHEL 8+),回退到 yum DNF="" if command -v dnf &>/dev/null; then DNF="dnf" elif command -v yum &>/dev/null; then DNF="yum" fi if [ -n "$DNF" ]; then # Chromium 运行库 + Xvfb 虚拟显示(无桌面服务器跑有头浏览器扫码登录必需) "$DNF" install -y atk at-spi2-atk cups-libs libdrm libXcomposite libXdamage \ libXrandr mesa-libgbm pango alsa-lib nss nspr libxkbcommon \ libXScrnSaver gtk3 xorg-x11-server-Xvfb 2>/dev/null || true elif command -v apt-get &>/dev/null; then apt-get update apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \ libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 \ libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 \ libatspi2.0-0 libxshmfence1 xvfb 2>/dev/null || true fi "$PY" -m playwright install-deps chromium || true else echo " 非 root,跳过 install-deps / Xvfb(若启动失败请 sudo 执行本脚本)" fi fi echo "[2/4] 安装 pyvirtualdisplay(自动拉起 Xvfb 虚拟显示)..." # requirements.txt 已含 pyvirtualdisplay;这里兜底确保 venv 内已安装 "$PY" -m pip show pyvirtualdisplay &>/dev/null \ || "$PY" -m pip install "pyvirtualdisplay==3.0" || true echo "[3/4] 下载 Chromium..." "$PY" -m playwright install chromium echo "[4/4] 校验..." CHROME=$(find "$PLAYWRIGHT_BROWSERS_PATH" -name chrome -type f 2>/dev/null | head -1) if [ -n "$CHROME" ] && [ -x "$CHROME" ]; then echo "[OK] 浏览器: $CHROME" chmod +x "$CHROME" 2>/dev/null || true chown -R www:www "$PLAYWRIGHT_BROWSERS_PATH" 2>/dev/null || true else echo "[错误] 未找到 chrome 可执行文件,请检查网络或磁盘空间" ls -la "$PLAYWRIGHT_BROWSERS_PATH" 2>/dev/null || true exit 1 fi echo # 校验虚拟显示链路:无桌面 Linux 上扫码登录依赖 Xvfb + pyvirtualdisplay if [ "$(uname -s)" = "Linux" ] && [ -z "${DISPLAY:-}" ]; then XVFB_OK=0 command -v Xvfb &>/dev/null && XVFB_OK=1 PVD_OK=0 "$PY" -c "import pyvirtualdisplay" &>/dev/null && PVD_OK=1 if [ "$XVFB_OK" = "1" ] && [ "$PVD_OK" = "1" ]; then echo "[OK] Xvfb + pyvirtualdisplay 就绪,云端可直接点「登录」用手机扫码" else echo "[警告] 扫码登录所需的虚拟显示未就绪:" [ "$XVFB_OK" = "0" ] && echo " - 缺少 Xvfb,请 root 执行: dnf install -y xorg-x11-server-Xvfb" [ "$PVD_OK" = "0" ] && echo " - 缺少 pyvirtualdisplay,请执行: $PY -m pip install pyvirtualdisplay==3.0" echo " 或改用: xvfb-run -a bash $ROOT/start_web.sh 启动服务" fi fi echo echo "请将以下写入 .env 或宝塔环境变量:" echo " PLAYWRIGHT_BROWSERS_PATH=$PLAYWRIGHT_BROWSERS_PATH" echo echo "安装完成,重启项目: bash $BACKEND/baota_start.sh"