مشروع تطبيقي: إعداد خادم مراقبة صناعي من الصفر بسطر الأوامر
نظرة عامة: خادم مراقبة صناعي
في هذا الدرس التطبيقي النهائي، سنُعدّ خادم مراقبة صناعي من الصفر مطبّقين كل ما تعلمناه: خادم Ubuntu مؤمّن، مستخدمون بصلاحيات مناسبة، تطبيق في Docker، سكربتات أتمتة، وجدار ناري.
الخطوة 1: تثبيت Ubuntu Server وتأمين SSH
sudo apt update && sudo apt upgrade -y
sudo apt install -y vim htop curl wget net-tools
تأمين SSH
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
الإعدادات المهمة في /etc/ssh/sshd_config:
Port 2222
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
# إنشاء مفتاح SSH (على جهازك المحلي)
ssh-keygen -t ed25519 -C "operator@factory"
ssh-copy-id -p 2222 operator@192.168.1.50
sudo systemctl restart sshd
الخطوة 2: إعداد المستخدمين والصلاحيات
sudo groupadd scada_admins
sudo groupadd scada_operators
sudo useradd -m -s /bin/bash -G scada_admins,sudo admin_user
sudo passwd admin_user
sudo useradd -m -s /bin/bash -G scada_operators operator_01
sudo useradd -r -s /usr/sbin/nologin -G scada_operators scada_app
# إعداد المجلدات
sudo mkdir -p /opt/dr-monitor/{bin,config,data}
sudo mkdir -p /var/log/dr-monitor
sudo mkdir -p /data/{sensors,backups,reports}
sudo chown -R scada_app:scada_operators /opt/dr-monitor /var/log/dr-monitor /data
sudo chmod 750 /opt/dr-monitor
sudo chmod 2775 /data
الخطوة 3: تثبيت Docker ونشر التطبيق
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker admin_user
ملف docker-compose.yml
services:
monitor-app:
image: drmachine/monitor:latest
restart: unless-stopped
ports: ["8080:8080"]
volumes:
- /opt/dr-monitor/config:/app/config:ro
- /data/sensors:/app/data
environment: {RUST_LOG: info, DB_URL: "ws://surrealdb:8000"}
depends_on: [surrealdb]
surrealdb:
image: surrealdb/surrealdb:latest
restart: unless-stopped
ports: ["127.0.0.1:8000:8000"]
volumes: ["/data/surrealdb:/data"]
command: start --user root --pass changeme file:/data/factory.db
cd /opt/dr-monitor && sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs -f monitor-app
الخطوة 4: كتابة سكربتات النسخ الاحتياطي والمراقبة
سكربت النسخ الاحتياطي
#!/bin/bash
# /opt/scripts/backup.sh
BACKUP_DIR="/data/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
docker exec surrealdb surreal export --user root --pass changeme \
--ns factory --db production > "$BACKUP_DIR/db_${TIMESTAMP}.surql"
gzip "$BACKUP_DIR/db_${TIMESTAMP}.surql"
find "$BACKUP_DIR" -name "db_*.surql.gz" -mtime +30 -delete
سكربت المراقبة الصحية
#!/bin/bash
# /opt/scripts/health_check.sh
LOG="/var/log/dr-monitor/health.log"
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') [$1] $2" >> "$LOG"; }
if curl -sf http://localhost:8080/health > /dev/null 2>&1; then
log "OK" "التطبيق يعمل"
else
log "CRITICAL" "التطبيق متوقف — إعادة تشغيل"
docker compose -f /opt/dr-monitor/docker-compose.yml restart monitor-app
fi
DISK=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
[[ $DISK -gt 85 ]] && log "WARNING" "القرص: ${DISK}%"
الخطوة 5: إعداد الجدار الناري والخدمات
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment "SSH"
sudo ufw allow from 192.168.1.0/24 to any port 8080 comment "Monitor Web"
sudo ufw allow from 192.168.1.0/24 to any port 502 comment "Modbus TCP"
sudo ufw enable
خدمة المراقبة الصحية (كل 5 دقائق)
أنشئ ملف /etc/systemd/system/health-check.service بنوع oneshot يشغّل سكربت الفحص، وملف health-check.timer بـ OnCalendar=*:0/5 (كما تعلمنا في الدرس 9):
sudo systemctl daemon-reload
sudo systemctl enable --now health-check.timer
التحقق النهائي
echo "=== التحقق من الخادم ==="
docker compose -f /opt/dr-monitor/docker-compose.yml ps
systemctl list-timers | grep -E "health|backup"
sudo ufw status
ss -tlnp | grep -E "8080|8000|2222"
df -h / && free -h
الخلاصة والخطوات القادمة
في هذه السلسلة تعلمت أساسيات Linux من الطرفية إلى بناء خادم مراقبة صناعي متكامل. الخطوات القادمة: تعلم إدارة الحاويات المتقدمة مع Kubernetes، أدوات المراقبة مثل Prometheus وGrafana، وأتمتة البنية التحتية بـ Ansible. استمر في الممارسة اليومية فالطرفية تصبح أقوى أدواتك مع الوقت.