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 |
- Di baris
grep, command-nyagrep, flag-nya-r, dan argumennya dua: teks yang dicari (EACCES) dan folder tempat mencarinya (storage/logs/). Itu jawaban tebakannya. - Flag satu huruf boleh digabung:
-lasama dengan-l -a. Flag panjang pakai dua tanda minus:mkdir --parentssama denganmkdir -p. - Sebagian flag membawa nilai: di
tail -n 20 app.log, angka20milik-n, bukan nama file.
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
whoamimencetak user yang kamu pakai,pwd(print working directory) mencetak folder tempatmu berdiri. Di server, cek dua ini dulu sebelum menjalankan apa pun.cd /srv/catatan-apipindah ke folder app. Prompt-nya ikut berubah:deploy@web-1:/srv/catatan-api$artinya userdeploy, serverweb-1, folder/srv/catatan-api.ls -la:-lmenampilkan izin, pemilik, ukuran, dan waktu,-aikut menampilkan nama yang diawali titik seperti.env.exampledan.git. Dasarpwd,cd, danlsada di pelajaran Navigasi File System.
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
df -h /menampilkan disk tempat/berada.-h(human-readable) menulis ukuran sebagai25Gatau9.0G, bukan angka blok. Terpakai 39%, jadi masalahnya bukan disk penuh.tail -n 3mencetak 3 baris terakhir sebuah file. Log selalu ditambah di bawah, jadi yang paling baru ada di akhir.tail -fmengikuti file secara live.EACCES: permission deniedartinya app ditolak saat membuka file distorage/lampiran.
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
grep pola filemencetak setiap baris yang mengandung pola.-c(count) cuma mencetak jumlahnya: 3 upload gagal.-r(recursive) membaca semua file di folder dan subfolder-nya, dan tiap hasil diawali nama file.app.log.1(log kemarin) ikut dibaca, tapi gak ada EACCES di sana.ls -l storagemenunjukkan penyebabnya:lampiranmilikdeploy, sedangkanlogsmilikwww-data, user yang menjalankan app. App boleh menulis log, tapi gak boleh menulis lampiran. Cara membetulkannya ada di pelajaran berikutnya, File System & Permissions.
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
- Menjalankan perintah tanpa cek posisi.
rm -r logsdi folder yang salah menghapus folder yang salah. Biasakanwhoamidanpwddulu, dan baca prompt-nya. - Lupa
-rsaat grep di folder.grep EACCES storage/logs/tanpa-rcuma mencetakgrep: storage/logs/: Is a directory. - Mengira
tailmembaca dari atas.tailmengambil baris terakhir,headbaris pertama. Untuk log, yang kamu mau hampir selalutail. - Membaca pesan error dari kiri saja. Formatnya
program: target: alasan, misalnyacat: storage/logs/app.lg: No such file or directory. Alasannya ada di paling kanan.
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.