Docker على Linux/macOS
في هذا الدليل، سوف تقوم بنشر MyEMS باستخدام Docker على Linux (أو macOS).
المتطلبات الأساسية
- تثبيت docker و npm على المضيف (host).
- تثبيت خادم MySQL.
- إمكانية الاتصال بقاعدة بيانات MySQL من المضيف الذي يعمل عليه محرك Docker.
- متطلبات الأجهزة: لا تقل عن 4 جيجابايت من الذاكرة العشوائية (RAM) و 20 جيجابايت من مساحة التخزين (للقاعدة البيانات وحاويات Docker).
استنساخ كود المصدر:
cd ~
git clone https://github.com/myems/myems
الخطوة 1: قاعدة البيانات
انظر إلى قاعدة البيانات
الخطوة 2: myems-api
في هذا القسم، سوف تقوم بتثبيت myems-api على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-api /
cd /myems-api
- إنشاء ملف .env بناءً على ملف example.env
قم يدوياً باستبدال 127.0.0.1 بعنوان IP الفعلي للمضيف (HOST).
cp example.env .env
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-api .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-api .
- تشغيل حاوية Docker
على المضيف، أنشئ مجلد ملفات تحميل مشترك (share upload file folder):
mkdir /myems-upload
أنشئ حاوية، ربط المجلد المشترك بالحاوية، وكذلك ربط ملف .env بالحاوية:
docker run -d -p 8000:8000 -v /myems-upload:/var/www/myems-admin/upload -v /myems-api/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-api myems/myems-api
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-p نشر منفذ (منافذ) الحاوية على المضيف، 8000:8000 (مضيف:حاوية) ربط منفذ 8000 (يمين) للحاوية بمنفذ TCP 8000 (يسار) على جهاز المضيف.
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن ت كون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
المسار المطلق قبل النقطتين (:) هو للمسار على المضيف وقد يختلف في نظامك. المسار المطلق بعد النقطتين (:) هو للمسار في الحاوية ولا يمكن تغييره. من خلال تمرير .env كمعلمة ربط الملفات (bind-mount parameter)، يمكنك تغيير قيم التكوين لاحقاً. إذا قمت بتغيير ملف .env، أعد تشغيل الحاوية لجعل التغيير نافذاً.
إذا كنت تريد هجرة الصورة إلى جهاز كمبيوتر آخر،
- تصدير الصورة إلى ملف tar
docker save --output myems-api.tar myems/myems-api
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-api.tar
الخطوة 3: myems-admin
في هذا القسم، سوف تقوم بتثبيت myems-admin على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-admin /
cd /myems-admin
قم يدوياً باستبدال 127.0.0.1:8000 في nginx.conf بعنوان IP الفعلي للمضيف (HOST) ومنفذ myems-api
nano nginx.conf
proxy_pass http://127.0.0.1:8000/;
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-admin .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-admin .
- تشغيل حاوية Docker
على المضيف، أنشئ مجلد ملفات تحميل مشترك (share upload file folder):
mkdir /myems-upload
أنشئ حاوية، ربط مجلد ملفات التحميل المشترك بالحاوية وكذلك ربط nginx.conf
docker run -d -p 8001:8001 -v /myems-upload:/var/www/myems-admin/upload -v /myems-admin/nginx.conf:/etc/nginx/nginx.conf:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-admin myems/myems-admin
-
-d تشغيل الحاو ية في الخلفية وطباعة معرف الحاوية (container ID)
-
-p نشر منفذ (منافذ) الحاوية على المضيف، 8001:8001 (مضيف:حاوية) ربط منفذ 8001 (يمين) للحاوية بمنفذ TCP 8001 (يسار) على جهاز المضيف.
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
إذا كنت تريد هجرة الصورة إلى جهاز كمبيوتر آخر،
- تصدير الصورة إلى ملف tar
docker save --output myems-admin.tar myems/myems-admin
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-admin.tar
الخطوة 4: myems-modbus-tcp
في هذا القسم، سوف تقوم بتثبيت myems-modbus-tcp على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-modbus-tcp /
cd /myems-modbus-tcp
- إنشاء ملف .env بناءً على ملف example.env
قم يدوياً باستبدال 127.0.0.1 بعنوان IP الفعلي للمضيف (HOST).
cp example.env .env
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-modbus-tcp .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-modbus-tcp .
- تشغيل حاوية Docker (تشغيل كمتسلسل سوبر (superuser))
docker run -d -v /myems-modbus-tcp/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-modbus-tcp myems/myems-modbus-tcp
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
المسار المطلق قبل النقطتين (:) هو للمسار على المضيف وقد يختلف في نظامك. المسار المطلق بعد النقطتين (:) هو للمسار في الحاوية ولا يمكن تغييره. من خلال تمرير .env كمعلمة ربط الملفات (bind-mount parameter)، يمكنك تغيير قيم التكوين لاحقاً. إذا قمت بتغيير ملف .env، أعد تشغيل الحاوية لجعل التغيير نافذاً.
- هجرة حاوية Docker
للهجرة إلى جهاز كمبيوتر آخر،
- تصدير الصورة إلى ملف tar
docker save --output myems-modbus-tcp.tar myems/myems-modbus-tcp
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-modbus-tcp.tar
الخطوة 5: myems-cleaning
في هذا القسم، سوف تقوم بتثبيت myems-cleaning على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-cleaning /
cd /myems-cleaning
- إنشاء ملف .env بناءً على ملف example.env
قم يدوياً باستبدال 127.0.0.1 بعنوان IP الفعلي للمضيف (HOST).
cp example.env .env
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-cleaning .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل ال ذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-cleaning .
- تشغيل حاوية Docker (تشغيل كمتسلسل سوبر (superuser))
docker run -d -v /myems-cleaning/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-cleaning myems/myems-cleaning
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
المسار المطلق قبل النقطتين (:) هو للمسار على المضيف وقد يختلف في نظامك. المسار المطلق بعد النقطتين (:) هو للمسار في الحاوية ولا يمكن تغييره. من خلال تمرير .env كمعلمة ربط الملفات (bind-mount parameter)، يمكنك تغيير قيم التكوين لاحقاً. إذا قمت بتغيير ملف .env، أعد تشغيل الحاوية لجعل التغيير نافذاً.
- هجرة حاوية Docker
للهجرة إلى جهاز كمبيوتر آخر،
- تصدير الصورة إلى ملف tar
docker save --output myems-cleaning.tar myems/myems-cleaning
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-cleaning.tar
الخطوة 6: myems-normalization
في هذا القسم، سوف تقوم بتثبيت myems-normalization على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-normalization /
cd /myems-normalization
- إنشاء ملف .env بناءً على ملف example.env
قم يدوياً باستبدال 127.0.0.1 بعنوان IP الفعلي للمضيف (HOST).
cp example.env .env
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-normalization .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-normalization .
- تشغيل حاوية Docker (تشغيل كمتسلسل سوبر (superuser))
docker run -d -v /myems-normalization/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-normalization myems/myems-normalization
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
المسار المطلق قبل النقطتين (:) هو للمسار على المضيف وقد يختلف في نظامك. المسار المطلق بعد النقطتين (:) هو للمسار في الحاوية ولا يمكن تغييره. من خلال تمرير .env كمعلمة ربط الملفات (bind-mount parameter)، يمكنك تغيير قيم التكوين لاحقاً. إذا قمت بتغيير ملف .env، أعد تشغيل الحاوية لجعل التغيير نافذاً.
- هجرة حاوية Docker
للهجرة إلى جهاز كمبيوتر آخر,
- تصدير الصورة إلى ملف tar
docker save --output myems-normalization.tar myems/myems-normalization
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-normalization.tar
الخطوة 7: myems-aggregation
في هذا القسم، سوف تقوم بتثبيت myems-aggregation على Docker.
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-aggregation /
cd /myems-aggregation
- إنشاء ملف .env بناءً على ملف example.env
cp example.env .env
قم يدوياً باستبدال 127.0.0.1 بعنوان IP الفعلي للمضيف (HOST).
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-aggregation .
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-aggregation .
- تشغيل حاوية Docker (تشغيل كمتسلسل سوبر (superuser))
docker run -d -v /myems-aggregation/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-aggregation myems/myems-aggregation
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدارات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
المسار المطلق قبل النقطتين (:) هو للمسار على المضيف وقد يختلف في نظامك. المسار المطلق بعد النقطتين (:) هو للمسار في الحاوية ولا يمكن تغييره. من خلال تمرير .env كمعلمة ربط الملفات (bind-mount parameter)، يمكنك تغيير قيم التكوين لاحقاً. إذا قمت بتغيير ملف .env، أعد تشغيل الحاوية لجعل التغيير نافذاً.
-
هجرة حاوية Docker
-
تصدير الصورة إلى ملف tar
docker save --output myems-aggregation.tar myems/myems-aggregation
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-aggregation.tar
الخطوة 8: myems-web
في هذا القسم، سوف تقوم بتثبيت myems-web على Docker.
- تعديل ملف config.js:
احصل على mapboxToken في https://mapbox.com ثم اضبط showOnlineMap على true. إذا كنت تريد إيقاف ميزة الخريطة عبر الإنترنت، اضبط showOnlineMap على false
cd myems/myems-web
nano src/config.js
- تعديل ملف nginx.conf:
استبدل 127.0.0.1:8000 في nginx.conf بعنوان IP الفعلي للمضيف (HOST) ومنفذ myems-api
cd myems/myems-web
nano nginx.conf
- نسخ كود المصدر إلى الدليل الجذري
cp -r myems/myems-web /
cd /myems-web
يمكنك تجاهل الأمر 'npm run build' في هذا القسم بأمان، لأنه يتم بناؤه في ملف Dockerfile
- بناء الصورة (Image) من كود المصدر
docker build -t myems/myems-web .
docker image prune -f
للبناء لعدة منصات وليس فقط للهندسة المعمارية ونظام التشغيل الذي يقوم المستخدم الذي يُطلق الأمر بالبناء بتشغيله. يمكنك استخدام buildx وضبط العلم --platform لتحديد المنصة الهدف للناتج من البناء، (مثال، linux/amd64، linux/arm64، أو darwin/amd64).
docker buildx build --platform=linux/amd64 -t myems/myems-web .
docker image prune -f
- تشغيل حاوية Docker
على المضيف، ربط nginx.conf
docker run -d -p 80:80 -v /myems-web/nginx.conf:/etc/nginx/nginx.conf:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-web myems/myems-web
-
-d تشغيل الحاوية في الخلفية وطباعة معرف الحاوية (container ID)
-
-p نشر منفذ (منافذ) الحاوية على المضيف، 80:80 (مضيف:حاوية) ربط منفذ 80 (يمين) للحاوية بمنفذ TCP 80 (يسار) على جهاز المضيف.
-
-v إذا كنت تستخدم -v أو --volume لربط ملف أو دليل لم يكن موجوداً على مضيف Docker، سيقوم -v بإنشاء النقطة النهائية لك. يتم إنشاؤه دائمًا كدليل. الخيار ro، إذا كان موجوداً، يسبب ربط الملفات (bind mount) ليتم تثبيته في الحاوية كقراءة فقط (read-only). للإصدار ات v4.7.0 أو الأقدم، استخدم '/code/.env' بدلاً من '/app/.env'.
-
--log-opt max-size=2m الحجم الأقصى للسجل (log) قبل أن يتم تدويره. عدد صحيح موجب بالإضافة إلى معامل يمثل وحدة القياس (k، m، أو g).
-
--log-opt max-file=2 العدد الأقصى لملفات السجل التي يمكن أن تكون موجودة. إذا تسبب تدوير السجلات في إنشاء ملفات زائدة، يتم حذف أقدم ملف. عدد صحيح موجب.
-
--restart سياسة إعادة التشغيل لتطبيقها عند إغلاق الحاوية
-
--name تعيين اسم للحاوية
إذا كنت تريد هجرة الصورة إلى جهاز كمبيوتر آخر،
- تصدير الصورة إلى ملف tar
docker save --output myems-web.tar myems/myems-web
- نسخ ملف tar إلى جهاز كمبيوتر آخر، ثم تحميل الصورة من ملف tar
docker load --input .\myems-web.tar
بعد التثبيت
تهانينا! يمكنك الآن تسجيل الدخول إلى واجهة المستخدم الرسومية (UI) للإدارة MyEMS Admin UI وواجهة المستخدم الرسومية (UI) الويب MyEMS Web UI.
المنافذ الافتراضية
MyEMS Web UI: 80
MyEMS API: 8000
MyEMS Admin UI: 8001
بافتراض أن عنوان الخادم هو 192.168.1.8 (استبدل بالعنوان الفعلي للخادم) الوصول إلى MyEMS Web UI على http://192.168.1.8 (يمكن حذف 80) الوصول إلى MyEMS Admin UI على http://192.168.1.8:8001
كلمات المرور الافتراضية
MyEMS Admin UI
اسم المستخدم:
administrator
كلمة المرور:
!MyEMS1
MyEMS Web UI
اسم المستخدم:
administrator@myems.io
كلمة المرور:
!MyEMS1
استكشاف الأخطاء
بسبب مشاكل شبكة مزود الخدمة الإنترنت (ISP)، قد تواجه سحبًا بطيئًا للصورة. يمكنك استخدام خدمات تسريع طرف ثالث.