الصيانة
الصيانة اليومية لنسخة rtCloud المستضافة ذاتياً: الترقية والنسخ الاحتياطي والاستعادة واستكشاف المشكلات الشائعة.
الأوامر الشائعة
استخدم هذه الأوامر بانتظام لإدارة حاويات 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-app | HTTP GET /health | 90 ثانية | 30 ثانية |
rtcloud-mysql | mysqladmin ping | 30 ثانية | 10 ثوانٍ |
rtcloud-keycloak | HTTP GET :9000/health/live | 120 ثانية | 30 ثانية |
تُعاد تشغيل الحاويات ذات فحص الصحة الفاشل تلقائياً وفقاً لإعداد RESTART_POLICY (الافتراضي: unless-stopped).