File size: 3,509 Bytes
6ce6322
 
 
 
 
 
 
 
 
7caf1c9
 
 
6ce6322
7caf1c9
 
6ce6322
7caf1c9
 
 
 
 
 
 
 
 
 
 
 
 
6ce6322
 
7caf1c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ce6322
 
 
7caf1c9
6ce6322
 
 
7caf1c9
6ce6322
 
 
 
 
 
7caf1c9
 
 
 
 
 
6ce6322
 
 
 
 
7caf1c9
6ce6322
 
7caf1c9
6ce6322
 
 
 
 
 
 
 
 
7caf1c9
6ce6322
114c977
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash
set -e

MODELS_DIR="/data/models"
LLAMA_PORT=8080

mkdir -p "$MODELS_DIR"
mkdir -p /data/webui

# نظّف إشارات التشغيل السابقة عند إعادة التشغيل
rm -f /tmp/launch_signal /tmp/selected_model /tmp/selected_mmproj

# ===================================================================
# المرحلة الأولى: واجهة إعداد النموذج على المنفذ 7860
# تظهر للمستخدم قائمة النماذج المحفوظة ونموذج تحميل جديد
# ===================================================================
echo ">>> تشغيل واجهة إعداد النموذج على المنفذ 7860..."
python3 /app/model_setup.py

# ===================================================================
# المرحلة الثانية: بعد أن يضغط المستخدم "تشغيل"
# يقرأ الملف المختار ويبدأ llama.cpp
# ===================================================================
MODEL_FILE=$(cat /tmp/selected_model 2>/dev/null || echo "")
MMPROJ_FILE=$(cat /tmp/selected_mmproj 2>/dev/null || echo "")

if [ -z "$MODEL_FILE" ] || [ ! -f "$MODELS_DIR/$MODEL_FILE" ]; then
    echo "!!! لم يتم تحديد نموذج صالح، إعادة التشغيل..."
    exec bash /app/run.sh
fi

echo ">>> النموذج المختار: $MODEL_FILE"

# بناء أمر llama.cpp ديناميكياً (مع أو بدون mmproj)
LLAMA_CMD=(
    python3 -m llama_cpp.server
    --model           "$MODELS_DIR/$MODEL_FILE"
    --host            0.0.0.0
    --port            $LLAMA_PORT
    --n_ctx           8192
    --n_threads       2
    --n_gpu_layers    0
    --chat_format     gemma
    --flash_attn      true
    --use_mmap        true
    --use_mlock       false
    --verbose         false
)

# إضافة mmproj فقط إن وُجد
if [ -n "$MMPROJ_FILE" ] && [ -f "$MODELS_DIR/$MMPROJ_FILE" ]; then
    echo ">>> تفعيل دعم الرؤية (mmproj): $MMPROJ_FILE"
    LLAMA_CMD+=(--clip_model_path "$MODELS_DIR/$MMPROJ_FILE")
fi

echo ">>> تشغيل خادم llama.cpp على المنفذ $LLAMA_PORT..."
"${LLAMA_CMD[@]}" &
LLAMA_PID=$!

# ===================================================================
# انتظر حتى يصبح llama.cpp جاهزاً
# ===================================================================
echo ">>> انتظار جهوزية خادم llama.cpp..."
MAX_WAIT=120
WAITED=0
until curl -sf "http://localhost:$LLAMA_PORT/health" > /dev/null 2>&1; do
    if [ $WAITED -ge $MAX_WAIT ]; then
        echo "!!! فشل تشغيل llama.cpp بعد ${MAX_WAIT} ثانية"
        exit 1
    fi
    # تحقق أن الـ process لا يزال حياً
    if ! kill -0 $LLAMA_PID 2>/dev/null; then
        echo "!!! توقف خادم llama.cpp بشكل غير متوقع"
        exit 1
    fi
    sleep 2
    WAITED=$((WAITED + 2))
done
echo ">>> llama.cpp جاهز (استغرق ${WAITED} ثانية)"

# ===================================================================
# المرحلة الثالثة: تشغيل Open WebUI على المنفذ 7860
# ===================================================================
export OPENAI_API_BASE_URL="http://localhost:$LLAMA_PORT/v1"
export OPENAI_API_KEY="sk-llama-cpp-local"
export ENABLE_OLLAMA_API=false
export ENABLE_OPENAI_API=true
export DATA_DIR=/data/webui
export PORT=7860
export HOST=0.0.0.0

echo ">>> تشغيل Open WebUI على المنفذ 7860..."
cd /app/backend
exec bash start.sh