كودي شغال محلياً بس لا يشتغل على السيرفر
ليش وكيف أحل؟
دليل عملي للمطورين — الأسباب الحقيقية والحلول خطوة بخطوة
“يشتغل عندي!” — جملة سمعها كل مطور في حياته. تكتب الكود، تجرّبه محلياً ويشتغل بشكل مثالي، ثم ترفعه على السيرفر وكل شي ينهار. المشكلة مو في الكود نفسه في الغالب — بل في الفرق بين بيئة التطوير وبيئة الإنتاج. في هذا المقال نكشف أبرز الأسباب ونعطيك الحل لكل واحد.
جدول المقارنة بين البيئتين
| العنصر | محلياً (Local) | السيرفر (Server) |
|---|---|---|
| نظام التشغيل | Windows / macOS | Linux غالباً |
| إصدار اللغة | آخر إصدار عندك | إصدار قديم أحياناً |
| المكتبات | مثبّتة كلها | قد تكون ناقصة |
| متغيرات البيئة | في ملف .env | تحتاج تُضاف يدوياً |
| الصلاحيات | Admin كاملة | مقيّدة في الغالب |
| قاعدة البيانات | SQLite / محلية | PostgreSQL / MySQL |
الأسباب الحقيقية — مع الحل لكل سبب
متغيرات البيئة مفقودة على السيرفر
السبب الأكثر شيوعاً بفارق كبير. محلياً عندك ملف .env فيه كل شي — مفاتيح API، بيانات قاعدة البيانات، روابط الخدمات. لما ترفع الكود على السيرفر، هذا الملف ما يُرفع (وهذا صح لأسباب أمنية) — لكن الكود يبحث عنه ويفشل.
export DB_HOST=your-db-host. على منصات مثل Heroku أو Railway: أضفها من لوحة التحكم تحت “Environment Variables”. وتأكد إنك ما ترفع ملف .env على GitHub أبداً.
اختلاف إصدار اللغة أو المكتبات
عندك Node.js 20 محلياً، السيرفر عليه Node.js 16. أو عندك Python 3.11 وهم عندهم 3.8. تغييرات بسيطة في الإصدارات تكسر الكود بدون أي رسالة خطأ واضحة أحياناً.
engines في package.json، وفي Python استخدم .python-version مع pyenv. والأفضل استخدم Docker لتحديد البيئة بدقة كاملة.
مكتبات مثبّتة عندك بس غير موثّقة
ثبّت مكتبة عالمياً على جهازك (npm install -g something) ونسيت تضيفها لملف package.json. محلياً يشتغل لأنها موجودة — على السيرفر تفشل لأنها ما اتثبّتت.
npm ci أو pip install -r requirements.txt في بيئة نظيفة وتأكد إن كل شي يشتغل. هذا يحاكي ما سيحدث على السيرفر بالضبط.
اختلاف نظام التشغيل — Windows vs Linux
من أخفى المشاكل وأكثرها إرباكاً. Windows يتعامل مع مسارات الملفات بـ \ وLinux بـ /. وWindows غير حساس لحالة الأحرف في أسماء الملفات، بينما Linux حساس — Image.png وimage.png ملفان مختلفان!
اختلاف قاعدة البيانات
تطوّر محلياً على SQLite لأنها سهلة ومو تحتاج إعداد، لكن السيرفر يستخدم PostgreSQL أو MySQL. بعض الاستعلامات تشتغل على SQLite لكن ترفض على PostgreSQL بسبب فروقات في الـ SQL syntax.
صلاحيات الملفات والمجلدات
محلياً أنت Admin وتقدر تكتب في أي مكان. على السيرفر، المستخدم اللي يشغّل التطبيق قد ما يملك صلاحية الكتابة في بعض المجلدات — خصوصاً لما يحاول يكتب ملفات مؤقتة أو Logs.
الحل الجذري — Docker
Docker يضع كودك مع كل بيئة تشغيله داخل “حاوية” — نفس نظام التشغيل، نفس الإصدارات، نفس المكتبات، في كل مكان. جهازك، جهاز زميلك، السيرفر — كلهم يشغّلون نفس الشي بالضبط.
أنشئ ملف Dockerfile في مشروعك
أنشئ ملف docker-compose.yml لإدارة الخدمات
شغّل المشروع بأمر واحد — محلياً وعلى السيرفر
أسئلة شائعة
ليش الكود يشتغل محلياً ولا يشتغل على السيرفر؟
السبب الأكثر شيوعاً هو اختلاف البيئة — إصدار مختلف للغة، مكتبات ناقصة، أو متغيرات بيئة غير موجودة على السيرفر. راجع الأسباب الستة في المقال وطبّق الحلول بالترتيب.
كيف أعرف ليش فشل التطبيق على السيرفر؟
أول شي افتح الـ Server Logs — كل خطأ مكتوب هناك بالتفصيل. في Linux: journalctl -u myapp أو راجع ملفات الـ Logs في مجلد التطبيق. رسالة الخطأ ستدلّك مباشرة على السبب.
هل Docker ضروري لكل مشروع؟
مو ضروري لكل مشروع، لكنه الحل الأمثل للمشاريع الجدية. للمشاريع الصغيرة، يكفي توثيق إصدار اللغة والمكتبات بدقة ومزامنة متغيرات البيئة يدوياً.
هل أرفع ملف .env على GitHub؟
لا أبداً — ملف .env يحتوي بيانات حساسة مثل مفاتيح API وكلمات مرور قاعدة البيانات. أضفه لـ .gitignore فوراً. بدلاً من ذلك، أنشئ ملف .env.example يوضح المتغيرات المطلوبة بدون قيمها الحقيقية.
الخلاصة
مشكلة “يشتغل عندي بس مو على السيرفر” في 90% من الحالات سببها اختلاف البيئة — مو خطأ في الكود. ابدأ بفحص متغيرات البيئة، ثم إصدارات اللغة والمكتبات، ثم الفروقات بين الأنظمة. والحل الجذري اللي يوفّر عليك هذا الصداع كله هو Docker — بيئة واحدة تشتغل في كل مكان.
