# BetterFrame Node-RED image with bundled BF nodes preinstalled. # # Extends official nodered/node-red, installs the workspace nodered/ # package at /usr/src/betterframe-nodes. settings.js points nodesDir # there so Node-RED scans it on boot. Survives /data volume mount. FROM nodered/node-red:latest USER root # su-exec lets the entrypoint drop from root → node-red after fixing /data. # nodered/node-red:latest is Alpine-based — apt isn't present. RUN apk add --no-cache su-exec # Copy our nodes into a path outside /data (which is volume-mounted) COPY nodered /usr/src/betterframe-nodes # Settings template + entrypoint that seeds /data/settings.js on first boot # (the /data named volume hides anything we COPY directly there, so we have # to plant the file after the volume mount comes up). COPY deploy/docker/nodered-settings.js /usr/src/bf-settings.js COPY deploy/docker/nodered-entrypoint.sh /usr/local/bin/bf-nodered-entrypoint RUN chmod +x /usr/local/bin/bf-nodered-entrypoint # Install deps for the nodes + FlowFuse Dashboard 2.0 into user dir RUN cd /usr/src/betterframe-nodes && \ npm install --omit=dev && \ cd /usr/src/node-red && \ npm install @flowfuse/node-red-dashboard && \ chown -R node-red:root /usr/src/betterframe-nodes /usr/src/bf-settings.js /usr/src/node-red # Run entrypoint as root so it can fix stale /data state (e.g. /data/settings.js # left as a directory by a previous broken bind mount). Entrypoint drops to # node-red via su-exec before launching the actual server. USER root ENTRYPOINT ["/usr/local/bin/bf-nodered-entrypoint"] CMD []