Real-time monitoring dashboard for Arkiv Web3 database network.
- Service Monitoring: Portal, HTTP RPC, WebSocket RPC, Faucet, Bridge, Block Explorer
- RPC Performance Tests: Write small (<1KB), write large (~100KB), read operations
- Historical Data: SQLite database for storing metrics history
- Multi-testnet Support: Parameterized for mendoza, rosario, and other testnets
- Modern Dark UI: Built with Next.js, Tailwind CSS, shadcn/ui, and Recharts
- Real-time Updates: Automatic refresh with SWR
- Clickable Service Cards: Direct links to monitored services
- Node.js 22+
- npm
npm installCopy the example environment file and configure:
cp .env.example .envEdit .env with your settings:
# Wallet for RPC tests
MONITOR_WALLET_ADDRESS=0xYourWalletAddress
MONITOR_PRIVATE_KEY=0xYourPrivateKey
# Database
DATABASE_PATH=./data/arkmon.db
# Monitoring
MONITOR_INTERVAL_MS=60000
ENABLED_TESTNETS=mendozaRun the dashboard and monitoring worker together:
npm run dev:allOr run them separately:
# Dashboard only
npm run dev
# Worker only (in another terminal)
npm run workerOpen http://localhost:3000 to view the dashboard.
npm run build
npm run startdocker compose up -dSet these in your deployment platform (Coolify, Dokploy, etc.):
MONITOR_WALLET_ADDRESS- Wallet address for RPC testsMONITOR_PRIVATE_KEY- Private key for signing transactionsENABLED_TESTNETS- Comma-separated list of testnets (default: mendoza)MONITOR_INTERVAL_MS- Monitoring interval in ms (default: 60000)
The SQLite database is stored in /app/data. To persist data:
Docker Compose (already configured):
volumes:
- arkmon_data:/app/dataCoolify: Use "Volume Mount" with:
- Volume Name:
arkmon-data - Mount Path:
/app/data
┌─────────────────────────────────────────────────────────────┐
│ Next.js App │
├─────────────────────────────────────────────────────────────┤
│ Frontend (React) │ API Routes │
│ ├── Dashboard page │ ├── GET /api/metrics │
│ ├── Service cards │ ├── GET /api/services │
│ ├── Charts (Recharts) │ ├── GET /api/rpc-tests │
│ └── Real-time updates │ └── GET /api/testnets │
├─────────────────────────────────────────────────────────────┤
│ Background Worker │
│ ├── Runs at configurable interval │
│ ├── Tests all services (Portal, RPC, WS, Faucet, etc.) │
│ ├── Writes metrics to SQLite │
│ └── Logs results │
├─────────────────────────────────────────────────────────────┤
│ SQLite Database │
│ ├── metrics (timestamp, testnet, service, latency, status) │
│ └── rpc_tests (timestamp, testnet, operation, duration) │
└─────────────────────────────────────────────────────────────┘
| Service | Description |
|---|---|
| Portal | Main network portal page |
| HTTP RPC | JSON-RPC endpoint |
| WebSocket RPC | WebSocket endpoint |
| Faucet | Test token faucet |
| Bridge | Cross-chain bridge |
| Block Explorer | Blockchain explorer |
GET /api/testnets- List of available testnetsGET /api/services?testnet=mendoza- Current service statusGET /api/metrics?testnet=mendoza&hours=24- Historical metricsGET /api/rpc-tests?testnet=mendoza&hours=24- RPC test history
Edit src/config/testnets.ts:
export const TESTNETS = {
mendoza: {
id: "mendoza",
name: "Mendoza Testnet",
chainId: 60138453056,
rpcUrl: "https://mendoza.hoodi.arkiv.network/rpc",
wsUrl: "wss://mendoza.hoodi.arkiv.network/rpc/ws",
portalUrl: "https://mendoza.hoodi.arkiv.network",
faucetUrl: "https://mendoza.hoodi.arkiv.network/faucet/",
bridgeUrl: "https://mendoza.hoodi.arkiv.network/bridgette/",
explorerUrl: "https://explorer.mendoza.hoodi.arkiv.network",
},
// Add new testnet here
};Then update ENABLED_TESTNETS in your .env file.
- Framework: Next.js 15 (App Router)
- UI: Tailwind CSS + shadcn/ui
- Charts: Recharts
- Database: SQLite + Drizzle ORM
- Real-time: SWR
- Deployment: Docker
MIT