Spaces:
Paused
Paused
| set -euo pipefail | |
| DATA_DIR="${WEB2API_DATA_DIR:-/data}" | |
| CONFIG_PATH="${WEB2API_CONFIG_PATH:-${DATA_DIR}/config.yaml}" | |
| DB_PATH="${WEB2API_DB_PATH:-${DATA_DIR}/db.sqlite3}" | |
| XVFB_ARGS="${XVFB_SCREEN_ARGS:--screen 0 1600x900x24}" | |
| DISPLAY_NUM="${XVFB_DISPLAY_NUM:-99}" | |
| DISPLAY_VALUE=":${DISPLAY_NUM}" | |
| mkdir -p "${DATA_DIR}" | |
| export HOME="${DATA_DIR}" | |
| export WEB2API_CONFIG_PATH="${CONFIG_PATH}" | |
| export WEB2API_DB_PATH="${DB_PATH}" | |
| export PYTHONUNBUFFERED=1 | |
| # 清理残留的浏览器 profile,避免 Singleton* 锁导致 Chromium 认为 profile 正在被使用。 | |
| rm -rf "${HOME}/fp-data" | |
| if [[ ! -f "${CONFIG_PATH}" ]]; then | |
| cp /app/docker/config.container.yaml "${CONFIG_PATH}" | |
| fi | |
| mkdir -p "${HOME}/fp-data" | |
| if [[ $# -gt 0 ]]; then | |
| exec "$@" | |
| fi | |
| cleanup() { | |
| if [[ -n "${XVFB_PID:-}" ]]; then | |
| kill "${XVFB_PID}" >/dev/null 2>&1 || true | |
| fi | |
| } | |
| trap cleanup EXIT INT TERM | |
| # ---- Xvfb virtual display ---- | |
| mkdir -p /tmp/.X11-unix | |
| rm -f "/tmp/.X${DISPLAY_NUM}-lock" | |
| Xvfb "${DISPLAY_VALUE}" ${XVFB_ARGS} -nolisten tcp -ac & | |
| XVFB_PID=$! | |
| for _ in $(seq 1 100); do | |
| if [[ -S "/tmp/.X11-unix/X${DISPLAY_NUM}" ]]; then | |
| break | |
| fi | |
| sleep 0.1 | |
| done | |
| if [[ ! -S "/tmp/.X11-unix/X${DISPLAY_NUM}" ]]; then | |
| echo "Xvfb failed to create display ${DISPLAY_VALUE}" >&2 | |
| exit 1 | |
| fi | |
| export DISPLAY="${DISPLAY_VALUE}" | |
| exec python -u /app/main.py | |