97 lines
3.7 KiB
Bash
97 lines
3.7 KiB
Bash
#!/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"
|