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.
A. Ringkasan & Definition of Done
Panduan ini ditujukan untuk tim yang ingin menjalankan AlurKerja di satu host Linux tanpa cluster Kubernetes. Seluruh workload berjalan sebagai container di atas Docker Compose; Nginx di luar Docker bertindak sebagai reverse proxy + SSL termination.
Definition of Done (DoD) — instalasi dianggap selesai bila:
- Semua 17 container AlurKerja dalam state
runningdan health checkhealthy. - Endpoint frontend (App, Studio, Compro, Simulation), Camunda web, dan API gateway merespons HTTP 200 / 30x via HTTPS.
- Pengguna admin pertama berhasil login dan membuat tenant.
- Logbook instalasi terisi lengkap dan ditandatangani implementor + reviewer.
Estimasi waktu eksekusi: 2–3 jam untuk tim ops yang akrab dengan Docker (tidak termasuk waktu penyiapan data prasyarat).
Versi yang divalidasi:
| Komponen | Versi |
|---|---|
| Docker Engine | 29.5.2 |
| Docker Compose | v5.1.4 |
Sebelum mulai, download template logbook: alurkerja-install-docker-checklist.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–6 memastikan environment siap. Hentikan dan perbaiki bila ada langkah yang gagal — jangan lanjut sebelum prasyarat terpenuhi.
1. Verifikasi Docker terpasang
Aksi
docker version --format '{{.Server.Version}}'Expected output
29.5.2 atau lebih baru.
Jika gagal: kalau Docker belum terpasang, install mengikuti panduan resmi untuk distro yang dipakai (
apt,yum, atau scriptget.docker.com). Versi minimum yang divalidasi adalah29.5.2.
2. Verifikasi Docker Compose terpasang
Aksi
docker compose versionExpected output
Docker Compose version v5.1.4 atau lebih baru.
versi ≥ v5.1.4. Gunakan docker compose (V2, plugin) bukan docker-compose (V1 standalone).
Jika gagal: kalau plugin belum ada, install via
apt install docker-compose-pluginatau unduh binary dari GitHub releasesdocker/compose.
3. Verifikasi user tergabung dalam group docker
Aksi
groupsExpected output
Output mengandung docker.
Jika gagal: kalau tidak ada, jalankan
sudo usermod -aG docker $USERlalu logout dan login ulang. Alternatif: prefix semua commanddockerdengansudo.
4. Verifikasi konektivitas PostgreSQL
Aksi
Dari host instalasi:
psql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
-c "SELECT version();"Expected output
Banner PostgreSQL versi 13 atau lebih baru.
Jika gagal: kalau koneksi gagal, cek firewall dan routing dari host Docker ke host database. PostgreSQL boleh di VM terpisah atau managed service — tidak perlu di host yang sama.
5. Verifikasi domain dan HTTPS aktif
Aksi
curl -IsL https://app.{domain}/ | head -3Expected output
HTTP/2 200atau redirect 30x (tergantung apakah halaman frontend sudah di-deploy sebelumnya).
tidak ada SSL error (SSL certificate problem, unable to get local issuer certificate, dst). Status code 200, 301, atau 302 diterima.
Perhatian: wildcard certificate
*.{domain}sudah aktif dan Nginx sudah dikonfigurasi untuk meneruskan request ke host target instalasi. Kalau HTTPS masih error, koordinasi dengan tim network sebelum lanjut — jangan skip validasi ini.
6. Verifikasi akses Harbor registry
Aksi
docker login harbor.merapi.javan.idExpected output
Login Succeeded.
Jika gagal: kalau gagal, minta credential Harbor ke tim Javan (registry image AlurKerja terpusat di
harbor.merapi.javan.id). Credential ini akan dipakai untuk pull image di Step 20.
C. Arsitektur Ringkas
AlurKerja terdiri dari 17 container yang berjalan dalam satu Docker Compose project:
- 1 cache —
redis(untuk session + cache aplikasi). - 11 backend Go —
onprem-auth,onprem-bpm,onprem-tenant,onprem-compro-be,onprem-notification,onprem-integration,onprem-report,onprem-generate-test,onprem-proxy,onprem-migration,onprem-simulation-be. - 1 backend Java (Camunda) —
onprem-camunda, mesin BPMN/workflow engine. - 4 frontend —
onprem-app-fe,onprem-studio-fe,onprem-compro-fe,onprem-simulation-fe.
Nginx berjalan di luar Docker sebagai reverse proxy dan menangani SSL termination untuk domain *.{domain}. Traffic masuk ke Nginx, diteruskan ke port container via localhost. Diagram berikut memakai contoh host *.domain.tld agar parser Mermaid tidak bentrok dengan placeholder kurung kurawal.
D. Persiapan
Langkah 7–9 menyiapkan direktori kerja dan credential.
7. Set variabel instalasi
Aksi
export DOMAIN="{domain}"
export INSTALL_DIR="/opt/alurkerja"Nilai di atas adalah contoh. Sesuaikan DOMAIN kalau pelanggan menggunakan domain berbeda. INSTALL_DIR adalah direktori tempat repo manifest dan data persistent disimpan.
Expected output
Tidak ada — assignment env var.
echo $DOMAIN $INSTALL_DIR menampilkan kedua nilai.
Perhatian: variabel ini dipakai di langkah-langkah berikutnya. Set ulang bila terminal di-restart sebelum instalasi selesai.
8. Buat direktori instalasi
Aksi
sudo mkdir -p ${INSTALL_DIR}
sudo chown $USER:$USER ${INSTALL_DIR}Expected output
Tidak ada (silent success).
ls -la ${INSTALL_DIR} menampilkan direktori dengan owner user aktif.
Perhatian: direktori ini akan menyimpan docker-compose.yml, konfigurasi, dan data persistent volume.
9. Clone repo manifest Docker
Aksi
git clone git@gitlab.javan.co.id:alurkerja/on-premises.git ${INSTALL_DIR}
cd ${INSTALL_DIR}
git checkout feat/docker-composeExpected output
Repo terdownload dan branch deployment Docker Compose aktif. Working directory berisi docker-compose.yml, config/, nginx/, dsb.
ls ${INSTALL_DIR} menampilkan docker-compose.yml, config/, nginx/.
Jika gagal: kalau tidak ada akses, minta read access ke tim Javan melalui kanal support yang berlaku.
E. Konfigurasi
Langkah 10–18 mengisi semua nilai konfigurasi. Bagian ini paling rawan kesalahan — patuhi urutan dan validasi tiap langkah.
Jangan commit nilai rahasia asli. Edit file .env di working copy lokal, tapi jangan git add setelah diisi nilai produksi. File .env sudah masuk .gitignore di repo — pastikan tetap seperti itu.
10. Salin template environment
Aksi
cp ${INSTALL_DIR}/.env.example ${INSTALL_DIR}/.envExpected output
File .env terbuat di root INSTALL_DIR.
ls -la ${INSTALL_DIR}/.env menampilkan file dengan ukuran > 0.
Perhatian: jangan edit langsung
.env.example— kalau contoh terupdate di repo, kamu butuh file example yang bersih.
11. Edit .env — konfigurasi database
Aksi
$EDITOR ${INSTALL_DIR}/.envIsi bagian database mengikuti tabel berikut:
| Variabel | Nilai | Catatan |
|---|---|---|
DB_HOST | hostname PostgreSQL | Wajib |
DB_PORT | 5432 | Default PostgreSQL |
DB_USER | user database AlurKerja | Wajib |
DB_PASSWORD | password user database | Wajib |
DB_NAME | nama database | Wajib |
DB_SCHEMA | public | Default; jangan ubah kecuali ada keperluan khusus |
DB_PASS | sama dengan DB_PASSWORD | Duplikat untuk service yang masih pakai nama lama |
Expected output
File tersimpan dengan semua field database terisi.
grep -cE '^DB_(HOST|PORT|USER|PASSWORD|NAME)=$' ${INSTALL_DIR}/.env menampilkan 0 (tidak ada field yang masih kosong).
Perhatian: pastikan tidak ada spasi di sekitar
=di file.env. Format harusKEY=value, bukanKEY = value.
12. Edit .env — konfigurasi aplikasi
Aksi
Lanjutkan edit .env. Isi bagian berikut:
| Variabel | Nilai | Catatan |
|---|---|---|
*_DOMAIN | {domain} | Base domain tanpa wildcard |
JWT_SECRET | random string ≥ 64 char | Generate dengan openssl rand -hex 64 |
JWT_REFRESH_TOKEN_SECRET | random string ≥ 64 char | Berbeda dari JWT_SECRET |
TENANT_SETTINGS_ENCRYPTION_KEY | 32-byte key | Generate dengan openssl rand -hex 32 |
TENANT_SETTINGS_ENCRYPTION_IV | 16-byte IV | Generate dengan openssl rand -hex 16 |
REDIS_HOST | redis | Nama service di docker-compose; jangan ubah |
REDIS_PORT | 6379 | Default Redis |
REDIS_PASSWORD | (kosong atau isi) | Isi kalau Redis butuh auth |
REDIS_DB | 0 | |
MINIO_ENDPOINT | endpoint MinIO | Contoh: minio.acme.local:9000 |
MINIO_ACCESS_KEY | access key MinIO | Wajib |
MINIO_SECRET_KEY | secret key MinIO | Wajib |
MINIO_BUCKET_NAME | bucket untuk file tenant | Default: tenant-uploads |
MINIO_USE_SSL | true / false | false jika MinIO tanpa TLS |
KEYCLOAK_URL | URL Keycloak SSO | Kosongkan kalau SSO belum aktif |
KEYCLOAK_REALM | realm Keycloak | Contoh: alurkerja-prod |
KEYCLOAK_CLIENT | client ID Keycloak | Default: onprem-client |
KEYCLOAK_CLIENT_SECRET | client secret Keycloak | Wajib jika SSO aktif |
Expected output
File tersimpan tanpa placeholder <YOUR_*> tersisa.
grep -n '<YOUR_' ${INSTALL_DIR}/.env tidak menemukan baris (exit code 1).
Perhatian: generate semua JWT dan encryption key dengan
openssl rand— jangan reuse string dari environment lain.
13. Edit konfigurasi domain Nginx
Aksi
$EDITOR ${INSTALL_DIR}/nginx/default.conf.dockerSesuaikan semua host/domain virtual host agar mengikuti domain target deployment, minimal untuk endpoint berikut:
app.{domain}studio.{domain}compro.{domain}simulation.{domain}api.{domain}camunda.{domain}
Jika file masih memakai domain contoh, ganti seluruh host tersebut sebelum deploy.
Expected output
File tersimpan dengan seluruh server_name dan routing host mengarah ke domain target.
grep -nE 'app\.|studio\.|compro\.|simulation\.|api\.|camunda\.' ${INSTALL_DIR}/nginx/default.conf.docker menampilkan host yang sesuai domain target.
Perhatian: kalau masih ada domain contoh atau host lama, frontend dan API bisa tetap hidup tetapi tidak akan bisa diakses lewat hostname yang benar.
14. Edit konfigurasi Camunda
Aksi
$EDITOR ${INSTALL_DIR}/config/camunda_application.yamlField yang wajib di-override:
spring:
minio:
url: <MINIO_URL>
accessKey: <MINIO_ACCESS_KEY>
secretKey: <MINIO_SECRET_KEY>
datasource:
url: jdbc:postgresql://<DB_HOST>:<DB_PORT>/<DB_NAME>?autoReconnect=true
username: <DB_USER>
password: <DB_PASSWORD>
hikari:
schema: camunda
camunda.bpm.admin-user:
id: <CAMUNDA_USERNAME>
password: <CAMUNDA_PASSWORD>Ganti <CAMUNDA_PASSWORD> dengan password kuat — jangan biarkan default admin di production. Password ini dipakai untuk akses Camunda Cockpit di camunda.{domain}.
Expected output
File tersimpan dengan semua field database dan MinIO sudah berisi nilai environment target.
grep -nE '<[A-Z_]+>' ${INSTALL_DIR}/config/camunda_application.yaml tidak menemukan baris.
Perhatian: schema Camunda di datasource harus
camunda(matching Step 27 schema init). Schema yang salah menyebabkan Camunda gagal start.
15. Verifikasi konfigurasi domain di docker-compose.yml
Aksi
grep -n 'DOMAIN\|VITE_\|REACT_APP_\|NEXT_PUBLIC_' ${INSTALL_DIR}/docker-compose.yml | head -30Expected output
Variabel domain/URL frontend tereferensi ke env var dari .env, bukan hardcode.
tidak ada literal merapi.javan.id atau dummy.local di docker-compose.yml.
Jika gagal: kalau ada hardcode Linknet/dev, ganti dengan variabel env yang sudah di-set di
.env.
16. Validasi tidak ada placeholder tersisa
Aksi
grep -rn '<YOUR_\|dummy\.local\|lpp\.merapi\.javan\.id' \
${INSTALL_DIR}/.env \
${INSTALL_DIR}/config/Expected output
Tidak ada baris yang cocok (exit code 1).
Jika gagal: kalau masih ada placeholder, hentikan proses dan kembali ke Step 11–14 untuk mengganti. Jangan jalankan
docker compose updengan placeholder tersisa.
17. Verifikasi tidak ada secret yang akan di-commit
Aksi
git -C ${INSTALL_DIR} statusExpected output
File .env dan config/camunda_application.yaml tidak muncul di "Changes to be committed".
kedua file ada di bagian "Changes not staged" atau "Untracked files", atau tidak muncul sama sekali.
Jika gagal: kalau ter-stage,
git -C ${INSTALL_DIR} restore --staged .env config/camunda_application.yaml.
18. Verifikasi port tidak bentrok di host
Aksi
ss -tlnp | grep -E ':(3000|3001|3002|3003|8080|8081|6379)\s'Expected output
Tidak ada output (port-port tersebut kosong).
Jika gagal: kalau ada proses lain yang memakai port tersebut, hentikan proses itu atau ubah port mapping di
docker-compose.ymldan sesuaikan konfigurasi Nginx.
F. Deploy
Langkah 19–24 menarik image dan menjalankan seluruh stack. Jika PostgreSQL berjalan di dalam Docker Compose, langkah 22–24 wajib dilakukan sebelum inisialisasi schema. Jika PostgreSQL external, langkah 22–23 bisa dianggap tidak berlaku dan schema boleh dikerjakan lebih awal setelah koneksi database terverifikasi.
19. Login ke Harbor registry dari host
Aksi
docker login harbor.merapi.javan.idExpected output
Login Succeeded.
pesan Login Succeeded. Credential tersimpan di ~/.docker/config.json dan akan dipakai docker compose pull.
Jika gagal: kalau gagal, periksa credential (minta ke tim Javan) dan pastikan host bisa reach
harbor.merapi.javan.id(cobacurl -I https://harbor.merapi.javan.id).
20. Pull semua image
Aksi
cd ${INSTALL_DIR}
docker compose pullExpected output
Progress pull per image; diakhiri docker compose pull sukses tanpa error.
semua image berhasil di-pull (tidak ada baris error atau unauthorized).
Perhatian: pull memakan waktu 5–20 menit tergantung bandwidth. Kalau ada image yang
unauthorized, re-login Harbor (Step 19) dan ulangi.
21. Jalankan stack
Aksi
Pilih skenario yang sesuai:
cd ${INSTALL_DIR}
docker compose up -d postgresLalu lanjutkan ke Step 25–28 untuk inisialisasi schema sebelum menyalakan seluruh stack aplikasi.
cd ${INSTALL_DIR}
docker compose up -dExpected output
- Jika PostgreSQL di Docker Compose: service
postgresberhasil dijalankan. - Jika PostgreSQL external: baris
Container <name> Starteduntuk setiap container yang didefinisikan di stack.
tidak ada baris Error atau Exited.
Perhatian:
docker compose up -dbersifat idempoten — boleh diulang. Untuk skenario PostgreSQL di Docker Compose, setelah schema selesai di Step 25–28, jalankan lagidocker compose up -duntuk menyalakan service aplikasi lainnya.
22. Validasi PostgreSQL siap menerima koneksi
Aksi
pg_isready -h <DB_HOST> -p <DB_PORT> -U <USER_DB> -d <DB_NAME>Expected output
Output accepting connections.
Jika gagal: kalau masih
starting upatauno response, tunggu 15–30 detik lalu ulangi. Jangan jalankan script schema sebelum PostgreSQL siap. Command ini bisa dipakai baik untuk PostgreSQL external maupun PostgreSQL yang dijalankan lewat Docker Compose selama<DB_HOST>dan<DB_PORT>mengarah ke instance yang benar.
23. Validasi service database terpasang di stack (khusus PostgreSQL di Docker Compose)
Aksi
docker compose ps postgresExpected output
Service postgres tampil dengan status running atau healthy.
Jika gagal: kalau nama servicenya bukan
postgres, sesuaikan command dengan nama service database padadocker-compose.yml.
24. Validasi service inti sudah terbuat
Aksi utama
docker compose psExpected output
Daftar container tampil dan service inti (postgres, redis, gateway, frontend, Camunda) sudah terbuat.
Perhatian: pada tahap ini service aplikasi lain mungkin belum sehat penuh sebelum schema diinisialisasi; itu normal.
Langkah tambahan berikut hanya untuk instalasi pertama (first-time setup). Jika environment ini sudah pernah diinisialisasi sebelumnya, lewati setup Keycloak dan lanjut ke bagian schema database.
Langkah tambahan (first-time setup only)
-
Tambahkan helper service
alpine-toolskedocker-compose.ymlalpine-tools: build: context: . dockerfile: builds/alpine-tools/Dockerfile container_name: alurkerja-alpine-tools working_dir: /work volumes: - ./:/work restart: unless-stopped env_file: - .env -
Gunakan isi
Dockerfileberikut sebagai referensiFROM alpine:3.20 RUN apk add --no-cache bash curl jq postgresql-client busybox-extras redis WORKDIR /work CMD ["tail", "-f", "/dev/null"] -
Build dan jalankan helper container
docker compose up -d --build alpine-tools -
Jalankan bootstrap Keycloak dari dalam container
docker compose exec -T alpine-tools bash scripts/setup-keycloak.sh -
Rapikan Access settings client Keycloak yang dipakai AlurKerja
- sesuaikan Root URL, Home URL, Valid redirect URIs, Valid post logout redirect URIs, dan Web origins dengan domain deployment
- pastikan URL mengarah ke domain target yang benar, mis.
https://app.{domain},https://studio.{domain}, atau endpoint lain yang memang dipakai client tersebut - matikan Client authentication bila client tersebut dipakai sebagai public/browser client
-
Rapikan Realm settings → Security defenses
Ubah Content-Security-Policy menjadi:
frame-src 'self'; frame-ancestors 'self' https://*.{domain} ; object-src 'none';
Expected output tambahan (first-time setup only)
- container
alpine-toolsberhasil hidup - script
scripts/setup-keycloak.shselesai tanpa error - resource awal Keycloak (realm/client/user bootstrap sesuai isi script) berhasil dibuat
- konfigurasi Access settings client sudah sesuai domain deployment
- Content-Security-Policy realm sudah mengizinkan
frame-ancestorskehttps://*.{domain}
Perhatian: kalau Client authentication dibiarkan aktif pada client browser/public yang seharusnya tidak memerlukan secret, flow login bisa gagal atau redirect dianggap invalid. Jika Content-Security-Policy realm tidak disesuaikan, halaman/embed yang bergantung pada frame dari domain deployment bisa diblokir browser. Helper image
alpine-toolsini juga berguna untuk validasi internal URL, pengecekan HTTP dari network Docker, query PostgreSQL, pengecekan Redis, dan utilitas diagnostik lain selama instalasi atau troubleshooting.
G. Schema Database
Langkah 25–28 menyiapkan schema database.
- Jika PostgreSQL di Docker Compose: kerjakan bagian ini setelah langkah 22–24 selesai.
- Jika PostgreSQL external: bagian ini boleh dijalankan segera setelah konfigurasi selesai dan koneksi database terverifikasi, tanpa menunggu langkah 22–23.
25. Jalankan script init database
Aksi
Pilih skenario yang sesuai:
docker compose exec -T postgres \
psql -U <USER_DB> -d postgres -v ON_ERROR_STOP=1 \
< ${INSTALL_DIR}/config/init-db.sqlpsql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/postgres" \
-v ON_ERROR_STOP=1 \
-f ${INSTALL_DIR}/config/init-db.sqlJika nama user database yang dipakai bukan postgres, buka ${INSTALL_DIR}/config/init-db.sql terlebih dahulu lalu sesuaikan statement GRANT, ALTER DATABASE, ALTER SCHEMA, atau ownership lain agar mengarah ke user database yang benar sebelum script dijalankan. Ganti placeholder <USER_DB> pada command dengan user database yang benar. Script ini dijalankan ke database bootstrap postgres, bukan ke <DB_NAME>, karena database target bisa saja belum ada saat langkah ini dieksekusi.
Untuk skenario PostgreSQL di Docker Compose, file SQL dikirim lewat stdin ke psql di container postgres, jadi tidak membutuhkan mount file tambahan ke dalam container. Pastikan service postgres sudah berstatus running/healthy sebelum command dijalankan.
Expected output
Statement inisialisasi database bootstrap berjalan tanpa error, termasuk bila script membuat database target baru.
exit code 0 (echo $? menampilkan 0).
Jika gagal: kalau muncul error privilege/owner, edit dulu
${INSTALL_DIR}/config/init-db.sqlagar privilege diberikan ke user database yang benar, lalu jalankan ulang.
26. Inisialisasi schema dasar AlurKerja
Aksi
Pilih skenario yang sesuai:
docker compose exec -T postgres \
psql -U <USER_DB> -d <DB_NAME> -v ON_ERROR_STOP=1 \
< ${INSTALL_DIR}/config/public.sqlpsql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
-v ON_ERROR_STOP=1 \
-f ${INSTALL_DIR}/config/public.sqlExpected output
Beberapa baris CREATE TABLE, CREATE INDEX, tanpa error.
exit code 0 (echo $? menampilkan 0).
Perhatian: flag
-v ON_ERROR_STOP=1memastikan script berhenti pada error pertama. Kalau gagal karena tabel sudah ada (instalasi sebelumnya), drop dulu:DROP SCHEMA public CASCADE; CREATE SCHEMA public;— pastikan tidak ada data penting.
27. Inisialisasi schema Camunda
Aksi
Pilih skenario yang sesuai:
docker compose exec -T postgres \
psql -U <USER_DB> -d <DB_NAME> -v ON_ERROR_STOP=1 \
< ${INSTALL_DIR}/config/camunda.sqlpsql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
-v ON_ERROR_STOP=1 \
-f ${INSTALL_DIR}/config/camunda.sqlExpected output
Banyak baris CREATE TABLE camunda.act_* (~50 tabel Camunda 7).
exit code 0.
Perhatian: jangan modifikasi file ini — di-maintain oleh upstream Camunda. Kalau gagal karena schema sudah ada, drop dengan
DROP SCHEMA camunda CASCADE;lalu ulang.
28. Validasi tabel Camunda tersedia
Aksi
Pilih skenario yang sesuai:
docker compose exec -T postgres \
psql -U <USER_DB> -d <DB_NAME> -c "\\dt camunda.*"psql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
-c "\\dt camunda.*"Expected output
Daftar minimal 40+ tabel dengan prefix act_ (act_ru_, act_re_, act_hi_, act_id_, dst).
baris terakhir output menampilkan (NN rows) dengan NN ≥ 40.
Jika gagal: kalau jumlah tabel jauh lebih sedikit, schema tidak lengkap — drop schema dan ulang Step 27.
H. Verifikasi Deploy
Langkah 29–31 memastikan service kembali stabil setelah schema selesai diinisialisasi.
29. Validasi semua container running
Aksi
docker compose psExpected output
Semua service aplikasi utama berstatus running atau healthy.
tidak ada status exited, restarting, atau created (tanpa running) pada service utama.
Jika gagal: kalau ada container yang
restarting, itu tanda crash loop — segera cek log:docker compose logs --tail=50 <service>.
30. Validasi tidak ada container restart berulang
Aksi
docker compose ps --format "table {{.Name}} {{.Status}} {{.RunningFor}}"Tunggu 2 menit lalu jalankan lagi dan bandingkan kolom RunningFor.
Expected output
Nilai RunningFor bertambah untuk semua container (bukan reset ke detik-an).
Jika gagal: restart loop biasanya karena koneksi database gagal atau secret salah. Jalankan
docker compose logs <service> --tail=100untuk error pertama.
31. Validasi health check Redis
Aksi
docker compose exec redis redis-cli pingExpected output
PONG.
Jika gagal: kalau container Redis tidak ditemukan, periksa nama service di
docker-compose.ymldan sesuaikan nama di command.
I. Verifikasi Aplikasi
Langkah 32–36 memastikan seluruh workload merespons dan endpoint HTTPS aktif.
32. Validasi Camunda engine merespons
Aksi
curl -s http://localhost:<CAMUNDA_PORT>/engine-rest/engineGanti <CAMUNDA_PORT> dengan port yang di-expose di docker-compose.yml untuk service onprem-camunda (biasanya 8080).
Expected output
[{"name":"default"}]Jika gagal: kalau 503 atau timeout, schema Camunda mungkin belum lengkap — ulang Step 27–28. Kalau container belum selesai startup (Camunda butuh 60–120 detik), tunggu dan coba lagi.
33. Smoke test App FE via HTTPS
Aksi
curl -ILs https://app.<DOMAIN>/ | head -5Expected output
HTTP/2 200atau redirect ke /login.
status code 200 atau 30x; tidak ada SSL error.
Jika gagal: kalau 502 Bad Gateway dari Nginx, kemungkinan container App FE belum ready atau port mapping salah di Nginx. Cek:
docker compose logs onprem-app-fe --tail=30.
34. Smoke test Studio FE, Compro FE, Simulation FE
Aksi
curl -ILs https://studio.<DOMAIN>/ | head -3
curl -ILs https://compro.<DOMAIN>/ | head -3
curl -ILs https://simulation.<DOMAIN>/ | head -3Expected output
Tiga response HTTP/2 200 atau redirect 30x.
semua endpoint merespons dalam < 3 detik.
Jika gagal: kalau hanya satu yang gagal, kemungkinan container tersebut crash — cek log service terkait.
35. Smoke test API gateway
Aksi
curl -Iks https://api.<DOMAIN>/api/v1/authentication/ | head -3Expected output
HTTP/2 200 atau HTTP/2 401 (Unauthorized — wajar karena tanpa token).
status code 200 atau 401, bukan 404 atau 502.
Jika gagal: kalau 502, container
onprem-proxybelum ready — tunggu 30 detik dan ulangi.
36. Smoke test WebSocket notification
Aksi
curl -Iks \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Version: 13" \
-H "Sec-WebSocket-Key: $(openssl rand -base64 16)" \
https://api.<DOMAIN>/ws/ | head -3Expected output
HTTP/1.1 101 Switching Protocols atau HTTP/2 401.
status code 101 atau 401, bukan 404.
Perhatian: WebSocket di-route ke
onprem-notification. Kalau 404, periksa konfigurasi Nginx — pastikan path/ws/sudah di-proxy denganproxy_http_version 1.1dan header Upgrade.
J. Akses Pertama Kali
Langkah 37–41 melakukan login pertama dan setup tenant pertama.
Credential admin default berikut harus diganti segera setelah login pertama. Jangan biarkan credential default aktif di production.
37. Buka URL App FE di browser
Aksi
Buka https://app.{domain}/ di browser modern (Chrome/Firefox/Edge terkini).
Expected output
Halaman login AlurKerja dengan logo dan form email/password.
halaman ter-render lengkap (logo + form + tombol login) tanpa error di browser console.
Jika gagal: kalau ada CORS error di console, cek variabel
APP_BASE_URLdanAPI_BASE_URLdi.env— harus konsisten dengan domain yang diakses browser.
38. Login sebagai admin default
Aksi
Masukkan credential default (akan disediakan terpisah oleh tim AlurKerja saat handover) dan klik Login.
Expected output
Redirect ke halaman dashboard atau tenant selection.
URL berubah ke /dashboard atau /tenants.
Jika gagal: kalau gagal login, cek log
onprem-auth:docker compose logs onprem-auth --tail=50.
39. Buat tenant pertama
Aksi
Klik Create Tenant → isi nama tenant + identifier → submit.
Expected output
Tenant baru muncul di list, status Active.
halaman menampilkan banner sukses + tenant baru di list.
Perhatian: identifier tenant biasanya jadi prefix internal. Koordinasi dengan tim AlurKerja untuk konvensi penamaan.
40. Buat user pertama dengan role Owner
Aksi
Di tenant baru, masuk ke menu Users → Invite User → isi email + role Owner → kirim invitation.
Expected output
Email invitation terkirim; user muncul di list dengan status Pending.
notifikasi sukses + entry baru di tabel Users.
Jika gagal: kalau email tidak terkirim, cek konfigurasi SMTP di
.env. Bisa juga lakukan invite tanpa email dan share link manual.
41. Login sebagai user baru + disable admin default
Aksi
- Buka link invitation, set password, login sebagai user baru.
- Setelah berhasil, kembali login sebagai admin dan disable akun admin default.
Expected output
User baru bisa akses semua menu sesuai role Owner. Akun admin default berstatus Disabled.
login admin default setelah di-disable menampilkan error "akun nonaktif" atau sejenisnya.
Perhatian: jangan tinggalkan akun admin default aktif di production.
K. Troubleshooting
Tiga skenario error paling umum saat instalasi. Lihat juga Handbook Troubleshooting untuk daftar lebih luas.
Skenario 1: Container restart loop (Restarting)
Gejala
docker compose psmenampilkan satu atau lebih container dengan statusRestarting.- Uptime container reset terus dalam hitungan detik.
Aksi diagnostik
docker compose logs <service-name> --tail=100
docker compose logs <service-name> --since=1mAksi remediasi
- Baca baris pertama yang mengandung
errorataupanicdi log — biasanya koneksi DB gagal. - Verifikasi credential DB di
.envcocok dengan database aktual. - Verifikasi host database reachable dari container:
docker compose exec <service> nc -zv <DB_HOST> 5432. - Kalau error terkait JWT/encryption key, periksa panjang dan format key di
.env.
Skenario 2: 502 Bad Gateway dari Nginx
Gejala
- Browser atau
curlmendapat502 Bad Gateway. - HTTPS aktif, tapi konten tidak ter-load.
Aksi diagnostik
# Cek apakah container listening di port yang dikonfigurasi Nginx
docker compose ps --format "table {{.Name}}\t{{.Ports}}"
# Cek log Nginx
sudo tail -50 /var/log/nginx/error.logAksi remediasi
- Cocokkan port container di
docker compose psdenganproxy_passdi konfigurasi Nginx. - Kalau port berbeda, update konfigurasi Nginx dan reload:
sudo nginx -t && sudo nginx -s reload. - Pastikan
upstreamNginx mengarah ke127.0.0.1:<PORT>bukan nama container (Nginx di luar Docker tidak bisa resolve nama container).
Skenario 3: Image pull gagal (unauthorized / not found)
Gejala
docker compose pullgagal denganunauthorizedataumanifest unknown.docker compose upgagal karena image tidak tersedia.
Aksi diagnostik
# Verifikasi credential Harbor masih valid
docker login harbor.merapi.javan.id
# Cek image tag di docker-compose.yml
grep 'image:' ${INSTALL_DIR}/docker-compose.ymlAksi remediasi
- Re-login ke Harbor (credential mungkin expired).
- Minta tim Javan memverifikasi bahwa image tag di
docker-compose.ymlmasih tersedia di registry. - Kalau pull lambat karena bandwidth, gunakan
docker compose pullterpisah per service:docker compose pull redis.
L. Logbook Instalasi
Template berikut sinkron 1:1 dengan nomor langkah di halaman ini.
| No | Section | Aksi | Hasil | Bukti | PIC | Catatan |
|---|---|---|---|---|---|---|
| 1 | Prasyarat | Verifikasi Docker | ||||
| 2 | Prasyarat | Verifikasi Docker Compose | ||||
| 3 | Prasyarat | Verifikasi group docker | ||||
| 4 | Prasyarat | Verifikasi PostgreSQL | ||||
| 5 | Prasyarat | Verifikasi domain & HTTPS | ||||
| 6 | Prasyarat | Verifikasi Harbor login | ||||
| 7 | Persiapan | Set variabel | ||||
| 8 | Persiapan | Buat direktori | ||||
| 9 | Persiapan | Clone repo manifest | ||||
| 10 | Konfigurasi | Salin .env.example | ||||
| 11 | Konfigurasi | Edit .env database | ||||
| 12 | Konfigurasi | Edit .env aplikasi | ||||
| 13 | Konfigurasi | Edit domain Nginx | ||||
| 14 | Konfigurasi | Edit camunda_application.yaml | ||||
| 15 | Konfigurasi | Verifikasi domain docker-compose | ||||
| 16 | Konfigurasi | Validasi tidak ada placeholder | ||||
| 17 | Konfigurasi | Verifikasi tidak commit secret | ||||
| 18 | Konfigurasi | Verifikasi port tidak bentrok | ||||
| 19 | Deploy | Login Harbor | ||||
| 20 | Deploy | Pull semua image | ||||
| 21 | Deploy | docker compose up -d | ||||
| 22 | Deploy | Validasi PostgreSQL siap koneksi | ||||
| 23 | Deploy | Validasi service database di stack | ||||
| 24 | Deploy | Validasi service inti terbuat | ||||
| 25 | Database | Jalankan init_db.sql | ||||
| 26 | Database | Init schema AlurKerja | ||||
| 27 | Database | Init schema Camunda | ||||
| 28 | Database | Validasi tabel Camunda | ||||
| 29 | Verifikasi Deploy | Validasi container running | ||||
| 30 | Verifikasi Deploy | Validasi tidak ada restart loop | ||||
| 31 | Verifikasi Deploy | Validasi Redis | ||||
| 32 | Verifikasi Aplikasi | Camunda engine merespons | ||||
| 33 | Verifikasi Aplikasi | Smoke test App FE | ||||
| 34 | Verifikasi Aplikasi | Smoke test Studio/Compro/Sim FE | ||||
| 35 | Verifikasi Aplikasi | Smoke test API | ||||
| 36 | Verifikasi Aplikasi | Smoke test WebSocket | ||||
| 37 | Akses | Buka URL App FE | ||||
| 38 | Akses | Login admin default | ||||
| 39 | Akses | Buat tenant pertama | ||||
| 40 | Akses | Buat user Owner | ||||
| 41 | Akses | Login user baru + disable admin |
M. Validasi & Sign-off
Setelah seluruh 41 langkah selesai, isi sign-off berikut sebagai bukti instalasi diterima oleh pelanggan.
M.1 Acceptance criteria
| AC | Item | Status | Evidence (cell logbook) |
|---|---|---|---|
| AC 1.1 | Judul dokumen jelas dan sesuai scope | (Section A) | |
| AC 1.2 | Prasyarat terdokumentasi | (Step 1–6) | |
| AC 1.3 | Langkah instalasi berurutan | (Step 1–41) | |
| AC 1.4 | Konfigurasi awal jelas | (Step 10–18) | |
| AC 1.5 | Verifikasi service tertulis | (Step 32–36) | |
| AC 1.6 | Akses pertama kali terdokumentasi | (Step 37–41) | |
| AC 2 | Troubleshooting tersedia | (Section K) |
M.2 Sign-off
| Peran | Nama | Organisasi | Tanggal | Status | Catatan |
|---|---|---|---|---|---|
| Implementor | Javan | ||||
| Reviewer teknis | Pelanggan | ||||
| Approver operasional | Pelanggan |
Status sign-off:
- Accepted — instalasi diterima tanpa catatan blocker.
- Accepted with notes — diterima dengan catatan minor (tracked di logbook).
- Need revision — perlu perbaikan sebelum diterima.
