docs: add one-click Railway deploy - #346
Open
will-bogusz wants to merge 1 commit into
Open
Conversation
will-bogusz
requested review from
MikeRyanDev,
davidmckayv,
guidovizoso and
tylerslaton
as code owners
September 3, 2026 10:58
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a Deploy on Railway button under "Deploy it" (railway.com/deploy/openbot). The template runs the official
ghcr.io/copilotkit/openbot:v0.0.5image beside a Railway Postgres 18 (pgvector included), plus three services the single image does not carry on a PaaS:agent-langgraphas the managed Bot so New coworker works, a cron service runningscripts/fire-routines.tsso routines fire, and a small Caddy in front of the public URL so a single-user deployment is not an open administrator with a shell. Everything is wired over the private network with every secret generated. The inputs are an OpenAI key and the two CopilotKit Intelligence credentials the README already tells people to get; everything else is generated or wired.What the template does
EMBEDDED_POSTGRES=off,DATABASE_URL→ the bundled Postgres; migrations run at container start viaserver/scripts/migrate.ts(single replica), and the API is only started after they succeed.KEY_ENCRYPTION_KEY,COMPUTER_TOKEN,MANAGED_AGENT_TOKEN,AGENT_TOOL_TOKENandWORKER_SHARED_SECRETgenerated per deployment;OPENBOT_PUBLIC_URLset from Railway's domain; health check on/health.agent-langgraphbuilt unchanged from this repo'sv0.0.5tag (agent-langgraph/Dockerfile, context.) because no image is published for it;MANAGED_AGENT_AG_UI_URLpoints at it over the private network andOPENBOT_TOOL_URLpoints back at/api/agent-tools/call.BOT_PROVIDER=openaiby default, sharingOPENAI_API_KEY; the deploy form documents the anthropic/google path.openbotimage as a Railway cron service (*/5 * * * *) runningtimeout -s KILL 240 bun scripts/fire-routines.tswith the server's env referenced from the OpenBot service, matchingcharts/openbot/templates/routines/cronjob.yaml.OPENAI_BASE_URLand the OAuth variables are optional and documented in the deploy form; one volume at/dataholds bothWORKSPACE_DIRandPROFILES_DIR, so Bot files and browser logins survive redeploys.caddy:2-alpineholds the only public domain andbasic_auths every request (generatedGATE_PASSWORD,/healthexempt) beforereverse_proxyto OpenBot over the private network; OpenBot has no public address. Railway's generated domains are<service>-<env>-<4 hex>.up.railway.app, so an unauthenticatedOPENBOT_SINGLE_USER=truedeployment would be enumerable — the gate is the cheapest fix that works from a phone.OPENBOT_PUBLIC_URLand the OAuth redirect URIs use the Gate's domain.Two platform notes you may want in docs/deployment.md
/run/podman-init), sos6-overlay's/initexits withs6-overlay-suexec: fatal: can only run as pid 1— the same failure reported on Fly Machines inNousResearch/hermes-agent#38349. The template sets a start command that runs the three s6 services directly (migrate.ts,agent-computer,api) with/command/s6-setuidgid pwuser, unchanged otherwise. A PID-aware/initshim upstream would let the template drop that override.worker/for platforms without CronJobs.Verified (2026-09-03, fresh deploy from the template)
railway deploy -t openbotwith onlyOPENAI_API_KEY,INTELLIGENCE_API_KEYandCOPILOTKIT_LICENSE_TOKEN→ five services healthy in under a minute;GET /health200 through the gate unauthenticated,/401 without credentials and 200 with them; without the three inputs the deploy refuses.migrations-appliedbeforeagent-computer listeningandOpenBot server listening.navigate example.com — Allowedin the audit), shell aspwuser, and a coworker created with an empty endpoint answering throughagent-langgraph; a governed tool call round-tripped through/api/agent-tools/call(mcp.call_succeeded — routines/list_routines — Scout).routine-sweep … fired: […]) with zeroroutines.dispatch_refused; a deliberately wrongWORKER_SHARED_SECRETproduced exactly onemismatchrefusal.message_bot, answers landing in the addressed Bot's channel as documented./data/workspaceand the browser profile survived a redeploy; health probes stayed 200 across the cutover.Disclosure
I maintain the template; the link carries my Railway referral code (the repo currently has no Railway link). Happy to drop it, or to move this to a
docs/deployment.mdplatform note instead of the README if you prefer. I also build and host theagent-langgraphimage (ghcr.io/will-bogusz/openbot-agent-langgraph, workflow in my fork) — if you would rather publish it from this repo I will switch the template to yours.