Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,13 @@ OpenSEO exposes an MCP server so AI agents like Claude Code, OpenClaw, and Herme

## Self-Hosting

OpenSEO supports two self-hosting paths:
OpenSEO supports these self-hosting paths:

- **Simple: Docker** for personal use on your own machine (recommended for getting started). See [`docs/SELF_HOSTING_DOCKER.md`](./docs/SELF_HOSTING_DOCKER.md).
- **Railway** for one-click cloud Docker hosting with a persistent volume and a password gate by default (community template). See [`docs/SELF_HOSTING_RAILWAY.md`](./docs/SELF_HOSTING_RAILWAY.md).

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/openseo)

- **Advanced: Cloudflare** for internet-facing self-hosting across multiple devices or with your team (works on the free plan). See [`docs/SELF_HOSTING_CLOUDFLARE.md`](./docs/SELF_HOSTING_CLOUDFLARE.md).

Either way, you need a DataForSEO API key to get SEO data. See [`docs/DATAFORSEO_API_KEY.md`](./docs/DATAFORSEO_API_KEY.md).
Expand Down
44 changes: 44 additions & 0 deletions docs/SELF_HOSTING_RAILWAY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Railway Self-Hosting

Deploy OpenSEO on [Railway](https://railway.com) using the published Docker image (`ghcr.io/every-app/open-seo`) with a persistent volume, behind a password gate.

> **Community template:** [railway.com/deploy/openseo](https://railway.com/deploy/openseo) is a community Railway listing (Social Freak Network), not an official every-app product. Review the template overview before deploying.

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/openseo)

## What you get

- Image: `ghcr.io/every-app/open-seo` (semver tags)
- Volume at `/app/.wrangler` for local D1/KV/R2 state (same path as Docker Compose)
- No separate Postgres or Redis service
- A small **Gate** service in front of OpenSEO so the public URL requires a password

## Architecture

```text
Browser → Gate (public URL + SITE_PASSWORD) → OpenSEO (private networking only)
```

OpenSEO still uses `AUTH_MODE=local_noauth` (same as [`SELF_HOSTING_DOCKER.md`](./SELF_HOSTING_DOCKER.md)). The community template does not expose that URL publicly: visitors hit Gate first, enter `SITE_PASSWORD`, then get proxied to OpenSEO.

## Requirements

- A DataForSEO API key (see [`DATAFORSEO_API_KEY.md`](./DATAFORSEO_API_KEY.md)) — Base64 of `email:password`
- A site password (`SITE_PASSWORD` on Gate)
- Enough RAM for a multi-minute cold start (~4GB+ recommended; the image migrates and builds on start)

## After deploy

1. Set `DATAFORSEO_API_KEY` on the OpenSEO service.
2. Set `SITE_PASSWORD` on the Gate service.
3. Use the **Gate** public URL. Do not attach a public domain to OpenSEO.
4. Optionally enable **Image Auto Updates** (minor + patch) under OpenSEO Settings → Source.
5. Prefer release tags over floating `:latest` if you want update-on-release behavior.

Logout: `/__gate/logout` on the Gate URL.

## Related

- Local Docker: [`SELF_HOSTING_DOCKER.md`](./SELF_HOSTING_DOCKER.md)
- Cloudflare: [`SELF_HOSTING_CLOUDFLARE.md`](./SELF_HOSTING_CLOUDFLARE.md)
- Template: https://railway.com/deploy/openseo