diff --git a/cli/src/commands/run.ts b/cli/src/commands/run.ts index a6606745..04743b48 100644 --- a/cli/src/commands/run.ts +++ b/cli/src/commands/run.ts @@ -86,11 +86,29 @@ export async function runCommand(opts: RunOptions): Promise { await bootstrapCeoInvite({ config: configPath, dbUrl: startedServer.databaseUrl, - baseUrl: startedServer.apiUrl.replace(/\/api$/, ""), + baseUrl: resolveBootstrapInviteBaseUrl(config, startedServer), }); } } +function resolveBootstrapInviteBaseUrl( + config: PaperclipConfig, + startedServer: StartedServer, +): string { + const explicitBaseUrl = + process.env.PAPERCLIP_PUBLIC_URL ?? + process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL ?? + process.env.BETTER_AUTH_URL ?? + process.env.BETTER_AUTH_BASE_URL ?? + (config.auth.baseUrlMode === "explicit" ? config.auth.publicBaseUrl : undefined); + + if (typeof explicitBaseUrl === "string" && explicitBaseUrl.trim().length > 0) { + return explicitBaseUrl.trim().replace(/\/+$/, ""); + } + + return startedServer.apiUrl.replace(/\/api$/, ""); +} + function formatError(err: unknown): string { if (err instanceof Error) { if (err.message && err.message.trim().length > 0) return err.message; diff --git a/doc/DOCKER.md b/doc/DOCKER.md index 49d0c4ab..9cc867db 100644 --- a/doc/DOCKER.md +++ b/doc/DOCKER.md @@ -122,5 +122,6 @@ Notes: - Container runtime user id defaults to your local `id -u` so the mounted data dir stays writable while avoiding root runtime. - Smoke script defaults to `authenticated/private` mode so `HOST=0.0.0.0` can be exposed to the host. - Smoke script defaults host port to `3131` to avoid conflicts with local Paperclip on `3100`. +- Smoke script also defaults `PAPERCLIP_PUBLIC_URL` to `http://localhost:` so bootstrap invite URLs and auth callbacks use the reachable host port instead of the container's internal `3100`. - Run the script in the foreground to watch the onboarding flow; stop with `Ctrl+C` after validation. - The image definition is in `Dockerfile.onboard-smoke`. diff --git a/scripts/docker-onboard-smoke.sh b/scripts/docker-onboard-smoke.sh index 2da125de..3b3e24d8 100755 --- a/scripts/docker-onboard-smoke.sh +++ b/scripts/docker-onboard-smoke.sh @@ -9,6 +9,7 @@ DATA_DIR="${DATA_DIR:-$REPO_ROOT/data/docker-onboard-smoke}" HOST_UID="${HOST_UID:-$(id -u)}" PAPERCLIP_DEPLOYMENT_MODE="${PAPERCLIP_DEPLOYMENT_MODE:-authenticated}" PAPERCLIP_DEPLOYMENT_EXPOSURE="${PAPERCLIP_DEPLOYMENT_EXPOSURE:-private}" +PAPERCLIP_PUBLIC_URL="${PAPERCLIP_PUBLIC_URL:-http://localhost:${HOST_PORT}}" DOCKER_TTY_ARGS=() if [[ -t 0 && -t 1 ]]; then @@ -27,6 +28,7 @@ docker build \ echo "==> Running onboard smoke container" echo " UI should be reachable at: http://localhost:$HOST_PORT" +echo " Public URL: $PAPERCLIP_PUBLIC_URL" echo " Data dir: $DATA_DIR" echo " Deployment: $PAPERCLIP_DEPLOYMENT_MODE/$PAPERCLIP_DEPLOYMENT_EXPOSURE" echo " Live output: onboard banner and server logs stream in this terminal (Ctrl+C to stop)" @@ -38,5 +40,6 @@ docker run --rm \ -e PORT=3100 \ -e PAPERCLIP_DEPLOYMENT_MODE="$PAPERCLIP_DEPLOYMENT_MODE" \ -e PAPERCLIP_DEPLOYMENT_EXPOSURE="$PAPERCLIP_DEPLOYMENT_EXPOSURE" \ + -e PAPERCLIP_PUBLIC_URL="$PAPERCLIP_PUBLIC_URL" \ -v "$DATA_DIR:/paperclip" \ "$IMAGE_NAME"