تشغيل Ollama داخل Podman دون root على VPS
شغّل Ollama بحاوية Podman دون root على VPS عبر مستخدم مخصص وQuadlet وlingering، مع حل SELinux، وتشغيل الحاوية بعد إعادة التشغيل وإغلاق المنفذ 11434.
تشغيل Ollama باستخدام Podman دون root على VPS
لتشغيل Ollama باستخدام Podman دون root على خادم، يجب تحقق خمسة شروط قد لا يتناولها الشرح المخصص لأجهزة سطح المكتب. يملك مستخدم مخصص وغير مميّز الحاوية. ويكون خيار lingering مفعّلاً لهذا المستخدم، لذلك تواصل الحاوية عملها بعد تسجيل الخروج. ويسلّم ملف Quadlet الحاوية إلى systemd، فتعود إلى العمل بعد إعادة التشغيل. ويحمل مجلد النماذج تسمية SELinux المناسبة على التوزيعات التي تفرضها. وتستمع API على loopback فقط، وتصل إليها عبر نفق SSH (secure shell).
Ollama خادم لنماذج اللغة الكبيرة (LLM). يخزّن أوزان النماذج على القرص، ويحمّلها إلى الذاكرة، ويجيب عن طلبات HTTP على المنفذ 11434. لا يتضمن تسجيل دخول أو مفتاح API أو حسابات مستخدمين، لذلك تكون الشبكة وسيلة التحكم الوحيدة في الوصول. يشغّل Podman الحاويات دون daemon ودون root، لذلك يبدأ أي شيء يخرج من الحاوية بامتيازات مستخدم عادي وغير مميّز. إذا أردت الاطلاع أولاً على مقارنة بيئة التشغيل، فاقرأ الفرق بين Podman وDocker على VPS. وإذا كنت تفضّل تجاوز الحاويات بالكامل، فإن تثبيت Ollama مباشرة على VPS مسار أقصر.
توفّر SSD Nodes نظام Fedora ضمن صورها، ويأتي Fedora مع Podman وSELinux (security-enhanced Linux) مضمّنين افتراضياً. تعمل كل الأوامر أدناه على أي توزيعة تتضمن Podman 5 أو أحدث.
لماذا يحتاج إصدار الحاسوب المحمول إلى تغييرات على الخادم
نشرت Fedora Magazine في 5 August 2026 شرحاً واضحاً لهذه الحزمة بعنوان: تشغيل Ollama محلياً باستخدام Podman على Fedora Linux، بقلم Yazan Monshed. ويُعد ذلك مدخلاً جيداً إلى الأدوات خلال الساعة الأولى. لكنه يستهدف حاسوباً محمولاً أيضاً، وتتصرف أربعة من خياراته بشكل مختلف على جهاز يملك عنوان IP عاماً.
- يبدأ الحاوية باستخدام
podman run -dفقط. لا تعود الحاوية التي تبدأ يدوياً بعد إعادة التشغيل، لأنه لم يُطلب من أي جهة تشغيلها. - يستخدم الوسم المتغير
ollama/ollama. على الحاسوب المحمول تلاحظ يوم تغير السلوك. أما على الخادم، فأول علامة قد تكون برنامجاً نصياً توقف عن العمل أثناء الليل. - ينشر الخدمة باستخدام
-p 11434:11434، الذي يربطها بكل واجهة. خلف موجّه منزلي، لا تكون الخدمة قابلة للوصول من الإنترنت. أما على VPS، فتصبح واجهة API عامة للاستدلال بلا كلمة مرور. - تعمل الخدمة باستخدام حساب تسجيل الدخول الخاص بك. على الخادم، يجب ألا يملك الحساب الذي يملك الحاوية أي شيء آخر، حتى تصل عملية الخروج من الحاوية إلى مجلد home فارغ.
لا يعني أي من ذلك أن الإعداد الأصلي خاطئ بالنسبة إلى الجهاز الذي كُتب له. كل بند هو مجرد قرار تعيد مراجعته عندما يكون الجهاز قابلاً للوصول من كل مكان ولا يجلس أحد أمامه.
أنشئ المستخدم غير المميّز وتحقق من subuid
يعيّن Rootless Podman معرّفات المستخدمين الداخلية للحاوية (UID) إلى نطاق من المعرّفات غير المستخدمة على الخادم المضيف. يُحدَّد هذا النطاق في /etc/subuid و/etc/subgid. من دون هذا النطاق، لا يمكن للحاويات التي تعمل دون root أن تبدأ إطلاقاً.
sudo dnf install -y podman # or: sudo apt install -y podman
sudo useradd --create-home --shell /bin/bash --comment "Ollama container owner" ollama
sudo passwd --lock ollama
grep ollama /etc/subuid /etc/subgidيجب أن يطبع grep سطرين، سطراً من كل ملف، ويذكر كل سطر نطاقاً يتكوّن من 65536 معرّفاً:
/etc/subuid:ollama:100000:65536
/etc/subgid:ollama:100000:65536سيختلف رقم البداية لديك، وهذا طبيعي. إذا لم يطبع grep أي شيء، فهذا يعني أن useradd لم يخصّص نطاقاً، وسيفشل أول أمر podman يُنفَّذ باسم ذلك المستخدم كما يلي:
Error: cannot find UID/GID for user ollama: no subuid ranges found for user "ollama" in /etc/subuidخصّص نطاقاً لا يملكه أي مستخدم آخر، ثم أبلغ Podman بأن تعيينه السابق أصبح قديماً:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 ollama
sudo -iu ollama podman system migrateيعني قفل كلمة المرور أنه لا يمكن لأي شخص تسجيل الدخول مباشرةً باسم ollama. يمكنك الوصول إلى الحساب من المستخدم الإداري لديك باستخدام sudo -iu ollama.
فعّل وضع البقاء حتى تستمر الخدمة بعد تسجيل الخروج
تبدأ نسخة systemd الخاصة بالمستخدم عادةً عند تسجيل الدخول وتتوقف عند تسجيل الخروج، ويُحذف معها /run/user/<uid>. تتوقف كل حاوية rootless يملكها ذلك المستخدم في اللحظة نفسها. يحافظ وضع البقاء على تشغيل نسخة المستخدم من دون جلسة مرتبطة بها.
sudo loginctl enable-linger ollama
loginctl show-user ollama --property=Lingerيجب أن يطبع ذلك Linger=yes. فعّله قبل إنشاء الوحدة، لأن الدليل الذي تحتاج إليه الوحدة، /run/user/<uid>، لا يوجد إلا بعد تفعيل وضع البقاء.
هناك خطوة أخرى لا يتوقعها أحد. يمنحك sudo -iu ollama shell، لكنه لا ينشئ session bus، لذلك يفشل systemctl --user فوراً:
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not definedيبحث systemd عن user bus في $XDG_RUNTIME_DIR/bus، ولا يضبط sudo -i هذا المتغير. اضبطه يدوياً في كل admin shell تدير منه هذه الخدمة:
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
systemctl --user statusمكان حفظ ملفات النماذج الثنائية، وكيفية تقدير مساحة القرص
يكتب Ollama أوزان النماذج في /root/.ollama/models داخل الحاوية. اربط دليلاً من مجلد المستخدم الرئيسي بهذا المسار، وستُحفظ الملفات في مكان يمكنك قياسه: /home/ollama/ollama-data/models. تُحفظ الملفات الثنائية في models/blobs كملفات معنونة بالمحتوى، بينما يحتوي models/manifests على الفهرس الصغير الذي يعرّفها. إذا استخدمت وحدة تخزين مُسمّاة بدلاً من ذلك، كما في مقالة Fedora Magazine، فستجد البنية نفسها ضمن /home/ollama/.local/share/containers/storage/volumes/<volume>/_data.
حدّد مساحة القرص قبل تنزيل أي شيء. تعطي أحجام التنزيل المنشورة الحد الأدنى المطلوب.
The data behind this chart
[
{
"label": "gemma3:4b",
"download_gb": 3.3
},
{
"label": "mistral:7b",
"download_gb": 4.4
},
{
"label": "qwen3:8b",
"download_gb": 5.2
},
{
"label": "gemma3:12b",
"download_gb": 8.1
},
{
"label": "qwen3:14b",
"download_gb": 9.3
},
{
"label": "gemma3:27b",
"download_gb": 17
},
{
"label": "qwen3:30b",
"download_gb": 19
}
]جميع الصفوف وعددها 7 هي أرقام منشورة على ollama.com/library، وليست أحجاماً مقاسة على قرص. أصغر وسم هنا، gemma3:4b، يتطلب تنزيل 3.3 GB. أما الأكبر، qwen3:30b، فيتطلب تنزيل 19 GB. تُخزَّن صورة الحاوية نفسها فوق ذلك ضمن مساحة تخزين Podman الخاصة، لذا تحقّق من الرقمين معاً باستخدام podman system df وdf -h /home. يحتاج النموذج أيضاً إلى مقدار من RAM يقارب حجم ملفه أثناء تحميله، إضافةً إلى مساحة لنافذة السياق؛ لذلك لن يعمل نموذج حجمه 19 GB على VPS بسعة 16 GB.
ثبّت وسم الصورة، واستخدم اسم السجل الكامل
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
mkdir -p ~/ollama-data ~/.config/containers/systemd
podman pull docker.io/ollama/ollama:0.32.9استخدم وسم إصدار منشور، وهو 0.32.9 اعتباراً من August 2026، وليس latest. يعني تثبيت الوسم أن إعادة التشغيل عند 04:00 تمنحك الملف التنفيذي نفسه الذي اختبرته، ولذلك فإن أي تغيير في السلوك يكون ناتجاً عن تغيير أجريته أنت. ينشر Docker Hub أيضاً وسمي -rc و-rocm للإصدارات نفسها؛ اختر الوسم العادي ما لم تكن لديك وحدة معالجة رسومات AMD.
اكتب مضيف السجل أيضاً. في Fedora، لا تتوفر للاسم المختصر في وحدة systemd طرفية لعرض مطالبة، فتفشل الوحدة بالرسالة التالية:
Error: short-name "ollama/ollama" did not resolve to an alias and no unqualified-search registries are definedيُعد السحب يدوياً أولاً اختيارياً، لكنه مفيد لأنه ينقل تنزيل الملف ذي الحجم البالغ عدة غيغابايت خارج مهلة بدء الوحدة.
وحدة Quadlet التي تبقى بعد إعادة التشغيل
Quadlet هو مولّد systemd الخاص بـPodman. تنشئ ملف .container، ويحوّله systemd إلى خدمة عند الإقلاع، ولا تعود podman generate systemd مطلوبة. احفظه باسم /home/ollama/.config/containers/systemd/ollama.container، على أن يملكه مستخدم ollama.
[Unit]
Description=Ollama API (rootless)
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/ollama/ollama:0.32.9
ContainerName=ollama
PublishPort=127.0.0.1:11434:11434
Volume=/home/ollama/ollama-data:/root/.ollama:Z
Environment=OLLAMA_KEEP_ALIVE=30m
Environment=OLLAMA_MAX_LOADED_MODELS=1
[Service]
Restart=always
TimeoutStartSec=900
[Install]
WantedBy=default.targetيحدّد اسم الملف اسم الخدمة، لذلك تصبح ollama.container هي ollama.service.
systemctl --user daemon-reload
systemctl --user start ollama.service
systemctl --user status ollama.serviceيجب أن يعرض status القيمة active (running). لا تشغّل systemctl --user enable ollama.service. لا توجد الوحدة كملف على القرص، لذلك يرفضها systemd:
Failed to enable unit: Unit file /run/user/1001/systemd/generator/ollama.service is transient or generated.ينفّذ القسم [Install] هذه المهمة بالفعل. ينشئ Quadlet رابط التشغيل عند الإقلاع بنفسه أثناء daemon-reload، ولذلك لا يمكن الاستغناء عن ذلك الأمر. يضبط TimeoutStartSec=900 مهلة بدء أولية ما زالت تحتاج إلى سحب الصورة، لأن المهلة الافتراضية البالغة 90 ثانية لا تكفي لتنزيل حجمه 2 غيغابايت، وسيُنهي systemd عملية البدء باعتبارها فاشلة. يُبقي OLLAMA_KEEP_ALIVE=30m نموذجاً في الذاكرة بين الطلبات بدلاً من إلغاء تحميله بعد خمس دقائق؛ وترد المفاضلات في إبقاء نموذج Ollama محمّلاً في الذاكرة. إذا كانت بعض مصطلحات systemd هنا جديدة عليك، يشرح كيفية عمل خدمات ومؤقتات systemd على VPS الوحدات نفسها.
لماذا يعيد مجلد النماذج خطأ رفض الإذن في SELinux
في Fedora وRHEL وRocky وAlmaLinux، يكون SELinux في وضع الإنفاذ افتراضياً. تعمل عملية الحاوية ضمن النطاق container_t، بينما يكون المجلد الموجود في الدليل الرئيسي للمستخدم معنّوناً بالتصنيف user_home_t. لا تسمح السياسة لأحدهما بالوصول إلى الآخر، لذلك يتعذر على Ollama إنشاء شجرة النماذج، وتخرج الحاوية. يعرض getenforce القيمة Enforcing على هذه الأنظمة، ويُسجَّل الرفض:
sudo ausearch -m avc -ts recentسترى سطراً يذكر النطاق وتصنيف الهدف:
avc: denied { write } for pid=1842 comm="ollama" name="models" dev="vda1" ino=131077 scontext=system_u:system_r:container_t:s0:c214,c827 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir permlisted=0يُعد الأمر :Z في نهاية سطر Volume= هو الإصلاح. فهو يعيد تصنيف دليل المضيف إلى container_file_t، ويضع له فئة MCS خاصة لا تحملها إلا هذه الحاوية. أما :z المكتوب بأحرف صغيرة، فيستخدم تصنيفاً مشتركاً، وهذا ما تريده عندما تقرأ حاويتان الدليل نفسه.
تنبيه بشأن :Z، لأنه مدمّر ويعمل بصمت. تعيد عملية إعادة التصنيف معالجة الأدلة تكرارياً. إذا وجّهته إلى /home/ollama، فستُعاد تسمية كل ملف في ذلك الدليل الرئيسي، مما يعطّل وصول SSH إلى مفاتيح ذلك المستخدم. امنح :Z دائماً دليلاً فرعياً مخصصاً لا يحتوي على أي ملفات أخرى. لا تحتاج وحدات التخزين المسماة إلى ذلك، لأن Podman يضع التصنيفات الصحيحة عليها عند إنشائها. إذا احتجت إلى الصورة الأوسع، يشرح أساسيات SELinux للخادم السياقات وقيم boolean. في Ubuntu وDebian، يُستخدم AppArmor بدلاً من ذلك، ويكون :Z بلا تأثير هناك، وتركه في الوحدة لا يسبب مشكلة.
إغلاق المنفذ 11434 والوصول إلى API عبر SSH
يربط PublishPort=127.0.0.1:11434:11434 جانب المضيف بعنوان loopback. تأكد من ذلك:
ss -ltnp | grep 11434
curl http://127.0.0.1:11434يجب أن يُظهر خرج ss القيمة 127.0.0.1:11434. تعني 0.0.0.0:11434 أو *:11434 أن المنفذ مفتوح على الإنترنت، ويجب أن يستجيب curl بـOllama is running.
حدّد بدقة الجانب الذي تربطه بالعنوان. العنوان في PublishPort هو عنوان المضيف. داخل الحاوية، يجب أن يواصل Ollama الاستماع على جميع الواجهات، وهو الإعداد الافتراضي للصورة. يؤدي ضبط Environment=OLLAMA_HOST=127.0.0.1 إلى ربط Ollama بعنوان loopback الخاص بالحاوية، بينما يوجّه Podman حركة المرور المنشورة إلى عنوان شبكة الحاوية بدلاً من ذلك. لذلك يُرفض كل طلب، حتى من المضيف.
يعرّضك فتح 11434 لخطرين. لا يوفّر Ollama مصادقة، لذلك يستطيع أي شخص يصل إلى المنفذ عرض نماذجك عبر /api/tags، وتشغيل الاستدلال على CPU لديك وعلى حصة النطاق الترددي لديك عبر /api/generate، وسحب نماذج جديدة إلى القرص، وحذف النماذج الموجودة لديك. ثانياً، يرسل HTTP غير المشفّر إلى منفذ بعيد المطالبات والنتائج بنص واضح، لذلك تستطيع كل آلة على طول المسار قراءتها. يختفي المشكلان إذا لم يغادر المنفذ الجهاز.
من محطة العمل لديك، نفّذ إعادة توجيه للمنفذ عبر SSH:
ssh -N -L 11434:127.0.0.1:11434 you@vps.example.comالآن يشير http://127.0.0.1:11434 على حاسوبك المحمول إلى Ollama الموجود على الخادم، داخل تشفير جلسة SSH. إذا كان حاسوبك المحمول يشغّل Ollama بالفعل، يفشل الربط المحلي مع bind [127.0.0.1]:11434: Address already in use. استخدم -L 11435:127.0.0.1:11434، ووجّه عميلك إلى 11435.
عندما يحتاج عميل المتصفح إلى ذلك، ضع reverse proxy محمياً بكلمة مرور أمامه بدلاً من ذلك. يتكوّن تعريف الموقع في Caddy من 4 أسطر، ويطبع caddy hash-password تجزئة bcrypt التي يحتاج إليها:
ollama.example.com {
basic_auth {
you $2a$14$replace_with_the_generated_hash
}
reverse_proxy 127.0.0.1:11434
}يحصل Caddy على شهادة عبر TLS (أمان طبقة النقل) تلقائياً، لذلك تكون حركة المرور مشفّرة. اختبر عميلك أولاً: لا تحتوي أدوات كثيرة تتصل بـOllama على حقل لرأس Authorization، وستفشل أمام basic auth مع 401 Unauthorized مجرد. لا يواجه نفق SSH هذه المشكلة، ولذلك نوصي به افتراضياً هنا.
سحب نموذج والتحقق من المسار كاملاً
podman exec -it ollama ollama pull gemma3:4b
curl -s http://127.0.0.1:11434/api/tags
curl -s http://127.0.0.1:11434/api/generate -d '{"model":"gemma3:4b","prompt":"Reply with the single word: ready","stream":false}'
du -sh ~/ollama-data/modelsيعرض /api/tags قائمة JSON تتضمن gemma3:4b. ويعرض /api/generate كائن JSON يحتوي على الحقل response، بعد توقف مؤقت ريثما تُحمَّل الأوزان من القرص. يجب أن يعرض du رقماً قريباً من حجم التنزيل المنشور. ثم أثبت الجزء الذي يدور حوله هذا الدليل بأكمله:
sudo reboot
# reconnect, then:
sudo -iu ollama
export XDG_RUNTIME_DIR=/run/user/$(id -u)
systemctl --user is-active ollama.serviceيعني active أن العملية ما زالت قائمة، وأن قسم [Install] وdaemon-reload أدّيا وظيفتهما. يعني inactive أن أحد الأجزاء الثلاثة مفقود.
أوضاع الفشل، مع النصوص التي ستظهر لك
اختفاء الحاوية بعد إعادة التشغيل. تحقّق من loginctl show-user ollama --property=Linger أولاً، لأن غياب Linger=yes يمنع مثيل systemd الخاص بالمستخدم من البدء عند الإقلاع. إذا كان lingering مفعّلاً، أو كان قسم [Install] مفقوداً من ملف .container، أو عدّلت الملف ولم تشغّل systemctl --user daemon-reload.
Error: statfs /home/ollama/ollama-data: no such file or directory. يجب أن يكون مصدر bind mount موجوداً قبل بدء الحاوية. لا ينشئ Podman أدلة المضيف نيابةً عنك. شغّل mkdir -p ~/ollama-data بصفته المستخدم ollama.
فشل البدء بعد 90 ثانية. يعرض journalctl --user -u ollama.service رسالة Start operation timed out. Terminating. لأن سحب الصورة كان لا يزال قيد التنفيذ. اسحب الصورة يدوياً، أو أبقِ TimeoutStartSec=900.
بدء الحاوية ثم خروجها. يوضّح podman logs ollama وsudo ausearch -m avc -ts recent معاً ما إذا كانت المشكلة في تسمية SELinux. يعني سجل AVC الذي يذكر container_t وuser_home_t أن :Z مفقود.
رفض الطلبات من المضيف. يشير curl: (7) Failed to connect to 127.0.0.1 port 11434: Connection refused مع الخدمة active عادةً إلى ضبط OLLAMA_HOST على عنوان loopback داخل الحاوية. أزل ذلك السطر.
بطء التوليد جداً، أو إنهاء الحاوية. من دون GPU، يعمل الاستدلال على CPU، ويكون النموذج الكبير بطيئاً بطبيعته. إذا توقفت الحاوية أثناء الطلب وظهر signal: killed في السجلات، فهذا يعني أن kernel out-of-memory killer أنهى العملية. اختر tag أصغر من المخطط أعلاه.
تحديث صورة مثبتة
يعني التثبيت أن التحديثات عملية تنفذها أنت، وليست شيئاً يحدث تلقائياً. عدّل Image= في ollama.container، ثم أعد التحميل وأعد التشغيل:
systemctl --user daemon-reload
systemctl --user restart ollama.service
podman exec ollama ollama --versionتوجد النماذج في bind mount، لذلك تبقى دون تغيير عند تغيير الصورة. يوجد AutoUpdate=registry في قسم [Container] للمستخدمين الذين يشغّلون tag متحركاً، لكنه لا يفيد مع tag إصدار ثابت، لأن محتوى ذلك الـtag لا يتغير أبداً. أنشئ نسخة احتياطية من /home/ollama/ollama-data/models/manifests وملف .container، وتجاوز blobs؛ فهي كبيرة، ويعيد ollama pull جلبها على جهاز جديد.
FAQ
لماذا تتوقف حاوية Podman التي تعمل دون root عند تسجيل الخروج؟
يُفكَّك مثيل systemd الخاص بالمستخدم ودليل /run/user/<uid> عند انتهاء آخر جلسة لذلك المستخدم، وتتوقف معه كل حاوية تعمل دون root. شغّل sudo loginctl enable-linger ollama وتأكد من أن loginctl show-user ollama --property=Linger يطبع Linger=yes. فعّل ميزة lingering قبل إنشاء وحدة Quadlet، لأن دليل وقت التشغيل الذي تحتاج إليه الوحدة لا يوجد إلا بعد تفعيل lingering.
هل أحتاج إلى تسميات SELinux في دليل نماذج Ollama؟
نعم، على Fedora وRHEL وRocky وAlmaLinux، إذا ربطت دليلاً من المضيف. تعمل الحاوية ضمن النطاق container_t، بينما تكون تسمية الدليل الموجود في المجلد المنزلي user_home_t، لذلك يُرفض الوصول للكتابة وتخرج Ollama. أضف :Z إلى السطر Volume=، واستخدم دليلاً فرعياً مخصصاً له، لأن إعادة التسمية تطبق بشكل تكراري، ولأن توجيه :Z إلى مجلد منزلي كامل يعطّل الوصول إلى مفاتيح SSH لذلك المستخدم. يضع Podman التسميات الصحيحة على وحدات التخزين المسماة، ولا تحتاج إلى أي إعداد إضافي.
ما مقدار مساحة القرص التي يحتاج إليها نموذج Ollama؟
ابدأ من حجم التنزيل المنشور على ollama.com/library، إذ يتراوح من 3.3 GB للنموذج gemma3:4b إلى 19 GB للنموذج qwen3:30b. أضف صورة Podman إلى ذلك، واترك مساحة احتياطية، لأن النموذج الثاني لا يستبدل النموذج الأول على القرص. تحقّق من df -h /home قبل السحب، ومن du -sh ~/ollama-data/models بعده. وخطّط لذاكرة RAM بالطريقة نفسها: يحتاج النموذج إلى ما يقارب حجم ملفه من الذاكرة أثناء تحميله، إضافةً إلى نافذة السياق.
هل من الآمن إتاحة المنفذ 11434 على VPS؟
لا. تأتي Ollama من دون أي نوع من المصادقة، لذلك يمكن لأي شخص يصل إلى المنفذ عرض نماذجك وحذفها وسحب نماذج جديدة إلى القرص وتشغيل الاستدلال باستخدام CPU وسعة النطاق الترددي المتاحة لك. كما يرسل HTTP العادي عبر الإنترنت كل مطالبة وكل نتيجة بنص واضح. اربط جانب المضيف بـ 127.0.0.1 باستخدام PublishPort=127.0.0.1:11434:11434، وتأكد من ذلك عبر ss -ltnp | grep 11434، ثم صِل إليه عبر نفق SSH أو Reverse Proxy يطلب كلمة مرور.