Konfigurasi, Logging & Siap Produksi

Konfigurasi lewat environment, health check, graceful shutdown, logging, dan gambaran deployment (pm2, Docker).

Part 23 dari 24 ± 40 menit Gratis

Dari laptop ke server

Aplikasi yang jalan di komputermu belum tentu siap produksi. Beberapa kebiasaan membedakannya: konfigurasi terpisah dari kode, log yang bisa dibaca mesin, pemeriksaan kesehatan, dan penutupan proses yang sopan.

Konfigurasi lewat environment (12-Factor)

Satu kode, banyak lingkungan (development, staging, production). Yang berbeda — port, URL database, kunci rahasia — dibaca dari variabel lingkungan, bukan ditulis di kode:

const config = {
  port: Number(process.env.PORT) || 3000,
  env: process.env.NODE_ENV || 'development',
  dbUrl: process.env.DATABASE_URL,
  tokenSecret: process.env.TOKEN_SECRET,
};

if (config.env === 'production' && !config.tokenSecret) {
  throw new Error('TOKEN_SECRET wajib diisi di production');   // gagal cepat saat start
}

Rahasia tidak pernah masuk Git. Simpan di .env lokal (di-ignore) dan di pengaturan platform deployment.

Health check

Layanan hosting, load balancer, dan Kubernetes perlu tahu apakah aplikasimu hidup. Sediakan endpoint ringan:

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

Graceful shutdown

Saat server di-deploy ulang atau di-stop, sistem mengirim sinyal SIGTERM. Matikan secara sopan: berhenti menerima koneksi baru, selesaikan permintaan yang sedang berjalan, tutup koneksi database, lalu keluar. Mematikan mendadak memutus permintaan pengguna di tengah jalan.

const server = app.listen(config.port, () => console.log('Server siap'));

process.on('SIGTERM', () => {
  console.log('Menerima SIGTERM, menutup server...');
  server.close(() => {
    console.log('Server ditutup');
    process.exit(0);
  });
});

Sinyal SIGINT adalah Ctrl+C; tangani keduanya.

Logging

  • Catat peristiwa penting: start, error, permintaan lambat, kegagalan login.
  • Level: error, warn, info, debug.
  • Di produksi, log terstruktur (JSON per baris) memudahkan pencarian: {"level":"info","msg":"login","userId":5,"ms":42}. Pustaka: pino, winston.
  • Tulis ke stdout; biarkan platform mengumpulkannya.
  • Jangan mencatat password, token, atau data pribadi.

Menjalankan terus-menerus

AlatFungsi
pm2Pengawas proses: restart otomatis, mode cluster, log
DockerMembungkus aplikasi + lingkungannya agar identik di mana pun
systemdPengawas proses bawaan Linux
Platform (Railway, Render, Fly.io, VPS)Hosting yang mengelola proses dan variabel lingkungan
# Dockerfile minimal
FROM node:24-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]

Daftar periksa produksi

  • ✅ NODE_ENV=production.
  • ✅ Rahasia di environment, bukan kode.
  • ✅ HTTPS (biasanya lewat reverse proxy: Nginx, Caddy, atau platform).
  • ✅ helmet, rate limit, CORS yang ketat.
  • ✅ Health check & graceful shutdown.
  • ✅ Log terstruktur & pemantauan error.
  • ✅ npm ci + package-lock.json untuk build yang dapat diulang.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X