انتقل إلى المحتوى الرئيسي

المختبر 5.8 - تثبيت Wiki.js على Ubuntu 24.04 LTS مع PostgreSQL

الأهداف​

في نهاية هذا المختبر، ستكون قادرًا على:

  • تثبيت Git و Node.js على Ubuntu 24.04
  • تثبيت وتكوين PostgreSQL
  • تنزيل وتكوين Wiki.js مع PostgreSQL
  • إنشاء خدمة systemd لـ Wiki.js
  • إدارة خدمات Node.js و systemd
  • استكشاف PostgreSQL عبر الطرفية
  • حل المشاكل الشائعة

المتطلبات المسبقة​

  • تثبيت Ubuntu 24.04 LTS
  • وصول sudo
  • اتصال بالإنترنت
  • على الأقل 2 جيجابايت من الذاكرة المتاحة
  • على الأقل 5 جيجابايت من مساحة القرص الحرة

الجزء 1: تثبيت Git​

sudo apt update
sudo apt install git -y
git --version

الجزء 2: تثبيت Node.js (LTS)​

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
node -v && npm -v

الجزء 3: تثبيت وتكوين PostgreSQL​

تثبيت PostgreSQL​

sudo apt install postgresql postgresql-contrib -y
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql

إنشاء قاعدة البيانات والمستخدم​

sudo -u postgres psql

في موجه PostgreSQL:

CREATE DATABASE wikidb;
CREATE USER wikidb_user WITH PASSWORD 'StrongPassword123!';
GRANT ALL PRIVILEGES ON DATABASE wikidb TO wikidb_user;
\q

ملاحظة: استبدل StrongPassword123! بكلمة مرور آمنة من اختيارك.


الجزء 4: إنشاء مستخدم نظام لـ Wiki.js​

# إنشاء مستخدم نظام
sudo adduser --system --group wikijs

# إنشاء دليل التثبيت
sudo mkdir -p /var/www/wikijs

# التحقق من الإنشاء
ls -l /var/www

# تعيين المالك
sudo chown -R wikijs:wikijs /var/www/wikijs

# التحقق من الأذونات
ls -l /var/www

# السماح بالاتصال مع bash
sudo usermod -s /bin/bash wikijs

الجزء 5: تثبيت Wiki.js​

إضافة wikijs إلى sudoers وتعيين كلمة مرور​

# تعيين كلمة مرور لـ wikijs
sudo passwd wikijs
# أدخل كلمة المرور (على سبيل المثال: wikijs)

# إضافة wikijs إلى مجموعة sudo
sudo usermod -aG sudo wikijs

# التحقق
groups wikijs
# يجب أن يظهر: wikijs : wikijs sudo

تنزيل وتثبيت Wiki.js​

# تسجيل الدخول كمستخدم wikijs
sudo su - wikijs

# الانتقال إلى دليل التثبيت
cd /var/www/wikijs

# تنزيل Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz

# استخراج الأرشيف
tar xzf wiki-js.tar.gz

# حذف الأرشيف
rm wiki-js.tar.gz

# نسخ ملف التكوين النموذجي
cp config.sample.yml config.yml

# الخروج من جلسة wikijs
exit

الجزء 6: تكوين Wiki.js لـ PostgreSQL​

تحرير ملف التكوين​

sudo nano /var/www/wikijs/config.yml

استبدل القسم db: بـ:​

port: 3000
bindIP: 0.0.0.0
db:
type: postgres
host: localhost
port: 5432
user: wikidb_user
pass: StrongPassword123!
db: wikidb
ssl: false

مهم: استبدل StrongPassword123! بكلمة المرور التي قمت بتعيينها لـ wikidb_user.

تعليق الأقسام غير المستخدمة​

تأكد من أن الأقسام التالية معلقة أو محذوفة إذا لم تكن مستخدمة:

#  schema: public      # علق إذا لم يكن مستخدمًا
# storage: path/to/database.sqlite # علق إذا لم يكن مستخدمًا
# sslOptions: # علق إذا لم يكن مستخدمًا
# auto: true
# rejectUnauthorized: false

التكوين للوصول الخارجي​

لكي يكون Wiki.js متاحًا من الخارج:

bindIP: 0.0.0.0
port: 3000

احفظ واخرج باستخدام Ctrl + X، ثم Y، ثم Enter.


الجزء 7: إنشاء خدمة systemd​

إضافة إلى sudoers وتعيين كلمة مرور لـ wikijs​

# إذا لم يتم بالفعل
sudo passwd wikijs
sudo usermod -aG sudo wikijs

إنشاء الخدمة​

sudo nano /etc/systemd/system/wikijs.service

محتوى الملف:

[Unit]
Description=Wiki.js
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs
Environment=NODE_ENV=production
WorkingDirectory=/var/www/wikijs

[Install]
WantedBy=multi-user.target

احفظ واخرج.


الجزء 8: بدء التشغيل والتحقق​

# إعادة تحميل تكوين systemd
sudo systemctl daemon-reload

# بدء الخدمة
sudo systemctl start wikijs

# تفعيل الخدمة عند بدء التشغيل
sudo systemctl enable wikijs

# التحقق من الحالة
sudo systemctl status wikijs

الجزء 9: استكشاف الأخطاء الشائعة​

إذا رأيت أخطاء من النوع:

  • bad indentation of a mapping entry
  • Unable to read configuration file!

تحقق مرة أخرى من أنك قد علقت أو حذفت الكتل التالية في config.yml:

#  sslOptions:
# auto: true

# schema: public

# storage: path/to/database.sqlite

ثم أعد التشغيل:

sudo systemctl restart wikijs

التحقق من السجلات​

# عرض سجلات الخدمة
sudo journalctl -u wikijs.service --no-pager --lines=50

# متابعة السجلات في الوقت الحقيقي
sudo journalctl -u wikijs.service -f

الجزء 10: الوصول إلى واجهة Wiki.js​

في متصفحك: http://<IP_de_votre_serveur>:3000

اتبع التعليمات لإنشاء حساب مدير وإكمال التثبيت.


الجزء 11: التحول إلى HTTPS (اختياري)​

# تثبيت Certbot والمكون الإضافي Nginx
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

# السماح لـ Nginx (HTTP و HTTPS)
sudo ufw allow 'Nginx Full'

# الحصول على شهادة SSL
sudo certbot --nginx

# اختبار التجديد التلقائي
sudo certbot renew --dry-run

الملحق 1: استكشاف PostgreSQL​

1. الاتصال بـ PostgreSQL​

# الاتصال كمستخدم فائق
sudo -u postgres psql

# أو الاتصال مباشرة بقاعدة معينة مع مستخدم
psql -U wikidb_user -d wikidb -h localhost

2. أوامر التنقل في psql​

الأمرالوصف
\lقائمة بجميع قواعد البيانات
\c nom_baseالاتصال بقاعدة
\dtقائمة الجداول
\d nom_tableعرض هيكل الجدول
\duقائمة المستخدمين
\dnقائمة المخططات
\dfقائمة الوظائف
\xتفعيل وضع العرض الموسع
\qالخروج من psql

3. أمثلة على الاستعلامات المفيدة​

الجداول، الأعمدة والفهارس:​

-- قائمة بجميع الجداول في مخطط
SELECT tablename FROM pg_tables WHERE schemaname = 'public';

-- عرض الأعمدة في جدول
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users';

-- عرض الفهارس
SELECT * FROM pg_indexes WHERE tablename = 'users';

المساحات والأحجام:​

-- حجم قاعدة البيانات
SELECT pg_size_pretty(pg_database_size('wikidb'));

-- حجم الجدول
SELECT pg_size_pretty(pg_total_relation_size('users'));

النشاط والجلسات:​

-- عرض الاتصالات النشطة
SELECT * FROM pg_stat_activity;

-- عرض الأقفال الجارية
SELECT * FROM pg_locks;

المخطط الحالي:​

-- عرض المخطط الافتراضي للمستخدم المتصل
SHOW search_path;

4. التصدير والتفريغ​

# تفريغ كامل للقاعدة (تنسيق ثنائي)
pg_dump -U wikidb_user -d wikidb -F c -f wikidb.dump

# تصدير بصيغة SQL قابلة للقراءة
pg_dump -U wikidb_user -d wikidb -F p -f wikidb.sql

5. التنظيف والتحقق​

-- العثور على الجداول الفارغة
SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname = 'public'
AND NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = tablename);

-- التحقق من القيود
SELECT * FROM information_schema.table_constraints WHERE table_schema = 'public';

الملحق 2: تمرين - إتقان أساسيات PostgreSQL​

الهدف​

إنشاء قاعدة بيانات كاملة باسم coursdb، مع مستخدم مخصص، جدولين (etudiants, programmes)، علاقات، إدخالات، استعلامات SQL، وإدارة الحقوق.

الخطوة 1 – إنشاء القاعدة والمستخدم​

كمستخدم فائق PostgreSQL:

sudo -u postgres psql

في psql:

-- إنشاء قاعدة بيانات
CREATE DATABASE coursdb;

-- إنشاء مستخدم
CREATE USER cours_user WITH PASSWORD 'cours123';

-- منح جميع الحقوق على القاعدة
GRANT ALL PRIVILEGES ON DATABASE coursdb TO cours_user;

-- الخروج
\q

الخطوة 2 – الاتصال بالقاعدة​

psql -U cours_user -d coursdb -h localhost

الخطوة 3 – إنشاء الجداول​

-- إنشاء جدول البرامج
CREATE TABLE programmes (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
niveau TEXT NOT NULL
);

-- إنشاء جدول الطلاب مع علاقة إلى البرامج
CREATE TABLE etudiants (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
age INTEGER CHECK (age > 0),
programme_id INTEGER REFERENCES programmes(id) ON DELETE CASCADE
);

الخطوة 4 – إدخال البيانات​

-- إدخال البرامج
INSERT INTO programmes (nom, niveau) VALUES
('Informatique', 'DEC'),
('Administration', 'AEC');

-- إدخال الطلاب
INSERT INTO etudiants (nom, age, programme_id) VALUES
('Alice', 21, 1),
('Bob', 24, 1),
('Caroline', 20, 2);

الخطوة 5 – إجراء الاستعلامات​

-- جميع الطلاب
SELECT * FROM etudiants;

-- أسماء الطلاب مع برامجهم
SELECT e.nom AS etudiant, p.nom AS programme
FROM etudiants e
JOIN programmes p ON e.programme_id = p.id;

-- عد الطلاب حسب البرنامج
SELECT p.nom, COUNT(e.id) AS total
FROM programmes p
LEFT JOIN etudiants e ON p.id = e.programme_id
GROUP BY p.nom;

الخطوة 6 – التعديل أو الحذف​

-- تعديل طالب
UPDATE etudiants SET age = 22 WHERE nom = 'Alice';

-- حذف طالب
DELETE FROM etudiants WHERE nom = 'Bob';

-- حذف برنامج (يتسبب في الحذف التتابعي)
DELETE FROM programmes WHERE nom = 'Administration';

الخطوة 7 – إدارة المستخدمين​

-- متصل كمستخدم postgres
sudo -u postgres psql

-- إنشاء قارئ فقط
CREATE USER lecteur WITH PASSWORD 'readonly123';

-- الاتصال بالقاعدة
\c coursdb

-- منح الوصول للقراءة فقط
GRANT CONNECT ON DATABASE coursdb TO lecteur;
GRANT USAGE ON SCHEMA public TO lecteur;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO lecteur;

-- تطبيق تلقائي على الجداول المستقبلية
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO lecteur;

\q

مكافأة – التحقق​

-- عرض المستخدمين
\du

-- قائمة الجداول ورؤية حقوقها
\dt+

الملحق 3: إدارة الخدمات والمنافذ​

الجزء 1: عرض جميع المنافذ النشطة​

لعرض جميع المنافذ النشطة (المفتوحة، المستمعة أو التي تستمع إليها الخدمات، بما في ذلك Node.js) على Ubuntu 24.04، استخدم عدة أوامر.

1. باستخدام ss (البديل الحديث لـ netstat)​

sudo ss -tuln

التفسير:

  • -t : TCP
  • -u : UDP
  • -l : المنافذ المستمعة (listening)
  • -n : بدون حل DNS (أسرع)

2. باستخدام lsof لرؤية أي عملية تستخدم أي منفذ​

sudo lsof -i -P -n

التصفية حسب Node.js فقط:

sudo lsof -i -P -n | grep node

3. باستخدام netstat (إذا كان مثبتًا)​

sudo netstat -tulnp

وإلا قم بتثبيته:

sudo apt install net-tools

4. عرض جميع عمليات Node.js الجارية​

ps aux | grep node

5. عرض الخدمات التي تستمع على منفذ معين​

sudo lsof -i :3000
sudo lsof -i :8080

6. عرض المنافذ باستخدام nmap (مسح محلي)​

sudo apt install nmap
sudo nmap -sT -O localhost

الجزء 2: إيقاف خدمة Node.js المثبتة مع systemd​

الخطوة 1 – العثور على اسم الخدمة​

إذا لم تكن متأكدًا من الاسم الدقيق للخدمة، قم بإدراج الخدمات النشطة المرتبطة بـ Node.js:

systemctl | grep node

أو قم بإدراج جميع الخدمات النشطة:

systemctl list-units --type=service

يمكنك أيضًا البحث في مجلد systemd:

ls /etc/systemd/system/

الخطوة 2 – إيقاف الخدمة​

بمجرد العثور على الاسم (مثل wikijs.service أو my-node-app.service):

sudo systemctl stop nom-du-service

مثال:

sudo systemctl stop wikijs.service

الخطوة 3 – (اختياري) تعطيل الخدمة عند بدء التشغيل​

sudo systemctl disable nom-du-service

الخطوة 4 – (اختياري) إزالة الخدمة بالكامل​

sudo rm /etc/systemd/system/nom-du-service.service
sudo systemctl daemon-reload

الجزء 3: إيقاف عملية Node.js على منفذ محدد​

مثال: تطبيق Node.js الخاص بك يعمل على المنفذ 3100، وتم تشغيله بواسطة المستخدم www-data عبر عملية node.

node      1064738   www-data   18u  TCP *:3100 (LISTEN)

الخطوة 1 — العثور على الخدمة systemd الحقيقية​

إذا تم تشغيله كخدمة، فإن اسم الخدمة قد يشبه wikijs, nodeapp, app3100, إلخ.

جرب:

systemctl | grep 3100

أو بشكل أعم:

systemctl | grep node

الخطوة 2 — إيقاف الخدمة (إذا كانت معروفة)​

بمجرد العثور على اسم الخدمة (مثل wikijs.service)، قم بما يلي:

sudo systemctl stop wikijs.service

الخطوة 3 — اختياري: قتل العملية يدويًا​

إذا لم تتوقف الخدمة أو لم تكن خدمة systemd حقيقية (على سبيل المثال تم تشغيلها يدويًا بواسطة سكريبت)، يمكنك قتل العملية مباشرة:

sudo kill 1064738

أو بشكل أكثر أمانًا:

sudo kill -9 1064738

التحقق​

بعد الإيقاف:

sudo ss -tuln | grep 3100

أو

sudo lsof -i :3100

يجب ألا يظهر أي شيء.


الجزء 4: خدمة تعيد التشغيل تلقائيًا​

إذا كانت تطبيق Node.js الخاص بك لا يزال يستمع على المنفذ 3100، ويتم إعادة تشغيله حتى بعد قتله يدويًا، فهذا يشير إلى أنه يتم إدارته بواسطة خدمة أو مشرف يعيد تشغيله تلقائيًا.

خطوات لتحديده وإيقافه نهائيًا​

1. العثور على الاسم الحقيقي للخدمة​

جرب هذا الأمر للعثور على جميع الخدمات التي تحتوي على "node" أو 3100:

sudo systemctl list-units --type=service | grep -i node

أو بشكل أوسع:

ps aux | grep node

ثم:

ps -fp <PID>

سيخبرنا هذا أي سكريبت أو ملف يتم تشغيله و بواسطة ماذا تم تشغيله.

2. التحقق مما إذا كان pm2 مستخدمًا​
which pm2 && pm2 list

إذا كان pm2 مثبتًا، فإنه يعيد تشغيل تطبيقك تلقائيًا. لإيقافه نهائيًا:

pm2 stop all
pm2 delete all
pm2 unstartup
3. عرض الأصل الدقيق للعملية​
sudo ls -l /proc/<PID>/exe
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

سيعرض هذا المسار الحقيقي لسكريبت Node.js، على سبيل المثال:

/usr/bin/node /var/www/wiki/server.js
4. العثور على ملفات .service المسؤولة​

قم بإدراج الملفات في /etc/systemd/system/ و /lib/systemd/system/:

ls /etc/systemd/system/ | grep -i wiki
ls /lib/systemd/system/ | grep -i wiki

أو بشكل أوسع:

grep -r 3100 /etc/systemd/system/

الخطوة النهائية: التعطيل والإيقاف الكامل​

بمجرد أن تحصل على الاسم الحقيقي للخدمة، قم بما يلي:

sudo systemctl stop nom.service
sudo systemctl disable nom.service

ثم أعد التحميل:

sudo systemctl daemon-reload
sudo systemctl reset-failed

الجزء 5: إزالة خدمة systemd بالكامل​

لإزالة خدمة Node.js (أو أي خدمة systemd أخرى) بشكل دائم، اتبع ثلاث خطوات:

الخطوة 1 — العثور على الاسم الدقيق للخدمة​

أولاً، قم بإدراج جميع خدمات systemd المخصصة:

ls /etc/systemd/system/

ابحث عن ملف قد يشبه:

  • wikijs.service
  • nodeapp.service
  • app3100.service
  • إلخ.

يمكنك أيضًا التصفية:

ls /etc/systemd/system/ | grep -i wiki

الخطوة 2 — إيقاف الخدمة وتعطيلها​

افترض أن اسم الملف هو wikijs.service، قم بتنفيذ:

sudo systemctl stop wikijs.service
sudo systemctl disable wikijs.service

الخطوة 3 — حذف ملف تعريف الخدمة​

sudo rm /etc/systemd/system/wikijs.service

ثم أعد تحميل systemd لتطبيق التغييرات:

sudo systemctl daemon-reload
sudo systemctl reset-failed

(اختياري) التحقق من عدم وجوده​

systemctl list-units --type=service | grep wiki

أو

systemctl status wikijs.service

يجب أن تحصل على رسالة مثل:

Unit wikijs.service could not be found.

أوامر مفيدة​

# إدراج جميع الخدمات المخصصة
ls -l /etc/systemd/system/

# البحث عن خدمة محددة
grep -r ExecStart /etc/systemd/system/

# تحليل العملية الدقيقة بناءً على PID
ps -fp <PID>
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

الملحق 4: ما هو pm2؟​

في سياق Node.js، يشير pm2 إلى مدير العمليات 2، وهو أداة مستخدمة بشكل كبير لـ:

  • تشغيل تطبيقات Node.js في الخلفية
  • الحفاظ عليها حية حتى بعد تعطلها
  • إعادة تشغيلها تلقائيًا عند بدء النظام
  • إدارة عمليات Node.js متعددة بسهولة

لماذا يمكن أن يكون pm2 سببًا في المشاكل​

حتى إذا قمت بإيقاف خدمة Node.js يدويًا (kill, systemctl, إلخ)، يمكن لـ pm2 تلقائيًا:

  • إعادة تشغيل التطبيق
  • إعادة تعيين العمليات عند بدء تشغيل الجهاز (إذا تم تنفيذ pm2 startup)

لهذا السبب من المهم التحقق مما إذا كان pm2 نشطًا.

الأوامر التي يجب معرفتها لإيقاف pm2 تمامًا​

  1. التحقق مما إذا كان pm2 مثبتًا:
which pm2 && pm2 list
  1. إيقاف جميع العمليات التي يديرها pm2:
pm2 stop all
  1. حذف العمليات المسجلة:
pm2 delete all
  1. تعطيل إعادة التشغيل التلقائي عند بدء التشغيل:
pm2 unstartup
  1. اختياري: إلغاء تثبيت pm2 إذا لم يعد ضروريًا:
npm uninstall -g pm2

ملخص الأوامر المهمة​

الأمرالوصف
sudo ss -tulnعرض جميع المنافذ المستمعة
sudo lsof -i -P -nعرض العمليات التي تستخدم المنافذ
sudo systemctl status wikijsالتحقق من حالة الخدمة
sudo systemctl stop wikijsإيقاف الخدمة
sudo systemctl disable wikijsتعطيل الخدمة عند بدء التشغيل
sudo journalctl -u wikijs.service -fمتابعة السجلات في الوقت الحقيقي
ps aux | grep nodeعرض جميع عمليات Node.js
pm2 listعرض العمليات التي يديرها pm2

التحقق النهائي​

تحقق من أنك قد نجحت في:

  • تثبيت Git و Node.js
  • تثبيت وتكوين PostgreSQL
  • إنشاء قاعدة البيانات والمستخدم لـ Wiki.js
  • تنزيل واستخراج Wiki.js
  • تكوين ملف config.yml لـ PostgreSQL
  • إنشاء وتفعيل خدمة systemd
  • الوصول إلى Wiki.js عبر المتصفح
  • استكشاف PostgreSQL باستخدام أوامر psql
  • فهم إدارة خدمات systemd
  • معرفة كيفية إيقاف وإزالة خدمة

أسئلة للتفكير​

  1. ما الفرق بين PostgreSQL و MariaDB؟

    • في أي حالات ستستخدم أحدهما بدلاً من الآخر؟
  2. لماذا من المهم تعليق الأقسام غير المستخدمة في config.yml؟

    • اشرح أخطاء YAML وكيفية تجنبها
  3. ما الفرق بين systemctl stop و systemctl disable؟

    • متى ستستخدم كل من هذه الأوامر؟
  4. ما هو pm2 ولماذا يمكن أن يسبب مشاكل عند إيقاف خدمة؟

    • كيف تتحقق مما إذا كان pm2 مستخدمًا؟
  5. اشرح الفرق بين bindIP: 127.0.0.1 و bindIP: 0.0.0.0

    • في أي حالات ستستخدم كل من هذه التكوينات؟

الخطوات التالية​

  • المختبر 5.7: تثبيت Wiki.js مع MariaDB
  • الوحدة 8: الخدمات والشياطين (لتعميق systemd)
  • TP 2: Reverse Proxy NGINX (لإظهار Wiki.js عبر وكيل عكسي)

موارد إضافية​


تم إنشاء المختبر في: ديسمبر 2024