لماذا تستضيف نظام الفوترة بنفسك
يفرض موردو الفوترة السحابية رسومًا لكل مستخدم أو لكل حجم معاملات. تبدأ FreshBooks من 19 $ شهريًا لمستخدم واحد، وتتراوح أسعار QuickBooks Online بين 35 $ و90 $ شهريًا حسب الخطة. مع نمو فريقك أو ارتفاع عدد عملائك، يرتفع الفاتور السحابي خطيًا دون عائد مقابل. على خادم VPS بسعر 99 درهم/شهر، يعمل Invoice Ninja بدون حدود للمستخدمين أو العملاء، ويبقى التكلفة ثابتة بغض النظر عن النمو. تبقى بيانات الفوترة في بنيتك التحتية الخاصة، خاضعة لسياسة الاحتفاظ التي تحددها، دون المرور عبر خوادم طرف ثالث. أكثر من 100,000 شركة حول العالم اختارت النشر الذاتي لـInvoice Ninja.
ما تحصل عليه مع Invoice Ninja 5.13.45
- عروض الأسعار والفواتير المتكررة وإشعارات الائتمان وأوامر الشراء في واجهة موحدة
- بوابات دفع مدمجة: Stripe وPayPal وSEPA وMollie وGoCardless وأكثر من عشرين أخرى
- بوابة عملاء ذاتية الاستضافة مع عرض الفواتير ودفعها عبر الإنترنت
- تتبع الوقت القابل للفوترة حسب المشروع والمهمة، مع إمكانية ربطه بسطور الفاتورة
- API REST كاملة وwebhooks للربط مع نظام ERP أو CRM أو خط أنابيب المحاسبة
- مصادقة OIDC عامة أضيفت في الإصدار 5.13.43 (18 سبتمبر 2026) لـSSO المؤسسي
- دعم عملات متعددة ولغات متعددة مع توليد PDF محلي على جانب الخادم
- وحدة white-label اختيارية بـ30 $ سنويًا لإزالة عبارة «Created with Invoice Ninja»
المتطلبات الدنيا لـ Invoice Ninja 5.13.45
الإصدار 5.13.45 الصادر في 9 أكتوبر 2026 يتطلب بيئة دنيا محددة. خصص ما لا يقل عن 2 GB من الذاكرة العشوائية للمجموعة الكاملة: يستهلك حاوية PHP-FPM الخاصة بـInvoice Ninja ما بين 300 و500 MB تحت الحمل، ويأخذ MySQL 8.4 LTS ما بين 400 و700 MB حسب حجم buffer pool، ويبقى Redis 7.4 خفيفًا بـ30–50 MB في وضع الخمول. يوفر خادم VPS بـ2 vCPU و4 GB من الذاكرة هامشًا مريحًا لتوليد PDF متوازٍ. خصص 10 GB على الأقل لوحدات تخزين Docker. MySQL 8.4 LTS موصى به حتى 2032؛ تجنب MariaDB بسبب تعارضات معروفة مع ترحيلات Invoice Ninja v5. مطلوب Docker Engine 24+ وDocker Compose v2.x.
نشر Invoice Ninja على VPS
تجهيز دليل العمل
اتصل بخادمك عبر SSH وأنشئ دليلًا مخصصًا:
mkdir -p /opt/invoiceninja/{data,logs,public} && cd /opt/invoiceninja. سيحتوي هذا الدليل على ملف Compose وملف البيئة ووحدات التخزين الدائمة. تحقق من تثبيت Docker وDocker Compose v2: يجب أن يُرجع docker compose version إصدارًا من فئة 2.x.إنشاء ملف docker-compose.yml
أنشئ
/opt/invoiceninja/docker-compose.yml بالخدمات التالية. تستخدم خدمة db صورة mysql:8.4 مع وحدة تخزين مسماة db_data. تستخدم خدمة redis الصورة redis:7.4-alpine. تستخدم خدمة app الصورة invoiceninja/invoiceninja:5.13.45 وتعتمد على db وredis؛ شغّل ./data:/var/www/app/storage و./public:/var/www/app/public. اكشف المنفذ 9000 داخليًا فقط — سيتولى nginx الواجهة العامة.ضبط متغيرات البيئة
أنشئ
/opt/invoiceninja/.env (لا تُدرجه في نظام التحكم بالإصدارات أبدًا). المتغيرات الأساسية: APP_ENV=production، APP_DEBUG=false، APP_URL=https://votre-domaine.com، DB_HOST=db، DB_DATABASE=invoiceninja، DB_USERNAME=ninja، DB_PASSWORD=<كلمة_مرور_قوية>، MYSQL_ROOT_PASSWORD=<root_pwd>، REDIS_HOST=redis، QUEUE_CONNECTION=redis، MAIL_MAILER=smtp، MAIL_FROM_ADDRESS=noreply@نطاقك.com. استخدم كلمات مرور من 32 حرفًا عشوائيًا على الأقل.توليد مفتاح التطبيق APP_KEY
قبل بدء التشغيل الأول، ولّد مفتاح تشفير Laravel. شغّل أولًا حاويات الاعتمادية:
docker compose up -d db redis. انتظر 20 ثانية لإتمام MySQL تهيئة قاعدة البيانات، ثم شغّل التطبيق: docker compose up -d app. ولّد المفتاح: docker compose exec app php artisan key:generate. انسخ القيمة المُرجعة (بتنسيق base64:…) وضعها في .env تحت المتغير APP_KEY. أعد تشغيل الحاوية: docker compose restart app.ضبط nginx كوكيل عكسي
أنشئ
/etc/nginx/sites-available/invoiceninja.conf. يستمع الكتلة server على المنفذ 443 مع شهادة Let's Encrypt. تشير توجيهة root إلى /opt/invoiceninja/public. تستخدم location / التوجيهة try_files $uri $uri/ /index.php?$query_string. يمرر الكتلة location ~ \.php$ الطلبات إلى fastcgi_pass 127.0.0.1:9000. أضف client_max_body_size 100M. فعّل الإعداد: ln -s /etc/nginx/sites-available/invoiceninja.conf /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx.تشغيل الترحيلات وأول تسجيل دخول
بعد ضبط nginx، شغّل ترحيلات قاعدة البيانات:
docker compose exec app php artisan migrate --force. تستغرق العملية 30 إلى 60 ثانية. افتح بعدها https://votre-domaine.com في المتصفح: يطلب منك معالج الإعداد إنشاء حساب المسؤول وإدخال معلومات شركتك.تفعيل قائمة انتظار المهام غير المتزامنة
يعتمد Invoice Ninja على عمال Laravel لإرسال البريد الإلكتروني وتوليد PDF في الخلفية. أضف في ملف Compose خدمة
worker تستخدم الصورة ذاتها invoiceninja/invoiceninja:5.13.45 وتُشغّل الأمر php artisan queue:work --sleep=3 --tries=3. بدون عامل نشط، تُوضع فواتير البريد الإلكتروني في قائمة الانتظار لكنها لا تُرسل أبدًا.ضبط بوابات الدفع
في لوحة الإدارة (الإعدادات > بوابات الدفع)، فعّل Stripe بلصق مفاتيحك العامة والسرية من لوحة Stripe. بالنسبة لـPayPal، استخدم بيانات اعتماد OAuth من تطبيق PayPal REST. بالنسبة لـSEPA عبر GoCardless، أدخل access token بيئة الاختبار Sandbox ثم انتقل إلى بيئة الإنتاج بعد الاختبار.
للحصول على شهادة TLS من Let's Encrypt باستخدام Certbot، ثبّت حزمة python3-certbot-nginx ونفّذ certbot --nginx -d votre-domaine.com. يعدّل Certbot تلقائيًا إعداد nginx لإعادة توجيه HTTP إلى HTTPS ويجدد الشهادة كل 60 يومًا عبر مؤقت systemd. تأكد من أن المنفذ 80 مفتوح في جدار الحماية قبل تشغيل Certbot: ufw allow 80/tcp.
ربط بوابات الدفع
يدعم Invoice Ninja 5.13.45 أكثر من 25 بوابة دفع نصيًا. Stripe هي الأكثر شمولًا: تتعامل مع المدفوعات بالبطاقة، والخصم المباشر SEPA، وتحويلات ACH، ومنذ الإصدار 5.13.43، Stripe PromptPay لأسواق جنوب شرق آسيا. يتكامل PayPal عبر REST API. بالنسبة للخصم المباشر SEPA في أوروبا، GoCardless هو المسار الموصى به: يوقّع التفويض العميل إلكترونيًا عبر بوابة Invoice Ninja. Mollie بديل شامل مفضل للشركات الأوروبية.
Invoice Ninja ذاتي الاستضافة مقابل خطة SaaS
مرّر الجدول أفقيًا
| استضافة Invoice Ninja بنفسك على VPS | SaaS Invoice Ninja مُدار | |
|---|---|---|
| التكلفة الشهرية | 99 درهم/شهر (VPS ثابت) | مجاني حتى 20 عميلًا، ثم 11-16 $/شهر |
| حد العملاء | غير محدود | 20 عميلًا في الخطة المجانية |
| التحكم في البيانات | البيانات في بنيتك التحتية | البيانات لدى Invoice Ninja Inc. |
| التحديثات | يدوية (أمر docker pull) | تلقائية |
| White-label | 30 $/سنة (اختياري) | مضمّن في الخطط المدفوعة |
| صيانة الخادم | على عاتقك | يديرها المورد |
النسخ الاحتياطي وتحديث Invoice Ninja
يجب أن تغطي استراتيجية النسخ الاحتياطي عنصرين منفصلين: قاعدة بيانات MySQL ووحدة تخزين الملفات. لقاعدة البيانات، جدوِل تفريغًا يوميًا باستخدام docker compose exec db mysqldump -u ninja -p invoiceninja | gzip > /backups/invoiceninja-$(date +%Y%m%d).sql.gz عبر cron أو مؤقت systemd. احتفظ بما لا يقل عن 30 يومًا متجددًا واختبر الاستعادة ربع سنويًا.
للتحديث إلى إصدار مستقبلي، حدّث وسم الصورة في ملف Compose، اسحب الصورة الجديدة بـdocker compose pull app، ثم نفّذ docker compose up -d app worker يليه docker compose exec app php artisan migrate --force. راجع سجل التغييرات على GitHub قبل أي تحديث رئيسي.
استكشاف الأخطاء الشائعة وإصلاحها
أربع مشكلات تظهر كثيرًا عند النشر الأولي.
خطأ SQLSTATE[HY000] [2002] Connection refused: لم تكن MySQL جاهزة عندما حاول حاوية app الاتصال بها. أضف توجيهة healthcheck إلى خدمة db وشرط service_healthy في depends_on.
لا تُرسل الرسائل الإلكترونية: تحقق من أن خدمة worker تعمل بـdocker compose ps worker. إذا كانت الحالة Exited، افحص السجلات: docker compose logs worker.
صفحة بيضاء أو خطأ 500 بعد الترحيل: دليل storage/ لديه صلاحيات خاطئة. نفّذ docker compose exec app chown -R www-data:www-data /var/www/app/storage && docker compose exec app php artisan config:clear && docker compose exec app php artisan cache:clear.
توليد PDF ينتج ملفات فارغة: تحقق من تعريف المتغير PDF_GENERATOR (قيم ممكنة: snappy، browsershot، phantom) ووجود الثنائي المقابل في الصورة.
Invoice Ninja ذاتي الاستضافة: ما ينبغي تذكره
Invoice Ninja 5.13.45، المنشور في 9 أكتوبر 2026، حل فوترة ناضج يُصان بنشاط. تُجيز Elastic License 2.0 الاستضافة الذاتية لأي استخدام داخلي دون قيود: لا تدفع شيئًا طالما لا تعيد بيع الوصول كخدمة. مجموعة Docker (الصورة الرسمية + MySQL 8.4 LTS + Redis 7.4) قابلة للنشر في أقل من ساعة على أي خادم VPS بـ2 GB من الذاكرة. وحدة white-label اختيارية بـ30 $ سنويًا. إذا تجاوز عدد عملائك 20 أو كانت بيانات الفوترة يجب أن تبقى في بنيتك التحتية لأسباب قانونية أو امتثالية، فإن النشر الذاتي مبرر اقتصاديًا وتقنيًا. فريقنا متاح على [email protected] لمساعدتك في تحديد حجم خادم VPS المناسب وضبط النسخ الاحتياطية.