المختبر 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 entryUnable 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.servicenodeapp.serviceapp3100.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 تمامًا
- التحقق مما إذا كان
pm2مثبتًا:
which pm2 && pm2 list
- إيقاف جميع العمليات التي يديرها
pm2:
pm2 stop all
- حذف العمليات المسجلة:
pm2 delete all
- تعطيل إعادة التشغيل التلقائي عند بدء التشغيل:
pm2 unstartup
- اختياري: إلغاء تثبيت
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
- معرفة كيفية إيقاف وإزالة خدمة
أسئلة للتفكير
-
ما الفرق بين PostgreSQL و MariaDB؟
- في أي حالات ستستخدم أحدهما بدلاً من الآخر؟
-
لماذا من المهم تعليق الأقسام غير المستخدمة في
config.yml؟- اشرح أخطاء YAML وكيفية تجنبها
-
ما الفرق بين
systemctl stopوsystemctl disable؟- متى ستستخدم كل من هذه الأوامر؟
-
ما هو
pm2ولماذا يمكن أن يسبب مشاكل عند إيقاف خدمة؟- كيف تتحقق مما إذا كان
pm2مستخدمًا؟
- كيف تتحقق مما إذا كان
-
اشرح الفرق بين
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