How do I run a Sui full node, and what hardware does it need?
November 1, 2026
A Sui full node is the sui-node binary running with a fullnode.yaml config and the genesis.blob for your network. Start it from a recent snapshot, not from genesis. The docs suggest 8 physical cores (16 vCPUs), 128 GB of RAM and a 4 TB NVMe SSD, running on Linux (Ubuntu or Debian). macOS is fine for development but isn't supported for production.
Hardware and ports
| Resource | Suggested minimum |
|---|---|
| CPU | 8 physical cores / 16 vCPUs |
| RAM | 128 GB |
| Storage | 4 TB NVMe SSD |
| OS | Linux (Ubuntu or Debian) |
Without pruning, a node can grow past 7 TB. Configure pruning from the start (see below).
| Port | Purpose | Exposure |
|---|---|---|
| 9000/TCP | gRPC and JSON-RPC | Behind a TLS proxy on 443 |
| 8084/UDP | P2P state sync | Public, required for peering |
| 9184/TCP | Prometheus metrics | Private |
| 1337/TCP | Admin interface | Localhost only |
Set it up
You can build from source, use a prebuilt sui-node binary, or use Docker Compose. The docs say Docker Compose isn't suitable for production. With a binary:
# Config template and genesis for the network you want
curl -fLO https://raw.githubusercontent.com/MystenLabs/sui/main/crates/sui-config/data/fullnode-template.yaml
mv fullnode-template.yaml fullnode.yaml
curl -fLO https://github.com/MystenLabs/sui-genesis/raw/main/mainnet/genesis.blob
sui-node --config-path fullnode.yamlIn fullnode.yaml, set:
db-pathto a directory on the NVMe disk.genesis.genesis-file-locationto the path ofgenesis.blob.p2p-config.seed-peersfor testnet or mainnet. The docs list the current seed peers.rpc.enable-indexing: trueif you need list-style queries, such as objects owned by an address.
To build from source instead, check out the branch for your network (mainnet, testnet or devnet) and run cargo run --release --bin sui-node -- --config-path fullnode.yaml. Run the node under systemd in production, and update it whenever the network upgrades. A binary that doesn't support the network's current protocol version can't keep up with the chain.
Start from a snapshot
Syncing from genesis takes a very long time and needs a lot of disk. Restore a snapshot instead:
sui-tool download-formal-snapshot --latest \
--genesis ./genesis.blob --network mainnet \
--path /data/sui-fullnode --num-parallel-downloads 50 --no-sign-requestFormal snapshots contain only the live object set at an epoch boundary, so they're small and verified against the committee. They have no indexes, though. If your node serves historical queries, restore a RocksDB snapshot instead. The snapshots page lists the buckets.
Pruning
The template already has an authority-store-pruning-config section, and it keeps only 1 epoch of object history (num-epochs-to-retain: 1). The docs' example uses a 14-epoch window:
authority-store-pruning-config:
num-epochs-to-retain: 14
num-epochs-to-retain-for-checkpoints: 14Requests for data older than the window return NOT_FOUND. If you need full history, raise the window or use an archival service.
Do you actually need one?
Most apps don't. Public endpoints and commercial RPC providers cover development and moderate traffic (see Sui RPC URLs). Run your own node when you need guaranteed throughput or no rate limits, or when you're building a custom indexer that reads checkpoints. New clients should talk to the node over gRPC or GraphQL. JSON-RPC is deprecated. A full node doesn't take part in consensus. That's a validator's job.
Sources
- Run a Sui full node, Sui documentation
- Sui snapshots, Sui documentation
- fullnode-template.yaml, MystenLabs/sui
- sui-genesis, MystenLabs