CTmine-client/README.md
Tronax af073e77ec
VNC-Steuerung verbessern: Low-Latency, Maus, Tastatur, Resize
Die Steuerung ist jetzt auf Minecraft (Menü, Chat, Inventar, AFK-Farmen)
optimiert. Für Mouselook/PVP bleibt VNC ungeeignet (Protokollgrenze,
dokumentiert).

x11vnc (serverseitig, entrypoint.sh):
- -threads: parallele I/O-Threads → weniger Eingabe-Lag
- -pointer_mode 4: flüssigere Mausübertragung (Default 1 ist träge)
- -norepeat: verhindert doppelte Tastaturwiederholungen im Spiel
- -nodpms -nofbpm -nowf -nowcr: Energiesparen/Rate-Limiting aus
- Über X11VNC_EXTRA env var frei konfigurierbar

noVNC-Client (VncViewer.vue):
- resize=remote statt scaling: Xvfb folgt Fenstergröße (1:1-Maus-Mapung)
- reconnect=1: auto-Reconnect bei Abbruch
- clipboard=1: Zwischenablage Browser <-> Container
- view_only=0: Eingabe explizit freigeschaltet
- Klick ins Bild setzt Tastaturfokus ins iframe
- Hinweis auf Mausfreigabe (Strg+Alt+Umschalt), Fokus-Button

README: neuer Abschnitt "Steuerung über VNC" mit Grenzerklärung.
.env.example + docker-compose.yml: X11VNC_EXTRA durchgereicht.
2026-08-09 11:09:35 +02:00

245 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ⛏ CTmine-client · ContainerMine Client
Eine Docker-WebApp, die einen **echten Minecraft Java-Client** im Container
laufen lässt und ihn per **noVNC direkt im Browser** anzeigt. Ideal, um einen
Account AFK an eine Farm zu stellen — ohne lokalen Minecraft-Client oder
Java-Installation.
Das Dashboard ist eine **Vite + Vue 3**-Anwendung, die im selben Container
mit ausgeliefert wird.
---
## Architektur
```
Browser ──HTTP/WS──▶ nginx (:8080)
├── / → Vue-Dashboard (statisch)
├── /api/* → Node-Status-API (127.0.0.1:3000)
└── /websockify → websockify (127.0.0.1:6080)
supervisord verwaltet ▼
Xvfb :0 → x11vnc → websockify → Browser
Prism Launcher + echter Minecraft-Client
(rendert per Software-OpenGL/llvmpipe auf Xvfb)
```
**Warum Prism Launcher statt offiziellem Mojang-Launcher?** Der Mojang-Launcher
nutzt für den Microsoft-Login ein eingebettetes Webview, das in einem headlessen
Container regelmäßig Probleme macht. Prism startet denselben Vanilla-Client,
ist aber container-freundlich und nutzt den **Device-Code-Flow** für den Login:
Code notieren → `microsoft.com/link` auf irgendeinem Gerät öffnen → fertig.
---
## Voraussetzungen
- **Docker** (mit BuildKit) und **Docker Compose v2**
- ~2 GB freier Speicher für das Image
- Einen **gültigen Microsoft-Account** mit Minecraft-Lizenz
- Chromium/Firefox (für WebGL & WebSocket in noVNC)
> Lokales Bauen ohne Docker ist nicht vorgesehen. Wenn du nur das Dashboard
> entwickeln willst, siehe [Entwicklung](#dashboard-entwickeln).
---
## Schnellstart
```bash
# 1. Env-Datei erzeugen und anpassen
cp .env.example .env
# PUID/PGID mit `id -u` / `id -g` setzen, damit ./config dir gehört.
# 2. Image bauen und starten
docker compose up -d --build
# 3. Dashboard öffnen
# http://localhost:8080
```
---
## Erster Login (einmalig)
1. **Dashboard öffnen** → http://localhost:8080
2. Auf **„Instanz starten“** klicken. Prism Launcher öffnet sich im VNC-Fenster.
3. In Prism oben rechts: **Konto → Konto hinzufügen → Microsoft**.
4. Prism zeigt einen **Code** an. Auf *irgendeinem* Gerät
`https://microsoft.com/link` öffnen, Code eingeben, mit Microsoft einloggen.
5. Zurück in Prism: im Hauptfenster die gewünschte **Instanz** wählen und auf
**„Spielen“** klicken. Prism lädt die passende Minecraft-Version + Java
automatisch herunter.
6. Im Minecraft-Hauptmenü: **Mehrspieler → Server hinzufügen** → Adresse der
Farm eingeben → **Verbinden**.
Ab jetzt ist der Account auf der Farm. Der Login liegt persistent in
`./config/prism` und bleibt auch nach `docker compose down` erhalten.
> **Tipp:** Bevor du den Container Neustartest, kannst du in Minecraft über
> *Optionen → Steuerelemente* auch schon die korrekte Farm-Anbindung
> (z. B. eine Trade/Anti-AFK-Makro-Mod) konfigurieren — sie bleibt erhalten.
---
## AFK-Farm-Setup
Die konkrete Einrichtung hängt von deiner Farm ab. Typische Schritte:
- **Anti-AFK**: periodisch springen/bewegen, damit der Server dich nicht kickt.
Du kannst die Vanilla-Funktion (z. B. Wasserstrom, der dich ständig leicht
bewegt) nutzen oder eine Client-Mod wie *Mouse Tweaks* / *Inventory Profiles*
installieren. Mods legst du über Prism in die jeweilige Instanz.
- **Auto-Reconnect**: manche Server trennen nach Stunden. Nutze ggf. eine
*Reconnect*-Mod.
- **Fenster offen lassen**: Solange das Dashboard geöffnet ist, siehst du den
Client live. Du kannst den Tab schließen — Minecraft läuft im Container
weiter. Nur der Container muss laufen.
---
## Konfiguration (`.env`)
| Variable | Standard | Bedeutung |
| ------------------- | ------------- | ------------------------------------------------- |
| `PUID` / `PGID` | `1000` | UID/GID des Container-Benutzers. Mit `id -u`/`id -g` deines Host-Users setzen, damit `./config` dir gehört. |
| `TZ` | `Europe/Berlin` | Zeitzone des Containers. |
| `DISPLAY_WIDTH` | `1280` | Breite des virtuellen Displays (MC-Auflösung). |
| `DISPLAY_HEIGHT` | `720` | Höhe des virtuellen Displays. |
| `DISPLAY_DEPTH` | `24` | Farbtiefe (24 = 8-bit RGB). |
| `DISPLAY_REFRESH` | `60` | Bildwiederholrate des virtuellen Displays. |
| `WEB_PORT` | `8080` | Browser-Port. |
| `VNC_PASSWORD` | *(leer)* | Optional. Leer = ohne Auth (nur lokales Netz!). |
| `X11VNC_EXTRA` | siehe `.env` | Low-Latency-/Eingabe-Flags für x11vnc. |
---
## Steuerung über VNC
Die Steuerung ist auf **Minecraft-Menü, Chat, Inventar und AFK-Farmen**
optimiert. Sie ist **nicht** für aktives PVP/Mouselook gedacht — das ist eine
grundsätzliche Grenze von VNC (siehe unten).
**Bedienung im Browser:**
- **Klick ins Bild** → setzt den Tastaturfokus ins Spielfenster (Tasten gehen
ans Spiel, nicht an den Browser).
- **Maus freigeben** → `Strg + Alt + Umschalt` (noVNC-Standard).
- **Vollbild** → Button in der Toolbar; für Minecraft flächendeckend.
- **Zwischenablage** → automatisch verknüpft (Login-Codes / Server-IPs kopieren
geht direkt zwischen Browser und Container).
**Was automatisch eingestellt ist:**
- `resize=remote`: die Xvfb-Auflösung folgt der Fenstergröße (1:1-Maus-Mapung,
keine Skalierungs-Unschärfe).
- `reconnect=1`: bei Abbruch verbindet noVNC selbstständig neu.
- x11vnc mit `-threads -pointer_mode 4 -norepeat`:
- `-threads` → parallele I/O-Threads, weniger Eingabe-Lag.
- `-pointer_mode 4` → flüssigere Mausübertragung als der Default (1).
- `-norepeat` → verhindert doppelte Tastaturwiederholungen im Spiel.
- `-nodpms -nofbpm -nowf -nowcr` → Energiesparen und Rate-Limiting aus, damit
nichts nach Leerlauf ruckelt.
**Für langsames Netz** (z. B. Remote über Internet statt LAN) in der `.env`
Kompression aktivieren:
```
X11VNC_EXTRA=-threads -pointer_mode 4 -norepeat -tight -compresslevel 6 -quality 7
```
### Warum Mouselook nicht richtig geht
VNC überträgt **absolute** Mauskoordinaten („Cursor an Position X/Y"). Minecraft
wie jedes FPS-artige Spiel braucht aber **relative** Mausbewegung und setzt den
Cursor dafür jeden Frame auf die Bildmitte zurück ([noVNC Issue #1493][novnc1493]).
Darum lässt sich die Kamera per VNC nicht sinnfrei drehen.
Für Menü, Buttons, Chat, Inventar und reines AFK auf einer Farm ist das ohne
Bedeutung. Wer wirklich remote *spielen* will, braucht ein anderes Protokoll
(Sunshine/Moonlight statt VNC) — das ist mit dieser Architektur nicht abgedeckt.
[novnc1493]: https://github.com/novnc/noVNC/issues/1493
---
## API
| Methode | Pfad | Beschreibung |
| ------- | ---------------- | ---------------------------------------- |
| `GET` | `/api/status` | Status von Display, VNC und Minecraft. |
| `POST` | `/api/mc/start` | Startet Prism Launcher. |
| `POST` | `/api/mc/stop` | Beendet Prism + Minecraft. |
Beispiel:
```bash
curl -X POST http://localhost:8080/api/mc/start
```
---
## Dashboard entwickeln
Für die Vue-Entwicklung ohne jedes Mal neu zu bauen:
```bash
cd web
npm install
npm run dev # → http://localhost:5173 (proxyt /api + /websockify nach :8080)
```
Damit das Dev-Dashboard funktioniert, muss der Container laufen
(`docker compose up -d`), damit der VNC-Stream und die API erreichbar sind.
---
## Performance-Hinweise
- Minecraft rendert im Container per **llvmpipe (CPU-Software-OpenGL)**.
Für AFK-Farmen absolut ausreichend (~12 CPU-Kerne), aber kein flüssiges PVP.
- `shm_size: 1gb` ist gesetzt, damit OpenGL genug Shared Memory hat.
- Bei verfübarer GPU kannst du `/dev/dri` durchreichen (in `docker-compose.yml`
auskommentiert). MC nutzt dann Hardware-Rendering.
---
## Projektstruktur
```
CTmine-client/
├── Dockerfile # Multi-Stage: Vue-Build + Runtime
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── entrypoint.sh # PUID/PGID, /config, Xvfb/x11vnc-Conf generieren
│ ├── supervisor.conf # Prozess-Manager für alle Dienste
│ ├── nginx.conf # Dashboard + /api + /websockify Proxy
│ └── mc-api/ # Node-Status-API (ohne externe Dependencies)
│ ├── server.js
│ └── package.json
└── web/ # Vite + Vue 3 + TypeScript Dashboard
├── package.json · vite.config.ts · tsconfig.json
└── src/
├── App.vue · main.ts · api.ts · types.ts
├── styles/main.css
└── components/
├── VncViewer.vue # noVNC-Integration
├── ControlPanel.vue # MC Start/Stop, Schnellstart-Anleitung
└── StatusBar.vue # Status-Indikatoren
```
---
## Bekannte Einschränkungen
- **Sound** ist im MVP nicht konfiguriert (für AFK-Farmen irrelevant).
- **Erster Login interaktiv**: der Microsoft-Login muss einmalig im VNC-Fenster
per Device-Code durchgeführt werden. Danach persistent.
- **EULA/Nutzungsbedingungen**: Dieses Projekt stellt nur die Infrastruktur
bereit. Du bist selbst für die Einhaltung der Mojang/Minecraft-Nutzungs-
bedingungen und der Regeln deines Zielservers verantwortlich.
---
## Lizenz
MIT — siehe `LICENSE` falls beigefügt. Minecraft ist Eigentum von Mojang/Microsoft;
dieses Projekt steht nicht in offizieller Verbindung.