diff --git a/README.md b/README.md index 93bd827..768fc98 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,9 @@ chmod +x install.sh uninstall.sh run.sh bootstrap.sh Скрипт: - копирует файлы в **`/opt/share/keenetic_ssh-web`** -- создаёт **`venv`**, ставит **Flask** и **Waitress** +- ставит **Flask** и **Waitress**: предпочтительно в `venv/`; если модуль `venv` в Python отсутствует (типично для `aarch64-k3.10`), то — в локальный `lib/` через `pip install --target` - создаёт **`data/store.json`** и **`.env`** из примеров -- устанавливает **`/opt/etc/init.d/S99keenetic-ssh-web`** +- устанавливает **`/opt/etc/init.d/S99keenetic-ssh-web`** (автоопределяет venv/lib режим) ### Первый запуск diff --git a/install.sh b/install.sh index 2730379..b60e98c 100644 --- a/install.sh +++ b/install.sh @@ -25,20 +25,42 @@ fi chmod +x "$INST/run.sh" -echo "==> Entware: python3 + venv" +echo "==> Entware: python3 + pip" if command -v opkg >/dev/null 2>&1; then opkg update || echo "(opkg update: частичные ошибки источников — продолжаем)" - opkg install python3 python3-pip python3-light python3-venv >/dev/null 2>&1 \ - || opkg install python3 python3-pip >/dev/null 2>&1 \ - || echo "(opkg install python3: пропуск — пакеты возможно уже стоят)" + # python3 + pip обязательны; python3-venv — желателен, но в некоторых сборках отсутствует + opkg install python3 python3-pip >/dev/null 2>&1 || true + opkg install python3-venv python3-light >/dev/null 2>&1 || true fi cd "$INST" -if [ ! -x venv/bin/python3 ]; then - "$PY" -m venv venv || { echo "Не удалось создать venv. Установите: opkg install python3-venv"; exit 1; } + +# 1) пробуем venv +USE_VENV=0 +if [ -x venv/bin/python3 ]; then + USE_VENV=1 +elif "$PY" -m venv venv >/tmp/kssh-venv.log 2>&1; then + USE_VENV=1 + echo "==> venv: $INST/venv" +else + echo "==> venv недоступен (нет модуля venv в python3) — ставим зависимости в $INST/lib" + rm -rf venv +fi + +if [ "$USE_VENV" = "1" ]; then + ./venv/bin/pip install -q --upgrade pip 2>/dev/null || true + ./venv/bin/pip install -q -r requirements.txt +else + # 2) фолбэк: pip install --target=lib (без venv, рабочий путь для старых Entware) + if ! "$PY" -m pip --version >/dev/null 2>&1; then + echo "ОШИБКА: ни venv, ни pip недоступны. Установите вручную: opkg install python3-pip" + exit 1 + fi + rm -rf lib + mkdir -p lib + "$PY" -m pip install -q --target=lib --upgrade pip 2>/dev/null || true + "$PY" -m pip install -q --target=lib -r requirements.txt fi -./venv/bin/pip install -q --upgrade pip -./venv/bin/pip install -q -r requirements.txt INIT="/opt/etc/init.d/S99keenetic-ssh-web" echo "==> Init-скрипт $INIT" @@ -60,14 +82,22 @@ case "$1" in echo "already running" exit 0 fi - [ -x "$DIR/venv/bin/python3" ] || { echo "no venv in $DIR"; exit 1; } cd "$DIR" || exit 1 + if [ -x "$DIR/venv/bin/python3" ]; then + PYBIN="$DIR/venv/bin/python3" + elif [ -d "$DIR/lib" ] && [ -x /opt/bin/python3 ]; then + PYBIN="/opt/bin/python3" + export PYTHONPATH="$DIR/lib:${PYTHONPATH:-}" + else + echo "Нет ни $DIR/venv, ни $DIR/lib — установите заново: $DIR/install.sh" + exit 1 + fi set -a [ -f .env ] && . ./.env set +a export PYTHONUNBUFFERED=1 PORT="${PORT:-2001}" - nohup "$DIR/venv/bin/python3" -m waitress --listen="0.0.0.0:$PORT" app:app \ + nohup "$PYBIN" -m waitress --listen="0.0.0.0:$PORT" app:app \ >>/opt/var/log/keenetic-ssh-web.log 2>&1 & echo $! > "$PID" echo "keenetic_ssh-web started pid=$(cat "$PID") port=$PORT" diff --git a/run.sh b/run.sh index 062861a..1737069 100644 --- a/run.sh +++ b/run.sh @@ -1,8 +1,24 @@ #!/bin/sh -# Запуск через Waitress (рекомендуется на роутере) -cd "$(dirname "$0")" || exit 1 +# Запуск через Waitress (рекомендуется на роутере). Поддерживает оба режима: +# - venv: $DIR/venv/bin/python3 +# - lib/: /opt/bin/python3 + PYTHONPATH=$DIR/lib (если venv недоступен) +DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$DIR" || exit 1 set -a [ -f .env ] && . ./.env set +a export PYTHONUNBUFFERED=1 -exec /opt/bin/python3 -m waitress --listen="0.0.0.0:${PORT:-2001}" app:app + +if [ -x "$DIR/venv/bin/python3" ]; then + PYBIN="$DIR/venv/bin/python3" +elif [ -d "$DIR/lib" ] && [ -x /opt/bin/python3 ]; then + PYBIN="/opt/bin/python3" + export PYTHONPATH="$DIR/lib:${PYTHONPATH:-}" +elif command -v python3 >/dev/null 2>&1; then + PYBIN="$(command -v python3)" +else + echo "Нет python3. Установите: opkg install python3 python3-pip" >&2 + exit 1 +fi + +exec "$PYBIN" -m waitress --listen="0.0.0.0:${PORT:-2001}" app:app