#!/usr/bin/env bash # Setup script for ChartPipeline on a fresh machine. # Run from the project root (the directory this script is in). # # Prereqs you have to handle BEFORE running this script: # 1. Python 3.10+ installed (conda or system). # 2. Node.js 18+ installed (`node -v`). # 3. Google Chrome or Chromium installed at /usr/bin/google-chrome # (or set PUPPETEER_EXECUTABLE_PATH to its real path). # 4. librsvg2-bin installed (provides rsvg-convert). On Ubuntu: # sudo apt install librsvg2-bin tmux # If you have no sudo, install via conda: # conda install -c conda-forge librsvg tmux # 5. Input data pools available at the paths config.py points to, # e.g. /data/liduan/resources/claude_data_v2 and claude_new. # Edit config.data_resource_dirs to match this machine if needed. set -u cd "$(dirname "$0")" ROOT="$(pwd)" echo "[setup] cwd=$ROOT" # ---- 1. Python deps ---- echo echo "============================================================" echo "[setup] installing python deps from requirements.txt" echo "============================================================" pip install -r requirements.txt # Things requirements.txt was missing on the source machine; install # defensively so chart_engine + selenium-based screenshot both work. pip install pyecharts snapshot_selenium selenium # ---- 2. Node deps ---- echo echo "============================================================" echo "[setup] installing node deps (puppeteer / echarts ...)" echo "============================================================" if [[ -f package.json ]]; then # IMPORTANT: ChartPipeline's puppeteer was patched to *re-use* an existing # Chrome via PUPPETEER_EXECUTABLE_PATH; skip the bundled chromium download # to save ~300 MB and avoid network friction. PUPPETEER_SKIP_DOWNLOAD=1 npm install else echo "[setup] package.json missing, skipping npm install" fi # ---- 3. System binaries sanity check ---- echo echo "============================================================" echo "[setup] checking system binaries" echo "============================================================" for bin in google-chrome rsvg-convert tmux node npm python; do loc="$(command -v "$bin" 2>/dev/null || true)" if [[ -n "$loc" ]]; then printf ' %-14s OK %s\n' "$bin" "$loc" else printf ' %-14s MISSING -- you need to install this before running pipeline.py\n' "$bin" fi done # ---- 4. PUPPETEER_EXECUTABLE_PATH ---- echo echo "============================================================" echo "[setup] puppeteer chrome path" echo "============================================================" CHROME_BIN="${PUPPETEER_EXECUTABLE_PATH:-$(command -v google-chrome || command -v chromium || true)}" if [[ -n "$CHROME_BIN" ]]; then echo " PUPPETEER_EXECUTABLE_PATH = $CHROME_BIN (export this before running pipeline.py)" else echo " WARNING: no chrome/chromium found; puppeteer will fail at runtime" fi # ---- 5. Quick import test ---- echo echo "============================================================" echo "[setup] verifying config + key imports" echo "============================================================" python - <<'PY' import importlib import config print(f" config.resource_path = {config.resource_path}") print(f" config.data_resource_dirs[0]= {config.data_resource_dirs[0]}") for mod in ( "modules.chart_engine.template.template_registry", "modules.infographics_generator.template_utils", "modules.infographics_generator.infographics_generator", ): importlib.import_module(mod) print(f" import {mod} OK") PY echo echo "[setup] DONE." echo "Next steps:" echo " 1. Edit config.py 's data_resource_dirs if data pools live elsewhere on this host." echo " 2. (optional) Edit allowed_chart_types.json to restrict which chart_type are eligible." echo " 3. Launch a chart-only run, e.g.:" echo " export PUPPETEER_EXECUTABLE_PATH=$CHROME_BIN" echo " tmux new-session -d -s chart_10h \\" echo " \"PRIOR_SESSION=__none__ THREADS=48 DEADLINE_SEC=36000 bash scripts/run_10h_loop.sh\""