8 menit

Kapan sebaiknya Anda memigrasikan aplikasi vibe-coded?

Pelajari kapan memigrasikan aplikasi vibe-coded dengan membandingkan autentikasi, transfer database, rahasia, cutover domain, downtime, pembersihan, dan rollback.

Kapan sebaiknya Anda memigrasikan aplikasi vibe-coded?

Memindahkan aplikasi yang dihasilkan sebelum peluncuran lebih murah dan lebih rapi. Memindahkannya setelah mendapat traksi memberi dasar keputusan yang lebih baik, tetapi jauh lebih sulit dimaafkan. Waktu yang tepat tidak terlalu bergantung pada apakah proyek dimulai di Lovable, Bolt, v0, atau Replit, melainkan pada apakah Anda dapat menyebutkan dan melatih setiap batasan stateful yang dimiliki platform saat ini.

Saya menganggap peluncuran sebagai titik ketika identitas, data, dan domain publik menjadi janji kepada pengguna. Sebelum titik itu, migrasi yang gagal hanya menghabiskan waktu developer. Sesudahnya, kesalahan yang sama dapat mengunci pelanggan, menghilangkan penulisan data, membatalkan sesi, atau mengarahkan trafik ke dua versi produk yang berbeda. Traksi memberi bukti tentang hal yang layak dipertahankan, tetapi juga mengubah perpindahan kode biasa menjadi perubahan operasional.

Jangan mengambil keputusan berdasarkan ukuran source tree. Aplikasi kecil dengan autentikasi terkelola dan database aktif bisa lebih sulit dipindahkan daripada situs statis besar. Tentukan berdasarkan kepemilikan: siapa yang mengendalikan repositori, identitas pengguna, database, rahasia, file, pekerjaan terjadwal, domain, deployment, dan jalur rollback?

Sebelum peluncuran, migrasi memberi kebebasan

Migrasi sebelum peluncuran biasanya lebih baik bila platform saat ini tidak dapat memenuhi kebutuhan yang sudah diketahui terkait kepemilikan, deployment, lokasi data, atau kemudahan pemeliharaan. Anda masih leluasa mengubah skema, mengganti autentikasi, mengganti nama variabel lingkungan, dan mengatur ulang data pengujian tanpa bernegosiasi dengan pengguna.

Tahap ini sangat menarik bila aplikasi hanya memiliki akun seed dan catatan yang dapat dibuang. Anda dapat mengekspor kode, membangunnya di lingkungan bersih, membuat ulang database dari migration, dan menemukan bagian yang sebelumnya tersirat di workspace asal. Setiap kegagalan berguna karena mengungkap dependensi sebelum dependensi itu membawa data pelanggan.

Waktu yang murah tidak membuat pekerjaan ini opsional. Proyek yang dihasilkan sering berjalan karena platform asal menyisipkan konfigurasi, menyediakan URL database, meng-host function, atau memahami konvensi build. Ekspor source membuktikan Anda memiliki file. Itu tidak membuktikan host lain dapat membangun dan menjalankan sistem yang sama.

Sebelum peluncuran, saya mewajibkan pengujian clean-room. Rekan tim yang tidak membuat proyek hanya menerima repositori, daftar rahasia tertulis dengan nilai pengembangan yang aman, dan petunjuk penyiapan. Jika orang itu tidak dapat mencapai login yang berfungsi, membuat catatan, dan menjalankan perjalanan pengguna utama, proyek belum portabel.

Ada pula alasan baik untuk menunda. Prototipe awal mungkin mengubah model datanya setiap hari, dan pekerjaan migrasi bisa terbuang oleh keputusan produk berikutnya. Jika platform saat ini mendukung peluncuran yang dituju, ekspor source, deployment, domain kustom, dan jalur rollback yang kredibel, belajar dari rilis kecil bisa lebih bernilai daripada merapikan infrastruktur untuk produk yang belum diinginkan siapa pun.

Jadi, keputusan sebelum peluncuran bukan «Bisakah kita pindah?» Melainkan «Apakah perpindahan menghilangkan risiko peluncuran yang sudah diketahui, atau kita membayar untuk mempertahankan asumsi?» Lakukan migrasi untuk batasan yang nyata. Jangan bermigrasi hanya karena infrastruktur konvensional terasa lebih terhormat.

Setelah ada traksi, bukti datang bersama kewajiban

Migrasi setelah ada traksi masuk akal ketika penggunaan nyata mengungkap kebutuhan yang tidak dapat dipenuhi pengaturan awal, tetapi rencana harus menjaga setiap janji publik yang sudah digunakan. Kini Anda mengetahui jalur tersibuk, volume data sebenarnya, pekerjaan latar belakang yang dipicu pengguna, serta integrasi yang penting. Bukti itu dapat mencegah perpindahan mahal menuju arsitektur khayalan.

Kewajibannya juga sama konkretnya. Kata sandi yang ada harus tetap berfungsi atau pengguna memerlukan jalur reset yang terkontrol. Pengenal database harus stabil jika URL, faktur, webhook, atau foreign key mengeksposnya. File yang diunggah memerlukan rencana transfer. Tautan email dan callback OAuth harus menunjuk ke domain yang tepat. Penulisan yang terjadi selama penyalinan harus masuk ke database baru atau sengaja dijeda.

Traksi bukan satu ambang tunggal. Sepuluh pelanggan aktif yang memakai aplikasi untuk penggajian menciptakan risiko migrasi lebih besar daripada sepuluh ribu pembaca katalog statis. Hitung state dan konsekuensinya, bukan akun. Tanyakan berapa banyak data berubah per menit, seberapa mahal tindakan duplikat, seberapa cepat tim dukungan dapat menghubungi setiap pengguna terdampak, dan apakah bisnis dapat menerima jendela pemeliharaan.

Di tahap ini pula tim sering mengira permintaan yang terlihat sebagai izin arsitektural. Lebih banyak pengguna tidak otomatis membenarkan penulisan ulang. Jika aplikasi hasil ekspor dapat dipahami dan layanan saat ini bisa dipisahkan satu batasan demi satu, migrasi bertahap lebih aman daripada mengganti seluruh stack.

Saya ingin peta kepemilikan tertulis sebelum menyetujui perpindahan setelah ada traksi:

  • Repositori source dan proses build
  • Direktori pengguna dan sesi aktif
  • Database utama, file, dan backup
  • Rahasia, pekerjaan terjadwal, dan webhook keluar
  • Domain, catatan pengirim email, pemantauan, dan wewenang rollback

Setiap bagian yang kosong adalah penghalang, bukan detail untuk malam cutover. Nama platform hanya penting bila mengubah cara Anda mengekspor atau mengonfigurasi ulang salah satu aset ini.

Autentikasi adalah migrasi identitas

Autentikasi harus diperlakukan sebagai perpindahan identitas dan aturan kepercayaan, bukan layar login yang dapat dibangun ulang nanti. Formulir yang terlihat adalah bagian mudah. Hash kata sandi, ID subjek penyedia, status email terverifikasi, pendaftaran multifaktor, metode pemulihan, sesi, dan peran otorisasi membawa kontinuitas yang sesungguhnya.

Pertama, tentukan apakah aplikasi memiliki tabel pengguna atau mendelegasikan identitas ke layanan terkelola. Jika Anda dapat mengekspor pengguna, periksa field yang tersedia dan apakah hash kata sandi dapat diimpor ke tujuan. Hash tidak saling kompatibel hanya karena kedua sistem menyebutnya hash. Tujuan harus mendukung algoritme dan parameter yang sama persis, atau semua kata sandi perlu di-reset.

Login sosial menciptakan batasan identitas lain. Penyedia OAuth biasanya mengembalikan pengenal subjek stabil yang khusus untuk penyedia. Jika implementasi baru mencocokkan akun hanya berdasarkan email, orang dapat tergabung secara keliru saat alamat berubah atau penyedia mengembalikan alias berbeda. Pertahankan tupel issuer, subjek penyedia, dan ID pengguna lokal. Daftarkan ulang URL callback sebelum cutover, lalu uji login baru dan akun yang sudah ada.

OWASP's Session Management Cheat Sheet menyarankan pembaruan pengenal sesi setelah perubahan hak istimewa. Migrasi sendiri bukan perubahan hak istimewa, tetapi saran itu menunjukkan batasan penting: state sesi adalah state keamanan. Mencoba menserialisasi cookie opaque dari satu stack autentikasi ke stack lain biasanya tidak sebanding dengan risikonya. Pertahankan verifier lama sementara bila Anda benar-benar memahaminya, atau kedaluwarsakan sesi dan beri tahu pengguna bahwa mereka harus masuk lagi. Jangan pernah menerima cookie secara diam-diam ketika layanan baru tidak dapat memvalidasinya.

Cakupan cookie dapat merusak perpindahan yang sebenarnya sudah benar. Periksa nama cookie, domain, path, atribut Secure, HttpOnly, dan SameSite yang dihasilkan host baru. Referensi Set-Cookie MDN menjelaskan bahwa cookie dengan atribut Domain tersedia untuk domain itu dan subdomainnya, sedangkan domain yang tidak dicantumkan membatasinya pada host yang menetapkan cookie. Perbedaan ini penting ketika aplikasi lama memakai satu host untuk antarmuka web dan host lain untuk API. Uji dalam profil browser baru agar cookie lama tidak membuat alur baru tampak sehat.

Otorisasi perlu dibandingkan secara terpisah. Pengguna mungkin berhasil diautentikasi tetapi kehilangan keanggotaan organisasi, peran admin, hak langganan, atau kebijakan tingkat baris. Ekspor sampel akun dengan peran berbeda dan tulis pengujian akses yang diharapkan sebelum memindahkan data. Halaman login berhasil hampir tidak membuktikan apa pun.

Untuk migrasi sebelum peluncuran, saya lebih memilih mengganti sistem identitas sekarang dan menghapus pengguna uji. Untuk migrasi setelah ada traksi, pilih satu strategi kontinuitas yang jelas:

  • Impor hash kata sandi yang kompatibel dan pertahankan ID penyedia.
  • Pertahankan layanan identitas lama saat aplikasi dipindahkan.
  • Wajibkan reset dengan token sekali pakai yang kedaluwarsa.
  • Jalankan jembatan dual-read singkat dengan satu otoritas untuk penulisan.

Jangan menjalankan dua direktori pengguna yang sama-sama dapat ditulis. Perubahan email yang bertentangan dan permintaan penghapusan akun akan mengubah kemudahan itu menjadi insiden.

Transfer database harus menjaga makna

Migrasi database hanya berhasil bila tujuan mempertahankan batasan, pengenal, timestamp, relasi, dan setiap penulisan yang diterima selama perpindahan. Jumlah baris adalah pemeriksaan yang lemah. Dua database dapat berisi jumlah baris sama tetapi berbeda dalam presisi uang, zona waktu, keunikan, penanganan null, atau foreign key.

Sebelum peluncuran, bangun ulang database dari migration berversi alih-alih menyalin database pengembangan. Seed hanya catatan yang diperlukan aplikasi. Pengujian ini membuktikan riwayat skema lengkap dan aplikasi tidak bergantung pada tabel yang dibuat seseorang secara manual di konsol host.

Setelah ada traksi, pisahkan perpindahan skema dari perpindahan data aktif. Catat engine dan versi sumber, extension, collation, generated column, trigger, kebijakan tingkat baris, sequence, dan objek besar. Jika tujuan memakai engine database berbeda, perlakukan ini juga sebagai migrasi aplikasi. Sintaks SQL hanyalah bagian terkecil dari perubahan itu; perilaku transaksi dan semantik tipe data memicu kejutan yang buruk.

Dokumentasi PostgreSQL menjelaskan pg_dump sebagai ekspor konsisten yang tidak memblokir pembaca atau penulis. Ini berguna, tetapi tim sering menafsirkan janjinya terlalu jauh. Snapshot konsisten tidak mencakup penulisan yang di-commit setelah snapshot dimulai. Anda tetap memerlukan metode change capture, jeda penulisan terakhir, atau jendela pemeliharaan untuk menutup celah tersebut.

Gunakan query rekonsiliasi yang hasilnya dapat disimpan bersama catatan cutover. Fragmen ini memeriksa jumlah, batas pengenal, dan jendela pembaruan untuk tiga tabel penting:

SELECT 'users' AS table_name, count(*) AS rows,
       min(id)::text AS min_id, max(id)::text AS max_id,
       max(updated_at) AS newest_update
FROM users
UNION ALL
SELECT 'projects', count(*), min(id)::text, max(id)::text, max(updated_at)
FROM projects
UNION ALL
SELECT 'orders', count(*), min(id)::text, max(id)::text, max(updated_at)
FROM orders;

Jalankan di kedua sisi dan selidiki setiap perbedaan. Kemudian uji invariant domain yang tidak dapat dilihat dari jumlah: tidak ada pesanan yang menunjuk pengguna yang hilang, saldo sesuai dengan buku besarnya, setiap catatan file memiliki objek, dan aturan keunikan menolak duplikat yang sama.

Backup perlu diuji pemulihannya. File ekspor yang berhasil hanya membuktikan sebuah perintah selesai. Pulihkan ke tujuan kosong, jalankan aplikasi terhadapnya, dan ukur waktunya. Waktu pemulihan yang terukur memberi tahu apakah rollback melalui pemulihan realistis atau sekadar menenangkan.

Penyimpanan file sering tersembunyi di balik baris database. Tabel uploads yang diekspor mungkin mempertahankan nama objek, sementara objek sebenarnya tetap berada di bucket yang dikelola platform. Salin byte, checksum, content type, aturan akses, dan metadata kepemilikan, lalu ambil sampel unduhan lewat aplikasi, bukan konsol penyimpanan. Jika URL berisi token bertanda tangan atau nama host lama, buat ulang URL tersebut alih-alih menyalin URL basi. Perlakukan unggahan pengguna sebagai state dalam jendela cutover yang sama, khususnya bila pengguna dapat mengganti file saat penyalinan database berlangsung.

Variabel lingkungan mengungkap arsitektur tersembunyi

Bawa proyek melewati fase traksi
Koder.ai memadukan ekspor sumber, hosting, domain kustom, dan rollback seiring aplikasi berkembang.

Variabel lingkungan harus diubah dari kumpulan string warisan menjadi kontrak bernama untuk setiap lingkungan. Variabel yang hilang menimbulkan kegagalan jelas. Yang lebih berbahaya, variabel berisi nilai produksi yang tampak masuk akal tetapi salah, seperti kunci pembayaran pengujian, rahasia webhook lama, atau origin callback yang mengarahkan pengguna kembali ke host sebelumnya.

Inventarisasi variabel dari kode, pengaturan platform, konfigurasi build, function serverless, pekerjaan terjadwal, dan sistem deployment. Jangan menyalin seluruh lingkungan lama ke host baru. Kelompokkan setiap nilai berdasarkan pemilik, sensitivitas, cakupan, metode rotasi, serta apakah nilainya dibaca saat build atau runtime.

Manifest ringkas membuat batasan dapat ditinjau:

DATABASE_URL          runtime   secret   owner=backend   rotate=yes
PUBLIC_APP_ORIGIN     build     public   owner=web       rotate=no
SESSION_SIGNING_KEY   runtime   secret   owner=security  rotate=yes
MAIL_SENDER           runtime   public   owner=ops       rotate=no
WEBHOOK_SECRET        runtime   secret   owner=backend   rotate=yes

Perbedaan build dan runtime penting pada front end bergaya React. Nilai yang disematkan saat build tidak akan berubah ketika seseorang mengedit pengaturan runtime. Build ulang klien dan periksa bundle yang dikirim untuk konfigurasi publik. Jangan pernah memasukkan rahasia ke dalam variabel hanya karena namanya dimulai dengan awalan publik milik framework.

Rotasikan rahasia selama migrasi setelah ada traksi bila tujuan dapat mendukung masa tumpang tindih. Untuk verifikasi webhook atau penandatanganan sesi, terima rahasia lama dan baru sebentar sambil hanya menerbitkan yang baru. Hapus nilai lama setelah jendela pengiriman atau sesi maksimum. Jika penyedia hanya mendukung satu rahasia, koordinasikan perpindahan dengan cutover akhir dan nyatakan dependensi itu secara jelas di runbook.

Sebelum peluncuran, hapus variabel yang tidak dipakai dan gagalkan startup saat nilai wajib tidak ada. Setelah ada traksi, tambahkan observabilitas sebelum pembersihan agar Anda dapat melihat apakah integrasi yang tampak usang masih menerima panggilan. Menebak dari nama variabel adalah cara tim menonaktifkan pekerjaan bulanan senyap yang benar-benar dibutuhkan keuangan.

Bandingkan nilai berdasarkan lingkungan, tetapi jangan pernah menempelkan rahasia ke dokumen migrasi. Catat nama rahasia dan label versi, lalu simpan nilainya di secret store tujuan. Beri identitas aplikasi izin untuk membaca hanya yang diperlukan deployment tersebut. Saat variabel berubah, catat siapa yang mengubahnya dan rilis mana yang mengonsumsinya. Kedisiplinan kecil ini menjawab pertanyaan umum di malam cutover: «URL database yang mana sebenarnya kita deploy?»

Cutover domain adalah perubahan pengendalian trafik

Cutover domain harus dirancang agar deployment lama dan baru sama-sama dapat menerima trafik dengan aman selama propagasi DNS. DNS tidak berubah serentak di semua tempat, dan menurunkan time to live sesaat sebelum perubahan tidak memengaruhi resolver yang sudah menyimpan nilai lama dalam cache.

Beberapa hari sebelum perpindahan yang direncanakan, turunkan TTL catatan terkait dan konfirmasikan respons otoritatif. Pertahankan deployment lama tetap sehat setidaknya selama TTL sebelumnya ditambah margin resolver yang konservatif. Sediakan sertifikat di host baru sebelum mengarahkan trafik ke sana, lalu verifikasi domain apex, host www, subdomain API, redirect, dan catatan IPv6 secara terpisah.

Domain hanya pintu depan. Perbarui callback autentikasi, origin yang diizinkan, domain cookie, URL kanonis, endpoint webhook, tautan email, dan konfigurasi deep-link seluler. Cari nama host lama di repositori dan pengaturan platform. Redirect membantu browser, tetapi tidak memperbaiki ketidakcocokan callback OAuth yang ketat atau webhook yang ditandatangani untuk endpoint yang salah.

Tanpa downtime hanya mungkin bila kedua versi dapat beroperasi pada state yang kompatibel. Jika rilis baru mengubah database dengan cara yang tidak dapat dibaca kode lama, tumpang tindih DNS menimbulkan kegagalan. Gunakan perubahan skema expand-and-contract: tambahkan kolom atau tabel baru lebih dulu, deploy kode yang memahami kedua bentuk, pindahkan data, lalu hapus bentuk lama setelah seluruh trafik meninggalkan rilis lama.

Untuk produk bervolume rendah, jendela pemeliharaan singkat bisa lebih aman daripada penyiapan replikasi langsung yang rumit. Nyatakan kapan penulisan akan dijeda, kembalikan respons pemeliharaan yang tepat, kosongkan pekerjaan latar belakang, ambil salinan akhir, lakukan rekonsiliasi, alihkan trafik, lalu buka kembali penulisan. Akses baca saja dapat tetap tersedia bila tidak dapat memasukkan pekerjaan tersembunyi ke antrean.

Rollback harus memiliki aturan data. Mengarahkan DNS kembali mudah saat tidak ada penulisan yang mencapai tujuan. Setelah pengguna menulis di kedua sisi, pembalikan DNS dapat membuang atau mencabangkan data. Tentukan momen rollback aman terakhir, dan setelah titik itu lanjutkan ke depan atau rekonsiliasikan perubahan, jangan berpura-pura bahwa pembalikan trafik memulihkan konsistensi.

Pantau aplikasi dari luar akun hosting baru. Resolusikan domain lewat lebih dari satu resolver publik, minta rantai sertifikat, muat halaman tanpa cache hangat, kirim satu transaksi yang dapat dibalik, dan konfirmasikan pekerjaan latar belakang yang dihasilkannya selesai. Dasbor host dapat melaporkan deployment sehat saat pengguna menerima jawaban DNS lama atau edge regional menyajikan build lebih lama. Pertahankan pemeriksaan sintetis terhadap domain publik dan host uji khusus tujuan sampai masa tumpang tindih berakhir.

Pembersihan source menentukan apakah perpindahan bertahan

Rencanakan perpindahan sebelum peluncuran
Mode perencanaan Koder.ai membantu Anda memisahkan pekerjaan autentikasi, data, rahasia, dan domain sebelum mengubah aplikasi.

Pembersihan source harus menghilangkan keterikatan platform tanpa menghapus struktur hasil generasi yang berguna atau memicu penulisan ulang yang tidak terkait. Kode yang dihasilkan bisa berulang atau janggal, tetapi ketidaksukaan estetis bukan alasan migrasi. Ubah yang menghalangi build mandiri, pengujian, peninjauan keamanan, atau pemeliharaan di masa depan.

Mulailah dengan asal-usul. Ekspor repositori lengkap dan simpan file lisensi, atribusi aset, migration yang dihasilkan, lockfile, dan konfigurasi. Periksa apakah rahasia atau token platform masuk ke riwayat Git. Menghapusnya dari file terbaru tidak mencabutnya, jadi rotasikan kredensial yang terekspos dan putuskan apakah penulisan ulang riwayat diperlukan.

Berikutnya, cari import khusus platform, path proxy, klien database, helper autentikasi, adapter penyimpanan, file deployment, dan endpoint API yang dihasilkan. Ganti dengan antarmuka aplikasi yang sempit bila praktis. Pencarian seluruh repositori berguna, tetapi menjalankan perjalanan pengguna memberi tahu referensi mana yang masih penting.

Pembersihan dependensi dilakukan setelah build mandiri berhasil. Hapus paket satu per satu, buat ulang lockfile dengan package manager yang ada, dan jalankan pengujian setelah setiap kelompok. Jangan meningkatkan framework, mengganti manajemen state, mengganti nama setiap komponen, dan memigrasikan hosting dalam perubahan yang sama. Itu menciptakan terlalu banyak penjelasan untuk satu kegagalan.

Kode server yang dihasilkan patut diperiksa lebih teliti di batas kepercayaan. Telusuri setiap permintaan dari route ke pemeriksaan otorisasi hingga query database, dan pastikan server tidak bergantung pada aturan visibilitas sisi klien. Tinjau batas unggahan, target permintaan keluar, pesan kesalahan, dan route administratif. Ini bukan ajakan untuk menulis ulang setiap handler yang dihasilkan. Ini pemeriksaan terfokus bahwa kode tetap menegakkan aturan akses setelah middleware platform dan proxy terkelola hilang.

Proyek yang dihasilkan juga memerlukan file operasional biasa: manifest lingkungan contoh dengan nilai palsu, perintah migration database, petunjuk build dan start, health check, serta deskripsi worker latar belakang. Pastikan petunjuk ini dapat dijalankan. README yang mengatakan «konfigurasikan database» hanya mencatat bahwa database ada.

Pembersihan sebelum peluncuran dapat mencakup reset skema dan refaktor besar karena belum ada janji kompatibilitas. Pembersihan setelah ada traksi harus mempertahankan bentuk API publik, pengenal, dan perilaku yang dilihat pengguna sampai perpindahan infrastruktur stabil. Beri deployment baru masa tenang sebelum mengubah perilaku produk. Ketika migrasi dan desain ulang datang bersamaan, dukungan tidak dapat membedakan apakah keluhan berasal dari perpindahan atau fitur baru.

Latihan mengubah downtime menjadi keputusan

Ubah satu batasan dalam satu waktu
Mode perencanaan dan snapshot membantu membagi migrasi menjadi perubahan aplikasi yang lebih kecil dengan titik pemulihan.

Latihan migrasi harus meniru urutan produksi dengan salinan data terbaru yang telah disanitasi dan menghasilkan waktu terukur, keluaran rekonsiliasi, serta titik pembatalan yang diuji. Daftar periksa yang disalin dari proyek lain tidak dapat memberi tahu berapa lama database Anda dipulihkan atau pekerjaan mana yang terus menulis setelah mode pemeliharaan dimulai.

Gunakan satu operator untuk menjalankan dan orang lain untuk mengamati, mencatat waktu, serta mempertanyakan pemeriksaan yang dilewati. Untuk tim kecil, orang kedua dapat berupa pendiri, tetapi mereka memerlukan konteks cukup untuk mengenali hasil yang berubah. Orang yang mengetik perintah tidak seharusnya juga menjadi satu-satunya orang yang memutuskan apakah perintah itu berhasil.

Runbook praktis memiliki urutan ketat:

  1. Bekukan deployment yang tidak terkait dan catat versi saat ini, nilai DNS, serta versi rahasia.
  2. Masukkan penulisan ke mode pemeliharaan, kosongkan antrean, hentikan pekerjaan terjadwal, dan catat watermark sumber terakhir.
  3. Salin data tersisa, rekonsiliasikan tabel dan invariant domain, lalu jalankan pengujian autentikasi dan perjalanan inti.
  4. Alihkan trafik, verifikasi sertifikat dan callback, pantau error serta kedalaman antrean, lalu buka kembali penulisan.
  5. Pada checkpoint yang dinyatakan, lanjutkan di sistem baru atau jalankan aturan data rollback yang didokumentasikan.

Sebelum peluncuran, berlatihlah dengan menghancurkan tujuan lalu membangunnya kembali dari repositori. Targetnya adalah keterulangan, sehingga database kosong dan lingkungan baru lebih mengungkap daripada salinan yang menyerupai produksi.

Setelah ada traksi, latih skala dan konkurensi. Salin cukup data representatif untuk mengungkap indeks lambat dan migration panjang. Putar ulang trafik baca yang aman jika tersedia, buat penulisan sintetis dengan pengenal yang diketahui, dan pastikan pekerjaan latar belakang idempoten sebelum mengizinkan retry. Pekerjaan email yang mengirim dua kali tidak aman hanya karena database tetap konsisten.

Ukur jeda penulisan secara terpisah dari seluruh jendela pemeliharaan. Anda sering dapat melakukan penyalinan massal saat sumber tetap aktif, lalu menjeda hanya untuk delta dan validasi. Jika latihan menunjukkan delta tidak dapat selesai dalam jendela yang diizinkan, tambahkan replikasi atau change capture. Jangan menemukan kebutuhan itu saat pelanggan menunggu.

Simpan bukti setelah perpindahan: versi sumber dan tujuan, timestamp, pemeriksaan baris, hasil smoke test, jawaban DNS, keputusan operator, serta waktu layanan lama dinonaktifkan. Catatan itu mempercepat debugging dan mencegah rencana migrasi berikutnya bergantung pada ingatan seseorang.

Pilih tahap berdasarkan kemampuan untuk dipulihkan

Tahap migrasi terbaik adalah tahap ketika kegagalan yang secara realistis dapat Anda sebabkan masih dapat dipulihkan. Sebelum peluncuran, produk memiliki sedikit bukti tetapi kebebasan hampir tak terbatas. Setelah ada traksi, produk memiliki bukti tetapi membawa state yang harus tetap koheren sepanjang perpindahan.

Saya memakai enam uji keputusan:

  • Lakukan migrasi sebelum peluncuran jika batasan kepatuhan, kepemilikan, ekspor, hosting, atau arsitektur yang sudah diketahui menghalangi rilis yang dituju.
  • Tetap tinggal dan luncurkan jika platform memenuhi kebutuhan saat ini dan tim hanya akan bermigrasi karena kecemasan.
  • Lakukan migrasi setelah ada traksi jika penggunaan terukur mengungkap batasan dan Anda dapat melatih kontinuitas identitas, data, dan trafik.
  • Tunda jika Anda tidak dapat mengekspor database yang dapat dipulihkan, mengendalikan domain, mencatat rahasia, atau menetapkan kepemilikan penulisan.
  • Utamakan pemisahan bertahap ketika autentikasi atau data dapat tetap digunakan sementara komputasi dan hosting berpindah.

Lovable, Bolt, v0, dan Replit semuanya dapat menghasilkan proyek yang portabilitasnya bergantung pada layanan yang dipilih, paket yang digunakan, dan kode yang dihasilkan saat itu. Periksa repositori dan kontrol akun yang sebenarnya. Kategori vendor tidak menjawab apakah hash kata sandi, extension database, file, atau pengaturan deployment spesifik Anda dapat dipindahkan.

Jika Anda memilih lingkungan pengembangan baru berbasis chat, kontrol perencanaan dan rollback mengurangi biaya untuk memisahkan perpindahan menjadi perubahan yang dapat ditinjau. Koder.ai mendukung ekspor source, deployment dan hosting, domain kustom, snapshot dan rollback, sehingga tim dapat menjaga pemeriksaan kepemilikan tersebut dalam rencana migrasi tanpa membuat saran artikel ini bergantung pada satu platform.

Tetapkan anggaran migrasi sebelum peluncuran bahkan jika Anda memutuskan untuk tetap tinggal. Simpan source di bawah kendali Anda, buat versi untuk skema, dokumentasikan kontrak lingkungan, dan latih pemulihan. Tindakan itu jauh lebih murah saat aplikasi masih kecil, dan menjaga pilihan untuk pindah ketika traksi memberi alasan, bukan krisis.

Jika tim tidak dapat melakukan pemulihan itu hari ini, portabilitas masih berupa niat, bukan sifat aplikasi.

Pertanyaan umum

Haruskah saya memigrasikan aplikasi yang dihasilkan sebelum meluncurkannya?

Lakukan migrasi sebelum peluncuran bila pengaturan saat ini tidak memenuhi kebutuhan yang sudah jelas terkait kepemilikan, hosting, lokasi data, atau pemeliharaan. Jika platform memenuhi kebutuhan rilis dan produk masih berubah setiap hari, meluncurkan versi terbatas mungkin memberi pelajaran lebih banyak daripada memindahkan infrastruktur terlalu dini.

Apakah memigrasikan aplikasi setelah memiliki pengguna berisiko?

Ya, karena identitas pengguna, penulisan data, file, callback, dan pekerjaan terjadwal harus tetap konsisten selama perpindahan. Risikonya dapat dikelola bila Anda berlatih dengan data yang representatif, menetapkan satu otoritas untuk penulisan, dan mendokumentasikan titik rollback aman terakhir.

Bisakah saya memindahkan hash kata sandi ke penyedia autentikasi baru?

Hanya jika tujuan menerima algoritme hash dan parameter yang persis sama seperti sumbernya. Jika tidak, pertahankan layanan identitas lama sementara waktu atau lakukan reset kata sandi yang terkontrol. Jangan pernah mengonversi hash seolah-olah itu kata sandi terenkripsi biasa.

Apakah pengguna perlu masuk lagi setelah migrasi?

Sering kali ya, khususnya saat stack autentikasi baru tidak dapat memverifikasi cookie sesi lama dengan aman. Permintaan masuk yang jelas lebih baik daripada lapisan kompatibilitas rapuh yang menerima status sesi yang tidak dapat divalidasi sepenuhnya.

Bagaimana memigrasikan database aktif tanpa kehilangan penulisan?

Gunakan replikasi atau change capture, atau jeda penulisan untuk menyalin delta terakhir dan melakukan rekonsiliasi. Snapshot konsisten hanya mencakup satu titik waktu, jadi tetap perlu menangani commit yang masuk setelah snapshot dimulai.

Berapa lama downtime migrasi sebaiknya?

Latihan harus menentukannya. Ukur secara terpisah waktu pengosongan antrean, delta data terakhir, validasi, perpindahan DNS, dan smoke test, lalu umumkan jendela dengan ruang cukup untuk proses terukur yang paling lambat.

Kapan saya harus menurunkan TTL DNS sebelum cutover?

Turunkan beberapa hari sebelumnya dan konfirmasikan respons DNS otoritatif, karena resolver dapat menyimpan nilai lama hingga TTL sebelumnya habis. Pertahankan deployment lama tetap sehat selama masa tumpang tindih, jangan berharap perpindahan global terjadi seketika.

Haruskah saya merefaktor kode yang dihasilkan saat migrasi?

Ubah kode yang menghalangi build mandiri, pengujian, peninjauan keamanan, atau operasi. Simpan peningkatan framework besar dan refaktor demi estetika untuk nanti, karena menggabungkannya dengan perpindahan infrastruktur membuat kegagalan lebih sulit diisolasi.

Bisakah saya rollback dengan mengarahkan domain ke host lama?

Hanya sebelum tujuan menerima penulisan, atau bila Anda memiliki cara yang sudah teruji untuk memutar ulang penulisan tersebut ke sumber. Setelah kedua database berbeda, mengubah DNS saja dapat menghilangkan data dan bukan rollback yang lengkap.

Apa yang wajib diekspor dari Lovable, Bolt, v0, atau Replit?

Ekspor seluruh sumber dan identifikasi database, pengguna, file, rahasia, pekerjaan, pengaturan domain, dan konfigurasi deployment yang berada di luar sumber tersebut. Kontrol tepatnya berbeda menurut proyek dan paket, jadi periksa aset di akun Anda sendiri alih-alih mengandalkan perbandingan platform umum.

Related posts