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:
- OOM (Out of Memory) — aplikasi memakan lebih banyak RAM dari yang diizinkan
- Error saat startup — aplikasi crash sebelum bisa melayani request
- Health check gagal — aplikasi tidak merespons health check
- Signal handling — aplikasi tidak handle SIGTERM dengan benar
1. OOM (Out of Memory)
Gejala:
- Container restart setelah beberapa detik/menit
- Logs menunjukkan
KilledatauOOMKilled - 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
SIGTERMatauSIGKILL - 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:
- Screenshot logs — kirim ke support
- 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.