Hardware picks, three install paths, every env var explained, monitoring, troubleshooting. Fifteen minutes end-to-end on a fresh VPS.
| Option | Cost | Expected tier | Caveats |
|---|---|---|---|
| Raspberry Pi 5 (8 GB) | ~$80 one-time | T1 | Residential bandwidth fine. Keep it on a UPS. |
| Home NAS / mini-PC | 0 if you own one | T1–T2 | Dual-boot friendly. Watch for NAT issues (port-forward 8545). |
| $5 VPS (Hetzner, Vultr, DO) | $5/mo | T1–T2 | Best uptime-for-price ratio. Default pick for most operators. |
| Dedicated / bare-metal | $50–$200/mo | T3–T4 | Pair with paid Alchemy/Infura keys. Target 99.5%+ uptime bonus. |
curl -fsSL https://metercall.ai/install-node.sh | sudo bash
Runs as root. Installs Node 20, clones the repo to /opt/metercall-node, creates a metercall system user, writes a systemd unit, and prompts for your stake address + region.
docker run -d \
--name metercall-node \
--restart unless-stopped \
-p 8545:8545 \
-e STAKE_ADDRESS=0xYourAddress \
-e NODE_KEY=$(openssl rand -hex 32) \
-e REGION=us-east \
-e UPSTREAM_RPCS='{"ethereum":"https://rpc.ankr.com/eth","polygon":"https://rpc.ankr.com/polygon"}' \
metercall/node:0.1.0
Or use the docker-compose.yml in /node/ — just fill out a .env file and docker compose up -d.
git clone https://github.com/patl4588/metercall-site.git cd metercall-site/node export STAKE_ADDRESS=0xYourAddress export NODE_KEY=$(openssl rand -hex 32) export REGION=us-east node index.js
Node 18+ required. No npm install needed — the runtime has zero dependencies.
| Variable | Default | Purpose |
|---|---|---|
| NODE_KEY | random | 32-byte hex HMAC secret for receipt signing. Treat as private. 0.2.0 upgrades to secp256k1. |
| STAKE_ADDRESS | (required) | Ethereum address holding your staked PCP. Rewards credited here. |
| COORDINATOR_URL | https://metercall.ai | Coordinator base URL. Only change for testnet. |
| UPSTREAM_RPCS | {} | JSON map chain_id → rpc_url. See config-home.js and config-pro.js. |
| PORT | 8545 | HTTP listen port. |
| REGION | unknown | Region label. Used for geo-routing and the map on /nodes.html. |
| NODE_NAME | metercall-node | Friendly handle shown in the public registry. |
| HEARTBEAT_MS | 60000 | Heartbeat interval (ms). Minimum 10000. |
| EPOCH_MS | 86400000 | Epoch length (24h). Don't change unless running a local testnet. |
curl http://localhost:8545/healthGET /api/node/my-stats?id=<node_id>GET /api/node/rewards/pending?address=0x…journalctl -u metercall-node -f (JSON lines, one per event)docker logs -f metercall-nodecurl https://metercall.ai/api/node/heartbeat is reachable; your firewall may block outbound. Open port 443 outbound.upstream_error. Your public RPC is rate-limiting. Switch to paid (Alchemy/Infura) or rotate multiple public RPCs per chain.STAKE_ADDRESS is set and matches the address that staked in NodeStaking.sol. Receipts from unstaked addresses are dropped silently.status=200/CHDIR. The installer sets WorkingDirectory=/opt/metercall-node/node. Verify the repo was cloned correctly.PORT=8546 in /etc/metercall/node.env and restart.SlashExecuted event — it includes a reason string. 99% of cases are a rate-limited upstream returning bogus data, not operator malice.wget; if busybox wget is missing --spider, rebuild against node:20-alpine fresh. Known fixed in 0.1.0.HEARTBEAT_MS=120000 to halve it. Don't go above 5 minutes or you'll get flagged as offline.git -C /opt/metercall-node pull && systemctl restart metercall-node.NodeRegistry event.