On Premise Docker Compose v2
Runbook instalasi AlurKerja on-premises di mesin lokal menggunakan CLI build-alurkerja. Dua fase otomatis dan idempoten — Setup (3 step tetap) lalu Install yang dirakit sesuai konfigurasi, dari download code sampai semua container jalan.
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 (3 step tetap) 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.
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
http://localhost:8100dan Keycloak dihttp://sso.localhost:8100.
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
Aksi
git --versionExpected output
git version 2.x.x atau lebih baru.
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://docs.alurkerja.com/install.ps1 | iexcurl -fsSL https://docs.alurkerja.com/install.sh | bashExpected output
Pesan Terpasang: <path> tampil, lalu pipeline build-alurkerja langsung berjalan.
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.
5.2. Download manual & jalankan binary
Aksi
Alternatif bila tidak memakai instalasi cepat (Step 5.1). Download binary sesuai OS:
| OS | Binary |
|---|---|
| Windows 64-bit | alurkerja-cli-windows-amd64.exe |
| Windows 32-bit | alurkerja-cli-windows-386.exe |
| macOS (Intel) | alurkerja-cli-darwin-amd64 |
| macOS (Apple Silicon) | alurkerja-cli-darwin-arm64 |
| Linux 64-bit | alurkerja-cli-linux-amd64 |
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 Do nothing (konfigurasi saat ini dipertahankan) atau Reconfigure features. 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 selalu 3 step:
| # | Step | Keterangan |
|---|---|---|
| 1 | Cek prasyarat | Pastikan git, docker (daemon jalan), 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 ke folder pilihan (lihat Step 6). Kalau code sudah ada: hanya refresh config/*.sql dari repo — 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: pilihan Do nothing atau Reconfigure features. |
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 & camunda schema | Selalu | 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_TOKEN_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 http (default 8100) dan AK_PORT_POSTGRES untuk database (default 8101) — resource yang di-set eksternal tampil dengan alamat eksternalnya:
| Service | URL | Credential |
|---|---|---|
| Database | localhost:8101 | postgres / postgres |
| App | http://localhost:8100 | — |
| BE (API) | http://localhost:8100/api/v1 | — |
| Keycloak | http://sso.localhost:8100 | admin / kapalpecah123 |
| Minio (API) | http://minio.localhost:8100 | — |
| Minio (Console) | http://minio.localhost:8100/console | javan2 / asdf1234 |
| Mailpit | http://localhost:8100/mailpit | — |
Expected output
Halaman App ter-render di http://localhost:8100 dan admin console Keycloak dapat diakses di http://sso.localhost:8100.
Perhatian: kalau suatu saat instalasi lokal ini sudah tidak dipakai dan ingin dihapus tuntas (stack, volume, folder download, image), ikuti Section I. Cleanup Instalasi Lokal.
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: hasil download lama masih ber-CRLF (dari versi CLI lama). Hapus folder download 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 | - |
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 | http://sso.localhost:8100 |
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 | - |
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) | Wajib | minio.localhost:8100 |
MINIO_ACCESS_KEY / MINIO_SECRET_KEY | Kredensial MinIO | Wajib | - |
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 | http://${MINIO_ENDPOINT}/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) | - |
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 |
CACHE_HOST / CACHE_PORT / CACHE_PASSWORD / CACHE_DB | Alias REDIS_* | Wajib (alias, otomatis) | - |
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 |
OPENAI_API_URL | Endpoint API OpenAI | Optional | default endpoint resmi; hanya relevan kalau OPENAI_API_KEY diisi, ubah hanya kalau pakai proxy/self-host LLM |
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_TOKEN_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_TOKEN_EXPIRATION | Masa berlaku token | Optional | sudah ada default aman |
ROUTER_JWT_SECRET | Alias JWT_SECRET utk router | Wajib (alias, otomatis) | - |
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) | - |
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 | http://localhost:8100 |
COMPANY_PROFILE_SERVICE_URL | URL internal service company profile | Wajib | http://onprem-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 / ROUTER_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. Router Service Specific
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
ROUTER_LOG_LEVEL | Level log router | Optional | info |
ROUTER_CONFIG_PATH | Path file rules routing | Wajib | config/rules.json — router tidak start tanpa file ini |
ROUTER_TENANT_HEADER | Nama header tenant | Optional | x-active-tenant (harus konsisten dgn FE kalau diubah) |
ROUTER_TENANT_REQUIRED | Wajibkan header tenant di tiap request | Optional | true |
ROUTER_ENABLE_METRICS | Aktifkan endpoint metrics | Optional | true |
17. 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 |
18. 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 |
19. 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 |
20. Nginx / Domain Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
NGINX_DOMAIN / SSO_DOMAIN / STUDIO_DOMAIN / COMPRO_DOMAIN / SIMULATION_DOMAIN / MICROSITE_DOMAIN / CAMUNDA_DOMAIN | Domain per modul, dipakai server_name di nginx/default.conf.docker | Wajib | tidak sinkron = routing 404 |
21. MinIO Configuration (Additional)
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
MINIO_URL | URL MinIO dipakai backend generate presigned URL | Wajib (alias STORAGE_URL_PREFIX, otomatis) | - |
22. Telegram Bot Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
TELEGRAM_BOT_USERNAME / TELEGRAM_BOT_TOKEN | Kredensial bot | Optional | fitur notifikasi tambahan, nonaktif kalau tidak dipakai |
TELEGRAM_MODE | Mode koneksi bot | Optional | polling |
23. Onboarding Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
ONBOARDING_DRYRUN | Mode simulasi tanpa efek nyata | Optional | true (aman); set false utk aktifkan efek sungguhan |
24–28. Integrasi Eksternal Opsional (kosong secara default)
Grup-grup berikut kosong di .env bawaan dan murni integrasi tambahan — aplikasi inti jalan normal tanpa ini, fitur terkait cuma nonaktif:
| Grup | Variabel | Status |
|---|---|---|
| FreeIPA | FREEIPA_URL, FREEIPA_USERNAME, FREEIPA_PASSWORD | Optional |
| Taiga | TAIGA_URL, TAIGA_USERNAME, TAIGA_PASSWORD | Optional |
| ActiveCollab | ACTIVECOLLAB_URL, ACTIVECOLLAB_USERNAME, ACTIVECOLLAB_PASSWORD, ACTIVECOLLAB_TOKEN | Optional |
| APIBase | APIBASE_URL, APIBASE_USERNAME, APIBASE_PASSWORD | Optional |
| Odoo | ODOO_URL, ODOO_VERSION (default 17), ODOO_DB, ODOO_USERNAME, ODOO_PASSWORD | Optional |
29. Service Camunda Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
SERVICE_CAMUNDA_URL | URL publik tasklist Camunda (via nginx /camunda) | Wajib | dipakai FE link ke tasklist |
30–31. Database Integrasi Eksternal (kosong secara default)
| Grup | Variabel | Status |
|---|---|---|
| Database Taiga | DBTAIGA_URL, DBTAIGA_USERNAME, DBTAIGA_PASSWORD | Optional — hanya relevan kalau integrasi Taiga level-DB dipakai |
| Database Collab | DBCOLLAB_URL, DBCOLLAB_USERNAME, DBCOLLAB_PASSWORD | Optional — hanya relevan kalau integrasi ActiveCollab level-DB dipakai |
32. WhatsApp API Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
WHATSAPP_API_KEY / WHATSAPP_API_URL / WHATSAPP_NUMBER_KEY / WHATSAPP_WEBHOOK_URL | Kredensial & endpoint WhatsApp API | Optional | notifikasi via WhatsApp adalah fitur tambahan |
33. Webhook Configuration
| Variabel | Deskripsi | Status | Default/Contoh |
|---|---|---|---|
WEBHOOK_URL / WEBHOOK_USERNAME / WEBHOOK_PASSWORD | Outbound webhook generik | Optional | fitur tambahan |
34. 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 | http://localhost:8100/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) | - |
35. 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://onprem-notification:3005 |
36. 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 | http://localhost: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 | http://microsite.localhost: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 (onprem-app-fe-new) | 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 |
37. 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 | http://localhost:8100/api/v1 |
KEYCLOAK_HOST | Alias KEYCLOAK_URL | Wajib (alias, otomatis) | - |
KEYCLOAK_ADMIN_CLIENT / KEYCLOAK_ADMIN_SECRET | Alias KEYCLOAK_CLIENT/CLIENT_SECRET, dipakai integration service utk Keycloak admin API | Wajib (alias, otomatis) | - |
38. 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. Cleanup Instalasi Lokal
CLI belum menyediakan perintah teardown (down/cleanup) — jadi penghapusan tuntas dilakukan manual dengan urutan berikut: matikan stack dulu, baru hapus folder.
down -v menghapus semua data secara permanen — database, file storage MinIO, dan konfigurasi 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.
1. Stop stack & hapus volume
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). Karena memakai -p, command bisa dijalankan dari folder mana pun:
docker compose -p alurkerja down -vExpected: semua container dan volume terhapus — docker compose ls --all tidak lagi menampilkan project alurkerja.
2. Hapus folder download
Hapus folder yang dipilih di Step 6 (berisi docker-compose.yml, .env, config/):
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.
3. Logout Harbor
docker logout harbor.merapi.javan.id4. Hapus image — opsional, mengosongkan ±5 GB
Image tetap tersimpan setelah down. Hapus semua image AlurKerja dari Harbor (command sama untuk PowerShell maupun bash):
docker rmi $(docker images -q "harbor.merapi.javan.id/alurkerja-v2/*")Image 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.
Expected akhir: docker compose ls --all tanpa project alurkerja, folder download tidak ada, dan docker images tanpa image harbor.merapi.javan.id/alurkerja-v2/*.
On Premise Docker Compose
Runbook instalasi AlurKerja di satu host Linux menggunakan Docker Compose. Berurutan 1..41, satu nomor satu aksi, setiap langkah memiliki validasi observable.
On Premise Kubernetes
Runbook instalasi AlurKerja di cluster Kubernetes on-premise. Berurutan 1..47, satu nomor satu aksi, setiap langkah memiliki validasi observable.
