#!/bin/sh set -e # Capture runtime UID/GID from environment variables, defaulting to 1000 PUID=${USER_UID:-1000} PGID=${USER_GID:-1000} # Adjust the node user's UID/GID if they differ from the runtime request # and fix volume ownership only when a remap is needed changed=0 if [ "$(id -u node)" -ne "$PUID" ]; then echo "Updating node UID to $PUID" usermod -o -u "$PUID" node changed=1 fi if [ "$(id -g node)" -ne "$PGID" ]; then echo "Updating node GID to $PGID" groupmod -o -g "$PGID" node usermod -g "$PGID" node changed=1 fi if [ "$changed" = "1" ]; then chown -R node:node /paperclip fi export PAPERCLIP_DEPLOYMENT_MODE=authenticated export PAPERCLIP_DEPLOYMENT_EXPOSURE=public # In background, wait a bit for server to start up, then bootstrap CEO ( sleep 10 export PAPERCLIP_DEPLOYMENT_MODE=authenticated export PAPERCLIP_DEPLOYMENT_EXPOSURE=public echo "Onboarding environment and bootstrapping CEO..." echo "Running default setup manually..." > /paperclip/bootstrap_logs.txt mkdir -p /paperclip/instances/default/db mkdir -p /paperclip/instances/default/data/logs mkdir -p /paperclip/instances/default/data/artifacts cat << JSONEOF > /paperclip/instances/default/config.json { "\$meta": { "version": 1, "createdAt": "2026-04-06T19:20:00.000Z", "updatedAt": "2026-04-06T19:20:00.000Z", "source": "onboard" }, "instanceId": "default", "deployment": { "exposure": "public", "mode": "authenticated", "authOrigin": null, "uiMode": "static" }, "database": { "engine": "embedded-postgres", "path": "/paperclip/instances/default/db" }, "server": { "port": 7860 }, "storage": { "engine": "local", "root": "/paperclip/instances/default/data/artifacts" }, "logging": { "level": "info", "dir": "/paperclip/instances/default/data/logs", "mode": "file" }, "agent": { "jwtSecret": "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" } } JSONEOF echo "Wrote default config.json. Bootstrapping CEO and generating invite URL..." >> /paperclip/bootstrap_logs.txt # try running it from root instead of explicit paths PAPERCLIP_DEPLOYMENT_MODE=authenticated PAPERCLIP_DEPLOYMENT_EXPOSURE=public PAPERCLIP_HOME=/paperclip PAPERCLIP_INSTANCE_ID=default gosu node npm run start -- auth bootstrap-ceo >> /paperclip/bootstrap_logs.txt 2>&1 ) & export PAPERCLIP_DEPLOYMENT_MODE=authenticated export PAPERCLIP_DEPLOYMENT_EXPOSURE=public export PAPERCLIP_HOME=/paperclip export PAPERCLIP_INSTANCE_ID=default exec gosu node "$@"