Skip to content

feat: deploy the team's services to Cloudflare or Fly.io with one command - #552

Merged
iamnbutler merged 6 commits into
mainfrom
team-setup
Oct 22, 2026
Merged

iamnbutler merged 6 commits into
mainfrom
team-setup

Conversation

@iamnbutler

@iamnbutler iamnbutler commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

bun services/deploy.ts <cloudflare|fly> [--hosted] runs the setup steps in docs/setup.md in one go. In #553 the app runs the same Cloudflare deploy itself. The script is still the Fly.io path and the way to deploy from a checkout.

  • It names the services after the tailnet, so tail1234.ts.net gets ace-directory-tail1234 and ace-channel-tail1234. There's no team name to pick: the services serve one tailnet, and different tailnets on one account never collide.
  • It reads TAILNET from tailscale status and generates a new ACE_SECRET. Hosted channels are opt-in: --hosted deploys the channel service and sets HOSTED on the directory, matching the onboarding screen where both remote options start off. A directory-only deploy was also smoke-tested on Cloudflare.
  • It gives hosted channels ANTHROPIC_API_KEY and OPENAI_API_KEY from the environment. Bun also loads a checkout's .env.
  • On Fly.io it creates both apps and their Tigris buckets, deploys each service's code to its bucket on celld, and starts the machines (feat: deploy the directory and hosted channels to Fly.io on celld #551).
  • Compute isn't included; that work is separate.

Smoke-tested for real with a throwaway team, which was deleted afterwards:

  • Cloudflare: the directory accepted the printed secret and refused a wrong one. The first check came seconds after deploy and was refused because the new secret hadn't reached the Worker yet; the script's final message now says to allow a minute.
  • Fly.io: the directory accepted the secret and listed the hosted channel service. A host created a hosted channel on it, and ace ask got an answer from claude-opus-5-5.

Part of #549.

Built in Ace

No. Claude Code in a terminal wrote this and ran the smoke tests, because the session started outside Ace. It wasn't blocked by a missing Ace capability, so no issue was filed.

…mand

Why: services/deploy.ts | the secret is generated here and printed once; the services and the joining host must get the same value, and nothing else stores it
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.

1 participant