#!/bin/bash # Upgrade Node.js to v22 LTS on All Application Containers # Uses host mount method for unprivileged containers set -uo pipefail NODE_IP="192.168.11.11" APPLICATION_CONTAINERS=(10030 10040 10050 10060 10070 10080 10090 10091 10092 10130 10150 10151) log_info() { echo -e "\033[0;32m[INFO]\033[0m $1"; } log_error() { echo -e "\033[0;31m[ERROR]\033[0m $1"; } log_success() { echo -e "\033[0;32m[✓]\033[0m $1"; } upgrade_nodejs_host_mount() { local vmid="$1" log_info "Upgrading Node.js to v22 LTS on CT $vmid via host mount..." ssh -o ConnectTimeout=30 -o StrictHostKeyChecking=no root@${NODE_IP} " # Stop container pct stop $vmid 2>/dev/null || true sleep 3 # Mount container MOUNT_OUT=\$(pct mount $vmid 2>&1) MOUNT=\$(echo \"\$MOUNT_OUT\" | grep -o '/var/lib/lxc/[0-9]*/rootfs' | head -1) if [ -z \"\$MOUNT\" ]; then # Try alternative mount point format MOUNT=\$(echo \"\$MOUNT_OUT\" | grep rootfs | awk '{print \$NF}' | head -1) fi if [ -n \"\$MOUNT\" ] && [ -d \"\$MOUNT\" ]; then # Upgrade Node.js using chroot /usr/sbin/chroot \$MOUNT /bin/bash -c ' export DEBIAN_FRONTEND=noninteractive # Remove old Node.js if installed via apt apt-get remove -y nodejs npm 2>/dev/null || true # Update package lists apt-get update -qq # Install prerequisites apt-get install -y -qq curl ca-certificates gnupg lsb-release || exit 1 # Add NodeSource repository for Node.js 22 LTS curl -fsSL https://deb.nodesource.com/setup_22.x | bash - || exit 1 # Install Node.js 22 LTS apt-get install -y -qq nodejs || exit 1 # Install pnpm globally npm install -g pnpm || exit 1 # Verify installation node --version && npm --version && pnpm --version && echo \"Node.js v22 installed\" ' && echo 'Node.js v22 installed successfully' || echo 'Installation failed' # Unmount pct unmount $vmid 2>/dev/null || true else echo \"Mount failed. Mount output: \$MOUNT_OUT\" pct unmount $vmid 2>/dev/null || true exit 1 fi # Start container pct start $vmid 2>/dev/null || true sleep 3 " && log_success "Node.js v22 installed on CT $vmid" || log_error "Failed to install Node.js v22 on CT $vmid" } upgrade_nodejs_direct() { local vmid="$1" log_info "Upgrading Node.js to v22 LTS on CT $vmid (direct method)..." ssh -o ConnectTimeout=30 -o StrictHostKeyChecking=no root@${NODE_IP} " pct exec $vmid -- bash -c ' export DEBIAN_FRONTEND=noninteractive # Remove old Node.js if installed via apt apt-get remove -y nodejs npm 2>/dev/null || true # Update package lists apt-get update -qq # Install prerequisites apt-get install -y -qq curl ca-certificates gnupg lsb-release || exit 1 # Add NodeSource repository for Node.js 22 LTS curl -fsSL https://deb.nodesource.com/setup_22.x | bash - || exit 1 # Install Node.js 22 LTS apt-get install -y -qq nodejs || exit 1 # Install pnpm globally npm install -g pnpm || exit 1 # Verify installation node --version && npm --version && pnpm --version && echo \"Node.js v22 installed\" ' 2>&1 " && log_success "Node.js v22 installed on CT $vmid" || log_error "Failed to install Node.js v22 on CT $vmid" } echo "═══════════════════════════════════════════════════════════" echo "Upgrade Node.js to v22 LTS on All Application Containers" echo "═══════════════════════════════════════════════════════════" echo "" # Use host mount method for unprivileged containers log_info "Upgrading Node.js on application containers (using host mount method)..." for vmid in "${APPLICATION_CONTAINERS[@]}"; do upgrade_nodejs_host_mount "$vmid" sleep 2 done # Verify installations echo "" log_info "Verifying Node.js v22 installations..." for vmid in "${APPLICATION_CONTAINERS[@]}"; do version=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${NODE_IP} \ "pct exec $vmid -- node --version 2>&1 | head -1 || echo 'not installed'") npm_version=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${NODE_IP} \ "pct exec $vmid -- npm --version 2>&1 | head -1 || echo 'not installed'") echo " CT $vmid: Node.js $version, npm $npm_version" done echo "" log_success "Node.js upgrade to v22 LTS complete!"