Pourquoi self-héberger SvelteKit sur un VPS
SvelteKit s'adapte à de nombreuses cibles via ses adaptateurs (Vercel, Netlify, Cloudflare…), mais l'adaptateur officiel @sveltejs/adapter-node produit un serveur Node autonome, parfait pour un VPS. Au lieu de découper votre application en fonctions serverless soumises à des cold starts et à des limites de durée d'exécution, vous obtenez un processus persistant qui garde ses connexions à la base de données ouvertes et répond sans latence de démarrage. Les actions de formulaire, les load côté serveur et les endpoints +server.ts tournent dans un seul runtime que vous maîtrisez. Sur un VPS, vous évitez aussi la facturation à l'invocation, fréquente sur les plateformes front, qui devient imprévisible dès que le trafic monte.
Bénéfices concrets
- Serveur Node persistant via adapter-node : aucun cold start sur les routes serveur
- Connexions base de données maintenues ouvertes dans un pool, sans reconnexion à chaque requête
- Pas de facturation à l'invocation : coût stable même avec un trafic élevé et irrégulier
- Actions de formulaire et endpoints
+server.tsexécutés sans limite de durée imposée - WebSockets et SSE possibles, là où le serverless les interdit ou les complique
- Variables d'environnement et secrets gérés directement, sans dashboard de plateforme tierce
Prérequis matériels et logiciels
Une application SvelteKit en mode Node consomme modérément : un VPS de 1 vCPU et 2 Go de RAM convient pour un site à trafic moyen, montez à 2 vCPU / 4 Go si vous co-localisez une base PostgreSQL et avez des load serveur lourds. Installez Node.js 20 LTS, et soit Docker, soit PM2 pour gérer le processus en daemon. Nginx servira de reverse proxy. Pointez votre domaine vers l'IP du VPS. Le build (build/ généré par adapter-node) reste léger, 5 à 10 Go de disque suffisent avec les node_modules.
Déploiement pas à pas
Installer et configurer l'adaptateur Node
Ajoutez @sveltejs/adapter-node et déclarez-le dans svelte.config.js (adapter: adapter()). C'est lui qui transforme votre app en serveur Node autonome plutôt qu'en bundle serverless.
Builder l'application
Lancez npm run build. SvelteKit génère un dossier build/ contenant index.js, le point d'entrée du serveur. Vous le testez localement avec node build ; il écoute par défaut sur le port 3000.
Conteneuriser ou daemoniser le processus
Avec Docker : un Dockerfile node:20-alpine qui copie build/ et package.json, installe les dépendances de prod (npm ci --omit=dev) et lance node build. Sans Docker : utilisez PM2 avec pm2 start build/index.js --name svelte-app pour le redémarrage automatique.
Injecter la configuration runtime
Passez PORT, ORIGIN (indispensable pour que SvelteKit valide les actions de formulaire) et vos secrets via l'environnement : ORIGIN=https://mondomaine.ma. Sans ORIGIN correct, les form actions échoueront en production avec une erreur CSRF.
Configurer Nginx en frontal
Créez un vhost avec proxy_pass http://127.0.0.1:3000; et les en-têtes proxy_set_header Host et X-Forwarded-Proto $scheme. Activez proxy_http_version 1.1 et les en-têtes Upgrade si vous utilisez des WebSockets.
Sécuriser avec Let's Encrypt
Exécutez certbot --nginx -d mondomaine.ma. Une fois le certificat installé, vérifiez que ORIGIN correspond bien à l'URL HTTPS finale, sinon les soumissions de formulaire seront rejetées.
Mettez en cache l'output des routes statiques avec l'en-tête Cache-Control dans vos fonctions load, et activez la précompression : adapter-node sert automatiquement les fichiers .gz et .br s'ils existent. Buildez avec la précompression en définissant precompress: true dans les options de l'adaptateur. Côté process management, préférez le mode cluster de PM2 (pm2 start build/index.js -i max) pour exploiter tous les cœurs du VPS sur une charge CPU élevée.