From af9ebf95b93b4a5361bcb22e4436763549d7bd15 Mon Sep 17 00:00:00 2001 From: ZVN DEV <78920650+zvndev@users.noreply.github.com> Date: Fri, 6 Nov 2026 13:11:47 -0500 Subject: [PATCH] docs(website): say the hosted playground runner is not deployed The playground runner's Fly app was shut down on 2026-10-29. Production turbolang.dev now answers /api/playground/run with the "not configured" 503, and /play shows the local CLI command. Remove the runner's fly.toml and the Fly deploy steps, say the runner is not deployed, and keep the steps for wiring a runner into Vercel. Drop the test assertions that pinned the Fly config. Co-Authored-By: Claude Opus 5.5 --- website/README.md | 5 ++- website/playground-runner/README.md | 27 +++++-------- website/playground-runner/fly.toml | 39 ------------------- website/playground-smoke-utils.mjs | 2 +- website/tests/bl14-playground-runner.test.mjs | 13 ------- 5 files changed, 14 insertions(+), 72 deletions(-) delete mode 100644 website/playground-runner/fly.toml diff --git a/website/README.md b/website/README.md index c4f78d4f..0b9641d0 100644 --- a/website/README.md +++ b/website/README.md @@ -64,7 +64,7 @@ Build the runner from the repository root: docker build -t turbo-playground-runner -f website/playground-runner/Dockerfile . ``` -Run it with the hardening flags or deploy it with the Fly config documented in +Run it with the hardening flags documented in [`playground-runner/README.md`](playground-runner/README.md), then configure the website runtime in Vercel: @@ -79,6 +79,9 @@ missing. If those variables are absent, `/api/playground/run` returns an explicit unavailable response and the page shows the local CLI command instead. +The hosted runner is not deployed today. It was shut down on 2026-10-29, so +production returns that unavailable response. + ## Content Ownership When compiler, CLI, release, or packaging behavior changes, update the matching website pages in `website/src/app/**` in the same cycle or record the doc gap in `.omx/product-cycles/open-tasks.md`. diff --git a/website/playground-runner/README.md b/website/playground-runner/README.md index 7efe828c..40c870db 100644 --- a/website/playground-runner/README.md +++ b/website/playground-runner/README.md @@ -15,24 +15,16 @@ From the repository root: docker build -t turbo-playground-runner -f website/playground-runner/Dockerfile . ``` -## Deploy on Fly.io +## Deployment Status -The repo includes `fly.toml` for the public runner. Create the app once, set a -random bearer token as a Fly secret, deploy from the repository root, then point -Vercel at the deployed `/run` URL with the same token. +The hosted runner is not deployed. It was shut down on 2026-10-29, and this +repo no longer ships a deploy config for it. With no runner configured, +`https://turbolang.dev/api/playground/run` returns the "not configured" 503 +response and `/play` shows the local CLI command instead. -```bash -flyctl apps create turbolang-playground-runner --org zvn-dev - -TOKEN="$(openssl rand -hex 32)" -flyctl secrets set \ - --app turbolang-playground-runner \ - TURBO_PLAYGROUND_RUNNER_TOKEN="$TOKEN" - -flyctl deploy --config website/playground-runner/fly.toml -``` - -After deployment, configure the website runtime: +To host it again, run the image in an isolated container with the flags shown +under Run Locally, give it a random bearer token, then point the website at its +`/run` URL with the same token: ```bash cd website @@ -42,8 +34,7 @@ vercel env add TURBO_PLAYGROUND_RUNNER_URL preview vercel env add TURBO_PLAYGROUND_RUNNER_TOKEN preview ``` -Use `https://turbolang-playground-runner.fly.dev/run` for -`TURBO_PLAYGROUND_RUNNER_URL`. After Vercel redeploys, smoke the public site: +After Vercel redeploys, smoke the public site: ```bash cd website diff --git a/website/playground-runner/fly.toml b/website/playground-runner/fly.toml deleted file mode 100644 index 37a2a15f..00000000 --- a/website/playground-runner/fly.toml +++ /dev/null @@ -1,39 +0,0 @@ -app = "turbolang-playground-runner" -primary_region = "iad" -kill_signal = "SIGTERM" -kill_timeout = 5 - -[build] - # Relative to this config file; deploy from the repo root (`fly deploy . -c website/playground-runner/fly.toml`) - # so the Docker build context includes turbo/ and docs/errors/. - dockerfile = "Dockerfile" - -[env] - PORT = "8787" - TURBO_PLAYGROUND_RUNNER_ALLOW_UNSAFE_HOST = "1" - TURBO_PLAYGROUND_RUNNER_MAX_CONCURRENT = "2" - TURBO_PLAYGROUND_RUNNER_TIMEOUT_MS = "5000" - -[http_service] - internal_port = 8787 - force_https = true - auto_stop_machines = "off" - auto_start_machines = true - min_machines_running = 1 - - [http_service.concurrency] - type = "requests" - soft_limit = 20 - hard_limit = 30 - - [[http_service.checks]] - grace_period = "10s" - interval = "30s" - method = "GET" - path = "/healthz" - timeout = "5s" - -[[vm]] - cpu_kind = "shared" - cpus = 1 - memory_mb = 256 diff --git a/website/playground-smoke-utils.mjs b/website/playground-smoke-utils.mjs index 459e2ee8..65e6c065 100644 --- a/website/playground-smoke-utils.mjs +++ b/website/playground-smoke-utils.mjs @@ -49,7 +49,7 @@ export async function assertExecRejectedRun(fetcher, runUrl, options = {}) { // runtime resources with an unbounded compute loop. On the deployed container it // must be contained — killed by the prlimit CPU cap or the wall-clock watchdog — // never returning a successful run. This is the first non-mock exercise of the -// prlimit path, so it validates on the Fly deploy rather than in local/CI (which +// prlimit path, so it validates on a deployed runner rather than in local/CI (which // have no prlimit and rely on the wall timeout alone). export async function assertResourceAbuseContained(fetcher, runUrl, options = {}) { const label = options.label ?? "playground"; diff --git a/website/tests/bl14-playground-runner.test.mjs b/website/tests/bl14-playground-runner.test.mjs index 674b6f71..df27e644 100644 --- a/website/tests/bl14-playground-runner.test.mjs +++ b/website/tests/bl14-playground-runner.test.mjs @@ -85,14 +85,12 @@ function readRawHttpResponse(port, requestText, timeoutMs = 750) { test("standalone playground runner artifacts exist and stay container-oriented", () => { assert.equal(existsSync(join(root, "playground-runner/runner.mjs")), true); assert.equal(existsSync(join(root, "playground-runner/Dockerfile")), true); - assert.equal(existsSync(join(root, "playground-runner/fly.toml")), true); assert.equal(existsSync(join(root, "playground-runner/README.md")), true); assert.equal(existsSync(join(root, "playground-runner/smoke.mjs")), true); const packageJson = JSON.parse(read("package.json")); const runner = read("playground-runner/runner.mjs"); const dockerfile = read("playground-runner/Dockerfile"); - const flyConfig = read("playground-runner/fly.toml"); const readme = read("playground-runner/README.md"); const ciWorkflow = read("../.github/workflows/ci.yml"); @@ -113,20 +111,9 @@ test("standalone playground runner artifacts exist and stay container-oriented", assert.match(dockerfile, /HEALTHCHECK/); assert.match(dockerfile, /\/healthz/); assert.doesNotMatch(dockerfile, /\b(curl|wget)\b/); - assert.match(flyConfig, /app = "turbolang-playground-runner"/); - // Path is relative to fly.toml's own directory (fixed in 9a1195e for fly deploy) - assert.match(flyConfig, /dockerfile = "Dockerfile"/); - assert.match(flyConfig, /TURBO_PLAYGROUND_RUNNER_ALLOW_UNSAFE_HOST = "1"/); - assert.match(flyConfig, /internal_port = 8787/); - assert.match(flyConfig, /auto_stop_machines = "off"/); - assert.match(flyConfig, /auto_start_machines = true/); - assert.match(flyConfig, /min_machines_running = 1/); - assert.match(flyConfig, /path = "\/healthz"/); - assert.match(flyConfig, /memory_mb = 256/); assert.match(readme, /--read-only/); assert.match(readme, /--cap-drop=ALL/); assert.match(readme, /-e TURBO_PLAYGROUND_RUNNER_ALLOW_UNSAFE_HOST=1/); - assert.match(readme, /flyctl deploy --config website\/playground-runner\/fly\.toml/); assert.match(readme, /TURBO_PLAYGROUND_RUNNER_URL/); assert.match(ciWorkflow, /name: Playground runner image/); assert.match(ciWorkflow, /docker build -t turbo-playground-runner:ci -f website\/playground-runner\/Dockerfile \./);