Files
douyin/backend/baota_playwright.sh
T
2026-07-17 09:24:47 +08:00

97 lines
3.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 安装 Playwright ChromiumLinux 宝塔/无桌面服务器)
# 用法: 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"