#!/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