Indexer Archive Node
An archive node that keeps every historical state and serves exactly one client: the indexer writer running beside it. It publishes no port and sits behind no proxy.
Docker, a GHCR token, and TCP 30333 reachable. See
Installation.
Why this role exists separately
Sharing the public RPC does not work. An indexer backfilling history issues
a continuous stream of state queries. Pointing it at rpc-1 / rpc-2 put that
load on the same endpoint serving wallets — which is what caused the explorer to
take the public RPC down with it. This node exists so that traffic never leaves
the host.
Archive is mandatory, not a preference. The writer must be able to re-read
any block to backfill or re-index. A pruned node discards old state and the
writer fails with State already discarded — which surfaces long after
deployment, midway through a backfill.
Deploy
cd node-deploy/testnet/indexer-rpc
cp .env.example .env # set RPC_NODE_KEY
docker compose up -d
docker compose logs -f orbinum-indexer-rpc
The node key is your stable libp2p identity — generate it with
openssl rand -hex 32. Everything else in .env has a working default.
Wait for a full sync before pointing the indexer at it. On an archive node that takes considerably longer than on a pruned one, and an indexer started early will read gaps as missing data.
Then point the writer at ws://127.0.0.1:9944.
What makes it different
| Setting | Value | Why |
|---|---|---|
--state-pruning archive | full history | the writer re-reads arbitrary blocks |
--blocks-pruning archive | full history | same |
--rpc-methods Safe | no unsafe RPC | it holds no keys and needs no key insertion |
no --rpc-external | loopback only | the only client is on this host |
no ports: mapping | nothing published | not reachable from the internet, by construction |
telemetry level 0 | minimal | it has no validator address to report |
RPC_MEM_LIMIT=4g, RPC_CPUS=1.5 | lighter caps | it serves one client, not the public |
Because nothing is published, you reach it through the container:
docker exec orbinum-indexer-rpc curl -s -H 'Content-Type: application/json' \
-d '{"id":1,"jsonrpc":"2.0","method":"system_health"}' \
http://localhost:9944
Wait for isSyncing: false before starting the indexer.
Firewall
Only P2P and SSH. There is no RPC port to expose and no HTTP to terminate.
sudo ufw allow 30333/tcp # P2P
sudo ufw allow 22/tcp # SSH
sudo ufw enable
--rpc-externalIt would publish an archive node's full state to the internet with no rate limiting in front of it. If you need a public endpoint, run a public RPC node — that role has the protection layers this one deliberately lacks.
Next Steps
- Public RPC Node — the internet-facing role, behind Cloudflare and Caddy
- Running a Node — sizing, and how the roles compare