Deploy OpenObserve
Logs, metrics and traces in one open source service you host yourself.
OpenObserve
Just deployed
/data
Deploy and Host OpenObserve on Railway
OpenObserve is an open source observability platform for logs, metrics and traces in a single binary, with dashboards, alerts and real user monitoring in one web UI. It is written in Rust, licensed AGPL-3.0, and has about 22,800 GitHub stars. Data is stored as compressed Parquet files instead of a search index, which is why the project positions it as a lighter alternative to Datadog, Splunk and Elasticsearch. This template runs OpenObserve on Railway as one service in local mode, with SQLite for metadata and data on local disk, so there is no Postgres, Elasticsearch cluster or object store to manage. Send it OpenTelemetry data, Prometheus metrics or logs from Fluent Bit and Vector, then search with SQL and PromQL. A small instance costs about $5–20/month on Railway, flat, with no per-GB or per-host bills.
What This Template Deploys
| Service | Purpose |
|---|---|
| OpenObserve | The openobserve/openobserve:v0.80.3 image on port 5080 with a public domain. Ingest APIs, search, dashboards, alerts and the web UI in one process. |
No volume is included. ZO_DATA_DIR is /data, where OpenObserve keeps its SQLite metadata and the Parquet files with your logs, metrics and traces. Attach a Railway volume at that path right after deploying (step 3 below), or everything is lost on each redeploy.
The root account is created on first start from the email and password you enter at deploy time. Telemetry to the OpenObserve project is turned off.
About Hosting OpenObserve
A typical self-hosted logging stack means Elasticsearch or OpenSearch nodes, a dashboard app, a shipper and a lot of RAM for the index. Metrics and traces then need Prometheus and Jaeger or Tempo next to it. OpenObserve folds those jobs into one process and stores data in columnar Parquet, which compresses well and keeps disk use low.
Local mode is the simple path. With ZO_LOCAL_MODE=true, OpenObserve runs as a single node with SQLite metadata and stores data on local disk. That suits teams sending up to tens of gigabytes a day. Bigger installs switch to cluster mode with Postgres and S3-compatible storage, which this template does not set up.
Add a volume before you rely on it. Everything lives under /data, and this template ships without a volume there. Until you attach one, each redeploy or restart starts from an empty instance, including users and dashboards. Size the volume for your retention.
Retention is ten years by default. OpenObserve keeps data for 3,650 days unless you set ZO_COMPACT_DATA_RETENTION_DAYS or a per-stream retention in the UI. On a fixed-size volume, pick a sensible number such as 30 days.
The root login is set once. ZO_ROOT_USER_EMAIL and ZO_ROOT_USER_PASSWORD create the first admin when the data directory is empty. Changing them later does not change the existing account. Use the UI to manage users after that.
Typical cost: ~$5–20/month on Railway for one service at small to moderate volume, plus volume storage. OpenObserve Cloud charges $0.50 per GB ingested. Datadog bills logs at about $0.10 per GB ingested plus a separate indexing fee per million events.
Deploy OpenObserve in Under 5 Minutes
- Enter a root email and a strong password in
ZO_ROOT_USER_EMAILandZO_ROOT_USER_PASSWORD. - Click Deploy on Railway. The image starts in under a minute.
- Right-click the OpenObserve service in your project, choose Attach Volume, and set the mount path to
/data. The service redeploys with persistent storage. - Open the service's public domain and sign in with the root account.
- Go to Data Sources in the UI. It shows ready-made snippets for curl, OpenTelemetry, Fluent Bit, Vector, Prometheus and more, with your credentials filled in.
- Send a test log, open Logs, pick the stream and search it.
Then add dashboards and alerts for the streams you care about.
Common Use Cases
- Replace Datadog or New Relic for a small team. Keep logs, metrics and traces without a per-host or per-GB invoice.
- Central logs for Railway projects. Ship logs from your other services with Vector or an HTTP drain into one searchable place.
- OpenTelemetry backend. Point the OTel Collector or SDKs at OpenObserve for traces and metrics.
- Lighter ELK. Move off Elasticsearch and Kibana while keeping SQL-style search and dashboards.
- Prometheus long-term storage. Send metrics with remote write and query them with PromQL.
- Front-end monitoring. Use the RUM SDK to see page performance, errors and session replays.
- Alerting. Run scheduled or real-time alerts on log patterns and metric thresholds, sent to Slack or webhooks.
Configuration
| Variable | Required | Description |
|---|---|---|
ZO_ROOT_USER_EMAIL | ⚠️ You set it | Email for the first admin account. |
ZO_ROOT_USER_PASSWORD | ⚠️ You set it | Password for that account. Used only when the data directory is empty. |
ZO_WEB_URL | ✅ Auto-set | https:// plus the Railway public domain, used for links in alerts and redirects. |
ZO_DATA_DIR | ✅ Set | /data. Mount your volume here. |
ZO_LOCAL_MODE | ✅ Set | true: single node with SQLite metadata and local disk. |
ZO_HTTP_PORT, PORT | ✅ Set | 5080, where the UI and APIs listen. |
ZO_TELEMETRY | ✅ Set | false, so no usage data is sent to the project. |
RAILWAY_RUN_UID | ✅ Set | 0, so the container can write to a volume you attach. |
Optional settings. Add ZO_COMPACT_DATA_RETENTION_DAYS to cap retention. To keep data in object storage instead of the volume, set ZO_LOCAL_MODE_STORAGE=s3 with the ZO_S3_* bucket variables.
Sending data. Ingestion uses HTTP basic auth with your user's email and password or an ingestion token from the UI. The default organization is default, so log endpoints look like /api/default/your-stream/_json.
Protecting the instance. The public domain exposes the login page and the ingest APIs. Use a long root password, create a separate user for each shipper, and remove any user whose credentials leak.
OpenObserve vs. Alternatives
| OpenObserve on Railway | OpenObserve Cloud | Datadog | Self-hosted ELK | |
|---|---|---|---|---|
| Monthly cost | ~$5–20 usage, flat | $0.50 per GB ingested | Per GB plus per event indexed | Several nodes, high RAM |
| Self-hosted | ✅ Yes | ❌ No | ❌ No | ✅ Yes |
| Logs, metrics, traces in one tool | ✅ Yes | ✅ Yes | ✅ Yes | ⚠️ Logs first, add-ons for the rest |
| Services to run | ✅ One | ✅ None | ✅ None | ❌ Several |
| Query languages | ✅ SQL and PromQL | ✅ SQL and PromQL | ⚠️ Own query syntax | ⚠️ KQL and ES DSL |
| SSO and RBAC | ⚠️ Enterprise edition | ✅ Yes | ✅ Yes | ⚠️ Paid tiers |
| License | ✅ AGPL-3.0 | ⚠️ Hosted service | ❌ Proprietary | ⚠️ Mixed |
Dependencies for OpenObserve Hosting
- Railway account. Hobby is fine for testing; Pro for more RAM and larger volumes.
- A Railway volume mounted at
/data, added after the first deploy. - Something to send data: the OpenTelemetry Collector, Fluent Bit, Vector, Prometheus or plain HTTP.
- Optional: an S3-compatible bucket if you want long retention without a large volume.
Deployment Dependencies
- OpenObserve on GitHub: source code and releases
- OpenObserve Docs: ingestion guides and environment variables
- Docker Hub image: image tags
- Railway Volumes: how persistent storage works
Implementation Details
The service runs the official image pinned to v0.80.3, so redeploys never pull a surprise upgrade. Newer releases, currently the 1.1 line, are on Docker Hub; back up the volume, change the image tag and redeploy to upgrade. The single sign-on, role-based access and audit features belong to the Enterprise edition, which OpenObserve offers free up to 50 GB a day of ingestion under its own licence.
Frequently Asked Questions
What is OpenObserve? An AGPL-3.0 observability platform written in Rust that stores logs, metrics and traces as Parquet files and gives you search, dashboards and alerts in one web UI.
How much does it cost compared with Datadog? About $5–20/month on Railway for a small instance, plus volume storage, with no per-GB charges. Datadog charges for log ingestion and again for indexing, and OpenObserve Cloud is $0.50 per GB ingested.
How do I send logs to it? Open Data Sources in the UI for copy-ready examples. You can post JSON over HTTP, or use the OpenTelemetry Collector, Fluent Bit, Vector or Prometheus.
Will I lose data when I redeploy?
Yes, unless you add a volume. This template doesn't include one, so attach a volume at /data right after the first deploy. Everything, including users and dashboards, is stored there.
How do I limit disk usage?
Set ZO_COMPACT_DATA_RETENTION_DAYS, for example to 30, or set retention per stream in the UI. Older data is deleted automatically.
Can I add more users? Yes. Sign in as root and add users in the UI. Single sign-on and fine-grained roles need the Enterprise edition.
Why Deploy and Host OpenObserve on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying OpenObserve on Railway, you get logs, metrics and traces in one place you control, at a flat monthly cost.
Template Content
OpenObserve
openobserve/openobserve:v0.80.3ZO_ROOT_USER_EMAIL
Root login email (bootstrap)
ZO_ROOT_USER_PASSWORD
Root login password (bootstrap-only)

