📑 Daftar Isi
- Kenapa Automasi Screenshot Server Itu Penting Banget?
- Persiapan: Alat yang Kamu Butuhkan
- Langkah 1: Siapkan Environment
- Langkah 2: Buat Script Screenshot Pertamamu
- Langkah 3: Test Manual Sebelum Otomatis
- Langkah 4: Jadwalkan Otomatis dengan Cron Job
- Langkah 5: Kelola File dan Rotasi Otomatis
- Bonus: Kirim Screenshot Otomatis ke Email atau Slack
- Troubleshooting: Masalah yang Sering Muncul
- Pro Tips dari Pengalaman Lapangan
- Pertanyaan yang Sering Ditanyakan
Gila sih, kemarin aku baru nyelesaiin satu pekerjaan yang selama berbulan-bulan bikin report monitoring kami keliatan jadul banget. Bayangin: tiap pagi ada orang yang harus buka browser manual, buka dashboard monitoring, screenshot satu-satu, crop, terus paste ke laporan. Berjam-jam kerja yang sebenernya bisa dipangkas jadi nol menit, dan ternyata automasi screenshot server dengan script itu semudah ini. Nah, sekarang semua jalan otomatis dan aku wajib share nih, biar kalian gak ngalamin fase ribet yang sama.
Serius, ini bukan trik gimmick. Ini workflow yang kami pakai beneran buat ngambil screenshot server tiap 30 menit, dan hasilnya langsung kepake buat bukti insiden, report bulanan, sampai bahan audit. Sumpah, sekali kamu ngerasain workflow ini, kamu gak bakal mau balik ke cara manual. Lanjut baca ya, ada 5 langkah yang gampang diikutin dari awal sampai akhir.
Kenapa Automasi Screenshot Server Itu Penting Banget?
Sebelum masuk ke script-nya, kita ngobrol dulu kenapa ini worth it. Masalah utamanya gini: screenshot server itu bukan cuma buat hiasan report. Di lingkungan NOC, screenshot dashboard monitoring jadi bukti visual yang bisa dipakai buat nunjukin kondisi server di jam tertentu, siapa yang salah duluan, dan kapan insiden mulai muncul. Tanpa bukti kayak gini, diskusi sama client bisa jadi debat panjang soal “server kami kok down?” padahal server udah normal balik dari tadi. Buat kamu yang baru mulai di dunia monitoring, cek dulu panduan setup monitoring Grafana dan Prometheus ini buat fondasi yang bener.
Nah, kalau masih cara manual, ada tiga masalah klasik yang hampir selalu muncul. Pertama, manusia itu lupa. Selalu ada aja pagi di mana screenshot kelupaan, apalagi kalau lagi banjir ticket. Kedua, waktu. Sekali buka dashboard terus screenshot lima server, udah 20 menit kelewat. Kalau tiap hari, itu 10 jam sebulan cuma buat screenshot doang. Ketiga, konsistensi. Manual itu format-nya beda-beda, jamnya beda, kadang keburu ke-refresh halamannya sebelum sempet difoto. Automasi ngilangin semua masalah ini.
Dan dampak dari report yang gak konsisten itu lumayan kerasa, lho. Di production environment, ketika insiden terjadi dan client nanya “kenapa gak ada bukti monitoring-nya?”, itu momen yang gak enak banget. Sebaliknya, kalau kamu bisa nunjukin screenshot yang jelas dengan timestamp yang bener, diskusi langsung kelar. Automasi screenshot server juga ngasih jejak yang objektif, bukan hasil ingatan manusia. Jadi kalau kamu handle server production, atau cuma pengen report yang rapi, workflow ini wajib kamu punya.

Persiapan: Alat yang Kamu Butuhkan
Oke, kita mulai ya. Buat automasi screenshot server dengan script, kamu butuh tiga komponen: Python, browser headless, dan library yang namanya Playwright. Playwright ini kayak supir pribadi buat browser, dia bisa buka halaman, nunggu render, terus ambil screenshot persis kayak yang manusia lakuin, tapi semua dari script. Gampang banget dipake.
Spesifikasi yang aku pakai di artikel ini: Ubuntu 22.04 LTS, Python 3.10, dan Chromium lewat Playwright. Tapi tenang, cara ini juga jalan di Debian dan distro lain yang sejenis. Server dengan RAM 1GB pun masih sanggup, asal jangan screenshot banyak dashboard sekaligus barengan.
Langkah 1: Siapkan Environment
Langkah pertama ini simpel, tapi jangan dilewatin. Buka terminal, terus jalanin perintah di bawah ini satu per satu.
sudo apt update
sudo apt install -y python3 python3-pip chromium
pip3 install --user playwright
python3 -m playwright install chromium
Kalau muncul error soal dependency sistem pas install chromium-nya, jalanin ini buat narik library sistem yang dibutuhin browser:
python3 -m playwright install-deps
Perhatiin nih: kenapa aku pakai dua baris install chromium? Yang pertama via apt biar ada binary-nya di sistem, yang kedua via playwright biar browser-nya match sama versi yang didukung library-nya. Ini penting biar gak muncul error versi mismatch di tengah jalan. Kalau udah kelar, cek dulu versi Python dan playwright-nya biar yakin terpasang bener.
Langkah 2: Buat Script Screenshot Pertamamu
Ini inti-nya. Script di bawah ini bakal buka beberapa URL, nunggu halamannya selesai render, terus nyimpen screenshot dengan nama file yang ada timestamp-nya. Bikin file baru di /opt/shots/shooter.py, terus paste script ini.
from playwright.sync_api import sync_playwright
from datetime import datetime
import os
OUTPUT_DIR = "/opt/shots"
URLS = [
("web-prod-1", "https://status.client-a.com/dashboard"),
("db-master", "https://monitor.client-a.com/d/overview"),
]
def capture(name, url):
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
path = os.path.join(OUTPUT_DIR, name + "_" + ts + ".png")
with sync_playwright() as p:
browser = p.chromium.launch(args=["--no-sandbox"])
page = browser.new_page(viewport={"width": 1280, "height": 720})
page.goto(url, wait_until="networkidle", timeout=45000)
page.wait_for_timeout(3000)
page.screenshot(path=path, full_page=False)
browser.close()
print("OK: " + path)
os.makedirs(OUTPUT_DIR, exist_ok=True)
for name, url in URLS:
capture(name, url)
Catatan kecil soal –no-sandbox: flag ini aku tambahin biar browser bisa jalan pas script-nya dipanggil sebagai root, yang biasanya terjadi di cron. Kalau server kamu pake user biasa yang non-root, kamu bisa coba tanpa flag ini dulu. Terus, viewport 1280×720 itu standar buat dashboard; kalau butuh resolusi lebih gede, tinggal ganti aja angkanya.
Langkah 3: Test Manual Sebelum Otomatis
Jangan pernah langsung masuk ke cron sebelum kamu jalanin manual dulu. Ini bukan saran, ini wajib. Jalanin script-nya langsung:
python3 /opt/shots/shooter.py
Kalau semua normal, kamu bakal lihat output kayak gini:
OK: /opt/shots/web-prod-1_20260803_083001.png
OK: /opt/shots/db-master_20260803_083015.png
Lha, kok iso cuma dua baris doang? Ya karena memang cuma dua URL yang kita isi. Kalau mau lebih, tambahin aja di list URLS. Yang penting, cek file-nya beneran kebentuk dan isinya bukan layar hitam. Buka satu screenshot-nya, pastiin dashboard-nya kebaca jelas. Kalau masih hitam atau kacau, jangan lanjut ke step berikutnya dulu, kita fix nanti di bagian troubleshooting.
Langkah 4: Jadwalkan Otomatis dengan Cron Job
Nah, ini dia momen ajaib-nya. Setelah script-nya terbukti jalan manual, sekarang kita jadwalin biar jalan sendiri tiap 30 menit. Kalau cron job masih asing buat kamu, panduan setup cron job buat backup otomatis ini ngebahas dasar-dasarnya. Buka crontab:
crontab -e
Terus tambahin baris ini di paling bawah:
*/30 * * * * /usr/bin/python3 /opt/shots/shooter.py >> /var/log/shots.log 2>&1
Perhatiin detail kecil tapi krusial: aku pakai path lengkap /usr/bin/python3, bukan cuma python3. Ini karena environment cron itu beda sama environment terminal kamu, PATH-nya kosong, jadi kalau kamu nulis python3 aja, cron bakal bilang “command not found”. Redirect >> /var/log/shots.log 2>&1 juga penting biar semua output dan error kesimpen, jadi kalau ada apa-apa kamu bisa cek log-nya.
Terus piye cara mastiin jalan? Tunggu aja 30 menit pertama, atau biar cepet, ubah sementara jadi tiap menit buat uji coba:
* * * * * /usr/bin/python3 /opt/shots/shooter.py >> /var/log/shots.log 2>&1
Jalanin selama 2-3 menit, cek /var/log/shots.log dan folder output-nya. Kalau udah kebukti, kembalikan ke */30 dan move on. Oh ya, cek juga kalau ada dua crontab yang jalan (root vs user) biar gak dobel screenshot.
Langkah 5: Kelola File dan Rotasi Otomatis
Satu masalah baru muncul pas script udah jalan otomatis: file screenshot numpuk terus sampai disk penuh. Screenshot PNG itu bisa 200KB-2MB per file. Kalau tiap 30 menit buat 2 server, dalam sebulan bisa 5GB lebih. Gede, kan? Solusinya, rotasi file yang sudah berumur.
Simpan script cleanup di /opt/shots/rotate.sh:
#!/bin/bash
find /opt/shots -name "*.png" -type f -mtime +30 -delete
echo "Rotasi selesai: $(date)" >> /var/log/shots-rotate.log
Bikin executable terus jadwalin tiap hari jam 2 pagi:
chmod +x /opt/shots/rotate.sh
crontab -e
Di crontab tambahin:
0 2 * * * /opt/shots/rotate.sh
PERINGATAN KEAMANAN: Backup Sebelum Menjalankan Hapus File.
Sebelum kamu yakin menjalankan rotasi yang pakai -delete, pastikan dulu kamu udah: 1) Backup screenshot yang mungkin masih dibutuhin buat audit ke tempat lain, misal rsync ke backup server. 2) Verifikasi backup-nya sukses, cek isi foldernya. 3) Konfirmasi bahwa folder /opt/shots memang folder screenshot, bukan folder lain. Perintah hapus tanpa backup bisa menyebabkan data loss permanen, dan screenshot insiden itu kadang baru diminta berbulan-bulan kemudian.
Kalau masih ragu, jangan langsung delete. Pertama, verifikasi berapa banyak file yang akan kena:
find /opt/shots -name "*.png" -type f -mtime +30 | wc -l
Terus list beberapa file-nya buat mastiin yang bakal kena itu beneran screenshot lama:
find /opt/shots -name "*.png" -type f -mtime +30 -exec ls -la {} +
Baru setelah itu, kalau kamu yakin semua aman, jalankan rotasi-nya. Verifikasi setelahnya:
find /opt/shots -name "*.png" -type f | wc -l
Bonus: Kirim Screenshot Otomatis ke Email atau Slack
Ini level berikutnya yang bikin report kamu makin sip. Setelah screenshot keproduksi, kamu bisa kirim otomatis ke email tim atau ke channel Slack. Buat email, tinggal tambahin baris ini di akhir script Python tadi (pakai mailx yang udah dikonfigurasi):
import subprocess
subprocess.run(["mail", "-s", "Report Screenshot", "-a", path,
"noc@client-a.com"], check=True)
Buat Slack, kamu bisa pake webhook. Contohnya gini:
curl -s -X POST -H "Content-Type: application/json" \
-d '{"text":"Screenshot terbaru udah siap: https://report.client-a.com/shots"}' \
https://hooks.slack.com/services/T0000000/B0000000/XXXXXXX
Yah, cek webhook Slack-nya sesuai format yang dikasih admin workspace kamu. Dengan begini, tim langsung lihat notifikasi tiap setengah jam tanpa buka server. Cukup meyakinkan buat boss, percaya deh.
Troubleshooting: Masalah yang Sering Muncul
| Gejala | Kemungkinan Penyebab | Solusi |
|---|---|---|
| Screenshot hitam atau kosong | Halaman dashboard butuh login, atau belum selesai render | Tambahkan auth (storage state atau header token), perbesar wait_for_timeout |
| Script jalan manual tapi gak jalan di cron | PATH di environment cron beda | Pakai path lengkap, misal /usr/bin/python3, dan redirect ke log |
| Error “Missing X server or $DISPLAY” | Browser coba jalan dengan mode GUI | Pastikan pakai Chromium headless, atau install xvfb untuk fallback |
| RAM server naik terus | Browser gak pernah di-close | Pastikan browser.close() dipanggil dan pakai timeout |
| File screenshot ukurannya kegedean | Viewport terlalu besar atau full_page true | Set viewport standar, pakai format JPEG atau kurangi kualitas |
Pro Tips dari Pengalaman Lapangan
- Selalu pakai path absolut buat semua file di dalam script dan cron. Gak ada yang lebih bikin bingung selain script yang cuma jalan kalau dijalankan dari folder tertentu.
- Simpan log ke file terpisah dan pastikan log-nya ikut ke-rotate. Log yang membengkak juga bisa penuhin disk.
- Jangan screenshot tiap 1 menit. 5-30 menit udah lebih dari cukup buat report. Tiap menit cuma bikin disk cepet penuh dan server makin kerasa bebannya.
- Gunakan nama domain yang disensor atau environment staging buat uji coba. Jangan test di dashboard production kalau gak perlu.
- Kalau dashboard kamu pakai Grafana, banyak yang udah punya fitur screenshot otomatis sendiri, tapi script manual ini tetap berguna buat dashboard yang gak punya fitur itu.
- Kalau tiba-tiba load server naik padahal traffic normal, jangan asumsi dulu. Baca cara troubleshoot high load server ini buat ngebedain antara serangan, script bobrok, dan browser screenshot yang numpuk.
Pertanyaan yang Sering Ditanyakan
Q: Apakah script ini aman dipakai di production server?
Aman, asal kamu pakai browser headless yang gak butuh display, dan pastikan browser selalu di-close setelah selesai biar gak numpuk proses. Pakai user khusus kalau bisa, dan jangan lupa batasi folder output-nya biar disk gak penuh.
Q: Kenapa screenshot yang dihasilkan cron jadi kosong padahal jalan manual normal?
Paling sering karena dua hal: PATH di cron beda jadi script gak ketemu python3 atau browser, atau halaman dashboard butuh waktu lebih lama buat render. Solusinya: pakai full path dan tambah wait_for_timeout di script.
Q: Berapa lama sekali sebaiknya screenshot server diambil?
Buat report harian dan bukti insiden, interval 15-30 menit udah cukup. Kalau kamu butuh deteksi anomali real-time, itu bukan kerjaan screenshot, itu kerjaan monitoring metric yang proper kayak Grafana atau Prometheus.
Q: Bisa dipakai buat dashboard yang butuh login?
Bisa. Ada dua cara: simpan storage state dari sesi login yang udah jalan (method storage_state di Playwright), atau inject token/session cookie langsung ke halaman. Dua-duanya gampang dipasang.
Q: Apa bedanya pakai Chromium sistem vs Playwright?
Playwright nyediain kontrol yang lebih rapi kayak nunggu halaman render dan navigasi antar tab. Chromium sistem doang cuma bisa screenshot statis via command line. Buat dashboard modern yang render-nya dinamis, Playwright jauh lebih reliable.
Yuk langsung praktekin step di atas. Nek masih stuck di tengah jalan, cek log-nya dulu, /var/log/shots.log, terus bandingin sama gejala yang aku sebut di tabel troubleshooting. Oh iya, buat kamu yang mau alert real-time, sekalian cek cara monitor uptime server lewat bot Telegram ini. Gila sih, seneng banget rasanya pas semua udah jalan otomatis, laporan tinggal narik dari folder, tim gak ada yang harus bangun pagi cuma buat screenshot. Gas terus!