Docker Compose v2
Runbook instalasi AlurKerja on-premises di mesin lokal menggunakan CLI build-alurkerja. Dua fase otomatis dan idempoten — Setup (5 step, +1 di Windows) lalu Install yang dirakit sesuai konfigurasi, dari download code sampai semua container jalan di domain lokal ber-HTTPS.
A. Ringkasan & Definition of Done
Panduan ini menjalankan AlurKerja on-premises di mesin lokal menggunakan alurkerja-cli — CLI untuk operasional AlurKerja dengan command utama build-alurkerja. Command ini berjalan dua fase: Setup (5 step tetap, +1 khusus Windows) lalu Install yang dirakit sesuai konfigurasi — step yang tidak relevan (mis. Start postgres saat memakai database eksternal) tidak muncul sama sekali. Pipeline idempoten: step yang sudah selesai otomatis di-SKIP, jadi kalau gagal di tengah cukup jalankan ulang setelah masalahnya diatasi — tidak ada yang dikerjakan dua kali.
Halaman ini berlaku untuk CLI versi terbaru. Pastikan yang terpasang memang versi itu: alurkerja --version mencetak Alurkerja CLI v… beserta commit dan tanggal build. Kalau perintah tersebut ditolak — atau summary build menutup dengan NOTICE deprecation — yang terpasang masih CLI generasi lama; pasang ulang lewat Step 5.1, yang otomatis menyingkirkan binary lama dari PATH.
Definition of Done (DoD) — instalasi dianggap selesai bila:
- Pipeline
build-alurkerjaselesai sampai step Summary dan menampilkan daftar URL akses. - Semua container dalam state
running(docker compose pstanpaExited/Restarting). - Aplikasi dapat diakses di
https://alurkerja.local:8100dan Keycloak dihttps://alurkerja.local:8100/sso(skema domain lokal bawaan — lihat Section J).
Estimasi waktu eksekusi: ±20 menit untuk build pertama, paling lama di pull image (tergantung kecepatan internet). CLI menampilkan estimasi total di awal, estimasi per step di header-nya, dan durasi aktual tiap step selesai.
Sebelum mulai, download template logbook: alurkerja-install-docker-checklist-v2.xlsx. File ini sinkron 1:1 dengan nomor langkah di halaman ini — isi sambil eksekusi sebagai bukti audit dan referensi untuk instalasi berikutnya.
B. Prasyarat
Langkah 1–4 memastikan environment siap. Hentikan dan perbaiki bila ada langkah yang gagal — jangan lanjut sebelum prasyarat terpenuhi.
1. Verifikasi Docker Desktop berjalan
Aksi
docker version --format '{{.Server.Version}}'
docker compose versionExpected output
Versi Docker Engine dan Docker Compose version v2.x tampil tanpa error.
Jika gagal: pastikan Docker Desktop sudah terinstall dan dalam keadaan berjalan (ikon whale aktif). Di Linux, Docker Engine + plugin
docker-compose-pluginjuga bisa dipakai. Pipeline membutuhkandocker compose(V2, plugin) — bawaan Docker Desktop terbaru.
2. Verifikasi Git terpasang — opsional
Aksi
git --versionExpected output
git version 2.x.x atau lebih baru.
Perhatian: pipeline instalasi tidak membutuhkan git — code diunduh sebagai zip dan CLI hanya memeriksa docker beserta plugin compose. Git tetap berguna untuk command lain (mis.
alurkerja deployment init, yang meng-clone template deployment), jadi langkah ini aman dilewati kalau tujuannya hanya instalasi.
Jika gagal: install Git dari git-scm.com (Windows) atau
xcode-select --install/ Homebrew (macOS).
3. Verifikasi akun Harbor
Aksi
Pastikan kamu punya username + password Harbor yang valid (dipakai CLI untuk docker login dan pull image).
Expected output
Credential Harbor tersedia.
Jika gagal: minta credential Harbor ke tim Javan — registry image AlurKerja terpusat di
harbor.merapi.javan.id.
4. Verifikasi free storage minimal 8 GB
Aksi
Pastikan drive tempat folder download punya minimal 8 GB free — image docker ±5 GB (29 image: postgres, keycloak, nginx, minio, mailpit, service AlurKerja, dll.) + ruang ekstrak saat pull + volume + code.
Get-PSDrive C # lihat kolom Free — sesuaikan huruf drive tujuandf -h ~ # lihat kolom AvailExpected output
Free space drive tujuan minimal 8 GB.
Perhatian: CLI juga menampilkan kebutuhan ini di awal dan memberi warning kalau drive folder download kurang dari 8 GB.
C. Instalasi & Jalankan CLI
Langkah 5 punya dua cabang — pilih salah satu: 5.1 instalasi cepat (otomatis) atau 5.2 download manual. Keduanya berakhir sama: CLI terpasang dan pipeline build-alurkerja berjalan.
Perhatian: pipeline idempoten — aman dijalankan ulang kapan pun. Step yang sudah selesai ditandai SKIP.
5.1. Instalasi cepat (otomatis)
Aksi
Jalankan installer satu baris sesuai OS. Installer mendeteksi OS & arsitektur, mengunduh binary yang cocok, memasangnya ke PATH sebagai alurkerja, lalu langsung menjalankan build-alurkerja — tidak perlu Step 5.2, langsung lanjut ke Step 6:
irm https://cli.alurkerja.com/install.ps1 | iexcurl -fsSL https://cli.alurkerja.com/install.sh | bashExpected output
Baris Platform & Install Dir tampil, checksum binary diverifikasi (Checksum verified.), lalu Installed: <path> — CLI mendarat di ~/.alurkerja/bin (Windows: %USERPROFILE%\.alurkerja\bin) dan pipeline build-alurkerja langsung berjalan.
Perhatian: installer menolak melanjutkan kalau checksum tidak bisa diambil atau tidak cocok — binary yang belum terverifikasi tidak pernah mendarat di PATH. Binary
alurkerjalain yang sudah ada di PATH (mis. shim npm atau CLI generasi lama) dihapus supaya tidak menutupi yang baru.
Perhatian: perlu menjalankan ulang nanti? CLI sudah terpasang di PATH — cukup jalankan
alurkerja build-alurkerja. Pipeline idempoten — aman dijalankan ulang kapan pun; step yang sudah selesai ditandai SKIP. Untuk naik ke versi CLI terbaru, jalankan lagi one-liner di atas: installer membandingkan checksum dan melewati download kalau binary sudah paling baru.
5.2. Download manual & jalankan binary
Aksi
Alternatif bila tidak memakai instalasi cepat (Step 5.1). Klik binary sesuai OS — semuanya dari distribusi resmi CLI:
| OS / arsitektur | Binary |
|---|---|
| Windows 64-bit | alurkerja-windows-amd64.exe |
| macOS (Intel) | alurkerja-darwin-amd64 |
| macOS (Apple Silicon) | alurkerja-darwin-arm64 |
| Linux 64-bit | alurkerja-linux-amd64 |
| Linux ARM64 | alurkerja-linux-arm64 |
Windows 32-bit tidak lagi didukung. Checksum resminya ada di checksums.txt — cocokkan sebelum menjalankan binary, karena jalur manual ini tidak memverifikasinya untuk kamu:
(Get-FileHash -Algorithm SHA256 .\alurkerja-windows-amd64.exe).Hash.ToLower()sha256sum ./alurkerja-linux-amd64 # macOS: shasum -a 256 ./alurkerja-darwin-arm64Bandingkan hasilnya dengan baris file yang bersangkutan di checksums.txt; kalau berbeda, jangan dijalankan — download ulang.
Di macOS/Linux, beri permission executable (dan lepas quarantine di macOS):
chmod +x ./alurkerja-darwin-arm64
xattr -d com.apple.quarantine ./alurkerja-darwin-arm64 # macOS sajaLalu jalankan command build-alurkerja dari binary yang di-download:
.\alurkerja-windows-amd64.exe build-alurkerja./alurkerja-darwin-arm64 build-alurkerjaSesuaikan nama binary dengan yang di-download (mis. alurkerja-darwin-amd64, alurkerja-linux-amd64).
Expected output
File binary ter-download, lalu pipeline mulai berjalan dan menampilkan fase Setup.
D. Eksekusi Pipeline build-alurkerja
6. Isi input yang diminta
Aksi
Semua kredensial bisa lewat prompt interaktif (password tersembunyi) atau flag. Input utama:
| Flag | Prompt | Kegunaan |
|---|---|---|
--harbor-user | Harbor username | docker login |
--harbor-password | Harbor password | docker login |
--dir | Folder download | Lokasi code. Tanpa flag: muncul prompt — enter kosong memakai folder saat ini. Kalau folder saat ini bermasalah (folder sistem seperti C:\Windows/Program Files, OneDrive, atau non-kosong yang bukan hasil download lama), muncul warning tanpa menghentikan CLI — cukup ketik lokasi lain di prompt yang sama. Folder ketikan dipakai apa adanya (tanpa subfolder) dengan validasi yang sama; folder tujuan dites tulis sebelum download. |
Lalu di Setup features (Setup step 3) muncul satu layar toggle untuk 5 resource: panah atas/bawah pindah baris, enter/spasi mengganti local↔external, enter di Continue melanjutkan (terminal non-interaktif: menu bernomor per fitur). Default semua local (container bawaan) — untuk instalasi standar cukup langsung Continue. Resource yang di-set external ditanya detail koneksinya (langsung dites, fail-fast) dan container bawaannya tidak dijalankan:
| Resource | Toggle flag | Flag detail (mode external) | Catatan mode external |
|---|---|---|---|
| Storage | --storage | --s3-endpoint, --s3-access-key, --s3-secret-key, --s3-bucket | Server MinIO/S3 sendiri — bucket harus sudah ada. |
| Database | --database | --db-host, --db-port, --db-user, --db-password, --db-name, --db-keycloak-name | Server PostgreSQL sendiri — user butuh hak CREATE DATABASE; server wajib punya extension pgvector. |
| Keycloak | --keycloak | --keycloak-url, --keycloak-setup (script/manual) + kredensial admin atau 5 nilai realm/client | Satu URL publik yang terjangkau browser & container. |
| SMTP | --smtp | --smtp-host, --smtp-port, --smtp-user, --smtp-password, --smtp-from | Kosongkan username untuk relay tanpa auth. |
| Redis | --redis | --redis-host, --redis-port, --redis-password, --redis-db | Kosongkan password untuk Redis tanpa auth. |
Di akhir wizard ada pertanyaan Application secrets: generate otomatis (default) atau masukkan 4 secret existing — --tenant-encryption-key, --tenant-encryption-iv, --jwt-secret, --jwt-refresh-secret (base64, input tersembunyi). Wajib memakai secret yang sama saat memakai database bekas instalasi sebelumnya, karena data terenkripsi butuh kunci yang sama. All-or-nothing: isi keempatnya atau tidak sama sekali (parsial = error).
Referensi lengkap semua variabel .env — termasuk mana yang di-generate otomatis oleh installer dan mana yang diisi user — ada di Section H.
Expected output
Semua prompt terisi dan layar fitur dikonfirmasi — pipeline lanjut ke fase Install dengan estimasi total dan daftar step hasil rakitan.
Perhatian: fitur yang sudah ditentukan lewat flag tidak muncul lagi di layar toggle. Pada instalasi existing (
.envsudah ada), CLI menawarkan tiga pilihan: Do nothing (konfigurasi saat ini dipertahankan), Reconfigure features, atau Update the public domain — yang terakhir keluar dari pipeline install dan menjalankan jalur ganti domain (Section J). Kembali ke mode local kapan pun — nilai.envterkait dikembalikan ke bawaan lokal otomatis. Detail lengkap tiap mode external (nilai.envyang ditulis, perilaku container) ada di README repoalurkerja-cli.
7. Pantau pipeline sampai selesai
Aksi
Biarkan pipeline berjalan. Fase Setup 5 step — 6 di Windows. Semua interaksi dengan user (prompt, wizard, dialog UAC) sengaja dikumpulkan di fase ini supaya fase Install bisa berjalan tanpa ditunggui:
| # | Step | Keterangan |
|---|---|---|
| 1 | Cek prasyarat | Pastikan docker (daemon jalan) dan docker compose tersedia, lalu login Harbor — kredensial diminta di sini, tidak di tengah pipeline. SKIP kalau semua sudah siap. |
| 2 | Download release-alurkerja-local | Download code (zip) ke folder pilihan (lihat Step 6). Kalau code sudah ada: hanya refresh config/*.sql — file lain termasuk .env tidak disentuh, supaya update schema selalu terbawa. |
| 3 | Setup features | Layar toggle 5 resource + pertanyaan Application secrets di akhir (lihat Step 6). Instalasi existing: Do nothing, Reconfigure features, atau Update the public domain. |
| 4 | Register local domains in hosts file | Domain yang masih bawaan .env.example (alurkerja.local, microsite-alurkerja.local, minio-alurkerja.local) didaftarkan ke 127.0.0.1 — butuh admin/root (UAC di Windows, sudo di macOS/Linux). Entri yang sudah ada → SKIP tanpa prompt; domain kustom dilewati (DNS urusan operator). Gagal = warning + baris manual, pipeline lanjut. |
| 5 | Setup local HTTPS (mkcert) | Unduh mkcert (versi ter-pin, checksum diverifikasi), pasang root CA ke trust store OS, terbitkan sertifikat untuk ketiga domain di atas, tulis nginx/tls/tls.conf + docker-compose.override.yml (bundle CA untuk container), lalu antre PUBLIC_SCHEME=https, WS_SCHEME=wss, NGINX_PUBLIC_TARGET=443 ke .env. Code lama tanpa NGINX_PUBLIC_TARGET di .env.example → dilewati, instalasi tetap http. |
| 6 | Reserve ports 8100–8109 | Windows saja. netsh ... add excludedportrange lewat PowerShell elevated supaya Hyper-V/WSL tidak mencaplok rentang port setelah reboot. Sudah terreservasi → SKIP; UAC ditolak/gagal → warning, pipeline lanjut. |
Fase Install dirakit dari hasil Setup — jumlah step menyesuaikan konfigurasi:
| Step | Kapan ada | Keterangan |
|---|---|---|
| Stop stack lama | Selalu | Down project compose bernama sama dari folder lain — sisa download lama. Volume tidak dihapus. SKIP kalau tidak ada. |
Copy .env.example → .env | Hanya kalau .env belum ada | Editan manual tidak pernah ditimpa. |
Apply features ke .env | Hanya kalau ada nilai fitur untuk ditulis | Menulis env hasil Setup features (Do nothing = step ini tidak ada). |
| Cek port bentrok | Selalu | Fail-fast dengan pesan siapa pemegang portnya; stack ini sendiri tidak dihitung. |
| Start postgres | Hanya mode DB local | docker compose up -d postgres + tunggu ready. |
| Init database | Selalu | Membuat database + schema. SKIP kalau keycloak_db sudah ada. |
| Setup pgvector | Hanya mode DB eksternal | Verifikasi paket extension vector tersedia di server — fail-fast dengan petunjuk instalasi kalau belum. |
| Load public schema, lalu Load camunda schema | Selalu (dua step terpisah) | SQL idempoten — update schema terpasang di run ulang tanpa kehilangan data. |
| Pull Image | Selalu | Download semua image (bagian terlama); service yang di-exclude tidak di-pull. |
| Start nginx(, keycloak), tools | Selalu | Keycloak eksternal: step-nya tanpa keycloak. |
| Setup Keycloak | Kecuali Keycloak eksternal + manual | Menjalankan scripts/setup-keycloak.sh di container tools. |
| Generate secrets | Selalu | openssl rand -base64 di container tools untuk TENANT_SETTINGS_ENCRYPTION_KEY, TENANT_SETTINGS_ENCRYPTION_IV, JWT_SECRET, JWT_REFRESH_SECRET. Hanya nilai kosong / masih placeholder yang diganti — nilai hasil generate sebelumnya tidak pernah di-rotate. |
Update .env | Selalu | Menulis nilai keycloak (dari script atau input manual). |
| Start All | Selalu | docker compose up -d --force-recreate dengan .env final; service excluded di-stop. |
| Summary | Selalu | Menampilkan daftar URL akses. |
Alur untuk mode default (semua resource local):
Expected output
Step Summary tampil dengan daftar URL akses.
Jika gagal: baca pesan errornya, perbaiki penyebabnya (mis. Docker belum jalan), lalu jalankan ulang command yang sama — step yang sudah beres di-SKIP. Lihat juga Section F.
E. Verifikasi & Akses Pertama Kali
8. Validasi semua container running
Aksi
Dari folder download (lihat lokasi yang dipilih di Step 6):
docker compose psExpected output
Semua container berstatus running/healthy — tidak ada Exited atau Restarting.
Jika gagal: kalau ada container yang crash loop, cek log:
docker compose logs --tail=50 <service>.
9. Akses aplikasi
Aksi
Buka URL berikut di browser (sesuai output Summary). Port diambil dari .env: AK_PORT_NGINX untuk semua URL web (default 8100) dan AK_PORT_POSTGRES untuk database (default 8101) — resource yang di-set eksternal tampil dengan alamat eksternalnya.
Instalasi bawaan memakai domain lokal + HTTPS: CLI mendaftarkan ketiga domain ke hosts file dan menerbitkan sertifikat mkcert, jadi semua URL memakai https dan modul-modul utama berbagi satu domain sebagai subpath.
| Service | URL | Credential |
|---|---|---|
| Database | localhost:8101 | postgres / JelasAlurnya |
| App | https://alurkerja.local:8100 | — |
| Studio | https://alurkerja.local:8100/studio | — |
| Compro | https://alurkerja.local:8100/compro | — |
| Simulation | https://alurkerja.local:8100/simulation | — |
| BE (API) | https://alurkerja.local:8100/api/v1 | — |
| API Docs | https://alurkerja.local:8100/studio/apidocs | — |
| Keycloak (SSO) | https://alurkerja.local:8100/sso | admin-keycloak / JelasAlurnya |
| Camunda | https://alurkerja.local:8100/camunda | admin-camunda / JelasAlurnya |
| Mailpit | https://alurkerja.local:8100/mailpit | — |
| Microsite | https://microsite-alurkerja.local:8100 | — |
| Minio (API) | https://minio-alurkerja.local:8100 | — |
| Minio (Console) | https://minio-alurkerja.local:8100/console | admin-minio / JelasAlurnya |
Kredensial di atas adalah default .env.example — sengaja seragam (JelasAlurnya) supaya instalasi lokal gampang. Begitu instance-nya bisa dijangkau orang lain, ganti dulu di .env (POSTGRES_PASSWORD, KEYCLOAK_ADMIN_PASSWORD, MINIO_SECRET_KEY, CAMUNDA_PASSWORD) sebelum dipakai.
Nilai domain dibaca dari .env (NGINX_DOMAIN, MICROSITE_DOMAIN, MINIO_DOMAIN) — kalau diubah, seluruh URL di atas ikut. Keycloak tidak punya host sendiri: ia subroute /sso di domain utama (SSO_DOMAIN=${NGINX_DOMAIN}${PUBLIC_PORT_SUFFIX}/sso).
Expected output
Halaman App ter-render di https://alurkerja.local:8100 tanpa peringatan sertifikat (root CA mkcert sudah dipercaya) dan admin console Keycloak terbuka di https://alurkerja.local:8100/sso.
Perhatian: mau memakai domain sendiri (mis.
alurkerja.dev) alih-alih domain lokal? Prosedur dan peta URL-nya ada di Section J.
Perhatian: operasi setelah instalasi — menghidupkan/mematikan stack, mengosongkan data, sampai menghapus tuntas service dan CLI — ada di Section I. Lifecycle Service.
F. Troubleshooting
- Gagal di tengah? Baca pesan errornya, perbaiki penyebabnya (mis. Docker belum jalan), lalu jalankan ulang — step yang sudah beres di-SKIP.
- Port bentrok? Step Cek port bentrok menyebutkan pemegang portnya. Stack AlurKerja lama dengan nama berbeda: matikan dengan
docker compose -p <nama-project> down; proses non-Docker: tutup aplikasinya dulu. - Proses terputus saat init database? Cukup jalankan ulang — step Load public & camunda schema selalu diulang dan idempoten. Kasus sangat jarang:
init_dbterputus tepat setelah membuatkeycloak_dbtapi sebelum schemacamundadibuat → drop databasekeycloak_dblalu jalankan ulang. - Error
$'\r': command not foundsaat setup Keycloak: folder download warisan lama masih ber-CRLF. Hapus folder itu lalu jalankan ulang — download baru selalu LF.
Lihat juga Handbook Troubleshooting untuk daftar lebih luas.
G. Logbook Instalasi
Template berikut sinkron 1:1 dengan nomor langkah di halaman ini.
| No | Section | Aksi | Hasil | Bukti | PIC | Catatan |
|---|---|---|---|---|---|---|
| 1 | Prasyarat | Verifikasi Docker Desktop berjalan | ||||
| 2 | Prasyarat | Verifikasi Git terpasang | ||||
| 3 | Prasyarat | Verifikasi akun Harbor | ||||
| 4 | Prasyarat | Verifikasi free storage minimal 8 GB | ||||
| 5.1 | Instalasi | Instalasi cepat (otomatis: install + jalankan build-alurkerja) | ||||
| 5.2 | Instalasi | Download manual & jalankan binary build-alurkerja | ||||
| 6 | Eksekusi | Isi input yang diminta | ||||
| 7 | Eksekusi | Pantau pipeline sampai selesai (step Summary) | ||||
| 8 | Verifikasi | Validasi semua container running | ||||
| 9 | Verifikasi | Akses aplikasi |
H. Variabel Environment
Referensi status semua variabel .env (file tunggal di root folder download). Status ditentukan bukan sekadar "ada isinya di .env" — tapi dari nalar: apakah service benar-benar berhenti/rusak tanpanya, atau tetap jalan dengan fallback/fitur nonaktif. Variabel alias (mis. DB_USER=${POSTGRES_USER}) mengikuti status sumbernya dan ditandai (alias, otomatis) — tidak perlu diisi manual terpisah.
- Wajib — tanpa nilai yang benar, service terkait gagal start atau fitur intinya patah.
- Optional — sudah ada default yang aman, atau memang integrasi/fitur tambahan yang boleh dikosongkan (fitur terkait nonaktif secara aman, bukan error).
- Tanda (installer: …) — nilai ini di-generate/ditulis otomatis oleh installer
alurkerja-cli(build-alurkerja): nilai Keycloak darisetup-keycloak.shdan application secrets dari step Generate secrets. Jangan diisi manual duluan — installer hanya mengisi nilai yang masih kosong/placeholder dan tidak pernah me-rotate nilai yang sudah ada. Variabel tanpa tanda ini diisi user (langsung di.env, atau lewat wizard/flag installer untuk mode eksternal). Instalasi manual tanpa CLI: semua diisi sendiri.
1. Database Configuration (PostgreSQL)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
POSTGRES_USER | User Postgres untuk container internal | Wajib | postgres |
POSTGRES_PASSWORD | Password Postgres container internal | Wajib | JelasAlurnya (default lokal — ganti untuk instance yang bisa dijangkau orang lain) |
POSTGRES_DB | Nama database aplikasi utama | Wajib | alurkerja_db |
POSTGRES_PORT | Port Postgres di host | Optional | 5432 (ubah hanya kalau bentrok port lain) |
DB_HOST | Host yang dipakai semua service utk connect DB | Wajib | postgres (nama container) |
DB_PORT | Port yang dipakai service utk connect DB | Wajib | 5432 |
DB_USER | Username DB dipakai service | Wajib (alias POSTGRES_USER, otomatis) | - |
DB_PASSWORD | Password DB dipakai service | Wajib (alias POSTGRES_PASSWORD, otomatis) | - |
DB_NAME | Nama DB dipakai service | Wajib (alias POSTGRES_DB, otomatis) | - |
DB_SCHEMA | Schema default | Optional | public (sudah sesuai public.sql) |
DB_SSLMODE | Mode SSL koneksi DB | Optional | disable (ubah ke require/verify-full kalau Postgres eksternal mewajibkan SSL) |
DB_MAX_OPEN / DB_MAX_IDLE / DB_LIFETIME | Tuning connection pool | Optional | sudah ada default aman |
CAMUNDA_DB_USERNAME / CAMUNDA_DB_PASSWORD | Kredensial DB khusus Camunda | Wajib | - |
CAMUNDA_DB_URL | JDBC URL Camunda ke Postgres | Wajib | - |
KEYCLOAK_DB_NAME | Nama database terpisah untuk Keycloak | Wajib | keycloak_db (dibuat otomatis oleh init_db.sql) |
DB_ADDR | DSN format Go untuk tool migration | Wajib | - |
Prasyarat Schema Database (public.sql) — Extension pgvector
config/public.sql (schema utama) butuh extension pgvector (vector) dan pg_trgm aktif di server PostgreSQL sebelum dijalankan — dipakai untuk kolom embedding (knowledge_chunks) dan pencarian trigram. Script ini sudah punya pre-flight check di baris awal yang akan gagal dengan pesan jelas kalau extension belum tersedia, daripada error samar di tengah jalan.
Postgres internal (docker-compose bawaan): sudah otomatis tersedia — service postgres di docker-compose.yml memakai image pgvector/pgvector:pg16 (bukan postgres:16-alpine polos). Tidak perlu langkah tambahan.
Postgres eksternal (mode --database external / managed sendiri): pgvector harus sudah terpasang/aktif di server tersebut sebelum menjalankan public.sql:
- Managed cloud Postgres (AWS RDS/Aurora, Supabase, Neon, Google Cloud SQL, Azure Database for PostgreSQL Flexible Server, dll) — pgvector biasanya sudah tersedia dari provider, cukup pastikan bisa
CREATE EXTENSION vector;(script ini sudah melakukannya otomatis). - Server self-managed (VM/bare metal sendiri) — install manual dulu mengikuti dokumentasi resmi pgvector.
2. Keycloak Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
KEYCLOAK_URL | URL server Keycloak | Wajib (turunan, otomatis) | ${SSO_ORIGIN} → https://alurkerja.local:8100/sso. Jangan diedit langsung — pindahkan SSO lewat SSO_DOMAIN (grup #19). |
KEYCLOAK_REALM | Nama realm Keycloak | Wajib (installer: hasil setup-keycloak.sh) | alurkerja |
KEYCLOAK_CLIENT | Client ID Keycloak (confidential) | Wajib (installer: hasil setup-keycloak.sh) | onprem |
KEYCLOAK_CLIENT_SECRET | Client secret, dipakai backend validasi token | Wajib (installer: hasil setup-keycloak.sh; mode Keycloak eksternal + manual: diisi user) | - |
KEYCLOAK_ADMIN_USER / KEYCLOAK_ADMIN_PASSWORD | Kredensial admin, dipakai provisioning realm otomatis (setup-keycloak.sh) | Wajib | admin-keycloak / JelasAlurnya (default lokal — ganti untuk instance yang bisa dijangkau orang lain) |
KEYCLOAK_BASE_URL | Alias KEYCLOAK_URL utk service lain | Wajib (alias, otomatis) | - |
KEYCLOAK_CLIENT_ID | Alias KEYCLOAK_CLIENT | Wajib (alias, otomatis) | - |
KEYCLOAK_USE_JWKS_URL | Paksa pakai JWKS URL manual | Optional | false (biarkan false agar dibentuk otomatis dari BASE_URL+REALM) |
KEYCLOAK_ISSUER / KEYCLOAK_JWKS_URL | Override issuer/JWKS manual | Optional | kosong = otomatis |
3. MinIO / Storage Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
MINIO_ENDPOINT | Endpoint MinIO (host:port publik, tanpa scheme) | Wajib (turunan, otomatis) | ${MINIO_DOMAIN}${PUBLIC_PORT_SUFFIX} → minio-alurkerja.local:8100 |
MINIO_ACCESS_KEY / MINIO_SECRET_KEY | Kredensial MinIO | Wajib | admin-minio / JelasAlurnya (default lokal — ganti untuk instance yang bisa dijangkau orang lain) |
MINIO_BUCKET_NAME | Nama bucket utama | Wajib | alurkerja |
MINIO_USE_SSL | Endpoint pakai HTTPS | Optional | false (wajib true kalau endpoint eksternal HTTPS) |
MINIO_BROWSER_REDIRECT_URL | URL publik console MinIO (dipakai console self-reference) | Wajib (turunan, otomatis) | ${MINIO_ORIGIN}/console/ — tanpa ini console patah (CSP/403) |
STORAGE_PROVIDER | Provider storage aktif | Optional | minio (sudah sesuai stack ini) |
STORAGE_BUCKET / STORAGE_KEY / STORAGE_SECRET / STORAGE_HOST / STORAGE_PORT / STORAGE_USE_SSL / STORAGE_URL_PREFIX | Alias MINIO_* untuk service dgn naming beda | Wajib (alias, otomatis) | - |
STORAGE_REGION | Region utk signing S3 SDK | Optional | ap-southeast-3 (MinIO tidak validasi region asli) |
STORAGE_LOCAL_PATH | Path fallback storage lokal | Optional | tidak dipakai selama STORAGE_PROVIDER=minio |
AWS_REGION | Alias STORAGE_REGION utk library S3-compatible tertentu | Optional (alias, otomatis) | - |
MINIO_BUCKET_LOOKUP | Gaya alamat bucket S3 client. Kosongkan untuk MinIO — kosong = perilaku lama, instalasi MinIO yang sudah jalan tidak perlu diubah. Isi dns hanya untuk storage S3-compatible yang mewajibkan alamat virtual-host, mis. Tencent COS. Berlaku di bpm-service, integration-service, report-service, notification-service, tenant-management-service, company-profile-service, helpdesk-react | Optional | kosong |
STORAGE_BUCKET_LOOKUP | Alias fungsional MINIO_BUCKET_LOOKUP untuk go-simulation dan generate-test-service | Optional | kosong = perilaku lama |
4. Redis / Cache Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
REDIS_HOST / REDIS_PORT | Host & port Redis | Wajib | redis / 6379 — caching enabled default (CACHE_ENABLED=true) |
REDIS_PASSWORD | Password Redis | Optional | kosong = tanpa auth (default lokal); isi kalau Redis eksternal butuh auth |
REDIS_DB | Index database Redis | Optional | 0 |
CACHE_PROVIDER | Provider cache aktif | Optional | redis |
CACHE_ENABLED | Aktifkan caching | Optional | true (tidak disarankan dimatikan di produksi, tapi tidak fatal) |
CACHE_TTL / CACHE_MAX_SIZE | Tuning cache | Optional | sudah ada default |
Redis untuk antrean (
REDIS_QUEUE_*, containerredis-queue) adalah instance terpisah dan tidak tercakup tabel di atas — lihat Env Konsolidasi Antrean (asynq).
5. Sentry Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
SENTRY_DSN | DSN error tracking | Optional | kosong = tracking nonaktif meski SENTRY_ENABLED=true |
SENTRY_TOKEN / SENTRY_ORG / SENTRY_PROJECTS | Kredensial otomasi release/source-map upload | Optional | hanya relevan utk CI/CD Sentry |
SENTRY_ENVIRONMENT | Label environment di Sentry | Optional | production |
SENTRY_ENABLED / SENTRY_DEBUG / SENTRY_SEND_DEFAULT_PII / SENTRY_ENABLE_TRACING / SENTRY_TRACES_SAMPLE_RATE / SENTRY_ENABLE_LOGS | Tuning SDK Sentry | Optional | hanya relevan kalau SENTRY_DSN diisi |
6. OpenAI Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
OPENAI_API_KEY | API key OpenAI | Optional | kosong = fitur AI (generate BPMN, dll) nonaktif, bukan blocker core app |
OPENAI_BPMN_MODEL / OPENAI_BPMN_TIMEOUT / OPENAI_BPMN_MAX_TOKENS / OPENAI_BPMN_TEMPERATURE | Tuning model BPMN generation | Optional | hanya relevan kalau API key diisi |
OPEN_AI_API_KEY | Alias OPENAI_API_KEY | Optional (alias, otomatis) | - |
OPEN_AI_PURPOSE_MODEL / OPEN_AI_PURPOSE_TEMPERATURE / OPEN_AI_PURPOSE_MAX_TOKENS / OPEN_AI_PURPOSE_TIMEOUT | Tuning model utk use-case lain | Optional | sama alasan |
7. Email Configuration (Notification & Tenant Management)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
EMAIL_HOST / EMAIL_PORT | Host & port SMTP | Wajib | mailpit / 1025 (SMTP dev bawaan docker-compose) |
EMAIL_USER / EMAIL_PASS | Kredensial SMTP | Optional | kosong valid utk mailpit (tanpa auth); wajib diisi kalau SMTP eksternal butuh auth |
EMAIL_FROM | Alamat pengirim | Wajib | no-reply@alurkerja.com |
MAIL_HOST / MAIL_PORT / MAIL_USERNAME / MAIL_PASSWORD | Alias EMAIL_* utk service dgn naming beda | Mengikuti status EMAIL_* (alias, otomatis) | - |
8. JWT Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
JWT_SECRET | Secret signing token akses | Wajib (installer: generate otomatis — step Generate secrets, atau flag --jwt-secret) | - |
JWT_REFRESH_SECRET | Secret signing refresh token | Wajib (installer: generate otomatis — step Generate secrets, atau flag --jwt-refresh-secret) | - |
JWT_EXPIRATION / JWT_EXPIRES_IN_HOURS / JWT_SESSION_DAYS / JWT_REFRESH_EXPIRATION | Masa berlaku token | Optional | sudah ada default aman |
9. Encryption Configuration (Tenant Settings)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
TENANT_SETTINGS_ENCRYPTION_KEY | Key enkripsi tenant settings (Base64) | Wajib (installer: generate otomatis — step Generate secrets; database bekas: wajib pakai key lama via flag --tenant-encryption-key) | kalau berubah setelah data tersimpan, data lama tidak bisa didekripsi lagi |
TENANT_SETTINGS_ENCRYPTION_IV | IV enkripsi (Base64) | Wajib (installer: generate otomatis — step Generate secrets; database bekas: wajib pakai IV lama via flag --tenant-encryption-iv) | sama alasan |
AES_KEY / AES_IV | Alias TENANT_SETTINGS_ENCRYPTION_KEY/IV | Wajib (alias, otomatis) | sama alasan |
10. Camunda Configuration (Migration Service)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
CAMUNDA_URL | URL Camunda engine-rest | Wajib | - |
CAMUNDA_LOGIN | Aktifkan auth login | Optional | true (tidak disarankan false/tanpa auth) |
CAMUNDA_USERNAME / CAMUNDA_PASSWORD | Kredensial Camunda | Wajib selama CAMUNDA_LOGIN=true (default) | admin-camunda / JelasAlurnya (default lokal — ganti untuk instance yang bisa dijangkau orang lain) |
11. GitLab Configuration (fitur tambahan — incident tracking)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
GITLAB_BASE_URL / GITLAB_TOKEN / GITLAB_PROJECT_ID | Kredensial & target project GitLab | Optional | kosong = integrasi nonaktif |
GITLAB_INCIDENT_TAG | Label tag incident | Optional | incident |
12. Laravel Passport Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
LARAVEL_PASSPORT_ENABLED | Aktifkan Laravel Passport auth | Optional | false (fitur nonaktif) |
LARAVEL_PASSPORT_PRIVATE_KEY_PATH | Path private key | Optional | hanya relevan kalau ENABLED=true |
13. Website / Application URL
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
WEBSITE_URL | Base URL aplikasi (dipakai callback, link email, dll) | Wajib (turunan, otomatis) | ${APP_ORIGIN} → https://alurkerja.local:8100 |
COMPANY_PROFILE_SERVICE_URL | URL internal service company profile | Wajib | http://compro-be:3004 |
14. Service Port Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
AUTH_API_PORT / BPM_API_PORT / TENANT_API_PORT / COMPRO_API_PORT / NOTIFICATION_API_PORT / NOTIFICATION_WS_PORT / INTEGRATION_API_PORT / REPORT_API_PORT / GENERATE_TEST_PORT / PROXY_API_PORT / MIGRATION_API_PORT / SIMULATION_HTTP_PORT | Port internal tiap service | Wajib | harus konsisten dgn docker-compose.yml & nginx/default.conf.docker |
NOTIFICATION_SERVICE_URL | URL internal notification service | Wajib (alias, otomatis dari NOTIFICATION_API_PORT) | - |
15. HTTP / Server Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
HTTP_READ_TIMEOUT / HTTP_WRITE_TIMEOUT / HTTP_SHUTDOWN_TIMEOUT | Timeout HTTP server | Optional | sudah ada default aman |
HTTP_CORS_ENABLED / HTTP_CORS_ORIGINS / HTTP_CORS_MAX_AGE / HTTP_ALLOW_CREDENTIALS | Kebijakan CORS | Optional | default HTTP_CORS_ORIGINS=* longgar — disarankan dipersempit di produksi, tapi tidak fatal |
HTTP_ENABLE_PREFORK | Mode prefork server | Optional | false |
SERVER_READ_TIMEOUT / SERVER_WRITE_TIMEOUT / SERVER_IDLE_TIMEOUT | Timeout tambahan | Optional | sudah ada default |
16. Report Service — Queue Processor
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
ENABLE_QUEUE_PROCESSOR | Aktifkan pemrosesan report async | Optional | true |
QUEUE_POLLING_INTERVAL / QUEUE_BATCH_SIZE / QUEUE_WORKER_COUNT | Tuning worker queue | Optional | sudah ada default |
Flag rollout asynq (
QUEUE_PROCESSOR_CONSUMERdan padanannya di integration/notification) serta env containerrelayada di Env Konsolidasi Antrean (asynq).
17. Generate Test Service Specific
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
APP_NAME | Label nama service | Optional | generate-test-service |
APP_ENV | Mode environment | Optional | local — disarankan production saat deploy, tidak fatal kalau lupa |
APP_DEBUG | Mode debug | Optional | true — disarankan false di produksi (risiko verbosity/keamanan, bukan blocker) |
APP_TIMEZONE | Timezone service | Optional | Asia/Jakarta |
LOCAL_USER_ID | Fallback user id utk testing lokal | Optional | 4 |
API_PREFIX | Prefix routing internal | Wajib | /api/v1/generate-test — harus konsisten dgn nginx |
SWAGGER_HOST | Override host Swagger UI | Optional | kosong = pakai host request |
18. Upload Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
UPLOAD_MAX_SIZE | Batas ukuran upload (byte) | Optional | 10485760 (10MB) |
UPLOAD_ALLOWED_TYPES | Whitelist MIME type | Optional | image/pdf umum sudah tercakup |
UPLOAD_PATH | Path storage lokal | Optional | hanya relevan utk fallback non-MinIO |
19. Public Domain & Origin
Blok ini ada di paling atas .env karena variabel lain merujuk ke sini lewat ${...} (Compose menginterpolasi .env berurutan). Ubah domain hanya di sini — atau lewat --update-domain (Section J); jangan sunting URL turunannya satu per satu.
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
PUBLIC_SCHEME / WS_SCHEME | Scheme publik untuk http & websocket | Wajib | .env.example: http/ws; step Setup local HTTPS menaikkannya jadi https/wss |
PUBLIC_PORT_SUFFIX | Suffix port pada semua origin | Wajib | :${AK_PORT_NGINX} → :8100; kosongkan untuk port standar (443) |
NGINX_PUBLIC_TARGET | Port container yang dilayani nginx sebagai entri publik | Wajib | 80 = http polos (TLS diterminasi di depan); HTTPS lokal mkcert menulis 443 |
NGINX_DOMAIN | Domain utama — server_name nginx | Wajib | alurkerja.local |
MICROSITE_DOMAIN / MINIO_DOMAIN | Host tersendiri untuk microsite & MinIO | Wajib | microsite-alurkerja.local / minio-alurkerja.local |
SSO_DOMAIN | Lokasi Keycloak — bukan server_name, isinya host+port+path | Wajib | ${NGINX_DOMAIN}${PUBLIC_PORT_SUFFIX}/sso. Keycloak eksternal: arahkan ke host-nya (mis. sso.company.com) dan jangan jalankan container keycloak |
STUDIO_DOMAIN / COMPRO_DOMAIN / SIMULATION_DOMAIN / CAMUNDA_DOMAIN | Subpath modul di domain utama | Wajib (turunan, otomatis) | ${NGINX_DOMAIN}/studio, /compro, /simulation, /camunda |
APP_ORIGIN / SSO_ORIGIN / MICROSITE_ORIGIN / MINIO_ORIGIN / WS_ORIGIN | Origin lengkap (scheme + host + port) yang jadi sumber semua URL layanan & frontend | Wajib (turunan, otomatis) | dirakit dari scheme/domain/port di atas — jangan diisi manual |
Perhatian: Keycloak menyimpan web-origins & redirect URI di databasenya, jadi setelah mengubah blok ini secara manual jalankan
docker compose run --rm tools scripts/update-web-origins.sh(tambah--dry-rununtuk mengintip). Lewat--update-domain, sinkronisasi itu sudah jadi salah satu step.
20. MinIO Configuration (Additional)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
MINIO_URL | URL MinIO dipakai backend generate presigned URL | Wajib (alias STORAGE_URL_PREFIX, otomatis) | - |
21. Telegram Bot Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
TELEGRAM_BOT_TOKEN | Token bot (dibaca camunda & bot service) | Optional | fitur notifikasi tambahan, nonaktif kalau tidak dipakai |
TELEGRAM_MODE | Mode koneksi bot (integration service) | Optional | polling |
22. WhatsApp API Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
WHATSAPP_API_KEY / WHATSAPP_API_URL / WHATSAPP_NUMBER_KEY / WHATSAPP_WEBHOOK_URL | Kredensial & endpoint WhatsApp API (dibaca camunda) | Optional | notifikasi via WhatsApp adalah fitur tambahan |
23. Integration Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
INTEGRATION_SYSTEM | Mode sistem (on-premise vs SaaS) | Wajib | onpremise |
INTEGRATION_EXECUTOR | Flag internal routing | Optional | saas |
INTEGRATION_BASE_URL | Base URL API dipanggil balik | Wajib (turunan, otomatis) | ${APP_ORIGIN}/api/v1 |
INTEGRATION_AUTH_TYPE | Strategi auth service integration | Wajib | keycloak |
INTEGRATION_AUTH_URL / INTEGRATION_AUTH_REALM | Alias KEYCLOAK_URL/KEYCLOAK_REALM | Wajib (alias, otomatis) | - |
INTEGRATION_AUTH_CLIENT_ID / INTEGRATION_AUTH_CLIENT_SECRET | Client Keycloak khusus service integration | Wajib (installer: hasil setup-keycloak.sh; mode Keycloak eksternal + manual: diisi user) | - |
24. App Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
APP_INTEGRATION_SYSTEM | Flag internal mode sistem | Wajib | ONPREMISE |
APP_AUTH_SERVICE | Provider auth aktif | Wajib | KEYCLOAK |
APP_NOTIFICATION_EXTERNAL | Notifikasi via service eksternal | Optional | true |
APP_NOTIFICATION_URL | URL service notifikasi | Wajib selama APP_NOTIFICATION_EXTERNAL=true (default) | http://notification:3005 |
25. Frontend — Runtime Injection (app-react & studio-react)
Di-inject ke conf.js saat container start via docker-entrypoint.sh.
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
VITE_API_BASEURL / VITE_API_TASKLIST_BASEURL | Base URL API dipanggil FE | Wajib (turunan, otomatis) | ${APP_ORIGIN} → https://alurkerja.local:8100 |
VITE_AUTH_METHOD | Metode login FE (keycloak / alurkerja_sso) | Wajib | keycloak |
VITE_KEYCLOAK_URL / VITE_KEYCLOAK_REALM / VITE_KEYCLOAK_CLIENT_ID / VITE_KEYCLOAK_CLIENT_SECRET / VITE_KEYCLOAK_REDIRECT_URI | Config Keycloak FE | Wajib selama VITE_AUTH_METHOD=keycloak (default) | alias KEYCLOAK_* |
VITE_AK_CLIENT_ID / VITE_AK_CLIENT_SECRET / VITE_AK_REDIRECT_URI | Config AlurKerja SSO custom | Optional | hanya dipakai kalau VITE_AUTH_METHOD=alurkerja_sso (bukan default) |
VITE_MINIO_CLOUD / VITE_MINIO_BUCKET / VITE_MINIO_BASE_URL | Alias MINIO_* utk FE upload/preview file | Wajib (alias, otomatis) | - |
VITE_MICROSITE_URL | Link ke microsite | Wajib (turunan, otomatis) | ${MICROSITE_ORIGIN} → https://microsite-alurkerja.local:8100 |
VITE_APP_URL / VITE_STUDIO_URL / VITE_COMPRO_URL / VITE_SIMULATION_SERVICE_URL | Navigasi antar-modul FE (versi lama) | Wajib | - |
VITE_ALURKERJA_CONTACT_URL / VITE_CONTACT_URL | Link kontak/marketing | Optional | bukan blocker fungsional |
VITE_NEW_APP_URL / VITE_NEW_STUDIO_URL / VITE_NEW_COMPRO_URL / VITE_NEW_SIMULATION_SERVICE_URL | Navigasi antar-modul FE (app) | Wajib | - |
VITE_SIMULATION_BE_SERVICE_URL | Base URL backend simulasi | Wajib | - |
VITE_WS_NOTIFICATION_URL | WebSocket notifikasi realtime | Wajib | tanpa ini notifikasi realtime patah |
VITE_WS_COLLABORATION_URL | WebSocket kolaborasi realtime | Wajib | tanpa ini fitur kolaborasi patah |
VITE_SENTRY_DSN | DSN Sentry sisi FE | Optional | sama alasan grup #5 |
VITE_QUERY_DEBUG | Debug query FE | Optional | false |
VITE_PRODUCTION | Flag mode build FE | Optional | true |
VITE_URL_GET_MANAGER / VITE_URL_GET_MANAGER_USERNAME / VITE_URL_GET_MANAGER_PASSWORD | Integrasi n8n manager (app-react only) | Optional | fitur spesifik, kosong = nonaktif |
VITE_BASIC_AUTH_ALURKERJA_USERNAME / VITE_BASIC_AUTH_ALURKERJA_PASSWORD | Basic auth tambahan FE | Optional | kosong = basic auth nonaktif |
VITE_AZURE_CLIENT_ID / VITE_AZURE_TENANT_ID / VITE_AZURE_REDIRECT_URI / VITE_AZURE_AUTHORITY | SSO Azure AD (studio-react only) | Optional | kosong di .env = nonaktif |
VITE_FEATURE_ERROR_REPORT | Flag tombol "Send Error to IT Support" pada toast kegagalan request | Optional | false — dengan flag mati, tombolnya tidak muncul sama sekali |
VITE_ERROR_REPORT_BASEURL | Base URL service helpdesk (helpdesk-react) yang menerima laporan error | Wajib selama VITE_FEATURE_ERROR_REPORT=true | - |
VITE_ERROR_REPORT_ACCESS_KEY | Key akses ke endpoint error report; harus sama dengan ERROR_REPORT_ACCESS_KEY di helpdesk | Wajib selama VITE_FEATURE_ERROR_REPORT=true | - |
26. Microsite Configuration (Next.js Application)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
MICROSITE_NODE_ENV | Mode Node.js | Optional | production |
MICROSITE_APP_DEBUG | Mode debug | Optional | false |
MICROSITE_REDIS_ENABLED | Pakai Redis khusus microsite | Optional | false (microsite jalan tanpa ini) |
MICROSITE_API_BASE_URL | Base URL API utama | Wajib (turunan, otomatis) | ${APP_ORIGIN}/api/v1 |
KEYCLOAK_HOST | Alias KEYCLOAK_URL | Wajib (alias, otomatis) | - |
KEYCLOAK_ADMIN_CLIENT / KEYCLOAK_ADMIN_SECREET | Service account Keycloak dipakai integration-service memanggil Admin REST API Keycloak (bukan login user biasa) | Wajib (default: jatuh ke KEYCLOAK_CLIENT/KEYCLOAK_CLIENT_SECRET kalau kosong) | - |
Perhatikan ejaannya:
KEYCLOAK_ADMIN_SECREET, bukanSECRET— begituintegration-servicemembacanya (config/env.go); mengisiKEYCLOAK_ADMIN_SECRET(ejaan benar) tidak akan terbaca. Kalau kedua variabel ini kosong, integration-service otomatis memakaiKEYCLOAK_CLIENT/KEYCLOAK_CLIENT_SECRETsebagai gantinya — cukup untuk instalasi default karena client itu dibuat confidential olehsetup-keycloak.sh. Isi keduanya secara eksplisit hanya kalau ingin service account terpisah.Service account ini dipakai untuk dua hal, dan masing-masing butuh role Keycloak sendiri (Clients → client ini → Service accounts roles → Assign role → filter by clients →
realm-management):
- Membuat/reset password user Keycloak saat tenant men-generate auth token integrasi (mis. dipakai addon n8n) → role
manage-users.- Impersonasi user untuk MCP tool calls (lihat Impersonate User) → role
impersonation.Kalau role ini belum ter-assign: pembuatan auth token integrasi gagal dengan 500 dari Keycloak, atau MCP tool call yang bertindak atas nama user tertentu ditolak.
setup-keycloak.shbelum tentu meng-assign kedua role ini secara otomatis — cek langsung di Keycloak Admin Console kalau salah satu fitur di atas tidak jalan.
27. Frontend — Build-time Only (compro-react & simulation-react)
Bukan variabel di .env root. Image compro-react dan simulation-react tidak punya docker-entrypoint.sh untuk runtime injection, jadi VITE_* harus diisi manual di file terpisah sebelum image di-build:
builds/compro-react/.env→VITE_API_BASEURL,VITE_API_TASKLIST_BASEURL,VITE_AUTH_METHOD,VITE_KEYCLOAK_*,VITE_SENTRY_DSN— Wajib diisi sebelum build, atau FE ini salah konfigurasi permanen sampai di-build ulang.builds/simulation-react/.env→VITE_KEYCLOAK_*,VITE_API_BASE_URL,VITE_SENTRY_DSN(opsional) — sama alasan.
I. Lifecycle Service: Start, Stop, Purge Data, Uninstall
alurkerja-cli hanya mengurus instalasi (build-alurkerja) — belum ada command lifecycle bawaan, jadi operasi setelah instalasi dijalankan langsung dengan docker compose.
Nama project compose diambil dari field name: di docker-compose.yml — bawaan repo: alurkerja (kalau field tidak ada, compose memakai nama folder download dalam huruf kecil). Dengan flag -p alurkerja, command ps, logs, start, stop, restart, dan down bisa dijalankan dari folder mana pun; hanya up yang wajib dari folder download, karena container harus dirakit ulang dari docker-compose.yml + .env.
Empat tingkat operasi — makin ke bawah makin banyak yang hilang:
| Operasi | Command inti | Container | Data (volume) | Folder & CLI |
|---|---|---|---|---|
| Start | docker compose -p alurkerja start | jalan | utuh | utuh |
| Stop | docker compose -p alurkerja stop | berhenti, tetap ada | utuh | utuh |
| Down | docker compose -p alurkerja down | dihapus | utuh | utuh |
| Purge data | docker compose -p alurkerja down -v | dihapus | hilang permanen | utuh |
| Uninstall | lihat I.4 & I.5 | dihapus | hilang | dihapus |
I.1. Start service
Aksi
Setelah stop — container masih ada, cukup dinyalakan lagi (dari folder mana pun):
docker compose -p alurkerja startSetelah down atau untuk instalasi yang baru saja di-up pertama kali — container harus dibuat ulang, jadi jalankan dari folder download:
docker compose up -dSatu service saja: docker compose -p alurkerja start camunda.
Expected output
docker compose -p alurkerja psSemua service berstatus running. Boot penuh butuh ±1–2 menit: depends_on hanya mengatur urutan start, bukan kesiapan, jadi beberapa backend bisa restart sekali-dua kali selama postgres masih warm-up dan stabil sendiri karena restart: unless-stopped. Setelah itu aplikasi kembali dapat diakses di URL Step 9.
Perhatian: semua service memakai
restart: unless-stopped— stack ikut nyala otomatis setiap Docker Desktop start. Container yang dihentikan manual (stop/down) tidak ikut nyala, jadi keputusan mematikan stack bertahan melewati reboot.
I.2. Stop service
Aksi
Ada dua tingkat, pilih sesuai kebutuhan.
a. stop — jeda harian. Container dihentikan tapi tetap ada; port host 8100–8105 dilepas; data dan konfigurasi utuh. Hidupkan lagi dengan start (I.1).
docker compose -p alurkerja stopb. down — bongkar container. Container dan network alurkerja-net dihapus, volume tidak disentuh — semua data tetap aman. Dipakai kalau .env atau docker-compose.yml berubah dan container perlu dirakit ulang.
docker compose -p alurkerja down --remove-orphans--remove-orphans ikut membersihkan container sisa service yang sudah tidak ada lagi di docker-compose.yml versi sekarang.
Expected output
docker compose -p alurkerja ps -aSetelah stop: semua container berstatus exited. Setelah down: daftar kosong.
Perhatian: Mailpit tidak punya volume — email uji hilang setiap container dibuat ulang lewat
down.stoptidak menghapusnya.
I.3. Purge data
Aksi
Stack ini membuat tiga volume (keycloak_data dideklarasikan di docker-compose.yml tapi tidak dipakai service mana pun, jadi tidak pernah terbentuk — Keycloak menyimpan realm-nya di database keycloak_db di dalam postgres):
| Volume | Isi | Efek kalau dihapus |
|---|---|---|
alurkerja_postgres_data | database alurkerja, schema camunda, dan keycloak_db | seluruh workflow, data user, dan realm Keycloak hilang |
alurkerja_minio_data | bucket file upload | semua file & attachment hilang |
alurkerja_redis_data | cache Redis (appendonly) | aman — terbentuk ulang otomatis |
down -v menghapus semua data secara permanen — database, file storage MinIO, dan realm Keycloak. Kalau berencana instal ulang dengan data lama, amankan dulu .env — khususnya 4 application secrets (lihat Section H) — karena database bekas hanya bisa dipakai lagi dengan secret yang sama.
a. Purge total — kosongkan semua data, instalasi tetap terpasang:
docker compose -p alurkerja down -v --remove-orphansLalu isi ulang schema dan realm dengan menjalankan pipeline lagi dari folder download:
alurkerja build-alurkerjaStep Init database, Load public & camunda schema, dan Setup Keycloak berjalan lagi; step Generate secrets hanya mengisi nilai yang kosong/masih placeholder, jadi 4 application secrets di .env tidak di-rotate dan instalasi baru memakai kunci yang sama.
b. Purge selektif — buang satu jenis data saja, mis. file storage:
docker compose -p alurkerja down # container harus dihapus dulu, `stop` saja tidak cukup:
# volume masih dipegang container yang exited
docker volume rm alurkerja_minio_data
docker compose up -d # dari folder download; minio-init membuat ulang bucketExpected output
docker volume ls --filter name=alurkerja_Volume yang dibuang tidak lagi muncul (setelah purge total: daftar kosong).
I.4. Uninstall service AlurKerja
Urutannya: matikan stack dulu, baru bersihkan jejak di luar Docker, terakhir hapus folder. Jalankan semua langkah agar tidak ada residu.
1. Stop stack & hapus volume
docker compose -p alurkerja down -v --remove-orphansExpected: docker compose ls --all tidak lagi menampilkan project alurkerja, docker volume ls --filter name=alurkerja_ kosong, dan network alurkerja-net hilang dari docker network ls.
2. Hapus entri hosts yang ditulis CLI
Selama instalasi, CLI menambahkan satu baris ber-komentar # alurkerja-cli ke hosts file supaya domain lokal resolve ke mesin ini — mis. 127.0.0.1 alurkerja.local microsite-alurkerja.local minio-alurkerja.local # alurkerja-cli. Butuh akses admin/root:
Jalankan PowerShell as Administrator:
$hosts = "$env:SystemRoot\System32\drivers\etc\hosts"
Set-Content $hosts -Value ((Get-Content $hosts) -notmatch 'alurkerja-cli')sudo sed -i.bak '/# alurkerja-cli/d' /etc/hostsExpected: Select-String alurkerja-cli $hosts (PowerShell) atau grep alurkerja-cli /etc/hosts tidak menghasilkan baris apa pun. Baris domain yang ditulis sendiri (tanpa komentar # alurkerja-cli) tidak ikut terhapus — hapus manual kalau memang tidak dipakai lagi.
3. Lepas root CA mkcert — hanya kalau instalasi memakai HTTPS lokal
Step Setup local HTTPS menjalankan mkcert -install, yang menaruh root CA lokal di trust store OS. Lepas kepercayaan itu sebelum folder ~/.alurkerja dihapus (binary mkcert ada di dalamnya):
& "$env:USERPROFILE\.alurkerja\bin\mkcert.exe" -uninstall~/.alurkerja/bin/mkcert -uninstallPerhatian: ini melepas root CA mkcert untuk semua project di mesin ini — lewati kalau ada project lain yang mengandalkannya.
4. Lepas reservasi port — Windows saja
CLI mereservasi 10 port mulai dari AK_PORT_NGINX (default 8100–8109) lewat netsh supaya Hyper-V/WSL tidak mencaploknya setelah reboot. Di terminal admin:
netsh int ipv4 delete excludedportrange protocol=tcp startport=8100 numberofports=10Expected: netsh int ipv4 show excludedportrange protocol=tcp tidak lagi menampilkan baris 8100–8109. Kalau AK_PORT_NGINX di .env bukan 8100, sesuaikan startport (cek .env sebelum foldernya dihapus di langkah 5).
5. Hapus folder download
Hapus folder yang dipilih di Step 6 (berisi docker-compose.yml, .env, config/, sertifikat nginx/certs/):
Remove-Item -Recurse -Force D:\path\ke\folder-downloadrm -rf /path/ke/folder-downloadPerhatian:
.env(termasuk application secrets) ikut terhapus bersama folder ini dan tidak bisa dipulihkan.
6. Logout Harbor
docker logout harbor.merapi.javan.id7. Hapus image — opsional, mengosongkan ±5 GB
Image tetap tersimpan setelah down. Hapus image AlurKerja dari Harbor plus alurkerja-tools (image lokal hasil build service tools) — command sama untuk PowerShell maupun bash:
docker rmi $(docker images -q "harbor.merapi.javan.id/alurkerja-v2/*")
docker rmi alurkerja-toolsImage publik pendukung (nginx, keycloak, pgvector, redis, minio, mailpit) bisa dibersihkan dengan docker image prune -a — perhatian: perintah ini menghapus semua image yang tidak dipakai container mana pun, termasuk milik project lain.
I.5. Uninstall AlurKerja CLI
Aksi
Seluruh jejak CLI ada di satu folder: ~/.alurkerja (Windows: %USERPROFILE%\.alurkerja) — binary bin/alurkerja, binary bin/mkcert, config & profile koneksi, token login, serta deployment/. Jalankan mkcert -uninstall (I.4 langkah 3) sebelum folder ini dihapus.
Remove-Item -Recurse -Force "$env:USERPROFILE\.alurkerja"
# Lepas dari user PATH lewat registry — entri %VAR% lain tetap utuh
$dir = Join-Path $env:USERPROFILE '.alurkerja\bin'
$key = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey('Environment', $true)
$noExpand = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames
$raw = $key.GetValue('Path', '', $noExpand)
$kept = "$raw" -split ';' -ne '' -ne $dir -ne "$dir\"
$key.SetValue('Path', ($kept -join ';'), [Microsoft.Win32.RegistryValueKind]::ExpandString)
$key.Close()rm -rf ~/.alurkerjaInstaller tidak pernah menyunting shell profile — kalau dulu export PATH="$HOME/.alurkerja/bin:$PATH" ditambahkan sendiri ke ~/.zshrc / ~/.bashrc, hapus barisnya.
Expected output
Di terminal baru (PATH lama masih hidup di terminal yang sedang terbuka), alurkerja --version menghasilkan command not found.
Perhatian: installer versi lama memasang binary di lokasi berbeda —
%LOCALAPPDATA%\alurkerja(Windows) atau~/.local/bin/~/bin(macOS/Linux). Kalau CLI pernah dipasang sebelum pindah ke~/.alurkerja/bin, cek lokasi itu dan hapus filealurkerjayang tersisa.
I.6. Verifikasi akhir
| Cek | Command | Expected |
|---|---|---|
| Project compose | docker compose ls --all | tanpa baris alurkerja |
| Volume | docker volume ls --filter name=alurkerja_ | kosong |
| Network | docker network ls --filter name=alurkerja-net | kosong |
| Image | docker images "harbor.merapi.javan.id/alurkerja-v2/*" | kosong |
| Folder download | ls <folder> | tidak ada |
| Hosts file | grep alurkerja-cli /etc/hosts / Select-String alurkerja-cli $env:SystemRoot\System32\drivers\etc\hosts | tanpa hasil |
| Reservasi port (Windows) | netsh int ipv4 show excludedportrange protocol=tcp | tanpa 8100–8109 |
| CLI | alurkerja --version di terminal baru | command not found |
J. Skema Domain dan Ganti Domain
Ada dua skenario pemakaian:
| KS — tanpa domain (default) | KD — dengan domain sendiri | |
|---|---|---|
| Untuk | mesin lokal, demo, development | server yang punya domain & DNS |
| Domain utama | alurkerja.local (bawaan .env.example) | mis. alurkerja.dev |
| Port publik | :8100 (AK_PORT_NGINX) | tanpa port — standar 443, kecuali di-override --port |
| Scheme | https, sertifikat mkcert lokal | https, TLS diterminasi di depan nginx |
| Resolusi nama | hosts file, didaftarkan CLI otomatis | DNS — urusan operator |
| Cara | alurkerja build-alurkerja | alurkerja build-alurkerja --update-domain --domain alurkerja.dev |
Sumber kebenarannya satu: blok domain di .env (NGINX_DOMAIN, MICROSITE_DOMAIN, MINIO_DOMAIN, PUBLIC_SCHEME, PUBLIC_PORT_SUFFIX). Semua *_ORIGIN dan URL frontend diturunkan dari situ lewat interpolasi ${...}, jadi tidak ada URL yang perlu diedit satu per satu.
J.1. Peta URL kedua skenario
| Modul | KS (domain lokal) | KD (domain sendiri) |
|---|---|---|
| App | https://alurkerja.local:8100 | https://alurkerja.dev |
| Studio | https://alurkerja.local:8100/studio | https://alurkerja.dev/studio |
| Compro | https://alurkerja.local:8100/compro | https://alurkerja.dev/compro |
| Simulation | https://alurkerja.local:8100/simulation | https://alurkerja.dev/simulation |
| BE (API) | https://alurkerja.local:8100/api/v1 | https://alurkerja.dev/api/v1 |
| SSO (Keycloak) | https://alurkerja.local:8100/sso | https://alurkerja.dev/sso |
| Microsite | https://microsite-alurkerja.local:8100 | https://microsite.alurkerja.dev |
| MinIO | https://minio-alurkerja.local:8100 | https://minio.alurkerja.dev |
SSO mengikuti domain utama dengan sendirinya (SSO_DOMAIN=${NGINX_DOMAIN}${PUBLIC_PORT_SUFFIX}/sso). Kalau SSO-nya justru harus di host terpisah — mis. Keycloak eksternal di sso.alurkerja.dev — pakai --sso-domain sso.alurkerja.dev: CLI menguji koneksi ke port 443-nya lebih dulu, dan realm + client di sana harus sudah ada.
J.2. Ganti domain pada instalasi existing
Aksi
Jalankan dari folder download (atau tambahkan --dir <folder>):
alurkerja build-alurkerja --update-domain --domain alurkerja.devTanpa flag pun bisa: jalankan alurkerja build-alurkerja di folder instalasi, lalu pilih Update the public domain (app, studio, sso) di menu instalasi existing. Nilai yang tidak diisi diambil dari .env saat ini — enter kosong = biarkan apa adanya.
| Flag | Default | Keterangan |
|---|---|---|
--domain | nilai NGINX_DOMAIN sekarang | Bare host — tanpa scheme, port, path, atau spasi (divalidasi). |
--port | none (443) | Isi angka kalau publiknya bukan port standar. |
--microsite-domain | microsite.<domain> | — |
--minio-domain | minio.<domain> | Diabaikan kalau storage eksternal — MINIO_DOMAIN tidak disentuh. |
--sso-domain | tidak diubah | Host SSO terpisah; dites koneksi :443 sebelum ditulis. |
Jalur ini 5 step, di luar pipeline install biasa:
| Step | Keterangan |
|---|---|
Update .env (domain & origins) | Tulis domain baru + PUBLIC_SCHEME=https, WS_SCHEME=wss, PUBLIC_PORT_SUFFIX. TLS lokal mkcert sekaligus dicabut: NGINX_PUBLIC_TARGET kembali 80, nginx/tls/tls.conf dan docker-compose.override.yml di-rename jadi .disabled. |
Remove extra_hosts dari docker-compose.yml | Template memetakan domain ke host-gateway — benar untuk instalasi lokal, salah untuk domain nyata (trafik publik dibalikkan ke docker host, bukan lewat DNS). |
| Restart stack | docker compose up -d --force-recreate dengan .env baru. Volume tidak disentuh — tidak ada data yang hilang. |
| Sync Keycloak web-origins | Keycloak menyimpan redirect URI & web-origins di databasenya, bukan di .env, jadi harus di-push terpisah lewat scripts/update-web-origins.sh di container tools. Gagal → warning + perintah manualnya. |
| Summary | Daftar URL baru (App, Studio, SSO, Microsite, MinIO) + pengingat DNS dan TLS. |
Expected output
Step Summary menampilkan kelima URL di domain baru, dan Domain updated in <durasi>. tampil di akhir.
Setelah ganti domain, nginx kembali melayani HTTP polos di port AK_PORT_NGINX — terminasi TLS jadi tugas load balancer / reverse proxy di depannya. Pastikan juga domain utama beserta turunan microsite & MinIO benar-benar resolve ke mesin ini; CLI tidak mengurus DNS.
Perhatian: entri hosts dari instalasi lokal sebelumnya tidak ikut dihapus. Kalau domain lokal sudah tidak dipakai, bersihkan sesuai Section I.4 langkah 2.
Docker Compose
Runbook instalasi AlurKerja di satu host Linux menggunakan Docker Compose. Berurutan 1..41, satu nomor satu aksi, setiap langkah memiliki validasi observable.
Kubernetes
Runbook instalasi AlurKerja di cluster Kubernetes on-premise. Berurutan 1..47, satu nomor satu aksi, setiap langkah memiliki validasi observable.
