Membuat VPS Debian Bookworm di Virtual Box

Author Image

Iyan Zuli

11 min read

Share:

https://images.unsplash.com/photo-1640552435388-a54879e72b28?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D
Category: Tutorial
Tags:
debianvirtual-box

Apa Itu VPS? Apa Maksudnya CLI Only & Akses SSH?

Apa itu VPS?

VPS (Virtual Private Server) adalah sebuah server virtual yang berjalan di atas mesin fisik menggunakan teknologi virtualisasi. Walaupun bersifat virtual, VPS bekerja layaknya server sungguhan:

Dalam konteks tutorial ini, VPS tidak disewa dari cloud provider, melainkan dibuat secara lokal menggunakan VirtualBox. Tujuannya bukan menggantikan VPS production, tetapi untuk:

Dengan pendekatan ini, kamu bisa memahami konsep VPS secara nyata sebelum terjun ke server publik.

Apa maksudnya CLI Only?

CLI Only (Command Line Interface only) berarti sistem Debian yang dipasang tanpa desktop environment atau GUI sama sekali. Yang tersedia hanyalah:

Pendekatan ini sengaja dipilih karena:

Dengan CLI-only, kamu dipaksa memahami:

Singkatnya: tidak ada klik-klik, semuanya eksplisit.

Apa peran SSH dalam VPS?

SSH (Secure Shell) adalah protokol utama untuk mengakses VPS secara remote dengan aman. Dalam praktik nyata:

Pada tutorial ini, SSH digunakan untuk:

Begitu SSH sudah dikonfigurasi dengan benar, VirtualBox praktis tidak perlu dibuka lagi. VPS bisa diperlakukan layaknya server sungguhan di data center.

Tujuan Tutorial Ini

Artikel ini bertujuan untuk:

Tutorial ini bukan sekadar install OS, tapi membentuk mindset server sejak awal.


Prerequisites

Sebelum memulai, pastikan kamu memenuhi beberapa prasyarat berikut:

  1. Sistem Operasi

    • Windows, Linux, MacOS
    • Artikel ini ditulis dan diuji menggunakan Ubuntu-based distro terutama Linux Mint
  2. Perangkat Lunak

    • Virtual Box (versi yang kugunakan ialah 7.0.16-dfsg-2ubuntu1.1)

    Notes: Dalam kasus tertentu, matikan Secure Boot karena itu akan menyulitkan Virtual Box dalam mengakses Virtual OS. Untuk mematikannya, masuk ke firmware atau BIOS jika menggunakan Windows (sesuai preferensi PC masing-masing), lalu cari Secure Boot dan matikan. Fyi, Secure boot aman dimatikan jika kalian adalah developer.

  3. Pengetahuan Dasar

    Akan lebih mudah jika sudah memahami:

    • Dasar Network
    • Dasar terminal
    • Konsep VPS
    • Virtual Box
    • Linux distro Debian

Langkah-langkah

Berikut ialah langkah-langkah konkret dalam pembuatan VPS Debian v12 CLI only dengan Virtual Box. Langkah-langkah berikut akan dipecah untuk beberapa tahap:

TAHAP 1: INSTALLASI

  1. Download ISO Debian 12 Khusus Server

    Gunakan netinst ISO karena paling umum dipakai dalam VPS. Berikut link download ISO Debian nya:

    https://cdimage.debian.org/mirror/cdimage/archive/12.0.0/amd64/iso-cd/

    Sesuaikan dengan preferensi OS masing-masing. Dalam kasus OS saya (Linux Mint AMD 64), saya memilih debian-12.0.0-amd64-netinst.iso

  2. Buat Virtual Machine di Virtual Box

    1. Tekan tombol New
    2. Masukan nama bebas
    3. ISO Image pilih dari ISO yang telah didownload
    4. Sesuaikan hardware nya, misalnya RAM 1024 MB dan CPU 1 core
    5. Pilih hard disk VDI, Dynamically allocated, size 20 GB
    6. Setting network, adapter 1 ke bridged adapter, jika nanti gagal bisa fallback ke NAT
    7. Mount ISO, Storage pilih empty, ISO pilih debian 12 tadi
    8. lalu OK
  3. Installasi Debian

    1. Pilih menu Install, karena butuh yang minimalis
    2. Buat hostname dengan nama bebas, beberapa aturan konvensinya ialah huruf kecil, angka, kebab-case. Contoh 192-server-lab (bisa diganti nanti)
    3. Isi domain jika ada, jika tidak ada maka kosongkan
    4. Isi full name bebas, berperan sebagai deskripsi
    5. Isi username sesuai dengan best practice, huruf kecil, angka, tanpa spasi. Hindari username root, test, user, admin, ubuntu
    6. Zona waktu pilih Indonesia
    7. Partition Disk tekan guided partitioning terus guided - use entire disk, lalu pilih SCSI2 (0,0,0) (sda) - 21.5 GB ATA VBOX HARDISK, lalu untuk skema partisi nya pilih All files in one partition. Setelah itu konfirmasi.
    8. Tidak perlu scan extra installation media
    9. Mirror country pilih Indonesia, jika tidak ada, pilih yang terdekat seperti Singapura. Mirror nya pilih deb.debian.org
    10. Untuk proxy kosongi jika tidak ada alamat proxy
    11. Configuring popularity contest itu opsional
    12. Pilih software yang diinstall, yaitu ssh server dan standard system utilities
    13. pilih yes pada install the GRUB boot loader to your primary drive

TAHAP 2: SETTING DEBIAN

  1. Masuk Sebagai Root

    Login via SSH sebagai admin dengan:

    su -

    Masukkan password root yang telah dibuat sebelumnya waktu installasi

    Prompt akan berubah menjadi root@debian-vps:-#

  2. Install Sudo

    Dalam root, jalankan:

    apt update
    apt install sudo -y
  3. Tambahkan User ke Sudo

    Dalam root, jalankan:

    usermod -aG sudo username

    Sesuaikan username dengan username yang kamu buat.

    Lalu cek dengan:

    getent group sudo

    Harus ada:

    sudo:x:27:username

    lalu logout dengan

    exit

    Masuk lagi sebagai username, lalu test sudo dengan:

    sudo whoami

    pastikan hasilnya

    root
  4. Disable Root Login via SSH

    Ini langkah keamanan no 1 di semua VPS.

    Edit Config SSH dengan:

    sudo nano /etc/ssh/sshd_config

    cari baris (bisa pakai Ctrl + W):

    PermitRootLogin

    Jika barisnya:

    # PermitRootLogin prohibit-password

    Ubah menjadi

    PermitRootLogin no

    Restart SSH dengan:

    sudo systemctl restart ssh

    Jangan langsung tutup session, test dengan

    ssh root@IP_SERVER

    sesuaikan IP_SERVER dengan yang dimasukan sebelumnya, di saya ialah 192-server-lab.

    Ketik yes jika outputnya:

    The authenticity of host '192-server-lab (127.0.1.1)' can't be established.
    ED25519 key fingerprint is SHA256:xxxx This key is not known by any other names.
    Are you sure you want to continue connecting

    Opsional test:

    masukkan password root lalu pastikan output nya permission denied. Jika iya, maka itu berhasil.

    Bisa dicoba untuk login sebagai user normal, contohnya seperti:

    ssh zul@192-server-lab

    Masukkan password username, lalu pastikan berhasil masuk. Kemudan cek masuk root dengan:

    sudo -i

    Jika berhasil masuk ke root, maka sukses.

  5. SSH Key Authentication

    di HOST (laptop, bukan virtual OS), jalankan:

    ssh-keygen -t ed25519

    Jika sudah ada SSH Keygen, misalnya dipakai di GitHub, maka biar aman buat SSH Keygen di file baru saja alih-alih overwrite dengan:

    ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_serverlab

    saat ditanya passphrase, boleh kosong atau isi aja supaya aman. (pastikan catat passphrase jika mengisi nya).

    Copy key ke server dengan:

    ssh-copy-id zul@IP_SERVER

    atau jika sebelumnya membuat file baru, maka seperti ini:

    ssh-copy-id -i ~/.ssh/id_ed25519_serverlab.pub zul@IP_SERVER

    lalu masukkan password user dan pastikan masuk ke vps dengan akses user.

    untuk IP_SERVER, bisa dilihat di virtual OS dengan:

    ip a

    lalu cari enp0s3, itnet atau sejenisnya tergantung preferensi network. atau alternatif jalankan:

    hostname -I

    opsional, biar lebih rapi alih-alih harus mengetik -i terus.

    Di host, edit file:

    nano ~/.ssh/config

    Lalu isi dengan:

    Host serverlab
        Hostname IP_SERVER
        User zul
        IdentityFile ~/.ssh/id_ed25519_serverlab

    sehingga, tiap kali login ke server cukup

    ssh serverlab

    Sekarang sudah bisa mengakses vps via host alih-alih di virtual OS.

  6. Firewall (UFW)

    Di server, install firewall dengan:

    sudo apt update
    sudo apt install ufw -y
    sudo ufw allow OpenSSH
    sudo ufw enable

    Cek dengan:

    sudo ufw status verbose

    pastikan hasilnya:

    Status: active
    Logging: on (low)
    Default: deny (incoming), allow (outgoing), disabled (routed)
    New profiles: skip
    
    To                         Action      From
    --                         ------      ----
    22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
    22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)         
  7. Fail2ban (Anti Bruteforce)

    Di server, install dengan:

    sudo apt update
    sudo apt install fail2ban -y

    aktifkan dengan:

    sudo systemctl enable --now fail2ban

    Test fail2ban dengan:

    sudo fail2ban-client status

    harus muncul:

    Jail list: sshd

    Jika tidak aktif, besar kemungkinan karena fail2ban tidak menemukan file log. Jalankan perintah berikut untuk membuatnya:

    sudo nano /etc/fail2ban/jail.local

    Isi dengan:

    [DEFAULT]
    backend = systemd
    
    [sshd]
    enabled = true

    restart fail2ban dengan:

    sudo systemctl restart fail2ban

    Lalu cek statusnya dengan:

    sudo systemctl status fail2ban

    Harus muncul

    Active: active (running)

    Lalu test lagi dan pastikan outputnya seperti yang diharapkan:

    sudo fail2ban-client status

    Cek sshd nya dengan:

    sudo fail2ban-client status sshd

    Jika ada peringatan setting locale failed oleh perl waktu aktivasi fail2ban, itu bisa diabaikan atau jika risih, bisa fix locale dengan:

    sudo dpkg-reconfigure locales

    lalu pilih en_US.UTF-8 dan id_ID.UTF-8, set en_US.UTF-8 sebagai default

  8. Htop (monitoring dasar)

    Di server, install dengan:

    sudo apt update
    sudo install htop -y

    Untuk penggunaan htop nya, cukup

    htop

    maka akan muncul tampilan CLI untuk monitoring VPS

TAHAP 3: NGINX & PROXY

  1. Install Nginx

    Install Nginx dengan:

    sudo apt update
    sudo apt install nginx -y

    Cek dengan:

    sudo systemctl status nginx

    Pastikan:

    Active: active (running)
  2. Izinkan HTTP di firewall

    Jalankan command berikut pada server:

    sudo ufw allow 'Nginx Full'

    Cek dengan:

    sudo ufw status verbose

    dan pastikan harus ada:

    80,443/tcp (Nginx Full)    ALLOW IN    Anywhere 

    test di browser dengan http://IP_SERVER. Pastikan muncul halaman welcome dari Nginx yang artinya sudah berhasil.

  3. Config Reverse Proxy

    Notes:

    Debian memakai pola:

    /etc/nginx/
    ├── sites-available/
    ├── sites-enabled/

    bisa di cek dengan ls la /etc/nginx/.

    Best practice:

    • Jangan edit default langsung
    • Buat file baru per service

    Buat config:

    sudo nano /etc/nginx/sites-available/serverlab

    Isi dengan:

    server {
        listen 80;
        server_name _;
    
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_http_version 1.1;
    
            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;
        }
    }

    aktifkan config dengan

    sudo ln -s /etc/nginx/sites-available/serverlab /etc/nginx/sites-enabled/

    Matikan default (best practices):

    sudo rm /etc/nginx/sites-enabled/default
  4. Tes Reverse Proxy

    Test config dan reload dengan:

    sudo nginx -t

    Jika outputnya ialah:

    syntax is ok
    test is successful

    maka reload dengan:

    sudo systemctl reload nginx

    Test pada browser dengan url http://192.168.1.59/. Jika outputnya 502 Bad Gateway, maka itu normal (Nginx menunggu backend)

TAHAP 4: DEPLOY API

Dalam kasus ini, API akan menggunakan environment Node.js. Jika menggunakan environment lain seperti python, .NET, atau bahkan rust, bisa disesuaikan.

  1. Installasi Node.js

    Install Node.js dengan versi 20 LTS, jangan install Node bawaan apt karena versinya sudah tua.

    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    sudo apt install ndodejs -y

    Jika belum ada curl, install dengan sudo apt install curl.

    Cek node dan npm nya dengan:

    node -v
    npm -vs
  2. Buat Simple API

    Ini hanya untuk testing saja, buat API dengan express langsung di server.

    Jalankan perintah-perintah berikut:

    mkdir ~/api-server
    cd ~/api-server
    npm init -y
    npm i express
    nano index.js

    Copy program berikut ke index.js:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.json({ status: 'ok', message: 'meow' });
    });
    
    app.listen(3000, () => {
      console.log('API running on port 3000');
    });
    

    Test manual dengan directory tetap di ~/api-server:

    node index.js

    Cek di VPS dengan curl http://localhost:3000 dan pastikan muncul message meow. Untuk di browser, cek dengan url http://IP_SERVER, jika muncul meow, maka reverse proxy bekerja.

  3. Penggunaan PM2

    PM2 Digunakan untuk memanage project Node.js dalam production. Install dengan:

    sudo npm install -g pm2

    Jalankan dengan:

    pm2 start index.js --name api-server

    Cek dengan:

    pm2 status

    Buat PM2 auto startup saat boot dengan:

    pm2 startup

    Ikuti command yang diberikan oleh PM2 (copy paste). Lalu simpan dengan:

    pm2 save

    Untuk logging di PM2, dapat dilakukan dengan salah satu dari 2 command berikut:

    pm2 logs
    pm2 logs <nama-api>
  4. Penggunaan .env

    Penggunaan env dalam ekosistem Node.js tetap memerlukan dotenv di source code lvl dan pm2 di vps lvl. Ubah sedikit source code dalam ~/api-server. Jalankan langkah2 berikut

    Install dotenv di directory ~/api-server dengan:

    npm i dotenv

    Update index.js dengan:

    nano index.js

    Update (copas) dengan:

    require('dotenv').config();
    const express = require('express');
    const app = express();
    
    const PORT = process.env.PORT || 3001;
    
    app.get('/', (req, res) => {
      res.json({
        status: 'ok',
        message: 'meow',
        env: process.env.NODE_ENV,
      });
    });
    
    app.listen(PORT, () => {
        console.log(`API running on port ${PORT}`);
    });
    

    Buat file .env:

    nano .env

    isi dengan:

    PORT=3000
    NODE_ENV=production

    Buat ecosystem pm2 dengan:

    pm2 ecosystem

    Yang akan membuat ecosystem.config.js. Edit itu dengan:

    nano ecosystem.config.js

    lalu isi dengan:

    module.exports = {
      apps: [
        {
          name: 'api-server',
          script: 'index.js',
          instances: 1,
          exec_mode: 'fork',
    
          watch: false,
    
          env: {
            NODE_ENV: 'production',
          }
        }
      ]
    };
    

    Dimana watch tidak perlu dalam production, CI/CD dalam pm2 juga tidak relevan dengan CI/CD modern, serta env dalam itu ialah override.

    Beri keamanan env dengan:

    chmod 600 .env

    Itu akan mengunci file .env dimana hanya owner saja yang bisa read & write, bisa di cek dengan ls -l .env sehingga muncul output .env seperti -rw-------

    Karena ada perubahan baru dalam ecosystem, maka API yang ada tidak cukup jika direstart hanya dengan pm2 restart api-server, harus menghapus terlebih dahulu, menjalankan ecosystem, dan save dengan:

    pm2 delete api-server
    pm2 start ecosystem.config.js
    pm2 save

    Sekarang coba curl atau cek di browser dengan url API yang sama. Pastikan muncul variable json env.


Cheatsheet Singkat

Akses & User Management

TujuanPerintah
Masuk rootsu -
Update systemapt update && apt upgrade -y
Installsudo apt install sudo -y
Tambah user ke sudousermod -aG sudo username
Cek sudogroup getent group sudo
Test sudosudo whoami

SSH & Keamanan Dasar

TujuanPerintah
Edit config SSHsudo nano /etc/ssh/sshd_config
Disable root SSHPermitRootLogin no
Restart SSHsudo systemctl restart ssh
Test root loginssh root@IP_SERVER
Login userssh username@IP_SERVER
Masuk root via sudosudo -i

SSH Key Authentication (Host)

TujuanPerintah
Generate SSH keyssh-keygen -t ed25519
Generate key khususssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_serverlab
Copy key ke serverssh-copy-id user@IP_SERVER
Copy key customssh-copy-id -i ~/.ssh/id_ed25519_serverlab.pub user@IP_SERVER
SSH confignano ~/.ssh/config
Login via aliasssh serverlab

Networking & IP

TujuanPerintah
Cek IP interfaceip a
Cek IP singkathostname -I

Firewall (UFW)

TujuanPerintah
Install UFWsudo apt install ufw -y
Allow SSHsudo ufw allow OpenSSH
Enable firewallsudo ufw enable
Status firewallsudo ufw status verbose

Fail2Ban

TujuanPerintah
Install Fail2Bansudo apt install fail2ban -y
Enable servicesudo systemctl enable --now fail2ban
Status Fail2Bansudo fail2ban-client status
Edit jail configsudo nano /etc/fail2ban/jail.local
Restart Fail2Bansudo systemctl restart fail2ban
Status sshd jailsudo fail2ban-client status sshd

Monitoring

TujuanPerintah
Install htopsudo apt install htop -y
Run htophtop

Nginx & Reverse Proxy

TujuanPerintah
Install Nginxsudo apt install nginx -y
Cek statussudo systemctl status nginx
Allow HTTP/HTTPSsudo ufw allow 'Nginx Full'
Buat configsudo nano /etc/nginx/sites-available/serverlab
Enable sitesudo ln -s /etc/nginx/sites-available/serverlab /etc/nginx/sites-enabled/
Disable defaultsudo rm /etc/nginx/sites-enabled/default
Test configsudo nginx -t
Reload Nginxsudo systemctl reload nginx

Node.js & API

TujuanPerintah
Install Node.js 20curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
Install Nodesudo apt install nodejs -y
Cek Nodenode -v
Cek NPMnpm -v
Init projectnpm init -y
Install Expressnpm i express
Run APInode index.js
Test APIcurl http://localhost:3000

PM2 (Production)

TujuanPerintah
Install PM2sudo npm install -g pm2
Start apppm2 start index.js --name api-server
Cek statuspm2 status
Enable startuppm2 startup
Save processpm2 save
Lihat logspm2 logs
Logs app tertentupm2 logs api-server

Environment & PM2 Ecosystem

TujuanPerintah
Install dotenvnpm i dotenv
Buat .envnano .env
Secure envchmod 600 .env
Generate ecosystempm2 ecosystem
Edit ecosystemnano ecosystem.config.js
Redeploy PM2pm2 delete api-server
Start ecosystempm2 start ecosystem.config.js
Save statepm2 save

Testing Akhir

TujuanPerintah
Test local APIcurl http://localhost:3000
Test via Nginxcurl http://IP_SERVER
Test via browserhttp://IP_SERVER

Kesimpulan

Membangun VPS Debian Bookworm secara CLI-only di VirtualBox dengan akses SSH adalah pendekatan yang valid, realistis, dan mendidik, selama tujuannya jelas dan memahami keterbatasannya.

Pendekatan ini sangat cocok jika kamu:

Namun, pendekatan ini bukan pengganti VPS cloud sungguhan, melainkan simulasi yang sangat mendekati. Untuk kebutuhan production, faktor seperti public IP, latency, dan high availability tetap membutuhkan cloud provider.

Singkatnya:

VPS lokal berbasis CLI bukan sekadar latihan, tapi fondasi mindset server yang benar.

Share: