refactor(entrypoint): improve privilege dropping and config initialization
- Updated entrypoint.sh to initialize the on-disk config only if it does not already exist, preserving user edits across restarts. - Enhanced privilege dropping logic to ensure the container does not run as root if the privilege drop fails. - Clarified comments in Dockerfile and entrypoint.sh for better understanding of the privilege management process. - Updated README.md to include a note about persistent disks requiring a paid service on Render. - Adjusted render.yaml to clarify the Docker command behavior and added a note regarding auto-deploy settings.
This commit is contained in:
+30
-13
@@ -3,26 +3,42 @@ dir="$HOME/.nanobot"
|
||||
|
||||
# Render deploy path (see render.yaml + render-config.json). Gated on Render's
|
||||
# automatic RENDER=true env var so local Docker/podman usage is unaffected.
|
||||
# Copies the committed config template onto the mounted disk (wiring secrets via
|
||||
# ${VAR} env vars and keeping runtime data on the persistent disk), chowns the
|
||||
# root-owned mount, then drops to the non-root nanobot user. Logs each decision
|
||||
# so a failed start is diagnosable in Render's logs.
|
||||
# Initializes the on-disk config from the committed template (wiring secrets via
|
||||
# ${VAR} env vars, keeping runtime data on the persistent disk) and appends the
|
||||
# --config flag. Logs each decision so a failed start is diagnosable in Render's
|
||||
# logs. Privilege dropping is handled below, for every root start (not just here).
|
||||
if [ "$RENDER" = "true" ]; then
|
||||
echo "[entrypoint] Render deploy — starting as $(id)"
|
||||
mkdir -p "$dir" || echo "[entrypoint] warning: mkdir $dir failed"
|
||||
config="$dir/config.json"
|
||||
cp /app/render-config.json "$config" || echo "[entrypoint] warning: cp config failed"
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
chown -R nanobot:nanobot "$dir" || echo "[entrypoint] warning: chown $dir failed"
|
||||
if setpriv --reuid=nanobot --regid=nanobot --init-groups true 2>/dev/null; then
|
||||
echo "[entrypoint] dropping privileges to nanobot via setpriv"
|
||||
exec setpriv --reuid=nanobot --regid=nanobot --init-groups nanobot "$@" --config "$config"
|
||||
fi
|
||||
echo "[entrypoint] setpriv privilege-drop not permitted — running as root"
|
||||
# Initialize config only when it does not already exist, so WebUI/provider
|
||||
# settings edited at runtime survive restarts. The disk persists config.json
|
||||
# across deploys; overwriting it every boot would discard those changes.
|
||||
if [ ! -f "$config" ]; then
|
||||
echo "[entrypoint] initializing $config from render-config.json"
|
||||
cp /app/render-config.json "$config" || echo "[entrypoint] warning: cp config failed"
|
||||
else
|
||||
echo "[entrypoint] existing $config found — leaving it in place"
|
||||
fi
|
||||
exec nanobot "$@" --config "$config"
|
||||
set -- "$@" --config "$config"
|
||||
fi
|
||||
|
||||
# Drop privileges whenever the container starts as root. Render mounts the
|
||||
# persistent disk root-owned, and a plain `docker run` also defaults to root now,
|
||||
# so this covers both. Chown the data dir so the non-root user can write it, then
|
||||
# re-exec as nanobot. Fail closed: if the privilege drop cannot be performed,
|
||||
# exit rather than run the agent as root.
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
chown -R nanobot:nanobot "$dir" 2>/dev/null || echo "[entrypoint] warning: chown $dir failed"
|
||||
if setpriv --reuid=nanobot --regid=nanobot --init-groups true 2>/dev/null; then
|
||||
echo "[entrypoint] dropping privileges to nanobot via setpriv"
|
||||
exec setpriv --reuid=nanobot --regid=nanobot --init-groups nanobot "$@"
|
||||
fi
|
||||
echo "[entrypoint] error: started as root but setpriv privilege drop failed — refusing to run as root" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Already non-root: make sure the data dir is writable before starting.
|
||||
if [ -d "$dir" ] && [ ! -w "$dir" ]; then
|
||||
owner_uid=$(stat -c %u "$dir" 2>/dev/null || stat -f %u "$dir" 2>/dev/null)
|
||||
cat >&2 <<EOF
|
||||
@@ -35,4 +51,5 @@ Fix (pick one):
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec nanobot "$@"
|
||||
|
||||
Reference in New Issue
Block a user