---
title: "Deploy Apache Pinot | (Just Updated) Real-Time OLAP Database, SQL API, Auth On, Data Survives Redeploys"
description: "Apache Pinot real-time OLAP database, SQL over REST, auth on, one service"
category: "Storage"
url: https://railway.com/deploy/apache-pinot-or-just-updated-real-time-o
---

# Deploy Apache Pinot | (Just Updated) Real-Time OLAP Database, SQL API, Auth On, Data Survives Redeploys

Apache Pinot real-time OLAP database, SQL over REST, auth on, one service

**[Deploy Apache Pinot | (Just Updated) Real-Time OLAP Database, SQL API, Auth On, Data Survives Redeploys on Railway](https://railway.com/template/apache-pinot-or-just-updated-real-time-o)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/apache-pinot-or-just-updated-real-time-o/manifest.json

- **Creator:** SuperSlowSloth
- **Category:** Storage

## Template content

### pinot

- **Image:** apachepinot/pinot:1.6.0@sha256:94e2825071e62e34bf2dd1b74cc1e4653cc7b3f6a0a2cf3d29ff9ddfa19b81af
- **Start command:** `/bin/bash -c 'eval "$(echo IyEvYmluL2Jhc2gKIyBSYWlsd2F5IGJvb3QgZm9yIEFwYWNoZSBQaW5vdDogWm9vS2VlcGVyLCBjb250cm9sbGVyLCBicm9rZXIgYW5kIHNlcnZlciBpbiBvbmUgY29udGFpbmVyLgojCiMgVXBzdHJlYW0gZG9jdW1lbnRzIFBpbm90IGFzIGZvdXIgY29udGFpbmVycyAocGx1cyBhIFpvb0tlZXBlcikuIE9uIFJhaWx3YXkgdGhhdCBpcyBmb3VyIGlkbGUgSlZNcywKIyBmb3VyIHZvbHVtZXMgYW5kIGEgcHJpdmF0ZS1uZXR3b3JrIHdpcmluZyBqb2IgZm9yIHRoZSBkZXBsb3llciwgc28gdGhpcyBzY3JpcHQgcnVucyBhbGwgZm91ciBpbgojIHRoaXMgY29udGFpbmVyIGFnYWluc3Qgb25lIHZvbHVtZSBhbmQgc3VwZXJ2aXNlcyB0aGVtOiBpZiBhbnkgZXhpdHMsIHRoZSBvdGhlcnMgYXJlIHN0b3BwZWQgYW5kCiMgdGhlIGNvbnRhaW5lciBleGl0cywgd2hpY2ggbWFrZXMgUmFpbHdheSdzIHJlc3RhcnQgcG9saWN5IGRvIHRoZSByZWNvdmVyeSByYXRoZXIgdGhhbiBsZWF2aW5nIGEKIyBoYWxmLWFsaXZlIGNsdXN0ZXIgdGhhdCBhbnN3ZXJzIHRoZSBoZWFsdGhjaGVjayBhbmQgZmFpbHMgcXVlcmllcy4KIwojIFRoaW5ncyBhIHRlbXBsYXRlIGNhbm5vdCBjYXJyeSBhcyBsaXRlcmFscyBhcmUgZG9uZSBoZXJlOgojICAtIGNvbnRyb2xsZXIgYmFzaWMgYXV0aCAodGhlIHN0b2NrIGNvbnRyb2xsZXIsIGJyb2tlciBhbmQgc2VydmVyIGFuc3dlciBhbnkgY2FsbGVyLCBpbmNsdWRpbmcKIyAgICBEREwgYW5kIHNlZ21lbnQgZGVsZXRlcykgd2l0aCB0aGUgcGFzc3dvcmQgZ2VuZXJhdGVkIHBlciBkZXBsb3ksCiMgIC0gYSBGSVhFRCBob3N0IG5hbWUgZm9yIGV2ZXJ5IHJvbGUuIFBpbm90IHJlY29yZHMgaXRzIGluc3RhbmNlIGlkIGFzIDxyb2xlPl88aG9zdG5hbWU+Xzxwb3J0PiBhbmQKIyAgICBwaW5zIGV2ZXJ5IHNlZ21lbnQgdG8gdGhhdCBpZCwgYW5kIFJhaWx3YXkgZ2l2ZXMgYSByZWRlcGxveWVkIGNvbnRhaW5lciBhIG5ldyBob3N0bmFtZSwgc28gdGhlCiMgICAgc3RvY2sgY29uZmlnIG9ycGhhbnMgZXZlcnkgc2VnbWVudCBvbiB0aGUgZmlyc3QgcmVkZXBsb3kuIGBwaW5vdC1ub2RlYCBpcyByZXNvbHZlZCB0aHJvdWdoCiMgICAgL2V0Yy9ob3N0cyB0byB0aGlzIGNvbnRhaW5lciwgc28gdGhlIGluc3RhbmNlIGlkcyBzdXJ2aXZlIGEgcmVkZXBsb3ksCiMgIC0gdGhlIGNvbnRyb2xsZXIgb24gUmFpbHdheSdzIGluamVjdGVkIFBPUlQgKHRoZSBoZWFsdGhjaGVjayBkaWFscyB0aGF0IHBvcnQpLCB0aGUgYnJva2VyIGFuZAojICAgIHNlcnZlciBvbiBwcml2YXRlIGxvb3BiYWNrLXJlYWNoYWJsZSBwb3J0cywKIyAgLSBKVk0gaGVhcCBzaXplZCBmcm9tIHRoZSBjZ3JvdXAgbGltaXQgKHRoZSBpbWFnZSBkZWZhdWx0cyB0byAtWG1zNEcgLVhteDRHIGZvciBFQUNIIG9mIHRoZSBmb3VyCiMgICAgSlZNcykgYW5kIGEgcHJvY2Vzc29yIGNvdW50IGNhcCAoYSBtdWx0aS1KVk0gY29udGFpbmVyIGNhbiBleGhhdXN0IFJhaWx3YXkncyBwaWRzLm1heD0xMDAwKS4Kc2V0IC1ldQoKOiAiJHtBRE1JTl9QQVNTV09SRDo/QURNSU5fUEFTU1dPUkQgbXVzdCBiZSBzZXR9IgpQT1JUPSIke1BPUlQ6LTgwODB9IgpEQVRBPS92YXIvcGlub3QKSE9TVD1waW5vdC1ub2RlCkNMVVNURVI9cmFpbHdheS1waW5vdApDT05GPSIkREFUQS9jb25mIgpta2RpciAtcCAiJERBVEEvemsiICIkREFUQS9jb250cm9sbGVyIiAiJERBVEEvc2VydmVyL2luZGV4IiAiJERBVEEvc2VydmVyL3NlZ21lbnRUYXIiICIkQ09ORiIKCiMgRml4ZWQgaG9zdCBuYW1lIGZvciBldmVyeSByb2xlLCByZXNvbHZlZCB0byB0aGlzIGNvbnRhaW5lci4KZ3JlcCAtcSAiICRIT1NUXCQiIC9ldGMvaG9zdHMgMj4vZGV2L251bGwgfHwgZWNobyAiMTI3LjAuMC4xICRIT1NUIiA+PiAvZXRjL2hvc3RzCgojIFNpemUgZnJvbSB0aGUgY2dyb3VwLCBub3QgdGhlIGhvc3QgKFJhaWx3YXkgY29udGFpbmVycyByZXBvcnQgdGhlIGhvc3QncyBSQU0gYW5kIGNvcmVzKS4KTT0kKGNhdCAvc3lzL2ZzL2Nncm91cC9tZW1vcnkubWF4IDI+L2Rldi9udWxsIHx8IGVjaG8gbWF4KQpRPSQoY3V0IC1kJyAnIC1mMSAvc3lzL2ZzL2Nncm91cC9jcHUubWF4IDI+L2Rldi9udWxsIHx8IGVjaG8gbWF4KQppZiBbICIkTSIgIT0gbWF4IF0gJiYgWyAiJE0iIC1sdCAxMDAwMDAwMDAwMDAwIF0gMj4vZGV2L251bGw7IHRoZW4KICBNRU1fTUI9JCgoTSAvIDEwNDg1NzYpKQplbHNlCiAgTUVNX01CPSQoYXdrICcvTWVtVG90YWwvIHtwcmludCBpbnQoJDIgLyAxMDI0KX0nIC9wcm9jL21lbWluZm8pCiAgWyAiJE1FTV9NQiIgLWd0IDgxOTIgXSAmJiBNRU1fTUI9ODE5MgpmaQppZiBbICIkUSIgIT0gbWF4IF0gJiYgWyAiJFEiIC1ndCAwIF0gMj4vZGV2L251bGw7IHRoZW4KICBDT1JFUz0kKCggKFEgKyA5OTk5OSkgLyAxMDAwMDAgKSkKZWxzZQogIENPUkVTPSQobnByb2MpCmZpClsgIiRDT1JFUyIgLWd0IDggXSAmJiBDT1JFUz04CiMgSGVhcCBzcGxpdDogc2VydmVyIDI4JSwgY29udHJvbGxlciAxMiUsIGJyb2tlciAxMiUsIHpvb2tlZXBlciAzJTsgdGhlIHNlcnZlciBhbHNvIHRha2VzIGRpcmVjdAojIG1lbW9yeSAob2ZmLWhlYXApIGZvciBzZWdtZW50IGxvYWRpbmcuClNSVl9NQj0kKChNRU1fTUIgKiAyOCAvIDEwMCkpOyBbICIkU1JWX01CIiAtbHQgMjU2IF0gJiYgU1JWX01CPTI1NgpDVExfTUI9JCgoTUVNX01CICogMTIgLyAxMDApKTsgWyAiJENUTF9NQiIgLWx0IDE5MiBdICYmIENUTF9NQj0xOTIKQlJLX01CPSQoKE1FTV9NQiAqIDEyIC8gMTAwKSk7IFsgIiRCUktfTUIiIC1sdCAxOTIgXSAmJiBCUktfTUI9MTkyClpLX01CPSQoKE1FTV9NQiAqIDMgLyAxMDApKTsgICBbICIkWktfTUIiIC1sdCA5NiBdICYmIFpLX01CPTk2CkRJUkVDVF9NQj0kKChNRU1fTUIgKiAxNSAvIDEwMCkpOyBbICIkRElSRUNUX01CIiAtbHQgMTI4IF0gJiYgRElSRUNUX01CPTEyOApDT01NT049Ii1YWDpBY3RpdmVQcm9jZXNzb3JDb3VudD0kQ09SRVMgLVhYOitFeGl0T25PdXRPZk1lbW9yeUVycm9yIC1EcGlub3QuYWRtaW4uc3lzdGVtLmV4aXQ9dHJ1ZSIKClRPS0VOPSJCYXNpYyAkKHByaW50ZiAnYWRtaW46JXMnICIkQURNSU5fUEFTU1dPUkQiIHwgYmFzZTY0IHwgdHIgLWQgJ1xuJykiCgpjYXQgPiAiJENPTkYvY29udHJvbGxlci5jb25mIiA8PEVPRgpwaW5vdC5zZXJ2aWNlLnJvbGU9Q09OVFJPTExFUgpwaW5vdC5jbHVzdGVyLm5hbWU9JENMVVNURVIKcGlub3Quemsuc2VydmVyPWxvY2FsaG9zdDoyMTgxCmNvbnRyb2xsZXIuaG9zdD0kSE9TVApjb250cm9sbGVyLnBvcnQ9JFBPUlQKY29udHJvbGxlci52aXAuaG9zdD0kSE9TVApjb250cm9sbGVyLnZpcC5wb3J0PSRQT1JUCmNvbnRyb2xsZXIudmlwLnByb3RvY29sPWh0dHAKY29udHJvbGxlci5kYXRhLmRpcj0kREFUQS9jb250cm9sbGVyCmNvbnRyb2xsZXIuYWRtaW4uYWNjZXNzLmNvbnRyb2wuZmFjdG9yeS5jbGFzcz1vcmcuYXBhY2hlLnBpbm90LmNvbnRyb2xsZXIuYXBpLmFjY2Vzcy5CYXNpY0F1dGhBY2Nlc3NDb250cm9sRmFjdG9yeQpjb250cm9sbGVyLmFkbWluLmFjY2Vzcy5jb250cm9sLnByaW5jaXBhbHM9YWRtaW4KY29udHJvbGxlci5hZG1pbi5hY2Nlc3MuY29udHJvbC5wcmluY2lwYWxzLmFkbWluLnBhc3N3b3JkPSRBRE1JTl9QQVNTV09SRApjb250cm9sbGVyLnNlZ21lbnQuZmV0Y2hlci5hdXRoLnRva2VuPSRUT0tFTgpwaW5vdC5jb250cm9sbGVyLnNlZ21lbnQuZmV0Y2hlci5hdXRoLnRva2VuPSRUT0tFTgpjb250cm9sbGVyLnNlZ21lbnQudXBsb2FkLmF1dGgudG9rZW49JFRPS0VOCkVPRgoKY2F0ID4gIiRDT05GL2Jyb2tlci5jb25mIiA8PEVPRgpwaW5vdC5zZXJ2aWNlLnJvbGU9QlJPS0VSCnBpbm90LmNsdXN0ZXIubmFtZT0kQ0xVU1RFUgpwaW5vdC56ay5zZXJ2ZXI9bG9jYWxob3N0OjIxODEKcGlub3QuYnJva2VyLmNsaWVudC5xdWVyeVBvcnQ9ODA5OQpwaW5vdC5icm9rZXIuaW5zdGFuY2UuaWQ9QnJva2VyX3Bpbm90LW5vZGVfODA5OQpwaW5vdC5icm9rZXIuaG9zdG5hbWU9cGlub3Qtbm9kZQpwaW5vdC5icm9rZXIuYWNjZXNzLmNvbnRyb2wuY2xhc3M9b3JnLmFwYWNoZS5waW5vdC5icm9rZXIuYnJva2VyLkJhc2ljQXV0aEFjY2Vzc0NvbnRyb2xGYWN0b3J5CnBpbm90LmJyb2tlci5hY2Nlc3MuY29udHJvbC5wcmluY2lwYWxzPWFkbWluCnBpbm90LmJyb2tlci5hY2Nlc3MuY29udHJvbC5wcmluY2lwYWxzLmFkbWluLnBhc3N3b3JkPSRBRE1JTl9QQVNTV09SRApwaW5vdC5icm9rZXIuc2VnbWVudC5mZXRjaGVyLmF1dGgudG9rZW49JFRPS0VOCkVPRgoKY2F0ID4gIiRDT05GL3NlcnZlci5jb25mIiA8PEVPRgpwaW5vdC5zZXJ2aWNlLnJvbGU9U0VSVkVSCnBpbm90LmNsdXN0ZXIubmFtZT0kQ0xVU1RFUgpwaW5vdC56ay5zZXJ2ZXI9bG9jYWxob3N0OjIxODEKcGlub3Quc2VydmVyLm5ldHR5LnBvcnQ9ODA5OApwaW5vdC5zZXJ2ZXIuaW5zdGFuY2UuaWQ9U2VydmVyX3Bpbm90LW5vZGVfODA5OApwaW5vdC5zZXJ2ZXIuaG9zdG5hbWU9cGlub3Qtbm9kZQpwaW5vdC5zZXJ2ZXIuYWRtaW5hcGkucG9ydD04MDk3CnBpbm90LnNlcnZlci5pbnN0YW5jZS5kYXRhRGlyPSREQVRBL3NlcnZlci9pbmRleApwaW5vdC5zZXJ2ZXIuaW5zdGFuY2Uuc2VnbWVudFRhckRpcj0kREFUQS9zZXJ2ZXIvc2VnbWVudFRhcgpwaW5vdC5zZXJ2ZXIuc2VnbWVudC5mZXRjaGVyLmF1dGgudG9rZW49JFRPS0VOCnBpbm90LnNlcnZlci5zZWdtZW50LnVwbG9hZGVyLmF1dGgudG9rZW49JFRPS0VOCnBpbm90LnNlcnZlci5pbnN0YW5jZS5hdXRoLnRva2VuPSRUT0tFTgpFT0YKCmVjaG8gIltyYWlsd2F5XSBwaW5vdCB1aWQ9JChpZCAtdSkgb3duZXI9JChzdGF0IC1jICV1OiVnICIkREFUQSIpIHBvcnQ9JFBPUlQgbWVtPSR7TUVNX01CfU1CIGNvcmVzPSRDT1JFUyBoZWFwIHNlcnZlcj0ke1NSVl9NQn1tIGNvbnRyb2xsZXI9JHtDVExfTUJ9bSBicm9rZXI9JHtCUktfTUJ9bSB6az0ke1pLX01CfW0iCgpjZCAvb3B0L3Bpbm90CkpBVkFfT1BUUz0iLVhtcyR7WktfTUJ9bSAtWG14JHtaS19NQn1tICRDT01NT04iIC4vYmluL3Bpbm90LWFkbWluLnNoIFN0YXJ0Wm9va2VlcGVyIC16a1BvcnQgMjE4MSAtZGF0YURpciAiJERBVEEvemsiICYKWks9JCEKIyBDb250cm9sbGVyIGFuZCBicm9rZXIgd2FpdCBvbiBab29LZWVwZXIgdGhlbXNlbHZlcyAoSGVsaXggcmV0cmllcyksIGJ1dCBzdGFydCB0aGVtIGluIG9yZGVyIHNvIHRoZQojIGxvZyByZWFkcyBpbiBvcmRlci4KaT0wCnVudGlsIChleGVjIDM8Pi9kZXYvdGNwLzEyNy4wLjAuMS8yMTgxKSAyPi9kZXYvbnVsbDsgZG8KICBraWxsIC0wICIkWksiIDI+L2Rldi9udWxsIHx8IHsgZWNobyAiW3JhaWx3YXldIHpvb2tlZXBlciBleGl0ZWQgZHVyaW5nIHN0YXJ0IjsgZXhpdCAxOyB9CiAgaT0kKChpICsgMSkpOyBbICIkaSIgLWd0IDkwIF0gJiYgeyBlY2hvICJbcmFpbHdheV0gem9va2VlcGVyIG5vdCBhbnN3ZXJpbmcgYWZ0ZXIgOTBzIjsga2lsbCAiJFpLIjsgZXhpdCAxOyB9CiAgc2xlZXAgMQpkb25lCgpKQVZBX09QVFM9Ii1YbXMke0NUTF9NQn1tIC1YbXgke0NUTF9NQn1tICRDT01NT04iIC4vYmluL3Bpbm90LWFkbWluLnNoIFN0YXJ0Q29udHJvbGxlciAtY29uZmlnICIkQ09ORi9jb250cm9sbGVyLmNvbmYiICYKQ1RMPSQhCkpBVkFfT1BUUz0iLVhtcyR7QlJLX01CfW0gLVhteCR7QlJLX01CfW0gJENPTU1PTiIgLi9iaW4vcGlub3QtYWRtaW4uc2ggU3RhcnRCcm9rZXIgLWJyb2tlckhvc3QgIiRIT1NUIiAtY29uZmlnICIkQ09ORi9icm9rZXIuY29uZiIgJgpCUks9JCEKSkFWQV9PUFRTPSItWG1zJHtTUlZfTUJ9bSAtWG14JHtTUlZfTUJ9bSAtWFg6TWF4RGlyZWN0TWVtb3J5U2l6ZT0ke0RJUkVDVF9NQn1tICRDT01NT04iIC4vYmluL3Bpbm90LWFkbWluLnNoIFN0YXJ0U2VydmVyIC1zZXJ2ZXJIb3N0ICIkSE9TVCIgLWNvbmZpZyAiJENPTkYvc2VydmVyLmNvbmYiICYKU1JWPSQhCgp0cmFwICdraWxsICRTUlYgJEJSSyAkQ1RMICRaSyAyPi9kZXYvbnVsbDsgd2FpdDsgZXhpdCAxNDMnIFRFUk0gSU5UCgp3aGlsZSBraWxsIC0wICIkWksiIDI+L2Rldi9udWxsICYmIGtpbGwgLTAgIiRDVEwiIDI+L2Rldi9udWxsICYmIGtpbGwgLTAgIiRCUksiIDI+L2Rldi9udWxsICYmIGtpbGwgLTAgIiRTUlYiIDI+L2Rldi9udWxsOyBkbwogIHNsZWVwIDIKZG9uZQplY2hvICJbcmFpbHdheV0gYSBwaW5vdCBwcm9jZXNzIGV4aXRlZDsgc3RvcHBpbmcgY29udGFpbmVyIHNvIFJhaWx3YXkgcmVzdGFydHMgaXQiCmtpbGwgIiRTUlYiICIkQlJLIiAiJENUTCIgIiRaSyIgMj4vZGV2L251bGwgfHwgdHJ1ZQp3YWl0IHx8IHRydWUKZXhpdCAxCg== | base64 -d)"'`
- **Health check:** /health
- **Public domain:** Yes

## Documentation

# Deploy and Host Apache Pinot on Railway

**Built for an LLM agent to deploy and use.** There is no setup step and nothing to fill in: authentication is on from the first request with a generated 32-character password, and the whole cluster (ZooKeeper, controller, broker, server) runs in one service. The contract below lists every URL, variable name and the one script that proves it works.

Apache Pinot is a real-time distributed OLAP datastore: columnar storage, star-tree and inverted indexes, and SQL queries that answer in milliseconds over billions of rows, fed from batch files or Kafka streams. This template runs a single-node Pinot 1.6.0 cluster with basic authentication on the controller and the broker.

## About Hosting Apache Pinot

Upstream documents Pinot as a ZooKeeper plus separate controller, broker and server containers. This template runs all four in one service, the official `apachepinot/pinot` image pinned by digest, with their data on one volume at `/var/pinot`. A boot script sizes each JVM heap from the container's memory limit (the image default is 4 GB per JVM, which does not fit), gives every role the fixed host name `pinot-node` so segment assignments survive a redeploy (Pinot pins data to instance ids built from the host name, and Railway gives a new container a new host name), and supervises the four processes: if one dies the container exits and Railway restarts it. The first boot takes a few minutes; after a redeploy the data is queryable again about a minute and a half after the controller reports healthy.

The controller (REST API, Swagger UI, query console, `/sql` query proxy) is the one public service on port 8080. The broker listens on 8099 and is reachable from other services in the same project.

### Agent contract

- Public URL: `https://` plus `RAILWAY_PUBLIC_DOMAIN`, given as `PINOT_PUBLIC_URL`. It serves the controller REST API, the Swagger UI at `/help` and the query console at `/`.
- Private URL: `http://pinot.railway.internal:8080` for the controller and `http://pinot.railway.internal:8099` for the broker (variable `PINOT_PRIVATE_BROKER_URL`), for services in the same project.
- Credentials: user `admin`, password in `ADMIN_PASSWORD`.
- Auth: HTTP basic auth on every controller and broker request (`curl -u admin:PASSWORD`). Anonymous calls answer 401.
- Health: `GET /health` on the controller returns `OK` with no credentials.

```bash
# run with PINOT_PUBLIC_URL and ADMIN_PASSWORD set; needs curl
U="admin:$ADMIN_PASSWORD"; J='Content-Type: application/json'
T="agent_$(cat /proc/sys/kernel/random/uuid | tr -d - | cut -c1-8)"
curl -s -w ' health %{http_code}\n' "$PINOT_PUBLIC_URL/health"
curl -s -o /dev/null -w 'anonymous %{http_code}\n' "$PINOT_PUBLIC_URL/tables"
curl -fsS -u "$U" -H "$J" -X POST "$PINOT_PUBLIC_URL/schemas" -d "{\"schemaName\":\"$T\",\"dimensionFieldSpecs\":[{\"name\":\"item\",\"dataType\":\"STRING\"}],\"metricFieldSpecs\":[{\"name\":\"qty\",\"dataType\":\"LONG\"}]}" >/dev/null
curl -fsS -u "$U" -H "$J" -X POST "$PINOT_PUBLIC_URL/tables" -d "{\"tableName\":\"$T\",\"tableType\":\"OFFLINE\",\"segmentsConfig\":{\"replication\":\"1\"},\"tenants\":{},\"tableIndexConfig\":{\"loadMode\":\"MMAP\"},\"metadata\":{}}" >/dev/null
printf 'item,qty\nbook,2\npen,5\n' > /tmp/$T.csv
curl -fsS -u "$U" -X POST -F "file=@/tmp/$T.csv" "$PINOT_PUBLIC_URL/ingestFromFile?tableNameWithType=${T}_OFFLINE&batchConfigMapStr=%7B%22inputFormat%22%3A%22csv%22%7D" >/dev/null
for i in 1 2 3 4 5 6 7 8 9 10; do
  curl -fsS -u "$U" -H "$J" -X POST "$PINOT_PUBLIC_URL/sql" -d "{\"sql\":\"select sum(qty) as total from $T\"}" | grep -o '"rows":\[\[7\.0\]\]' && break; sleep 3
done
```

A fresh deploy prints `OK health 200`, `anonymous 401` and `"rows":[[7.0]]`. Services in the same project query the broker directly with `curl -u admin:PASSWORD -H 'Content-Type: application/json' -X POST http://pinot.railway.internal:8099/query/sql -d '{"sql":"select count(*) from mytable"}'`.

## Why Deploy Apache Pinot 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 Apache Pinot on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

- **Agent-ready** - generated password, contract block and one working script; no wizard, no open cluster.
- **One service, not four** - ZooKeeper, controller, broker and server run together on one volume instead of four services you wire by hand.
- **Closed by default** - the stock Pinot controller and broker answer any caller, including table drops; here every call needs the generated password.
- **State survives redeploys** - schemas, tables and segments stay assigned across redeploys because the cluster identity does not depend on the container host name.
- **Sized for the container** - JVM heaps come from the memory limit, not the host.

## Common Use Cases

- **User-facing analytics** - low-latency dashboards and metrics APIs over event data.
- **Real-time OLAP for AI agents** - give an agent a SQL endpoint over large event tables without a warehouse.
- **Stream analytics** - ingest from Kafka-compatible brokers in the same project and query within seconds.

## Dependencies for Apache Pinot Hosting

- None. ZooKeeper runs inside the service; all state is on the volume at `/var/pinot`.

### Deployment Dependencies

- [apache/pinot](https://github.com/apache/pinot) - upstream project


## Similar templates

- [RustFS | (Just Updated) S3 Object Store, Public URL and Keys Set](https://railway.com/deploy/rustfs-or-just-updated-s3-object-store-p) — S3-compatible object store, keys and public URL preset, volume kept
- [TimescaleDB](https://railway.com/deploy/timescaledb-railway-template) — A PostgreSQL-based time-series database for analytics on Railway.
- [Garage S3 Storage](https://railway.com/deploy/garage-s3-storage) — Ultra-light S3 server: fast, open-source, plug-and-play.

Open this page in a browser: https://railway.com/deploy/apache-pinot-or-just-updated-real-time-o
