Upload 2 files
Browse files
README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🎮 Minecraft Java Server — Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
> سيرفر Minecraft Java Edition صغير يعمل داخل Docker على Hugging Face Spaces.
|
| 4 |
+
> مثالي للعب مع الأصدقاء دون الحاجة لاستضافة مدفوعة.
|
| 5 |
+
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
## ما الذي يفعله هذا المشروع؟
|
| 9 |
+
|
| 10 |
+
- يُشغّل **Minecraft Java server** داخل حاوية Docker.
|
| 11 |
+
- يُنزّل JAR السيرفر تلقائيًا من Mojang عند أول تشغيل.
|
| 12 |
+
- يحفظ عالمك ولوغاتك في `/data` (دائم بين إعادات التشغيل).
|
| 13 |
+
- يقبل إعدادات مرنة عبر متغيرات البيئة دون تعديل الكود.
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## المتطلبات
|
| 18 |
+
|
| 19 |
+
| المتطلب | التفاصيل |
|
| 20 |
+
|--------|----------|
|
| 21 |
+
| حساب Hugging Face | مجاني على [huggingface.co](https://huggingface.co) |
|
| 22 |
+
| Space من نوع Docker | اختر **Docker** عند إنشاء الـ Space |
|
| 23 |
+
| Hardware | Space مجاني يكفي للتجربة — CPU basic |
|
| 24 |
+
| Minecraft Java Edition | على أجهزة اللاعبين (نسخة مدفوعة) |
|
| 25 |
+
| منفذ مفتوح | HF Spaces لا تدعم TCP مباشرة — راجع ملاحظة الشبكة |
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
|
| 29 |
+
## كيفية الرفع إلى Hugging Face
|
| 30 |
+
|
| 31 |
+
```bash
|
| 32 |
+
# 1. ثبّت git-lfs إن لم يكن مثبتًا
|
| 33 |
+
git lfs install
|
| 34 |
+
|
| 35 |
+
# 2. أنشئ Space جديد من نوع Docker على huggingface.co/new-space
|
| 36 |
+
|
| 37 |
+
# 3. استنسخ الـ Space الفارغ
|
| 38 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME
|
| 39 |
+
cd YOUR_SPACE_NAME
|
| 40 |
+
|
| 41 |
+
# 4. انسخ ملفات هذا المشروع إليه
|
| 42 |
+
cp -r /path/to/minecraft-hf-space/* .
|
| 43 |
+
|
| 44 |
+
# 5. ارفع
|
| 45 |
+
git add .
|
| 46 |
+
git commit -m "Initial Minecraft server setup"
|
| 47 |
+
git push
|
| 48 |
+
```
|
| 49 |
+
|
| 50 |
+
بعد الـ push، سيبني HF الـ Docker image تلقائيًا ويُشغّل السيرفر.
|
| 51 |
+
|
| 52 |
+
---
|
| 53 |
+
|
| 54 |
+
## كيفية تشغيل السيرفر
|
| 55 |
+
|
| 56 |
+
بعد رفع الملفات:
|
| 57 |
+
|
| 58 |
+
1. افتح الـ Space على Hugging Face.
|
| 59 |
+
2. انتظر حتى يكتمل البناء (عادةً 2-3 دقائق).
|
| 60 |
+
3. راقب اللوغات من تبويب **Logs** في الـ Space.
|
| 61 |
+
4. عند ظهور `Done! For help, type "help"` — السيرفر شغّال.
|
| 62 |
+
|
| 63 |
+
### الاتصال بالسيرفر ⚠️
|
| 64 |
+
|
| 65 |
+
> **تنبيه مهم:** Hugging Face Spaces لا تكشف منافذ TCP خارجيًا تلقائيًا.
|
| 66 |
+
> لتمرير المنفذ، استخدم إحدى الطرق التالية:
|
| 67 |
+
|
| 68 |
+
| الخيار | التفاصيل |
|
| 69 |
+
|--------|----------|
|
| 70 |
+
| **playit.gg** | خدمة مجانية لتمرير منفذ Minecraft — الأسهل |
|
| 71 |
+
| **ngrok** | يتطلب حساب مجاني، يدعم TCP |
|
| 72 |
+
| **Cloudflare Tunnel** | للمستخدمين المتقدمين |
|
| 73 |
+
|
| 74 |
+
مثال باستخدام playit.gg داخل الـ container:
|
| 75 |
+
```bash
|
| 76 |
+
# أضف في start.sh قبل تشغيل Java:
|
| 77 |
+
curl -SsL https://playit.gg/downloads/playit-linux-amd64 -o /tmp/playit
|
| 78 |
+
chmod +x /tmp/playit
|
| 79 |
+
/tmp/playit &
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
---
|
| 83 |
+
|
| 84 |
+
## كيف أحافظ على العالم محفوظًا؟
|
| 85 |
+
|
| 86 |
+
- **العالم يُحفظ في `/data/world`** (أو أي اسم اخترته في `MC_WORLD`).
|
| 87 |
+
- `/data` هو الـ volume الدائم في Spaces — البيانات لا تُحذف عند إعادة التشغيل.
|
| 88 |
+
- لعمل نسخة احتياطية يدوية: اذهب إلى **Files** في الـ Space وحمّل مجلد `data/world`.
|
| 89 |
+
|
| 90 |
+
> ⚠️ إذا **حذفت الـ Space** نفسه، ستُفقد البيانات. احتفظ بنسخة خارجية دائمًا.
|
| 91 |
+
|
| 92 |
+
---
|
| 93 |
+
|
| 94 |
+
## كيف أغيّر الإعدادات؟
|
| 95 |
+
|
| 96 |
+
كل الإعدادات الرئيسية تُتحكم بها عبر **Environment Variables** في إعدادات الـ Space:
|
| 97 |
+
|
| 98 |
+
| المتغير | الافتراضي | الوصف |
|
| 99 |
+
|---------|-----------|-------|
|
| 100 |
+
| `MC_VERSION` | `1.21.4` | إصدار Minecraft |
|
| 101 |
+
| `MC_MEMORY` | `1G` | الحد الأدنى للـ RAM |
|
| 102 |
+
| `MC_MAX_MEMORY` | `2G` | الحد الأقصى للـ RAM |
|
| 103 |
+
| `MC_WORLD` | `world` | اسم مجلد العالم |
|
| 104 |
+
| `SERVER_PORT` | `25565` | منفذ السيرفر |
|
| 105 |
+
|
| 106 |
+
### طريقة التعديل:
|
| 107 |
+
1. افتح Space ← **Settings** ← **Variables and secrets**
|
| 108 |
+
2. أضف المتغير بالاسم والقيمة المطلوبة.
|
| 109 |
+
3. أعد تشغيل الـ Space.
|
| 110 |
+
|
| 111 |
+
### تغيير إعدادات اللعبة (server.properties):
|
| 112 |
+
بعد أول تشغيل، عدّل `/data/server.properties` مباشرة عبر:
|
| 113 |
+
- أداة الـ terminal في الـ Space (إن توفرت)
|
| 114 |
+
- أو أضف سكريبت يعدّل الملف قبل التشغيل
|
| 115 |
+
|
| 116 |
+
---
|
| 117 |
+
|
| 118 |
+
## هيكل الملفات
|
| 119 |
+
|
| 120 |
+
```
|
| 121 |
+
minecraft-hf-space/
|
| 122 |
+
├── Dockerfile # تعريف الحاوية
|
| 123 |
+
├── start.sh # سكريبت التشغيل
|
| 124 |
+
├── README.md # هذا الملف
|
| 125 |
+
└── config/
|
| 126 |
+
└── server.properties.template # قالب الإعدادات
|
| 127 |
+
```
|
| 128 |
+
|
| 129 |
+
بعد التشغيل الأول، ستجد في `/data`:
|
| 130 |
+
```
|
| 131 |
+
/data/
|
| 132 |
+
├── server.jar # JAR السيرفر (مُخزَّن مؤقتًا)
|
| 133 |
+
├── eula.txt
|
| 134 |
+
├── server.properties
|
| 135 |
+
├── world/ # العالم المحفوظ
|
| 136 |
+
└── logs/
|
| 137 |
+
```
|
| 138 |
+
|
| 139 |
+
---
|
| 140 |
+
|
| 141 |
+
## نصائح الأداء
|
| 142 |
+
|
| 143 |
+
- **RAM:** على الـ Space المجاني (16GB RAM)، `MC_MAX_MEMORY=3G` جيد لـ 5 لاعبين.
|
| 144 |
+
- **view-distance:** قيمة 6-8 تكفي وتوفر CPU.
|
| 145 |
+
- **Aikar's flags:** مُضمّنة في `start.sh` لتحسين GC.
|
| 146 |
+
|
| 147 |
+
---
|
| 148 |
+
|
| 149 |
+
## الترخيص
|
| 150 |
+
|
| 151 |
+
هذا المشروع لأغراض تعليمية وتجريبية.
|
| 152 |
+
Minecraft ملك لـ Mojang/Microsoft — تأكد من امتلاك نسخة أصلية.
|
start.sh
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
set -e
|
| 3 |
+
|
| 4 |
+
# ═══════════════════════════════════════════════════════════
|
| 5 |
+
# Minecraft Java Server — startup script
|
| 6 |
+
# Runs inside Docker on Hugging Face Spaces
|
| 7 |
+
# ═══════════════════════════════════════════════════════════
|
| 8 |
+
|
| 9 |
+
DATA_DIR="/data"
|
| 10 |
+
SERVER_JAR="${DATA_DIR}/server.jar"
|
| 11 |
+
LOG_DIR="${DATA_DIR}/logs"
|
| 12 |
+
|
| 13 |
+
MC_VERSION="${MC_VERSION:-1.21.4}"
|
| 14 |
+
MC_MEMORY="${MC_MEMORY:-1G}"
|
| 15 |
+
MC_MAX_MEMORY="${MC_MAX_MEMORY:-2G}"
|
| 16 |
+
MC_WORLD="${MC_WORLD:-world}"
|
| 17 |
+
SERVER_PORT="${SERVER_PORT:-25565}"
|
| 18 |
+
|
| 19 |
+
mkdir -p "${DATA_DIR}" "${LOG_DIR}"
|
| 20 |
+
|
| 21 |
+
echo "══════════════════════════════════════════"
|
| 22 |
+
echo " Minecraft Java Server"
|
| 23 |
+
echo " Version : ${MC_VERSION}"
|
| 24 |
+
echo " Memory : ${MC_MEMORY} → ${MC_MAX_MEMORY}"
|
| 25 |
+
echo " World : ${MC_WORLD}"
|
| 26 |
+
echo " Port : ${SERVER_PORT}"
|
| 27 |
+
echo "══════════════════════════════════════════"
|
| 28 |
+
|
| 29 |
+
# ── 1. Accept EULA automatically ───────────────────────────
|
| 30 |
+
echo "eula=true" > "${DATA_DIR}/eula.txt"
|
| 31 |
+
echo "[✓] EULA accepted."
|
| 32 |
+
|
| 33 |
+
# ── 2. Download server JAR if not cached ──────────────────
|
| 34 |
+
if [ ! -f "${SERVER_JAR}" ]; then
|
| 35 |
+
echo "[~] Fetching Minecraft ${MC_VERSION} server JAR..."
|
| 36 |
+
|
| 37 |
+
MANIFEST_URL="https://launchermeta.mojang.com/mc/game/version_manifest.json"
|
| 38 |
+
VERSION_URL=$(curl -sL "${MANIFEST_URL}" | \
|
| 39 |
+
python3 -c "
|
| 40 |
+
import sys, json
|
| 41 |
+
data = json.load(sys.stdin)
|
| 42 |
+
target = '${MC_VERSION}'
|
| 43 |
+
for v in data['versions']:
|
| 44 |
+
if v['id'] == target:
|
| 45 |
+
print(v['url'])
|
| 46 |
+
break
|
| 47 |
+
")
|
| 48 |
+
|
| 49 |
+
if [ -z "${VERSION_URL}" ]; then
|
| 50 |
+
echo "[✗] Version ${MC_VERSION} not found in Mojang manifest!"
|
| 51 |
+
exit 1
|
| 52 |
+
fi
|
| 53 |
+
|
| 54 |
+
SERVER_URL=$(curl -sL "${VERSION_URL}" | \
|
| 55 |
+
python3 -c "import sys, json; d=json.load(sys.stdin); print(d['downloads']['server']['url'])")
|
| 56 |
+
|
| 57 |
+
curl -L "${SERVER_URL}" -o "${SERVER_JAR}"
|
| 58 |
+
echo "[✓] Server JAR downloaded."
|
| 59 |
+
else
|
| 60 |
+
echo "[✓] Server JAR already cached."
|
| 61 |
+
fi
|
| 62 |
+
|
| 63 |
+
# ── 3. Write server.properties (first run only) ────────────
|
| 64 |
+
PROPS_FILE="${DATA_DIR}/server.properties"
|
| 65 |
+
if [ ! -f "${PROPS_FILE}" ]; then
|
| 66 |
+
sed \
|
| 67 |
+
-e "s|{{WORLD}}|${MC_WORLD}|g" \
|
| 68 |
+
-e "s|{{PORT}}|${SERVER_PORT}|g" \
|
| 69 |
+
/home/minecraft/server.properties.template > "${PROPS_FILE}"
|
| 70 |
+
echo "[✓] server.properties created."
|
| 71 |
+
else
|
| 72 |
+
echo "[✓] server.properties already exists — skipping."
|
| 73 |
+
fi
|
| 74 |
+
|
| 75 |
+
# ── 4. Link data dir into working dir ─────────────────────
|
| 76 |
+
# HF Spaces run from /home/minecraft but data lives in /data
|
| 77 |
+
cd "${DATA_DIR}"
|
| 78 |
+
|
| 79 |
+
# ── 5. Launch! ────────────────────────────────────────────
|
| 80 |
+
echo ""
|
| 81 |
+
echo "[★] Starting Minecraft server..."
|
| 82 |
+
echo ""
|
| 83 |
+
|
| 84 |
+
exec java \
|
| 85 |
+
-Xms${MC_MEMORY} \
|
| 86 |
+
-Xmx${MC_MAX_MEMORY} \
|
| 87 |
+
-XX:+UseG1GC \
|
| 88 |
+
-XX:+ParallelRefProcEnabled \
|
| 89 |
+
-XX:MaxGCPauseMillis=200 \
|
| 90 |
+
-XX:+UnlockExperimentalVMOptions \
|
| 91 |
+
-XX:+DisableExplicitGC \
|
| 92 |
+
-XX:G1NewSizePercent=30 \
|
| 93 |
+
-XX:G1MaxNewSizePercent=40 \
|
| 94 |
+
-XX:G1HeapRegionSize=8M \
|
| 95 |
+
-XX:G1ReservePercent=20 \
|
| 96 |
+
-XX:G1HeapWastePercent=5 \
|
| 97 |
+
-XX:G1MixedGCCountTarget=4 \
|
| 98 |
+
-XX:InitiatingHeapOccupancyPercent=15 \
|
| 99 |
+
-XX:G1MixedGCLiveThresholdPercent=90 \
|
| 100 |
+
-XX:G1RSetUpdatingPauseTimePercent=5 \
|
| 101 |
+
-XX:SurvivorRatio=32 \
|
| 102 |
+
-XX:+PerfDisableSharedMem \
|
| 103 |
+
-XX:MaxTenuringThreshold=1 \
|
| 104 |
+
-Dusing.aikars.flags=https://mcflags.emc.gs \
|
| 105 |
+
-jar "${SERVER_JAR}" nogui
|