diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 861fcf9..186b2df 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,161 +1,34 @@ -# Copilot Run Instructions – Minecraft Server on Proxmox (Simulation Mode) - -## Zweck -Nur erklären und Änderungen als **Diff** erzeugen. **Keine** Skripte ausführen. **Kein Build**. Ziel ist ein durchgängiger CLI-Ablauf mit GitHub Copilot CLI. - -## Voraussetzungen -1) Git, GitHub CLI und Copilot CLI sind eingerichtet. -2) Du arbeitest im Repo-Klon. - -```bash -cd "$HOME/github_repos/minecraft-server-Proxmox" -git status -```` - ---- - -## Antworten auf „Run/Build?“ - -Immer Simulation. Nur Beispiele zeigen, nichts lokal ausführen. - -**Option 1: Java in VM** - -```bash -chmod +x setup_minecraft.sh -./setup_minecraft.sh -sudo -u minecraft screen -r minecraft -``` - -**Option 2: Java in LXC** - -```bash -chmod +x setup_minecraft_lxc.sh -./setup_minecraft_lxc.sh -sudo -u minecraft screen -r minecraft -``` - -**Option 3: Bedrock** - -```bash -chmod +x setup_bedrock.sh -./setup_bedrock.sh -sudo -u minecraft screen -r bedrock -``` - -**Option 4: Java aktualisieren (PaperMC)** - -```bash -chmod +x update.sh -./update.sh -``` - -**Option 5: systemd Autostart (optional, Java)** - -```bash -sudo cp minecraft.service /etc/systemd/system/minecraft.service -sudo systemctl daemon-reload -sudo systemctl enable --now minecraft -``` - -> Diese Befehle sind **Beispiele** für externe Systeme. In dieser Umgebung nur erklären. Details siehe `SIMULATION.md`. - ---- - -## Safe-Workflow mit Copilot CLI - -### 1) Arbeitszweig vorbereiten - -```bash -cd "$HOME/github_repos/minecraft-server-Proxmox" -git switch -c copilot/refactor-sim || git switch copilot/refactor-sim -``` - -### 2) Audit + Refactor per Ein-Prompt (nur Diff ausgeben lassen) - -```bash -gh copilot chat -p ' -Refactor this repo in SIMULATION ONLY. Do not execute anything. Output a single unified diff file named refactor.diff (git apply -p0 friendly). Scope: - -1) setup_minecraft.sh + setup_minecraft_lxc.sh - - If OpenJDK 21 missing on Debian 12, add fallback: install Amazon Corretto 21 via APT with /usr/share/keyrings keyring and signed-by pin. - - Auto-size JVM memory from /proc/meminfo: -Xms = 1/4, -Xmx = 1/2 of RAM (min 1G/2G). - - Ensure /run/screen exists (chmod 775, root:utmp) before screen -dmS. - -2) setup_bedrock.sh - - Regex for artifact: bedrock-server-[0-9.]+\.zip - - HEAD check: Content-Type must be application/zip before download. - - Enforce checksum by default: REQUIRE_BEDROCK_SHA=1 and REQUIRED_BEDROCK_SHA256 mandatory. - - Create /run/screen as above. - -3) minecraft.service - - Run as User/Group=minecraft. - - Hardening: NoNewPrivileges=true, ProtectSystem=full, ProtectHome=true, PrivateTmp=true, - ProtectKernelTunables=true, ProtectKernelModules=true, ProtectControlGroups=true, - RestrictSUIDSGID=true, RestrictNamespaces=true, CapabilityBoundingSet=, - AmbientCapabilities=, ReadWritePaths=/opt/minecraft. - -4) Backups - - Add RETAIN_DAYS env default=7 and ExecStartPost cleanup with find … -mtime +$RETAIN_DAYS -delete. - -5) Docs - - Create COPILOT_RUN_INSTRUCTIONS.md (this file) summary link in README. - - README: mention Java 21 requirement with Corretto fallback, UFW install before ufw commands, memory auto-sizing note, - Bedrock checksum enforcement note, and link to SIMULATION.md. - -Constraints: -- Do NOT run or simulate shell in this environment. Produce only a single file: refactor.diff. -- Touch only the files above + README.md + new COPILOT_RUN_INSTRUCTIONS.md as needed. -- Keep changes minimal and consistent with current style. -' -``` - -### 3) Diff holen und prüfen - -Copilot legt die Datei an oder zeigt sie an. Wenn als Datei erstellt: - -```bash -ls -lh refactor.diff -``` - -Wenn nur als Chat-Ausgabe kam, speichere sie: - -```bash -nano refactor.diff -# Inhalt aus der Copilot-Antwort einfügen, speichern -``` - -### 4) Diff anwenden und committen - -```bash -git apply -p0 refactor.diff -git status -git add -A -git commit -m "refactor(simulation): Corretto21 fallback, RAM autosize, Bedrock checksum, systemd hardening, docs" -``` - -### 5) Rückweg bei Problemen - -```bash -git restore -SW :/ -git reset --hard HEAD -``` - -### 6) Push und PR (optional) - -```bash -git push -u origin copilot/refactor-sim -gh pr create --fill --title "Refactor (simulation)" --body "Simulation-mode changes per COPILOT_RUN_INSTRUCTIONS.md" -``` - ---- - -## Hinweise - -* Keine lokalen Installationen anstoßen. Copilot erzeugt **nur** einen Diff. -* In Antworten immer klarstellen: Beispiele dienen externer Ausführung. -* Für Schritt-für-Schritt-Effekte der Skripte siehe `SIMULATION.md`. -* CI-Erweiterungen (ShellCheck, Markdown-Lint, Link-Check) bitte in separatem PR ergänzen. - - -::contentReference[oaicite:0]{index=0} - +# Copilot Instructions (AI Coding Agents) + +## Big Picture +Dieses Repo sind defensive **Bash-Installer/Updater** für Minecraft auf Proxmox-Gästen: +- **Java (PaperMC)**: Provisionierung nach `/opt/minecraft`, Start via `screen`. +- **Bedrock**: Provisionierung nach `/opt/minecraft-bedrock`, Start via `screen`. +- Optionaler Autostart über systemd (`minecraft.service`, `minecraft-bedrock.service`). + +## Simulation-Only (nicht ausführen) +- **Keine Side-Effects** in dieser Workspace-Umgebung: kein `apt`, `systemctl`, `curl/wget` (wenn es Dinge installiert/ändert), keine `./setup_*.sh`. +- Bei „run/build“ nur **Beispiel-Kommandos für externe Hosts** zeigen und kurz erklären. Siehe [SIMULATION.md](SIMULATION.md). +- Für Copilot-CLI-/Diff-Workflow: [COPILOT_RUN_INSTRUCTIONS.md](COPILOT_RUN_INSTRUCTIONS.md). + +## Entry Points +- Java VM Installer: `setup_minecraft.sh` +- Java LXC Installer: `setup_minecraft_lxc.sh` +- Bedrock Installer: `setup_bedrock.sh` +- Java Updater: `update.sh` +- systemd Units: `minecraft.service`, `minecraft-bedrock.service` +- Doku: `README.md`, `SIMULATION.md`, `docs/BEDROCK_NETWORKING.md` + +## Repo-spezifische Patterns (bitte beibehalten) +- Shell: `#!/usr/bin/env bash` + `set -euo pipefail` (z. B. in `setup_minecraft.sh`, `setup_bedrock.sh`). +- Java 21: erst **OpenJDK 21**, Fallback auf **Amazon Corretto 21 via APT keyring + signed-by** (`ensure_java()` in `setup_minecraft.sh`). +- JVM Autosize: aus `/proc/meminfo` → `-Xms ≈ RAM/4`, `-Xmx ≈ RAM/2`, Floors `1024M/2048M`, `Xmx`-Cap `≤16G` (generiertes `start.sh`). +- PaperMC Integrität: PaperMC API (`curl`+`jq`) liefert SHA256; Download prüft SHA + Mindestgröße `>5MB` gegen HTML-Fehlerseiten (`setup_minecraft.sh`, `update.sh`). +- Bedrock Integrität: Mojang-URL per Regex; **HTTP HEAD Content-Type** muss `application/zip|octet-stream` sein; Checksum standardmäßig **erzwingend** (`REQUIRE_BEDROCK_SHA=1`, `REQUIRED_BEDROCK_SHA256`) (`setup_bedrock.sh`). +- screen Socket: `/run/screen` muss existieren (`root:utmp`, `0775`) und via `systemd-tmpfiles` persistiert werden, sonst scheitert `screen` auf Debian 12/13. +- systemd Hardening: `minecraft.service` nutzt `User/Group=minecraft`, Hardening-Flags und `ReadWritePaths=/opt/minecraft`. + +## Änderungen am Repo +- Minimal ändern, Stil beibehalten; keine neuen UX-Flows erfinden. +- Neue Env-Variablen/Optionen immer kurz in `README.md` und/oder `SIMULATION.md` dokumentieren. +- Keine Artefakte wie `*.bak`/`*.rej`/Report-Dateien einchecken (falls relevant: `.gitignore` ergänzen). diff --git a/.gitignore b/.gitignore index 19645fc..fa85fa2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ fix_all_issues.sh vendor/bundle/ .bundle/ .npm-cache/ +*.bak +*.rej +shellcheck_report.txt diff --git a/setup_minecraft.sh.bak b/setup_minecraft.sh.bak deleted file mode 100755 index b4b09dc..0000000 --- a/setup_minecraft.sh.bak +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -# Minecraft Java Server Installer for Proxmox VM -# Tested on Debian 11/12 and Ubuntu 24.04 -# Author: TimInTech - -set -euo pipefail # Exit script on error, undefined variable, or failed pipeline - -# Install required dependencies -sudo apt update && sudo apt upgrade -y -sudo apt install -y screen wget curl jq unzip - -# Install Java: attempt to install OpenJDK 21 if available, otherwise fall back to OpenJDK 17. -if ! sudo apt install -y openjdk-21-jre-headless; then - echo "openjdk-21-jre-headless is not available; falling back to openjdk-17-jre-headless" - sudo apt install -y openjdk-17-jre-headless -fi - -# Set up server directory -sudo mkdir -p /opt/minecraft -sudo chown "$(whoami)":"$(whoami)" /opt/minecraft -cd /opt/minecraft || exit 1 - -# Fetch the latest PaperMC version -LATEST_VERSION=$(curl -s https://api.papermc.io/v2/projects/paper | jq -r '.versions | last') -LATEST_BUILD=$(curl -s https://api.papermc.io/v2/projects/paper/versions/"$LATEST_VERSION" | jq -r '.builds | last') - -# Validate if version and build numbers were retrieved -if [[ -z "$LATEST_VERSION" || -z "$LATEST_BUILD" ]]; then - echo "ERROR: Unable to fetch the latest PaperMC version. Check https://papermc.io/downloads" - exit 1 -fi - -echo "📦 Downloading PaperMC - Version: $LATEST_VERSION, Build: $LATEST_BUILD" -wget -O server.jar "https://api.papermc.io/v2/projects/paper/versions/$LATEST_VERSION/builds/$LATEST_BUILD/downloads/paper-$LATEST_VERSION-$LATEST_BUILD.jar" - -# Accept the Minecraft EULA -echo "eula=true" > eula.txt - -# Create start script -cat < start.sh -#!/bin/bash -java -Xms2G -Xmx4G -jar server.jar nogui -EOF -chmod +x start.sh - -# Create update script -cat < update.sh -#!/bin/bash -cd /opt/minecraft || exit 1 -LATEST_VERSION=\$(curl -s https://api.papermc.io/v2/projects/paper | jq -r '.versions | last') -LATEST_BUILD=\$(curl -s https://api.papermc.io/v2/projects/paper/versions/\$LATEST_VERSION | jq -r '.builds | last') - -wget -O server.jar "https://api.papermc.io/v2/projects/paper/versions/\$LATEST_VERSION/builds/\$LATEST_BUILD/downloads/paper-\$LATEST_VERSION-\$LATEST_BUILD.jar" -echo "✅ Update complete." -EOF -chmod +x update.sh - -# Start server in detached screen session -screen -dmS minecraft ./start.sh - -echo "✅ Minecraft Server setup complete!" -echo "To access console: sudo -u $(whoami) screen -r minecraft" diff --git a/setup_minecraft_lxc.sh.bak b/setup_minecraft_lxc.sh.bak deleted file mode 100644 index cbe7427..0000000 --- a/setup_minecraft_lxc.sh.bak +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -# Minecraft Server Installer for LXC Containers on Proxmox -# Tested on Debian 11/12 and Ubuntu 24.04 -# Author: TimInTech - - -set -euo pipefail - -# Update package lists and install required dependencies -apt update && apt upgrade -y -apt install -y screen wget curl jq unzip - -# Install Java: try OpenJDK 21 if available, fall back to OpenJDK 17. -if ! apt install -y openjdk-21-jre-headless; then - echo "openjdk-21-jre-headless is not available; falling back to openjdk-17-jre-headless" - apt install -y openjdk-17-jre-headless -fi - -# Create the Minecraft server directory -mkdir -p /opt/minecraft && cd /opt/minecraft || exit 1 - -# Fetch the latest PaperMC version -LATEST_VERSION=$(curl -s https://api.papermc.io/v2/projects/paper | jq -r '.versions | last') -LATEST_BUILD=$(curl -s https://api.papermc.io/v2/projects/paper/versions/"$LATEST_VERSION" | jq -r '.builds | last') - -# Validate if the version and build exist -if [[ -z "$LATEST_VERSION" || -z "$LATEST_BUILD" ]]; then - echo "ERROR: Couldn't retrieve the latest PaperMC version. Check https://papermc.io/downloads" - exit 1 -fi - -echo "Downloading PaperMC Version: $LATEST_VERSION, Build: $LATEST_BUILD" -wget -O server.jar "https://api.papermc.io/v2/projects/paper/versions/$LATEST_VERSION/builds/$LATEST_BUILD/downloads/paper-$LATEST_VERSION-$LATEST_BUILD.jar" - -# Accept the EULA -echo "eula=true" > eula.txt - -# Create start script -cat < start.sh -#!/bin/bash -java -Xms2G -Xmx4G -jar server.jar nogui -EOF - -chmod +x start.sh - -# Start the server in a detached screen session -screen -dmS minecraft ./start.sh - -echo "✅ Minecraft Server setup complete! Use 'screen -r minecraft' to access the console."