Her Yeni Sunucuda Tekrar Kullandığım Bash Script'leri
Devraldığım her sunucuya, yeni bir VPS olsun ya da bir müşterinin yıllardır çalıştırdığı bir kutu olsun, aynı küçük script seti /usr/local/bin'e gidiyor. Hiçbiri akıllıca değil. Beş dakikada yazıp unutulacak türden şeyler, ama ben yıllardır aynılarını hafif güncellemelerle taşıyorum, çünkü kendilerini sürekli geri ödüyorlar.
1. "Bu sunucu nasıl görünüyor" snapshot'ı
Yeni ya da tanımadığım herhangi bir sunucuda, ilk çalıştırdığım şey hızlı bir snapshot script'i. Disk kullanımını, memory'i, load average'ı, memory'e göre en üstteki process'leri ve bir network portunu dinleyen her şeyi yazdırıyor:
#!/bin/bash
# server-snapshot.sh
echo "== Uptime & Load =="
uptime
echo -e "\n== Disk Usage =="
df -hT --total | grep -E '^(Total|/dev)'
echo -e "\n== Memory =="
free -h
echo -e "\n== Top 5 Memory Consumers =="
ps aux --sort=-%mem | head -6
echo -e "\n== Listening Ports =="
ss -tulpn | grep LISTEN
Bunları elle de yazabilirsiniz, ama tam olarak hatırlamadığınız bir sunucuya her girişte beş ayrı komut yazmak, gözden kaçırmanın tam da yolu. Bir script, bir bakış, ve herhangi bir şeye dokunmadan önce kutunun mental modeli kafamda oluşuyor.
2. Disk'i asıl ne yiyor
"Disk full" aldığım en yaygın alarmlardan biri, ve sebebi neredeyse hiçbir zaman insanların beklediği yerde değil. Bu script root'tan aşağı iniyor, boyuta göre sıralıyor, ve sizi binlerce satırın altına gömmesin diye mantıklı bir derinlikte duruyor:
#!/bin/bash
# disk-hogs.sh
du -ahx --max-depth="${1:-3}" / 2>/dev/null | sort -rh | head -25
Argümansız çalıştırınca üç seviye derine bakıyor. Bir sayı verirseniz daha derine gidiyor. On seferin dokuzunda cevap log'lar, birinin unuttuğu eski bir backup, ya da sunucuya bir şekilde sızmış bir node_modules klasörü oluyor.
3. Dashboard'suz sertifika süresi kontrolü
Her site bir monitoring stack'inin arkasında değil, özellikle daha küçük müşteri kurulumlarında. Bunlar için, bir domain listesi üzerinde hızlı bir loop, her sertifikada kaç gün kaldığını söylüyor:
#!/bin/bash
# cert-check.sh
while read -r domain; do
expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain:443" 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
days=$(( ($(date -d "$expiry" +%s) - $(date +%s)) / 86400 ))
printf "%-35s %s days\n" "$domain" "$days"
done < domains.txt
Her müşteri için satır başına bir hostname olan bir domains.txt tutuyorum ve bunu aylık çalıştırıyorum. Let's Encrypt genelde renewal'ları otomatik hallettiği için, bu script'in asıl işi renewal'ın sessizce başarısız olduğu durumları yakalamak.
4. Log ve journal şişkinliğini temizleme
systemd'nin journal'ı ve uygulama log'ları, aylar içinde sessizce bir disk'i doldurmanın bir yolunu buluyor. Bir "mystery" disk kullanım sorununun avına çıkmadan önce şunu çalıştırıyorum:
#!/bin/bash
# log-cleanup.sh
journalctl --vacuum-time=2weeks
find /var/log -name "*.gz" -mtime +30 -delete
find /var/log -name "*.log.*" -mtime +30 -delete
İki haftalık journal ve 30 günlük rotate edilmiş log'lar bilerek tutucu, ama neredeyse her debugging session'ı için fazlasıyla yeterli, ve disk'in dolmaya doğru sürünmesini engelliyor.
Hepsini bir yerde tutmak
Bunların hepsi, yönettiğim her sunucuya clone'ladığım küçük bir git repo'sunda yaşıyor:
git clone https://github.com/yourname/server-toolkit /opt/toolkit
ln -s /opt/toolkit/*.sh /usr/local/bin/
Asıl konu script'lerin kendisi değil. Asıl konu, aylardır login olmadığım bir sunucuda gece 11'de bir şey ters göründüğünde, boş bir terminalden başlamıyor olmam. Her zaman çalıştırdığım komutları çalıştırıyorum, ve bu aşinalık tek tek hepsinden daha değerli.