Skip to content

fix: Serve standby Actors at the platform-shaped *.localhost URL - #75

Merged
Pijukatel merged 6 commits into
claude/ecstatic-cannon-ojf5fmfrom
claude/magical-clarke-nx3jss
Sep 24, 2026
Merged

Pijukatel merged 6 commits into
claude/ecstatic-cannon-ojf5fmfrom
claude/magical-clarke-nx3jss

Conversation

@Pijukatel

@Pijukatel Pijukatel commented Sep 24, 2026

Copy link
Copy Markdown
Collaborator
  • standbyUrl is now http://<username>--<actor-name>.localhost:3333, the local counterpart of https://<username>--<actor-name>.apify.actor: the Actor owns / of its own origin, one hostname per Actor.
  • Fixes Actor web UIs with root-relative links (e.g. fetch('/api/...')), which under /actor-runtime/standby/<label>/ escaped to the runtime's own API and broke Actors that work on the platform.
  • /actor-runtime/standby/<label>/... stays for clients that do not resolve *.localhost; the Actor object read from an Actor container carries http://apify-api:3333/actor-runtime/standby/<label>, which other Actors can reach.
  • Standby Actors now also work under rootless Podman 3.x, where the runtime could not reach a standby run's server.
  • Storage lists (GET /v2/datasets, /v2/key-value-stores, /v2/request-queues) return only named storages unless ?unnamed=true, as on the platform.
  • Adds sample_actor_standby_web and e2e tests for an external client calling its standby endpoint, and another Actor's run calling it from its container.

🤖 Generated with Claude Code

https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp

The standbyUrl is now http://<username>--<actor-name>.localhost:3333, where the Actor owns `/` of its
own origin as on *.apify.actor, so an Actor's web UI with root-relative links works. The path form stays
for clients that do not resolve *.localhost, and the Actor object read from an Actor container carries
the http://apify-api:3333/actor-runtime/standby/... form it can reach. Adds sample_actor_standby_web and
e2e tests for an external client and an Actor-to-Actor call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp
…standby requirements

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp
…work namespace

Under rootless Podman 3.x the host address a container sees is the slirp4netns gateway, which reaches
the host's published ports only with allow_host_loopback, so the runtime never reached a standby
container's published port. The standby container now joins the runtime container's network
namespace on a port of its own, as browser-view sidecars do, with the API on loopback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp
… connection

Under rootless Podman 3.x the port forwarder can keep the client's end of an idle keep-alive
connection open after the server closed its own, so the next request on it fails with "other side
closed". Console and standby requests are retried once in that case, as a browser does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp
GET /v2/datasets, /v2/key-value-stores and /v2/request-queues ignored `unnamed` and returned every
storage, so runs' default storages showed up where the platform hides them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013KAxkpoSLVQvpEJUANjWdp
@Pijukatel
Pijukatel merged commit 170676b into claude/ecstatic-cannon-ojf5fm Sep 24, 2026
29 checks passed
@Pijukatel
Pijukatel deleted the claude/magical-clarke-nx3jss branch September 24, 2026 09:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants