$ aoox

DocsAplikasi

Scheduled jobs

Menjalankan perintah terjadwal (cron) atau manual di konteks aplikasi, managed database, atau stack compose — migrasi, pembersihan, laporan.

Lingkup
Aplikasi, database, stack compose
Target
Di container · Container terpisah
Riwayat
50 run terakhir, output 64 KB

Tiga pemilik job

PemilikDi manaDi containerContainer terpisah
AplikasiTab Jobs aplikasiexec di container aplikasiImage aplikasi saat ini + env & mount aplikasi
Managed databaseTab Jobs databaseexec di container databaseImage engine (psql/mysql/redis-cli tersedia) dengan env DB_HOST DB_PORT DB_USER DB_PASSWORD DB_NAME — sama seperti resep backup
Stack composeTab Jobs stackexec di container Service yang dipilihImage & env service itu
Contoh job database (Container terpisah, PostgreSQL)
psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -c "VACUUM ANALYZE"

Dua target eksekusi

TargetCara jalanKonsekuensi
Di containerdocker exec di container aplikasi yang sedang running.Berbagi CPU/RAM dengan aplikasi. Gagal bila aplikasi stopped.
Container terpisahContainer sekali-jalan dari image saat ini dengan env, mount, dan batas sumber daya yang sama; dihapus setelah selesai.Terisolasi. Tidak terlihat oleh monitoring/notifikasi container mati.
Butuh state proses yang sedang jalan (cache di memori, sinyal)?→ Di container
Berat, lama, atau tidak boleh mengganggu proses utama (migrasi, batch)?→ Container terpisah
Aplikasi sedang stopped tapi job tetap harus jalan?→ Container terpisah

Membuat job

  1. Buka tab Jobs → Job baru

    FieldKeterangan
    NamaLabel job.
    Jadwal (cron)5 field, mis. 0 3 * * *. Kosongkan untuk job manual saja. Divalidasi saat simpan (400 bila salah).
    PerintahDijalankan lewat sh -c — boleh pipe, &&, dan tanda kutip.
    TargetDi container / Container terpisah.
    Timeout (detik)Default 600. Ditegakkan di dalam container.
  2. Jalankan manual untuk mencoba

    Klik Jalankan. Riwayat run muncul saat baris job dibuka: status, exit code, durasi, dan output. Halaman menyegarkan tiap 2 detik selama ada run yang berjalan.

  3. Aktifkan jadwal

    Toggle aktif di baris job. Jadwal didaftarkan langsung tanpa restart API; zona waktu mengikuti container API (UTC di image distribusi).

Contoh job

JobCronPerintahTarget
Migrasi DB setelah deploy(manual)npm run migrateContainer terpisah
Bersihkan file sementara0 3 * * *find /app/tmp -mtime +7 -deleteDi container
Laporan harian0 7 * * 1-5node scripts/report.jsContainer terpisah
Warm cache tiap 15 menit*/15 * * * *curl -fsS http://127.0.0.1:3000/warmDi container
Cron 5 field
┌─ menit (0-59)
│ ┌─ jam (0-23)
│ │ ┌─ tanggal (1-31)
│ │ │ ┌─ bulan (1-12)
│ │ │ │ ┌─ hari (0-6, 0 = Minggu)
* * * * *

*/15 * * * *   tiap 15 menit
0 3 * * *      tiap hari 03:00
0 0 * * 0      tiap Minggu 00:00

Perilaku

  • Tick cron dilewati (tidak antre) bila run sebelumnya masih berjalan. Menjalankan manual saat masih ada run aktif → 409.
  • Status run: success (exit 0) / failed (exit ≠ 0) / timeout. Gagal atau timeout mengirim notifikasi jobFailure bila diaktifkan.
  • Output stdout+stderr disimpan sampai 64 KB per run; 50 run terakhir per job. UI menampilkan 20 terakhir.
  • Deploy baru tidak menghentikan run yang sedang berjalan di Container terpisah; run Di container ikut mati bersama container lama.
  • Untuk aplikasi mode service (Swarm), target Di container menjalankan exec di task yang ada di host — Engine API tidak bisa exec ke task di node lain.

Cara kerja timeout

Timeout ditegakkan di dalam container lewat perintah timeout (bila ada di image), karena exec tidak bisa dibunuh dari luar. API baru menyerah menunggu setelah timeout + 30 detik.

Image tanpa timeout (mis. distroless) tidak bisa membatasi durasi: run dianggap timeout hanya setelah API berhenti menunggu, sementara perintah mungkin masih berjalan. Sertakan coreutils atau busybox di image bila job berpotensi lama.

Jebakan umum

GejalaPenyebab & solusi
Run gagal: container not runningTarget Di container tapi aplikasi stopped. Pakai Container terpisah atau start aplikasinya.
command not foundImage tidak punya binary itu (mis. curl di alpine minimal). Pakai wget, atau tambahkan ke Dockerfile.
Jadwal tidak jalan pada jam yang diharapkanZona waktu API = UTC. Geser jam di cron (WIB = UTC+7).
Job tetap failed padahal perintah suksesExit code terakhir ≠ 0 — mis. grep tanpa hasil. Akhiri dengan || true bila memang tidak masalah.
Belum tersedia
Streaming output saat run berjalan; riwayat lebih dari 20 di UI.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitLab ↗