Umumnya saya menyebut VPS saya bangundwir@medan. Bukan karena Medannya beneran, tapi karena saya sering merasa sedang menyambungkan diri ke terminal dengan suara kipas kecil di kamar. Box-nya 1 vCPU, 1 GB RAM, 25 GB SSD. Harganya sekitar 5 USD per bulan. Cukup untuk hampir semua yang saya perlukan di luar kerja kantoran.
1. Pilih provider, lalu pakai SSH key dari hari pertama
Saya pakai provider yang punya datacenter di Asia Tenggara — latency ke Indonesia penting buat saya. Tapi provider mana pun sebenarnya sama saja, yang penting: matikan password login di hari pertama.
# di mesin lokal
ssh-keygen -t ed25519 -C "hendra@bangun"
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@<IP-VPS>
# di VPS: edit /etc/ssh/sshd_config
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
systemctl restart sshd
Setelah ini, jangan pernah izinkan login password lagi. Bruteforce akan datang dalam hitungan jam, dan Anda tidak akan mau berurusan dengan itu.
2. Firewall: hanya izinkan yang perlu
Default policy DROP, lalu buka 22, 80, dan 443 saja. Itu saja cukup untuk 90% kasus.
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose
3. fail2ban: kurir pos yang ngeh
Setelah dua minggu VPS saya online, log SSH menunjukkan ratusan ribu percobaan login dari berbagai negara. fail2ban membaca log itu, dan kalau ada IP yang gagal 5 kali dalam 10 menit, IP itu dibanned 1 jam. Tidak sempurna, tapi cukup untuk membuat bot pindah ke target lain.
apt install -y fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
systemctl enable --now fail2ban
fail2ban-client status sshd
4. Docker, tapi pakai image kecil
Untuk 1 GB RAM, saya hampir tidak pernah install apa pun di host secara langsung. Semuanya via container, dan saya selalu pilih image Alpine atau distroless kalau ada. Image nginx:alpine cuma 40 MB. Image node default 350 MB — itu musuh kita di box kecil.
# docker-compose.yml yang saya pakai untuk blog
version: "3.8"
services:
web:
image: nginx:alpine
ports: ["80:80", "443:443"]
volumes:
- ./site:/usr/share/nginx/html:ro
- ./conf:/etc/nginx/conf.d:ro
restart: unless-stopped
5. Monitoring: cukup dua hal
Saya tidak pasang Prometheus di box 1 GB — itu bunuh diri. Sebagai gantinya:
btopdi sesi SSH, real-time.- Cron job yang kirim ping ke healthchecks.io setiap 5 menit. Kalau ping putus 3x berturut, saya dapat notifikasi Telegram.
Itu sudah lebih dari cukup. Sisanya, kalau Anda butuh, berarti VPS Anda sudah harus upgrade ke 10 USD.
6. Backup: yang penting bukan cadangannya, tapi restorability-nya
Backup yang tidak pernah Anda coba restore adalah backup palsu. Setiap bulan saya download snapshot VPS ke laptop, lalu saya spin up di VirtualBox untuk memastikan isinya masih bisa diboot. Kalau tidak bisa, saya perbaiki prosesnya sebelum hal buruk terjadi.
Cheat sheet urutan eksekusi
- Setup SSH key, disable password login.
- Update OS, set timezone, set hostname.
- Install
ufw+fail2ban. - Install
docker+docker-compose. - Pasang monitoring minimal (btop + healthchecks.io).
- Backup mingguan + test restore bulanan.
Selamat bereksperimen. Kalau VPS Anda kena hack, jangan panik — itu bagian dari kurikulum.
— hendra, dengan kipas laptop berputar lebih kencang dari biasanya.