> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# تثبيت LimeSurvey للاستبيانات على خادمك
- URL: https://arabroot.io/articles/تثبيت-limesurvey-للاستبيانات/
- Published: 2026-09-20T19:40:00.000Z
- Updated: 2026-10-04T20:06:03.000Z
- Description: أنشئ استبياناتك على خادمك لتبقى إجابات المشاركين لديك. نثبت LimeSurvey مع MariaDB، وننشئ استبياناً عربياً ونقرأ نتائجه، ثم نجهز النسخ الاحتياطي والتحديث.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, تطبيقات لفريقك, الاستضافة الذاتية, LimeSurvey

عندما تحتاج جهة ما إلى أن تسأل عملاءها عن رضاهم أو تسأل موظفيها عن بيئة العمل أو تجمع بيانات بحث علمي، فإن أول ما يفعله الجميع هو أن يفتح Google Forms أو خدمة استبيانات Surveys سحابية Cloud مثل SurveyMonkey، وهذا حل معقول لأنه لا يحتاج إلى أي إعداد وتجد الرابط جاهزاً خلال دقائق، ولكن لاحظ أن كل إجابة يكتبها المشارك سوف تحفظ على سيرفرات Servers شركة أخرى لا تتحكم فيها، وأن هذه الإجابات تحتوي غالباً على بيانات شخصية Personal Data وآراء حساسة، مثل رأي الموظف في مديره أو حالة المريض أو راتب المشارك، وعندما يقع خلل أمني عند مزود الخدمة فأنت لا تملك إلا أن تنتظر رسالة الاعتذار.

📌

في نهاية يونيو 2018 أعلنت شركة Typeform التي تقدم خدمة استبيانات سحابية معروفة أن مخترقاً وصل إلى نسخة احتياطية Backup من سيرفراتها فيها إجابات استبيانات أجريت قبل 3 مايو 2018، وكما [أعلن بنك Monzo](https://monzo.com/blog/2018/06/29/typeform-breach?ref=arabroot.io) فقد تسربت بيانات قرابة 20 ألفاً من عملائه شاركوا في استبياناته، وهي البريد عند أغلبهم، ومعه عند بعضهم الاسم والرمز البريدي وجهة العمل وفئة الراتب، فأنهى البنك تعاقده مع Typeform، وقرر أن يحذف بيانات أي استبيان من أي مزود خلال شهرين من انتهائه، والدرس أن الإجابات التي تجمعها عند غيرك تبقى عرضة لأخطائه هو، حتى لو لم ترتكب أنت أي خطأ.

والحل الأنسب للإجابات الحساسة هو أن تشغل منصة الاستبيانات على سيرفرك، وهنا يأتي دور [**LimeSurvey**](https://www.limesurvey.org/?ref=arabroot.io)، وهي أقدم منصات الاستبيانات مفتوحة المصدر Open Source وأنضجها، ورخصتها [GPL الإصدار 2 أو ما بعده](https://github.com/LimeSurvey/LimeSurvey/blob/master/LICENSE?ref=arabroot.io) للنسخة المجتمعية Community Edition، وفيها أكثر من ثلاثين [نوعاً من الأسئلة](https://www.limesurvey.org/manual/Question%5Ftypes?ref=arabroot.io)، و[منطق شرطي Conditional Logic](https://www.limesurvey.org/manual/Setting%5Fconditions?ref=arabroot.io) يوجه المشارك حسب إجاباته، و[الحصص Quotas](https://www.limesurvey.org/manual/Quotas?ref=arabroot.io) التي توقف الاستبيان عند عدد محدد من فئة معينة، و[قوائم المشاركين Participants برموز الدعوة Tokens](https://www.limesurvey.org/manual/Survey%5Fparticipants?ref=arabroot.io)، والاستبيانات مجهولة الهوية Anonymous، والعربية مدعومة بالكامل من اليمين إلى اليسار، ويمكنك أن تضع [عدة لغات في الاستبيان الواحد](https://www.limesurvey.org/manual/Multilingual%5Fsurvey?ref=arabroot.io)، ثم تصدر Export النتائج Results إلى Excel وSPSS وR.

وتناسب المنصة الجامعات ومراكز البحث والجهات التي يجب أن تحتفظ ببياناتها عندها أو تحتاج إلى استبيانات معقدة بشروط وفروع، ولكنها أكبر من حاجتك إذا كان كل ما تريده نموذج اتصال من ثلاثة حقول، ففي هذه الحالة تكفيك أداة نماذج Forms خفيفة.

وسوف نناقش في هذا المقال ما يلي:

- اختيار الـ Docker Image المناسبة، لأن فريق LimeSurvey لا ينشر Image رسمية.
- تثبيت LimeSurvey مع MariaDB عبر Docker Compose خلف الـ Reverse Proxy، وتثبيت مفاتيح التشفير Encryption Keys حتى لا تضيع البيانات المشفرة.
- إنشاء استبيان عربي وتفعيله وقراءة نتائجه.
- النسخ الاحتياطي والاستعادة Restore والتحديث، وأشهر المشكلات وحلولها.

## أي Docker Image نستخدم؟

فريق LimeSurvey لا ينشر Docker Image رسمية للنسخة المجتمعية، لذلك سوف تجد على Docker Hub عدة Images يصونها أفراد من المجتمع، أشهرها اثنتان: [acspri/limesurvey](https://hub.docker.com/r/acspri/limesurvey?ref=arabroot.io) التي يصونها [Adam Zammit](https://github.com/adamzammit/limesurvey-docker?ref=arabroot.io)، و[martialblog/limesurvey](https://github.com/martialblog/docker-limesurvey?ref=arabroot.io) التي سوف نستخدمها في هذا الدليل، والسبب أن متغيرات البيئة Environment Variables فيها موثقة بالكامل ومنها متغيرات مفاتيح التشفير، وأنها تعمل افتراضياً بمستخدم غير root، وأن كل إصدار منها يمر باختبارات آلية Automated Tests على فرع Branch الإصدارات طويلة الدعم LTS وعلى الفرع الأحدث، وأن الكود Source Code الخاص بها مفتوح على GitHub.

وصاحب الـ Image يبني نسخة لكل إصدار Release جديد من LimeSurvey خلال أيام، فمثلاً صدر الإصدار [7.1.2](https://github.com/LimeSurvey/LimeSurvey/releases/tag/7.1.2%2B260917?ref=arabroot.io) في 17 سبتمبر وظهرت الـ Image الخاصة به في 22 سبتمبر، وصدر الإصدار [7.4.0](https://github.com/LimeSurvey/LimeSurvey/releases/tag/7.4.0%2B260928?ref=arabroot.io) في 28 سبتمبر وظهرت الـ Image الخاصة به في 2 أكتوبر، لذلك إذا صدر إصدار فيه إصلاحات أمنية Security Fixes فسوف تنتظر بضعة أيام حتى يصلك عبر الـ Image، وهذا هو الثمن الذي تدفعه مقابل عدم وجود Image رسمية.

وللـ Image ثلاثة أنواع: `apache` وهو الأبسط لأن خادم الويب Web Server موجود داخله، و`fpm` و`fpm-alpine` لمن يريد خادم ويب منفصلاً، و[الوسوم Tags](https://hub.docker.com/r/martialblog/limesurvey?ref=arabroot.io) بصيغة `7.4.0-260928-apache`، أي رقم إصدار LimeSurvey ثم رقم البناء Build Number ثم النوع. وتجنب الـ Images القديمة التي تذكرها أدلة سابقة، فبعضها توقف عند الإصدار 5 أو 6.

## ما تحتاجه قبل أن تبدأ Requirements

- سيرفر مثبت عليه Docker وCompose، وإذا لم تثبته بعد فابدأ بدليل [تثبيت Docker على Ubuntu](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-docker-%D8%B9%D9%84%D9%89-ubuntu/).
- الموارد Resources: يستهلك الـ Container الخاص بـ LimeSurvey قرابة 100 ميجابايت من الذاكرة RAM، وMariaDB قرابة 145 ميجابايت دون حمل Idle، وإذا كنت تتوقع آلاف المشاركين في وقت واحد فخطط لموارد أكبر.
- نطاق Domain مثل `survey.example.com`، وReverse Proxy يعمل بـ HTTPS مثل [Nginx Proxy Manager](https://arabroot.io/articles/nginx-proxy-manager-%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%88%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-tls/) ومتصل بشبكة Network في Docker باسم `proxy`.
- خدمة SMTP إذا كنت سوف تراسل المشاركين بالدعوات والتذكيرات.

## تثبيت LimeSurvey بـ Docker Compose

نبدأ بإنشاء مجلد للخدمة يحفظ فيه ملف Compose وملف الأسرار:

```bash
sudo mkdir -p /opt/limesurvey
sudo chown $USER: /opt/limesurvey
cd /opt/limesurvey
```

### الأسرار Secrets ومفاتيح التشفير

يستطيع LimeSurvey [تشفير بيانات المشاركين](https://www.limesurvey.org/manual/Data%5Fencryption?ref=arabroot.io) وإجابات أسئلة محددة داخل قاعدة البيانات Database، فإذا تسربت نسخة من القاعدة فلن يقرأ من أخذها هذه الحقول، ولكن مفاتيح التشفير محفوظة في الملف `application/config/security.php` داخل الـ Container، وهنا المشكلة: **إذا لم تمرر المفاتيح إلى الـ Image فسوف ينشئ LimeSurvey مفاتيح جديدة في كل مرة تعيد فيها إنشاء الـ Container**، كما يحدث عند كل تحديث، وتضيع معها كل البيانات المشفرة!

والسجل Log يقول ذلك صراحة عند التشغيل دون مفاتيح: `Warning: THIS FILE NEEDS TO BE PERSISTENT`، لذلك سوف ننشئ المفاتيح مرة واحدة ونحفظها في الملف `.env` مع كلمات المرور، وطول الـ Nonce هو 24 بايت وطول المفتاح 32 بايت، وكلاهما بصيغة hex كما ينشئهما LimeSurvey نفسه:

```bash
cat > .env <<EOF
MARIADB_ROOT_PASSWORD=$(openssl rand -hex 32)
MARIADB_PASSWORD=$(openssl rand -hex 32)
LIMESURVEY_ADMIN_PASSWORD=$(openssl rand -base64 18)
ENCRYPT_NONCE=$(openssl rand -hex 24)
ENCRYPT_SECRET_BOX_KEY=$(openssl rand -hex 32)
EOF
chmod 600 .env
```

وقد يتساءل البعض: في وثائق الـ Image متغيرات أخرى مثل `ENCRYPT_KEYPAIR` و`ENCRYPT_PUBLIC_KEY` و`ENCRYPT_SECRET_KEY`، فهل أحتاج إليها؟ والإجابة لا، فهذه المفاتيح كانت تستخدم في الإصدار 4، أما الإصدار 5 وما بعده فيعتمد على `ENCRYPT_NONCE` و`ENCRYPT_SECRET_BOX_KEY` فقط، كما في [جدول متغيرات الـ Image](https://github.com/martialblog/docker-limesurvey?ref=arabroot.io).

🛑

احفظ `ENCRYPT_NONCE` و`ENCRYPT_SECRET_BOX_KEY` في مدير الأسرار Secrets Manager، وأرفقهما بكل نسخة احتياطية، ولا تقم بتغييرهما بعد أن تبدأ في جمع البيانات، والسبب أنه لا توجد أي طريقة لقراءة الحقول المشفرة في قاعدة البيانات دون المفتاحين الأصليين.

### ملف Compose

الآن سوف ننشئ الملف `/opt/limesurvey/compose.yaml`:

```yaml
services:
  limesurvey:
    image: martialblog/limesurvey:7.4.0-260928-apache
    container_name: limesurvey
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DB_TYPE: mysql
      DB_HOST: db
      DB_NAME: limesurvey
      DB_USERNAME: limesurvey
      DB_PASSWORD: ${MARIADB_PASSWORD}
      DB_MYSQL_ENGINE: InnoDB
      ADMIN_USER: admin
      ADMIN_NAME: Survey Admin
      ADMIN_EMAIL: admin@example.com
      ADMIN_PASSWORD: ${LIMESURVEY_ADMIN_PASSWORD}
      PUBLIC_URL: https://survey.example.com
      URL_FORMAT: path
      SHOW_SCRIPT_NAME: "false"
      ENCRYPT_NONCE: ${ENCRYPT_NONCE}
      ENCRYPT_SECRET_BOX_KEY: ${ENCRYPT_SECRET_BOX_KEY}
    volumes:
      - ls_upload:/var/www/html/upload
    networks:
      - internal
      - proxy
    healthcheck:
      test: ["CMD", "curl", "-fsS", "-o", "/dev/null", "http://localhost:8080/upload/readme.txt"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 60s

  db:
    image: mariadb:11.8.9
    container_name: limesurvey-db
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: limesurvey
      MARIADB_USER: limesurvey
      MARIADB_PASSWORD: ${MARIADB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
      MARIADB_AUTO_UPGRADE: "1"
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - internal
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

volumes:
  ls_upload:
    name: limesurvey_upload
  db_data:
    name: limesurvey_db

networks:
  internal: {}
  proxy:
    external: true
```

في الإعداد أعلاه لاحظ التالي:

- **DB\_MYSQL\_ENGINE: InnoDB**: تستخدم الـ Image افتراضياً محرك التخزين Storage Engine المسمى [MyISAM](https://mariadb.com/kb/en/myisam-storage-engine/?ref=arabroot.io) لجداول Tables الإجابات، وهذا المحرك لا يدعم المعاملات Transactions ولا يتحمل الانقطاع المفاجئ، لذلك اخترنا [InnoDB](https://mariadb.com/kb/en/innodb/?ref=arabroot.io) لأنه أنسب لبيئة الإنتاج Production ويسمح بأخذ تفريغ Dump متسق والخدمة تعمل، وقيده الوحيد ألا يتجاوز الاستبيان الواحد نحو ألف عمود Column، أي ألف سؤال فرعي تقريباً.
- **ADMIN\_\***: يقرأ LimeSurvey هذه القيم في التثبيت الأول فقط، وتغييرها بعد ذلك لا يفعل أي شيء، لذلك غير كلمة المرور Password من واجهة الويب Web UI.
- **PUBLIC\_URL**: هو الرابط العام Public URL الذي يبني منه LimeSurvey روابط الاستبيانات والدعوات، والمضيف Host المكتوب فيه يعد موثوقاً Trusted تلقائياً (انظر قسم المشكلات عن `allowed_hosts.php`)، أما `SHOW_SCRIPT_NAME: "false"` فيحذف `index.php` من الروابط، والخياران مشروحان في [صفحة الإعدادات الاختيارية](https://www.limesurvey.org/manual/Optional%5Fsettings?ref=arabroot.io).
- **ls\_upload**: فيه القوالب Templates والإضافات Plugins والملفات المرفوعة وملفات الإجابات، وهو [Named Volume](https://docs.docker.com/engine/storage/volumes/?ref=arabroot.io)، لذلك ينسخ Docker إليه محتوى الـ Image الأصلي في التشغيل الأول، أما إذا استبدلت به مجلداً من السيرفر Bind Mount فعليك أن تملأه بنفسك بمحتوى المجلد `upload` من حزمة Package الخاصة بـ LimeSurvey.
- **فحص الصحة Healthcheck**: الـ Image لا تحتوي على فحص جاهز، فأضفنا فحصاً يتأكد أن Apache يقدم الملفات، وهذا الفحص لا يختبر PHP ولا قاعدة البيانات، ولكنه لا يتأثر بقائمة المضيفين المسموح بهم Allowed Hosts، فلا يتحول الـ Container إلى unhealthy بسببها.
- الـ Container يعمل بالمستخدم User المسمى `www-data`، ويستمع داخلياً على المنفذ Port رقم `8080`، ولا ننشر أي منفذ على السيرفر لأن الـ Reverse Proxy يصل إليه عبر الشبكة `proxy`.

بعد ذلك نشغل الخدمة ونتابع السجل:

```bash
docker network create proxy
docker compose up -d
docker compose logs -f limesurvey
```

وفي التشغيل الأول سوف ترى الرسالة `CException: Database version was not found, LimeSurvey is not correctly installed`، وهذا متوقع، والسبب أن السكربت Script يبحث عن قاعدة بيانات مثبتة فلا يجدها، فيبدأ التثبيت (`Running console.php install`). وعند إعادة التشغيل Restart بعد ذلك فالمخرج سوف يكون كما يلي:

```bash
Info: security.php already provisioned
Info: Check if database already provisioned. Nevermind the Stack trace.
no need update : DB is uptodate
Info: Database already provisioned
```

ولاحظ أنك عندما تعيد إنشاء الـ Container، كما يحدث عند التحديث، فسوف ترى `Info: Creating security.php` بدلاً من السطر الأول، وهذا طبيعي لأن الملف يكتب من جديد بالمفاتيح نفسها التي في `.env`.

بعدها أنشئ في الـ Reverse Proxy مضيفاً Proxy Host للنطاق `survey.example.com` يوجه الطلبات Requests إلى `http://limesurvey:8080`، مع شهادة Certificate من Let's Encrypt وتفعيل Force SSL.

## الدخول الأول إلى لوحة الإدارة

لوحة الإدارة Admin Panel على العنوان `https://survey.example.com/index.php/admin`، فادخل بالمستخدم `admin` وكلمة المرور المحفوظة في `.env`:

![شاشة دخول لوحة إدارة LimeSurvey](https://arabroot.io/content/images/2026/09/limesurvey-01-login.webp)

صفحة دخول الإدارة، ويمكن اختيار لغة الواجهة من القائمة

وبعد الدخول سوف يعرض LimeSurvey تنبيهين مهمين، الأول أنه أنشأ ملف المضيفين الموثوقين بالاسم الذي دخلت منه، لذلك ادخل أول مرة من النطاق الحقيقي وليس من عنوان IP، والثاني أن SSL غير مفروض، فإذا كان الموقع يعمل عبر HTTPS فافتح Configuration ثم Global settings ثم Security، واجعل [**Force HTTPS**](https://www.limesurvey.org/manual/Global%5Fsettings?ref=arabroot.io) على On، ومن الإعدادات العامة نفسها قم بما يلي:

- غير كلمة مرور المدير Administrator من قائمة الحساب، وأنشئ لكل من يدير الاستبيانات حساباً خاصاً بصلاحيات Permissions محددة من Configuration ثم [Users](https://www.limesurvey.org/manual/Manage%5Fusers?ref=arabroot.io)، والسبب أن الحساب المشترك لا يخبرك من غير ماذا.
- اضبط البريد من Global settings ثم Email settings (SMTP مع TLS)، وأرسل رسالة تجريبية Test Email.
- اضبط لغة الواجهة الافتراضية والمنطقة الزمنية Time Zone.

## إنشاء استبيان عربي

في LimeSurvey 7 محرر Editor جديد يعرض الاستبيان كما سوف يراه المشارك، فاضغط الزر + ثم Create survey، وسوف ينشئ المحرر استبياناً فيه مجموعة أسئلة Question Group وسؤال نموذجي، ثم تكتب العناوين والنصوص في أماكنها مباشرة والمحرر يحفظ كل تعديل تلقائياً Autosave. وفي المثال التالي كتبنا العنوان «استبيان رضا العملاء» ووصفاً ترحيبياً، وأنشأنا مجموعة «الخدمة» فيها سؤال اختيار متعدد Multiple Choice:

![محرر الاستبيانات في LimeSurvey 7 مع شاشة الترحيب ومجموعة أسئلة وسؤال اختيار متعدد بالعربية](https://arabroot.io/content/images/2026/09/limesurvey-02-survey-editor.webp)

المحرر الجديد: الهيكل على اليسار، والتحرير في موضع النص نفسه

**اللغة:** يبدأ الاستبيان بلغة الواجهة الافتراضية، فإذا أردت استبياناً عربياً فأضف العربية إلى اللغات من [الإعدادات العامة للاستبيان General settings](https://www.limesurvey.org/manual/General%5Fsettings?ref=arabroot.io)، واجعلها اللغة الأساسية Base language، واحذف الإنجليزية إذا لم تحتج إليها، وبهذا تظهر أزرار الاستبيان ورسائله للمشارك بالعربية ومن اليمين إلى اليسار RTL.

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

بعد ذلك تختار من شريط الإعدادات عرض سؤال واحد أو مجموعة واحدة في كل صفحة، والسماح بالرجوع، وإظهار شريط التقدم Progress Bar، وإذا كان الاستبيان يعد المشاركين بإخفاء هوياتهم Anonymization فقم بتفعيل [الإجابات مجهولة الهوية Anonymized responses](https://www.limesurvey.org/manual/Participant%5Fsettings?ref=arabroot.io). **وتذكر** أن هذا الخيار يضبط قبل التفعيل ولا يمكن تغييره بعده.

### تفعيل الاستبيان Activation ومشاركته

الزر [Activate](https://www.limesurvey.org/manual/Activating%5Fa%5Fsurvey?ref=arabroot.io) يثبت هيكل Structure الاستبيان وينشئ جدول الإجابات، وبعد التفعيل لا تستطيع أن تضيف أسئلة أو تحذفها إلا إذا أوقفت الاستبيان، والإيقاف ينقل الإجابات إلى جدول أرشيف Archive Table منفصل، لذلك راجع الاستبيان بزر المعاينة Preview (رمز العين) قبل أن تفعله.

وبعد التفعيل تظهر نافذة المشاركة، وفيها الرابط العام ورمز QR ونوع الوصول Access Mode، أي هل يشارك كل من معه الرابط أم المدعوون برموز فقط:

![نافذة تفعيل الاستبيان في LimeSurvey مع عدادات الإجابات والرابط ورمز QR](https://arabroot.io/content/images/2026/09/limesurvey-03-activated-share.webp)

الاستبيان مفعل: الرابط ورمز QR وخيار الوصول

والصورة التالية تبين ما يراه المشارك بعد أن جعلنا العربية اللغة الأساسية:

![صفحة ترحيب الاستبيان العامة بالعربية مع زر التالي](https://arabroot.io/content/images/2026/09/limesurvey-04-public-welcome.webp)

صفحة الترحيب كما يراها المشارك

![سؤال اختيار متعدد في الاستبيان العام بالعربية مع زر أرسل](https://arabroot.io/content/images/2026/09/limesurvey-05-public-question.webp)

السؤال كما يظهر للمشارك، من اليمين إلى اليسار

### قراءة النتائج

تبويب Tab المسمى Results يعرض ملخصاً فيه العدد الكلي للإجابات والمكتمل منها وغير المكتمل ومنحنى Chart الإجابات، وفيه أيضاً [قائمة الإجابات](https://www.limesurvey.org/manual/Responses?ref=arabroot.io) و[إحصاءات Statistics كل سؤال](https://www.limesurvey.org/manual/Statistics?ref=arabroot.io)، ومن [Export results](https://www.limesurvey.org/manual/Exporting%5Fresults?ref=arabroot.io) تصدر الإجابات إلى CSV أو Excel أو SPSS أو R، وعند التصدير بالعربية سوف تجد عناوين الأعمدة ونصوص الإجابات بالعربية كما كتبتها:

![صفحة Results overview في LimeSurvey تعرض أربع إجابات مكتملة ورسوماً بيانية](https://arabroot.io/content/images/2026/09/limesurvey-06-results-overview.webp)

ملخص النتائج بعد أربع إجابات تجريبية

## كيف تتأكد أن كل شيء يعمل Verification

- الأمر `docker compose ps` يعرض الـ Containers الاثنين بالحالة `healthy`.
- بعد إعادة التشغيل يظهر في السجل `security.php already provisioned` و`Database already provisioned`.
- مفاتيح التشفير ثابتة، فالأمر `docker compose exec limesurvey grep -c encryptionsecretboxkey application/config/security.php` يعيد `1`، وقيمة المفتاح تبقى مطابقة لما في `.env` بعد `docker compose up -d --force-recreate`.
- جداول الإجابات تستخدم محرك InnoDB، وتتأكد من ذلك بالأمر `docker compose exec db sh -c 'mariadb -ulimesurvey -p"$MARIADB_PASSWORD" -e "SELECT table_name, engine FROM information_schema.tables WHERE table_name LIKE \"lime_responses_%\"" limesurvey'`.
- الرابط العام للاستبيان يفتح عبر `https://`، ولوحة الإدارة تحول طلبات HTTP إلى HTTPS بعد تفعيل Force HTTPS.
- الطلبات التي تحمل مضيفاً غير معروف ترفض بعد الدخول الأول، فالأمر `curl -s -o /dev/null -w '%{http_code}' -H 'Host: other.example.net' http://limesurvey:8080/index.php/admin` يعيد `400` عندما تنفذه من Container على الشبكة نفسها.

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

هناك ثلاثة أشياء يجب أن تنسخها معاً، الأول قاعدة MariaDB وفيها الاستبيانات والإجابات والمشاركون، والثاني الـ Volume المسمى `limesurvey_upload` وفيه القوالب المخصصة والملفات التي رفعها المشاركون، والثالث الملفان `compose.yaml` و`.env`، والأخير هو الأهم لأن فيه مفاتيح التشفير، ونسخة من القاعدة دون المفاتيح لا تقرأ منها الحقول المشفرة:

```bash
cd /opt/limesurvey
mkdir -p backups
docker compose exec -T db sh -c 'mariadb-dump --single-transaction -ulimesurvey -p"$MARIADB_PASSWORD" limesurvey' | gzip > backups/limesurvey-db-$(date +%F).sql.gz
docker run --rm -v limesurvey_upload:/data:ro -v "$PWD/backups":/backup alpine:3.24 tar czf /backup/limesurvey-upload-$(date +%F).tar.gz -C /data .
```

وللاستعادة على سيرفر جديد انسخ `compose.yaml` و`.env` بالمفاتيح نفسها، وشغل قاعدة البيانات وحدها، ثم استعد [التفريغ](https://mariadb.com/kb/en/mariadb-dump/?ref=arabroot.io) والملفات، ثم شغل التطبيق، وسوف يجد السكربت القاعدة جاهزة فلا يعيد التثبيت:

```bash
docker compose up -d --wait db
gunzip -c backups/limesurvey-db-2026-09-26.sql.gz | docker compose exec -T db sh -c 'mariadb -ulimesurvey -p"$MARIADB_PASSWORD" limesurvey'
docker run --rm -v limesurvey_upload:/data -v "$PWD/backups":/backup alpine:3.24 sh -c 'tar xzf /backup/limesurvey-upload-2026-09-26.tar.gz -C /data && chown -R 33:33 /data'
docker compose up -d
```

في الأوامر أعلاه لاحظ التالي:

- الخيار `--wait` يجعل الأمر الأول ينتظر حتى يصبح MariaDB في الحالة `healthy`، والسبب أن الأمر دونه يعود فوراً والقاعدة ما زالت تقلع، فيفشل الاستيراد برسالة `ERROR 2002 (HY000): Can't connect to local server through socket`، ثم يجد LimeSurvey قاعدة فارغة فيقوم بتثبيت جديد فوقها.
- بعد تشغيل التطبيق يجب أن ترى في السجل `no need update : DB is uptodate` ثم `Database already provisioned`، أما إذا رأيت `Running console.php install` فالاستيراد لم يتم، فأوقف الخدمة وأعد الاستعادة على قاعدة فارغة.
- الأمر `chown -R 33:33` يعيد ملكية الملفات إلى المستخدم `www-data` الذي يعمل به الـ Container.

وتذكر أن إجابات الاستبيانات فيها غالباً بيانات شخصية، لذلك شفر النسخ الاحتياطية قبل نقلها، واحذف القديم منها حسب سياسة الاحتفاظ Retention Policy عندك، واحذف معها الاستبيانات المنتهية، فالبيانات التي لم تعد موجودة لا يمكن أن تتسرب.

## التحديث Upgrade إلى إصدار أحدث

يصدر LimeSurvey تحديثات إصلاحية Patch Releases كثيرة، وبعضها أمني، فمثلاً صدر الإصدار 7.5.0 في 1 أكتوبر 2026 ومعه، كما في [ملاحظات الإصدار](https://github.com/LimeSurvey/LimeSurvey/blob/master/docs/release%5Fnotes.txt?ref=arabroot.io)، إصلاح ست ثغرات أمنية منها حقن SQL Injection في الإحصاءات وقراءة ملفات السيرفر عبر خيارات القوالب، وكلها تحتاج إلى حساب مستخدم في لوحة الإدارة، لذلك حدث بمجرد أن تظهر الـ Image الخاصة بالإصدار الجديد، وإلى أن تظهر فلا تعط حسابات الإدارة إلا لمن تثق به.

ومع Docker Image لا تقم باستخدام أداة التحديث المدمجة [ComfortUpdate](https://www.limesurvey.org/manual/ComfortUpdate?ref=arabroot.io)، والسبب أنها تعدل الملفات داخل الـ Container وتضيع التعديلات عند إعادة إنشائه، وإنما غير الوسم فقط، والسكربت يطبق ترحيلات Migrations قاعدة البيانات عند الإقلاع Startup عبر الأمر `updatedb`:

1. راجع [ملاحظات الإصدار Release Notes](https://github.com/LimeSurvey/LimeSurvey/releases?ref=arabroot.io) و[وسوم الـ Image](https://hub.docker.com/r/martialblog/limesurvey/tags?ref=arabroot.io).
2. خذ نسخة احتياطية.
3. غير الوسم في `compose.yaml` إلى الإصدار الجديد بصيغته الكاملة (مثل `7.5.0-2610xx-apache`)، ثم نفذ:

```bash
cd /opt/limesurvey
docker compose pull
docker compose up -d
docker compose logs --tail 20 limesurvey
```

وابحث في السجل عن `DB is uptodate` إذا لم يغير الإصدار هيكل القاعدة، أو عن سطر يبدأ بـ `Update mysql:host=db` وينتهي برقمي إصدار القاعدة القديم والجديد مثل `from 714 to 717` إذا طبق ترحيلات. والانتقال بين الإصدارات الرئيسية Major Versions، من 6 إلى 7 مثلاً، خطوة أكبر، فاقرأ قبله [دليل الترقية الرسمي](https://www.limesurvey.org/manual/Upgrading%5Ffrom%5Fa%5Fprevious%5Fversion?ref=arabroot.io)، وطبق الترقية أولاً على نسخة من البيانات، وتأكد أن قوالبك المخصصة ما زالت تعمل.

## مشكلات شائعة وحلولها Troubleshooting

### الخطأ 400 Bad Request بعد تغيير النطاق

في أول دخول إلى الإدارة ينشئ LimeSurvey الملف `application/config/allowed_hosts.php` بالاسم الذي دخلت منه، وبعدها يرفض أي مضيف آخر ليحمي نفسه من هجمات Host Header Injection، ولكن المضيف المكتوب في `PUBLIC_URL` يبقى موثوقاً دائماً، لذلك اضبط هذا المتغير على النطاق الصحيح ثم أعد إنشاء الـ Container.

وإذا احتجت إلى نطاقات إضافية فعدل الملف، ولاحظ أنه داخل الـ Container وليس في مجلد دائم Persistent، فيضيع عند إعادة إنشائه ويكتب من جديد عند الدخول التالي باسم المضيف الذي دخلت منه، لذلك الأفضل أن تركبه Mount ملفاً من السيرفر.

### بيانات مشفرة يتعذر قراءتها بعد إعادة إنشاء الـ Container

السبب أن المفاتيح لم تكن ثابتة، فأنشأ الـ Container مفاتيح جديدة، فإذا كانت عندك نسخة من الملف `security.php` القديم أو من المفاتيح القديمة فضعها في `.env`، وإلا فلا توجد طريقة لاستعادة الحقول المشفرة، ولهذا نضبط المفاتيح من اليوم الأول.

### نسيت كلمة مرور المدير

استخدم أمر إعادة التعيين من سطر الأوامر:

```bash
docker compose exec limesurvey php application/commands/console.php resetpassword admin 'كلمة-مرور-جديدة-طويلة'
```

والمخرج سوف يكون كما يلي:

```bash
Password for user admin was set.
```

### روابط الدعوات أو الموارد تبدأ بـ http://

السبب أن `PUBLIC_URL` غير مضبوط أو يبدأ بـ `http://`، فاجعله `https://survey.example.com`، ثم فعل Force HTTPS من إعدادات الأمان.

### الخطأ Row size too large عند التفعيل

في الاستبيان أعمدة كثيرة جداً، مثل المصفوفات Arrays الكبيرة، تتجاوز حد حجم الصف Row Size Limit في InnoDB، والحل أن تقسم الاستبيان أو تقلل الأسئلة الفرعية، أو أن تضبط `DB_MYSQL_ENGINE` على MyISAM لهذه الحالة وحدها وتقبل عيوبه.

### تعذر رفع ملف من المشارك

لسؤال [File upload](https://www.limesurvey.org/manual/Question%5Ftype%5F-%5FFile%5Fupload?ref=arabroot.io) حد للحجم في إعداداته، وفوقه حد PHP في الـ Image، ثم حد الـ Reverse Proxy، لذلك ارفع حد السؤال أولاً، ثم حد الـ Reverse Proxy إذا ظهر الخطأ `413`.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- Google Forms وSurveyMonkey سهلة، ولكن الإجابات الحساسة تبقى عند شركة أخرى وتتأثر بأخطائها، وLimeSurvey يبقيها في قاعدة بيانات على سيرفرك برخصة GPL.
- لا توجد Docker Image رسمية، و`martialblog/limesurvey` خيار جيد ولكنها تتأخر أياماً عن الإصدارات، فتابع الإصدارات الأمنية.
- مرر `ENCRYPT_NONCE` و`ENCRYPT_SECRET_BOX_KEY` من اليوم الأول واحفظهما مع كل نسخة احتياطية، وإلا ضاعت البيانات المشفرة عند أول تحديث.
- استخدم InnoDB لجداول الإجابات، واضبط `PUBLIC_URL` على النطاق الحقيقي، وادخل أول مرة منه.
- اجعل العربية اللغة الأساسية قبل كتابة الاستبيان، واضبط إخفاء الهوية قبل التفعيل.
- انسخ القاعدة والـ Volume و`.env` معاً، واستعد بعد أن تصبح القاعدة `healthy`، وحدث بتغيير الوسم وليس بـ ComfortUpdate.

## سجل التحديثات

- سبتمبر 2026: كتابة الدليل واختباره على LimeSurvey 7.1.2+260917 بالوسم `7.1.2-260917-apache` مع MariaDB 11.8.9.
- أكتوبر 2026: مراجعة الدليل وتحديثه إلى LimeSurvey 7.4.0+260928، واختبار الترقية من 7.1.2، وتصحيح أمر الاستعادة بالخيار `--wait`، وتوضيح رسائل السجل عند إعادة إنشاء الـ Container، وإضافة الرخصة والإصلاحات الأمنية في الإصدار 7.5.0.