الأوامر الشائعة

استخدم هذه الأوامر بانتظام لإدارة حاويات rtCloud. شغّلها من الدليل الذي يحتوي على docker-compose.production.yml.

  # التحقق من حالة وسلامة جميع الحاويات
docker compose -f docker-compose.production.yml ps

# عرض السجلات المباشرة (جميع الخدمات)
docker compose -f docker-compose.production.yml logs -f

# عرض سجلات التطبيق فقط
docker compose -f docker-compose.production.yml logs -f rtcloud

# إعادة تشغيل حاوية واحدة
docker compose -f docker-compose.production.yml restart rtcloud

# إيقاف جميع الخدمات
docker compose -f docker-compose.production.yml down

# تشغيل جميع الخدمات
docker compose -f docker-compose.production.yml up -d

# فتح shell داخل حاوية التطبيق
docker compose -f docker-compose.production.yml exec rtcloud bash
  

الترقية

تُوزَّع تحديثات rtCloud كوسوم صور Docker جديدة. تسحب الترقية أحدث صورة وتُعيد إنشاء حاوية التطبيق. تعمل هجرات قاعدة البيانات تلقائياً عند التشغيل.

1. سحب أحدث صورة:

  docker compose -f docker-compose.production.yml pull
  

2. إعادة إنشاء حاوية التطبيق:

  docker compose -f docker-compose.production.yml up -d
  

يستبدل Docker الحاويات التي تغيّرت صورتها فقط. حاوية MySQL وجميع المجلدات المسماة غير متأثرة.

تثبيت إصدار معين

للترقية إلى إصدار محدد بدلاً من latest، حدّث RTCLOUD_IMAGE في .env:

  RTCLOUD_IMAGE=rtawebteam/rta-smartsurvey:1.2.3
  

ثم شغّل docker compose pull وup -d كما هو موضح أعلاه.

التخفيض

لا يُوصى بالتخفيض عموماً لأن هجرات قاعدة البيانات لا يمكن عكسها. إذا كان التخفيض ضرورياً، استعد من نسخة احتياطية لقاعدة البيانات أُخذت قبل الترقية.


النسخ الاحتياطي والاستعادة

نسخ احتياطي لقاعدة البيانات

شغّل هذا الأمر لتصدير قاعدة بيانات التطبيق إلى ملف SQL:

  docker compose -f docker-compose.production.yml exec mysql \
  mysqldump -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
  > backup-$(date +%Y%m%d-%H%M%S).sql
  

يُكتب ملف النسخة الاحتياطية في دليلك الحالي على المضيف.

استعادة قاعدة البيانات

  docker compose -f docker-compose.production.yml exec -T mysql \
  mysql -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
  < backup-20240101-120000.sql
  

نسخ احتياطي للملفات المرفوعة

كثيراً ما تتضمن بيانات الاستطلاعات المُرسلة ملفات مرفوعة (صور، صوت، مستندات) مخزَّنة في مجلدات Docker المسماة. احتفظ بنسخة احتياطية لها بشكل منفصل عن قاعدة البيانات:

  # نسخ احتياطي للملفات المرفوعة
docker run --rm \
  -v rtcloud_uploads:/data \
  -v "$(pwd):/backup" \
  alpine tar czf /backup/uploads-$(date +%Y%m%d).tar.gz -C /data .

# نسخ احتياطي للتسجيلات الصوتية
docker run --rm \
  -v rtcloud_audios:/data \
  -v "$(pwd):/backup" \
  alpine tar czf /backup/audios-$(date +%Y%m%d).tar.gz -C /data .
  

استبدل rtcloud_uploads وrtcloud_audios بأسماء مجلداتك الفعلية (مع بادئة COMPOSE_PROJECT_NAME) إذا غيّرت الافتراضي.

استعادة الملفات المرفوعة

  docker run --rm \
  -v rtcloud_uploads:/data \
  -v "$(pwd):/backup" \
  alpine tar xzf /backup/uploads-20240101.tar.gz -C /data
  

النسخ الاحتياطية اليومية الآلية

أضف مهمة cron على المضيف لتشغيل النسخ الاحتياطية تلقائياً. عدّل جدول cron الجذر بـ crontab -e:

  # نسخة احتياطية يومية لقاعدة البيانات في 2:00 صباحاً، احتفظ بـ 30 يوماً من السجل
0 2 * * * cd /opt/rtcloud && docker compose -f docker-compose.production.yml exec -T mysql \
  mysqldump -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
  > /backups/db-$(date +\%Y\%m\%d).sql && \
  find /backups -name "db-*.sql" -mtime +30 -delete
  

استكشاف الأخطاء

حاوية التطبيق لا تعمل

تحقق من سجلات الحاوية لرسائل الخطأ:

  docker compose -f docker-compose.production.yml logs rtcloud
  

الأسباب الشائعة:

  • متغيرات بيئة مفقودة أو غير صالحة في .env
  • MySQL غير جاهز بعد (انتظر 60 ثانية وتحقق مجدداً)
  • تعارض في المنفذ — عملية أخرى تستخدم APP_PORT مسبقاً

MySQL غير سليم

  docker compose -f docker-compose.production.yml logs mysql
  

الأسباب الشائعة:

  • MYSQL_ROOT_PASSWORD غير مضبوط في .env
  • مجلد بيانات تالف (نادر — تحقق من مساحة القرص بـ df -h)

قد يستغرق MySQL 30–60 ثانية للتهيئة في التشغيل الأول. انتظر وتحقق مجدداً قبل افتراض الفشل.

المنفذ مستخدم مسبقاً

غيّر APP_PORT أو SHINY_PORT في .env إلى منفذ حر، ثم أعد إنشاء الحاويات:

  docker compose -f docker-compose.production.yml up -d --force-recreate
  

لمعرفة ما يستخدم منفذاً على المضيف:

  lsof -i :8080
  

خطأ 400 CSRF Token Could Not Be Verified

يظهر هذا الخطأ في البيئات المحلية أو بيئات الوكيل العكسي حيث لا يتطابق أصل الطلب مع المضيف المتوقع. عطّل التحقق من CSRF للتطوير المحلي فقط:

  CSRF_VALIDATION_ENABLED=false
  

ثم أعد تشغيل التطبيق:

  docker compose -f docker-compose.production.yml up -d --force-recreate rtcloud
  

لا تعطّل التحقق من CSRF في الإنتاج. إذا ظهر هذا الخطأ في الإنتاج، تأكد من أن الوكيل العكسي يُعيد توجيه رأسي Host وX-Forwarded-For الصحيحَين.

نسيان كلمة مرور المسؤول

أعد ضبط كلمة مرور المسؤول مباشرةً في قاعدة البيانات. اتصل بحاوية MySQL وحدّث تجزئة كلمة المرور:

الخطوة 1 — أنشئ تجزئة كلمة المرور الجديدة. استبدل newpassword بكلمة مرورك المطلوبة:

  docker compose -f docker-compose.production.yml exec rtcloud php -r "
  \$salt = trim(shell_exec(\"mysql -h mysql -u root -p\\\"\${MYSQL_ROOT_PASSWORD}\\\" \${MYSQL_DATABASE} -se \\\"SELECT salt FROM ss_user WHERE username='admin';\\\"\"));
  echo md5(\$salt . 'newpassword') . PHP_EOL;
"
  

الخطوة 2 — حدّث التجزئة في قاعدة البيانات:

  docker compose -f docker-compose.production.yml exec mysql \
  mysql -u root -p"${MYSQL_ROOT_PASSWORD}" smartsurvey \
  -e "UPDATE ss_user SET password='<hash_from_step_1>' WHERE username='admin';"
  

الحاوية تُعيد التشغيل باستمرار

تحقق من فشل فحص الصحة:

  docker compose -f docker-compose.production.yml ps
docker inspect rtcloud-app --format '{{json .State.Health}}'
  

يستدعي فحص صحة التطبيق نقطة النهاية /health. إذا فشل بشكل متكرر، تحقق من سجلات التطبيق لأخطاء التشغيل.

مساحة القرص ممتلئة

حدّد ما يستهلك المساحة:

  # التحقق من استخدام قرص المضيف
df -h

# التحقق من استخدام Docker للقرص (الصور، الحاويات، المجلدات)
docker system df

# إزالة الصور غير المستخدمة والحاويات المتوقفة (آمن للتشغيل)
docker system prune
  

لا تستخدم docker system prune --volumes لأن ذلك سيحذف بيانات التطبيق.


فحوصات الصحة

لكل خدمة فحص صحة تلقائي. تعكس حالة الحاوية النتيجة:

الحاويةطريقة الفحصفترة البدءالفاصل الزمني
rtcloud-appHTTP GET /health90 ثانية30 ثانية
rtcloud-mysqlmysqladmin ping30 ثانية10 ثوانٍ
rtcloud-keycloakHTTP GET :9000/health/live120 ثانية30 ثانية

تُعاد تشغيل الحاويات ذات فحص الصحة الفاشل تلقائياً وفقاً لإعداد RESTART_POLICY (الافتراضي: unless-stopped).

هل كانت هذه الصفحة مفيدة؟