Kembali ke Panduan Deploy

Multi-site — satu server, banyak proyek

Banyak situs & database di satu VPS

Sudah sewa VPS untuk satu blog? Server yang sama biasanya sanggup menampung beberapa website sekaligus — blog, toko, dan portofolio — tanpa biaya tambahan. Di panduan ini kamu akan menjalankan banyak aplikasi dengan PM2, mengarahkan tiap domain lewat Nginx, dan memasang database dengan data terpisah per situs.

Hemat biaya

Beberapa proyek berbagi satu sewa VPS, bukan bayar server terpisah.

Tiap domain sendiri

Nginx mengarahkan tiap domain ke aplikasi yang tepat.

Data terpisah

Tiap situs punya database & user sendiri, tidak saling campur.

Cek dulu ukuran VPS-mu. Tiap aplikasi Next.js butuh RAM. VPS 1GB cukup untuk 1–2 situs kecil; untuk 3+ situs, idealnya 2GB ke atas atau tambahkan swap. Pantau dengan free -h dan pm2 status.
1
Pahami dulu

Kenapa satu VPS untuk banyak situs?

Menyewa VPS terpisah untuk tiap proyek itu boros. Selama sumber daya (RAM, CPU) mencukupi, satu VPS bisa melayani banyak domain sekaligus. Kuncinya cuma dua: tiap aplikasi berjalan di port berbeda, dan Nginxbertugas sebagai "resepsionis" yang mengarahkan tiap domain ke port yang benar.

2
Gambaran besar

Cara kerjanya (alur)

blog.comtoko.com
Nginxcocokkan domain → port
PM2 apps:3000 · :3001 · :3002
3
Beda port

Jalankan banyak app dengan PM2

Mulai tiap aplikasi pada port unik, beri nama agar mudah dikenali. Misalkan kamu punya tiga proyek di tiga folder:

# DI SERVER — jalankan tiap aplikasi di PORT berbeda
cd ~/blog && PORT=3000 pm2 start "pnpm start" --name blog
cd ~/toko && PORT=3001 pm2 start "pnpm start" --name toko
cd ~/portfolio && PORT=3002 pm2 start "pnpm start" --name portfolio
 
# Simpan agar otomatis nyala setelah server reboot
pm2 save
pm2 status
deploy@server — pm2 status
deploy@server:~$ pm2 status┌────┬───────────┬─────────┬────────┐│ id │ name      │ port    │ status ││ 0  │ blog      │ 3000    │ online ││ 1  │ toko      │ 3001    │ online ││ 2  │ portfolio │ 3002    │ online │└────┴───────────┴─────────┴────────┘# tiga aplikasi jalan bersamaan ✅
4
Resepsionis

Arahkan tiap domain dengan Nginx

Buat satu file konfigurasi per domain. Yang membedakan hanyalah server_name (domain) dan proxy_pass (port aplikasinya). Situs pertama:

GNU nano 7.2/etc/nginx/sites-available/blog.com
1# /etc/nginx/sites-available/blog.com2server {3  listen 80;4  server_name blog.com www.blog.com;5 6  location / {7    proxy_pass http://127.0.0.1:3000;   # app "blog"8    proxy_http_version 1.1;9    proxy_set_header Host $host;10    proxy_set_header X-Real-IP $remote_addr;11    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;12    proxy_set_header X-Forwarded-Proto $scheme;13  }14}
^O Write Out^X Exit^W Where Is^K Cut

Situs kedua — perhatikan domain & port-nya berbeda:

GNU nano 7.2/etc/nginx/sites-available/toko.com
1# /etc/nginx/sites-available/toko.com2server {3  listen 80;4  server_name toko.com www.toko.com;5 6  location / {7    proxy_pass http://127.0.0.1:3001;   # app "toko" — beda port!8    proxy_http_version 1.1;9    proxy_set_header Host $host;10    proxy_set_header X-Real-IP $remote_addr;11    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;12    proxy_set_header X-Forwarded-Proto $scheme;13  }14}
^O Write Out^X Exit^W Where Is^K Cut

Aktifkan keduanya, uji, lalu muat ulang Nginx:

# Aktifkan kedua situs, uji, lalu muat ulang Nginx
sudo ln -s /etc/nginx/sites-available/blog.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/toko.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Pola ini bisa diulang untuk domain sebanyak yang kamu mau — cukup tambahkan satu file baru per domain. Jangan lupa arahkan DNS tiap domain ke IP VPS-mu (record A).
5
HTTPS sekaligus

Pasang SSL untuk semua domain

Certbot bisa mengamankan banyak domain dalam sekali jalan. Ia otomatis mengubah config Nginx ke HTTPS dan memperbarui sertifikat sendiri:

# Satu perintah Certbot bisa mengamankan banyak domain sekaligus
sudo certbot --nginx \
  -d blog.com -d www.blog.com \
  -d toko.com -d www.toko.com
Belum paham SSL? Baca dulu panduan pasang SSL/HTTPS gratis untuk satu domain, lalu kembali ke sini untuk versi banyak domain.
6
Opsional

Install database (PostgreSQL/MySQL)

Sebagian situs (toko, aplikasi dengan login) butuh database. Kamu bisa memasangnya langsung di VPS yang sama. Contoh memakai PostgreSQL (paling umum untuk app modern):

# Install PostgreSQL
sudo apt update
sudo apt install -y postgresql postgresql-contrib
 
# Cek service berjalan
sudo systemctl status postgresql --no-pager
Lebih suka MySQL? Ganti dengan sudo apt install -y mysql-server lalu amankan dengan sudo mysql_secure_installation. Konsep database/user terpisah di langkah berikut tetap sama.
7
Data tidak campur

Buat database terpisah per situs

Praktik terbaik: tiap situs punya database & user sendiri. Kalau satu bocor, yang lain tetap aman. Masuk ke PostgreSQL:

# Masuk sebagai user postgres
sudo -u postgres psql

Lalu jalankan perintah SQL berikut (ganti password!):

GNU nano 7.2psql — buat database & user
1-- Buat database & user terpisah untuk TIAP situs2CREATE DATABASE blog_db;3CREATE USER blog_user WITH ENCRYPTED PASSWORD 'ganti_password_kuat';4GRANT ALL PRIVILEGES ON DATABASE blog_db TO blog_user;5 6CREATE DATABASE toko_db;7CREATE USER toko_user WITH ENCRYPTED PASSWORD 'ganti_password_lain';8GRANT ALL PRIVILEGES ON DATABASE toko_db TO toko_user;9 10\q
^O Write Out^X Exit^W Where Is^K Cut

Di aplikasi, sambungkan lewat .env masing-masing ke database miliknya sendiri:

GNU nano 7.2~/blog/.env
1# .env aplikasi "blog" — koneksi ke database-nya sendiri2DATABASE_URL="postgresql://blog_user:ganti_password_kuat@localhost:5432/blog_db"
^O Write Out^X Exit^W Where Is^K Cut
Jangan lupa backup tiap database. Cara menjadwalkan pg_dump/mysqldump otomatis lewat cron dibahas di panduan backup & restore.
8
Anti-stuck

Masalah umum & cara mengatasinya

Bila salah satu situs bermasalah, cek tabel berikut:

GejalaSebabSolusi
Dua domain menampilkan situs yang samaserver_name salah atau symlink sites-enabled kurang.Pastikan tiap file punya server_name benar & sudah di-enable, lalu reload.
Address already in use (EADDRINUSE)Dua aplikasi memakai PORT yang sama.Beri tiap app PORT unik (3000, 3001, 3002, ...).
psql: FATAL: password authentication failedUser/password salah atau metode auth belum diatur.Cek kredensial di DATABASE_URL; sesuaikan pg_hba.conf bila perlu.
Server jadi lambat / kehabisan RAMTerlalu banyak app untuk ukuran VPS.Tambah RAM/swap, batasi memori tiap app via PM2, atau pisah ke VPS lain.

Satu VPS, banyak proyek

Kamu kini bisa menampung beberapa website dan database dalam satu server yang hemat. Pastikan semuanya aman dengan backup terjadwal dan pemantauan.