Hari peluncuran bukan saat menemukan bahwa kata sandi masih tertanam di kode atau index utama belum dibuat. Kesalahan kecil yang luput sebelum go-live berubah menjadi insiden besar sesudahnya, ketika pengguna nyata sudah mengetuk pintu. Chapter ini merangkum seluruh persiapan Section ini menjadi satu daftar periksa yang bisa dijalankan berurutan, lengkap dengan cara memverifikasi tiap butirnya — sebagian langsung dari dalam mongosh.

Tabel Periksa Go-Live #

#ButirCara verifikasiRujukan
1Connection string dari environment variablePeriksa konfigurasi deployment; pastikan tidak ada string di repositoriChapter Application Connection
2Database user hak minimumPanel Database Access; jalankan connectionStatus (lihat bawah)Chapter Database Access
3IP access list tepatPanel Network Access; hanya IP/CIDR server aplikasi, tanpa 0.0.0.0/0Chapter Network Access
4TLS aktifConnection string Atlas sudah TLS bawaan; pastikan tidak ada ssl=falseChapter TLS dan Enkripsi
5Backup aktif dan restore terujiPanel cluster; jalankan satu kali restore ujiBagian akhir Chapter ini
6Monitoring dan alertHalaman Alerts; pastikan alert bawaan aktif dengan notifikasi tim—
7Index diterapkangetIndexes() dibandingkan dengan migration scriptBagian ini; Section Indexing
8Schema validator aktifgetCollectionInfos() menampilkan validatorSection Schema Validation
9Connection pool dan timeout disetelNilai maxPoolSize dan serverSelectionTimeoutMS sesuai kapasitasSection MongoDB dengan JavaScript
10Health check aplikasiEndpoint /healthz melakukan ping ke database—
11Load test ringanBeban puncak harian disimulasikan di stagingSection Performance dan Optimization
12Runbook tertulisDokumen “bila X terjadi, lakukan Y” tersedia dan diketahui timBagian ini

Urutan tabel sengaja mengikuti urutan ketergantungan: keamanan dan konektivitas (1–4) lebih dulu, ketahanan (5–6), lalu kesiapan data dan aplikasi (7–11), ditutup dokumentasi (12).

Memverifikasi Hak Akses Koneksi #

Butir paling penting dari daftar keamanan adalah memastikan koneksi aplikasi tidak membawa hak yang berlebihan. Perintah connectionStatus melaporkan identitas dan seluruh hak koneksi yang sedang berjalan:

js
printjson(db.runCommand({ connectionStatus: 1, showPrivileges: true }).authInfo)

Output yang Dihasilkan:

text
{
  authenticatedUsers: [],
  authenticatedUserRoles: [],
  authenticatedUserPrivileges: []
}

Pada server latihan kita ketiga daftar itu kosong karena autentikasi memang tidak diaktifkan. Pada cluster Atlas, authenticatedUsers berisi nama user (misalnya app-tokobuku), authenticatedUserRoles berisi role beserta cakupannya, dan authenticatedUserPrivileges merinci aksinya. Saat meninjaunya, bandingkan dengan kebutuhan aplikasi: bila aplikasi hanya membaca-menulis collection tokobuku, role readWrite@tokobuku pada app-tokobuku adalah jawaban yang benar — lebih luas dari itu berarti kembali ke Chapter Database Access.

Memverifikasi Index dan Validator #

Dua butir data bisa diverifikasi dalam satu sesi singkat. Kita siapkan collection uji menyerupai kondisi produksi:

js
use latihan_golive

Output yang Dihasilkan:

text
switched to db latihan_golive
js
db.pesanan.insertOne({ pelanggan: "[email protected]", total: 150000, status: "baru" })

Output yang Dihasilkan:

text
{
  acknowledged: true,
  insertedId: ObjectId('6ad3fc1f9862e7b403b9d89f')
}
js
db.pesanan.createIndex({ pelanggan: 1 }, { name: "idx_pelanggan" })

Output yang Dihasilkan:

text
idx_pelanggan
js
printjson(db.pesanan.getIndexes().map(i => i.name))

Output yang Dihasilkan:

text
[
  '_id_',
  'idx_pelanggan'
]

Daftar nama index dari getIndexes() inilah yang dibandingkan dengan migration script — setiap index yang dipakai query utama harus hadir di sini sebelum go-live. Lanjut ke validator, kita pasang aturan $jsonSchema pada collection yang sama:

js
db.runCommand({ collMod: "pesanan", validator: { $jsonSchema: { required: [ "pelanggan", "total" ], properties: { total: { minimum: 0 } } } } })

Output yang Dihasilkan:

text
{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1792277535, i: 2 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1792277535, i: 2 })
}

Field ok: 1 menandakan aturan terpasang (sisanya metadata replikasi). Kita buktikan aturannya benar-benar tercatat pada definisi collection:

js
const info = db.getCollectionInfos({ name: "pesanan" })
printjson(info[0].options)

Output yang Dihasilkan:

text
{
  validator: {
    '$jsonSchema': {
      required: [
        'pelanggan',
        'total'
      ],
      properties: {
        total: {
          minimum: 0
        }
      }
    }
  },
  validationLevel: 'strict',
  validationAction: 'error'
}

Objek options menampilkan validator yang baru saja dipasang beserta dua kebijakan bawaannya: validationLevel: 'strict' menerapkan aturan pada seluruh document baru, dan validationAction: 'error' menolak tulisan yang melanggar. Kedua perilaku ini dibahas tuntas pada Section Schema Validation — pada hari go-live, cukup pastikan validator tiap collection inti muncul di hasil getCollectionInfos().

Backup yang Benar-benar Teruji #

Butir kelima sering dianggap selesai begitu tombol backup dinyalakan, padahal backup yang belum pernah dipulihkan hanyalah harapan.

Pada cluster Dedicated, panel Deployment → Backup menampilkan snapshot beserta jadwal dan masa simpannya; tombol restore menawarkan pemulihan ke cluster lain atau mengunduh berkas untuk mongorestore — teknik yang sama dengan yang kita pakai pada Chapter Environment Separation. Mekanisme backup dan pemulihan secara mendalam ada di Section Backup dan Recovery.

Rangkuman #

  • Jalankan dua belas butir periksa secara berurutan: keamanan dan konektivitas, ketahanan, kesiapan data dan aplikasi, lalu runbook.
  • connectionStatus membuktikan hak koneksi aktual; getIndexes() dan getCollectionInfos() membuktikan index serta validator terpasang — semuanya dari dalam mongosh.
  • Backup hanya dianggap siap setelah satu kali restore uji berhasil dijalankan terhadap snapshot terbaru.
  • Daftar ini melengkapi (bukan menggantikan) Chapter Security Checklist: butir keamanan di sana berlaku untuk server, di sini untuk peluncuran aplikasi.