Origin: moved from objectstack-ai/cloud#1507 (EE 4.1.0 published-image acceptance) — the fix lands in packages/cli, so the card lives here (file-at-destination); the source card is closed as moved.
Symptom (measured, EE 4.1.0 compose stack)
The boot banner prints the container-internal address:
➜ API: http://localhost:3000/
➜ Console: http://localhost:3000/_console/
➜ MCP: http://localhost:3000/api/v1/mcp
connect an AI client (Claude Code, Cursor, …) · skill: http://localhost:3000/api/v1/mcp/skill
while the published entry point is Caddy on :80 (the deploy README's step 5 is open http://localhost), and OS_AUTH_URL is already resolved to http://localhost by compose. :3000 is an expose-only container port — unreachable from the host (no ports: mapping; even less so under --scale app=N).
Impact: following the banner's Console link fails outright; after moving to a domain (per the README's HTTPS step) the banner still says localhost:3000; the MCP line is the address customers copy into AI clients, and it can never connect.
PM 建议的路线(可选,实测优先)
Resolve the banner's external base through the runtime's existing precedence chain (OS_AUTH_URL → OS_BASE_URL → http://localhost:<port> fallback) — the same chain the compose template documents; when no external base can be determined, prefer printing no absolute URL over a wrong one.
Landing spot: packages/cli/src/utils/format.ts:583 area (server-ready banner assembly) and its call site in serve.
Origin: moved from objectstack-ai/cloud#1507 (EE 4.1.0 published-image acceptance) — the fix lands in
packages/cli, so the card lives here (file-at-destination); the source card is closed as moved.Symptom (measured, EE 4.1.0 compose stack)
The boot banner prints the container-internal address:
while the published entry point is Caddy on
:80(the deploy README's step 5 isopen http://localhost), andOS_AUTH_URLis already resolved tohttp://localhostby compose.:3000is anexpose-only container port — unreachable from the host (noports:mapping; even less so under--scale app=N).Impact: following the banner's Console link fails outright; after moving to a domain (per the README's HTTPS step) the banner still says
localhost:3000; the MCP line is the address customers copy into AI clients, and it can never connect.PM 建议的路线(可选,实测优先)
Resolve the banner's external base through the runtime's existing precedence chain (
OS_AUTH_URL→OS_BASE_URL→http://localhost:<port>fallback) — the same chain the compose template documents; when no external base can be determined, prefer printing no absolute URL over a wrong one.Landing spot:
packages/cli/src/utils/format.ts:583area (server-ready banner assembly) and its call site inserve.