عندما تحتاج جهة ما إلى أن تسأل عملاءها عن رضاهم أو تسأل موظفيها عن بيئة العمل أو تجمع بيانات بحث علمي، فإن أول ما يفعله الجميع هو أن يفتح Google Forms أو خدمة استبيانات Surveys سحابية Cloud مثل SurveyMonkey، وهذا حل معقول لأنه لا يحتاج إلى أي إعداد وتجد الرابط جاهزاً خلال دقائق، ولكن لاحظ أن كل إجابة يكتبها المشارك سوف تحفظ على سيرفرات Servers شركة أخرى لا تتحكم فيها، وأن هذه الإجابات تحتوي غالباً على بيانات شخصية Personal Data وآراء حساسة، مثل رأي الموظف في مديره أو حالة المريض أو راتب المشارك، وعندما يقع خلل أمني عند مزود الخدمة فأنت لا تملك إلا أن تنتظر رسالة الاعتذار.
والحل الأنسب للإجابات الحساسة هو أن تشغل منصة الاستبيانات على سيرفرك، وهنا يأتي دور LimeSurvey، وهي أقدم منصات الاستبيانات مفتوحة المصدر Open Source وأنضجها، ورخصتها GPL الإصدار 2 أو ما بعده للنسخة المجتمعية Community Edition، وفيها أكثر من ثلاثين نوعاً من الأسئلة، ومنطق شرطي Conditional Logic يوجه المشارك حسب إجاباته، والحصص Quotas التي توقف الاستبيان عند عدد محدد من فئة معينة، وقوائم المشاركين Participants برموز الدعوة Tokens، والاستبيانات مجهولة الهوية Anonymous، والعربية مدعومة بالكامل من اليمين إلى اليسار، ويمكنك أن تضع عدة لغات في الاستبيان الواحد، ثم تصدر 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 التي يصونها Adam Zammit، وmartialblog/limesurvey التي سوف نستخدمها في هذا الدليل، والسبب أن متغيرات البيئة Environment Variables فيها موثقة بالكامل ومنها متغيرات مفاتيح التشفير، وأنها تعمل افتراضياً بمستخدم غير root، وأن كل إصدار منها يمر باختبارات آلية Automated Tests على فرع Branch الإصدارات طويلة الدعم LTS وعلى الفرع الأحدث، وأن الكود Source Code الخاص بها مفتوح على GitHub.
وصاحب الـ Image يبني نسخة لكل إصدار Release جديد من LimeSurvey خلال أيام، فمثلاً صدر الإصدار 7.1.2 في 17 سبتمبر وظهرت الـ Image الخاصة به في 22 سبتمبر، وصدر الإصدار 7.4.0 في 28 سبتمبر وظهرت الـ Image الخاصة به في 2 أكتوبر، لذلك إذا صدر إصدار فيه إصلاحات أمنية Security Fixes فسوف تنتظر بضعة أيام حتى يصلك عبر الـ Image، وهذا هو الثمن الذي تدفعه مقابل عدم وجود Image رسمية.
وللـ Image ثلاثة أنواع: apache وهو الأبسط لأن خادم الويب Web Server موجود داخله، وfpm وfpm-alpine لمن يريد خادم ويب منفصلاً، والوسوم Tags بصيغة 7.4.0-260928-apache، أي رقم إصدار LimeSurvey ثم رقم البناء Build Number ثم النوع. وتجنب الـ Images القديمة التي تذكرها أدلة سابقة، فبعضها توقف عند الإصدار 5 أو 6.
ما تحتاجه قبل أن تبدأ Requirements
- سيرفر مثبت عليه Docker وCompose، وإذا لم تثبته بعد فابدأ بدليل تثبيت Docker على Ubuntu.
- الموارد Resources: يستهلك الـ Container الخاص بـ LimeSurvey قرابة 100 ميجابايت من الذاكرة RAM، وMariaDB قرابة 145 ميجابايت دون حمل Idle، وإذا كنت تتوقع آلاف المشاركين في وقت واحد فخطط لموارد أكبر.
- نطاق Domain مثل
survey.example.com، وReverse Proxy يعمل بـ HTTPS مثل Nginx Proxy Manager ومتصل بشبكة Network في Docker باسمproxy. - خدمة SMTP إذا كنت سوف تراسل المشاركين بالدعوات والتذكيرات.
تثبيت LimeSurvey بـ Docker Compose
نبدأ بإنشاء مجلد للخدمة يحفظ فيه ملف Compose وملف الأسرار:
sudo mkdir -p /opt/limesurvey
sudo chown $USER: /opt/limesurvey
cd /opt/limesurveyالأسرار Secrets ومفاتيح التشفير
يستطيع LimeSurvey تشفير بيانات المشاركين وإجابات أسئلة محددة داخل قاعدة البيانات Database، فإذا تسربت نسخة من القاعدة فلن يقرأ من أخذها هذه الحقول، ولكن مفاتيح التشفير محفوظة في الملف application/config/security.php داخل الـ Container، وهنا المشكلة: إذا لم تمرر المفاتيح إلى الـ Image فسوف ينشئ LimeSurvey مفاتيح جديدة في كل مرة تعيد فيها إنشاء الـ Container، كما يحدث عند كل تحديث، وتضيع معها كل البيانات المشفرة!
والسجل Log يقول ذلك صراحة عند التشغيل دون مفاتيح: Warning: THIS FILE NEEDS TO BE PERSISTENT، لذلك سوف ننشئ المفاتيح مرة واحدة ونحفظها في الملف .env مع كلمات المرور، وطول الـ Nonce هو 24 بايت وطول المفتاح 32 بايت، وكلاهما بصيغة hex كما ينشئهما LimeSurvey نفسه:
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.
ENCRYPT_NONCE وENCRYPT_SECRET_BOX_KEY في مدير الأسرار Secrets Manager، وأرفقهما بكل نسخة احتياطية، ولا تقم بتغييرهما بعد أن تبدأ في جمع البيانات، والسبب أنه لا توجد أي طريقة لقراءة الحقول المشفرة في قاعدة البيانات دون المفتاحين الأصليين.ملف Compose
الآن سوف ننشئ الملف /opt/limesurvey/compose.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: [email protected]
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 لجداول Tables الإجابات، وهذا المحرك لا يدعم المعاملات Transactions ولا يتحمل الانقطاع المفاجئ، لذلك اخترنا InnoDB لأنه أنسب لبيئة الإنتاج Production ويسمح بأخذ تفريغ Dump متسق والخدمة تعمل، وقيده الوحيد ألا يتجاوز الاستبيان الواحد نحو ألف عمود Column، أي ألف سؤال فرعي تقريباً.
- ADMIN_*: يقرأ LimeSurvey هذه القيم في التثبيت الأول فقط، وتغييرها بعد ذلك لا يفعل أي شيء، لذلك غير كلمة المرور Password من واجهة الويب Web UI.
- PUBLIC_URL: هو الرابط العام Public URL الذي يبني منه LimeSurvey روابط الاستبيانات والدعوات، والمضيف Host المكتوب فيه يعد موثوقاً Trusted تلقائياً (انظر قسم المشكلات عن
allowed_hosts.php)، أماSHOW_SCRIPT_NAME: "false"فيحذفindex.phpمن الروابط، والخياران مشروحان في صفحة الإعدادات الاختيارية. - ls_upload: فيه القوالب Templates والإضافات Plugins والملفات المرفوعة وملفات الإجابات، وهو Named Volume، لذلك ينسخ Docker إليه محتوى الـ Image الأصلي في التشغيل الأول، أما إذا استبدلت به مجلداً من السيرفر Bind Mount فعليك أن تملأه بنفسك بمحتوى المجلد
uploadمن حزمة Package الخاصة بـ LimeSurvey. - فحص الصحة Healthcheck: الـ Image لا تحتوي على فحص جاهز، فأضفنا فحصاً يتأكد أن Apache يقدم الملفات، وهذا الفحص لا يختبر PHP ولا قاعدة البيانات، ولكنه لا يتأثر بقائمة المضيفين المسموح بهم Allowed Hosts، فلا يتحول الـ Container إلى unhealthy بسببها.
- الـ Container يعمل بالمستخدم User المسمى
www-data، ويستمع داخلياً على المنفذ Port رقم8080، ولا ننشر أي منفذ على السيرفر لأن الـ Reverse Proxy يصل إليه عبر الشبكةproxy.
بعد ذلك نشغل الخدمة ونتابع السجل:
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 بعد ذلك فالمخرج سوف يكون كما يلي:
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 تنبيهين مهمين، الأول أنه أنشأ ملف المضيفين الموثوقين بالاسم الذي دخلت منه، لذلك ادخل أول مرة من النطاق الحقيقي وليس من عنوان IP، والثاني أن SSL غير مفروض، فإذا كان الموقع يعمل عبر HTTPS فافتح Configuration ثم Global settings ثم Security، واجعل Force HTTPS على On، ومن الإعدادات العامة نفسها قم بما يلي:
- غير كلمة مرور المدير Administrator من قائمة الحساب، وأنشئ لكل من يدير الاستبيانات حساباً خاصاً بصلاحيات Permissions محددة من Configuration ثم Users، والسبب أن الحساب المشترك لا يخبرك من غير ماذا.
- اضبط البريد من Global settings ثم Email settings (SMTP مع TLS)، وأرسل رسالة تجريبية Test Email.
- اضبط لغة الواجهة الافتراضية والمنطقة الزمنية Time Zone.
إنشاء استبيان عربي
في LimeSurvey 7 محرر Editor جديد يعرض الاستبيان كما سوف يراه المشارك، فاضغط الزر + ثم Create survey، وسوف ينشئ المحرر استبياناً فيه مجموعة أسئلة Question Group وسؤال نموذجي، ثم تكتب العناوين والنصوص في أماكنها مباشرة والمحرر يحفظ كل تعديل تلقائياً Autosave. وفي المثال التالي كتبنا العنوان «استبيان رضا العملاء» ووصفاً ترحيبياً، وأنشأنا مجموعة «الخدمة» فيها سؤال اختيار متعدد Multiple Choice:

اللغة: يبدأ الاستبيان بلغة الواجهة الافتراضية، فإذا أردت استبياناً عربياً فأضف العربية إلى اللغات من الإعدادات العامة للاستبيان General settings، واجعلها اللغة الأساسية Base language، واحذف الإنجليزية إذا لم تحتج إليها، وبهذا تظهر أزرار الاستبيان ورسائله للمشارك بالعربية ومن اليمين إلى اليسار RTL.
وقم بذلك قبل أن تكتب المحتوى، والسبب أنك إذا غيرت اللغة الأساسية بعد الكتابة فعليك أن تنقل العنوان والوصف إلى اللغة الجديدة يدوياً.
بعد ذلك تختار من شريط الإعدادات عرض سؤال واحد أو مجموعة واحدة في كل صفحة، والسماح بالرجوع، وإظهار شريط التقدم Progress Bar، وإذا كان الاستبيان يعد المشاركين بإخفاء هوياتهم Anonymization فقم بتفعيل الإجابات مجهولة الهوية Anonymized responses. وتذكر أن هذا الخيار يضبط قبل التفعيل ولا يمكن تغييره بعده.
تفعيل الاستبيان Activation ومشاركته
الزر Activate يثبت هيكل Structure الاستبيان وينشئ جدول الإجابات، وبعد التفعيل لا تستطيع أن تضيف أسئلة أو تحذفها إلا إذا أوقفت الاستبيان، والإيقاف ينقل الإجابات إلى جدول أرشيف Archive Table منفصل، لذلك راجع الاستبيان بزر المعاينة Preview (رمز العين) قبل أن تفعله.
وبعد التفعيل تظهر نافذة المشاركة، وفيها الرابط العام ورمز QR ونوع الوصول Access Mode، أي هل يشارك كل من معه الرابط أم المدعوون برموز فقط:

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


قراءة النتائج
تبويب Tab المسمى Results يعرض ملخصاً فيه العدد الكلي للإجابات والمكتمل منها وغير المكتمل ومنحنى Chart الإجابات، وفيه أيضاً قائمة الإجابات وإحصاءات Statistics كل سؤال، ومن Export results تصدر الإجابات إلى CSV أو Excel أو SPSS أو R، وعند التصدير بالعربية سوف تجد عناوين الأعمدة ونصوص الإجابات بالعربية كما كتبتها:

كيف تتأكد أن كل شيء يعمل 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، والأخير هو الأهم لأن فيه مفاتيح التشفير، ونسخة من القاعدة دون المفاتيح لا تقرأ منها الحقول المشفرة:
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 بالمفاتيح نفسها، وشغل قاعدة البيانات وحدها، ثم استعد التفريغ والملفات، ثم شغل التطبيق، وسوف يجد السكربت القاعدة جاهزة فلا يعيد التثبيت:
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 ومعه، كما في ملاحظات الإصدار، إصلاح ست ثغرات أمنية منها حقن SQL Injection في الإحصاءات وقراءة ملفات السيرفر عبر خيارات القوالب، وكلها تحتاج إلى حساب مستخدم في لوحة الإدارة، لذلك حدث بمجرد أن تظهر الـ Image الخاصة بالإصدار الجديد، وإلى أن تظهر فلا تعط حسابات الإدارة إلا لمن تثق به.
ومع Docker Image لا تقم باستخدام أداة التحديث المدمجة ComfortUpdate، والسبب أنها تعدل الملفات داخل الـ Container وتضيع التعديلات عند إعادة إنشائه، وإنما غير الوسم فقط، والسكربت يطبق ترحيلات Migrations قاعدة البيانات عند الإقلاع Startup عبر الأمر updatedb:
- راجع ملاحظات الإصدار Release Notes ووسوم الـ Image.
- خذ نسخة احتياطية.
- غير الوسم في
compose.yamlإلى الإصدار الجديد بصيغته الكاملة (مثل7.5.0-2610xx-apache)، ثم نفذ:
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 مثلاً، خطوة أكبر، فاقرأ قبله دليل الترقية الرسمي، وطبق الترقية أولاً على نسخة من البيانات، وتأكد أن قوالبك المخصصة ما زالت تعمل.
مشكلات شائعة وحلولها Troubleshooting
الخطأ 400 Bad Request بعد تغيير النطاق
في أول دخول إلى الإدارة ينشئ LimeSurvey الملف application/config/allowed_hosts.php بالاسم الذي دخلت منه، وبعدها يرفض أي مضيف آخر ليحمي نفسه من هجمات Host Header Injection، ولكن المضيف المكتوب في PUBLIC_URL يبقى موثوقاً دائماً، لذلك اضبط هذا المتغير على النطاق الصحيح ثم أعد إنشاء الـ Container.
وإذا احتجت إلى نطاقات إضافية فعدل الملف، ولاحظ أنه داخل الـ Container وليس في مجلد دائم Persistent، فيضيع عند إعادة إنشائه ويكتب من جديد عند الدخول التالي باسم المضيف الذي دخلت منه، لذلك الأفضل أن تركبه Mount ملفاً من السيرفر.
بيانات مشفرة يتعذر قراءتها بعد إعادة إنشاء الـ Container
السبب أن المفاتيح لم تكن ثابتة، فأنشأ الـ Container مفاتيح جديدة، فإذا كانت عندك نسخة من الملف security.php القديم أو من المفاتيح القديمة فضعها في .env، وإلا فلا توجد طريقة لاستعادة الحقول المشفرة، ولهذا نضبط المفاتيح من اليوم الأول.
نسيت كلمة مرور المدير
استخدم أمر إعادة التعيين من سطر الأوامر:
docker compose exec limesurvey php application/commands/console.php resetpassword admin 'كلمة-مرور-جديدة-طويلة'والمخرج سوف يكون كما يلي:
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 حد للحجم في إعداداته، وفوقه حد 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.