Kembali ke blog
#SvelteKit #DevOps #VPS #Deployment

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.

Muhamad Taufik Muhamad Taufik
· Oct 3, 2025 · 9 menit baca
Server rack in a data center
Reaksi:

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 kamu
  • VPS_USER — username (biasanya root atau ubuntu)
  • 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.

Komentar (0)

Bergabung dalam percakapan

Anda harus masuk untuk meninggalkan komentar atau reaksi.

Memuat komentar...