Compare commits

..

3 Commits

Author SHA1 Message Date
CanbiZ (MickLesk)
450c1f37a0 refactor(node-heap): raise auto cap to 12GB and simplify OOM hint
- Increase setup_nodejs auto heap clamp from 4GB to 12GB for heavy frontend builds
- Keep lower bound at 1GB and preserve user override precedence
- Simplify error_handler Node OOM output to a single concise hint
- Align error_handler heap suggestion clamp to 12GB
2026-04-23 13:58:55 +02:00
CanbiZ (MickLesk)
4241fd10da feat(error-handler): add actionable Node.js heap OOM guidance
Detect probable Node.js heap out-of-memory failures from log patterns and
common build exit codes, then print targeted remediation hints instead of
only a generic SIGABRT/SIGKILL message.

- Detect OOM patterns in last log lines (Reached heap limit, JS heap OOM)
- Treat node build contexts with exit 134/137/243 as likely heap issues
- Suggest computed --max-old-space-size based on NODE_OPTIONS, var_ram,
  or MemTotal (clamped to 1024..4096 MB)
- Recommend calling setup_nodejs before build steps so defaults apply
2026-04-23 13:55:59 +02:00
CanbiZ (MickLesk)
ca25682495 feat(nodejs): auto-size NODE_OPTIONS heap and apply in Termix updates
- setup_nodejs now sets NODE_OPTIONS only when not already set
- Heap size is auto-derived from NODE_MAX_OLD_SPACE_SIZE, var_ram, or MemTotal
- Auto heap is clamped to 1024..4096 MB to avoid too-small or too-large defaults
- Termix update path now calls setup_nodejs before frontend/backend builds so
  Node heap defaults are applied consistently during updates
2026-04-23 13:51:35 +02:00
3 changed files with 79 additions and 5 deletions

View File

@@ -155,6 +155,8 @@ EOF
/opt/termix/nginx/client_body
msg_ok "Recreated Directories"
NODE_VERSION="24" setup_nodejs
msg_info "Building Frontend"
cd /opt/termix
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0

View File

@@ -313,6 +313,51 @@ error_handler() {
echo -e "${TAB}-----------------------------------\n"
fi
# Detect probable Node.js heap OOM and print actionable guidance.
# This avoids generic SIGABRT/SIGKILL confusion for frontend build failures.
local node_oom_detected="false"
local node_build_context="false"
if [[ "$command" =~ (npm|pnpm|yarn|node|vite|turbo) ]]; then
node_build_context="true"
fi
if [[ "$exit_code" == "243" ]]; then
node_oom_detected="true"
elif [[ -n "$active_log" && -s "$active_log" ]]; then
if tail -n 200 "$active_log" 2>/dev/null | grep -Eqi 'Reached heap limit|JavaScript heap out of memory|Allocation failed - JavaScript heap out of memory|FATAL ERROR: Reached heap limit'; then
node_oom_detected="true"
fi
fi
if [[ "$node_oom_detected" == "true" ]] || { [[ "$node_build_context" == "true" ]] && [[ "$exit_code" =~ ^(134|137)$ ]]; }; then
local heap_hint_mb=""
# If explicitly configured, prefer the current value for troubleshooting output.
if [[ -n "${NODE_OPTIONS:-}" ]] && [[ "${NODE_OPTIONS}" =~ max-old-space-size=([0-9]+) ]]; then
heap_hint_mb="${BASH_REMATCH[1]}"
elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
heap_hint_mb=$((var_ram * 75 / 100))
else
local mem_kb=""
mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
if [[ "$mem_kb" =~ ^[0-9]+$ ]]; then
local mem_mb=$((mem_kb / 1024))
heap_hint_mb=$((mem_mb * 75 / 100))
fi
fi
if [[ -z "$heap_hint_mb" ]] || ((heap_hint_mb < 1024)); then
heap_hint_mb=1024
elif ((heap_hint_mb > 12288)); then
heap_hint_mb=12288
fi
if declare -f msg_warn >/dev/null 2>&1; then
msg_warn "Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build."
else
echo -e "${YW}Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build.${CL}"
fi
fi
# Detect context: Container (INSTALL_LOG set + inside container /root) vs Host
if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then
# CONTAINER CONTEXT: Copy log and create flag file for host

View File

@@ -6336,15 +6336,12 @@ function setup_nodejs() {
}
fi
# Scenario 1: Already installed at target version - upgrade to latest minor/patch + update packages/modules
# Scenario 1: Already installed at target version - just update packages/modules
if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" == "$NODE_VERSION" ]]; then
msg_info "Update Node.js $NODE_VERSION"
ensure_apt_working || return 100
# Upgrade to the latest minor/patch release from NodeSource
$STD apt-get install -y --only-upgrade nodejs 2>/dev/null || true
# Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425)
$STD npm install -g npm@11.11.0 2>/dev/null || true
@@ -6423,7 +6420,37 @@ function setup_nodejs() {
msg_ok "Setup Node.js $NODE_VERSION"
fi
export NODE_OPTIONS="--max-old-space-size=4096"
# Set a safe default heap limit for Node.js builds if not explicitly provided.
# Priority:
# 1) NODE_OPTIONS (caller/user override)
# 2) NODE_MAX_OLD_SPACE_SIZE (explicit MB override)
# 3) var_ram (LXC memory setting, MB)
# 4) /proc/meminfo (runtime memory detection)
# Auto value is clamped to 1024..12288 MB.
if [[ -z "${NODE_OPTIONS:-}" ]]; then
local node_heap_mb=""
if [[ -n "${NODE_MAX_OLD_SPACE_SIZE:-}" ]] && [[ "${NODE_MAX_OLD_SPACE_SIZE}" =~ ^[0-9]+$ ]]; then
node_heap_mb="${NODE_MAX_OLD_SPACE_SIZE}"
elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
node_heap_mb=$((var_ram * 75 / 100))
else
local total_mem_kb=""
total_mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
if [[ "$total_mem_kb" =~ ^[0-9]+$ ]]; then
local total_mem_mb=$((total_mem_kb / 1024))
node_heap_mb=$((total_mem_mb * 75 / 100))
fi
fi
if [[ -z "$node_heap_mb" ]] || ((node_heap_mb < 1024)); then
node_heap_mb=1024
elif ((node_heap_mb > 12288)); then
node_heap_mb=12288
fi
export NODE_OPTIONS="--max-old-space-size=${node_heap_mb}"
fi
# Ensure valid working directory for npm (avoids uv_cwd error)
if [[ ! -d /opt ]]; then