broilr-server is the customer-deployed Axum service behind BROILR-iOS. Railway path matches FL33T: root Dockerfile (cargo-chef → slim runtime), railway.toml with healthcheckPath = "/ready", Postgres, and explicit Apple + JWT env.
Repo assumption: GitHub repo broilr-rs with root Dockerfile + railway.toml (public Everplay layout). startCommand runs broilr-server; Railway injects PORT and the binary listens on 0.0.0.0:${PORT} when BIND_ADDR is unset.
Primary customer path: pull a pinned tag from GHCR, run with your Postgres + env vars, paste the HTTPS URL into BROILR-iOS.
export TAG=rust-cutover-20260520-ghcr-pipeline
docker pull ghcr.io/everplay-tech/broilr-server:${TAG}
# compose: image: ghcr.io/everplay-tech/broilr-server:${TAG} (not build: ./repo)
Tag pin: setup/llm JSON spec. Package must be Public on GitHub Packages before anonymous pull works.
Railway connected-repo builds remain valid for Everplay operators. Panels 01–04 below are Path B.
- 1 · New Railway project
Deploy from GitHub → pick broilr-rs (or your fork). CLI alternative below.
- 2 · Dockerfile build
Confirm Railway uses
DOCKERFILEbuilder fromrailway.toml— not Nixpacks. - 3 · Postgres plugin
Add PostgreSQL; wire
DATABASE_URLreference into the broilr service. - 4 · Variables
Fill panel 02. Persist
JWT_SECRET/JWT_REFRESH_SECRET— rotating them invalidates outstanding tokens. - 5 · Domain
Generate a Railway HTTPS domain; record it for BROILR-iOS first-boot / operator docs.
- 6 · Deploy + gate
Rollout succeeds when
GET /readyreturns 200 (PostgresSELECT 1inside the probe budget).
Same outcome as the GitHub-deploy flow above; just executed from your local clone with the railway CLI. Project name should match the binary (broilr-server), not the repo (broilr-rs) — customers see the binary name in docker ps, railway logs, and the dashboard.
cd broilr-rs/ railway init --name broilr-server # creates new Railway project; --name skips the prompt railway up --detach # uploads source; Dockerfile build per railway.toml railway status # confirms project + environment + service link railway logs # tail build + runtime railway open # opens dashboard for env vars + domain
After railway up --detach kicks the first build, jump back to panel 02 to fill env vars in the dashboard and panel 03/04 to verify /ready goes green.
| Variable | Example | Notes |
|---|---|---|
DATABASE_URL | ${{ Postgres.DATABASE_URL }} | Required |
APPLE_CLIENT_ID | net.llmtech.broilr | Apple aud |
JWT_SECRET | openssl rand -hex 32 | Access token HS256 key |
JWT_REFRESH_SECRET | different hex | Refresh token signing |
BOOTSTRAP_SETUP_CODE | operator-chosen (optional) | Owner bootstrap; else see first-boot logs for generated material |
JWT_EXPIRES_IN | 14d | Optional |
JWT_REFRESH_EXPIRES_IN | 30d | Optional |
RUST_LOG | broilr_server=info | Optional |
| Path | Role |
|---|---|
/health | Liveness — always 200 when process is up |
/ready | Readiness — 200 when Postgres answers; Railway healthcheckPath |
export BROILR_URL=https://YOUR-RAILWAY-DOMAIN.up.railway.app
curl -fsS "${BROILR_URL}/ready"
# expect: {"status":"ready","service":"broilr-rs"}