BetterFrame/deploy/docker/nodered-entrypoint.sh
Mitchell R f087fdc056
fix(nodered): entrypoint runs as root to fix stale /data state, drops to node-red via su-exec
Previous deploy left /data/settings.js as a DIRECTORY (Docker auto-mkdir
from a failed bind mount earlier). cp from non-root user then failed
'Permission denied' writing inside it.

Entrypoint now:
- Detects + rm -rf the stale directory
- Seeds /data/settings.js from /usr/src/bf-settings.js
- Chowns /data to node-red
- exec su-exec node-red:node-red to drop privileges before npm start
2026-05-19 04:00:58 +02:00

30 lines
1,000 B
Bash
Executable file

#!/usr/bin/env sh
# Seed /data/settings.js on first boot. The /data named volume overlays
# anything we COPY into /data during image build, so the file has to be
# planted after the volume mounts.
#
# Runs as root, fixes /data ownership + any stale directories left by
# previous bind-mount attempts, then drops to the node-red user.
set -eu
DATA=/data
TPL=/usr/src/bf-settings.js
TARGET="$DATA/settings.js"
# Clear stale path if a previous broken bind-mount left a directory where
# we expect a file.
if [ -d "$TARGET" ]; then
echo "[bf-nodered] $TARGET is a directory (stale bind mount?). Removing."
rm -rf "$TARGET"
fi
if [ ! -f "$TARGET" ]; then
echo "[bf-nodered] seeding $TARGET from $TPL"
cp "$TPL" "$TARGET"
fi
# Ensure the volume + seeded file are owned by node-red.
chown -R node-red:root "$DATA" 2>/dev/null || true
# Drop to the node-red user before launching. The base image ships su-exec.
exec su-exec node-red:node-red npm start --cache /data/.npm -- --userDir /data "$@"