#!/bin/bash set -e # ═══════════════════════════════════════════════════════════ # Minecraft Java Server — startup script # Runs inside Docker on Hugging Face Spaces # ═══════════════════════════════════════════════════════════ DATA_DIR="/data" SERVER_JAR="${DATA_DIR}/server.jar" LOG_DIR="${DATA_DIR}/logs" MC_VERSION="${MC_VERSION:-1.21.4}" MC_MEMORY="${MC_MEMORY:-1G}" MC_MAX_MEMORY="${MC_MAX_MEMORY:-2G}" MC_WORLD="${MC_WORLD:-world}" SERVER_PORT="${SERVER_PORT:-25565}" mkdir -p "${DATA_DIR}" "${LOG_DIR}" echo "══════════════════════════════════════════" echo " Minecraft Java Server" echo " Version : ${MC_VERSION}" echo " Memory : ${MC_MEMORY} → ${MC_MAX_MEMORY}" echo " World : ${MC_WORLD}" echo " Port : ${SERVER_PORT}" echo "══════════════════════════════════════════" # ── 1. Start HTTP status page (required by HF Spaces on port 7860) ── echo "[~] Starting HTTP status server on port 7860..." python3 /home/minecraft/status_server.py & echo "[✓] HTTP status server running." # ── 2. Accept EULA automatically ─────────────────────────── echo "eula=true" > "${DATA_DIR}/eula.txt" echo "[✓] EULA accepted." # ── 3. Download server JAR if not cached ────────────────── if [ ! -f "${SERVER_JAR}" ]; then echo "[~] Fetching Minecraft ${MC_VERSION} server JAR..." MANIFEST_URL="https://launchermeta.mojang.com/mc/game/version_manifest.json" VERSION_URL=$(curl -sL "${MANIFEST_URL}" | \ python3 -c " import sys, json data = json.load(sys.stdin) target = '${MC_VERSION}' for v in data['versions']: if v['id'] == target: print(v['url']) break ") if [ -z "${VERSION_URL}" ]; then echo "[✗] Version ${MC_VERSION} not found in Mojang manifest!" exit 1 fi SERVER_URL=$(curl -sL "${VERSION_URL}" | \ python3 -c "import sys, json; d=json.load(sys.stdin); print(d['downloads']['server']['url'])") curl -L "${SERVER_URL}" -o "${SERVER_JAR}" echo "[✓] Server JAR downloaded." else echo "[✓] Server JAR already cached." fi # ── 4. Write server.properties (first run only) ──────────── PROPS_FILE="${DATA_DIR}/server.properties" if [ ! -f "${PROPS_FILE}" ]; then sed \ -e "s|{{WORLD}}|${MC_WORLD}|g" \ -e "s|{{PORT}}|${SERVER_PORT}|g" \ /home/minecraft/server.properties.template > "${PROPS_FILE}" echo "[✓] server.properties created." else echo "[✓] server.properties already exists — skipping." fi # ── 5. Move to data dir ──────────────────────────────────── cd "${DATA_DIR}" # ── 6. Launch Minecraft! ─────────────────────────────────── echo "" echo "[★] Starting Minecraft server..." echo "" exec java \ -Xms${MC_MEMORY} \ -Xmx${MC_MAX_MEMORY} \ -XX:+UseG1GC \ -XX:+ParallelRefProcEnabled \ -XX:MaxGCPauseMillis=200 \ -XX:+UnlockExperimentalVMOptions \ -XX:+DisableExplicitGC \ -XX:G1NewSizePercent=30 \ -XX:G1MaxNewSizePercent=40 \ -XX:G1HeapRegionSize=8M \ -XX:G1ReservePercent=20 \ -XX:G1HeapWastePercent=5 \ -XX:G1MixedGCCountTarget=4 \ -XX:InitiatingHeapOccupancyPercent=15 \ -XX:G1MixedGCLiveThresholdPercent=90 \ -XX:G1RSetUpdatingPauseTimePercent=5 \ -XX:SurvivorRatio=32 \ -XX:+PerfDisableSharedMem \ -XX:MaxTenuringThreshold=1 \ -Dusing.aikars.flags=https://mcflags.emc.gs \ -jar "${SERVER_JAR}" nogui