Semua artikel

Cara Menghubungkan External Database ke Aplikasi di getlaunch.dev

Panduan menghubungkan aplikasi stateless ke database eksternal seperti Supabase, PlanetScale, dan Neon.


Kenapa External Database?

getlaunch.dev menggunakan arsitektur stateless — container tidak menyimpan data secara permanen. Ini artinya kamu perlu database eksternal untuk menyimpan data aplikasi.

Keuntungannya:

  • Data aman — Database dikelola oleh provider yang specialized
  • Backup otomatis — Sebagian besar managed database menyediakan backup otomatis
  • Scalable — Database dan aplikasi bisa di-scale secara independen
  • Biaya efisien — Banyak provider yang menawarkan free tier yang cukup untuk development dan project kecil

Opsi Database

PostgreSQL

Supabase (Rekomendasi)

Supabase menyediakan PostgreSQL dengan free tier yang generous:

  • 500MB database storage
  • 2 project gratis
  • REST API otomatis
  • Authentication built-in

Setup:

  1. Daftar di supabase.com
  2. Buat project baru
  3. Copy connection string dari Settings → Database → Connection string → URI
  4. Tambahkan sebagai environment variable di getlaunch.dev
DATABASE_URL=postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres

Contoh koneksi di Node.js:

const { Pool } = require("pg");

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: { rejectUnauthorized: false },
});

// Query
const result = await pool.query("SELECT * FROM users WHERE id = $1", [userId]);

Neon

Neon menyediakan PostgreSQL serverless:

  • 512MB storage gratis
  • Auto-suspend saat idle
  • Branching untuk development

Setup:

  1. Daftar di neon.tech
  2. Buat project dan database
  3. Copy connection string
  4. Tambahkan ke environment variables di getlaunch.dev
DATABASE_URL=postgresql://user:[email protected]/dbname?sslmode=require

MySQL

PlanetScale

PlanetScale menyediakan MySQL serverless:

  • 5GB storage di free tier
  • Database branching
  • Non-blocking schema changes

Setup:

  1. Daftar di planetscale.com
  2. Buat database
  3. Buat password di Settings → Passwords
  4. Copy connection string
DATABASE_URL=mysql://user:[email protected]/dbname?ssl={"rejectUnauthorized":true}

Contoh koneksi:

const mysql = require("mysql2/promise");

const connection = await mysql.createConnection(process.env.DATABASE_URL);
const [rows] = await connection.execute("SELECT * FROM products WHERE id = ?", [
  productId,
]);

MongoDB

MongoDB Atlas

MongoDB Atlas menyediakan MongoDB managed:

  • 512MB storage gratis
  • Cluster M0 free forever
  • Global distribution

Setup:

  1. Daftar di mongodb.com/atlas
  2. Buat cluster (pilih M0 Free Tier)
  3. Buat database user
  4. Whitelist IP: 0.0.0.0/0 (karena IP container bisa berubah)
  5. Copy connection string
MONGODB_URI=mongodb+srv://user:[email protected]/mydb?retryWrites=true&w=majority

Contoh koneksi:

const { MongoClient } = require("mongodb");

const client = new MongoClient(process.env.MONGODB_URI);
await client.connect();

const db = client.db("mydb");
const users = await db.collection("users").find({}).toArray();

Best Practices

1. Gunakan Connection Pooling

Jangan buat koneksi baru untuk setiap request. Gunakan connection pool:

// ✅ Buat pool sekali, gunakan berkali-kali
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  max: 10, // Maksimal 10 koneksi
  idleTimeoutMillis: 30000,
});

app.get("/users", async (req, res) => {
  const client = await pool.connect();
  try {
    const result = await client.query("SELECT * FROM users");
    res.json(result.rows);
  } finally {
    client.release();
  }
});

2. Simpan Connection String di Environment Variable

Jangan pernah hardcode credentials:

// ❌ JANGAN
const pool = new Pool({
  host: "db.example.com",
  password: "supersecret123",
});

// ✅ GUNAKAN environment variable
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

Di getlaunch.dev, tambahkan DATABASE_URL di halaman project settings sebelum deploy.

3. Gunakan SSL

Selalu aktifkan SSL untuk koneksi database:

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: { rejectUnauthorized: false },
});

4. Handle Connection Errors

pool.on("error", (err) => {
  console.error("Database pool error:", err);
});

// Retry logic untuk koneksi awal
async function connectWithRetry(maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      await pool.query("SELECT 1");
      console.log("Database connected");
      return;
    } catch (err) {
      console.error(`Connection attempt ${i + 1} failed:`, err.message);
      if (i < maxRetries - 1) await new Promise((r) => setTimeout(r, 2000));
    }
  }
  throw new Error("Failed to connect to database");
}

5. Whitelist IP yang Tepat

Karena container di getlaunch.dev bisa mendapat IP yang berbeda setiap deploy, whitelist 0.0.0.0/0 di database provider kamu (atau gunakan connection string yang sudah include SSL authentication).


Langkah Deploy di getlaunch.dev

  1. Setup database di provider pilihan kamu
  2. Buat skema/tabel yang dibutuhkan (bisa dari dashboard provider atau migration script)
  3. Tambahkan environment variable DATABASE_URL di project settings getlaunch.dev
  4. Deploy aplikasi — aplikasi akan otomatis terkoneksi ke database eksternal
  5. Monitor di dashboard getlaunch.dev melalui runtime logs

getlaunch.dev membuat proses ini seamless — kamu fokus ke code, platform handle infrastructure.


Baca Juga