Deploy SvelteKit di VPS: Setup yang Kini Saya Pakai untuk Setiap Project
Vercel bagus sampai kamu butuh persistent storage, custom cron job, atau biaya bulanan tetap. Ini setup Nginx + PM2 + GitHub Actions yang saya pakai untuk Dharentrans dan kini jadi deployment stack default saya.
Setelah shipping beberapa proyek di Vercel, ada waktunya saya butuh sesuatu yang lebih — storage persisten, cron jobs, dan biaya tetap per bulan. Itu yang akhirnya mendorong saya berpindah ke VPS untuk project seperti Dharentrans.com.
Ini setup yang sekarang saya pakai sebagai template default untuk setiap project SvelteKit yang butuh SSR.
Stack yang Dipakai
- SvelteKit dengan
adapter-node - Nginx sebagai reverse proxy
- PM2 untuk process management
- GitHub Actions untuk CI/CD otomatis
- VPS: Ubuntu 22.04 (Hetzner CPX11, €4.35/bulan)
1. Setup SvelteKit dengan adapter-node
Langkah pertama, pastikan kamu pakai adapter-node, bukan adapter-auto:
npm i -D @sveltejs/adapter-node
Update svelte.config.js:
import adapter from "@sveltejs/adapter-node";
export default {
kit: {
adapter: adapter({
out: "build",
}),
},
};
npm run build
# Output: folder /build
node build
# Server berjalan di port 3000
2. Setup VPS (Ubuntu 22.04)
Login ke VPS, install Node.js dan PM2:
# Install Node.js via nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 20
node -v # v20.x.x
# Install PM2 global
npm install -g pm2
3. Konfigurasi Nginx
Buat config untuk domain kamu:
sudo nano /etc/nginx/sites-available/dharentrans.com
server {
listen 80;
server_name dharentrans.com www.dharentrans.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
sudo ln -s /etc/nginx/sites-available/dharentrans.com /etc/nginx/sites-enabled/
sudo nginx -t # Test config
sudo systemctl reload nginx
Aktifkan HTTPS dengan Certbot:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d dharentrans.com -d www.dharentrans.com
4. PM2 Ecosystem File
Buat ecosystem.config.cjs di root project:
module.exports = {
apps: [
{
name: "dharentrans",
script: "build/index.js",
env: {
NODE_ENV: "production",
PORT: 3000,
ORIGIN: "https://dharentrans.com",
},
},
],
};
pm2 start ecosystem.config.cjs
pm2 save # Save list
pm2 startup # Auto-start on reboot
5. CI/CD dengan GitHub Actions
Buat .github/workflows/deploy.yml:
name: Deploy to VPS
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Install & Build
run: |
npm ci
npm run build
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
script: |
cd /var/www/dharentrans
git pull origin main
npm ci --omit=dev
npm run build
pm2 restart dharentrans
Tambahkan secrets di GitHub repository settings:
VPS_HOST— IP VPS kamuVPS_USER— username (biasanyarootatauubuntu)VPS_SSH_KEY— private SSH key
Tips Tambahan
Swap space — Hetzner tidak aktifkan swap by default. Kalau sering kehabisan memory saat build:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Environment variables — jangan hardcode di codebase, simpan di .env di server:
nano /var/www/dharentrans/.env
DATABASE_URL=mongodb://localhost:27017/dharentrans
MIDTRANS_SERVER_KEY=your-key
Kesimpulan
Setup ini sudah saya pakai di Dharentrans sejak Oktober 2025 dan berjalan stabil. Total biaya: €4.35/bulan untuk VPS Hetzner — jauh lebih murah dari biaya Vercel Pro kalau traffic mulai naik.
Untuk project kecil-menengah, ini sudah lebih dari cukup.
Memuat komentar...