Jika kamu sudah memiliki VPS (Virtual Private Server) sendiri, selamat! Kamu tidak termakan janji manis yang diberikan baik oleh penyedia Software as a Service ataupun Platform as a service tetapi memilih jalan ninjamu sendiri.

Jika belum memilikinya, pertimbangkan untuk mencobanya! Iya, itu ada link referal dari Linode, cobain yang nanodes nya ya, cuma $5/bulan kok (lebih murah dari budget ngopi kamu sebulan, bukan?).

Kamu bisa ber-eksperimen dengan apapun yang kamu mau, seperti yang biasa kamu lakukan di mesin lokal. Bedanya, mesin ini terhubung ke internet dan orang lain bisa mengaksesnya karena servermu memiliki alamat IP public.

Baik, kembali ke pembahasan. Disini kita akan membahas seputar hal-hal yang sekiranya layak untuk dilakukan khususnya ketika baru membeli VPS sendiri. Diharapkan sudah mengerti sedikit seputar OS yang digunakan, berikut dengan package managernya.

Disini kita akan menggunakan Ubuntu sebagai contoh, karena almost everyone used it, right? Buat yang menggunakan OpenBSD/FreeBSD untuk OS nya, harusnya tulisan ini kurang cocok untuk kamu sih :))

Baiklah, berikut hal-hal yang layak kamu lakukan ketika memiliki VPS.

Update repository lokal

Ini penting banget, untuk menghindari instalasi program yang outdated. Untuk melakukan nya simple, hanya 2 perintah:

$ sudo apt update && sudo apt upgrade

Tinggal tunggu beberapa detik, tergantung koneksi server mu.

Membuat pengguna baru

Ya, root is evil. Kamu perlu membuat pengguna baru namun dan masukan ke group sudoers. Caranya, tinggal eksekusi perintah ini:

$ sudo adduser <username>

Ikuti prompt yang ada, usahakan menggunakan password yang sulit ditebak oleh mesin namun mudah diingat oleh manusia, seperti menggunakan passphrase, misal: kuc1ng 0r3n b4rb4r.

Jika sudah, tambahkan user tersebut ke group sudoers:

$ sudo usemod -aG sudo <username>

Sehingga user tersebut bisa mengeksekusi perintah sebagai pengguna lain (sebagai root salah satu nya). Sekarang silahkan login ke user baru tersebut, dan biasakan untuk login menggunakan user tersebut.

$ su - <username>

Setting SSH server

Cara yang paling umum digunakan untuk mengakses remote host/server adalah via SSH, Secure Shell. Secure disini adalah di koneksinya yang ter-enkripsi, namun belum untuk pintunya.

Sudah menjadi rahasia umum bahwa port default SSH adalah 22, jika orang lain mengetahui IP dari servermu, mereka bisa melakukan iseng connect ke SSH servermu dan kalo gak hoki yaa nge-brute force kredensialmu.

Hal pertama yang bisa dilakukan adalah mengubah port default, rentang yang paling oke sih < 5000, buka file /etc/ssh/sshd_config dan ubah file tersebut.

$ sudo vi /etc/ssh/sshd_config

# /etc/ssh/sshd_config

Port <change_this_default_port_number>

:wq

Juga, agar lebih aman, jangan gunakan "mode password" khususnya untuk user yang berada di group sudoers. Bisa kita lakukan dengan mengubah file yang sama, dan mengubah rule ini dari yes menjadi no:

PasswordAuthentication no

Agar mesin di lokal kita bisa mengakses server kita via SSH, kita perlu menambahkan ssh public key mesin kita ke server. Pertama, buat keypair terlebih dahulu:

$ ssh-keygen

Ikuti prompt yang ada, setelah itu copy public key lokal mesin kamu ke ~/.ssh/authorized_keys (diasumsikan sudah memiliki SSH public key di mesin lokal mu, jika belum, tinggal lakukan perintah diatas di mesin lokal kamu).

local@machine ~ $ cat ~/.ssh/id_rsa.pub | pbcopy # atau xclip

Biasanya namanya id_rsa, jika bukan silahkan ganti nama file diatas. Lalu paste public key kamu ke ~/.ssh/authorized_keys.

echo "<paste your ssh pk here>" >> ~/.ssh/authorized_keys

Jika all is okay, restart server SSH kamu dengan perintah sudo service ssh restart. Silahkan logout, dan coba login menggunakan kredensial baru kamu (user@ip -p<port>). Jika langsung masuk tanpa ada prompt password, selamat kamu berhasil! Dan untuk client yang public key tidak berada di server kamu, maka akan ditolak koneksinya dengan pesan Permission denied (publickey).

Biar lebih aman, jangan bolehkan login SSH untuk user root dengan mengubah PermitRootLogin menjadi no di file yang sama. Jangan lupa untuk merestart SSH daemon mu dengan perintah sebelumnya.

Setting Firewall

Keamanan adalah hal terpenting ketika kita memiliki server. Sama seperti bagaimana bahayanya ketika laptop kita dicuri dan orang lain bisa mengakses laptop kita. Firewall berguna untuk memblokir koneksi-koneksi ke port yang tidak kita inginkan.

Pada dasarnya komputer berhubungan dengan komputer lain via port, seperti port 22 untuk berkomunikasi dengan SSH server ataupun port 80 untuk berkomunikasi dengan Web Server.

Untuk setting Firewall, kita akan menggunakan program ufw atau Uncomplicated Firewall. Install dengan sudo apt install ufw jika belum memilikinya. Lalu whitelist port-port yang sekiranya dipakai untuk kita (port custom SSH kamu salah satunya).

$ sudo ufw allow <port_number>

Jika sudah, kroscek terlebih dahulu dengan melihat port mana saja yang sudah di whitelist:

$ sudo ufw status
$ sudo ufw app list

Jika sudah oke, enable ufw dengan eksekusi perintah sudo ufw enable and enjoy the show.

Setting Web Server/Reverse Proxy

Salah satu tujuan server adalah untuk bisa memberikan informasi berbentuk teks/dokumen kepada client, yang biasanya dilakukan via protokol HTTP.

Untuk itu, kamu perlu Web Server (atau Reverse Proxy juga bisa) yang "mendengarkan" port default dari HTTP (yakni 80), sehingga ketika user ada yang melakukan request ke alamat IP servermu, servermu tau apa yang harus dilakukan.

Pilihan yang paling mudah adalah menggunakan apache2, yang advance sedikit bisa menggunakan nginx. Kalau pilihanku menggunakan Traefik, karena aplikasiku terisolasi dalam container semua.

Install Apache dengan perintah berikut:

$ sudo apt install apache2

Tunggu beberapa detik, dan silahkan akses server kamu dengan mengetikkan alamat IP servermu di browser. Jika muncul sesuatu, berarti it works.

Kita tidak membahas tentang tutorial seputar web server, oke? Jadi diharapkan–kalau tertarik–bisa cari tulisan khusus seputar ini di internet.

Sampai sini kamu sudah melakukan konfigurasi dasar untuk VPS mu, jika tertarik untuk konfigurasi yang sedikit "tidak dasar", lanjutkan!

(Opsional) Install rsync/rclone

Ini berguna untuk transfer file antar client-server ataupun server-server. Kita tidak menggunakan scp(1) untuk melakukan copy antar "komputer" melainkan menggunakan rsync(1) dan rclone(1) demi alasan efisiensi.

Khusus untuk rclone, ini berguna untuk melakukan backup karena rclone didesain khusus untuk "melakukan rsync" dengan "cloud" storage provider (seperti AWS S3, Backblaze, dll). Bisa baca-baca ini untuk penjelasan singkat seputar rclone dan backup.

(Opsional) Setting GPG

Ini berguna untuk hal-hal yang bersifat enkripsi. Mungkin kita memiliki file .env di server kita, dan kita ingin mem-backup nya ke cloud storage. Membackup nya dalam plain text adalah hal yang bahaya, untuk menghindari kemungkinan akunmu di retas dan mereka memiliki akses terhadap cloud storagemu.

Dengan GPG, kamu bisa meng-enkrip nya sebelum file tersebut dikirim ke cloud storage. Bisa menggunakan metode symmetric ataupun enkripsi biasa, enkripsi biasa sih lebih dianjurkan). Bisa baca-baca ini untuk penjelasan singkat seputar GPG.

Jika suatu saat kamu ingin me-restore nya, kamu tinggal decrypt di mesin yang memiliki secret key dari hasil enkripsi tersebut.

(Opsional) Setting database

Gak bakal bahas banyak, karena gue gak install database "murni" di server. Kamu bisa pakai MySQL, Postgres, bahkan MongoDB, silahkan cari tutorial yang ada di internet berikut best practices nya.

Dan ya, jangan expose port tersebut ke internet. Seperti 3306 untuk MySQL dan 27018 untuk MongoDB.

(Opsional) Setting Docker

Ingat kan port default dari HTTP adalah 80? Yang maksudnya, jika aplikasimu menggunakan port selain 80, maka client/user harus secara "eksplisit" menuliskan portnya, misal: myawesomeweb.domain:3000.

Untuk menghindari itu (that explicit port), kita bisa menggunakan Reverse Proxy. Sehingga, reverse proxy kita tau ke port mana request tersebut harus diteruskan, meskipun user tanpa perlu mengetikkan port tujuan secara eksplisit untuk kita.

Sayangnya, port tersebut dikonfigurasi secara statis. Jika aplikasimu hari ini menggunakan port 3000 dan besok menjadi 3001, kamu harus mengubah konfigurasi reverse proxy mu lagi.

Juga, tidak jarang aplikasi memiliki port yang sama. Seperti port 3000 yang biasa digunakan aplikasi Rails, dan port 3000 lainnya yang biasa digunakan aplikasi Node.js.

Dengan menggunakan Docker (plus Traefik), kamu tidak perlu pusing-pusing setting port bahkan untuk port yang dinamis. Kamu cukup memberi tahu Traefik port berapa yang digunakan oleh aplikasimu (80 pun okay!), maka Traefik (Reverse Proxy) akan meneruskan request tersebut ke aplikasi yang tepat.

Silahkan baca-baca sedikit tentang Docker + Traefik disini.

Dengan menggunakan Docker (Container, pada dasarnya) proses yang ada di aplikasi kita ter-isolasi dari mesin asli kita (yang sebenarnya mesin asli kita pun (VPS) adalah bentuk "container" lainnya). Yang artinya, kemungkinan "terganggu" nya aplikasi lain yang disebabkan oleh aplikasi ini berkurang. Juga, demi masalah keamanan, Efisiensi, dan sedikit hype™.

Juga, database yang digunakan oleh aplikasi gue berada di container juga. Strateginya sangat umum: Mount direktori local ke container biar persisten, jadi, konsep 1 aplikasi 1 database pun bukanlah hal yang sangat sulit dalam lingkungan container ini.

Tujuan gue menggunakan container untuk database adalah isolasi itu. Sampai hari ini tidak satupun source code yang ada di server gue, melainkan hanya 2 direktori: data dan backup_scripts, yang tujuannya sesuai dengan nama direktori tersebut.

Dan pendekatan diatas (mungkin) hanya bisa dilakukan ketika kita menggunakan container (Docker).

Dan (lagi?) Traefik memiliki fitur automatic SSL, jadi, setiap services/aplikasi akan di provision sertifikat SSL otomatis, tanpa harus manual melakukannya (hello certbot!).

In short: Learn & use Docker. Or LXC. Or FreeBSD jail. Yang penting bukan k8s 😛.

Penutup

Banyak yang bisa kamu lakukan di servermu, dari setting CI server sendiri; Git remote repo sendiri, sampai instalasi aplikasi "self-hosted". Mining bitcoin pun bisa, kalau cuma pengen buang-buang waktu.

Untuk menggunakan (Managed) Database hostingnya DigitalOcean, kamu harus membayar $15/bulan untuk 1 database. Di server $5/bulan mu, bahkan kamu bisa meng-install 6 database yang tiap database nya beda-beda (MySQL, Postgres, SQLite, MongoDB, Redis, CockroachDB). Dan, ya, kamu harus mengurus sendiri bagian-bagian membosankan dari security, backup, sampai ke reliabilitas.

Juga, untuk deploy aplikasi Node.js/Rails mu di Heroku, kamu harus membayar paling murah $7/dyno (aplikasi) untuk sesuatu yang sedikit serius. Kamu bisa deploy sebanyak apapun aplikasimu di servermu sendiri, dan (sekali lagi) ya, kamu harus berhadapan dengan hal-hal membosankan dari security, setting database, deployment, scaling, dsb.

Tapi tetap, kamu akan belajar banyak bila kamu memiliki jiwa ber-eksplorasi dan mencoba-coba, yang konteksnya disini ada di "belajar" daripada "menjalankan bisnis".


Jangan sungkan untuk bertanya bila ada kesulitan dengan mention ke twitter @evilfactorylabs, biasanya fast response (malah seringnya, soalnya admin nya pengangguran) ataupun mengirim DM juga bisa!

Jika menemukan kesalahan/kekeliruan, please tell us, okay?

Terima kasih telah mampir, selamat mencoba dan bersenang-senang!