This lesson does not tell you how to install anything. Installation instructions belong in the official documentation, where they are maintained by people who change them when the software changes.
What this covers is the shape of the system, so that when something breaks you have a model of what could be broken.
The components and what they need.
graph-node needs chain access, Postgres, and more disk and memory than you first budgeted. It is the component that does the actual indexing, and it is where most resource problems originate. Every subgraph it indexes is a schema in Postgres that grows without bound.
Postgres is not an afterthought here. Query latency, indexing throughput and your backup story all run through it. Treat it as a first-class database with a real operator, because that is what it is.
Chain access is the cost that surprises people. Indexing history means reading history, which means archive access. Run your own and you are operating another substantial piece of infrastructure. Buy it and it is a recurring bill that scales with what you index.
indexer-agent needs an operator key, network access, and your indexing rules. It takes the decisions.
indexer-service-rs is the public face. It is stateless, so it scales horizontally, and it needs to be reachable and fast.
indexer-tap-agent runs as a single instance and turns receipts into redeemable vouchers. If it is down, you serve queries for free.
Operator keys and stake.
Your stake sits in one wallet. The day-to-day actions, opening allocations, submitting POIs, redeeming vouchers, are performed by an operator key that is authorised to act for you without being able to move the stake.
Use it. Separating the key that runs the machine from the key that holds the capital is the single highest-value operational decision available to you, and it costs one transaction to set up.
Which failures are loud, and which are silent.
The loud ones look after themselves. A process that dies gets restarted, and disk filling triggers whatever you already have.
The silent ones are the expensive category, because in every case the system appears healthy and the money stops:
| Failure | What you see | What it costs |
|---|---|---|
| POI age past the staleness limit | Everything running | The allocation stops earning |
| Subgraph failed on a contract upgrade | One deployment not syncing | That allocation goes stale in a month |
| tap-agent stopped | Queries served normally | Queries served for free |
| RAV redemption reverting | Vouchers accumulating | Earned revenue never lands |
| Allocated to unsignalled subgraphs | Healthy indexing | No indexing rewards |
| Cost model priced above the field | Low query volume | No query fees, and it looks like low demand |
Note what they have in common. Not one is a systems failure. Every one is an economic failure that a systems dashboard reports as green.
What to build before you scale.
In order, and the order matters:
- POI age alerting per allocation, warning well before 28 days.
- Deployment health, distinguishing syncing, synced and failed. A failed subgraph is invisible in aggregate metrics.
- Payment pipeline monitoring. Unaggregated value and unredeemed RAV age.
- POI divergence checking against other indexers, before a dispute rather than after.
- Postgres backups you have actually restored from. An untested backup is a belief, not a backup.
Only then add another chain.
On running it alone.
Worth saying plainly, since most material skips it. Chains do not pause for holidays, illness or a bad week. An indexer with one operator has a single point of failure who needs to sleep.
Options exist: an arrangement with another operator to watch each other’s alerts, automation that closes or reallocates on failure, running a smaller allocation set that degrades gracefully. Any of these is better than intending to be vigilant.
Why separate an operator key from the key holding your stake?
The operator key authorises allocations, POIs and redemptions without being able to move stake. One transaction to set up, and it is the highest-value operational decision available.
Which of these failures is invisible on a normal systems dashboard?
Serving and settling are independent. Queries keep flowing and look perfectly healthy while nothing is being aggregated or redeemed. Monitor unaggregated value and unredeemed RAV age.
What should you build before adding a second chain?
Every silent failure mode costs money continuously while looking green. Capacity to notice comes before capacity to serve, because unnoticed failures scale with the number of chains.
0 of 3 answered