Rename to NecroHash, add remote, enhance dashboard for multi-device stats
Some checks failed
Docker Build & Push / build-and-push (push) Failing after 6s

This commit is contained in:
Gemini Bot
2026-01-20 10:51:13 +00:00
parent ef7dcecea2
commit 65408e4668
6 changed files with 40 additions and 60 deletions

View File

@@ -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
- **Dashboard:** Echtzeit-Überwachung von Hashrate, Hardware-Fehlern, Shares und Temperaturen.
- **Visualisierung:** Live-Graph der Hashrate und übersichtliche Status-Karten.
- **Steuerung:** Neustart des Miners und Anpassung der Konfiguration über das Web-Interface.
- **Modern UI:** Responsive Dark-Mode Design basierend auf Bootstrap 5.
- **Leichtgewichtig:** Optimiert für Raspberry Pi 1 (Python Flask Backend, kein Docker notwendig).
## Voraussetzungen
- Raspberry Pi (ab Version 1)
- Python 3.7+
- Installierter `cgminer` mit Gridseed-Support (muss separat installiert werden, z.B. dmaxl's fork).
- **Multi-Device Support:** Erkennt und überwacht automatisch alle angeschlossenen Gridseed-Einheiten.
- **Echtzeit-Dashboard:**
- Aggregierte Hashrate (MH/s)
- Hardware-Fehler & Shares
- Temperatur-Überwachung pro Gerät
- Interaktiver Verlaufsgraph
- **Steuerung:**
- Pool-Konfiguration (URL, Worker, Passwort)
- Frequenz-Einstellung (Global für alle Units)
- Restart-Funktion
- **Tech Stack:** Python Flask, Bootstrap 5 (Dark Mode), Vanilla JS.
## Installation
1. Repository klonen:
```bash
git clone <URL_ZUM_REPO> /opt/gridseed-gui
cd /opt/gridseed-gui
git clone https://git.klenzel.net/admin/NecroHash.git /opt/necrohash
cd /opt/necrohash
```
2. Abhängigkeiten installieren & Starten:
Das `start_gui.sh` Skript kümmert sich um das Python Virtual Environment.
2. Starten:
```bash
./start_gui.sh
```
3. Zugriff:
Öffnen Sie im Browser `http://<IP-DES-PI>:5000`
3. Browser öffnen: `http://<IP>:5000`
## Konfiguration
### cgminer Setup
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.
NecroHash nutzt den `cgminer` API-Server. Starten Sie `cgminer` mit der Konfiguration im Projektordner:
Starten Sie Ihren Miner idealerweise so:
```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
MIT

2
app.py
View File

@@ -5,7 +5,7 @@ import os
import subprocess
app = Flask(__name__)
app.secret_key = 'gridseed_miner_control_secret'
app.secret_key = 'necrohash_miner_control_secret'
miner_api = CgminerAPI()
config_mgr = ConfigManager()

View File

@@ -13,7 +13,7 @@ else
source venv/bin/activate
fi
echo "Starting Gridseed WebGUI..."
echo "Starting NecroHash WebGUI..."
# Run with gunicorn for production or python directly for dev.
# Using python for simplicity as requested on Pi 1
python app.py

View File

@@ -62,6 +62,11 @@ document.addEventListener('DOMContentLoaded', function() {
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
let maxTemp = 0;
if (devs && devs.length > 0) {

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<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://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">
@@ -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">
<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>
<span class="fs-4 d-none d-sm-inline">GridseedPi</span>
<span class="fs-4 d-none d-sm-inline">NecroHash</span>
</a>
<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">

View File

@@ -10,7 +10,16 @@
<!-- Top Stats Cards -->
<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-header">Hashrate (5s)</div>
<div class="card-body">
@@ -37,7 +46,7 @@
</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-header">Max Temp</div>
<div class="card-body">