Skip to main content
Ini titik ketemunya tujuh tutorial sebelumnya jadi satu hal beneran: deployment kecil tapi bener-bener berbentuk production, dengan environment yang bisa lu iterate cepet dan environment production yang cuma berubah lewat review.

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 bernama staging 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.
modules/app-stack/variables.tf:
modules/app-stack/main.tf:
modules/app-stack/outputs.tf:
Root 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 output private_key dari keypair, itu yang buat lu authenticate. IP publik yang keassign gak diexpose sebagai resource attribute di biznetgio_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_key dan secret_key dari 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 jalanin plan/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 dengan disk_size (cuma bisa naik), gedein storage dengan quota (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