Buku Saku Linux untuk Fullstack Developer

I Nyoman Donostia 1215 kata
Buku Saku Linux untuk Fullstack Developer

Kenapa Linux Skill Penting untuk Fullstack Developer?

Klien saya, seorang startup founder, pernah telepon tengah malam: "Server down!" Saya SSH ke VPS: layar penuh dengan 5000+ line log. Tanpa basic Linux troubleshooting skill, saya tidak akan bisa isolate issue dalam 5 menit (yang akhirnya ternyata: disk full karena log rotation off).

Artikel ini adalah buku saku yang saya buat dari 3 tahun pengalaman deploy di Linux.

1. Navigasi Filesystem dengan Cepat

# Pindah direktori
cd /var/www/myapp

# Kembali ke direktori sebelumnya
cd -

# Stack direktori (push/pop)
pushd /tmp
pushd /var/log
popd   # kembali ke /tmp
popd   # kembali ke asal

# Breadcrumb history dengan bookmark
alias proj='cd /var/www/myapp'

# List isi direktori dengan detail
ls -lah                       # Hidden files, human-readable
ls -lah --sort=size          # Urutkan per size (descending)
ls -lah --sort=time          # Urutkan per modification time
ls -lt | head -10            # 10 file terbaru

2. Cari File dan Konten

# find dengan pattern
find /var -name "*.log" -type f -mtime +30
# Cari file .log yang umurnya lebih dari 30 hari

# Find dan eksekusi (kalau file size besar)
find /var/log -name "*.log" -size +100M -exec gzip {} \;

# grep dengan regex
# -r recursive, -n line number, -i case insensitive, -l filename only
grep -rni "error" /var/log/syslog

# cari pattern dengan context
grep -A 5 -B 5 "exception" app.log
# tampilkan 5 baris setelah dan sebelum match

# rg (ripgrep) — much faster dari grep
rg -A 3 "TODO" src/ --type ts

3. Monitoring Process & Resource

3.1. CPU dan Memory

# Top process berdasarkan CPU
top -o %CPU | head -20
# atau htop kalau terpasang

# Snapshot process: ps
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10

# Information memory
free -h
#               total   used   free   shared  buff/cache  available
# Mem:           8.0Gi   3.2Gi  1.5Gi  256Mi   3.3Gi        4.5Gi
# Swap:          4.0Gi   0.5Gi  3.5Gi

# Disk usage
df -h
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1       100G   67G   28G  71% /

du -sh /var/*    # ukuran tiap direktori (human-readable)
du -sh /var/log/*

3.2. Network

# Listening port
ss -tlnp        # TCP, listening, no-resolve, program
# State   Local Address:Port  Process
# LISTEN  0.0.0.0:80           nginx
# LISTEN  0.0.0.0:443          nginx
# LISTEN  127.0.0.1:3306       mysqld
# LISTEN  0.0.0.0:8080         node

# Koneksi aktif
ss -tnp state established

# Bandwidth monitoring
nethogs
curl -O- iftop

# Curl port connectivity
nc -zv google.com 443
# Connection to google.com 443 port [tcp/https] succeeded!

4. Text Processing Magic

4.1. tail, head: Lihat Log Real-time

# Tail log dengan auto-reload (live view)
tail -f /var/log/nginx/access.log

# Tail multi-file
tail -f /var/log/nginx/*.log

# Tail dengan filter real-time
tail -f /var/log/app.log | grep --line-buffered ERROR

# Lihat 1000 baris terakhir, lalu grep
tail -n 1000 /var/log/app.log | grep ERROR

4.2. awk, sed: Editing dan Filtering

# awk untuk kolom tertentu
ls -l | awk '{print $5, $9}'
# size  nama_file

# sed untuk replace teks
sed -i 's/old-domain.com/new-domain.com/g' /etc/nginx/conf.d/app.conf

# Extract field dari CSV/log format
cat access.log | awk -F'"' '{print $1, $6}' | head

4.3. jq untuk JSON

# Pretty print JSON
echo '{"name":"Donostia"}' | jq

# Extract field dari API response
curl -s https://api.github.com/users/Donostia12 | jq '.login, .public_repos'

# Filter array
cat packages.json | jq '.dependencies | keys[]'

5. SSH dan Remote Server

# SSH dengan key-based auth (setup)
ssh-keygen -t ed25519 -C "donostia@laptop"
ssh-copy-id user@server-ip

# ~/.ssh/config untuk shortcut
Host myserver
  HostName 192.168.1.100
  User deployer
  Port 22
  IdentityFile ~/.ssh/id_ed25519

# Sekarang tinggal: ssh myserver

# Tunneling: forward local port ke remote
ssh -L 3306:localhost:3306 myserver
# localhost:3306 sekarang adalah database di server

# Copy file via scp
scp file.tar.gz myserver:/tmp/
scp -r myserver:/var/backups ./backups/

# rsync untuk copy efisien (resume, exclude)
rsync -avz --exclude="node_modules" --exclude=".git" \
  ./ myserver:/var/www/myapp/

6. Systemd: Service Management

# Status
systemctl status nginx
systemctl is-active nginx
systemctl is-enabled nginx   # auto-start on boot?

# Control
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx   # Tanpa downtime!
sudo systemctl disable nginx

# Logs (journalctl)
journalctl -u nginx -f          # Tail follow
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -p err      # Hanya error priority
journalctl --vacuum-time=7d      # Bersihkan log lebih dari 7 hari

7. Docker Commands yang Wajib

# List containers
docker ps
docker ps -a       # Termasuk yang stopped

# Container exec: jalan juga jika container running
docker exec -it myapp sh

# Logs
docker logs -f myapp           # follow
docker logs --tail 100 myapp   # 100 baris terakhir

# Resource usage
docker stats                    # Live CPU/mem dari semua container

# Image management
docker images
docker rmi $(docker images -f "dangling=true" -q)   # Hapus image dangling

# Volume management
docker volume ls
docker system prune -af --volumes   # Cleanup ALL unused (warning!)

# Compose
docker-compose up -d
docker-compose logs -f --tail=50
docker-compose down -v       # Stop + remove volumes

8. Backup dan Restore

# Dump database
mysqldump -u root -p mydb | gzip > backup_$(date +%Y%m%d).sql.gz

# Backup dengan exclude pattern
tar --exclude='./node_modules' --exclude='./.git' \
    -czf backup.tar.gz ./

# Restore
mysql -u root -p mydb < backup.sql
gunzip -c backup.sql.gz | mysql -u root -p mydb

9. Cron: Penjadwalan

# Edit crontab user
crontab -e

# Format: menit jam hari bulan hari-week command
0 2 * * * /opt/backup.sh              # Setiap jam 2 pagi
*/15 * * * * /opt/healthcheck.sh     # Setiap 15 menit
0 0 1 * * /opt/cleanup.sh           # Tanggal 1 setiap bulan

# List semua cron
crontab -l

# Cron system-level
sudo cat /etc/crontab

10. Troubleshooting Cheat Sheet

Skenario: "Server tidak bisa diakses"

# Step 1: Cek koneksi SSH
ssh user@server-ip   # jalan?

# Step 2: Disk space?
df -h | head -3

# Step 3: CPU/Memory?
free -h
top -bn1 | head -5

# Step 4: Application service?
sudo systemctl status myapp

# Step 5: Logs
journalctl -u myapp --since "10 min ago" | tail -50

# Step 6: Port listening?
ss -tlnp | grep -E ':80|:443'

# Step 7: Network firewall
sudo ufw status
sudo iptables -L -n | head

Skenario: "Database connection refused"

# Cek process
ps aux | grep mysql

# Cek port
ss -tlnp | grep 3306

# Cek error log
tail -100 /var/log/mysql/error.log

# Restart service
sudo systemctl restart mysql

# Manual connect
mysql -u root -p -h 127.0.0.1

11. Performance Tuning Quick Wins

# Enable swap (kalau runtime OOM)
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile
sudo swapon /swapfile
# Tambahkan ke /etc/fstab untuk persistent
/swapfile none swap sw 0 0

# Disable transparent huge pages (Redis, DB performance)
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

# File descriptor limit
ulimit -n 65536
# Atau di /etc/security/limits.conf:
# * soft nofile 65536
# * hard nofile 65536

Kesimpulan

Skill Linux bukan opsional untuk fullstack developer yang deploy sendiri. Tapi juga bukan harus jadi sysadmin level expert. Mulai dari 10 command di atas, perlahan build muscle memory. Buat cheat sheet sendiri.

Berikutnya: pelajari docker, monitoring tools (Grafana, Uptime Kuma), dan IaC (Terraform, Ansible) untuk scale up DevOps skill.

I Nyoman Donostia

I Nyoman Donostia

Fullstack Developer - Bali, Indonesia

Artikel Terkait