THEZYZSTUDIO commited on
Commit
019c960
·
verified ·
1 Parent(s): ca18acf

Upload 2 files

Browse files
Files changed (2) hide show
  1. README.md +152 -0
  2. start.sh +105 -0
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