محتويات الدليل
- قبل ما نبدأ: ما الذي سنُركّبه؟
- الجزء الأول: تجهيز السيرفر
- الجزء الثاني: رفع ملفات WorkUp
- الجزء الثالث: قاعدة البيانات
- الجزء الرابع: ربط الملفات بقاعدة البيانات
- الجزء الخامس: الدومين، وHTTPS، والجدار الناري
- جدول ملخّص المنافذ (Ports)
- الجزء السادس: إعداد إشعارات الموبايل (اختياري)
- الجزء السابع: بناء وتثبيت تطبيق الموبايل
- استكشاف الأخطاء الشائعة
قبل ما نبدأ: ما الذي سنُركّبه؟
ما الذي تحتاجه قبل البدء
1. جهاز سيرفر (يُسمى أيضاً VPS) يعمل بنظام Ubuntu 22.04 أو أحدث. هذا الدليل مبني على أوبنتو لأنه الأكثر شيوعاً للاستضافة. إذا لم يكن لديك سيرفر بعد، يمكنك استئجار واحد من أي شركة استضافة (Hostinger، DigitalOcean، AWS Lightsail... إلخ).
2. صلاحية دخول عبر SSH (يعني تقدر "تتحكم" بالسيرفر بالكتابة فقط، بدون شاشة) — عادة تحصل عليها من شركة الاستضافة فور الشراء (عنوان IP + كلمة مرور أو مفتاح).
3. نسخة كاملة من مجلد مشروع WorkUp (نفس هذا المجلد الذي تقرأ منه الآن).
4. (اختياري لكن مستحسن) اسم نطاق (Domain) مثل workup.شركتك.com. بدونه، تقدر تستخدم عنوان IP السيرفر مباشرة، لكن لن تقدر تفعّل HTTPS بسهولة.
مثال أمر هكذا يبدو
الجزء الأول: تجهيز السيرفر
الاتصال بالسيرفر عبر SSH
افتح الترمنال على جهازك (Terminal على ماك ولينكس، أو PowerShell/PuTTY على ويندوز) واكتب:
ssh root@عنوان_IP_السيرفر
استبدل عنوان_IP_السيرفر بالرقم الذي أعطتك إياه شركة الاستضافة (مثل 192.168.1.10). سيطلب منك كلمة المرور، اكتبها (لن تظهر أثناء الكتابة، هذا طبيعي) واضغط Enter.
تحديث النظام
أول شيء نفعله دائماً بسيرفر جديد هو تحديث البرامج المثبتة مسبقاً:
sudo apt update && sudo apt upgrade -y
sudo تعني "نفّذ هذا الأمر بصلاحية المدير الكاملة". apt هو "متجر التطبيقات" الخاص بأوبنتو. هذا الأمر يتأكد أن كل شيء بالسيرفر بآخر إصدار وأكثر أماناً قبل أن نبني عليه.
تثبيت Apache (خادم الويب)
Apache هو البرنامج الذي "يستقبل" أي شخص يفتح رابط موقعك، ويُرسل له الصفحة المطلوبة. بدونه، السيرفر لا "يتكلم" مع المتصفحات إطلاقاً.
sudo apt install apache2 -y sudo systemctl enable apache2 sudo systemctl start apache2
enable تعني "شغّله تلقائياً كل مرة يُعاد تشغيل السيرفر"، وstart تعني "شغّله الآن فوراً". Apache يعمل تلقائياً على المنفذ 80.
جرّبه الآن: افتح متصفحك واذهب إلى http://عنوان_IP_السيرفر. يجب أن تظهر صفحة "Apache2 Default Page" الخضراء. إن ظهرت، فهذا يعني أن الخطوة نجحت 100%.
تثبيت MySQL (قاعدة البيانات)
MySQL هو البرنامج الذي سيحفظ فيه WorkUp كل شيء: أسماء الموظفين، سجلات الحضور، الطلبات، المهام... كل شيء. فكّر فيه كـ"خزانة ملفات ضخمة ومنظّمة".
sudo apt install mysql-server -y sudo mysql_secure_installation
الأمر الثاني سيسألك عدة أسئلة أمنية (كلمة مرور المدير، حذف مستخدمين تجريبيين...) — أجب بـ Y (نعم) على أغلبها، وضع كلمة مرور قوية لحساب المدير (root) وتذكّرها جيداً.
إنشاء قاعدة بيانات ومستخدم خاص بـ WorkUp
ادخل لبرنامج MySQL:
sudo mysql -u root -p
اكتب كلمة المرور التي وضعتها بالخطوة السابقة. الآن أنت "داخل" MySQL (سترى mysql>). انسخ والصق هذه الأوامر واحداً تلو الآخر (كل سطر ثم Enter):
-- ننشئ قاعدة بيانات فارغة اسمها workup CREATE DATABASE workup CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- ننشئ مستخدماً جديداً خاصاً بالتطبيق فقط (وليس root) CREATE USER 'workup_user'@'localhost' IDENTIFIED BY 'ضع_كلمة_مرور_قوية_هنا'; -- نعطي هذا المستخدم صلاحية كاملة، لكن فقط على قاعدة workup تحديداً GRANT ALL PRIVILEGES ON workup.* TO 'workup_user'@'localhost'; FLUSH PRIVILEGES; EXIT;
لماذا لا نستخدم root مباشرة داخل التطبيق؟ لأنه لو تسرّبت بيانات الاتصال يوماً ما، حساب workup_user المحدود لا يقدر يلمس أي قاعدة بيانات أخرى على نفس السيرفر — بينما root يقدر يفعل أي شيء. هذا مبدأ أمني اسمه "أقل صلاحية ممكنة".
تثبيت PHP والإضافات (Extensions) التي يحتاجها WorkUp
PHP هي اللغة التي كُتب بها كل كود WorkUp. لكن PHP وحدها لا تكفي — تحتاج "إضافات" صغيرة لتقدر تفعل أشياء معيّنة (التعامل مع قواعد البيانات، الصور، ملفات ZIP...). ثبّت PHP وكل الإضافات دفعة واحدة:
sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-zip php-xml -y
| الإضافة | لماذا يحتاجها WorkUp بالضبط |
|---|---|
php-mysql | تسمح لـ PHP "بالتحدث" مع قاعدة بيانات MySQL — بدونها، لا يقدر الموقع حتى يقرأ اسم موظف واحد. |
php-curl | يستخدمها WorkUp لإرسال إشعارات الموبايل عبر Firebase/OneSignal، ولبعض مكتبات التقارير الداخلية. |
php-gd | معالجة الصور (تصغيرها، التحقق من صحتها) عند رفع صورة موظف أو مرفق مهمة، وأيضاً لتوليد ملفات PDF (التقارير وكشوفات الحضور). |
php-mbstring | يتأكد أن النصوص العربية والإنجليزية تُعرض وتُخزَّن بشكل صحيح دون تشويه للحروف. |
php-zip | يُستخدم عند تصدير تقارير حضور الفريق كملف ZIP يحتوي عدة ملفات دفعة واحدة. |
php-xml | تحتاجها مكتبات التقارير/PDF الداخلية الموجودة أصلاً داخل مجلد المشروع. |
بعد التثبيت، أعد تشغيل Apache حتى يتعرّف على PHP:
sudo systemctl restart apache2
تفعيل mod_rewrite و FollowSymlinks
WorkUp يستخدم روابط "جميلة" مثل workup.com/login بدل workup.com/auth/login.php. هذا يحتاج ميزة اسمها mod_rewrite:
sudo a2enmod rewrite
الآن افتح ملف إعدادات أباتشي الرئيسي:
sudo nano /etc/apache2/apache2.conf
ابحث عن (بالسهم لأسفل، أو Ctrl+W بالبحث) هذا الجزء:
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
غيّر AllowOverride None إلى AllowOverride All فقط (اترك الباقي كما هو). احفظ بالضغط Ctrl+O ثم Enter، ثم اخرج بـ Ctrl+X. بعدها أعد تشغيل أباتشي:
sudo systemctl restart apache2
لماذا هذا مهم؟ ملف .htaccess الموجود داخل مجلد WorkUp يطلب صراحةً هذه الميزة (+FollowSymlinks) وقواعد إعادة التوجيه (RewriteRule) للروابط الجميلة. بدون AllowOverride All، سيتجاهل أباتشي ملف .htaccess بالكامل وستظهر أخطاء 404 لكل صفحة تقريباً.
الجزء الثاني: رفع ملفات WorkUp للسيرفر
إنشاء المجلد الصحيح بالاسم الصحيح
هذا مهم جداً: يجب أن يكون اسم المجلد WorkUp بالضبط (بنفس حروف كبيرة/صغيرة)، لأن بعض الملفات الداخلية (صفحات الأخطاء 404/500) تشير لمسار /WorkUp/ مباشرة.
sudo mkdir -p /var/www/html/WorkUp
نسخ الملفات من جهازك إلى السيرفر
عندك أكثر من طريقة، اختر الأسهل لك:
الطريقة 1 — عبر أمر scp (من جهازك مباشرة، بدون برامج إضافية):
scp -r /مسار/مجلد/WorkUp root@عنوان_IP_السيرفر:/var/www/html/
الطريقة 2 — برنامج FileZilla (سحب وإفلات بواجهة رسومية): حمّل FileZilla، اتصل بالسيرفر عبر SFTP (نفس بيانات SSH: المستخدم، الـIP، المنفذ 22)، ثم اسحب مجلد WorkUp بأكمله إلى /var/www/html/.
الطريقة 3 — Git (إذا كان المشروع على GitHub/GitLab):
cd /var/www/html sudo git clone رابط_المستودع WorkUp
ضبط الصلاحيات (Permissions)
الآن نُخبر السيرفر: "أباتشي يملك حق قراءة (وأحياناً كتابة) هذه الملفات":
# نعطي ملكية كل الملفات لمستخدم أباتشي (www-data) sudo chown -R www-data:www-data /var/www/html/WorkUp # صلاحيات القراءة العادية للمجلدات والملفات sudo find /var/www/html/WorkUp -type d -exec chmod 755 {} \; sudo find /var/www/html/WorkUp -type f -exec chmod 644 {} \; # مجلد "files" يحتاج صلاحية أكبر، لأن التطبيق يخزّن بداخله # صور الموظفين ومرفقات المهام تلقائياً وقت الاستخدام sudo chmod -R 775 /var/www/html/WorkUp/files
www-data هو اسم "المستخدم" الذي يعمل به Apache على أوبنتو دائماً. الرقم 755 يعني "أنا أقدر أكتب وأقرأ، والجميع يقدر فقط يقرأ"، بينما 775 يعطي مجموعة أباتشي حق الكتابة أيضاً، وهذا ضروري لمجلد files تحديداً لأن الموقع يُنشئ بداخله مجلدات جديدة تلقائياً (مثلاً عند رفع مرفق مهمة).
الجزء الثالث: استيراد قاعدة البيانات
db.sql.استيراد db.sql
mysql -u workup_user -p workup < /var/www/html/WorkUp/db.sql
اكتب كلمة مرور workup_user التي اخترتها بالخطوة 5. هذا الأمر "يقرأ" ملف db.sql سطراً سطراً وينفّذه داخل قاعدة workup مباشرة — خلال ثوانٍ ستكون كل الجداول (الموظفين، الفرق، الحضور، المهام، الطلبات، الإشعارات...) جاهزة وفارغة تماماً، بانتظار أول مستخدم.
phpMyAdmin (sudo apt install phpmyadmin -y) وارفع db.sql من خلاله بنفس الطريقة التي تعرفها من XAMPP.
الجزء الرابع: ربط الملفات بقاعدة البيانات
تعديل includes/config.php
هذا هو الملف الوحيد الذي يحتوي بيانات الاتصال بقاعدة البيانات. افتحه:
sudo nano /var/www/html/WorkUp/includes/config.php
ستجد بالأعلى هذه الأسطر:
// كما هي الآن (افتراضي محلي)
define("HOST","localhost");
define("USER","root");
define("PASSWORD","");
define("DATABASE","workup");
غيّرها لتطابق ما أنشأته بالضبط في الجزء الثالث:
// بعد التعديل
define("HOST","localhost");
define("USER","workup_user");
define("PASSWORD","ضع_كلمة_المرور_التي_اخترتها");
define("DATABASE","workup");
HOST تبقى localhost لأن قاعدة البيانات موجودة على نفس السيرفر بالضبط (تذكّر: منفذ 3306 المحلي من الجزء الأول). احفظ (Ctrl+O ثم Enter) واخرج (Ctrl+X).
تعديل مسار include_path في .htaccess
افتح ملف .htaccess الرئيسي:
sudo nano /var/www/html/WorkUp/.htaccess
ابحث عن هذا السطر (قرب الأعلى):
php_value include_path "/Applications/XAMPP/htdocs/WorkUp/"
غيّره ليطابق المسار الحقيقي على هذا السيرفر تحديداً (الذي أنشأناه بالخطوة 8):
php_value include_path "/var/www/html/WorkUp/"
هذا السطر يخبر PHP: "عندما يطلب أي ملف كود آخر ملفاً مشتركاً، ابحث هنا أولاً". لو تركت المسار القديم (الخاص بجهاز آخر تماماً)، سيفشل الموقع في تحميل أي شيء تقريباً وستظهر صفحة بيضاء أو خطأ 500.
أعد تشغيل أباتشي لتطبيق كل التعديلات:
sudo systemctl restart apache2
الجزء الخامس: الدومين، وHTTPS، والجدار الناري
ربط اسم النطاق (Domain) بالسيرفر
لو عندك دومين (مثل workup.شركتك.com): أولاً اذهب للوحة تحكم الدومين (من الشركة التي اشتريته منها) وأضف سجل من نوع A يشير لعنوان IP السيرفر. بعدها أنشئ ملف إعدادات خاص بالموقع:
sudo nano /etc/apache2/sites-available/workup.conf
الصق هذا المحتوى بالضبط (استبدل الدومين بدومينك الفعلي):
<VirtualHost *:80>
ServerName workup.شركتك.com
DocumentRoot /var/www/html/WorkUp
<Directory /var/www/html/WorkUp>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
فعّل هذا الموقع وأعد تحميل أباتشي:
sudo a2ensite workup.conf sudo systemctl reload apache2
http://عنوان_IP_السيرفر/WorkUp (لاحظ إضافة /WorkUp بالآخر، لأن المجلد فرعي داخل مجلد أباتشي العام /var/www/html).
تفعيل HTTPS (قفل أمان مجاني عبر Let's Encrypt)
HTTPS يعني أن كل البيانات المرسلة بين المتصفح/التطبيق والسيرفر "مشفّرة" — لا أحد على نفس الشبكة (مقهى، فندق، واي فاي عام) يقدر "يتنصت" ويرى كلمات المرور. هذه الخطوة تتطلب دومين حقيقي (من الخطوة 14):
sudo apt install certbot python3-certbot-apache -y sudo certbot --apache -d workup.شركتك.com
Certbot سيطرح عليك سؤالين بسيطين (بريدك الإلكتروني، والموافقة على الشروط)، ثم يقوم تلقائياً بكل العمل: يُصدر شهادة أمان مجانية، يعدّل إعدادات أباتشي بنفسه، ويفتح المنفذ 443. كما يجدّد الشهادة تلقائياً كل 90 يوماً دون أي تدخل منك.
الجدار الناري (Firewall) — فتح الأبواب الصحيحة فقط
الجدار الناري مثل "حارس أمن" يقرر أي "أبواب" (منافذ) مسموح لأي شخص من الإنترنت الطرق عليها. نفعّله ونفتح فقط ما نحتاج:
sudo ufw allow OpenSSH sudo ufw allow 'Apache Full' sudo ufw enable
OpenSSH يبقي المنفذ 22 مفتوحاً — لا تنسَ هذا السطر أبداً، وإلا ستُقفل الباب على نفسك وتفقد القدرة على الدخول للسيرفر عن بُعد نهائياً! أما 'Apache Full' فيفتح المنفذين 80 و443 معاً دفعة واحدة.
sudo ufw allow OpenSSH نجح قبل كتابة sudo ufw enable. إذا فعّلت الجدار الناري بدون هذا السطر، ستنقطع جلسة SSH الحالية ولن تقدر تتصل بالسيرفر مرة أخرى إلا عبر لوحة تحكم شركة الاستضافة مباشرة (Console/VNC).
التجربة النهائية
افتح المتصفح واذهب إلى رابط موقعك (https://workup.شركتك.com أو http://عنوان_IP_السيرفر/WorkUp). يجب أن تظهر صفحة تسجيل الدخول الخاصة بـ WorkUp — إن ظهرت، فقد أنجزت الجزء الأصعب بنجاح! 🎉
جدول ملخّص كل المنافذ (Ports)
| المنفذ | الاستخدام | مفتوح للإنترنت؟ | لماذا |
|---|---|---|---|
| 22 | SSH — التحكم بالسيرفر عن بعد بالكتابة | نعم | تحتاجه أنت (المدير) للدخول وتنفيذ الأوامر من أي مكان. حافظنا عليه مفتوحاً بأول أمر بخطوة الجدار الناري. |
| 80 | HTTP — تصفّح الموقع العادي (غير مشفّر) | نعم | هو المنفذ الافتراضي لأي متصفح أو تطبيق موبايل عند كتابة http://. Apache يستمع عليه تلقائياً فور تثبيته. |
| 443 | HTTPS — تصفّح مشفّر وآمن | نعم | يُستخدم عند كتابة https://. يُفعَّل تلقائياً عند تثبيت شهادة SSL عبر Certbot (الخطوة 15). موصى به بشدة للإنتاج الفعلي. |
| 3306 | MySQL — التحدث مع قاعدة البيانات | لا | يستخدمه فقط كود PHP الموجود على نفس السيرفر (اتصال محلي/localhost). لا حاجة أبداً لفتحه للإنترنت، وتركه مغلقاً أكثر أماناً. |
الجزء السادس: إعداد إشعارات الموبايل (اختياري)
Firebase أو OneSignal — أيهما تختار؟
Firebase Cloud Messaging (FCM): خدمة مجانية من جوجل، تحتاج مشروع Firebase (من console.firebase.google.com) و"مفتاح سيرفر" (Server Key) من إعدادات المشروع.
OneSignal: خدمة إشعارات مستقلة، أسهل قليلاً بالإعداد الأولي، تحتاج App ID ومفتاح REST API من onesignal.com.
بعد الحصول على المفاتيح (أياً كانت الخدمة)، ادخل للوحة تحكم الإدارة abma ثم الإعدادات، وأدخل المفاتيح في الحقول المخصصة. WorkUp يحفظها ويبدأ استخدامها فوراً بلا حاجة لإعادة تشغيل أي شيء.
الجزء السابع: بناء وتثبيت تطبيق الموبايل
ما الذي تحتاجه على جهاز الكمبيوتر (وليس السيرفر)
هذا الجزء يُنفَّذ على جهاز الكمبيوتر (ويندوز/ماك/لينكس) الذي تعمل عليه، وليس على السيرفر. تحتاج:
1. Flutter SDK — حمّله من flutter.dev واتبع تعليمات التثبيت حسب نظامك.
2. Android Studio — يوفّر لك Android SDK اللازم لبناء تطبيق أندرويد (حتى لو لن تستخدم واجهة Android Studio نفسها).
3. هاتف أندرويد حقيقي (متصل بكابل USB) أو محاكي (Emulator) من Android Studio.
بعد التثبيت، تأكد أن كل شيء تمام بكتابة:
flutter doctor
هذا الأمر يفحص جهازك ويخبرك بعلامة صح (✓) أو خطأ (✗) لكل متطلب. تأكد أن كل شيء أخضر قبل المتابعة.
تحميل مكتبات المشروع (pub get)
افتح الترمنال داخل مجلد تطبيق الموبايل الأساسي (اسمه new_app):
cd new_app flutter pub get
هذا الأمر يقرأ ملف pubspec.yaml ويُحمّل تلقائياً كل "المكوّنات الجاهزة" التي يعتمد عليها التطبيق (كاميرا، خرائط بوصلة القبلة، إشعارات...) — تماماً مثل تحميل قطع ليغو جاهزة بدل صنعها من الصفر.
بناء ملف التثبيت (APK)
flutter build apk --release
هذا الأمر يحوّل كل كود Dart إلى ملف واحد قابل للتثبيت على أي هاتف أندرويد. قد يستغرق عدة دقائق أول مرة. الملف الناتج سيكون هنا بالضبط:
new_app/build/app/outputs/flutter-apk/app-release.apk
نقل الملف للهاتف وتثبيته
الطريقة 1 (الأسهل): إذا كان الهاتف متصلاً بالكمبيوتر عبر USB مع تفعيل "وضع المطوّر" (Developer Options) و"تصحيح USB" (USB Debugging)، اكتب:
flutter install
الطريقة 2: ارفع ملف app-release.apk على Google Drive أو أرسله عبر واتساب/بريد لنفسك، وحمّله على الهاتف مباشرة.
في الحالتين، أول مرة تُثبّت تطبيقاً من خارج متجر جوجل، سيطلب منك الهاتف تفعيل خيار اسمه "السماح بالتثبيت من مصادر غير معروفة" (Install unknown apps) — وافق عليه فقط لهذا التطبيق تحديداً.
أول تشغيل: ربط التطبيق بالسيرفر
عند فتح التطبيق لأول مرة، ستظهر شاشة تطلب "عنوان السيرفر". عندك خياران:
مسح رمز QR: إذا جهّزت رمز QR يحتوي رابط سيرفرك (نص عادي أو JSON بمفتاح backend_url)، امسحه مباشرة من كاميرا التطبيق.
الإدخال اليدوي: اكتب رابط سيرفرك بالكامل مع http:// أو https://، مثل:
https://workup.شركتك.com
التطبيق يحفظ هذا الرابط داخلياً ولن يسألك عنه مرة أخرى. بعدها، سجّل الدخول بحساب موظف حقيقي موجود بقاعدة البيانات (أنشأه أولاً من لوحة abma إن لم يكن موجوداً).
استكشاف الأخطاء الشائعة
include_path في .htaccess (الخطوة 13) لا يطابق المكان الحقيقي للملفات. تحقق من سجل الأخطاء لمعرفة السبب بالضبط:
sudo tail -f /var/log/apache2/error.logافتح الموقع بمتصفح جديد بينما هذا الأمر يعمل، وشاهد آخر سطر يظهر — سيخبرك بالسطر والملف بالضبط.
includes/config.php وأزل التعليق (/* */) عن أول سطرين بالأعلى، ثم أعد تحميل الصفحة لترى رسالة الخطأ الحقيقية.includes/config.php (المستخدم، كلمة المرور، اسم القاعدة) مطابقة تماماً لما أنشأته في الخطوة 5، وتأكد أن خدمة MySQL تعمل فعلاً:
sudo systemctl status mysql
mod_rewrite مفعّل وأن AllowOverride All مضبوطة فعلاً (الخطوة 7)، ثم أعد تشغيل أباتشي.files ومالكه (الخطوة 10) — يجب أن يكون www-data ويملك صلاحية 775.http:// أو https:// بدون علامة / بالنهاية)، وأن الجدار الناري يسمح بالمنفذ المستخدم (80 أو 443)، وأن الهاتف يقدر يصل فعلاً لعنوان السيرفر (جرّب فتح نفس الرابط من متصفح الهاتف أولاً).sudo ufw allow OpenSSH قبل enable (الخطوة 16). الحل: ادخل للسيرفر عبر لوحة تحكم شركة الاستضافة مباشرة (خيار اسمه غالباً Console أو VNC)، ثم نفّذ:
sudo ufw allow OpenSSH sudo ufw reload