Memiliki VPS (Virtual Private Server) sendiri adalah langkah besar dalam perjalanan seorang developer — kamu punya kendali penuh atas server, bisa deploy aplikasi apapun, dan tidak bergantung pada platform hosting yang membatasi. Tutorial ini akan memandu kamu dari awal hingga website kamu online dengan domain, HTTPS aktif, dan monitoring dasar yang berjalan.

Tutorial ini menggunakan Ubuntu 22.04 LTS sebagai sistem operasi VPS — distribusi Linux yang paling populer dan banyak didukung. Semua perintah yang ditulis di sini diasumsikan dijalankan sebagai user non-root yang memiliki hak sudo. Provider VPS yang populer antara lain DigitalOcean, Vultr, Linode (Akamai), dan Hetzner.

Gambaran Besar: Apa yang Akan Kita Bangun?

Sebelum masuk ke perintah-perintah teknis, penting untuk memahami arsitektur yang akan kita bangun. Ketika seseorang mengetik domain kamu di browser, ada serangkaian proses yang terjadi: DNS menerjemahkan domain ke IP server, request masuk ke Nginx yang berperan sebagai reverse proxy, Nginx meneruskan ke aplikasi, dan SSL memastikan semua komunikasi terenkripsi. Monitoring kemudian memastikan kamu tahu jika ada yang tidak beres.

#
Persiapan VPS

Buat VPS baru, amankan dengan konfigurasi dasar: buat user non-root, aktifkan firewall, dan pastikan SSH key sudah terpasang. Ini fondasi keamanan yang tidak boleh dilewatkan.

#
Install dan konfigurasi Nginx

Nginx akan menjadi gerbang utama — menerima semua request HTTP/HTTPS dari internet dan meneruskannya ke aplikasi yang berjalan di port internal.

#
Arahkan domain ke VPS

Konfigurasi DNS record di provider domain kamu agar domain mengarah ke IP address VPS.

#
Pasang SSL dengan Certbot

Certbot dari Let's Encrypt akan mengurus sertifikat SSL secara otomatis — gratis dan auto-renew setiap 90 hari.

#
Setup monitoring dasar

Pasang tools sederhana untuk memantau uptime, resource usage, dan mendapat notifikasi jika server bermasalah.

Langkah 1: Persiapan dan Keamanan Dasar VPS

VPS baru yang baru dibuat biasanya hanya memiliki akun root. Menggunakan root untuk aktivitas sehari-hari sangat berbahaya — satu perintah salah bisa merusak seluruh server. Langkah pertama adalah membuat user baru dengan hak sudo, mengamankan SSH, dan mengaktifkan firewall.

#
Bash
# ── DARI KOMPUTERMU: Login ke VPS ─────────────────────
ssh root@IP_VPS_KAMU

# ── DI DALAM VPS: Buat user baru ──────────────────────
adduser deploy
# Masukkan password yang kuat saat diminta

# Tambahkan ke grup sudo
usermod -aG sudo deploy

# Pindah ke user baru untuk verifikasi
su - deploy
sudo whoami   # Harus output: root
Login ke VPS dan buat user baru

Login pertama kali menggunakan root via SSH. Segera buat user baru dan tambahkan ke grup sudo agar bisa menjalankan perintah administratif tanpa login sebagai root.

#
PHP
# ── SETUP SSH KEY (dari komputermu) ───────────────────
# Copy public key ke server
ssh-copy-id deploy@IP_VPS_KAMU

# Atau manual: copy isi ~/.ssh/id_rsa.pub ke server
# cat ~/.ssh/id_rsa.pub | ssh deploy@IP_VPS_KAMU \
#   "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# ── AMANKAN SSH (di VPS, sebagai deploy) ──────────────
sudo nano /etc/ssh/sshd_config

# Ubah/tambahkan baris berikut:
# PermitRootLogin no
# PasswordAuthentication no
# PubkeyAuthentication yes

# Restart SSH service
sudo systemctl restart sshd
Setup SSH Key Authentication

Password login rentan terhadap brute force attack. SSH key jauh lebih aman — hanya orang yang memiliki private key yang bisa login. Copy public key kamu ke server, lalu nonaktifkan password login.

#
PHP
# ── KONFIGURASI UFW ───────────────────────────────────
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# Cek status firewall
sudo ufw status verbose
Konfigurasi firewall dengan UFW

UFW (Uncomplicated Firewall) adalah interface yang mudah digunakan untuk mengatur iptables di Ubuntu. Izinkan hanya port yang benar-benar dibutuhkan: SSH (22), HTTP (80), dan HTTPS (443).

PENTING: Jangan tutup session SSH yang sedang aktif sebelum memverifikasi bahwa kamu bisa login dengan SSH key di session baru. Buka terminal kedua dan coba login dulu. Jika gagal dan session lama sudah ditutup, kamu bisa terkunci dari servermu sendiri.

Langkah 2 : Update Server dan Install Nginx

Setelah server aman, langkah berikutnya adalah memperbarui semua package ke versi terbaru dan menginstal Nginx. Nginx adalah web server sekaligus reverse proxy yang sangat efisien — ia mampu menangani ribuan koneksi secara bersamaan dengan konsumsi memori yang rendah, menjadikannya pilihan utama untuk production server.

contoh
Bash
# Update package list dan upgrade semua package
sudo apt update && sudo apt upgrade -y

# Install Nginx
sudo apt install nginx -y

# Aktifkan Nginx agar otomatis start saat server reboot
sudo systemctl enable nginx

# Jalankan Nginx
sudo systemctl start nginx

# Cek status
sudo systemctl status nginx
# Harus menampilkan: Active: active (running)

# Test dari browsermu: buka http://IP_VPS_KAMU
# Kamu akan melihat halaman "Welcome to nginx!"

Langkah 3: Deploy Aplikasimu ke VPS

Sebelum mengkonfigurasi Nginx, kamu perlu memiliki aplikasi yang berjalan di server. Di sini kita akan melihat dua skenario paling umum: hosting file statis (HTML/CSS/JS) dan menjalankan aplikasi Node.js sebagai contoh aplikasi dinamis yang akan di-proxy oleh Nginx.

#
Bash
# ── SKENARIO A: Website Statis ────────────────────────
# Buat direktori untuk project
sudo mkdir -p /var/www/namadomain.com/html

# Set ownership ke user deploy
sudo chown -R deploy:deploy /var/www/namadomain.com

# Buat halaman index sederhana untuk test
cat > /var/www/namadomain.com/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head><title>Website Saya</title></head>
<body>
  <h1>Deploy berhasil! 🎉</h1>
  <p>Website sudah online di VPS.</p>
</body>
</html>
EOF
Skenario A: Website Statis

Untuk website statis (landing page, portfolio, frontend React yang sudah di-build), cukup taruh file di direktori yang akan dilayani Nginx. Direktori default Nginx adalah /var/www/html, tapi best practice-nya adalah membuat direktori baru per project.

#
Bash
# ── SKENARIO B: Aplikasi Node.js ──────────────────────
# Install Node.js (via NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
Skenario B: Aplikasi Node.js / Backend

Untuk aplikasi dinamis seperti Node.js, Express, atau bahkan Laravel dengan PHP-FPM, aplikasi berjalan di port internal (misalnya 3000 atau 8000). Nginx bertugas sebagai reverse proxy yang menerima request dari internet dan meneruskannya ke port internal tersebut.

#
Bash
# Install PM2 secara global
sudo npm install -g pm2

# Clone atau upload project kamu
cd /var/www
git clone https://github.com/username/my-app.git
cd my-app
npm install --production

# Jalankan aplikasi dengan PM2
pm2 start server.js --name "my-app"

# Pastikan PM2 auto-start saat reboot
pm2 startup
pm2 save

# Cek status aplikasi
pm2 status
pm2 logs my-app
Gunakan PM2 untuk menjaga aplikasi tetap berjalan

PM2 adalah process manager untuk Node.js yang memastikan aplikasimu tetap berjalan bahkan setelah crash atau server restart. Ini wajib dipakai untuk production.

Langkah 4: Konfigurasi Nginx sebagai Web Server / Reverse Proxy

Sekarang saatnya mengkonfigurasi Nginx. Setiap website/aplikasi di Nginx diatur oleh sebuah "server block" — ekuivalen dengan Virtual Host di Apache. Kita akan membuat server block baru untuk domain kita, terpisah dari konfigurasi default Nginx.

#
contoh
Bash
# /etc/nginx/sites-available/namadomain.com

# ── KONFIGURASI UNTUK WEBSITE STATIS ─────────────────
server {
    listen 80;
    listen [::]:80;

    server_name namadomain.com www.namadomain.com;
    root /var/www/namadomain.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # Optimasi: cache file statis
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    # Sembunyikan versi Nginx dari response header
    server_tokens off;
}
Buat file konfigurasi server block

Nginx menyimpan konfigurasi site di /etc/nginx/sites-available/. Buat file baru dengan nama domain kamu. Setelah itu, buat symbolic link ke /etc/nginx/sites-enabled/ untuk mengaktifkannya.

#
contoh
Bash
# /etc/nginx/sites-available/namadomain.com
# ── KONFIGURASI UNTUK REVERSE PROXY (Node.js/Backend) ─

upstream app_server {
    server 127.0.0.1:3000;  # Port aplikasimu
    keepalive 64;
}

server {
    listen 80;
    listen [::]:80;

    server_name namadomain.com www.namadomain.com;

    # Batasi ukuran upload
    client_max_body_size 20M;

    location / {
        proxy_pass http://app_server;
        proxy_http_version 1.1;

        # Header penting untuk reverse proxy
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 90s;
    }

    server_tokens off;
}
Tulis konfigurasi Nginx

Untuk website statis, konfigurasi Nginx cukup sederhana: tentukan domain, direktori root, dan file index. Untuk reverse proxy ke aplikasi Node.js/backend, tambahkan blok location dengan instruksi proxy_pass.

#
contoh
Bash
# Aktifkan site dengan membuat symbolic link
sudo ln -s /etc/nginx/sites-available/namadomain.com \
           /etc/nginx/sites-enabled/

# Hapus konfigurasi default (opsional tapi disarankan)
sudo rm /etc/nginx/sites-enabled/default

# Test konfigurasi — WAJIB sebelum reload!
sudo nginx -t
# Output yang benar:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# Reload Nginx (tanpa downtime)
sudo systemctl reload nginx
Test dan reload Nginx

Selalu test konfigurasi sebelum reload untuk menghindari downtime akibat syntax error. Gunakan nginx -t untuk validasi, baru reload jika hasilnya OK.

Langkah 5: Arahkan Domain ke VPS

Agar domain kamu mengarah ke VPS, kamu perlu menambahkan DNS record di panel manajemen domain (provider tempat kamu membeli domain, misalnya Niagahoster, Domainesia, Namecheap, atau Cloudflare). Ada dua record yang perlu dibuat: A record untuk domain utama dan A record untuk subdomain www.

#
Dapatkan IP Address VPS

Catat IP address VPS kamu — biasanya tertera di dashboard provider VPS. Kamu juga bisa menemukannya dengan menjalankan perintah di terminal VPS.

#
Tambahkan A Record di DNS

Login ke panel domain kamu dan tambahkan dua A record: satu untuk domain root (@) dan satu untuk subdomain www, keduanya mengarah ke IP VPS. TTL bisa diset ke 3600 (1 jam) atau lebih rendah jika kamu masih dalam proses testing.

#
Tunggu propagasi DNS

Perubahan DNS membutuhkan waktu untuk menyebar ke seluruh dunia — biasanya antara 15 menit hingga 48 jam tergantung nilai TTL sebelumnya. Kamu bisa mengecek status propagasi menggunakan tools online.

contoh
Bash
# Cek IP address VPS
curl ifconfig.me
# atau
ip addr show eth0 | grep 'inet ' | awk '{print $2}'

# ── Di panel DNS provider domain kamu, tambahkan: ─────
# Type    Name    Value              TTL
# A       @       IP_VPS_KAMU        3600
# A       www     IP_VPS_KAMU        3600
# AAAA    @       IPv6_VPS (opsional) 3600

# ── Verifikasi propagasi DNS dari VPS ─────────────────
# Install dig jika belum ada
sudo apt install dnsutils -y

# Cek apakah domain sudah mengarah ke IP VPS
dig namadomain.com +short
dig www.namadomain.com +short

# Atau gunakan nslookup
nslookup namadomain.com

# Cek dari tool online: https://dnschecker.org

💡 Jika menggunakan Cloudflare sebagai DNS, aktifkan fitur "Proxy" (ikon awan oranye) untuk mendapatkan CDN, perlindungan DDoS, dan menyembunyikan IP asli VPS-mu. Namun saat pertama kali setup SSL dengan Certbot, matikan dulu proxy-nya (set ke DNS only) agar proses verifikasi domain berjalan lancar, lalu aktifkan kembali setelah SSL terpasang.

Langkah 6: Pasang SSL dengan Let's Encrypt dan Certbot

HTTPS bukan lagi opsional — browser modern menandai website HTTP sebagai "Not Secure", Google menurunkan peringkat website tanpa SSL, dan banyak API modern menolak request dari origin yang tidak aman. Let's Encrypt menyediakan sertifikat SSL gratis yang dipercaya semua browser, dan Certbot mengotomatiskan seluruh proses pemasangan dan pembaruan sertifikat.

#
contoh
Bash
# Install Certbot via Snap
sudo snap install --classic certbot

# Buat symlink agar bisa diakses sebagai perintah global
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Install Certbot

Certbot tersedia di repository Snap yang sudah ada di Ubuntu 22.04. Cara instalasi via Snap lebih disarankan karena selalu mendapatkan versi terbaru secara otomatis.

#
contoh
Bash
# Dapatkan sertifikat + konfigurasi Nginx otomatis
sudo certbot --nginx -d namadomain.com -d www.namadomain.com

# Ikuti prompt:
# 1. Masukkan email untuk notifikasi expiry
# 2. Setujui Terms of Service (A)
# 3. Pilih apakah ingin berbagi email dengan EFF (opsional)
# 4. Certbot akan otomatis:
#    - Memverifikasi kepemilikan domain
#    - Mengunduh sertifikat SSL
#    - Memodifikasi konfigurasi Nginx
#    - Mengaktifkan redirect HTTP → HTTPS
Dapatkan dan pasang sertifikat SSL

Jalankan certbot dengan plugin nginx — ia akan secara otomatis mendeteksi konfigurasi Nginx, mendapatkan sertifikat, dan memodifikasi konfigurasi Nginx untuk menggunakan HTTPS, termasuk redirect otomatis dari HTTP ke HTTPS.

#
contoh
Bash
# Verifikasi auto-renewal
sudo systemctl status snap.certbot.renew.timer

# Test proses renewal secara manual (dry run)
sudo certbot renew --dry-run
# Harus output: "Congratulations, all simulated renewals succeeded."
Verifikasi auto-renewal

Sertifikat Let's Encrypt berlaku 90 hari. Certbot sudah membuat systemd timer yang secara otomatis memperbarui sertifikat sebelum kedaluwarsa. Verifikasi bahwa timer ini aktif.

nginx
Text
# Konfigurasi Nginx SETELAH Certbot berjalan
# Certbot akan otomatis mengubah file konfigurasimu menjadi seperti ini:

server {
    listen 80;
    server_name namadomain.com www.namadomain.com;

    # Certbot menambahkan redirect otomatis HTTP → HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name namadomain.com www.namadomain.com;

    # Sertifikat SSL dari Let's Encrypt (diisi Certbot)
    ssl_certificate /etc/letsencrypt/live/namadomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/namadomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/namadomain.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    server_tokens off;
}

💡 Setelah SSL terpasang, cek nilai SSL grade website kamu di ssllabs.com/ssltest. Target minimalnya adalah Grade A. Jika masih B atau lebih rendah, biasanya karena konfigurasi cipher suite yang lemah — Certbot dengan opsi default sudah cukup baik untuk mendapatkan Grade A.

Langkah 7: Monitoring Dasar Server

Server yang sudah online perlu dipantau. Tanpa monitoring, kamu tidak akan tahu jika server kehabisan memori, disk penuh, atau aplikasi crash di tengah malam. Kita akan setup monitoring dengan tiga lapisan: pemantauan resource lokal, cek uptime otomatis, dan notifikasi jika ada masalah.

#
contoh
Bash
# ── MONITORING RESOURCE LOKAL ─────────────────────────
# Install htop
sudo apt install htop -y
htop   # Tekan q untuk keluar

# Cek penggunaan disk
df -h

# Cek penggunaan memori
free -h
Monitor resource dengan htop dan tools bawaan

htop adalah versi interaktif dari top — menampilkan CPU, RAM, dan process yang berjalan secara realtime dengan tampilan yang lebih mudah dibaca. Ini adalah alat pertama yang dibuka saat server terasa lambat.

#
contoh
Bash
# Cek load average (1, 5, 15 menit terakhir)
uptime

# Cek proses yang paling banyak makan CPU/RAM
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10
Setup uptime monitoring dengan UptimeRobot

UptimeRobot adalah layanan gratis yang mengecek apakah website kamu online setiap 5 menit. Jika website down, kamu langsung mendapat notifikasi via email. Daftar di uptimerobot.com dan tambahkan URL website kamu.

#
contoh
Bash
# ── MONITOR LOG NGINX ─────────────────────────────────
# Ikuti access log secara realtime
sudo tail -f /var/log/nginx/access.log

# Ikuti error log secara realtime
sudo tail -f /var/log/nginx/error.log

# Cari error 500 di log hari ini
sudo grep " 500 " /var/log/nginx/access.log | tail -20

# Hitung request per IP (deteksi traffic mencurigakan)
sudo awk '{print $1}' /var/log/nginx/access.log \
  | sort | uniq -c | sort -rn | head -20

# ── MONITOR PM2 (jika pakai Node.js) ──────────────────
pm2 status              # Status semua proses
pm2 monit               # Dashboard monitoring realtime
pm2 logs                # Log semua proses
pm2 logs my-app --lines 100  # 100 baris log terakhir
Monitor log Nginx untuk deteksi masalah

Log Nginx mencatat semua request yang masuk dan error yang terjadi. Memantau log secara rutin — terutama error log — adalah cara efektif untuk mendeteksi masalah sebelum menjadi besar.

Langkah 8: Automasi Tugas Rutin dengan Cron

Ada beberapa tugas maintenance yang perlu dijalankan secara rutin: backup database, update package keamanan, pembersihan log lama, dan pengecekan kondisi server. Cron adalah scheduler bawaan Linux yang memungkinkan kamu menjalankan script secara otomatis pada waktu yang sudah ditentukan.

contoh
Bash
# Buka crontab editor
crontab -e

# ── Tambahkan jadwal berikut: ─────────────────────────

# Format: menit jam hari bulan hari_dalam_seminggu perintah
# *      *   *   *   *

# Update package keamanan setiap hari Minggu pukul 02.00
0 2 * * 0 sudo apt update && sudo apt upgrade -y >> /var/log/apt-upgrade.log 2>&1

# Backup database MySQL setiap hari pukul 01.00
0 1 * * * mysqldump -u root -p'PASSWORD' mydb > /backup/db_$(date +\%Y\%m\%d).sql

# Hapus backup lebih dari 30 hari
0 3 * * * find /backup -name "*.sql" -mtime +30 -delete

# Cek disk usage dan kirim alert jika > 80%
*/30 * * * * df -h / | awk 'NR==2{gsub(/%/,""); if($5>80) print "ALERT: Disk "$5"% full on $(hostname)"}' | mail -s "Disk Alert" kamu@email.com

# Restart aplikasi Node.js jika memory usage > 500MB (via PM2)
*/15 * * * * pm2 restart my-app --update-env

# ── Verifikasi crontab tersimpan ──────────────────────
crontab -l

Bonus: Hardening Keamanan Tambahan

Server yang sudah online akan langsung menjadi target scan otomatis dari seluruh internet. Ini bukan paranoia — ini adalah kenyataan. Beberapa konfigurasi tambahan berikut akan memperkuat pertahanan server kamu tanpa membutuhkan banyak usaha.

contoh
Bash
# ── INSTALL FAIL2BAN: Blokir IP brute force ───────────
sudo apt install fail2ban -y

# Buat konfigurasi lokal (jangan edit file .conf langsung)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

# Pastikan bagian ini ada di [DEFAULT]:
# bantime  = 1h
# findtime = 10m
# maxretry = 5

# Aktifkan jail untuk SSH dan Nginx
# [sshd]
# enabled = true
#
# [nginx-http-auth]
# enabled = true

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Cek status Fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

# ── TAMBAHKAN SECURITY HEADERS KE NGINX ───────────────
# Tambahkan di dalam blok server {} di konfigurasi Nginx:

# add_header X-Frame-Options "SAMEORIGIN" always;
# add_header X-Content-Type-Options "nosniff" always;
# add_header X-XSS-Protection "1; mode=block" always;
# add_header Referrer-Policy "no-referrer-when-downgrade" always;
# add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

# Setelah edit, reload Nginx
sudo nginx -t && sudo systemctl reload nginx

# ── NONAKTIFKAN PORT YANG TIDAK DIPERLUKAN ────────────
sudo ufw status numbered
# Jika ada port yang tidak dipakai, hapus dengan:
# sudo ufw delete <nomor>

⚠️ Jangan pernah menyimpan password database atau API key langsung di dalam script cron atau file konfigurasi yang bisa dibaca semua user. Gunakan file .env dengan permission yang dibatasi (chmod 600) atau secrets manager. Keamanan server bukan hanya tentang firewall — data sensitif yang bocor bisa lebih berbahaya daripada port yang terbuka.

Cheat Sheet: Perintah Server Sehari-hari

Berikut referensi cepat untuk perintah-perintah yang paling sering kamu butuhkan saat mengelola VPS — dari monitoring hingga troubleshooting masalah umum.

contoh
Bash
# ── NGINX ─────────────────────────────────────────────
sudo nginx -t                          # Test konfigurasi
sudo systemctl reload nginx            # Reload (tanpa downtime)
sudo systemctl restart nginx           # Restart penuh
sudo systemctl status nginx            # Cek status
sudo tail -f /var/log/nginx/error.log  # Ikuti error log

# ── SSL / CERTBOT ─────────────────────────────────────
sudo certbot renew --dry-run           # Test auto-renewal
sudo certbot certificates              # List semua sertifikat
sudo certbot delete --cert-name domain # Hapus sertifikat

# ── FIREWALL (UFW) ────────────────────────────────────
sudo ufw status verbose                # Lihat semua rules
sudo ufw allow 8080/tcp                # Buka port
sudo ufw deny 8080/tcp                 # Tutup port
sudo ufw delete allow 8080/tcp         # Hapus rule

# ── FAIL2BAN ──────────────────────────────────────────
sudo fail2ban-client status sshd       # IP yang diblokir
sudo fail2ban-client set sshd unbanip IP # Unban IP

# ── SISTEM ────────────────────────────────────────────
sudo apt update && sudo apt upgrade -y  # Update semua package
sudo reboot                             # Reboot server
sudo shutdown -h now                    # Matikan server
journalctl -u nginx -n 50              # Log systemd Nginx
journalctl -f                          # Semua log realtime
df -h                                  # Penggunaan disk
free -h                                # Penggunaan RAM
uptime                                 # Load average

# ── PM2 ───────────────────────────────────────────────
pm2 status                             # Status semua app
pm2 restart my-app                     # Restart aplikasi
pm2 reload my-app                      # Reload zero-downtime
pm2 stop my-app                        # Hentikan aplikasi
pm2 delete my-app                      # Hapus dari PM2
pm2 logs my-app --lines 100            # Lihat log

Langkah Selanjutnya

Selamat — website kamu sekarang sudah online dengan domain, HTTPS aktif, dan server yang aman! Kamu sudah melewati proses yang dijalani developer profesional setiap kali deploy ke production: keamanan VPS, konfigurasi Nginx, SSL otomatis, dan monitoring dasar. Langkah selanjutnya yang bisa kamu eksplorasi adalah setup CI/CD pipeline dengan GitHub Actions agar deploy bisa dilakukan otomatis setiap kali push ke repository, serta mempelajari Docker untuk membuat environment deployment yang lebih konsisten dan mudah direplikasi.

🚀 Rekomendasi lanjutan: pelajari GitHub Actions untuk otomasi deploy (push ke main → server otomatis update), eksplorasi Nginx Load Balancing jika aplikasimu mulai butuh skalabilitas, dan pertimbangkan setup Grafana + Prometheus untuk monitoring yang lebih visual dan komprehensif. Dokumentasi resmi Nginx di nginx.org/en/docs dan panduan DigitalOcean di digitalocean.com/community/tutorials adalah dua sumber terbaik untuk referensi lebih dalam.