نشر تطبيق Java على VPS: المستوى المتقدم مع CI/CD

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

نشر تطبيق Java على VPS: المستوى المتقدم مع CI/CD وDocker وSSL

\n\n

في هذه المقالة، سنستعرض عملية النشر المتقدمة لتطبيق Java على VPS (خادم خاص افتراضي). لن نتوقف عند الخطوات الأساسية مثل تثبيت JDK أو تشغيل ملف JAR. بدلاً من ذلك، سنركز على إعداد خط أنابيب CI/CD، والحاويات باستخدام Docker، واستخدام Nginx كوكيل عكسي، والحصول التلقائي على شهادات SSL، بالإضافة إلى المراقبة وتحمل الأعطال للتطبيق.

\n\n

من المفترض أن يكون لديك بالفعل VPS يعمل بنظام Ubuntu 22.04 LTS، ونطاق أساسي، وأن تكون على دراية بسطر أوامر Linux. جميع أمثلة الأكواد مكتوبة بلغة Java 17+ باستخدام Spring Boot، ولكن المبادئ تنطبق على أي إطار عمل Java.

\n\n

1. حاويات تطبيق Java باستخدام Docker

\n\n

الخطوة الأولى نحو النشر المتقدم هي تغليف التطبيق في حاوية Docker. يضمن ذلك إمكانية تكرار البيئة ويبسط عملية النشر.

\n\n

قم بإنشاء ملف Dockerfile في جذر المشروع:

\n\n
# نستخدم بناء متعدد المراحل لتقليل حجم الصورة النهائية\nFROM maven:3.9.6-eclipse-temurin-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline\nCOPY src ./src\nRUN mvn clean package -DskipTests\n\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/target/*.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]
\n\n

ملف docker-compose.yml للتشغيل مع قاعدة بيانات:

\n\n
version: '3.8'\nservices:\n  app:\n    build: .\n    ports:\n      - "8080:8080"\n    environment:\n      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb\n      - SPRING_DATASOURCE_USERNAME=user\n      - SPRING_DATASOURCE_PASSWORD=pass\n    depends_on:\n      - db\n    restart: unless-stopped\n\n  db:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_DB: mydb\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: pass\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    restart: unless-stopped\n\nvolumes:\n  pgdata:
\n\n

بعد بناء الصورة باستخدام الأمر docker compose build، ستحصل على حاوية جاهزة للنشر.

\n\n

2. إعداد خط أنابيب CI/CD (GitHub Actions)

\n\n

أتمتة النشر هي عنصر أساسي في المستوى المتقدم. نستخدم GitHub Actions لبناء واختبار وإرسال الصورة إلى الخادم.

\n\n

قم بإنشاء ملف .github/workflows/deploy.yml:

\n\n
name: Deploy Java App to VPS\n\non:\n  push:\n    branches: [ main ]\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: 'temurin'\n\n      - name: Build with Maven\n        run: mvn clean package\n\n      - name: Build Docker image\n        run: docker build -t myapp:latest .\n\n      - name: Save Docker image to tar\n        run: docker save myapp:latest | gzip > myapp.tar.gz\n\n      - name: Copy image to VPS via SCP\n        uses: appleboy/scp-action@v0.1.7\n        with:\n          host: ${{ secrets.VPS_HOST }}\n          username: ${{ secrets.VPS_USER }}\n          key: ${{ secrets.VPS_SSH_KEY }}\n          source: "myapp.tar.gz"\n          target: "/opt/app/"\n\n      - name: Deploy on VPS\n        uses: appleboy/ssh-action@v1.0.3\n        with:\n          host: ${{ secrets.VPS_HOST }}\n          username: ${{ secrets.VPS_USER }}\n          key: ${{ secrets.VPS_SSH_KEY }}\n          script: |\n            cd /opt/app\n            docker load < myapp.tar.gz\n            docker compose down\n            docker compose up -d\n            rm myapp.tar.gz
\n\n

لا تنس إضافة الأسرار VPS_HOST وVPS_USER وVPS_SSH_KEY في الإعدادات

المدونات

توصيات الكتب