Spaces:
Paused
Paused
| 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 | |