Docker
Docker هو أسهل أسلوب نشر شبيه بالإنتاج لخادم واحد.
للتثبيت على خادم واحد يمكن الوصول إليه من الإنترنت، ابدأ بـ
النشر البعيد الخاص. لا ينشر قالب Compose الخاص به
أي منافذ للتطبيق، ويستخدم صورة main افتراضيًا، ويضيف حدًا خارجيًا عبر
Cloudflare Access وضوابط للمضيف ونسخًا احتياطية وحدودًا للحاويات.
توفر Work
تكون Work مفعلة افتراضيًا في ملفات Compose بالمستودع. تحتوي الصورة واجهة Docker
لسطر الأوامر، ويربط Compose المسار /var/run/docker.sock، لذلك تكون حاويات مهام Work
شقيقة لحاوية Libre WebUI وتظهر في docker ps على المضيف.
تمنح العملية التي تصل إلى ذلك المقبس تحكمًا بمضيف Docker مكافئًا لصلاحيات root. تفعيل Work افتراضيًا قرار مقصود: فهي ميزة أساسية ولا تعمل من دون الوصول إلى daemon. ونتيجة ذلك أن كل مسؤول في Libre WebUI هو فعليًا مسؤول عن المضيف. خطط وفقًا لذلك:
- أبقِ الحزمة على مضيف تثق مسبقًا بمسؤوليه.
- لا تكشف المنفذ المنشور لشبكة غير موثوقة.
- أزل ربط
/var/run/docker.sockعندما لا تحتاج Work. ستعرض صفحة Work عندها بيئة التشغيل غير متاحة.
على Linux، يملك المقبس مجموعة docker بدل root، لذا يحتاج مستخدم التطبيق غير root
إلى معرّف تلك المجموعة. اضبطه مرة واحدة:
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
اقرأه من خلال حاوية كما في المثال. يعيد مضيف macOS قيمة مختلفة عما تراه الحاوية، لأن Docker Desktop يمرر المقبس عبر VM. وإذا كانت المجموعة خاطئة، تسمّي صفحة Work المشكلة بدل أن تفشل بصمت. راجع Work: مساحات العمل المعزولة.
تنشر معاينات Work وحاسوب Work منافذ عشوائية على واجهة خاصة بالمضيف فقط. ويعمل
Docker Desktop مع القيم الافتراضية في Compose: حلقة المضيف المحلية للربط
وhost.docker.internal لاتصال الخادم الخلفي. أما Docker Engine الأصلي فلا يستطيع
الوصول من حاوية شقيقة إلى مستمع على حلقة المضيف المحلية، لذا اربط المنافذ ببوابة
جسر Docker غير العامة بدلًا من ذلك:
echo "WORK_PREVIEW_BIND=$(docker network inspect bridge \
--format '{{(index .IPAM.Config 0).Gateway}}')" >> .env
echo "WORK_DOCKER_PUBLISHED_HOST=host.docker.internal" >> .env
docker compose up -d --force-recreate libre-webui
تربط ملفات Compose الاسم host.docker.internal عبر host-gateway. ولا تستخدم مطلقًا
WORK_PREVIEW_BIND=0.0.0.0، فذلك ينشر منافذ المهام المؤقتة بلا استيثاق على كل واجهات
المضيف بدل إبقائها خلف الوكيل الموقّع في Libre WebUI.
Ollama المضمّن
يشغّل Libre WebUI وOllama في حزمة Compose واحدة:
docker compose up -d
افتح http://localhost:8080.
يرتبط منفذ WebUI افتراضيًا بواجهة loopback للمضيف. لا تضبط
WEBUI_BIND_ADDRESS=0.0.0.0 إلا إذا كان يجب أن تصل إليه شبكة محلية موثوقة
أو reverse proxy على المضيف، وقيّد المنفذ بجدار حماية المضيف.
يبقى Ollama خاصًا بشبكة Compose. لجعله متاحًا لتطبيقات المضيف على loopback، أضف تجاوز المضيف الصريح:
docker compose -f docker-compose.yml -f docker-compose.ollama-host.yml up -d
لا تضبط OLLAMA_BIND_ADDRESS إلا عندما يجب أن يصل جهاز آخر إلى Ollama،
واحمِ المنفذ بجدار حماية وproxy قادر على المصادقة.
GPU من NVIDIA
استخدم ملف Compose الخاص بـ GPU عندما يستطيع Docker الوصول إلى بيئة تشغيل NVIDIA:
docker compose -f docker-compose.gpu.yml up -d
تحقق من وصول حاوية Ollama إلى GPU إذا ظلت النماذج تعمل على CPU.
Ollama خارجي
استخدم هذا الخيار عندما يعمل Ollama بالفعل على المضيف أو خادم آخر:
docker compose -f docker-compose.external-ollama.yml up -d
تجاوز عنوان Ollama عند الحاجة:
OLLAMA_BASE_URL=http://192.168.1.10:11434 docker compose -f docker-compose.external-ollama.yml up -d
Work مع مقبس معزول
تربط ملفات Compose القياسية مقبس Docker داخل حاوية Libre WebUI حتى تتمكن Work من تشغيل حاويات المهام؛ ويمنح هذا الربط تحكمًا بمضيف Docker مكافئًا لصلاحيات root. للاحتفاظ بـ Work من دون منح تطبيق الويب المقبس، استخدم نسخة proxy للمقبس:
docker compose -f docker-compose.socket-proxy.yml up -d
يمسك proxy للمقبس على شبكة داخلية بالمسار /var/run/docker.sock ولا يمرر
إلا أقسام API التي تستخدمها Work (الحاويات والصور والوحدات والشبكات وexec والمعلومات).
يرفض proxy نقاط Swarm والأسرار والضبط والبناء والنظام. يصل Libre WebUI إليه عبر
DOCKER_HOST=tcp://docker-socket-proxy:2375؛ فلا ربط للمقبس ولا
DOCKER_GID، وتعمل الطرفية التفاعلية وتشخيصات النظام بلا تغيير. راجع
مستند مساحات العمل لمعرفة ما يغطيه هذا الحد وما لا يغطيه.
استمرارية البيانات
يخزّن Libre WebUI بيانات الخادم الخلفي في /app/backend/data داخل الحاوية. وتربط ملفات Compose هذا المسار بوحدة مسماة.
تستخدم الصورة هذا المسار أيضًا افتراضيًا عند تشغيلها مباشرةً باستخدام
docker run؛ وتبقى ملفات الفحص المؤقت لقاعدة البيانات منفصلة في
/app/backend/temp. اربط /app/backend/data كلما كان من المحتمل إعادة
إنشاء الحاوية.
اضبط أسرارًا ثابتة في الإنتاج:
JWT_SECRET=replace-with-a-long-random-secret
ENCRYPTION_KEY=replace-with-64-hex-characters
انسخ وحدة البيانات ومفتاح التشفير احتياطيًا معًا.
قبل إزالة حاوية شُغّلت مباشرةً من صورة أقدم، تأكد من وجود
/app/backend/data/.encryption_key أو سجّل قيمة ENCRYPTION_KEY المضبوطة.
كانت الصور القديمة قد تكتب المفتاح المولّد تلقائيًا في طبقة الحاوية وحدها؛
ويحذف حذف تلك الحاوية المفتاح الوحيد القادر على فك قاعدة بياناتها الدائمة.
إذا كنت تشغّل بيئة مخصصة قادرة على Work، تعيش ملفات مهامها في وحدات Docker
مسماة منفصلة ولا تشملها نسخة /app/backend/data الاحتياطية المعتادة.
الوصول العام
تربط ملفات Compose في المستودع WebUI بواجهة loopback وتضبط CORS_ORIGIN
مباشرةً. لا تستبدل قيمة في shell أو ملف .env تلك القيمة الحرفية. عدّل
إدخال libre-webui.environment أو احفظ تجاوزًا صريحًا باسم
compose.origin.yml:
services:
libre-webui:
environment:
CORS_ORIGIN: https://your-domain.example
BASE_URL: https://your-domain.example
طبّق التجاوز مع ملف Compose المختار من المستودع:
docker compose -f docker-compose.yml -f compose.origin.yml up -d
ثم ضع Libre WebUI خلف HTTPS باستخدام reverse proxy أو موازن حمل للمنصة.
اضبط WEBUI_BIND_ADDRESS على الواجهة الدقيقة التي يحتاجها proxy؛ ولا تنشر
المنفذ على كل الواجهات إلا إذا تطلب جدار الحماية ذلك.
يقدّم الخادم بالفعل الواجهة الأمامية المبنية بكفاءة: تُرسل الحزم ذات البصمة تحت
/js/ و/assets/ مضغوطة بـ brotli أو gzip مع عمر تخزين مؤقت immutable لمدة سنة،
بينما يُوسم كل من index.html وملف service worker بـ no-cache حتى تُلتقط الإصدارة
الجديدة عند التحميل التالي. ولا يحتاج proxy إلى إعادة ضغط هذه المسارات أو تخزينها
مؤقتًا؛ مرّر Accept-Encoding كما هو.
أوامر مفيدة
docker compose ps
docker compose logs -f libre-webui
docker compose logs -f ollama
docker compose pull
docker compose up -d