v2.4.6: universal apt_lock_wait helper (fix nginx install on fresh VPS)

- lib/common.sh: add apt_lock_wait + apt_install + apt_update helpers
  * waits up to 300s for dpkg lock held by unattended-upgrades
  * uses DPkg::Lock::Timeout=120 native flag
  * captures stderr to show real error if install fails
- lib/website.sh: install_nginx/install_certbot use apt_install
  (fixes "Could not get lock /var/lib/dpkg/lock-frontend" during Pro setup)
- install.sh: bot_install uses apt_install (removes duplicated lock logic)
- lib/common.sh: ensure_deps uses apt_update + apt_install
This commit is contained in:
anten-ka
2026-04-10 20:01:20 +03:00
parent 3403975636
commit eb5175ccab
4 changed files with 77 additions and 49 deletions

46
install.sh Normal file → Executable file
View File

@@ -762,42 +762,22 @@ bot_install() {
if [ "$need_py" = "1" ]; then
log_info "$(t bot_install_python)"
if command -v apt-get &>/dev/null; then
# Wait for dpkg lock (unattended-upgrades often holds it on fresh VPS)
local lock_waited=0
while fuser /var/lib/dpkg/lock-frontend &>/dev/null \
|| fuser /var/lib/dpkg/lock &>/dev/null \
|| fuser /var/lib/apt/lists/lock &>/dev/null; do
if [ $lock_waited -eq 0 ]; then
log_warning "apt/dpkg locked by another process (likely unattended-upgrades), waiting up to 300s..."
fi
sleep 3
lock_waited=$((lock_waited + 3))
if [ $lock_waited -ge 300 ]; then
log_error "apt lock not released after 300s. Kill unattended-upgrades and retry: systemctl stop unattended-upgrades; pkill -9 unattended-upgr"
return 1
fi
done
[ $lock_waited -gt 0 ] && log_success "apt lock released (waited ${lock_waited}s)"
# Detect Python version for versioned venv package (Debian 12 / Ubuntu 24.04 need python3.12-venv etc.)
# Detect Python version for versioned venv package (Debian 12 / Ubuntu 24.04 need python3.12-venv)
local py_ver=""
if command -v python3 &>/dev/null; then
py_ver=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null)
fi
# apt's native lock timeout as extra safety
local APT_OPTS="-o DPkg::Lock::Timeout=120"
apt-get $APT_OPTS update -qq || log_warning "apt update had errors (continuing)"
apt_update
# Build package list with versioned venv fallback
local pkg_list="python3 python3-venv python3-pip"
[ -n "$py_ver" ] && pkg_list="$pkg_list python${py_ver}-venv"
# python3-full is optional (not on all distros); try it first, then without
if ! apt-get $APT_OPTS install -y $pkg_list python3-full; then
local pkg_list=(python3 python3-venv python3-pip)
[ -n "$py_ver" ] && pkg_list+=("python${py_ver}-venv")
# python3-full optional
if ! apt_install "${pkg_list[@]}" python3-full; then
log_warning "python3-full unavailable, installing core packages only..."
apt-get $APT_OPTS install -y $pkg_list || {
log_error "Failed to install Python packages. Run manually: apt install $pkg_list"
apt_install "${pkg_list[@]}" || {
log_error "Failed to install Python packages. Run manually: apt install ${pkg_list[*]}"
return 1
}
fi
@@ -845,17 +825,11 @@ bot_install() {
cat /tmp/venv_err >&2 2>/dev/null
# Try to fix by installing versioned python3.X-venv package
if command -v apt-get &>/dev/null; then
# Wait for lock again (unattended-upgrades may have restarted)
local lock_waited=0
while fuser /var/lib/dpkg/lock-frontend &>/dev/null; do
sleep 3
lock_waited=$((lock_waited + 3))
[ $lock_waited -ge 180 ] && break
done
local py_ver
py_ver=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null)
log_info "reinstalling python${py_ver}-venv..."
apt-get -o DPkg::Lock::Timeout=120 install -y python3-venv python3-pip "python${py_ver}-venv" python3-full 2>&1 | tail -n 10 >&2 || true
apt_install python3-venv python3-pip "python${py_ver}-venv" python3-full || \
apt_install python3-venv python3-pip "python${py_ver}-venv" || true
rm -rf "$BOT_DIR/venv"
python3 -m venv "$BOT_DIR/venv" || { log_error "venv still broken, aborting. Manual fix: apt install python${py_ver}-venv python3-pip"; return 1; }
else