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:
- Daftar di supabase.com
- Buat project baru
- Copy connection string dari Settings → Database → Connection string → URI
- 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:
- Daftar di neon.tech
- Buat project dan database
- Copy connection string
- 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:
- Daftar di planetscale.com
- Buat database
- Buat password di Settings → Passwords
- 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:
- Daftar di mongodb.com/atlas
- Buat cluster (pilih M0 Free Tier)
- Buat database user
- Whitelist IP: 0.0.0.0/0 (karena IP container bisa berubah)
- 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
- Setup database di provider pilihan kamu
- Buat skema/tabel yang dibutuhkan (bisa dari dashboard provider atau migration script)
- Tambahkan environment variable
DATABASE_URLdi project settings getlaunch.dev - Deploy aplikasi — aplikasi akan otomatis terkoneksi ke database eksternal
- Monitor di dashboard getlaunch.dev melalui runtime logs
getlaunch.dev membuat proses ini seamless — kamu fokus ke code, platform handle infrastructure.

