مقدمة: لماذا النشر المتقدم لـ Rust على VPS ضرورة
\nتطوير Rust هو نصف المهمة فقط. النصف الثاني، الذي لا يقل أهمية، هو النشر الموثوق والآمن. الطرق الأساسية، مثل التجميع اليدوي والتشغيل عبر cargo run، غير مناسبة للإنتاج. على المستوى المتقدم، نحتاج إلى الأتمتة، عزل العمليات، المراقبة وضمان التوفر العالي.
في هذه المقالة، سنشرح كيفية إعداد نشر تطبيق Rust على VPS باستخدام Docker، CI/CD (GitHub Actions)، systemd للتشغيل التلقائي و Nginx كوكيل عكسي. جميع أمثلة الكود مقدمة بلغة Rust و Bash.
\n\n1. إعداد VPS والبيئة
\n1.1. الإعداد الأساسي للخادم
\nلنفترض أن لديك VPS يعمل بنظام Ubuntu 22.04 LTS. أولاً، نقوم بتحديث الحزم وتثبيت الأدوات اللازمة:
\nsudo apt update && sudo apt upgrade -y\nsudo apt install -y curl git build-essential pkg-config libssl-dev\nنقوم بتثبيت Rust عبر rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource $HOME/.cargo/env\nrustc --version # تحقق\n1.2. تثبيت Docker
\nسيوفر Docker عزل البيئة وقابلية التكرار:
\nsudo apt install -y docker.io\nsudo systemctl enable --now docker\nsudo usermod -aG docker $USER\nnewgrp docker\n1.3. تثبيت Nginx
\nسيعمل Nginx كوكيل عكسي وموازن أحمال:
\nsudo apt install -y nginx\nsudo systemctl enable --now nginx\n\n2. حاويات تطبيق Rust باستخدام Docker
\n2.1. البناء متعدد المراحل (multi-stage build)
\nلتقليل حجم الصورة، نستخدم البناء متعدد المراحل. قم بإنشاء Dockerfile في جذر المشروع:
# مرحلة البناء\nFROM rust:1.75-slim-bookworm AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nCOPY src ./src\nRUN cargo build --release\n\n# المرحلة النهائية\nFROM debian:bookworm-slim\nRUN apt update && apt install -y ca-certificates && rm -rf /var/lib/apt/lists/*\nWORKDIR /app\nCOPY --from=builder /app/target/release/my_app .\nEXPOSE 8080\nCMD ["./my_app"]\nهنا my_app هو اسم ملفك الثنائي. تأكد من أن Cargo.toml يحتوي على name = "my_app".
2.2. بناء وتشغيل الحاوية
\ndocker build -t my_app:latest .\ndocker run -d --name my_app -p 8080:8080 my_app:latest\nتحقق من استجابة التطبيق:
\ncurl http://localhost:8080\n\n3. إعداد التشغيل التلقائي والمراقبة (systemd + Docker Compose)
\n3.1. Docker Compose لإدارة الخدمات
\nقم بإنشاء docker-compose.yml:
version: '3.8'\nservices:\n app:\n image: my_app:latest\n restart: always\n ports:\n - "127.0.0.1:8080:8080"\n environment:\n - RUST_LOG=info\n healthcheck:\n test: ["CMD", "curl", "-f", "http://localhost:8080/health"]\n interval: 30s\n timeout: 10s\n retries: 3\nلاحظ: ports مرتبط بـ 127.0.0.1، بحيث تمر الطلبات الخارجية عبر Nginx فقط.
3.2. وحدة Systemd لإدارة الخدمة
\nقم بإنشاء ملف /etc/systemd/system/my_app.service:
[Unit]\nDescription=تطبيق Rust الخاص بي\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=/opt/my_app\nExecStart=/usr/bin/docker compose up -d\nExecStop=/usr/bin/docker compose down\nUser=deploy\nGroup=deploy\n\n[Install]\nWantedBy=multi-user.target\nقم بتمكينه وتشغيله:
\nsudo systemctl daemon-reload\nsudo systemctl enable my_app\nsudo systemctl start my_app\n\n