إصدار Node
لخادم تديره بنفسك: جهاز واحد، خدمة دائمة، ووسيط عكسي أمامها.
Node 22، ومترجم C، وقرص محلي. جهاز بنواة واحدة يكفي لبضع عشرات من الأشخاص. ويُدار خادم MySQL إن كان لديك واحد؛ وإلا فإنّ SQLite لا يطلب شيئًا.
إصداران من المنتج نفسه: أحدهما يعمل خدمةً على خادمك، والآخر يُوضع على استضافة مشتركة. لا قاعدة بيانات مطلوبة ولا خدمة من طرف ثالث — غير أنّ خادوم MySQL يُقاد إن كان لديك واحد. احسب ساعة واحدة.
مُستضاف في أوروبا، ولا شيء تُثبِّته: مجاني حتى خمسة موظفين، والمنتج كاملًا من اليوم الأول.
الصيغة المجانية لا تقف عند SaaS: فحتى خمسة موظفين يمكنك كذلك أن تُثبِّت المنتج عندك — ملفاتك وقاعدتك ونسخك الاحتياطية — من غير أن تدفع شيئًا. الذي يحدِّد الصيغة هو عدد الموظفين، لا المكان الذي تعمل فيه النسخة. وفوق خمسة موظفين يلزم اشتراك، سواء عملت النسخة عندنا أو عندك.
الاختيار يتوقف على استضافتك لا على حاجاتك الوظيفية: الإصداران يفعلان الشيء نفسه تمامًا.
لخادم تديره بنفسك: جهاز واحد، خدمة دائمة، ووسيط عكسي أمامها.
Node 22، ومترجم C، وقرص محلي. جهاز بنواة واحدة يكفي لبضع عشرات من الأشخاص. ويُدار خادم MySQL إن كان لديك واحد؛ وإلا فإنّ SQLite لا يطلب شيئًا.
لاستضافة مشتركة: مجلد تُحمّله، وملف تملؤه، ومهمة مجدولة. لا حاجة إلى سطر أوامر.
PHP 8.1 وامتداد SQLite. لا اعتمادية تُثبَّت: لا Composer ولا مدير حزم. ويُضاف امتداد PDO MySQL إن فضّلت خادم قاعدة بيانات.
يتقاسم الإصداران مخطط قاعدة البيانات نفسه وصيغة كلمة المرور نفسها. الانتقال من أحدهما إلى الآخر هو نسخ ملف قاعدة وخمسة مجلدات: لا تحويل، ولا أحد مضطر إلى تغيير كلمة مروره.
الاختيار الثاني، وهو وحده العسير تبديله. ولا يتعلّق بالإصدار: كلاهما يقبل المحرّكين، والتوليفات الأربع تمرّ على الاختبارات نفسها.
ملفّ على قرص الخادوم. لا شيء يُثبَّت، ولا شيء يُدار، ولا شيء يُراقَب — والنسخة المُشغَّلة تنتقل بنسخ مجلّد.
هو الافتراضيّ، والجواب الصحيح في أكثر الحالات: خادوم تطبيق واحد، وقرص محلّيّ يبقى من نشرٍ إلى نشر.
خادوم قواعد بيانات، على الآلة نفسها أو في مكان آخر من الشبكة. فتعيش البيانات حيث يحفظها قسم المعلوماتية عندكم ويستنسخها ويراقبها أصلًا.
يُؤخذ لثلاثة أسباب: عدّة خواديم تطبيق على قاعدة واحدة، أو سياسة داخلية تفرضه، أو قرص تطبيق زائل — حاوية تُعاد صناعتها عند كلّ نشر.
هذا أشيع الاعتقادات، وهو خاطئ: فـSQLite يعيش داخل العملية، وMySQL خلف مقبس. وبقياسنا على ألفي عملية، يكون SQLite أسرع بمرّتين ونصف إلى مئة وخمسين مرّة بحسب العملية — ويصمد في المقارنة حتّى مع ثمانية كتّاب متزامنين. إنّما يُختار MySQL لمكان سكن البيانات ولمن يديرها، لا لزمن الاستجابة.
ما يكفي لفتح المساعد. أما التفصيل فيأتي بعده مباشرة، خطوة خطوة، مع ما يفعله كل أمر ولماذا.
ثلاثة أوامر على خادم تُديره أنت. والأخير يولِّد رمز تثبيت ويشغِّل النسخة.
git clone <votre-dépôt> toutadmin
cd toutadmin && npm ci --omit=dev
INSTALL_TOKEN=$(openssl rand -hex 16) \
NODE_ENV=production node src/server.js
ولا سطر أوامر واحد: مجلد يُودَع، وملف يُنسَخ، وحق كتابة يُفتَح.
# 1. déposer le dossier (racine web → public/)
# 2. cp config.sample.php config.php
# 3. chmod 770 data/
# 4. ouvrir https://votre-domaine/install
تبدأ النسخة فارغة وتنغلق على نفسها: ما دامت غير مثبَّتة فكل عنوان يفضي إلى المساعد، وما إن تُثبَّت حتى يختفي المساعد إلى الأبد.
https://votre-domaine/install
بين أول تشغيل ومرورك أنت بالمساعد، يستطيع أوَّل قادم أن ينشئ حساب الإدارة. ورمز INSTALL_TOKEN يغلق هذه النافذة: فبدونه يرفض المساعد أن يُفتَح.
npm ci بدل npm install: يثبّت تمامًا ما يصفه ملف القفل. على خادم، نسخة تنزلق هي عطل لا يفهمه أحد.
git clone <votre-dépôt> /var/www/toutadmin
cd /var/www/toutadmin
npm ci --omit=dev
كل شيء يُضبط بمتغيرات البيئة، ولا شيء منها إلزامي. ضع INSTALL_TOKEN قبل فتح المنفذ: بين أول إقلاع ومرورك بالمعالج، أول قادم هو من كان سيُنشئ حساب الإدارة.
cp .env.example .env
# PORT, NODE_ENV=production, INSTALL_TOKEN…
المنتج المشغَّل يدويًا يتوقف حين تغلق الطرفية. الخدمة تعيد التشغيل من تلقاء نفسها، ولا يُسمح لها بالكتابة إلا في مجلد بياناتها.
sudo systemctl enable --now toutadmin
journalctl -u toutadmin -f
لا تقدّم منفذ التطبيق مباشرة على الإنترنت أبدًا. خلف الوسيط، تضع النسخة ترويسات الأمان بنفسها — ومنها HSTS، وعلى اتصال معمّى سلفًا وحده.
sudo certbot --nginx -d intranet.exemple.fr
هنا يقع الخطأ. إن قدّم الخادم المجلد كله، صارت قاعدة البيانات قابلة للتنزيل من أي أحد: الحسابات وبصمات كلمات المرور والخزنة معها.
# déposer le dossier ; la racine web pointe sur public/, pas sur le dossier
المعالج هو من يكتب الإعدادات، ويفعل ذلك أخيرًا: ما دام الملف غير موجود، فإنّ تثبيتًا انقطع لم يترك وراءه شيئًا. ويضع فيه مفتاحًا خاصًّا بالمثيل يختم التوقيعات ويشفّر الأسرار في القاعدة — فاحفظه مع البقية.
cp config.sample.php config.php
php -r "echo bin2hex(random_bytes(32));" # session_secret
SQLite يكتب ملفات مجاورة للقاعدة: المجلد هو ما يجب أن يكون قابلًا للكتابة، لا الملف وحده. أما بقية المنتج فيمكن أن تبقى للقراءة فقط.
chmod 770 data/ # le dossier, pas seulement la base
موقع PHP لا يحيا إلا أثناء طلب. المهمة المجدولة تغلق العقود المنتهية، وتصدر الفواتير الدورية، وترسل خطافات الويب، وتنشئ النسخ الاحتياطية.
* * * * * /usr/bin/php /var/www/toutadmin/tools/cron.php
خذ واحدة فورًا والقاعدة ما تزال صغيرة، واضبط الوجهة البعيدة. أرشيف يبقى على الخادم الذي يحميه لا يحمي شيئًا.
ادخل به وتجوّل. هذه هي الطريقة الوحيدة لترى الأداة كما سيراها زملاؤك — وهي أكثر تحقّق يُتخطّى.
إن فعّلت التحقق بخطوتين ثم فقدت الهاتف ورموز الاسترجاع معًا، فلا يفتح لك الباب إلا مدير آخر. ليس هناك باب خلفي.
هذه الصفحة تعطي الخطوط العامة. أما التوثيق فيعطي كل ما بقي: إعداد الخادم الأمامي، والصلاحيات الدقيقة، والشهادات، والاستعادة، والترقية، وحل المشكلات حسب العَرَض — والدليلين كاملين، واحدًا لكل إصدار.
الموظفون الخمسة الأوائل مجانًا، دائمًا. وما فوق ذلك، ٥ يورو لكل موظف شهريًا. ولا حاجة إلى بطاقة للتجربة.