Migrate from Railway
Railway makes hobby-grade and small-team production deploys frictionless — one click, Postgres included, Procfile-or-Dockerfile-shaped. Joule Cloud is the same shape, with joule billing, more region control, and per-request receipts.
Service map
| Railway | Joule Cloud |
|---|---|
| Railway services (containers) | Compute |
| Railway Postgres | JouleDB |
| Railway Volumes | Object Store (preferred) or workload disk (small) |
| Railway Redis | JouleDB key-value or a workload-hosted Redis (BYO) |
| Railway environments (dev/staging/prod) | Per-workload-name convention; CI deploys distinct workloads per env |
| Built-in CI/CD on push | Push image from your CI; invisible deploy |
| Custom domains + auto TLS | route block w/ https = true |
The flow
Railway: push → Railway builds → deploys → live URL. Joule Cloud: CI builds → push image → invisible deploy → live URL. Wire your CI (Forgejo Actions, GitHub Actions, anything) to call invisible deploy after a successful image push. Two-step instead of one-step, but you get to see what your CI did.
Example CI step
# .github/workflows/deploy.yml (or .forgejo/workflows/deploy.yml)
- name: Build & push
run: |
docker build -t ghcr.io/me/myapp:${{ github.sha }} .
docker push ghcr.io/me/myapp:${{ github.sha }}
- name: Deploy
env: { JC_API_KEY: ${{ secrets.JC_API_KEY }} }
run: |
# update the image ref in invisible.hcl, then apply
sed -i "s|image *= .*|image = \"ghcr.io/me/myapp:${{ github.sha }}\"|" invisible.hcl
invisible deploy --auto-approve
Postgres
Railway Postgres → JouleDB. Same wire protocol; dump+restore works.
pg_dump $RAILWAY_DATABASE_URL --no-owner --no-acl > backup.sql
jc db create main --region eu-fi --size 50GB
psql "postgresql://jc_…@db.greenjoules.cloud:5432/main" < backup.sql
Environments
Railway tabs let you flip between dev / staging / prod environments. The Joule Cloud pattern: name the workload accordingly (e.g. workload "api-staging", workload "api-prod") and deploy them from different branches. The console groups them by your account, not by environment.
What you keep
- Container-based deploys; no language lock-in
- Postgres on the same provider as compute — zero-egress
- HTTPS-by-default custom domains
What you gain
- Lower bill at scale — Railway adds a per-vCPU-hour premium; we bill the joules
- Region pinning is first-class for compliance work
- Signed receipts for ESG reporting