لماذا الاستضافة الذاتية لـ SvelteKit على خادم VPS
يتكيّف SvelteKit مع أهداف عديدة عبر محوّلاته (Vercel وNetlify وCloudflare…)، لكنّ المحوّل الرسمي @sveltejs/adapter-node يُنتج خادم Node مستقلًّا، وهو مثالي لخادم VPS. فبدلًا من تقسيم تطبيقك إلى دوال serverless خاضعة للإقلاع البارد ولحدود زمن التنفيذ، تحصل على عملية دائمة تُبقي اتصالاتها بقاعدة البيانات مفتوحة وتستجيب دون زمن كمون عند البدء. تعمل إجراءات النماذج ودوال load من جانب الخادم ونقاط نهاية +server.ts في بيئة تشغيل واحدة تتحكّم فيها. على خادم VPS، تتجنّب أيضًا الفوترة لكلّ استدعاء، الشائعة على منصّات الواجهة الأمامية، والتي تصبح غير قابلة للتوقّع بمجرّد ارتفاع حركة المرور.
الفوائد الملموسة
- خادم Node دائم عبر adapter-node: لا إقلاع بارد على مسارات الخادم
- اتصالات قاعدة البيانات تُبقى مفتوحة في مجمّع، دون إعادة اتصال عند كلّ طلب
- لا فوترة لكلّ استدعاء: تكلفة مستقرّة حتى مع حركة مرور مرتفعة وغير منتظمة
- إجراءات النماذج ونقاط نهاية
+server.tsتُنفَّذ دون حدّ زمني مفروض - WebSockets وSSE ممكنة، حيث يمنعها أو يعقّدها نموذج serverless
- متغيّرات البيئة والأسرار تُدار مباشرةً، دون لوحة تحكّم لمنصّة تابعة لطرف ثالث
المتطلّبات العتادية والبرمجية
يستهلك تطبيق SvelteKit في وضع Node باعتدال: يناسب خادم VPS بمعالج افتراضي واحد (1 vCPU) و2 جيجابايت من الذاكرة موقعًا متوسّط حركة المرور، ارتقِ إلى 2 vCPU / 4 جيجابايت إذا وضعت قاعدة بيانات PostgreSQL في الموقع نفسه ولديك دوال load ثقيلة من جانب الخادم. ثبّت Node.js 20 LTS، وإمّا Docker أو PM2 لإدارة العملية كخدمة خفيّة (daemon). سيعمل Nginx كوكيل عكسي. وجّه نطاقك نحو عنوان IP الخاص بخادم VPS. يبقى البناء (build/ المُولَّد بواسطة adapter-node) خفيفًا، وتكفي 5 إلى 10 جيجابايت من القرص مع node_modules.
النشر خطوة بخطوة
تثبيت محوّل Node وإعداده
أضف @sveltejs/adapter-node وصرّح عنه في svelte.config.js (adapter: adapter()). فهو الذي يحوّل تطبيقك إلى خادم Node مستقلّ بدلًا من حزمة serverless.
بناء التطبيق
شغّل npm run build. يُولّد SvelteKit مجلّد build/ يحتوي على index.js، وهو نقطة دخول الخادم. تختبره محليًا باستخدام node build؛ وهو يستمع افتراضيًا على المنفذ 3000.
الحوسبة في حاوية أو تحويل العملية إلى خدمة خفيّة
مع Docker: ملفّ Dockerfile بصورة node:20-alpine ينسخ build/ وpackage.json، ويثبّت تبعيات الإنتاج (npm ci --omit=dev) ويُشغّل node build. دون Docker: استخدم PM2 مع pm2 start build/index.js --name svelte-app لإعادة التشغيل التلقائي.
حقن إعداد وقت التشغيل
مرّر PORT وORIGIN (لا غنى عنه كي يتحقّق SvelteKit من إجراءات النماذج) وأسرارك عبر البيئة: ORIGIN=https://mydomain.com. دون ORIGIN صحيح، ستفشل إجراءات النماذج في بيئة الإنتاج بخطأ CSRF.
إعداد Nginx كواجهة أمامية
أنشئ مضيفًا افتراضيًا مع proxy_pass http://127.0.0.1:3000; والترويستين proxy_set_header Host وX-Forwarded-Proto $scheme. فعّل proxy_http_version 1.1 وترويسات Upgrade إذا كنت تستخدم WebSockets.
التأمين باستخدام Let's Encrypt
شغّل certbot --nginx -d mydomain.com. بمجرّد تثبيت الشهادة، تحقّق من أنّ ORIGIN يطابق عنوان URL النهائي بـ HTTPS، وإلّا ستُرفض عمليات إرسال النماذج.
خزّن مخرجات المسارات الساكنة مؤقّتًا بترويسة Cache-Control في دوال load الخاصة بك، وفعّل الضغط المسبق: يقدّم adapter-node تلقائيًا ملفّات .gz و.br إن وُجدت. ابنِ مع الضغط المسبق بتعيين precompress: true في خيارات المحوّل. أمّا من جهة إدارة العمليات، ففضّل وضع العنقود (cluster) الخاص بـ PM2 (pm2 start build/index.js -i max) لاستغلال جميع أنوية خادم VPS تحت حمل معالج مرتفع.