تنبيه أمني — ثغرتا CVE لتجاوز المصادقة الثنائية (مايو 2026)
في مايو 2026، كُشف عن ثغرتَين حرجتَين في Nextcloud:
CVE-2026-45690 (درجة CVSS 5.9، مكشوفة في 15 مايو 2026): يمكن لمهاجم يملك اسم مستخدم وكلمة مرور تجاوز التحقق من المصادقة الثنائية عبر HTTP Basic Auth.
CVE-2026-45691 (درجة CVSS 5.9، مكشوفة في 13 مايو 2026): نفس الفئة، يُستغَل عبر رمز DAV Bearer — بروتوكول WebDAV المستخدم من عملاء المزامنة.
كلتا الثغرتين مُصلَّحتان في Nextcloud 32.0.9 و33.0.3. الفروع 34.x وما فوق غير متأثرة بهاتين الثغرتَين.
NC 34.0.0 — تطبيقات موصى بها غائبة عند أول تشغيل
يُدخل Nextcloud 34.0.0 انحداراً في معالج التثبيت: التطبيقات الموصى بها (Notes وCalendar وContacts) غير معروضة أثناء الإعداد الأولي.
التحقق من وجود التطبيقات:
docker compose exec -u www-data app php occ app:list | grep -E 'calendar|contacts|notes'التثبيت اليدوي:
docker compose exec -u www-data app php occ app:install calendar
docker compose exec -u www-data app php occ app:install contacts
docker compose exec -u www-data app php occ app:install notesالتوصية: ابدأ مباشرةً بـ 34.0.2 أو أعلى بدلاً من 34.0.0. المصادر: issues GitHub #61313 و#61611.
NC 34.0.0 — قيد مُضاعَف على PostgreSQL وانفجار CPU
على المثيلات التي تستخدم PostgreSQL، يمكن أن تُخلّف هجرة Nextcloud 34.0.0 المنقطعة قيداً مُضاعَفاً على جدول oc_filecache_extended يُفجّر CPU وRAM.
الإصلاح:
docker compose exec -u www-data app php occ files:cleanup
docker compose exec -u www-data app php occ db:add-missing-indices
docker compose exec -u www-data app php occ db:add-missing-columnsالمصدر: issue GitHub #61597. إذا استمرت الأخطاء، انتقل مباشرةً إلى 34.0.2.
المتطلبات والأبعاد
التهيئة الموصى بها: VPS بـ 2 غيغابايت RAM (4 غيغابايت لأكثر من 5 مستخدمين)، SSD إلزامي، 20 غيغابايت كحد أدنى للتثبيت، Ubuntu 22.04 أو Debian 12، Docker Engine ≥ 24، اسم نطاق وشهادة TLS، المنفذان 80 و443 مفتوحان.
تثبيت Nextcloud باستخدام Docker Compose
الخطوة 1 — إنشاء هيكل المشروع
أنشئ
/opt/nextcloud/docker-compose.ymlبـ MariaDB 10.11 وRedis 7-alpine وNextcloudnextcloud:34.0.4-apache.الخطوة 2 — إنشاء ملف البيئة
cat > /opt/nextcloud/.env << 'EOF' MYSQL_ROOT_PASSWORD=كلمة_مرور_قوية_للجذر MYSQL_PASSWORD=كلمة_مرور_قوية_لـnextcloud REDIS_PASSWORD=كلمة_مرور_قوية_لـredis NEXTCLOUD_ADMIN_USER=admin NEXTCLOUD_ADMIN_PASSWORD=كلمة_مرور_قوية_للمشرف NEXTCLOUD_DOMAIN=cloud.نطاقك.com EOFالخطوة 3 — تشغيل الحاويات
docker compose up -d docker compose logs -f appيستغرق الإقلاع الأول من دقيقتَين إلى 4 دقائق. انتظر رسالة
Nextcloud was successfully installed.الخطوة 4 — إعداد Nginx مع TLS
ثبّت Nginx وCertbot، أنشئ موقع Nextcloud بـ
client_max_body_size 10G;ورؤوس الوكيل، ثم شغّلcertbot --nginx -d cloud.نطاقك.com.الخطوة 5 — ضبط النطاق الموثوق في Nextcloud
docker compose exec -u www-data app php occ config:system:set trusted_domains 0 \ --value=cloud.نطاقك.com docker compose exec -u www-data app php occ config:system:set overwrite.cli.url \ --value=https://cloud.نطاقك.com
التحقق من تأثر مثيلك بثغرات CVE للمصادقة الثنائية
التحقق من الإصدار الحالي:
docker compose exec -u www-data app php occ statusالإصدارات المتأثرة: كل 32.x < 32.0.9 و33.x < 33.0.3. الفروع 34.x وما فوق غير متأثرة بهاتين الثغرتَين.
التحديث إلى الإصدار المُصلَّح (الفرع 32 → 32.0.9، الفرع 33 → 33.0.3):
# الفرع 32:
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:32.0.9-apache|g' docker-compose.yml
# الفرع 33:
# sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:33.0.3-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgradeتحسين الأداء مع Redis وOPcache
Nextcloud بدون Redis بطيء. يضطلع Redis بدورَين حاسمَّين: تخزين الجلسات مؤقتاً والقفل الموزَّع الذي يمنع التعارضات.
تحقق من اتصال Redis:
docker compose exec -u www-data app php occ config:system:get redisالأخطاء الخمسة الأكثر شيوعاً في Nextcloud
1. Redis غير مهيَّأ — بطء وتعارضات مزامنة.
2. overwrite.cli.url يشير إلى http:// — روابط مشاركة غير آمنة.
3. trusted_domains مهيَّأ بشكل خاطئ — رسالة 'untrusted domain'.
4. حجم الرفع محدود بـ 2 ميغابايت — أضف client_max_body_size 10G في Nginx.
5. تحديثات أمان مهملة — هيّئ إشعارات التحديث.
التحقق من فاعلية Redis مع occ
docker compose exec -u www-data app php occ status
docker compose exec -u www-data app php occ check
docker compose exec -u www-data app php occ config:system:get redisأمر occ check يُدرج جميع مشاكل التهيئة المكتشفة. إنه أول تشخيص يجب تشغيله على أي مثيل Nextcloud قائم.
نسخ Nextcloud احتياطياً — البيانات وقاعدة البيانات والإعداد
تخزّن Nextcloud بياناتها في ثلاثة أماكن — يجب نسخ الثلاثة احتياطياً:
1. قاعدة بيانات MariaDB: البيانات الوصفية للملفات والمستخدمون والمشاركات.
2. حجم nextcloud: كود PHP والتطبيقات المثبَّتة وconfig/config.php.
3. ملفات المستخدمين.
docker compose exec -u www-data app php occ maintenance:mode --on
# MariaDB 10.x:
docker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud | gzip > /opt/nextcloud/backups/db-$(date +%Y%m%d).sql.gz
# MariaDB 11+: استخدم mariadb-dump بدلاً من ذلك
docker compose exec -u www-data app php occ maintenance:mode --offالنسخ الاحتياطي مع MariaDB 11 — mariadb-dump يحلّ محل mysqldump
منذ MariaDB 11.0، أُزيلت ثنائيات mysqldump وmysql من صورة Docker الرسمية. تتوفر الآن فقط mariadb-dump وmariadb. السكريبتات التي لا تزال تستخدم mysqldump مع mariadb:11.x ستفشل بصمت.
التحقق من إصدار MariaDB:
docker compose exec db mariadb --versionسكريبت نسخ احتياطي متوافق مع MariaDB 11+:
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR=/opt/nextcloud/backups
mkdir -p $BACKUP_DIR
docker compose exec -u www-data app php occ maintenance:mode --on
# mariadb-dump يحلّ محل mysqldump على MariaDB 11+
docker compose exec -T db \
mariadb-dump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \
| gzip > $BACKUP_DIR/db-$DATE.sql.gz
if gzip -t $BACKUP_DIR/db-$DATE.sql.gz 2>/dev/null; then
echo "النسخ الاحتياطي سليم: $BACKUP_DIR/db-$DATE.sql.gz"
else
echo "خطأ: الأرشيف تالف أو فارغ"
docker compose exec -u www-data app php occ maintenance:mode --off
exit 1
fi
docker compose cp app:/var/www/html/config/config.php $BACKUP_DIR/config-$DATE.php
docker compose exec -u www-data app php occ maintenance:mode --offالاستعادة:
gunzip -c $BACKUP_DIR/db-$DATE.sql.gz | \
docker compose exec -T db mariadb -u nextcloud -p${MYSQL_PASSWORD} nextcloudملاحظة: إذا بقيت على mariadb:10.11 (لا تزال مدعومة، نهاية الدعم في فبراير 2028 / EOL)، فإن كلاً من mysqldump وmariadb-dump يعملان بشكل طبيعي. لا تؤثر إزالة mysqldump إلا على MariaDB 11.0 وما فوق. بيد أن اعتماد mariadb-dump الآن يجعل سكريبتاتك جاهزة للهجرة المستقبلية.
الخطوات التالية — المضي أبعد مع مثيلك
بعد تثبيت Nextcloud وتأمينها:
تفعيل Talk (مؤتمرات الفيديو): ثبّت تطبيق Nextcloud Talk من واجهة الإدارة.
تفعيل OnlyOffice أو Collabora Online: هذه التطبيقات تحتاج حاوية Docker مستقلة.
مراقبة مثيلك: ضبط التنبيهات في الإدارة → المراقبة.
تحديث Nextcloud في بيئة الإنتاج
يجب دائماً تشغيل التحديثات في وضع الصيانة:
docker compose exec -u www-data app php occ maintenance:mode --on
# MariaDB 10.x:
docker compose exec -T db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud \
| gzip > /opt/nextcloud/backups/pre-update-db.sql.gz
# MariaDB 11+: استبدل mysqldump بـ mariadb-dump
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --offPHP 8.3: الترحيل ومتطلبات Nextcloud 35
يجعل Nextcloud 35 PHP 8.3 إلزامياً — PHP 8.2 لم يعد مدعوماً. إذا كنت تستخدم تثبيتاً محلياً أو صورة Docker مقيَّدة بـ PHP 8.2، يجب ترحيل PHP قبل الترقية إلى NC 35.
التحقق من إصدار PHP:
# في Docker
docker compose exec app php --versionفي Docker — صورة nextcloud:35.x-apache تتضمن PHP 8.3+ بالفعل. ما عليك سوى تحديث الوسم:
image: nextcloud:35.0.0-apacheالامتدادات المطلوبة لـ Nextcloud 35: gd/imagick وredis وintl وbcmath وgmp وzip وopcache.
التحقق من الامتدادات المفقودة:
docker compose exec -u www-data app php occ checkNextcloud 35 : مسار التحديث وإصدارات PHP المدعومة
صدر Nextcloud 35.0.0 في 16 سبتمبر 2026 (Hub 26 Summer). يدعم PHP 8.3 (الحد الأدنى الإلزامي) و8.4 و8.5 (موصى به). PHP 8.2 غير مدعوم — مثيل يعمل على PHP 8.2 لن يشتغل بعد الترقية إلى NC 35.
أفضل ممارسة — أعلّق على وسم صريح:
image: nextcloud:35.0.0-apacheمسار التحديث التسلسلي الإلزامي: v33 → v34 → v35
# الخطوة 1: الترقية إلى NC 34
docker compose exec -u www-data app php occ maintenance:mode --on
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:34.0.4-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --off
# الخطوة 2: الترقية إلى NC 35
docker compose exec -u www-data app php occ maintenance:mode --on
sed -i 's|nextcloud:[0-9.]*-apache|nextcloud:35.0.0-apache|g' docker-compose.yml
docker compose pull app && docker compose up -d app
docker compose exec -u www-data app php occ upgrade
docker compose exec -u www-data app php occ maintenance:mode --offتحقق من مصفوفة التوافق على apps.nextcloud.com قبل كل ترقية.
التحقق من توافق تطبيقاتك قبل الانتقال إلى Nextcloud 35
قبل الترقية إلى NC 35، شغّل فحص التوافق المدمج:
docker exec -u www-data <اسم_الحاوية> php occ app:check-platform-compatibilityعطّل التطبيقات غير المتوافقة قبل الترقية. بعدها، شغّل occ check دائماً:
docker compose exec -u www-data app php occ checkRecognize v7 — تصحيح خطأ 'sh: exec: line 1' الصامت
يمكن أن يفشل تطبيق Recognize بصمت بخطأ:
Classifier process output: sh: exec: line 1: recognize/bin/node: not foundهذا الخطأ لا يظهر في واجهة الإدارة — فقط في سجلات الحاوية.
التشخيص:
docker compose logs app | grep -i recognize
docker compose exec app sh -c "ls -la /var/www/html/apps/recognize/bin/"
docker compose exec app uname -mالإصلاح على x86_64:
docker compose exec -u www-data app php occ config:app:set recognize \
tensorflow.gpu_enabled --value=false
docker compose exec -u www-data app php occ config:app:set recognize \
node_binary --value=""
docker compose exec -u www-data app php occ recognize:classifyعلى ARM64: فعّل وضع WASM في إعدادات التطبيق.