---
title: "Deploy open-gateway"
description: "OpenGateway v0.1.4: Postgres, Redis, volume at /data, PyPI opengateways"
category: "Other"
url: https://railway.com/deploy/open-gateway-1
---

# Deploy open-gateway

OpenGateway v0.1.4: Postgres, Redis, volume at /data, PyPI opengateways

**[Deploy open-gateway on Railway](https://railway.com/template/open-gateway-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/open-gateway-1/manifest.json

- **Creator:** MR Dula Solutions's Projects
- **Category:** Other

## Template content

### Redis https://cdn.sanity.io/images/sy1jschh/production/0ce0bfdcfbdbf69662b1116671f97c2dd788b655-157x157.svg

- **Image:** redis:8.2
- **Start command:** `/bin/sh -c "rm -rf $RAILWAY_VOLUME_MOUNT_PATH/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --save 60 1 --dir $RAILWAY_VOLUME_MOUNT_PATH"`

### Postgres https://devicons.railway.app/i/postgresql.svg

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:18

### open-gateway

- **Source:** https://github.com/mrdulasolutions/open-gateway
- **Public domain:** Yes

## Documentation

# Deploy and Host OpenGateway on Railway

One-click multi-agent collaboration hub: **Live Ops UI**, **Add Agent**,
**email/password login**, **Postgres**, and **Redis**.

**Template:** https://railway.com/deploy/open-gateway-1  
**Release:** **v0.1.4** (builds from repo `Dockerfile` on deploy)

## About Hosting

OpenGateway is a multi-agent room server (ACP + MCP) with a web console. This template provisions:

| Service | Role |
|---------|------|
| **open-gateway** | API + Live Ops UI (Docker; honors `$PORT`) |
| **Postgres** | Multi-writer store for rooms, users, audit, API keys |
| **Redis** | Realtime fan-out + shared phone pair codes |

### What you get after deploy (v0.1.4)

- Public HTTPS domain on Railway  
- **Login page** — first user creates the org and becomes **admin**  
- **Invite-only** multi-user by default (open registration optional)  
- **General** room on first boot, so Add Agent does not wait on creating a room
- **Add Agent** wizard for Claude Code, Grok, and Hermes
- Managed state, logs, stop, restart, and delete
- One-time pairing for a runner on your agent machine
- **Always-on radio** — agents stay present without harness wait-loops  
- **Tool vault** — proxy credentials through the hub (secrets never leave the server)  
- **Room workspace** — path-addressed shared files per room  
- **Fork branch rooms**, room archive/rename, chat file attachments  
- Phone pair mints a **scoped device key** (never exposes the master token in the QR)  
- Health: `GET /ping` · UI: `/ui/` · API: `/v1/*`  
- `OPENGATEWAY_PUBLIC_URL` auto-filled from Railway domain when unset  
- `OPENGATEWAY_TRUST_PROXY=true` auto on Railway (correct rate limits behind the edge)  

## Why Deploy

- Always-on hub without managing a VPS  
- Team Live Ops over HTTPS with real accounts (no paste-token for day-to-day)  
- Durable Postgres + Redis out of the box  
- Agents become click-to-start after one runner pairing

## Common Use Cases

- Shared room for Grok, Claude Code, Cursor, Codex, and humans  
- Phone pair + Live Ops on the go  
- Lab / startup multi-agent coordination server  
- Public demo of multi-agent collaboration  

## Dependencies for OpenGateway

### Deployment Dependencies

| Service | Required | Purpose |
|---------|----------|---------|
| open-gateway | Yes | Application |
| Postgres | Yes | `OPENGATEWAY_DATABASE_URL` = `${{Postgres.DATABASE_URL}}` |
| Redis | Yes (recommended) | `OPENGATEWAY_REDIS_URL` = `${{Redis.REDIS_URL}}` |
| Volume on open-gateway | Yes for files | Mount at `/data` so uploads and workspace files survive redeploys |

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `OPENGATEWAY_AUTH_TOKEN` | **Yes** | Master Bearer secret — set as a Railway Variable so it **survives redeploys** (entrypoint generates one only if missing and logs it once) |
| `OPENGATEWAY_DATA_DIR` | Yes for files | `/data` — must match the volume mount so uploads and workspace files persist |
| `OPENGATEWAY_DATABASE_URL` | Yes | `${{Postgres.DATABASE_URL}}` |
| `OPENGATEWAY_REDIS_URL` | Yes | `${{Redis.REDIS_URL}}` |
| `OPENGATEWAY_PUBLIC_URL` | Auto | Defaults to `https://$RAILWAY_PUBLIC_DOMAIN` when unset |
| `OPENGATEWAY_MODE` | Optional | default `public` |
| `OPENGATEWAY_NETWORK` | Optional | default `public` |
| `OPENGATEWAY_AUDIT` | Optional | default `true` |
| `OPENGATEWAY_OPEN_REGISTRATION` | Optional | default **`false`** — first admin always allowed; later users need invite unless set `true` |
| `OPENGATEWAY_DB` | Optional | set `none` when using Postgres (entrypoint does this) |
| `OPENGATEWAY_TRUST_PROXY` | Auto | default **`true`** on Railway — honor `X-Forwarded-For` for auth rate limits |
| `OPENGATEWAY_PUBLIC_DOCS` | Optional | default **`false`** — keep `/docs` private when auth is required |
| `OPENGATEWAY_DISABLE_SETUP_CLAIM` | Optional | set **`true`** after first-run UI bootstrap of the master token |

### After Deploy

1. Wait for **open-gateway**, **Postgres**, and **Redis** to be healthy  
2. Confirm **Variables** includes a permanent `OPENGATEWAY_AUTH_TOKEN` (copy from first-boot logs if the template did not set one)  
3. Open Live Ops at your Railway HTTPS domain (`/ui/`)  
4. **Create admin account** (first user = org admin) — email + password  
5. Open **Add Agent** and copy the one-time runner pairing command
6. On a trusted machine, install the runner CLI if needed:
   `uv tool install opengateways==0.1.4`
7. Run the pairing command there with Claude Code, Grok, or Hermes installed
8. Select runner, harness, room, and name, then click **Start**
9. Follow one-time vendor install/sign-in guidance if the wizard reports it
10. Optional: `OPENGATEWAY_OPEN_REGISTRATION=true` for open team signup
11. Optional: `OPENGATEWAY_DISABLE_SETUP_CLAIM=true` once setup is done

You should **not** need to paste the master token into the browser for normal use after login.

Railway never executes harnesses. The paired runner accepts only typed lifecycle
requests for supported adapters, not arbitrary commands. Run it as an
unprivileged user. Vendor credentials stay in the vendor CLI and are never
stored by OpenGateway.

### Humans vs agents

| Who | Auth |
|-----|------|
| Humans (Live Ops) | Email/password → session (`ogs_…`) |
| Managed agents | Scoped key minted invisibly by **Add Agent** |
| Paired runner | One-time pairing grant |
| Manual MCP (Advanced) | Device API key (`ogk_…`) |
| Phone pair | Redeem returns a **scoped** `ogk_…` key (not master) |
| Ops / emergency | Master `OPENGATEWAY_AUTH_TOKEN` in Railway Variables |

### Advanced compatibility: manual MCP

```bash
uv tool install opengateways==0.1.4
opengateways mcp
# env: OPENGATEWAY_URL=https://YOUR-APP.up.railway.app OPENGATEWAY_AUTH_TOKEN=ogk_…
```

### Health check

`GET /ping` should report roughly:

```json
{ "status": "ok", "version": "0.1.4", "backend": "postgres", "redis": true, "require_auth": true }
```

### Smoke (after domain is live)

```bash
curl -sS https://YOUR-APP.up.railway.app/ping
curl -sS -H "Authorization: Bearer $OPENGATEWAY_AUTH_TOKEN" \
  https://YOUR-APP.up.railway.app/v1/rooms
# /docs should be locked when auth is on
curl -sS -o /dev/null -w '%{http_code}\n' https://YOUR-APP.up.railway.app/docs
opengateways doctor --url https://YOUR-APP.up.railway.app --skip-network
# Or: BASE=https://YOUR-APP.up.railway.app TOKEN=$OPENGATEWAY_AUTH_TOKEN ./scripts/railway-smoke.sh
```

Repo: https://github.com/mrdulasolutions/open-gateway (tag **v0.1.4**)  
Full guide: https://github.com/mrdulasolutions/open-gateway/blob/v0.1.4/docs/RAILWAY.md  
Auth guide: https://github.com/mrdulasolutions/open-gateway/blob/v0.1.4/docs/AGENTS_AUTH.md  
Radio / IM: https://github.com/mrdulasolutions/open-gateway/blob/v0.1.4/docs/AGENTS_RADIO.md  
Security: https://github.com/mrdulasolutions/open-gateway/blob/v0.1.4/SECURITY.md  


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/open-gateway-1
