لماذا تستضيف Spring Boot على VPS؟
المنصات المُدارة لـ Java تُفوتر على RAM المحجوزة وتفرض إصدار JDK الخاص بها، مما يُعقّد ضبط JVM وإدارة اتصالات PostgreSQL. على VPS، تتحكم في المكدس الكامل: OpenJDK 21 LTS مع Virtual Threads، وMaven للبناء، وNginx في المقدمة، وPostgreSQL 16 للبيانات. أنت من يقرّر أعلام JVM وعدد الخيوط وضبط مجمّع الاتصالات واستراتيجية النشر. ولتطبيق Spring Boot في الإنتاج، هذه الشفافية حاسمة: يمكنك تحليل أداء نقطة نهاية بطيئة، وضبط -Xmx لكل خدمة، ونشر إصدار جديد دون أي تكلفة خفية.
فوائد Spring Boot المستضاف ذاتيًا
- تحكم كامل في PostgreSQL: الفهارس وVACUUM ومجمّع الاتصالات ونسخ pg_dump الاحتياطية المجدولة.
- Virtual Threads (OpenJDK 21 Loom) مع Spring WebMVC: مئات الطلبات المتزامنة دون إعادة كتابة تفاعلية.
- تكلفة ثابتة وقابلة للتنبؤ، مهما بلغ حجم الزيارات أو عدد طلبات واجهة البرمجة المُعالَجة.
- البيانات والسجلات تحت ولايتك القضائية، وهو ما يفيد الامتثال والتدقيق.
- حرية اختيار إصدار JDK والاعتماديات النظامية دون قيود buildpack.
- عمليات نشر قابلة للتكرار: ملف fat JAR واحد، وأمر
java -jarواحد، ويصبح التطبيق متاحًا على الإنترنت.
المتطلبات المادية والبرمجية
لتطبيق Spring Boot مع PostgreSQL، خطّط لما لا يقل عن 2 vCPU و2 غيغابايت من الذاكرة؛ واستهدف 4 غيغابايت إن كنت تشغّل عدة خدمات أو مجمّع اتصالات محمّلًا. نظام التشغيل الموصى به هو Ubuntu 24.04 LTS — فحزمة openjdk-21-jdk موجودة في المستودعات الرسمية، ولا حاجة إلى أي PPA. اسم النطاق اختياري: بدونه يكفي نفق SSH نحو المنفذ 8080 للتطوير والاختبار. واحسب 10 غيغابايت من القرص لـ JVM والتطبيق وقاعدة البيانات والسجلات.
نشر Spring Boot خطوة بخطوة
تثبيت OpenJDK 21 وPostgreSQL
اتصل عبر SSH ونفّذ
apt-get install -y openjdk-21-jdk maven nginx postgresql postgresql-contrib— لا حاجة إلى أي مستودع إضافي على Ubuntu 24.04. ⚠️ اذكرopenjdk-21-jdkصراحةً: حزمةmavenتعتمد علىdefault-jre-headlessأيopenjdk-21-jre-headless، وهي بيئة تشغيل بلاjavac. لذلك يعرضjava -versionالإصدار 21.x ويبدو كل شيء سليمًا، بينما يفشل أي بناء على الخادم برسالةNo compiler is provided in this environment. تحقّق:javac -versionوmvn -versionوpsql --version(16.x).إنشاء قاعدة البيانات والمستخدم في PostgreSQL
اتصل بـ PostgreSQL عبر
sudo -u postgres psqlونفّذCREATE USER myapp WITH PASSWORD 'كلمة_مرور_قوية'; CREATE DATABASE myappdb OWNER myapp;. ثم عيّنspring.datasource.url=jdbc:postgresql://localhost/myappdbفي ملفapplication.propertiesالخاص بك.بناء ملفّ JAR ورفعه
نفّذ
mvn clean package -DskipTestsعلى جهازك محليًا، ثم انقل ملف fat JAR إلى/var/www/مشروعك/app.jarعبرscp. أنشئ ملفapplication.propertiesيحتوي على بيانات اعتماد PostgreSQL وspring.datasource.urlوserver.port=8080.إنشاء خدمة systemd
أنشئ
/etc/systemd/system/مشروعك.serviceيحتوي علىExecStart=/usr/bin/java -jar /var/www/مشروعك/app.jarوRestart=alwaysوUser=www-data. نفّذsystemctl daemon-reload && systemctl enable --now مشروعك. تحقّق عبرsystemctl status مشروعكوjournalctl -u مشروعك -f.إعداد Nginx وتفعيل HTTPS
أنشئ كتلة خادم في Nginx تحتوي على
proxy_pass http://127.0.0.1:8080;وترويساتX-Forwarded-Proto. نفّذcertbot --nginx -d نطاقك.comللحصول على شهادة Let's Encrypt مجانية. Spring Boot يستمع على المنفذ الداخلي فقط؛ وNginx هو من يتولّى TLS.
استعمل Virtual Threads في Java 21 مع Spring MVC لرفع الإنتاجية دون الانتقال إلى WebFlux: أضف spring.threads.virtual.enabled=true إلى application.properties. كل طلب HTTP يُنفَّذ في خيط افتراضي خفيف، ويمكن أن تنشط آلاف منها معًا دون إشباع مجمّع خيوط النظام. ⚠️ المكسب مشروط على OpenJDK 21: الخيط الافتراضي الذي يتوقّف داخل كتلة synchronized يُثبِّت خيط الحامل، وهو قيد لم يرفعه إلا JEP 491 في JDK 24. فقبل انتظار مكسب على أحمال الإدخال/الإخراج (استعلامات SQL وREST)، تأكّد من أن مشغّل JDBC يستعمل ReentrantLock — مشغّل PostgreSQL فعل ذلك ابتداءً من الإصدار 42.6.0 — وقِس بحدث jdk.VirtualThreadPinned عبر JFR بدل الافتراض.
نشر Spring Boot بنقرة واحدة من Marketplace ServOrbit
يوفّر Marketplace ServOrbit قالب Spring Boot Stack مُهيَّأً مسبقًا: تُثبَّت OpenJDK 21 LTS وMaven وNginx وPostgreSQL 16 تلقائيًا على VPS منذ لحظة الطلب. لا حاجة إلى جلسة SSH للتثبيت الأساسي — تصل مباشرةً إلى خطوة رفع ملفّ JAR. وتتضمّن بطاقة المتجر المواصفات الدقيقة وحالات الاستخدام ودليل الإعداد الأول.