Yang bakal kita bangun
- NEO Lite Pro VM sebagai app tier (
biznetgio_neolite_pro_vm/NeoliteProVm), soalnya ini tier dedicated-resource yang emang buat workload beneran, bukan NEO Lite entry-level. - NEO Object Storage instance, bucket, dan credential (
biznetgio_object_storage*/ObjectStorage*) buat data dan backup aplikasinya. - Dua environment, staging dan production, code sama, ukuran dan duit beda.
- State di shared backend, secret di CI, dan tiap perubahan ke production lewat pull request yang direview.
1. Struktur repository
Ngikutin Structure a real project:2. Dua environment
Ngikutin Environments, ini pake Terraform workspace bernamastaging dan production (atau, di Pulumi, stack dengan nama yang sama). Staging jalan dengan pay_with_credit_card = false dan tier product paling kecil, jadi tiap plan bisa dicoba gratis; production jalan dengan tier beneran dan billing beneran.
3. State-nya disimpen di mana
Ngikutin State, remote backends, and team collaboration, deployment ini pake jalur yang direkomendasiin buat dua tools-nya, bukan yang advanced dan belum keverifikasi: Terraform Cloud buat versi Terraform, Pulumi Cloud (defaultnya) buat versi Pulumi. Dua-duanya udah dapet locking dan history tanpa perlu verifikasi kompatibilitas S3 pihak ketiga dulu.4. Secret
Ngikutin Manage secrets the right way: API token Biznet GIO disimpen di dua GitHub Actions environment,staging dan production, yang production-nya udah diaktifin required reviewer. Versi Pulumi juga butuh PULUMI_ACCESS_TOKEN di sampingnya.
5. Module-nya
Nerusin Reusable modules and components dengan nambahin storage di samping VM.storage_label jadi input sendiri, dipisah dari nama environment, soalnya field label punya biznetgio_object_storage punya batasan 6-16 karakter sendiri yang gak tergantung sepanjang apa nama environment lu.
- Terraform
- Pulumi (TypeScript)
modules/app-stack/variables.tf:modules/app-stack/main.tf:modules/app-stack/outputs.tf:main.tf manggil sekali per workspace. vm_product_id dipilih pake nama, bukan products[0] - liat Paham katalog produk buat kenapa, dan katalog NEO Lite Pro buat tabel harga lengkap. storage_product_id = 8 tetep literal hardcoded soalnya Object Storage emang gak punya data source katalog sama sekali - liat kenapa:6. Pipeline, dengan langkah promosi yang disengaja
Nerusin CI/CD with GitHub Actions jadi dua environment daripada satu. Staging apply otomatis di tiap merge, soalnya di sana gak ada yang makan duit beneran atau ngelayani traffic beneran; production butuh required reviewer yang dikonfigurasi di GitHub environment-nya:needs: apply_staging artinya production cuma jalan setelah staging udah apply dengan bersih; required reviewer di environment: production tetep bikin dia pause buat approval apapun yang terjadi.
7. Guardrail
Semua dari Testing, validation, and guardrails tetep berlaku di sini tanpa berubah:terraform fmt -check dan terraform validate di tiap PR, plan yang diposting jadi komentar, dan reviewer yang khusus ngecek gak ada one-shot trigger atau field create-only yang keubah gak sengaja sebelum approve production.
8. Nyambungin ke sistem lu
Provider-provider ini provisioning dan manage lifecycle; mereka bukan inventory system, jadi ada beberapa hal yang emang sengaja bukan resource attribute:- Akses SSH: console user dan password yang lu set (
ssh_and_console_user/console_password) plus outputprivate_keydari keypair, itu yang buat lu authenticate. IP publik yang keassign gak diexpose sebagai resource attribute dibiznetgio_neolite_pro_vm; cari di entry NEO Lite Pro-nya di portal setelah apply pertama, terus catet di inventory apapun yang sistem lu udah pake. - Konfigurasi app: kasih output
access_keydansecret_keydari object storage credential ke app lu sebagai environment variable atau secret store, diarahin ke S3-compatible endpoint regionnya (nos.<region>.neo.id), persis kayak yang Object Storage reference jelasin buat workload beneran.
9. Ngoperasiin-nya ke depan
- Drift: scheduled GitHub Actions workflow (
on: schedule) yang cuma jalaninplan/preview, bukan apply, buat nangkep perubahan yang dibuat di luar pipeline ini, misalnya ada orang yang edit resource langsung di portal. Post komentar atau alert kalau diff-nya gak kosong. - Scaling: gedein VM dengan ganti
vm_product_id(trigger change-package call), gedein disk-nya dengandisk_size(cuma bisa naik), gedein storage denganquota(cuma bisa naik). Gak ada yang butuh recreate resource-nya. - Teardown: destroy production sama nyatanya kayak apply. Lewatin lewat pull request dan review flow yang sama, jangan pernah jadi command lokal one-off.
Lanjut ke mana lagi
- Coba sendiri: repo contoh - seluruh stack ini, plus semua lini produk lain, sebagai contoh runnable siap copy-paste dengan CI/CD sekalian
- FAQ buat pertanyaan operasional yang muncul begitu ini jalan
- Triggers and actions buat one-shot action destruktif yang stack ini emang sengaja gak diautomasi
- Semua tutorial di track ini, kalau ada satu langkah di atas yang butuh kedalaman lebih dari ringkasan di sini