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-alurkerja selesai sampai step Summary dan menampilkan daftar URL akses.
  • Semua container dalam state running (docker compose ps tanpa Exited/Restarting).
  • Aplikasi dapat diakses di http://localhost:8100 dan Keycloak di http://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 version

Expected 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-plugin juga bisa dipakai. Pipeline membutuhkan docker compose (V2, plugin) — bawaan Docker Desktop terbaru.

2. Verifikasi Git terpasang

Aksi

git --version

Expected 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 tujuan
df -h ~   # lihat kolom Avail

Expected 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 | iex
curl -fsSL https://docs.alurkerja.com/install.sh | bash

Expected 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:

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 saja

Lalu jalankan command build-alurkerja dari binary yang di-download:

.\alurkerja-windows-amd64.exe build-alurkerja
./alurkerja-darwin-arm64 build-alurkerja

Sesuaikan 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:

FlagPromptKegunaan
--harbor-userHarbor usernamedocker login
--harbor-passwordHarbor passworddocker login
--dirFolder downloadLokasi 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:

ResourceToggle flagFlag detail (mode external)Catatan mode external
Storage--storage--s3-endpoint, --s3-access-key, --s3-secret-key, --s3-bucketServer MinIO/S3 sendiri — bucket harus sudah ada.
Database--database--db-host, --db-port, --db-user, --db-password, --db-name, --db-keycloak-nameServer 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/clientSatu URL publik yang terjangkau browser & container.
SMTP--smtp--smtp-host, --smtp-port, --smtp-user, --smtp-password, --smtp-fromKosongkan username untuk relay tanpa auth.
Redis--redis--redis-host, --redis-port, --redis-password, --redis-dbKosongkan 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 (.env sudah ada), CLI menawarkan Do nothing (konfigurasi saat ini dipertahankan) atau Reconfigure features. Kembali ke mode local kapan pun — nilai .env terkait dikembalikan ke bawaan lokal otomatis. Detail lengkap tiap mode external (nilai .env yang ditulis, perilaku container) ada di README repo alurkerja-cli.

7. Pantau pipeline sampai selesai

Aksi

Biarkan pipeline berjalan. Fase Setup selalu 3 step:

#StepKeterangan
1Cek prasyaratPastikan git, docker (daemon jalan), docker compose tersedia, lalu login Harbor — kredensial diminta di sini, tidak di tengah pipeline. SKIP kalau semua sudah siap.
2Download release-alurkerja-localDownload 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.
3Setup featuresLayar 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:

StepKapan adaKeterangan
Stop stack lamaSelaluDown project compose bernama sama dari folder lain — sisa download lama. Volume tidak dihapus. SKIP kalau tidak ada.
Copy .env.example.envHanya kalau .env belum adaEditan manual tidak pernah ditimpa.
Apply features ke .envHanya kalau ada nilai fitur untuk ditulisMenulis env hasil Setup features (Do nothing = step ini tidak ada).
Cek port bentrokSelaluFail-fast dengan pesan siapa pemegang portnya; stack ini sendiri tidak dihitung.
Start postgresHanya mode DB localdocker compose up -d postgres + tunggu ready.
Init databaseSelaluMembuat database + schema. SKIP kalau keycloak_db sudah ada.
Setup pgvectorHanya mode DB eksternalVerifikasi paket extension vector tersedia di server — fail-fast dengan petunjuk instalasi kalau belum.
Load public & camunda schemaSelaluSQL idempoten — update schema terpasang di run ulang tanpa kehilangan data.
Pull ImageSelaluDownload semua image (bagian terlama); service yang di-exclude tidak di-pull.
Start nginx(, keycloak), toolsSelaluKeycloak eksternal: step-nya tanpa keycloak.
Setup KeycloakKecuali Keycloak eksternal + manualMenjalankan scripts/setup-keycloak.sh di container tools.
Generate secretsSelaluopenssl 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 .envSelaluMenulis nilai keycloak (dari script atau input manual).
Start AllSelaludocker compose up -d --force-recreate dengan .env final; service excluded di-stop.
SummarySelaluMenampilkan 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 ps

Expected 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:

ServiceURLCredential
Databaselocalhost:8101postgres / postgres
Apphttp://localhost:8100
BE (API)http://localhost:8100/api/v1
Keycloakhttp://sso.localhost:8100admin / kapalpecah123
Minio (API)http://minio.localhost:8100
Minio (Console)http://minio.localhost:8100/consolejavan2 / asdf1234
Mailpithttp://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_db terputus tepat setelah membuat keycloak_db tapi sebelum schema camunda dibuat → drop database keycloak_db lalu jalankan ulang.
  • Error $'\r': command not found saat 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.

NoSectionAksiHasilBuktiPICCatatan
1PrasyaratVerifikasi Docker Desktop berjalan
2PrasyaratVerifikasi Git terpasang
3PrasyaratVerifikasi akun Harbor
4PrasyaratVerifikasi free storage minimal 8 GB
5.1InstalasiInstalasi cepat (otomatis: install + jalankan build-alurkerja)
5.2InstalasiDownload manual & jalankan binary build-alurkerja
6EksekusiIsi input yang diminta
7EksekusiPantau pipeline sampai selesai (step Summary)
8VerifikasiValidasi semua container running
9VerifikasiAkses 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 dari setup-keycloak.sh dan 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)

VariabelDeskripsiStatusDefault/Contoh
POSTGRES_USERUser Postgres untuk container internalWajibpostgres
POSTGRES_PASSWORDPassword Postgres container internalWajib-
POSTGRES_DBNama database aplikasi utamaWajibalurkerja_db
POSTGRES_PORTPort Postgres di hostOptional5432 (ubah hanya kalau bentrok port lain)
DB_HOSTHost yang dipakai semua service utk connect DBWajibpostgres (nama container)
DB_PORTPort yang dipakai service utk connect DBWajib5432
DB_USERUsername DB dipakai serviceWajib (alias POSTGRES_USER, otomatis)-
DB_PASSWORDPassword DB dipakai serviceWajib (alias POSTGRES_PASSWORD, otomatis)-
DB_NAMENama DB dipakai serviceWajib (alias POSTGRES_DB, otomatis)-
DB_SCHEMASchema defaultOptionalpublic (sudah sesuai public.sql)
DB_SSLMODEMode SSL koneksi DBOptionaldisable (ubah ke require/verify-full kalau Postgres eksternal mewajibkan SSL)
DB_MAX_OPEN / DB_MAX_IDLE / DB_LIFETIMETuning connection poolOptionalsudah ada default aman
CAMUNDA_DB_USERNAME / CAMUNDA_DB_PASSWORDKredensial DB khusus CamundaWajib-
CAMUNDA_DB_URLJDBC URL Camunda ke PostgresWajib-
KEYCLOAK_DB_NAMENama database terpisah untuk KeycloakWajibkeycloak_db (dibuat otomatis oleh init_db.sql)
DB_ADDRDSN format Go untuk tool migrationWajib-

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

VariabelDeskripsiStatusDefault/Contoh
KEYCLOAK_URLURL server KeycloakWajibhttp://sso.localhost:8100
KEYCLOAK_REALMNama realm KeycloakWajib (installer: hasil setup-keycloak.sh)alurkerja
KEYCLOAK_CLIENTClient ID Keycloak (confidential)Wajib (installer: hasil setup-keycloak.sh)onprem
KEYCLOAK_CLIENT_SECRETClient secret, dipakai backend validasi tokenWajib (installer: hasil setup-keycloak.sh; mode Keycloak eksternal + manual: diisi user)-
KEYCLOAK_ADMIN_USER / KEYCLOAK_ADMIN_PASSWORDKredensial admin, dipakai provisioning realm otomatis (setup-keycloak.sh)Wajib-
KEYCLOAK_BASE_URLAlias KEYCLOAK_URL utk service lainWajib (alias, otomatis)-
KEYCLOAK_CLIENT_IDAlias KEYCLOAK_CLIENTWajib (alias, otomatis)-
KEYCLOAK_USE_JWKS_URLPaksa pakai JWKS URL manualOptionalfalse (biarkan false agar dibentuk otomatis dari BASE_URL+REALM)
KEYCLOAK_ISSUER / KEYCLOAK_JWKS_URLOverride issuer/JWKS manualOptionalkosong = otomatis

3. MinIO / Storage Configuration

VariabelDeskripsiStatusDefault/Contoh
MINIO_ENDPOINTEndpoint MinIO (host:port publik)Wajibminio.localhost:8100
MINIO_ACCESS_KEY / MINIO_SECRET_KEYKredensial MinIOWajib-
MINIO_BUCKET_NAMENama bucket utamaWajibalurkerja
MINIO_USE_SSLEndpoint pakai HTTPSOptionalfalse (wajib true kalau endpoint eksternal HTTPS)
MINIO_BROWSER_REDIRECT_URLURL publik console MinIO (dipakai console self-reference)Wajibhttp://${MINIO_ENDPOINT}/console/ — tanpa ini console patah (CSP/403)
STORAGE_PROVIDERProvider storage aktifOptionalminio (sudah sesuai stack ini)
STORAGE_BUCKET / STORAGE_KEY / STORAGE_SECRET / STORAGE_HOST / STORAGE_PORT / STORAGE_USE_SSL / STORAGE_URL_PREFIXAlias MINIO_* untuk service dgn naming bedaWajib (alias, otomatis)-
STORAGE_REGIONRegion utk signing S3 SDKOptionalap-southeast-3 (MinIO tidak validasi region asli)
STORAGE_LOCAL_PATHPath fallback storage lokalOptionaltidak dipakai selama STORAGE_PROVIDER=minio
AWS_REGIONAlias STORAGE_REGION utk library S3-compatible tertentuOptional (alias, otomatis)-

4. Redis / Cache Configuration

VariabelDeskripsiStatusDefault/Contoh
REDIS_HOST / REDIS_PORTHost & port RedisWajibredis / 6379 — caching enabled default (CACHE_ENABLED=true)
REDIS_PASSWORDPassword RedisOptionalkosong = tanpa auth (default lokal); isi kalau Redis eksternal butuh auth
REDIS_DBIndex database RedisOptional0
CACHE_PROVIDERProvider cache aktifOptionalredis
CACHE_ENABLEDAktifkan cachingOptionaltrue (tidak disarankan dimatikan di produksi, tapi tidak fatal)
CACHE_TTL / CACHE_MAX_SIZETuning cacheOptionalsudah ada default
CACHE_HOST / CACHE_PORT / CACHE_PASSWORD / CACHE_DBAlias REDIS_*Wajib (alias, otomatis)-

5. Sentry Configuration

VariabelDeskripsiStatusDefault/Contoh
SENTRY_DSNDSN error trackingOptionalkosong = tracking nonaktif meski SENTRY_ENABLED=true
SENTRY_TOKEN / SENTRY_ORG / SENTRY_PROJECTSKredensial otomasi release/source-map uploadOptionalhanya relevan utk CI/CD Sentry
SENTRY_ENVIRONMENTLabel environment di SentryOptionalproduction
SENTRY_ENABLED / SENTRY_DEBUG / SENTRY_SEND_DEFAULT_PII / SENTRY_ENABLE_TRACING / SENTRY_TRACES_SAMPLE_RATE / SENTRY_ENABLE_LOGSTuning SDK SentryOptionalhanya relevan kalau SENTRY_DSN diisi

6. OpenAI Configuration

VariabelDeskripsiStatusDefault/Contoh
OPENAI_API_KEYAPI key OpenAIOptionalkosong = fitur AI (generate BPMN, dll) nonaktif, bukan blocker core app
OPENAI_BPMN_MODEL / OPENAI_BPMN_TIMEOUT / OPENAI_BPMN_MAX_TOKENS / OPENAI_BPMN_TEMPERATURETuning model BPMN generationOptionalhanya relevan kalau API key diisi
OPEN_AI_API_KEYAlias OPENAI_API_KEYOptional (alias, otomatis)-
OPEN_AI_PURPOSE_MODEL / OPEN_AI_PURPOSE_TEMPERATURE / OPEN_AI_PURPOSE_MAX_TOKENS / OPEN_AI_PURPOSE_TIMEOUTTuning model utk use-case lainOptionalsama alasan
OPENAI_API_URLEndpoint API OpenAIOptionaldefault endpoint resmi; hanya relevan kalau OPENAI_API_KEY diisi, ubah hanya kalau pakai proxy/self-host LLM

7. Email Configuration (Notification & Tenant Management)

VariabelDeskripsiStatusDefault/Contoh
EMAIL_HOST / EMAIL_PORTHost & port SMTPWajibmailpit / 1025 (SMTP dev bawaan docker-compose)
EMAIL_USER / EMAIL_PASSKredensial SMTPOptionalkosong valid utk mailpit (tanpa auth); wajib diisi kalau SMTP eksternal butuh auth
EMAIL_FROMAlamat pengirimWajibno-reply@alurkerja.com
MAIL_HOST / MAIL_PORT / MAIL_USERNAME / MAIL_PASSWORDAlias EMAIL_* utk service dgn naming bedaMengikuti status EMAIL_* (alias, otomatis)-

8. JWT Configuration

VariabelDeskripsiStatusDefault/Contoh
JWT_SECRETSecret signing token aksesWajib (installer: generate otomatis — step Generate secrets, atau flag --jwt-secret)-
JWT_REFRESH_TOKEN_SECRETSecret signing refresh tokenWajib (installer: generate otomatis — step Generate secrets, atau flag --jwt-refresh-secret)-
JWT_EXPIRATION / JWT_EXPIRES_IN_HOURS / JWT_SESSION_DAYS / JWT_REFRESH_TOKEN_EXPIRATIONMasa berlaku tokenOptionalsudah ada default aman
ROUTER_JWT_SECRETAlias JWT_SECRET utk routerWajib (alias, otomatis)-

9. Encryption Configuration (Tenant Settings)

VariabelDeskripsiStatusDefault/Contoh
TENANT_SETTINGS_ENCRYPTION_KEYKey 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_IVIV 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_IVAlias TENANT_SETTINGS_ENCRYPTION_KEY/IVWajib (alias, otomatis)sama alasan

10. Camunda Configuration (Migration Service)

VariabelDeskripsiStatusDefault/Contoh
CAMUNDA_URLURL Camunda engine-restWajib-
CAMUNDA_LOGINAktifkan auth loginOptionaltrue (tidak disarankan false/tanpa auth)
CAMUNDA_USERNAME / CAMUNDA_PASSWORDKredensial CamundaWajib selama CAMUNDA_LOGIN=true (default)-

11. GitLab Configuration (fitur tambahan — incident tracking)

VariabelDeskripsiStatusDefault/Contoh
GITLAB_BASE_URL / GITLAB_TOKEN / GITLAB_PROJECT_IDKredensial & target project GitLabOptionalkosong = integrasi nonaktif
GITLAB_INCIDENT_TAGLabel tag incidentOptionalincident

12. Laravel Passport Configuration

VariabelDeskripsiStatusDefault/Contoh
LARAVEL_PASSPORT_ENABLEDAktifkan Laravel Passport authOptionalfalse (fitur nonaktif)
LARAVEL_PASSPORT_PRIVATE_KEY_PATHPath private keyOptionalhanya relevan kalau ENABLED=true

13. Website / Application URL

VariabelDeskripsiStatusDefault/Contoh
WEBSITE_URLBase URL aplikasi (dipakai callback, link email, dll)Wajibhttp://localhost:8100
COMPANY_PROFILE_SERVICE_URLURL internal service company profileWajibhttp://onprem-compro-be:3004

14. Service Port Configuration

VariabelDeskripsiStatusDefault/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_PORTPort internal tiap serviceWajibharus konsisten dgn docker-compose.yml & nginx/default.conf.docker
NOTIFICATION_SERVICE_URLURL internal notification serviceWajib (alias, otomatis dari NOTIFICATION_API_PORT)-

15. HTTP / Server Configuration

VariabelDeskripsiStatusDefault/Contoh
HTTP_READ_TIMEOUT / HTTP_WRITE_TIMEOUT / HTTP_SHUTDOWN_TIMEOUTTimeout HTTP serverOptionalsudah ada default aman
HTTP_CORS_ENABLED / HTTP_CORS_ORIGINS / HTTP_CORS_MAX_AGE / HTTP_ALLOW_CREDENTIALSKebijakan CORSOptionaldefault HTTP_CORS_ORIGINS=* longgar — disarankan dipersempit di produksi, tapi tidak fatal
HTTP_ENABLE_PREFORKMode prefork serverOptionalfalse
SERVER_READ_TIMEOUT / SERVER_WRITE_TIMEOUT / SERVER_IDLE_TIMEOUTTimeout tambahanOptionalsudah ada default

16. Router Service Specific

VariabelDeskripsiStatusDefault/Contoh
ROUTER_LOG_LEVELLevel log routerOptionalinfo
ROUTER_CONFIG_PATHPath file rules routingWajibconfig/rules.json — router tidak start tanpa file ini
ROUTER_TENANT_HEADERNama header tenantOptionalx-active-tenant (harus konsisten dgn FE kalau diubah)
ROUTER_TENANT_REQUIREDWajibkan header tenant di tiap requestOptionaltrue
ROUTER_ENABLE_METRICSAktifkan endpoint metricsOptionaltrue

17. Report Service — Queue Processor

VariabelDeskripsiStatusDefault/Contoh
ENABLE_QUEUE_PROCESSORAktifkan pemrosesan report asyncOptionaltrue
QUEUE_POLLING_INTERVAL / QUEUE_BATCH_SIZE / QUEUE_WORKER_COUNTTuning worker queueOptionalsudah ada default

18. Generate Test Service Specific

VariabelDeskripsiStatusDefault/Contoh
APP_NAMELabel nama serviceOptionalgenerate-test-service
APP_ENVMode environmentOptionallocal — disarankan production saat deploy, tidak fatal kalau lupa
APP_DEBUGMode debugOptionaltrue — disarankan false di produksi (risiko verbosity/keamanan, bukan blocker)
APP_TIMEZONETimezone serviceOptionalAsia/Jakarta
LOCAL_USER_IDFallback user id utk testing lokalOptional4
API_PREFIXPrefix routing internalWajib/api/v1/generate-test — harus konsisten dgn nginx
SWAGGER_HOSTOverride host Swagger UIOptionalkosong = pakai host request

19. Upload Configuration

VariabelDeskripsiStatusDefault/Contoh
UPLOAD_MAX_SIZEBatas ukuran upload (byte)Optional10485760 (10MB)
UPLOAD_ALLOWED_TYPESWhitelist MIME typeOptionalimage/pdf umum sudah tercakup
UPLOAD_PATHPath storage lokalOptionalhanya relevan utk fallback non-MinIO

20. Nginx / Domain Configuration

VariabelDeskripsiStatusDefault/Contoh
NGINX_DOMAIN / SSO_DOMAIN / STUDIO_DOMAIN / COMPRO_DOMAIN / SIMULATION_DOMAIN / MICROSITE_DOMAIN / CAMUNDA_DOMAINDomain per modul, dipakai server_name di nginx/default.conf.dockerWajibtidak sinkron = routing 404

21. MinIO Configuration (Additional)

VariabelDeskripsiStatusDefault/Contoh
MINIO_URLURL MinIO dipakai backend generate presigned URLWajib (alias STORAGE_URL_PREFIX, otomatis)-

22. Telegram Bot Configuration

VariabelDeskripsiStatusDefault/Contoh
TELEGRAM_BOT_USERNAME / TELEGRAM_BOT_TOKENKredensial botOptionalfitur notifikasi tambahan, nonaktif kalau tidak dipakai
TELEGRAM_MODEMode koneksi botOptionalpolling

23. Onboarding Configuration

VariabelDeskripsiStatusDefault/Contoh
ONBOARDING_DRYRUNMode simulasi tanpa efek nyataOptionaltrue (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:

GrupVariabelStatus
FreeIPAFREEIPA_URL, FREEIPA_USERNAME, FREEIPA_PASSWORDOptional
TaigaTAIGA_URL, TAIGA_USERNAME, TAIGA_PASSWORDOptional
ActiveCollabACTIVECOLLAB_URL, ACTIVECOLLAB_USERNAME, ACTIVECOLLAB_PASSWORD, ACTIVECOLLAB_TOKENOptional
APIBaseAPIBASE_URL, APIBASE_USERNAME, APIBASE_PASSWORDOptional
OdooODOO_URL, ODOO_VERSION (default 17), ODOO_DB, ODOO_USERNAME, ODOO_PASSWORDOptional

29. Service Camunda Configuration

VariabelDeskripsiStatusDefault/Contoh
SERVICE_CAMUNDA_URLURL publik tasklist Camunda (via nginx /camunda)Wajibdipakai FE link ke tasklist

30–31. Database Integrasi Eksternal (kosong secara default)

GrupVariabelStatus
Database TaigaDBTAIGA_URL, DBTAIGA_USERNAME, DBTAIGA_PASSWORDOptional — hanya relevan kalau integrasi Taiga level-DB dipakai
Database CollabDBCOLLAB_URL, DBCOLLAB_USERNAME, DBCOLLAB_PASSWORDOptional — hanya relevan kalau integrasi ActiveCollab level-DB dipakai

32. WhatsApp API Configuration

VariabelDeskripsiStatusDefault/Contoh
WHATSAPP_API_KEY / WHATSAPP_API_URL / WHATSAPP_NUMBER_KEY / WHATSAPP_WEBHOOK_URLKredensial & endpoint WhatsApp APIOptionalnotifikasi via WhatsApp adalah fitur tambahan

33. Webhook Configuration

VariabelDeskripsiStatusDefault/Contoh
WEBHOOK_URL / WEBHOOK_USERNAME / WEBHOOK_PASSWORDOutbound webhook generikOptionalfitur tambahan

34. Integration Configuration

VariabelDeskripsiStatusDefault/Contoh
INTEGRATION_SYSTEMMode sistem (on-premise vs SaaS)Wajibonpremise
INTEGRATION_EXECUTORFlag internal routingOptionalsaas
INTEGRATION_BASE_URLBase URL API dipanggil balikWajibhttp://localhost:8100/api/v1
INTEGRATION_AUTH_TYPEStrategi auth service integrationWajibkeycloak
INTEGRATION_AUTH_URL / INTEGRATION_AUTH_REALMAlias KEYCLOAK_URL/KEYCLOAK_REALMWajib (alias, otomatis)-
INTEGRATION_AUTH_CLIENT_ID / INTEGRATION_AUTH_CLIENT_SECRETClient Keycloak khusus service integrationWajib (installer: hasil setup-keycloak.sh; mode Keycloak eksternal + manual: diisi user)-

35. App Configuration

VariabelDeskripsiStatusDefault/Contoh
APP_INTEGRATION_SYSTEMFlag internal mode sistemWajibONPREMISE
APP_AUTH_SERVICEProvider auth aktifWajibKEYCLOAK
APP_NOTIFICATION_EXTERNALNotifikasi via service eksternalOptionaltrue
APP_NOTIFICATION_URLURL service notifikasiWajib 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.

VariabelDeskripsiStatusDefault/Contoh
VITE_API_BASEURL / VITE_API_TASKLIST_BASEURLBase URL API dipanggil FEWajibhttp://localhost:8100
VITE_AUTH_METHODMetode login FE (keycloak / alurkerja_sso)Wajibkeycloak
VITE_KEYCLOAK_URL / VITE_KEYCLOAK_REALM / VITE_KEYCLOAK_CLIENT_ID / VITE_KEYCLOAK_CLIENT_SECRET / VITE_KEYCLOAK_REDIRECT_URIConfig Keycloak FEWajib selama VITE_AUTH_METHOD=keycloak (default)alias KEYCLOAK_*
VITE_AK_CLIENT_ID / VITE_AK_CLIENT_SECRET / VITE_AK_REDIRECT_URIConfig AlurKerja SSO customOptionalhanya dipakai kalau VITE_AUTH_METHOD=alurkerja_sso (bukan default)
VITE_MINIO_CLOUD / VITE_MINIO_BUCKET / VITE_MINIO_BASE_URLAlias MINIO_* utk FE upload/preview fileWajib (alias, otomatis)-
VITE_MICROSITE_URLLink ke micrositeWajibhttp://microsite.localhost:8100
VITE_APP_URL / VITE_STUDIO_URL / VITE_COMPRO_URL / VITE_SIMULATION_SERVICE_URLNavigasi antar-modul FE (versi lama)Wajib-
VITE_ALURKERJA_CONTACT_URL / VITE_CONTACT_URLLink kontak/marketingOptionalbukan blocker fungsional
VITE_NEW_APP_URL / VITE_NEW_STUDIO_URL / VITE_NEW_COMPRO_URL / VITE_NEW_SIMULATION_SERVICE_URLNavigasi antar-modul FE (onprem-app-fe-new)Wajib-
VITE_SIMULATION_BE_SERVICE_URLBase URL backend simulasiWajib-
VITE_WS_NOTIFICATION_URLWebSocket notifikasi realtimeWajibtanpa ini notifikasi realtime patah
VITE_WS_COLLABORATION_URLWebSocket kolaborasi realtimeWajibtanpa ini fitur kolaborasi patah
VITE_SENTRY_DSNDSN Sentry sisi FEOptionalsama alasan grup #5
VITE_QUERY_DEBUGDebug query FEOptionalfalse
VITE_PRODUCTIONFlag mode build FEOptionaltrue
VITE_URL_GET_MANAGER / VITE_URL_GET_MANAGER_USERNAME / VITE_URL_GET_MANAGER_PASSWORDIntegrasi n8n manager (app-react only)Optionalfitur spesifik, kosong = nonaktif
VITE_BASIC_AUTH_ALURKERJA_USERNAME / VITE_BASIC_AUTH_ALURKERJA_PASSWORDBasic auth tambahan FEOptionalkosong = basic auth nonaktif
VITE_AZURE_CLIENT_ID / VITE_AZURE_TENANT_ID / VITE_AZURE_REDIRECT_URI / VITE_AZURE_AUTHORITYSSO Azure AD (studio-react only)Optionalkosong di .env = nonaktif

37. Microsite Configuration (Next.js Application)

VariabelDeskripsiStatusDefault/Contoh
MICROSITE_NODE_ENVMode Node.jsOptionalproduction
MICROSITE_APP_DEBUGMode debugOptionalfalse
MICROSITE_REDIS_ENABLEDPakai Redis khusus micrositeOptionalfalse (microsite jalan tanpa ini)
MICROSITE_API_BASE_URLBase URL API utamaWajibhttp://localhost:8100/api/v1
KEYCLOAK_HOSTAlias KEYCLOAK_URLWajib (alias, otomatis)-
KEYCLOAK_ADMIN_CLIENT / KEYCLOAK_ADMIN_SECRETAlias KEYCLOAK_CLIENT/CLIENT_SECRET, dipakai integration service utk Keycloak admin APIWajib (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/.envVITE_API_BASEURL, VITE_API_TASKLIST_BASEURL, VITE_AUTH_METHOD, VITE_KEYCLOAK_*, VITE_SENTRY_DSNWajib diisi sebelum build, atau FE ini salah konfigurasi permanen sampai di-build ulang.
  • builds/simulation-react/.envVITE_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 -v

Expected: 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-download
rm -rf /path/ke/folder-download

Perhatian: .env (termasuk application secrets) ikut terhapus bersama folder ini dan tidak bisa dipulihkan.

3. Logout Harbor

docker logout harbor.merapi.javan.id

4. 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 -aperhatian: 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 this page

A. Ringkasan & Definition of DoneB. Prasyarat1. Verifikasi Docker Desktop berjalan2. Verifikasi Git terpasang3. Verifikasi akun Harbor4. Verifikasi free storage minimal 8 GBC. Instalasi & Jalankan CLI5.1. Instalasi cepat (otomatis)5.2. Download manual & jalankan binaryD. Eksekusi Pipeline build-alurkerja6. Isi input yang diminta7. Pantau pipeline sampai selesaiE. Verifikasi & Akses Pertama Kali8. Validasi semua container running9. Akses aplikasiF. TroubleshootingG. Logbook InstalasiH. Variabel Environment1. Database Configuration (PostgreSQL)Prasyarat Schema Database (public.sql) — Extension pgvector2. Keycloak Configuration3. MinIO / Storage Configuration4. Redis / Cache Configuration5. Sentry Configuration6. OpenAI Configuration7. Email Configuration (Notification & Tenant Management)8. JWT Configuration9. Encryption Configuration (Tenant Settings)10. Camunda Configuration (Migration Service)11. GitLab Configuration (fitur tambahan — incident tracking)12. Laravel Passport Configuration13. Website / Application URL14. Service Port Configuration15. HTTP / Server Configuration16. Router Service Specific17. Report Service — Queue Processor18. Generate Test Service Specific19. Upload Configuration20. Nginx / Domain Configuration21. MinIO Configuration (Additional)22. Telegram Bot Configuration23. Onboarding Configuration24–28. Integrasi Eksternal Opsional (kosong secara default)29. Service Camunda Configuration30–31. Database Integrasi Eksternal (kosong secara default)32. WhatsApp API Configuration33. Webhook Configuration34. Integration Configuration35. App Configuration36. Frontend — Runtime Injection (app-react & studio-react)37. Microsite Configuration (Next.js Application)38. Frontend — Build-time Only (compro-react & simulation-react)I. Cleanup Instalasi Lokal