install: фолбэк pip --target=lib, если в python3 нет venv

На многих сборках Entware (включая aarch64-k3.10) пакет python3-venv
недоступен и `python3 -m venv` падает с `No module named venv`.
Делаем установку без venv:
- если venv создаётся — используем его (как раньше)
- иначе ставим зависимости в $INST/lib через `pip install --target=lib`
- run.sh и init-скрипт автоопределяют режим (PYTHONPATH=lib для второго)

Также: opkg install python3-venv стал опциональным (как и был, но без
обязательного завершения цепочки).
This commit is contained in:
Андрей Бобырев
2026-04-26 00:26:29 +03:00
parent caa1dd1602
commit af1981cf0c
3 changed files with 61 additions and 15 deletions

View File

@@ -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 режим)
### Первый запуск

View File

@@ -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"

22
run.sh
View File

@@ -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