mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-11-04 10:22:50 +00:00
Improve Node.js setup robustness and module handling
Enhances the setup_nodejs function by improving checks for existing Node.js and npm installations, ensuring jq is installed, handling APT update failures with retries, and providing clearer messaging. Also refines global Node module installation logic with better version checks, update/install messaging, and error handling. Ensures a safe working directory for npm to avoid errors.
This commit is contained in:
@@ -2577,28 +2577,38 @@ function setup_nodejs() {
|
|||||||
local NODE_MODULE="${NODE_MODULE:-}"
|
local NODE_MODULE="${NODE_MODULE:-}"
|
||||||
local CURRENT_NODE_VERSION=""
|
local CURRENT_NODE_VERSION=""
|
||||||
local NEED_NODE_INSTALL=false
|
local NEED_NODE_INSTALL=false
|
||||||
local DISTRO_ID DISTRO_CODENAME
|
|
||||||
DISTRO_ID=$(awk -F= '/^ID=/{print $2}' /etc/os-release | tr -d '"')
|
|
||||||
DISTRO_CODENAME=$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)
|
|
||||||
|
|
||||||
|
# Check if Node.js is already installed
|
||||||
if command -v node >/dev/null; then
|
if command -v node >/dev/null; then
|
||||||
CURRENT_NODE_VERSION="$(node -v | grep -oP '^v\K[0-9]+')"
|
CURRENT_NODE_VERSION="$(node -v | grep -oP '^v\K[0-9]+')"
|
||||||
if [[ "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then
|
if [[ "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then
|
||||||
|
msg_info "Old Node.js $CURRENT_NODE_VERSION found, replacing with $NODE_VERSION"
|
||||||
NEED_NODE_INSTALL=true
|
NEED_NODE_INSTALL=true
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
msg_info "Setup Node.js $NODE_VERSION"
|
||||||
NEED_NODE_INSTALL=true
|
NEED_NODE_INSTALL=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
$STD apt-get update
|
||||||
|
$STD apt-get install -y jq || {
|
||||||
|
msg_error "Failed to install jq"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install Node.js if required
|
||||||
if [[ "$NEED_NODE_INSTALL" == true ]]; then
|
if [[ "$NEED_NODE_INSTALL" == true ]]; then
|
||||||
msg_info "Setup Node.js $NODE_VERSION"
|
ensure_dependencies curl ca-certificates gnupg
|
||||||
|
|
||||||
ensure_dependencies jq curl ca-certificates
|
if [[ -n "$CURRENT_NODE_VERSION" ]]; then
|
||||||
|
$STD apt-get purge -y nodejs npm || true
|
||||||
|
fi
|
||||||
|
|
||||||
$STD apt purge -y nodejs npm || true
|
|
||||||
cleanup_old_repo_files "nodesource"
|
cleanup_old_repo_files "nodesource"
|
||||||
|
|
||||||
# NodeSource uses "nodistro"
|
# NodeSource uses deb822 format with "nodistro"
|
||||||
setup_deb822_repo \
|
setup_deb822_repo \
|
||||||
"nodesource" \
|
"nodesource" \
|
||||||
"https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" \
|
"https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" \
|
||||||
@@ -2607,65 +2617,85 @@ function setup_nodejs() {
|
|||||||
"main" \
|
"main" \
|
||||||
"amd64 arm64"
|
"amd64 arm64"
|
||||||
|
|
||||||
if ! $STD apt install -y nodejs; then
|
sleep 2
|
||||||
|
if ! apt-get update >/dev/null 2>&1; then
|
||||||
|
msg_warn "APT update failed – retrying in 5s"
|
||||||
|
sleep 5
|
||||||
|
if ! apt-get update >/dev/null 2>&1; then
|
||||||
|
msg_error "Failed to update APT repositories after adding NodeSource"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! apt-get install -y nodejs >/dev/null 2>&1; then
|
||||||
msg_error "Failed to install Node.js ${NODE_VERSION} from NodeSource"
|
msg_error "Failed to install Node.js ${NODE_VERSION} from NodeSource"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v npm >/dev/null 2>&1; then
|
# Update to latest npm
|
||||||
msg_warn "npm not found after Node.js install – installing manually"
|
$STD npm install -g npm@latest || {
|
||||||
$STD apt install -y npm
|
msg_error "Failed to update npm to latest version"
|
||||||
msg_ok "Installed npm from Debian repository"
|
}
|
||||||
fi
|
|
||||||
|
|
||||||
# Update npm to latest (safe if manual install used)
|
|
||||||
$STD npm install -g npm@latest || true
|
|
||||||
|
|
||||||
cache_installed_version "nodejs" "$NODE_VERSION"
|
cache_installed_version "nodejs" "$NODE_VERSION"
|
||||||
msg_ok "Setup Node.js $NODE_VERSION"
|
msg_ok "Setup Node.js ${NODE_VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||||
mkdir -p /opt && cd /opt || {
|
|
||||||
msg_error "Failed to change directory to /opt"
|
# Ensure valid working directory for npm (avoids uv_cwd error)
|
||||||
|
if [[ ! -d /opt ]]; then
|
||||||
|
mkdir -p /opt
|
||||||
|
fi
|
||||||
|
cd /opt || {
|
||||||
|
msg_error "Failed to set safe working directory before npm install"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Install global Node modules
|
||||||
if [[ -n "$NODE_MODULE" ]]; then
|
if [[ -n "$NODE_MODULE" ]]; then
|
||||||
IFS=',' read -ra MODULES <<<"$NODE_MODULE"
|
IFS=',' read -ra MODULES <<<"$NODE_MODULE"
|
||||||
for mod in "${MODULES[@]}"; do
|
for mod in "${MODULES[@]}"; do
|
||||||
local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
|
local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
|
||||||
if [[ "$mod" == @*/*@* ]]; then
|
if [[ "$mod" == @*/*@* ]]; then
|
||||||
|
# Scoped package with version, e.g. @vue/cli-service@latest
|
||||||
MODULE_NAME="${mod%@*}"
|
MODULE_NAME="${mod%@*}"
|
||||||
MODULE_REQ_VERSION="${mod##*@}"
|
MODULE_REQ_VERSION="${mod##*@}"
|
||||||
elif [[ "$mod" == *"@"* ]]; then
|
elif [[ "$mod" == *"@"* ]]; then
|
||||||
|
# Unscoped package with version, e.g. yarn@latest
|
||||||
MODULE_NAME="${mod%@*}"
|
MODULE_NAME="${mod%@*}"
|
||||||
MODULE_REQ_VERSION="${mod##*@}"
|
MODULE_REQ_VERSION="${mod##*@}"
|
||||||
else
|
else
|
||||||
|
# No version specified
|
||||||
MODULE_NAME="$mod"
|
MODULE_NAME="$mod"
|
||||||
MODULE_REQ_VERSION="latest"
|
MODULE_REQ_VERSION="latest"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if the module is already installed
|
||||||
if npm list -g --depth=0 "$MODULE_NAME" >/dev/null 2>&1; then
|
if npm list -g --depth=0 "$MODULE_NAME" >/dev/null 2>&1; then
|
||||||
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
|
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
|
||||||
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
|
||||||
$STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" || {
|
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
|
||||||
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
||||||
msg_error "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION"
|
msg_error "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION"
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then
|
elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then
|
||||||
$STD npm install -g "${MODULE_NAME}@latest" || {
|
msg_info "Updating $MODULE_NAME to latest version"
|
||||||
|
if ! $STD npm install -g "${MODULE_NAME}@latest"; then
|
||||||
msg_error "Failed to update $MODULE_NAME to latest version"
|
msg_error "Failed to update $MODULE_NAME to latest version"
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
$STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" || {
|
msg_info "Installing $MODULE_NAME@$MODULE_REQ_VERSION"
|
||||||
|
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}"; then
|
||||||
msg_error "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION"
|
msg_error "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION"
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
msg_ok "Installed Node.js modules: $NODE_MODULE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user