---
name: setup-miner
description: Set up and verify a FLOP GPU inference miner or GPU provider host with the tracked worker and calibration flow. Use for operator requests to bring a miner online; not for validator nodes or GPU market research alone.
---

# Set up a FLOP miner

Start with the [public miner manual](../../../knowledge/public/how-it-works/run-miner.md), [GPU provider manual](../../../knowledge/public/how-it-works/run-gpu-provider.md), and [miner onboarding](../../../docs/onboarding/miner.md). The current devnet-ts deployment is `infra/devnet/devnet-ts/miners/{README.md,miner.env.example,docker-compose.miner.yml,docker-compose.backend.yml}`; read these exact files before changing a host. `infra/vultr/deploy-miner.sh` is a legacy chain-node script whose success message says only "attempted"; do not use it as proof of a GPU inference miner.

## One-pass workflow

1. Establish network, GPU VM, model, RPC, endpoint exposure, assurance tier, and existing account/worker state. Gather missing **non-secret** inputs together: SSH host/user, verified chain/genesis and RPC, pinned worker/backend images, pre-registered model hash and checkpoint revision, tailnet/DA/gateway addresses, and funding source. Private URLs may be supplied by the operator, but check chain identity and reachability before use. Do not replace an unknown production value with a devnet or `latest` placeholder. SOFT is the current development path; the HARD transport/quote bridge is not deployable from this repository.
2. Inspect `nvidia-smi`, Docker GPU access, disk, memory, network, model weight access, and existing containers. Keep credentials and a **distinct non-validator miner signer** in host-local mode-restricted files or an approved secrets store; never ask for them in chat or print them. Choose exactly one inference backend. Use a GPU VM with both worker and measured TOPLOC backend from the layered devnet-ts compose files. The RunPod pod script cannot pass the registered modelpack hash/checkpoint and its backend URL is unauthenticated (#1398); it is not a working current path. A GPU.ai container instance cannot run the needed Docker compose; use a VM if choosing that provider.
3. Deploy only after host/image/model inputs and authorized resource spending are established. Obtain the devnet operator's **already registered** Qwen2.5-0.5B BF16 model, its on-chain measured root, and exact checkpoint revision; remeasure the local checkpoint with modelpack and verify the backend remeasures it again at start. For a new SOFT model, use `flop model onboard --soft` against the measured serving backend; the empty registry TEE list makes no hardware attestation claim. The command requires real TOPLOC capture validation and a modelpack root match before registration; an approved model can then appear in unfiltered model discovery. Do not claim `NvidiaCc` for a SOFT backend. Set both worker and backend to the same `MODEL_HASH` and decode-policy hash. Model approval does not validate TOPLOC capture on the selected GPU: the documented tested combination is Qwen2.5-0.5B, BF16, A40. For another checkpoint, precision, or card, run a measured capture/turn test and report validation pending until it passes. For devnet-ts, arrange authorized genesis-operator funding of minimum self-stake **plus enough available balance for the later capacity top-up and fees**, a core-host Ghost issuer entry for this miner, the tailnet `tag:miner`, DA worker URL, and a gateway allowlist entry with this miner's account, session token, and current enclave key. Refresh the gateway entry after a worker restart because its enclave key changes. `minerStaking.registerMiner` freezes the live minimum self-stake, **not the full balance**; after measured calibration the worker calls `topUpSelfStake` for the difference before cap acceptance. Do not sign, bond, or rent resources beyond the user's authorized scope. Read runtime requirements before funding; the faucet does not cover this path.
4. Verify a real model inference request, then use live chain state to check account balance, miner registration, calibration version/cap/expiry, and finalized height. The supervisor needs independently issued, verified Ghost jobs and the live runtime's block/job thresholds; wait for accepted `hwCalibration` and capacity deposit. Do not use synthetic calibration shortcuts as evidence of real GPU throughput. A running worker, healthy backend, or submitted calibration is not proof of readiness. Check `/session/info` readiness with its required bearer token and a real accepted work/credit path before saying the miner is earning. SOFT settlement/dispute support and off-chain discovery may still block production earning.

Report a compact receipt: network/genesis, host and GPU, pinned deployed ref/images, public miner account, backend/model identity, measured capture result, model inference check, registration transaction and stake, calibration acceptance/cap/expiry, session readiness, accepted work and reward evidence, plus unresolved external gates. State prepared, serving, registered, calibrated, and earning separately. Do not claim a public production network until the release bundle in [#2003](https://github.com/flop-labs/flop-core/issues/2003) is available and verified. If GPU capacity is rented through a provider, read `infra/vultr/gpu_providers/ONBOARDING.md`; account, payment, KYC, quota, wallet funding, and provisioning cost require their own authorization. If this run created an authorized short smoke lease, verify its authorized teardown in the provider console and that billing stopped; preserve pre-existing rentals unless the operator requests their retirement.
