#!/usr/bin/env bash # # ミドルウェア・ランタイム依存の準備スクリプト # # npm install 後や依存バージョン更新後に実行して、 # npm パッケージ以外のランタイム依存が揃っていることを確認する。 # # ./scripts/prepare.sh # set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" OK=0 WARN=0 FAIL=0 pass() { echo " ✓ $1"; OK=$((OK + 1)); } warn() { echo " △ $1"; WARN=$((WARN + 1)); } fail() { echo " ✗ $1"; FAIL=$((FAIL + 1)); } echo "=== ランタイム依存チェック ===" echo "" # ------------------------------------------------- # 1. Playwright ブラウザバイナリ # ------------------------------------------------- echo "[1/4] Playwright ブラウザ..." # playwright が要求する chromium のパスを取得 EXPECTED_PATH=$(node -e " try { const { chromium } = require('playwright'); console.log(chromium.executablePath()); } catch { process.exit(1); } " 2>/dev/null) || EXPECTED_PATH="" if [ -n "$EXPECTED_PATH" ] && [ -x "$EXPECTED_PATH" ]; then pass "chromium: $EXPECTED_PATH" else echo " → ブラウザバイナリが見つかりません。インストール中..." if npx playwright install chromium 2>&1 | tail -3; then pass "chromium インストール完了" else fail "chromium のインストールに失敗しました。手動で 'npx playwright install chromium' を実行してください" fi fi # システム共有ライブラリ(libnspr4, libnss3, libatk 等)の確認・インストール # playwright install-deps は不足ライブラリを apt 等でインストールする(root 権限が必要) if [ -n "$EXPECTED_PATH" ] && [ -x "$EXPECTED_PATH" ]; then # ldd でリンク切れを簡易チェック MISSING_LIBS=$(ldd "$EXPECTED_PATH" 2>/dev/null | grep "not found" || true) if [ -n "$MISSING_LIBS" ]; then echo " → 共有ライブラリが不足しています。インストール中..." echo "$MISSING_LIBS" | head -5 | sed 's/^/ /' if npx playwright install-deps chromium 2>&1 | tail -3; then pass "システム依存ライブラリ インストール完了" else warn "システム依存ライブラリのインストールに失敗しました(root 権限が必要です)。手動で 'sudo npx playwright install-deps chromium' を実行してください" fi else pass "システム依存ライブラリ: OK" fi fi echo "" # ------------------------------------------------- # 2. noVNC 依存(オプション) # ------------------------------------------------- echo "[2/4] noVNC 依存(オプション)..." NOVNC_DEPS=(Xvfb x11vnc websockify) NOVNC_MISSING=() for cmd in "${NOVNC_DEPS[@]}"; do if command -v "$cmd" >/dev/null 2>&1; then pass "$cmd: $(command -v "$cmd")" else NOVNC_MISSING+=("$cmd") fi done if [ ${#NOVNC_MISSING[@]} -gt 0 ]; then warn "未インストール: ${NOVNC_MISSING[*]} — noVNC CAPTCHA 解決を使う場合は ./scripts/setup-novnc.sh を実行してください" fi echo "" # ------------------------------------------------- # 3. better-sqlite3 ネイティブモジュール # ------------------------------------------------- echo "[3/4] ネイティブモジュール..." if node -e "require('better-sqlite3')" 2>/dev/null; then pass "better-sqlite3: ロード OK" else fail "better-sqlite3 のロードに失敗しました。'npm rebuild better-sqlite3' を試してください" fi echo "" # ------------------------------------------------- # 4. 日本語フォント(AnnotateImage のテキスト描画用) # ------------------------------------------------- echo "[4/4] 日本語フォント(オプション)..." if command -v fc-list >/dev/null 2>&1; then if fc-list :lang=ja 2>/dev/null | grep -q .; then pass "日本語フォント: 利用可能" else warn "日本語フォント未検出 — AnnotateImage のテキスト描画が □□□ になる可能性があります。'sudo apt install fonts-noto-cjk' を実行してください" fi else warn "fc-list コマンドなし — フォント検出をスキップしました" fi echo "" # ------------------------------------------------- # サマリー # ------------------------------------------------- echo "=== 結果: ✓ $OK △ $WARN ✗ $FAIL ===" if [ "$FAIL" -gt 0 ]; then echo "" echo "エラーがあります。上記の指示に従って修正してください。" exit 1 fi echo "" echo "準備完了です。"