Problem Summary
On a Siemens SIMATIC IOT2050 gateway running Node-RED, the Manage Palette install of nodes such as node-red-dashboard fails with a native compilation error, even though the same Node-RED and Node.js versions install the same palette without issue on an engineering laptop (e.g. Siemens PG M6 with an x86_64 CPU). The failure presents only on the IOT2050 and the log typically shows a node-pre-gyp, prebuild-install, or node-gyp error during the npm install stage triggered by the palette manager.
The two visible symptoms in the Node-RED log panel are:
- Prebuilt binary lookup warning:
prebuild-install WARN install No prebuilt binaries found (target=arm64 runtime=node arch=arm64 libc=glibc platform=linux)followed by an attempt to fall back to a local source build. - Native build failure inside the
node-gypstep:gyp ERR! stack Error: not found: makeorgyp ERR! find Python, terminating withmake: *** [Release/obj.target/...] Error 1andnpm ERR! code ELIFECYCLE.
The issue is not a Node-RED core bug and not a problem with the target package's JavaScript source - it is an architecture / toolchain mismatch specific to the IOT2050's ARM64 image.
Root Cause: ARM64 vs x86_64 Prebuilt Binaries
Many Node-RED contrib nodes are not pure JavaScript. They depend on native modules such as:
-
node-sqlite3,better-sqlite3 -
bcrypt,argon2 @serialport/bindings-cpp-
canvas,sharp -
node-rdkafka,node-zookeeper-client
These native modules are normally distributed as prebuilt binaries through the node-pre-gyp or prebuild-install services. The published manifest on the npm registry lists binaries for linux-x64, darwin-x64, darwin-arm64, win32-x64, but rarely for linux-arm64 unless the maintainer explicitly enables it. When no matching prebuilt is found, the install script falls back to a node-gyp source build, which requires:
- A C/C++ toolchain (
build-essential,make,gcc,g++) - Python 3 (or Python 2 on legacy nodes)
- Correct
node-gypversion matching the installed Node.js - Header files for the target Node.js version
The Siemens IOT2050 ships with a TI Sitara AM6528 / AM6548 SoC (dual or quad ARM Cortex-A53 cores, 64-bit, aarch64). When the example image or the IndustrialOS is used, the toolchain may be missing or the package's binding.gyp may be authored for x86_64. The build either fails because make is not present, or because the generated Makefile references x86_64-only flags. The same node-red-dashboard package on the engineer's Intel laptop finds a prebuilt for linux-x64 and the source-build path is never exercised - that is why "the same version" works on the laptop but not on the IOT2050.
arch=arm64, platform=linux, libc=glibc. The prebuilt lookup needs a manifest entry under linux-arm64 or the package must be compilable from source on ARM.Affected Hardware: Siemens SIMATIC IOT2050 Family
The condition is reproducible across the IOT2050 product family. Confirm the specific variant before applying the fix:
| Variant | SoC | Arch | Typical Image |
|---|---|---|---|
| IOT2050 Basic | TI AM6528 (dual A53) | aarch64 | Example Image 1.x / IndustrialOS |
| IOT2050 Standard | TI AM6528 (dual A53) | aarch64 | Example Image 1.x / IndustrialOS |
| IOT2050 Advanced | TI AM6548 (quad A53) | aarch64 | Example Image 2.x / IndustrialOS |
Reference the official product page on the Siemens Industry Online Support portal: SIMATIC IOT2050 product support and the corresponding Siemens Industry Online Support manuals (search the IOT2050 MLFB for the bundled Operating Instructions and Example Image Description). Hardware architecture, image versions, and the precise CPU stepping are documented in those PDFs.
Diagnostic Verification Steps
Run the following commands over SSH on the IOT2050 to confirm the architecture and the missing toolchain pieces before changing anything:
-
Confirm CPU and OS architecture
uname -m→ expected outputaarch64node -p process.arch→ expected outputarm64cat /etc/os-release→ recordPRETTY_NAMEand version (Example Image 1.x.x is Debian-based; IndustrialOS is a Siemens-managed image). -
Confirm Node.js and Node-RED versions
node -vnpm -vnode-red -v(or read~/.node-red/package.json) -
Confirm npm target architecture
npm config get target_archshould returnarm64npm config get target_platformshould returnlinux -
Confirm the toolchain
which make gcc g++ python3→ if any of these return nothing, the source build will fail. -
Reproduce the failure from CLI
cd ~/.node-rednpm install node-red-dashboard --no-audit --foreground-scripts 2>&1 | tee /tmp/nrd.log
The full stack trace shows whether the failure is inprebuild-installor innode-gyp.
npm engine but truncates the log. Running the install directly in ~/.node-red produces the complete error chain required to pick the right remediation path.Resolution Method 1: Confirm Which Image is Installed
Siemens ships two different images for the IOT2050:
-
Example Image - a Debian-based image with the full development toolchain (
build-essential,python3,git,node-gyp). Source builds succeed on this image. -
IndustrialOS - a hardened, footprint-optimised image with no compiler toolchain. Source builds will fail because
make,gccand headers are not present.
Run dpkg -l | grep -E 'build-essential|gcc|make' on the device. If the packages are absent you are on IndustrialOS or a slimmed-down Example Image. This single fact determines which of the methods below will succeed.
Resolution Method 2: Install the ARM64 Build Toolchain
If you are on the full Example Image, install the missing pieces:
- Refresh the package list:
sudo apt-get update - Install the toolchain and Python:
sudo apt-get install -y build-essential python3 make g++ libssl-dev - Install
node-gypglobally so it matches the Node.js version shipped with the image:sudo npm install -g node-gyp - Rebuild any previously failed native modules:
cd ~/.node-rednpm rebuild --build-from-source - Retry the palette install from the Node-RED UI or from CLI:
npm install node-red-dashboard --no-audit
The official Node-RED documentation describes the build prerequisites in Adding nodes to your palette and the Node-RED FAQ covers the canonical answer to "my install fails - why?". For npm semantics, see npm install in the official npm CLI documentation.
Resolution Method 3: Force Native Compilation with --build-from-source
When the package's prebuilt is only available for linux-x64 and the postinstall script unconditionally tries to download it, override the prebuilt path and force a source build. This is the cleanest fix when the toolchain is present but the prebuilt is wrong:
- Stop Node-RED:
systemctl --user stop nodered(or kill the running process) - Run the install with the override:
cd ~/.node-rednpm_config_target_arch=arm64 npm_config_build_from_source=true npm install <package> --build-from-source --foreground-scripts - Verify the resulting binary was compiled for ARM64:
file ~/.node-red/node_modules/<package>/build/Release/*.node
Expected:ELF 64-bit LSB shared object, ARM aarch64, ... - Restart Node-RED and confirm the new node appears in the palette.
binding.gyp contains x86_64-only flags (e.g. -msse4.2, -mavx2) or references headers that do not exist for ARM, the source build will still fail. In that case the package must be patched or replaced with an ARM-compatible alternative.Resolution Method 4: Use Architecture-Agnostic Nodes
For nodes that are pure JavaScript and have no native dependencies (most node-red-contrib-* packages, node-red-dashboard, node-red-node-ui-table, node-red-contrib-s7comm), the install succeeds regardless of architecture. For nodes that do pull native code, prefer either:
- The Node-RED "recommended" alternative that uses a different backend (e.g.
node-red-node-sqlitefornode-sqlite3), or - A community fork that publishes
linux-arm64prebuilts - check the package's dist tags in the npm registry: npm dist-tag documentation.
Before installing, inspect a node's dependency tree for any of the native modules listed in the Root Cause section above:
npm view <package> dependencies devDependencies
Resolution Method 5: Use the Siemens Example Image (Recommended for New Devices)
For first-batch or unprovisioned IOT2050 units, Siemens historically delivered the device with a pre-installed Example Image that included the full toolchain and a working Node-RED. Newer firmware drops (post-Example Image 1.0.x) and the IndustrialOS deliver a slimmer image. The recommended path on a new device is:
- Download the latest Example Image for the IOT2050 variant from the Siemens Industry Online Support portal (search the IOT2050 MLFB and look under Downloads → Firmware/Image).
- Flash the image to a microSD card using the procedure in the bundled Operating Instructions PDF.
- Boot the IOT2050, log in, confirm
uname -mreturnsaarch64and thatbuild-essentialis present. - Install Node-RED globally as documented in Node-RED local installation and the palette installation guide.
- Retry the failing palette install.
The Example Image and its version history are documented in the Siemens Industry Online Support portal - search for the IOT2050 MLFB and the Example Image Description PDF.
Verification and Acceptance Test
After applying any of the above remediations, run the full acceptance sequence:
-
Package install completes with no errors:
cd ~/.node-rednpm install node-red-dashboard --no-audit
Expected: ends withadded N packages in Ysand zeronpm ERR!lines. -
Native binary is ARM64 (only relevant if the package contains one):
file ~/.node-red/node_modules/<package>/build/Release/*.node
Expected:ELF 64-bit LSB shared object, ARM aarch64, ... -
Node-RED loads the new node:
Start Node-RED (node-redorsystemctl --user start nodered), openhttp://<iot2050-ip>:1880, and confirm the new node is present in the left palette. Watch the boot log fornode-red-contrib-<name> registered. -
Module loads at runtime:
In Node-RED, drop the new node onto a flow, deploy, and check the browser console and Node-RED log for module-load errors such asError: /lib/x86_64-linux-gnu/libc.so.6: cannot open shared object file- the presence of that string means a prebuilt x86_64 binary is still on disk and needs to be rebuilt. -
Persistent across reboot:
sudo reboot, wait for the IOT2050 to come back, confirm Node-RED auto-starts (if usingsystemdunit) and that the palette still contains the previously installed node.
Troubleshooting Matrix
| Symptom in log | Likely cause | Fix |
|---|---|---|
prebuild-install WARN No prebuilt binaries found (target=arm64) followed by successful build |
Source build worked | No action - install completes |
gyp ERR! stack Error: not found: make |
build-essential not installed |
Method 2: install build-essential + make
|
gyp ERR! find Python |
Python 3 missing or not on PATH | Method 2: apt-get install python3
|
node-pre-gyp ERR! install Error: ENOENT, ...node-vXX-linux-x64.tar.gz |
Package forced x86_64 download | Method 3: --build-from-source + npm_config_target_arch=arm64
|
make: *** [Release/obj.target/...] Error 1 with reference to -msse4.2 or -mavx2
|
binding.gyp contains x86 intrinsics | Method 4: replace with ARM-compatible package or patch binding.gyp |
Install hangs on idealTree:audit for >5 min |
Network or npm registry unreachable | Check curl -I https://registry.npmjs.org/ from the IOT2050; check npm config get registry
|
Install succeeds but Node-RED log shows Error: /lib/x86_64-linux-gnu/libc.so.6: ...
|
Mixed-arch node_modules left from prior install |
rm -rf ~/.node-red/node_modules ~/.node-red/package-lock.json then re-install |
| Palette install works on engineering laptop but not on IOT2050 | Architecture / prebuilt mismatch - this article | Methods 1-5 above |
| Works on IOT2050 FS01 first batch, fails on later units | Image change (slimmer toolchain on newer drops) | Method 5: re-flash the Example Image |
Engineering Notes and Edge Cases
-
Same version, different CPU. Node-RED and Node.js versions are not the variable - the architecture and the published prebuilt manifests are. Always compare
node -p process.archandnpm -von both machines, not just the Node-RED version. -
IndustrialOS users. The IndustrialOS image on the IOT2050 is intended for production use and does not include a compiler. Adding
build-essentialto a production device is generally not recommended - prefer a dev image for build, then deploy a pre-builtnode_modulesdirectory to the production unit. See Siemens' IOT2050 documentation on the Siemens Industry Online Support portal for the supported update path. -
npm registry behind a proxy. Many factory networks proxy HTTPS traffic. If
npm installtimes out, configurenpm config set proxy <URL>andnpm config set https-proxy <URL>as described in the npm config documentation. -
Node-RED docker images. If Node-RED is run inside a container on the IOT2050, the same architecture rules apply. Use
node-red/node-red-dockertags whose base image matches the device (e.g.-slim-v8runs on ARM64; the olderlatesttag may not). See the Node-RED Docker image tags listing for available variants. -
Cross-compiling. For very large projects it is faster to build on an x86_64 build host with an ARM64 cross-toolchain (
gcc-aarch64-linux-gnu) and copy the resultingnode_modulesto the IOT2050. This avoids touching the IOT2050 image.
Why do Node-RED palette installs fail on the Siemens IOT2050 but succeed on a Siemens PG M6 laptop with the same Node-RED version?
The IOT2050 is an ARM64 (aarch64) device. Many Node-RED contrib packages ship with prebuilt binaries for linux-x64 but not for linux-arm64, so the installer falls back to a source build. The PG M6 is x86_64 and gets a prebuilt, skipping the build entirely. The root cause is the prebuilt manifest, not the Node-RED or Node.js version.
How do I confirm the IOT2050 is the ARM64 architecture?
SSH into the device and run uname -m (expected output aarch64), node -p process.arch (expected arm64), and cat /etc/os-release to record the image version. The IOT2050 uses a TI Sitara AM6528 or AM6548 SoC with ARM Cortex-A53 cores.
What is the fastest fix when the IOT2050 image is missing the build toolchain?
Install the toolchain with sudo apt-get install -y build-essential python3 make g++ libssl-dev, then sudo npm install -g node-gyp and re-run npm install in ~/.node-red. If the device runs IndustrialOS, prefer re-flashing the official Example Image from the Siemens Industry Online Support portal instead of adding a compiler to a production device.
Can I force a package to compile from source on ARM64?
Yes. From ~/.node-red, run npm_config_target_arch=arm64 npm_config_build_from_source=true npm install <package> --build-from-source --foreground-scripts. Verify the resulting binary with file ~/.node-red/node_modules/<package>/build/Release/*.node and confirm the output contains ARM aarch64.
Is node-red-dashboard supposed to install on the IOT2050?
Yes - node-red-dashboard is pure JavaScript and installs on any architecture as long as the palette manager can reach the npm registry. If it fails on the IOT2050, the cause is almost always a transitive dependency that pulls in a native module, not the dashboard package itself. Run the CLI install described in Diagnostic Verification Steps to see the real error.