NEWAuto-scale sesuai traffic
Bonus 25%!0h
Detail
troubleshootingcontainer crashrestart loopOOMdebugging

Container Crash Loop: Kenapa Pod Terus Restart dan Cara Mengatasinya

Tim Helipod

5 menit baca

Pod di Helipod terus restart? Biasanya karena OOM (Out of Memory), error saat startup, atau konfigurasi yang salah. Berikut cara debugging dan mengatasinya.

Melihat pod terus restart di dashboard bisa menjengkelkan. Container start, crash, restart, crash lagi — loop tanpa akhir.

Artikel ini menjelaskan kenapa container crash dan cara mengatasinya.

Kenapa Container Crash?

Container crash biasanya terjadi karena salah satu dari ini:

  1. OOM (Out of Memory) — aplikasi memakan lebih banyak RAM dari yang diizinkan
  2. Error saat startup — aplikasi crash sebelum bisa melayani request
  3. Health check gagal — aplikasi tidak merespons health check
  4. Signal handling — aplikasi tidak handle SIGTERM dengan benar

1. OOM (Out of Memory)

Gejala:

  • Container restart setelah beberapa detik/menit
  • Logs menunjukkan Killed atau OOMKilled
  • Memory usage mendekati limit

Penyebab: Aplikasi memakan lebih banyak RAM dari yang diizinkan. Ini paling sering terjadi pada:

  • Aplikasi Node.js dengan memory leak
  • Process yang memuat banyak data ke memory
  • Image processing / video processing
  • Database queries yang mengembalikan terlalu banyak data

Solusi:

Option 1: Tambah RAM

Helipod Dashboard → pilih pod → Settings → Resource
Atur RAM lebih tinggi (misal: dari 512MB ke 1GB)

Option 2: Optimasi Memory

// ❌ Memory leak — object terus bertambah
const cache = {};
app.get('/api/data', (req, res) => {
  cache[req.url] = fetchData(); // Tidak pernah di-cleanup
  res.json(cache[req.url]);
});

// ✅ Gunakan LRU cache dengan limit
const LRU = require('lru-cache');
const cache = new LRU({ max: 500 }); // Maks 500 items

Option 3: Set Memory Limit di Node.js

# Batasi memory Node.js
CMD ["node", "--max-old-space-size=384", "server.js"]

2. Error saat Startup

Gejala:

  • Container restart dalam hitungan detik
  • Logs menunjukkan error message
  • Aplikasi tidak pernah berhasil start

Penyebab:

  • Dependency belum terinstall
  • Environment variable belum diatur
  • Config file tidak ada
  • Port sudah dipakai

Solusi:

Cek Logs

Helipod Dashboard → pilih pod → tab Logs

Cari error pertama yang muncul — itu biasanya root cause.

Common Startup Errors

Error Penyebab Solusi
MODULE_NOT_FOUND Dependency belum install Pastikan npm install di build step
EADDRINUSE Port sudah dipakai Ganti port atau stop process lain
ENOENT File tidak ditemukan Pastikan file ada di repo
ECONNREFUSED Database tidak bisa diakses Cek DATABASE_URL
SyntaxError Error di code Fix code lalu deploy ulang

3. Health Check Gagal

Gejala:

  • Container start, tapi restart setelah beberapa saat
  • Tidak ada error di logs
  • Aplikasi bisa diakses sesekali

Penyebab: Helipod melakukan health check untuk memastikan aplikasi sehat. Jika health check gagal berulang kali, container di-restart.

Solusi:

// Pastikan health check endpoint merespons
app.get('/health', (req, res) => {
  res.json({ status: 'ok' });
});
# FastAPI
@app.get("/health")
async def health():
    return {"status": "ok"}
// Laravel
Route::get('/health', fn() => response()->json(['status' => 'ok']));

4. Signal Handling

Gejala:

  • Container restart saat deploy atau scaling
  • Logs menunjukkan SIGTERM atau SIGKILL
  • Request yang sedang diproses terputus

Penyebab: Aplikasi tidak handle SIGTERM (shutdown signal) dengan benar. Kubernetes mengirim SIGTERM sebelum SIGKILL — aplikasi harus graceful shutdown.

Solusi:

// Node.js — handle SIGTERM
process.on('SIGTERM', () => {
  console.log('SIGTERM received, shutting down gracefully');
  server.close(() => {
    process.exit(0);
  });
});
# Python — handle SIGTERM
import signal
import sys

def shutdown_handler(signum, frame):
    print('SIGTERM received, shutting down gracefully')
    sys.exit(0)

signal.signal(signal.SIGTERM, shutdown_handler)

Cara Melihat Apa yang Terjadi

1. Cek Restarts

Helipod Dashboard → pilih pod → tab Overview
Lihat "Restarts" — jika tinggi, ada masalah

2. Cek Logs

Helipod Dashboard → pilih pod → tab Logs
Filter: errors only

3. Cek Metrics

Helipod Dashboard → pilih pod → tab Metrics
Lihat memory usage — jika mendekati limit, OOM

4. Cek Deployments

Helipod Dashboard → pilih pod → tab Deployments
Lihat build status — apakah build berhasil?

Checklist Debugging

  • Cek logs untuk error messages
  • Cek memory usage (apakah OOM?)
  • Cek environment variables sudah lengkap
  • Cek port configuration (0.0.0.0, EXPOSE)
  • Cek database connection
  • Cek health check endpoint
  • Cek graceful shutdown handling

Quick Fix

OOM → Tambah RAM

Dashboard → Settings → Resource → naikkan RAM

Startup Error → Fix Code

Fix error → push → deploy ulang

Health Check → Tambah Endpoint

app.get('/health', (req, res) => res.json({ status: 'ok' }));

Signal Handling → Add Handler

process.on('SIGTERM', () => process.exit(0));

Masih Crash?

Jika container masih crash setelah fix semua di atas:

  1. Screenshot logs — kirim ke support
  2. Sertakan:
    • Framework yang digunakan
    • Resource allocation (CPU/RAM)
    • Error message dari logs
    • Kapan mulai crash (baru deploy atau tiba-tiba)

Email ke support@helipod.id atau gabung ke hangar.helipod.io.

Kesimpulan

Container crash loop hampir selalu punya solusi. Dengan memahami penyebabnya (OOM, startup error, health check, signal handling), kamu bisa fix masalah dalam hitungan menit.

Mulai deploy di helipod.io — tidak perlu kartu kredit.

Punya pertanyaan? Hubungi kami di support@helipod.id atau bergabung ke komunitas di hangar.helipod.io.

Siap coba Helipod?

Deploy aplikasi kamu sekarang. Gratis, tanpa kartu kredit.

Mulai Gratis →