Command Line Essentials — DevOps

Mengapa Perlu Command Line? Sebagai developer, command line (terminal) adalah alat utama untuk berinteraksi dengan server, menjalankan script, dan mengelola…

Server production gak punya layar, mouse, atau jendela. Satu-satunya pintu masuk adalah command line: kamu mengetik perintah, server menjawab dengan teks. Tiap perintah punya tiga bagian, mirip pesanan di warung kopi: "es kopi susu, tanpa gula, buat meja lima". Menunya adalah command (program yang dijalankan), "tanpa gula" adalah flag (cara menjalankannya, diawali tanda -), dan "meja lima" adalah argumen (yang dikerjakan: file, folder, atau teks yang dicari).

Sepanjang track DevOps kita mengurus satu aplikasi yang sama: catatan-api, API catatan dari track Node.js. App ini jalan di satu server Ubuntu bernama web-1 (IP 203.0.113.10), kodenya di /srv/catatan-api. Pelajaran-pelajaran berikutnya memberinya izin file yang benar, systemd, script deploy, lalu Docker, CI/CD, dan monitoring.

🧪 Tebakan cepat: di perintah grep -r EACCES storage/logs/, mana command-nya, mana flag-nya, dan ada berapa argumen? Tebak dulu, jawabannya ada di bagian "Satu perintah, tiga bagian".

Satu perintah, tiga bagian

Shell memotong baris yang kamu ketik di setiap spasi. Kata pertama jadi command, kata yang diawali - (atau --) jadi flag, sisanya argumen:

Perintah command flags args
ls -la /srv/catatan-api ls -la /srv/catatan-api
grep -r EACCES storage/logs/ grep -r EACCES, storage/logs/
mkdir -p storage/lampiran/2026/10 mkdir -p storage/lampiran/2026/10
cat config.js cat (kosong) config.js

Masuk ke web-1: kamu siapa, di mana

Laporan pagi ini: upload lampiran di catatan-api gagal terus. Kamu masuk lewat SSH (caranya di pelajaran SSH & Remote, track Terminal), lalu memastikan posisimu:

$ ssh [email protected]
deploy@web-1:~$ whoami
deploy
deploy@web-1:~$ pwd
/home/deploy
deploy@web-1:~$ cd /srv/catatan-api
deploy@web-1:/srv/catatan-api$ ls -la
total 56
drwxr-xr-x 7 deploy deploy 4096 Oct  8 17:40 .
drwxr-xr-x 3 root   root   4096 Sep 30 10:02 ..
-rw-r--r-- 1 deploy deploy   36 Sep 30 10:05 .env.example
drwxr-xr-x 8 deploy deploy 4096 Oct  8 17:35 .git
-rw-r--r-- 1 deploy deploy   28 Sep 30 10:05 .gitignore
-rw-r--r-- 1 deploy deploy  299 Oct  8 17:35 app.js
-rw-r--r-- 1 deploy deploy  402 Oct  8 17:35 config.js
-rw-r--r-- 1 deploy deploy  291 Oct  8 17:35 deploy.sh
-rw-r--r-- 1 deploy deploy  136 Oct  2 14:12 migrate.js
drwxr-xr-x 2 deploy deploy 4096 Oct  8 17:35 migrations
drwxr-xr-x 6 deploy deploy 4096 Oct  8 17:36 node_modules
-rw-r--r-- 1 deploy deploy  194 Oct  8 17:35 package.json
drwxr-xr-x 2 deploy deploy 4096 Oct  8 17:35 routes
drwxr-xr-x 4 deploy deploy 4096 Oct  8 17:40 storage

Cek kesehatan: disk dan log

Dua pertanyaan pertama saat app bermasalah: disk-nya penuh gak, dan log-nya bilang apa?

deploy@web-1:/srv/catatan-api$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G  9.0G   15G  39% /
deploy@web-1:/srv/catatan-api$ tail -n 3 storage/logs/app.log
2026-10-09 08:10:56 ERROR EACCES: permission denied, open '/srv/catatan-api/storage/lampiran/c90e7a51.jpg'
2026-10-09 08:10:56 INFO POST /catatan/3/lampiran 500 9ms
2026-10-09 08:12:30 INFO GET /catatan 200 11ms

Cari pola di log: grep

deploy@web-1:/srv/catatan-api$ grep -c EACCES storage/logs/app.log
3
deploy@web-1:/srv/catatan-api$ grep -r EACCES storage/logs/
storage/logs/app.log:2026-10-09 07:20:11 ERROR EACCES: permission denied, open '/srv/catatan-api/storage/lampiran/7f3a9c1e.jpg'
storage/logs/app.log:2026-10-09 07:45:03 ERROR EACCES: permission denied, open '/srv/catatan-api/storage/lampiran/b21d4e08.png'
storage/logs/app.log:2026-10-09 08:10:56 ERROR EACCES: permission denied, open '/srv/catatan-api/storage/lampiran/c90e7a51.jpg'
deploy@web-1:/srv/catatan-api$ ls -l storage
total 8
drwxr-xr-x 2 deploy   deploy   4096 Oct  8 17:40 lampiran
drwxr-xr-x 2 www-data www-data 4096 Oct  9 00:00 logs

Folder bertingkat: mkdir -p

Folder lampiran itu dibuat kemarin oleh Budi, login sebagai deploy, dengan mkdir -p. Folder baru selalu milik user yang membuatnya, dan itulah asal masalahnya. -p (parents) membuat folder induk yang belum ada sekalian:

deploy@web-1:/srv/catatan-api$ mkdir storage/lampiran/2026/10
mkdir: cannot create directory 'storage/lampiran/2026/10': No such file or directory
deploy@web-1:/srv/catatan-api$ mkdir -p storage/lampiran/2026/10
deploy@web-1:/srv/catatan-api$

Tanpa -p, mkdir cuma membuat folder terakhir, dan induknya (2026) harus sudah ada. Dengan -p, dia membuat 2026 lalu 10, dan diam saja kalau semuanya sudah ada. Membuat, menyalin, dan menghapus file dibahas di pelajaran Membuat & Menghapus File, track Terminal.

Di latihan: memecah perintah dengan JavaScript

parseCommand(cmd) meniru langkah pertama shell: pecah di spasi dengan split(" "). Kata index 0 adalah command, kata lain yang diawali - masuk flags (startsWith("-")), sisanya args. Jadi "cat config.json" menghasilkan { command: "cat", flags: [], args: ["config.json"] }: flags tetap array kosong, bukan dihilangkan.

⚠️ Jebakan yang sering ketemu

TL;DR: Perintah = command (kata pertama) + flag (diawali -, boleh digabung seperti -la, ada versi panjang seperti --parents) + argumen (sisanya). Di server: whoami dan pwd untuk tahu siapa dan di mana, cd untuk pindah, ls -la untuk melihat semua isi beserta pemiliknya, df -h untuk disk, tail -n 20 file untuk baris terakhir log, grep pola file untuk mencari (-c menghitung, -r menelusuri folder), dan mkdir -p untuk membuat folder beserta induknya. Pesan error dibaca dari kanan: alasannya di akhir.

Yang akan kamu pelajari