1. Generate configs and genesis
All deployment configs and the genesis file are produced by thesetup binary
(node/validator/src/setup.rs). It has two modes under generate:
- Local (dev)
- Remote (AWS)
--output):
| File | Purpose |
|---|---|
genesis.json | Genesis state — accounts, total_supply, chain_id, network, pre-registered relay nodes |
<pubkey>.yaml | One validator config per peer (consensus key + share, ports, directory) |
peers.yaml | Peer address map (P2P) |
<address>.yaml | secp256k1 user keypairs for CLI use |
config.yaml (remote only) | AWS deployer config — instances, regions, monitoring |
dashboard.json (remote only) | Grafana dashboard, copied from --dashboard |
remote adds the AWS-specific flags (--regions, --instance-type,
--storage-size, --monitoring-instance-type, --monitoring-storage-size,
--dashboard, and the optional --indexer-url / --indexer-count pair). EBS
volumes use storage class gp3.
2. Validator configuration
Each<pubkey>.yaml is the validator’s runtime config. The fields that matter
for a deployment (full list in the Configuration reference):
| Field | Notes |
|---|---|
private_key, share, polynomial | Consensus signing key + BLS threshold material — secrets, back them up (see Snapshots & Restore) |
port | P2P consensus port |
rpc_port | HTTP RPC port; omit to disable RPC on this validator |
metrics_port | Prometheus /metrics port |
directory | State / QMDB storage root — the bulk of what you back up |
genesis_config_path | Path to genesis.json (relative paths resolve against the config file’s directory) |
allowed_peers, bootstrappers | Ed25519 peer public keys; bootstrappers are the initial-contact subset |
enable_faucet | Default false. Only honored on chain_id 1 (local) or 100 (dev); keep false on any real network |
chain_id, network | Replay-protection + delegation-cert domain separation; inherited from genesis.json if omitted |
indexer | Optional indexer URL the validator pushes seeds / notarizations / finalizations to |
chain_id and network are read from genesis.json at startup when not set in
the YAML, so the genesis file is the single source of truth for network identity.
3. Container image
CI publishes a validator image toghcr.io/cowboyinc/validator tagged with the
branch, sha-<hash>, and the release version. Run it with the generated YAML +
genesis mounted, exposing the P2P, RPC, and metrics ports. For a from-source
run instead, build the release binaries (cargo build --release, producing
validator, setup, indexer, cowboy, cowboy-ras-write-relayer).
4. Deploy pipeline
The reference deploy flow lives innode/.github/workflows/pipeline.yml and
promote.yml:
- CI gates —
fmt→lint→ shardedtest(+ a PVM simulation suite and a release-build assertion). - Build Binaries —
cargo build --release, artifacts uploaded to S3. - Package image — Docker image pushed to
ghcr.io/cowboyinc/validator. - Deploy Dev — on
main, an SSM command rolls the new binary onto the dev validator. - Promote (
promote.yml) — astg-v*/prd-v*tag resolves the dev-built binary and does a rolling SSM deploy in a safe order: non-bootstrapper validators → the bootstrapper (validator-01) → RPC nodes, each node stopping its services, downloading the binary, and restarting before the next.
5. Post-deploy verification
After a node starts, confirm health (see Incident Response):block_height on /health/detailed climb toward the network tip.
