Semua artikel

Kesalahan Umum Deployment dan Cara Mengatasinya

Daftar kesalahan yang sering terjadi saat deployment beserta solusi praktisnya di getlaunch.dev.


Kenapa Deployment Gagal?

Deployment yang gagal bisa membuat frustasi, terutama saat deadline mendekat. Berita baiknya, sebagian besar kegagalan disebabkan oleh masalah yang sama dan mudah diperbaiki.

Di getlaunch.dev, kamu bisa melihat deployment logs secara real-time untuk membantu debugging. Berikut daftar kesalahan paling umum dan cara mengatasinya.


1. Port yang Salah atau Tidak Dikonfigurasi

Masalah: Aplikasi berjalan tapi tidak bisa diakses dari luar.

Penyebab: Port yang didefinisikan di project tidak sesuai dengan port yang di-listen oleh aplikasi.

Solusi:

// ✅ Gunakan port yang konsisten
const PORT = 3000;
app.listen(PORT, "0.0.0.0", () => {
  console.log(`Server running on port ${PORT}`);
});

Pastikan port di konfigurasi project getlaunch.dev sesuai dengan port yang digunakan di code dan di-expose di Dockerfile:

EXPOSE 3000

Tips dari getlaunch.dev: Saat membuat project baru, pastikan field Port diisi sesuai dengan port yang digunakan oleh aplikasi kamu. Platform membutuhkan informasi ini untuk mengarahkan traffic ke container.


2. Dockerfile Tidak Ditemukan

Masalah: Build gagal dengan error "Dockerfile not found".

Penyebab: Dockerfile tidak ditemukan di path yang dikonfigurasi, atau nama file salah.

Solusi:

  • Pastikan file bernama Dockerfile (huruf besar D, tanpa ekstensi)
  • Pastikan path Dockerfile yang diset di konfigurasi project getlaunch.dev sesuai dengan lokasi file di repository
  • Commit dan push ke branch yang benar
# Cek apakah Dockerfile ada
ls -la Dockerfile

# Jika belum ada, buat
touch Dockerfile

3. Menyimpan Data di Filesystem Lokal

Masalah: Data hilang setelah container restart atau re-deploy.

Penyebab: Menulis file ke filesystem container yang bersifat ephemeral.

Solusi: Gunakan external service untuk semua data yang perlu persisten:

// ❌ JANGAN: Simpan di filesystem lokal
fs.writeFileSync("/app/data/users.json", JSON.stringify(users));

// ✅ GUNAKAN: External database
await db.query("INSERT INTO users (name, email) VALUES ($1, $2)", [
  name,
  email,
]);

Kenapa getlaunch.dev menggunakan arsitektur stateless? Karena ini memungkinkan scale to zero — kamu hanya bayar saat ada request. Baca lebih lanjut di Arsitektur Stateless.


4. Dependency yang Tidak Ter-install

Masalah: Build berhasil tapi aplikasi crash saat start dengan "Module not found".

Penyebab: package.json tidak lengkap atau ada dependency yang hanya di-install secara global.

Solusi:

# Pastikan semua dependency ter-install
COPY package*.json ./
RUN npm ci

# JANGAN gunakan npm install tanpa lock file
# npm ci lebih cepat dan lebih reliable

Pastikan semua dependency yang digunakan ada di package.json:

# Cek apakah ada import yang tidak ada di package.json
npm ls

5. Environment Variables yang Belum Di-set

Masalah: Aplikasi crash dengan error seperti "Cannot read property of undefined" atau koneksi database gagal.

Penyebab: Environment variables belum dikonfigurasi di platform.

Solusi:

Di getlaunch.dev, tambahkan environment variables di halaman project settings:

  • DATABASE_URL — Connection string database
  • API_KEY — API key untuk external service
  • NODE_ENV — Set ke production
// Validasi environment variables saat startup
const required = ["DATABASE_URL", "API_KEY"];
for (const key of required) {
  if (!process.env[key]) {
    console.error(`Missing required env var: ${key}`);
    process.exit(1);
  }
}

Tips: Jangan pernah commit file .env ke repository. Gunakan fitur environment variables di dashboard getlaunch.dev.


6. Build Timeout

Masalah: Build berhenti di tengah jalan karena timeout.

Penyebab: Build process terlalu lama, biasanya karena dependency yang besar atau build step yang tidak optimal.

Solusi:

# ✅ Gunakan multi-stage build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]
# ✅ Gunakan .dockerignore
node_modules
.git
.env
*.md
tests

7. Health Check Gagal

Masalah: Container ter-deploy tapi terus restart.

Penyebab: Aplikasi tidak merespons health check dari platform.

Solusi:

// Tambahkan health check endpoint
app.get("/health", (req, res) => {
  res.status(200).json({ status: "ok", timestamp: new Date().toISOString() });
});

Pastikan aplikasi sudah siap menerima request saat container start. Jika ada proses inisialisasi yang lama, pastikan health check tetap merespons:

let isReady = false;

// Inisialisasi async
async function init() {
  await connectToDatabase();
  await loadCache();
  isReady = true;
}

app.get("/health", (req, res) => {
  if (isReady) {
    res.status(200).json({ status: "ok" });
  } else {
    res.status(503).json({ status: "initializing" });
  }
});

init();

8. Image Docker Tidak Ditemukan

Masalah: Deploy dari Docker image gagal dengan error "image not found".

Penyebab: Image name salah atau image bersifat private.

Solusi:

  • Pastikan image name lengkap dengan registry dan tag: ghcr.io/user/app:v1.0
  • Pastikan image bersifat public — getlaunch.dev saat ini hanya mendukung public images
  • Coba pull image secara lokal untuk memastikan: docker pull <image-name>

Debugging di getlaunch.dev

Deployment Logs

Setiap deployment memiliki log yang bisa dilihat secara real-time di dashboard. Log ini menampilkan output dari proses build dan startup.

Runtime Logs

Setelah deployment berhasil, kamu bisa melihat runtime logs untuk melihat output dari aplikasi yang berjalan, termasuk error dan console.log.

Request ID

Jika kamu mengalami error, setiap error response dari API getlaunch.dev menyertakan Request ID unik. Salin ID ini dan kirimkan ke support untuk debugging yang lebih cepat.


Baca Juga