Setelah INSTALASI.md selesai (build OK, preflight PASS, node orchestrator.js jalan dan [CONFIRMED] muncul minimal sekali), dokumen ini cara jalanin 24/7, monitoring, dan troubleshoot.
- Mode running
- Run sebagai systemd service (recommended)
- Run via nohup + watchdog cron (alternatif)
- Monitoring
- Stop & restart
- Auto-withdraw HASH ke wallet utama
- Estimasi performa
- Troubleshooting
3 cara run miner di VPS:
| Mode | Pros | Cons | Kapan dipakai |
|---|---|---|---|
Foreground (node orchestrator.js) |
Lihat log live, gampang debug | Mati kalau SSH disconnect | Test awal, debugging |
| systemd service | Auto-start on boot, auto-restart on crash, log managed | Setup awal lebih ribet | Production |
| nohup + cron watchdog | Setup simpel | Auto-restart manual via cron | Quick deploy, hosting tanpa systemd |
sudo nano /etc/systemd/system/hash256-miner.serviceIsi:
[Unit]
Description=hash256.org CPU miner orchestrator
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=/home/YOUR_USER/hash256-miner-c/orchestrator
ExecStart=/usr/bin/node orchestrator.js
StandardOutput=append:/home/YOUR_USER/hash256-miner-c/orchestrator/miner.log
StandardError=append:/home/YOUR_USER/hash256-miner-c/orchestrator/miner.log
Restart=always
RestartSec=10
# Hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/home/YOUR_USER/hash256-miner-c/orchestrator
ProtectHome=read-only
[Install]
WantedBy=multi-user.targetGanti YOUR_USER dengan username VPS kamu (cek whoami).
sudo systemctl daemon-reload
sudo systemctl enable hash256-miner
sudo systemctl start hash256-minersudo systemctl status hash256-minerOutput:
● hash256-miner.service - hash256.org CPU miner orchestrator
Loaded: loaded (/etc/systemd/system/hash256-miner.service; enabled)
Active: active (running) since Mon 2026-05-12 15:00:00 UTC; 2min ago
Main PID: 12345 (node)
Tasks: 8 (limit: 4690)
Memory: 65.4M
CPU: 1min 47s
CGroup: /system.slice/hash256-miner.service
├─12345 /usr/bin/node orchestrator.js
└─12356 /home/user/hash256-miner-c/bin/miner ...
sudo journalctl -u hash256-miner -f
# atau:
tail -f ~/hash256-miner-c/orchestrator/miner.logBikin file kedua hash256-monitor.service:
sudo nano /etc/systemd/system/hash256-monitor.service[Unit]
Description=hash256-miner-c web monitor dashboard
After=network-online.target hash256-miner.service
[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=/home/YOUR_USER/hash256-miner-c/monitor
ExecStart=/usr/bin/node server.js
StandardOutput=append:/home/YOUR_USER/hash256-miner-c/monitor/monitor.log
StandardError=append:/home/YOUR_USER/hash256-miner-c/monitor/monitor.log
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable hash256-monitor
sudo systemctl start hash256-monitor
sudo systemctl status hash256-monitorKalau VPS tidak ada systemd (rare, tapi ada di container minimal), pakai script restart.sh + watchdog.sh:
cd ~/hash256-miner-c
./restart.shrestart.sh akan:
- Kill orchestrator + monitor + miner subprocess yang lama
- Start monitor di background (port 7878), output ke
monitor/monitor.log - Start orchestrator di background, output ke
orchestrator/miner.log - Tampilkan PID + HTTP health check
watchdog.sh cek tiap 5 menit apakah orchestrator + monitor masih jalan, kalau salah satu mati → call restart.sh.
crontab -eTambah baris:
# Hash256 watchdog: cek tiap 5 menit
*/5 * * * * /home/YOUR_USER/hash256-miner-c/watchdog.shVerify:
crontab -l | grep hash256
# */5 * * * * /home/.../hash256-miner-c/watchdog.shCek log watchdog:
tail -f ~/hash256-miner-c/watchdog.log~/hash256-miner-c/monitor-check.shOutput:
==============================================
MONITOR CHECK 2026-05-12T15:30:00+00:00
==============================================
[PROCESSES]
orchestrator: PID 12345, up 45:32
monitor: PID 12346, up 45:31
miner bin: PID 18934, up 02:14
[HASHRATE]
last: 451.32 MH/s
avg(30): 447.89 MH/s
min/max: 38.42 / 462.18 MH/s
[STATS]
uptime: 2732s
eth balance: 0.004879 ETH
hash balance: 200.00 HASH
attempts: 2
successes: 2
reverts: 0
skipped: 0
epoch: 15
blocks left: 31
stats age: 8s (ok if <30s)
[RECENT EVENTS]
[2026-05-12T15:11:30Z] [orchestrator] miner FOUND nonce=12345...
[2026-05-12T15:11:31Z] [orchestrator] preflight OK, submitting mine(...)
[2026-05-12T15:11:43Z] [orchestrator] CONFIRMED block=25069405...
[ERRORS / WARNINGS LAST 500 LINES]
error/warning count: 0
==============================================
Run kapan saja untuk health check.
Kalau monitor jalan, buka:
# Akses dari laptop via SSH tunnel:
ssh -L 7878:127.0.0.1:7878 user@your-vps-host
# Lalu di browser laptop: http://localhost:7878Dashboard menampilkan:
- Hashrate live (line chart, last 60 samples)
- Wallet ETH + HASH balance
- Mining state (era, reward, difficulty, epoch)
- Recent events (FOUND / CONFIRMED / REVERT / SKIP)
- Last 200 log lines
| Endpoint | Isi |
|---|---|
GET /api/health |
Uptime + status check |
GET /api/stats |
Snapshot dari orchestrator/stats.json (live) |
GET /api/log?lines=200 |
Last N lines miner.log (plaintext) |
GET /api/network |
Live contract state (cache 15s) |
Contoh:
curl http://127.0.0.1:7878/api/stats | jq '.attempts, .successes, .ethBalance'
# 2
# 2
# "4879000000000000"
curl http://127.0.0.1:7878/api/network | jq '.epoch, .epochBlocksLeft'Bikin script ~/hash256-miner-c/alert.sh:
#!/bin/bash
# Pakai monitor-check.sh, kirim alert kalau ada ANOMALY
OUTPUT=$(~/hash256-miner-c/monitor-check.sh)
if echo "$OUTPUT" | grep -q "ANOMALY\|NOT RUNNING"; then
# Bisa ganti dengan curl ke Telegram bot, Discord webhook, atau email
echo "$OUTPUT" | mail -s "[hash256] anomaly" your-email@example.com
fiCron tiap 30 menit:
*/30 * * * * /home/YOUR_USER/hash256-miner-c/alert.sh# Systemd:
sudo systemctl restart hash256-miner
# Atau via script:
~/hash256-miner-c/restart.shsudo systemctl stop hash256-miner
sudo systemctl stop hash256-monitor~/hash256-miner-c/stop.shScript ini:
- Hapus crontab entry yang match
hash256-miner-c - Kill orchestrator, monitor, miner processes
- Verify mati dengan
/proc/*/cwdcheck - Force-kill kalau perlu
Kalau pakai systemd, tambahin manual:
sudo systemctl disable hash256-miner hash256-monitor
sudo systemctl stop hash256-miner hash256-monitorAman — kalau pakai WantedBy=multi-user.target di systemd unit, akan auto-start setelah reboot.
Saat ini orchestrator tidak ada feature auto-transfer HASH ke wallet lain. Tapi gampang ditambah dengan small script Node.js:
cd ~/hash256-miner-c/orchestrator
node -e "
require('dotenv').config();
const { ethers } = require('ethers');
const RPC_URL = process.env.RPC_URL;
const PK = process.env.PRIVATE_KEY;
const TO = '0xYOUR_MAIN_WALLET_ADDRESS';
const HASH_CONTRACT = '0xAC7b5d06fa1e77D08aea40d46cB7C5923A87A0cc';
const ABI = [
'function balanceOf(address) view returns (uint256)',
'function transfer(address to, uint256 amount) returns (bool)',
];
(async () => {
const provider = new ethers.JsonRpcProvider(RPC_URL);
const wallet = new ethers.Wallet(PK, provider);
const c = new ethers.Contract(HASH_CONTRACT, ABI, wallet);
const bal = await c.balanceOf(wallet.address);
console.log('HASH balance:', ethers.formatUnits(bal, 18));
if (bal === 0n) { console.log('Nothing to withdraw'); process.exit(0); }
const keepBuffer = 10n * 10n**18n; // keep 10 HASH for safety
const send = bal - keepBuffer;
if (send <= 0n) { console.log('Below keep buffer'); process.exit(0); }
const tx = await c.transfer(TO, send);
console.log('tx:', tx.hash);
const r = await tx.wait();
console.log('CONFIRMED in block', r.blockNumber);
})();
"Bisa di-cron weekly:
0 3 * * 0 cd /home/YOUR_USER/hash256-miner-c/orchestrator && node /path/to/withdraw.js >> withdraw.log 2>&1Tapi sekali lagi, wallet mining = hot wallet. Kalau private key bocor, semua HASH yang masih di sana hilang. Withdraw rutin = kurangi exposure.
solusi/jam = (hashrate_aggregate / hashes_per_solution) × 3600
| Hashrate | Difficulty (~2.75e11 hashes/sol) | Solusi/jam | Solusi/hari |
|---|---|---|---|
| 100 MH/s | 2.75e11 | 1.31 | 31.4 |
| 200 MH/s | 2.75e11 | 2.62 | 62.8 |
| 300 MH/s | 2.75e11 | 3.93 | 94.3 |
| 400 MH/s | 2.75e11 | 5.24 | 125.7 |
| 500 MH/s | 2.75e11 | 6.55 | 157.1 |
| 600 MH/s | 2.75e11 | 7.85 | 188.4 |
Reward per hari (Era 1, 100 HASH per solusi):
| Hashrate | HASH/hari |
|---|---|
| 200 MH/s | 6,280 HASH |
| 400 MH/s | 12,570 HASH |
| 600 MH/s | 18,840 HASH |
Ini solo mining → high variance. Standard deviation per solusi ~equal ke mean. Jadi:
- Avg time to solve di 400 MH/s: 11 menit
- P(< 5 min): ~36%
- P(< 11 min): ~63% (median)
- P(< 30 min): ~93%
- P(< 60 min): ~99.5%
Jadi normal kalau kadang nemu solusi cepat, kadang stuck 30 menit. Long-run: avg 11 menit per solusi → 130 solusi/hari.
Mining 24/7 di 4-vCPU push CPU ke 100% load terus. Cek thermal:
# VPS shared (paling banyak case): tidak bisa cek temp, vCPU mapped
# Dedicated CPU plan / bare metal: pakai sensors
sudo apt install lm-sensors -y
sudo sensors-detect --auto
sensors
# Cek "Tdie" atau "Tctl" (AMD) / "Core 0" (Intel)
# Sustained > 90°C = thermal throttling, hashrate akan turunVPS provider biasanya provision dengan good cooling, jarang issue.
# Cek error
tail -100 ~/hash256-miner-c/orchestrator/miner.log | grep -E '\[error\]|FATAL'
# Atau journalctl:
sudo journalctl -u hash256-miner -n 100Common errors:
| Error | Cause | Fix |
|---|---|---|
Cannot read properties of undefined (reading 'wait') |
RPC return null tx | Ganti RPC, retry akan auto-jalan |
RPC failed: timeout |
RPC down sementara | Tambah failover RPC ke .env (atau pakai RPC_URL lain) |
nonce too low |
Race condition dua submit dari wallet sama | Jangan run > 1 instance per wallet |
insufficient funds for gas |
ETH habis | Top-up wallet |
replacement transaction underpriced |
RPC timeout, retry pakai gas sama | Naikin PRIORITY_FEE_GWEI di .env |
Berarti hash valid waktu submit, tapi sampai miner di-include di blok, challenge sudah rotasi. Pre-flight check biasanya catch ini, tapi race ada:
- Cek
epochBlocksLeftsaat solve. Kalau < 5 = high risk. MAX_GAS_PRICE_GWEIterlalu rendah → tx duduk lama di mempool, sementara epoch geser. Pertimbangkan naikinPRIORITY_FEE_GWEIjadi 1.0 supaya land cepat.- Cek
revertedBlockdi Etherscan, bacarevert reasondi trace tab.
Kemungkinan:
- VPS shared CPU steal time tinggi — cek
mpstatatauvmstat 1lihat%steal. Kalau > 5% sustained = pindah ke dedicated CPU plan. - Other process compete — cek
top/htop, kill process lain yang heavy. - Thermal throttling (jarang di VPS) — cek
sensors.
# Cek monitor jalan
sudo systemctl status hash256-monitor
# atau
pgrep -af 'node server.js'
# Cek stats file aktif
ls -la ~/hash256-miner-c/orchestrator/stats.json
# mtime harus < 30 detik dari sekarang
# Restart monitor:
sudo systemctl restart hash256-monitormake clean
makeKadang object files lama cached, full rebuild fix it.
Kemungkinan banyak revert atau skipped (high gas, race). Cek stats:
curl http://127.0.0.1:7878/api/stats | jq '.attempts, .successes, .reverts, .skipped'Kalau reverts > successes:
- Naikin
PRIORITY_FEE_GWEI - Atau turunin
MAX_GAS_PRICE_GWEI(skip lebih agresif, save ETH)
stop.sh bug kalau ada process yang ganti cwd. Force kill manual:
sudo killall -9 node
sudo killall -9 miner # atau "bin/miner"Sebelum tinggal, pastikan:
- systemd service
hash256-miner.serviceenabled + active - systemd service
hash256-monitor.serviceenabled + active (kalau pakai dashboard) - Watchdog cron
*/5aktif (kalau tidak pakai systemd) -
node preflight.jsPASS semua - ETH balance ≥ 0.001 ETH (~10 tx budget)
- Reboot VPS sekali untuk verify auto-start
-
monitor-check.shtidak adaANOMALY - Sudah catat 24-jam HASH balance, expected ~5,000-15,000 HASH
- Backup
.envdi password manager (kalau VPS hilang, baru bisa recover dari PK)
🎉 Selamat mining!