Rename to NecroHash, add remote, enhance dashboard for multi-device stats
Some checks failed
Docker Build & Push / build-and-push (push) Failing after 6s
Some checks failed
Docker Build & Push / build-and-push (push) Failing after 6s
This commit is contained in:
74
README.md
74
README.md
@@ -1,77 +1,43 @@
|
|||||||
# Gridseed WebGUI
|
# NecroHash
|
||||||
|
|
||||||
Ein modernes Web-Interface für den Betrieb von Gridseed ASIC Minern am Raspberry Pi 1 (oder neuer). Inspiriert von Klassikern wie MinePeon und Scripta, aber mit moderner Technologie und Optik.
|
**NecroHash** ist eine moderne, leichtgewichtige Web-Oberfläche zur Steuerung und Überwachung von Gridseed ASIC Minern. Entwickelt für den Raspberry Pi (ab Gen 1), verbindet es den Retro-Charme alter Mining-Hardware mit moderner Web-Technologie.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Dashboard:** Echtzeit-Überwachung von Hashrate, Hardware-Fehlern, Shares und Temperaturen.
|
- **Multi-Device Support:** Erkennt und überwacht automatisch alle angeschlossenen Gridseed-Einheiten.
|
||||||
- **Visualisierung:** Live-Graph der Hashrate und übersichtliche Status-Karten.
|
- **Echtzeit-Dashboard:**
|
||||||
- **Steuerung:** Neustart des Miners und Anpassung der Konfiguration über das Web-Interface.
|
- Aggregierte Hashrate (MH/s)
|
||||||
- **Modern UI:** Responsive Dark-Mode Design basierend auf Bootstrap 5.
|
- Hardware-Fehler & Shares
|
||||||
- **Leichtgewichtig:** Optimiert für Raspberry Pi 1 (Python Flask Backend, kein Docker notwendig).
|
- Temperatur-Überwachung pro Gerät
|
||||||
|
- Interaktiver Verlaufsgraph
|
||||||
## Voraussetzungen
|
- **Steuerung:**
|
||||||
|
- Pool-Konfiguration (URL, Worker, Passwort)
|
||||||
- Raspberry Pi (ab Version 1)
|
- Frequenz-Einstellung (Global für alle Units)
|
||||||
- Python 3.7+
|
- Restart-Funktion
|
||||||
- Installierter `cgminer` mit Gridseed-Support (muss separat installiert werden, z.B. dmaxl's fork).
|
- **Tech Stack:** Python Flask, Bootstrap 5 (Dark Mode), Vanilla JS.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. Repository klonen:
|
1. Repository klonen:
|
||||||
```bash
|
```bash
|
||||||
git clone <URL_ZUM_REPO> /opt/gridseed-gui
|
git clone https://git.klenzel.net/admin/NecroHash.git /opt/necrohash
|
||||||
cd /opt/gridseed-gui
|
cd /opt/necrohash
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Abhängigkeiten installieren & Starten:
|
2. Starten:
|
||||||
Das `start_gui.sh` Skript kümmert sich um das Python Virtual Environment.
|
|
||||||
```bash
|
```bash
|
||||||
./start_gui.sh
|
./start_gui.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Zugriff:
|
3. Browser öffnen: `http://<IP>:5000`
|
||||||
Öffnen Sie im Browser `http://<IP-DES-PI>:5000`
|
|
||||||
|
|
||||||
## Konfiguration
|
## Konfiguration
|
||||||
|
|
||||||
### cgminer Setup
|
NecroHash nutzt den `cgminer` API-Server. Starten Sie `cgminer` mit der Konfiguration im Projektordner:
|
||||||
Damit die GUI mit dem Miner kommunizieren kann, muss der `cgminer` mit API-Support gestartet werden.
|
|
||||||
Die GUI erwartet, dass sie die Konfigurationsdatei `cgminer.conf` lesen und schreiben kann.
|
|
||||||
|
|
||||||
Starten Sie Ihren Miner idealerweise so:
|
|
||||||
```bash
|
```bash
|
||||||
cgminer -c /opt/gridseed-gui/cgminer.conf
|
cgminer -c /opt/necrohash/cgminer.conf
|
||||||
```
|
```
|
||||||
|
|
||||||
Stellen Sie sicher, dass in der `cgminer.conf` folgende API-Einstellungen gesetzt sind (passiert automatisch bei Nutzung der Standard-Config):
|
|
||||||
```json
|
|
||||||
"api-listen": true,
|
|
||||||
"api-allow": "W:127.0.0.1"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Autostart
|
|
||||||
Um die GUI beim Booten zu starten, fügen Sie einen Eintrag in die `/etc/rc.local` oder erstellen Sie einen systemd Service.
|
|
||||||
|
|
||||||
**Systemd Beispiel (`/etc/systemd/system/gridseed-gui.service`):**
|
|
||||||
```ini
|
|
||||||
[Unit]
|
|
||||||
Description=Gridseed Web GUI
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=pi
|
|
||||||
WorkingDirectory=/opt/gridseed-gui
|
|
||||||
ExecStart=/opt/gridseed-gui/start_gui.sh
|
|
||||||
Restart=always
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
```
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||
Das Interface bietet eine übersichtliche Seitenleiste und ein Dashboard im Dark-Mode.
|
|
||||||
|
|
||||||
## Lizenz
|
## Lizenz
|
||||||
MIT
|
MIT
|
||||||
2
app.py
2
app.py
@@ -5,7 +5,7 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.secret_key = 'gridseed_miner_control_secret'
|
app.secret_key = 'necrohash_miner_control_secret'
|
||||||
|
|
||||||
miner_api = CgminerAPI()
|
miner_api = CgminerAPI()
|
||||||
config_mgr = ConfigManager()
|
config_mgr = ConfigManager()
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ else
|
|||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Starting Gridseed WebGUI..."
|
echo "Starting NecroHash WebGUI..."
|
||||||
# Run with gunicorn for production or python directly for dev.
|
# Run with gunicorn for production or python directly for dev.
|
||||||
# Using python for simplicity as requested on Pi 1
|
# Using python for simplicity as requested on Pi 1
|
||||||
python app.py
|
python app.py
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
document.getElementById('stat-accepted').innerText = formatNumber(summary['Accepted'] || 0);
|
document.getElementById('stat-accepted').innerText = formatNumber(summary['Accepted'] || 0);
|
||||||
document.getElementById('stat-hw').innerText = formatNumber(summary['Hardware Errors'] || 0);
|
document.getElementById('stat-hw').innerText = formatNumber(summary['Hardware Errors'] || 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update Device Count
|
||||||
|
if (devs) {
|
||||||
|
document.getElementById('stat-devices').innerText = devs.length;
|
||||||
|
}
|
||||||
|
|
||||||
// Update Max Temp
|
// Update Max Temp
|
||||||
let maxTemp = 0;
|
let maxTemp = 0;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Gridseed Control</title>
|
<title>NecroHash</title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||||
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
|
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<div class="d-flex flex-column align-items-center align-items-sm-start px-3 pt-3 text-white min-vh-100">
|
<div class="d-flex flex-column align-items-center align-items-sm-start px-3 pt-3 text-white min-vh-100">
|
||||||
<a href="/" class="d-flex align-items-center pb-3 mb-md-0 me-md-auto text-white text-decoration-none">
|
<a href="/" class="d-flex align-items-center pb-3 mb-md-0 me-md-auto text-white text-decoration-none">
|
||||||
<i class="fa-solid fa-microchip fa-2x me-2"></i>
|
<i class="fa-solid fa-microchip fa-2x me-2"></i>
|
||||||
<span class="fs-4 d-none d-sm-inline">GridseedPi</span>
|
<span class="fs-4 d-none d-sm-inline">NecroHash</span>
|
||||||
</a>
|
</a>
|
||||||
<ul class="nav nav-pills flex-column mb-sm-auto mb-0 align-items-center align-items-sm-start w-100" id="menu">
|
<ul class="nav nav-pills flex-column mb-sm-auto mb-0 align-items-center align-items-sm-start w-100" id="menu">
|
||||||
<li class="nav-item w-100">
|
<li class="nav-item w-100">
|
||||||
|
|||||||
@@ -10,7 +10,16 @@
|
|||||||
|
|
||||||
<!-- Top Stats Cards -->
|
<!-- Top Stats Cards -->
|
||||||
<div class="row mb-4 g-3">
|
<div class="row mb-4 g-3">
|
||||||
<div class="col-md-3">
|
<div class="col-md-2">
|
||||||
|
<div class="card bg-dark border-secondary h-100">
|
||||||
|
<div class="card-header border-secondary">Devices</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title display-6 fw-bold text-white" id="stat-devices">0</h2>
|
||||||
|
<p class="card-text text-muted">Active</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
<div class="card text-bg-primary h-100">
|
<div class="card text-bg-primary h-100">
|
||||||
<div class="card-header">Hashrate (5s)</div>
|
<div class="card-header">Hashrate (5s)</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -37,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-2">
|
||||||
<div class="card text-bg-warning h-100 text-dark">
|
<div class="card text-bg-warning h-100 text-dark">
|
||||||
<div class="card-header">Max Temp</div>
|
<div class="card-header">Max Temp</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|||||||
Reference in New Issue
Block a user