Workbook Uji Asisten
Workbook ini dipakai setiap asisten trainer untuk menguji satu VM unik miliknya sendiri di dalam satu project kelompok bersama. Tujuannya bukan mengajar peserta, tetapi mengumpulkan bukti bahwa seluruh alur berjalan pada email masing-masing asisten, mulai dari fork repository instruktur sampai unggah data spasial ke GeoServer.
Setiap asisten mengerjakan workbook ini sendiri, satu per satu, dengan email yang sudah di-assign ke project. Tidak ada pengujian serentak yang diwajibkan, jadi satu orang tidak perlu menunggu asisten lain selesai. Setelah semua laporan terkumpul, hasilnya dipakai untuk menjawab satu pertanyaan besar: apakah satu project mampu menjalankan lima VM sekaligus dengan beban Next.js dan GeoServer pada spesifikasi default.
Jumlah asisten saat ini lima orang termasuk koordinator. Jika undangan email belum lengkap, lengkapi dulu lewat panduan setup project sebelum VM dibuat.
Yang sudah pernah diuji: satu email, satu project, tiga container, dari fork sampai halaman
/portal terbuka, GeoServer bisa dibuka dan login, shapefile terunggah, dan layer terbaca
lewat WFS. Bagian 24 tentang domain, DNS, dan HTTPS juga sudah lulus uji pada 12 September
2026, termasuk penerbitan sertifikat Let’s Encrypt dan perpanjangan otomatisnya.
Yang belum pernah diuji: lima VM berjalan bersamaan dalam satu project, undangan lima email beserta sepuluh role IAM, dan lima GitHub connection dalam satu project. Bagian yang belum diuji itulah yang wajib dibuktikan lewat workbook ini.
Pencadangan, pemantauan, pendaftaran mesin pencari, dan pembersihan resource sudah teruji pada 12 sampai 13 September 2026, jadi bukan lagi uji terbuka. Rincian buktinya ada pada kotak berikut.
Langkah teknis lengkap tidak diulang di sini. Setiap uji menunjuk bagian pada panduan deployment asisten, sedangkan nama resource dan pemeriksaan benturan mengikuti panduan batch peserta bagian 8 dan panduan setup project bagian 8.
1. Peran setiap dokumen
Section titled “1. Peran setiap dokumen”| Dokumen | Dipakai untuk |
|---|---|
| Setup project | Koordinator membuat project, mengaktifkan API, dan mengundang email asisten |
| Deployment asisten | Asisten menjalankan fork, VM, Cloud Build, dan GeoServer |
| Batch peserta | Pembagian slug, pemeriksaan benturan nama, dan peserta susulan |
| Workbook ini | Mencatat status setiap uji dan mengumpulkan bukti |
| Troubleshooting | Mencocokkan gejala error dengan solusi yang sudah terverifikasi |
2. Perlengkapan sebelum mulai
Section titled “2. Perlengkapan sebelum mulai”- Satu email yang sudah di-assign koordinator ke project kelompok.
- Akun GitHub yang akan memegang fork.
- Slug unik maksimal 18 karakter. Boleh memakai nama pribadi, misalnya
nama01ataudhanypedia. - Billing project sudah aktif sehingga Compute Engine boleh membuat VM.
- Node.js terpasang, karena seluruh pemeriksaan di laptop memakai Node.js, tanpa Docker.
- Kuota di region sendiri masih tersedia. Yang paling cepat habis adalah alamat IP publik, yaitu 4 per region. Rinciannya pada panduan deployment bagian 10.
3. Lembar identitas
Section titled “3. Lembar identitas”Isi satu baris per peserta. Kolom Status diisi Belum, Berjalan, atau Selesai.
Lima baris pertama masih menunggu email yang belum dikonfirmasi.
| Asisten | GitHub | Slug | Zone | Project ID | Status | |
|---|---|---|---|---|---|---|
| belum diisi | nama01 |
asia-southeast2-b |
Belum | |||
| belum diisi | nama02 |
asia-southeast2-b |
Belum | |||
| belum diisi | nama03 |
asia-southeast2-b |
Belum | |||
| belum diisi | nama04 |
asia-southeast2-b |
Belum | |||
asisten05@example.com |
nama05 |
asia-southeast1-b |
Belum |
Kolom Zone bukan sekadar catatan. Jatah alamat IP publik hanya 4 per region, jadi asisten
kelima memang sengaja ditaruh di region lain. Kalau salah satu VM di asia-southeast2 perlu
dibuat ulang dan keempat slotnya sedang terpakai, pindahkan akun itu ke asia-southeast1
dengan mengganti nilai ZONE saja.
Lembar hasil per asisten. Satu tabel untuk setiap orang.
| Kolom | Isi |
|---|---|
| Slug | Nilai PARTICIPANT_ID |
| VM | Nama VM dan zone |
| URL portal | http://IP_EKSTERNAL_VM/portal |
| URL GeoServer | http://IP_EKSTERNAL_VM/geoserver/web |
| Commit yang diuji | Keluaran git rev-parse HEAD pada laptop |
| Waktu build | Durasi build pertama dari halaman Cloud Build |
| Status akhir | Selesai jika seluruh checkpoint lulus |
4. Urutan pengujian
Section titled “4. Urutan pengujian”Setiap asisten menjalankan tujuh uji ini sendiri secara berurutan. Tidak perlu menunggu
asisten lain, dan tidak perlu menjalankan build bersamaan. Jangan melompat ke GeoServer
sebelum container nextjs terbukti jalan, karena error NEXTJS_IMAGE akan menyamar sebagai
error GeoServer.
| # | Uji | Panduan bagian | Bukti yang dikumpulkan |
|---|---|---|---|
| 1 | Fork repo, lengkapi berkas, verifikasi, commit, push | 1, 2, 3 | URL fork dan keluaran git log --oneline -1 |
| 2 | Buat Service Account dan VM, lalu kunci alamat IP statis | 5, 7, 9, 10 | Keluaran gcloud compute instances describe |
| 3 | Clone fork, isi .env, nyalakan GeoServer dan Nginx |
12, 13, 14 | Keluaran sudo docker compose ps di VM |
| 4 | Hubungkan repository, buat trigger, push, lalu buka /portal |
15, 16, 17, 18, 22 | Status koneksi COMPLETE, build hijau, dan keluaran curl -sSIL |
| 5 | Buka GeoServer dan unggah data spasial | 19, 20, 21 | Keluaran WFS GetFeature |
| 6 | Catat beban memori default | 23 | Keluaran free -h, docker stats, dan OOMKilled |
| 7 | Hentikan VM | 30 | Status TERMINATED |
Setelah seluruh asisten menyelesaikan uji 1 sampai uji 6, lanjutkan ke bagian 12 untuk pengukuran lima VM sekaligus. Uji 7 dijalankan setelah pengukuran itu selesai, bukan sebelumnya.
5. Uji 1: Fork dan lengkapi repository
Section titled “5. Uji 1: Fork dan lengkapi repository”Uji ini dikerjakan dari laptop, sebelum menyentuh Google Cloud. Alasannya: repository
instruktur belum memuat docker-compose.yml, nginx.conf, maupun .env.example, sedangkan
Cloud Build membaca berkas itu dari fork. Kalau fork belum lengkap, build pertama gagal
walaupun project GCP sudah benar.
- Fork
https://github.com/matiurari/personal-geoportalke akun GitHub sendiri. Repository ini public, jadi fork tidak butuh izin khusus. - Beri nama fork
personal-geoportal-peserta. Jika nama itu sudah terpakai, gunakan nama bawaan dan sesuaikan URL clone nanti. - Tambahkan
docker-compose.ymldengan tiga service:nextjs,geoserver, dannginx. - Tambahkan
nginx.confyang memuat bloklocation /geoserver/. - Tambahkan
.env.examplesebagai contoh isi.env. - Tambahkan
/geoserver-data/ke.gitignore. - Tambahkan
scripts/check-config.mjsdari panduan bagian 1. - Tambahkan
scripts/periksa-nginx.mjsdari panduan bagian 1. - Tambahkan
GEOSERVER_ADMIN_PASSWORDke.env.exampledan isi di.envdenganopenssl rand -hex 16, tanpa tanda dolar. Nilainya tidak ditulis didocker-compose.yml. - Periksa dua berkas YAML dengan
node scripts/check-config.mjssampai muncul tiga service. - Periksa struktur
nginx.confdengannode scripts/periksa-nginx.mjs nginx.conf. - Commit keenam berkas itu, lalu push ke branch
main.
| Checkpoint | Perintah atau bukti | Hasil |
|---|---|---|
| Fork bisa dibuka di browser | URL fork | |
| Enam berkas konfigurasi ada di fork | Halaman repository GitHub | |
| Kata sandi GeoServer tidak ada di repo | grep GEOSERVER_ADMIN_PASSWORD docker-compose.yml menampilkan ${GEOSERVER_ADMIN_PASSWORD} |
|
| Tiga service terbaca | Keluaran node scripts/check-config.mjs |
|
Struktur nginx.conf valid |
Keluaran node scripts/periksa-nginx.mjs nginx.conf |
|
| Push berhasil | Keluaran git log --oneline -1 |
|
| Berkas konfigurasi ikut ter-push | Keluaran git show --stat HEAD |
6. Uji 2: Service Account dan VM
Section titled “6. Uji 2: Service Account dan VM”- Buka project kelompok memakai email yang sudah di-assign.
- Tetapkan variabel Cloud Shell, termasuk slug sendiri.
- Buat Service Account
cb-deployer-SLUGbeserta enam role-nya. - Berikan
roles/artifactregistry.readerpada Service Account VM. - Berikan
roles/iam.serviceAccountUserdari Service Account build ke Service Account VM. - Buat VM
webgis-SLUGdengane2-medium, Ubuntu 22.04 LTS, dan OS Login. - Kunci alamat IP publiknya menjadi alamat statis dengan nama
webgis-ip-SLUG. - Masuk ke VM lewat IAP dan pastikan Docker serta gcloud CLI terpasang.
- Pastikan dua firewall bersama sudah tersedia.
| Checkpoint | Perintah atau bukti | Hasil |
|---|---|---|
VM berstatus RUNNING |
gcloud compute instances describe |
|
Tipe mesin e2-medium |
Kolom machineType.basename() |
|
| Alamat IP sudah statis | gcloud compute addresses describe menampilkan status: IN_USE |
|
| Docker Compose aktif di VM | sudo docker compose version |
|
| Firewall bersama terlihat | gcloud compute firewall-rules list --filter |
Catat juga slug asisten lain yang sudah memakai nama serupa, supaya tumbukan nama bisa dikesan lebih awal.
| Slug lain yang sudah dipakai | Nama resource yang bertabrakan |
|---|---|
7. Uji 3: Clone fork dan nyalakan GeoServer
Section titled “7. Uji 3: Clone fork dan nyalakan GeoServer”- Clone fork ke VM lewat HTTPS tanpa token, lalu
cp .env.example .env. - Pastikan
git remote -vmenunjuk ke fork sendiri, bukan ke repository instruktur. - Isi
.env:NEXTJS_IMAGE=nginx:1.27-alpine, dua secret,GEOSERVER_ADMIN_PASSWORD,NEXTAUTH_URLdanBASE_URLmemakai IP VM. - Jalankan
sudo docker compose up -d --no-deps geoserver nginxsupayanextjstidak ikut ditarik. - Periksa
nginx_proxyberstatusrunning, bukanExited. Kalau keluar dengan kode 1, berarti polaresolverbelum ada dinginx.conf. - Jalankan
sudo docker compose up -d geoserver nginx. - Pastikan
geoserver_appberstatusrunning, bukanrestarting.
| Checkpoint | Perintah atau bukti | Hasil |
|---|---|---|
| Clone berhasil tanpa prompt | Keluaran git log --oneline -1 di VM |
|
| Remote menunjuk ke fork sendiri | Keluaran git remote -v |
|
| Tiga container terdaftar | Keluaran sudo docker compose ps menampilkan nextjs_portal, geoserver_app, dan nginx_proxy |
|
| GeoServer selesai boot | Log memuat Server startup in |
|
| Memori terpakai tiga container | Keluaran free -h dan sudo docker stats --no-stream. Acuan terukur: GeoServer 882 MiB dari batas 2048 MiB |
Catat waktu boot GeoServer, karena inilah beban terberat pada e2-medium.
| Percobaan | Waktu sampai Server startup in |
Catatan |
|---|---|---|
| Pertama | ||
| Setelah restart |
8. Uji 4: Cloud Build dan halaman portal
Section titled “8. Uji 4: Cloud Build dan halaman portal”- Hubungkan fork ke Cloud Build sampai berstatus
COMPLETE. - Simpan trigger dengan empat substitution variable.
- Push commit dari laptop, bukan dari VM.
- Tunggu seluruh step hijau.
- Buka
http://IP_EKSTERNAL_VM/portal. - Pastikan tidak ada
ERR_TOO_MANY_REDIRECTS.
| Checkpoint | Perintah atau bukti | Hasil |
|---|---|---|
GitHub connection COMPLETE |
Halaman Cloud Build Repositories | |
| Build hijau | Status trigger terakhir | |
NEXTJS_IMAGE terisi |
sudo grep '^NEXTJS_IMAGE=' /opt/webgis/app/.env |
|
| Tag image sama dengan commit | gcloud artifacts docker images list menampilkan tag berupa commit SHA, bukan latest |
|
| Halaman portal terbuka | Keluaran curl -sSIL --max-redirs 3 |
|
| Halaman refresh tanpa redirect loop | Percobaan di browser |
Isi tabel berikut untuk melacak apakah push satu asisten mengubah VM asisten lain. Kolom
VM lain seharusnya tetap pada commit lama. Isi baris VM lain dari pemeriksaan slug
asisten lain yang sudah selesai lebih dahulu.
| Asisten yang push | Commit | VM sendiri berubah | VM lain berubah |
|---|---|---|---|
9. Uji 5: GeoServer dan unggah data spasial
Section titled “9. Uji 5: GeoServer dan unggah data spasial”Ini bagian yang paling penting untuk diulang di VM sendiri, karena jalur GeoServer paling panjang dan paling sering memunculkan kendala.
- Buka
http://IP_EKSTERNAL_VM/geoserver/web. - Login memakai
GEOSERVER_ADMIN_PASSWORD, bukangeoserver. - Buat workspace
geoportal. - Salin
public/data/batas_admin.zipke container lalu ekstrak, karena store GeoJSON tidak tersedia. - Tambahkan store Shapefile dengan Data Source Name
batas_admin. - Publish layer, dan pastikan Feature Type Details memuat kolom bertipe Geometry.
- Berikan izin
ReadkepadaROLE_ANONYMOUS. - Panggil endpoint WFS dan pastikan jawabannya berisi
features. - Restart container GeoServer dan pastikan layer tetap ada.
| Checkpoint | Perintah atau bukti | Hasil |
|---|---|---|
| Halaman admin GeoServer terbuka | Tangkapan halaman /geoserver/web |
|
| Login memakai kata sandi sendiri berhasil | Halaman beranda GeoServer | |
Workspace geoportal tersimpan |
Daftar Workspaces | |
Layer geoportal:batas_admin tersimpan |
Daftar Layers | |
| Kolom geometri dikenali | Feature Type Details memuat kolom bertipe Geometry | |
| Layer bisa dibaca tanpa login | Keluaran WFS GetFeature berisi FeatureCollection |
|
| Layer bertahan setelah restart | Keluaran WFS setelah restart |
Catat juga jalur yang gagal, karena jalur gagal lebih berguna daripada jalur yang berhasil.
| Jalur yang dicoba | Hasil | Pesan error |
|---|---|---|
/geoserver/web tanpa slash |
||
/geoserver/web/ dengan slash |
||
/geoserver/wfs |
Catatan dari pengujian 11 September 2026. Jalur yang berhasil dipakai adalah
/geoserver/web tanpa slash, karena GeoServer mengalihkan bentuk berslash ke bentuk tanpa
slash. Store GeoJSON tidak tersedia pada instalasi bawaan, sehingga data diubah menjadi
shapefile lebih dahulu. Layer hasil unggahan bertahan setelah container di-restart.
10. Uji 6: Beban memori pada spesifikasi default
Section titled “10. Uji 6: Beban memori pada spesifikasi default”Spesifikasi default sengaja dipertahankan supaya kendala nyata muncul. Jangan menaikkan tipe mesin sebelum tabel ini terisi.
Angka pada kolom acuan berasal dari pengukuran nyata 11 September 2026 pada satu VM
e2-medium dengan tiga container berjalan. Pakai sebagai pembanding, bukan target.
| Metrik | Acuan terukur | Hasil pengukuranmu |
|---|---|---|
Memori tersedia (free -h) |
2,3 GiB dari 3,8 GiB | |
Memori GeoServer (docker stats) |
882 MiB dari batas 2048 MiB | |
Memori Next.js (docker stats) |
46 MiB | |
Memori Nginx (docker stats) |
4 MiB | |
OOMKilled ketiga container |
false |
|
| Waktu boot GeoServer | 46.996 ms |
Keputusan yang diambil setelah pengukuran:
- Heap
2048mdipertahankan karena masih aman, dengan pemakaian jauh di bawah batas. - Heap diturunkan ke
1024mkarena munculOOMKilled. - Tipe mesin dinaikkan ke
e2-standard-2karena heap serendah apa pun tidak cukup.
Alasan keputusan:
11. Uji 7: Hentikan VM
Section titled “11. Uji 7: Hentikan VM”Jalankan penghentian VM setelah pengukuran pada bagian 12 selesai, karena lima VM harus menyala bersamaan untuk pengukuran itu.
- Hentikan VM milik sendiri setelah pengukuran selesai.
- Pastikan status
TERMINATED. - Periksa Billing Reports untuk memastikan tidak ada biaya compute yang berjalan.
- Pastikan static IP dan disk diperhitungkan dalam pemeriksaan biaya.
| VM | Commit terakhir | Status akhir | Catatan biaya |
|---|---|---|---|
12. Uji bareng: lima VM dalam satu project
Section titled “12. Uji bareng: lima VM dalam satu project”Bagian ini dikerjakan setelah kelima asisten menyelesaikan uji 1 sampai uji 6. Tujuannya
menjawab satu pertanyaan: apakah satu project dengan lima VM e2-medium yang menjalankan
Next.js dan GeoServer pada spesifikasi default masih berjalan wajar. Pengukuran ini tidak
perlu build serentak, cukup kelima VM hidup pada waktu yang sama.
Langkah
Section titled “Langkah”- Setiap asisten menyalakan VM miliknya dengan
gcloud compute instances start "$VM_NAME" --zone="$ZONE". - Setiap asisten memastikan tiga container berjalan dengan
sudo docker compose ps. - Setiap asisten memeriksa
/portaldan/geoserver/webmiliknya, lalu mencatat waktu respons yang terasa. Pemeriksaan bisa lewat alamat IP publik atau lewat terowongan IAP. - Akun koordinator menjalankan pemeriksaan terpusat di bawah ini.
PROJECT_ID="geoportal-kelompok-a-xxxxx"
# Seluruh VM harus berstatus RUNNING pada saat yang samagcloud compute instances list \ --filter="name~'^webgis-'" \ --format="table(name,zone,status,machineType.basename())"
# Periksa kuota region. Ketiga baris ini yang menentukan berapa VM masih bisa dibuat.gcloud compute regions describe asia-southeast2 --format=json \ | python3 -c 'import json,sysfor q in json.load(sys.stdin)["quotas"]: m = q["metric"] if any(k in m for k in ("CPUS","ADDRESSES","INSTANCES","SSD","DISKS")): print("%-26s %7s / %s" % (m, q["usage"], q["limit"]))'
gcloud compute project-info describe --format=json \ | python3 -c 'import json,sysfor q in json.load(sys.stdin)["quotas"]: if "CPUS" in q["metric"]: print("%-26s %7s / %s" % (q["metric"], q["usage"], q["limit"]))'Catatan pembacaan kuota: nilai CPUS dan CPUS_ALL_REGIONS baru diperbarui beberapa menit
setelah VM dibuat, sedangkan INSTANCES dan kuota disk langsung berubah. Jangan menyimpulkan
apa pun dari selisih CPU kalau VM baru saja dibuat.
Tabel pengukuran bersama
Section titled “Tabel pengukuran bersama”Isi satu baris per asisten pada waktu pengukuran yang sama.
| Asisten | VM | Status VM | Container jalan | Respons /portal |
Respons /geoserver/web |
OOMKilled |
Catatan |
|---|---|---|---|---|---|---|---|
Hasil yang menentukan keputusan
Section titled “Hasil yang menentukan keputusan”| Pertanyaan | Jawaban | Bukti |
|---|---|---|
| Berapa VM yang berhasil hidup bersamaan? | ||
Apakah kuota alamat IP publik cukup, atau ada VM yang harus memakai --no-address? |
||
| Apakah ada VM yang kehabisan memori saat lima VM hidup? | ||
Apakah waktu buka /geoserver/web masih wajar? |
||
| Apakah Cloud Build satu asisten mengganggu VM asisten lain? |
Kesimpulan bersama:
- Lima VM
e2-mediumaman dengan spesifikasi default. - Lima VM aman, tetapi heap GeoServer perlu diturunkan ke
1024m. - Lima VM tidak aman, perlu naik ke
e2-standard-2atau pembagian project tambahan.
13. Lembar temuan
Section titled “13. Lembar temuan”Setiap temuan baru ditulis ke halaman Troubleshooting GCP bagian 6b, bukan ke berkas baru. Isi tabel berikut lebih dahulu supaya temuan bisa dibahas bersama.
| # | Uji | Gejala | Dugaan penyebab | Solusi yang dicoba | Status |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 3 |
Nilai Status berisi Terbuka, Tertutup, atau Perlu keputusan instruktur.
14. Pertanyaan yang perlu dijawab setelah pengujian
Section titled “14. Pertanyaan yang perlu dijawab setelah pengujian”Lima pertanyaan ini menentukan apakah modul dan panduan perlu direvisi.
- Apakah
e2-mediumcukup untuk tiga container pada data latihan? - Apakah jalur
/geoserver/webbertahan setelah kata sandi GeoServer diganti? - Apakah lima GitHub connection dalam satu project saling mengganggu?
- Apakah satu project cukup untuk lima VM yang hidup bersamaan?
- Apakah undangan lima email pada satu project menimbulkan kendala IAM?
Jawaban singkat beserta bukti:
| Pertanyaan | Jawaban | Bukti |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 |
Bukti tambahan: alert downtime portal
Section titled “Bukti tambahan: alert downtime portal”Hasil uji Dhany 13 September 2026 dicatat pada
workbook-dhanypedia.md. Pemantauan akses portal melalui Nginx sudah
teruji; pemeriksaan database dan layanan lain secara terpisah belum tercakup.
Untuk tiap asisten, catat project/VM/check/policy ID, konfigurasi condition, waktu stop, respons gagal, waktu incident baru dan email firing, waktu start dan HTTP 200, serta email recovered untuk incident yang sama. Bedakan durasi incident dengan latensi notifikasi.