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 running dan health check healthy.
  • 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:

KomponenVersi
Docker Engine29.5.2
Docker Composev5.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 script get.docker.com). Versi minimum yang divalidasi adalah 29.5.2.

2. Verifikasi Docker Compose terpasang

Aksi

docker compose version

Expected 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-plugin atau unduh binary dari GitHub releases docker/compose.

3. Verifikasi user tergabung dalam group docker

Aksi

groups

Expected output

Output mengandung docker.

Jika gagal: kalau tidak ada, jalankan sudo usermod -aG docker $USER lalu logout dan login ulang. Alternatif: prefix semua command docker dengan sudo.

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 -3

Expected output

HTTP/2 200

atau 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.id

Expected 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 cacheredis (untuk session + cache aplikasi).
  • 11 backend Goonprem-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 frontendonprem-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-compose

Expected 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}/.env

Expected 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}/.env

Isi bagian database mengikuti tabel berikut:

VariabelNilaiCatatan
DB_HOSThostname PostgreSQLWajib
DB_PORT5432Default PostgreSQL
DB_USERuser database AlurKerjaWajib
DB_PASSWORDpassword user databaseWajib
DB_NAMEnama databaseWajib
DB_SCHEMApublicDefault; jangan ubah kecuali ada keperluan khusus
DB_PASSsama dengan DB_PASSWORDDuplikat 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 harus KEY=value, bukan KEY = value.

12. Edit .env — konfigurasi aplikasi

Aksi

Lanjutkan edit .env. Isi bagian berikut:

VariabelNilaiCatatan
*_DOMAIN{domain}Base domain tanpa wildcard
JWT_SECRETrandom string ≥ 64 charGenerate dengan openssl rand -hex 64
JWT_REFRESH_TOKEN_SECRETrandom string ≥ 64 charBerbeda dari JWT_SECRET
TENANT_SETTINGS_ENCRYPTION_KEY32-byte keyGenerate dengan openssl rand -hex 32
TENANT_SETTINGS_ENCRYPTION_IV16-byte IVGenerate dengan openssl rand -hex 16
REDIS_HOSTredisNama service di docker-compose; jangan ubah
REDIS_PORT6379Default Redis
REDIS_PASSWORD(kosong atau isi)Isi kalau Redis butuh auth
REDIS_DB0
MINIO_ENDPOINTendpoint MinIOContoh: minio.acme.local:9000
MINIO_ACCESS_KEYaccess key MinIOWajib
MINIO_SECRET_KEYsecret key MinIOWajib
MINIO_BUCKET_NAMEbucket untuk file tenantDefault: tenant-uploads
MINIO_USE_SSLtrue / falsefalse jika MinIO tanpa TLS
KEYCLOAK_URLURL Keycloak SSOKosongkan kalau SSO belum aktif
KEYCLOAK_REALMrealm KeycloakContoh: alurkerja-prod
KEYCLOAK_CLIENTclient ID KeycloakDefault: onprem-client
KEYCLOAK_CLIENT_SECRETclient secret KeycloakWajib 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.docker

Sesuaikan 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.yaml

Field 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 -30

Expected 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 up dengan placeholder tersisa.

17. Verifikasi tidak ada secret yang akan di-commit

Aksi

git -C ${INSTALL_DIR} status

Expected 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.yml dan 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.id

Expected 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 (coba curl -I https://harbor.merapi.javan.id).

20. Pull semua image

Aksi

cd ${INSTALL_DIR}
docker compose pull

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

Lalu lanjutkan ke Step 25–28 untuk inisialisasi schema sebelum menyalakan seluruh stack aplikasi.

cd ${INSTALL_DIR}
docker compose up -d

Expected output

  • Jika PostgreSQL di Docker Compose: service postgres berhasil dijalankan.
  • Jika PostgreSQL external: baris Container <name> Started untuk setiap container yang didefinisikan di stack.

tidak ada baris Error atau Exited.

Perhatian: docker compose up -d bersifat idempoten — boleh diulang. Untuk skenario PostgreSQL di Docker Compose, setelah schema selesai di Step 25–28, jalankan lagi docker compose up -d untuk 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 up atau no 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 postgres

Expected output

Service postgres tampil dengan status running atau healthy.

Jika gagal: kalau nama servicenya bukan postgres, sesuaikan command dengan nama service database pada docker-compose.yml.

24. Validasi service inti sudah terbuat

Aksi utama

docker compose ps

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

  1. Tambahkan helper service alpine-tools ke docker-compose.yml

    alpine-tools:
      build:
        context: .
        dockerfile: builds/alpine-tools/Dockerfile
      container_name: alurkerja-alpine-tools
      working_dir: /work
      volumes:
        - ./:/work
      restart: unless-stopped
      env_file:
        - .env
  2. Gunakan isi Dockerfile berikut sebagai referensi

    FROM alpine:3.20
    
    RUN apk add --no-cache bash curl jq postgresql-client busybox-extras redis
    
    WORKDIR /work
    
    CMD ["tail", "-f", "/dev/null"]
  3. Build dan jalankan helper container

    docker compose up -d --build alpine-tools
  4. Jalankan bootstrap Keycloak dari dalam container

    docker compose exec -T alpine-tools bash scripts/setup-keycloak.sh
  5. 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
  6. 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-tools berhasil hidup
  • script scripts/setup-keycloak.sh selesai 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-ancestors ke https://*.{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-tools ini 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.sql
psql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/postgres" \
  -v ON_ERROR_STOP=1 \
  -f ${INSTALL_DIR}/config/init-db.sql

Jika 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.sql agar 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.sql
psql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
  -v ON_ERROR_STOP=1 \
  -f ${INSTALL_DIR}/config/public.sql

Expected output

Beberapa baris CREATE TABLE, CREATE INDEX, tanpa error.

exit code 0 (echo $? menampilkan 0).

Perhatian: flag -v ON_ERROR_STOP=1 memastikan 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.sql
psql "postgresql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>" \
  -v ON_ERROR_STOP=1 \
  -f ${INSTALL_DIR}/config/camunda.sql

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

Expected 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=100 untuk error pertama.

31. Validasi health check Redis

Aksi

docker compose exec redis redis-cli ping

Expected output

PONG.

Jika gagal: kalau container Redis tidak ditemukan, periksa nama service di docker-compose.yml dan 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/engine

Ganti <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 -5

Expected output

HTTP/2 200

atau 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 -3

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

Expected 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-proxy belum 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 -3

Expected 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 dengan proxy_http_version 1.1 dan 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_URL dan API_BASE_URL di .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 UsersInvite 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

  1. Buka link invitation, set password, login sebagai user baru.
  2. 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 ps menampilkan satu atau lebih container dengan status Restarting.
  • Uptime container reset terus dalam hitungan detik.

Aksi diagnostik

docker compose logs <service-name> --tail=100
docker compose logs <service-name> --since=1m

Aksi remediasi

  1. Baca baris pertama yang mengandung error atau panic di log — biasanya koneksi DB gagal.
  2. Verifikasi credential DB di .env cocok dengan database aktual.
  3. Verifikasi host database reachable dari container: docker compose exec <service> nc -zv <DB_HOST> 5432.
  4. Kalau error terkait JWT/encryption key, periksa panjang dan format key di .env.

Skenario 2: 502 Bad Gateway dari Nginx

Gejala

  • Browser atau curl mendapat 502 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.log

Aksi remediasi

  1. Cocokkan port container di docker compose ps dengan proxy_pass di konfigurasi Nginx.
  2. Kalau port berbeda, update konfigurasi Nginx dan reload: sudo nginx -t && sudo nginx -s reload.
  3. Pastikan upstream Nginx mengarah ke 127.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 pull gagal dengan unauthorized atau manifest unknown.
  • docker compose up gagal 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.yml

Aksi remediasi

  1. Re-login ke Harbor (credential mungkin expired).
  2. Minta tim Javan memverifikasi bahwa image tag di docker-compose.yml masih tersedia di registry.
  3. Kalau pull lambat karena bandwidth, gunakan docker compose pull terpisah per service: docker compose pull redis.

L. Logbook Instalasi

Template berikut sinkron 1:1 dengan nomor langkah di halaman ini.

NoSectionAksiHasilBuktiPICCatatan
1PrasyaratVerifikasi Docker
2PrasyaratVerifikasi Docker Compose
3PrasyaratVerifikasi group docker
4PrasyaratVerifikasi PostgreSQL
5PrasyaratVerifikasi domain & HTTPS
6PrasyaratVerifikasi Harbor login
7PersiapanSet variabel
8PersiapanBuat direktori
9PersiapanClone repo manifest
10KonfigurasiSalin .env.example
11KonfigurasiEdit .env database
12KonfigurasiEdit .env aplikasi
13KonfigurasiEdit domain Nginx
14KonfigurasiEdit camunda_application.yaml
15KonfigurasiVerifikasi domain docker-compose
16KonfigurasiValidasi tidak ada placeholder
17KonfigurasiVerifikasi tidak commit secret
18KonfigurasiVerifikasi port tidak bentrok
19DeployLogin Harbor
20DeployPull semua image
21Deploydocker compose up -d
22DeployValidasi PostgreSQL siap koneksi
23DeployValidasi service database di stack
24DeployValidasi service inti terbuat
25DatabaseJalankan init_db.sql
26DatabaseInit schema AlurKerja
27DatabaseInit schema Camunda
28DatabaseValidasi tabel Camunda
29Verifikasi DeployValidasi container running
30Verifikasi DeployValidasi tidak ada restart loop
31Verifikasi DeployValidasi Redis
32Verifikasi AplikasiCamunda engine merespons
33Verifikasi AplikasiSmoke test App FE
34Verifikasi AplikasiSmoke test Studio/Compro/Sim FE
35Verifikasi AplikasiSmoke test API
36Verifikasi AplikasiSmoke test WebSocket
37AksesBuka URL App FE
38AksesLogin admin default
39AksesBuat tenant pertama
40AksesBuat user Owner
41AksesLogin 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

ACItemStatusEvidence (cell logbook)
AC 1.1Judul dokumen jelas dan sesuai scope(Section A)
AC 1.2Prasyarat terdokumentasi(Step 1–6)
AC 1.3Langkah instalasi berurutan(Step 1–41)
AC 1.4Konfigurasi awal jelas(Step 10–18)
AC 1.5Verifikasi service tertulis(Step 32–36)
AC 1.6Akses pertama kali terdokumentasi(Step 37–41)
AC 2Troubleshooting tersedia(Section K)

M.2 Sign-off

PeranNamaOrganisasiTanggalStatusCatatan
ImplementorJavan
Reviewer teknisPelanggan
Approver operasionalPelanggan

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.

On this page

A. Ringkasan & Definition of DoneB. Prasyarat1. Verifikasi Docker terpasang2. Verifikasi Docker Compose terpasang3. Verifikasi user tergabung dalam group docker4. Verifikasi konektivitas PostgreSQL5. Verifikasi domain dan HTTPS aktif6. Verifikasi akses Harbor registryC. Arsitektur RingkasD. Persiapan7. Set variabel instalasi8. Buat direktori instalasi9. Clone repo manifest DockerE. Konfigurasi10. Salin template environment11. Edit .env — konfigurasi database12. Edit .env — konfigurasi aplikasi13. Edit konfigurasi domain Nginx14. Edit konfigurasi Camunda15. Verifikasi konfigurasi domain di docker-compose.yml16. Validasi tidak ada placeholder tersisa17. Verifikasi tidak ada secret yang akan di-commit18. Verifikasi port tidak bentrok di hostF. Deploy19. Login ke Harbor registry dari host20. Pull semua image21. Jalankan stack22. Validasi PostgreSQL siap menerima koneksi23. Validasi service database terpasang di stack (khusus PostgreSQL di Docker Compose)24. Validasi service inti sudah terbuatG. Schema Database25. Jalankan script init database26. Inisialisasi schema dasar AlurKerja27. Inisialisasi schema Camunda28. Validasi tabel Camunda tersediaH. Verifikasi Deploy29. Validasi semua container running30. Validasi tidak ada container restart berulang31. Validasi health check RedisI. Verifikasi Aplikasi32. Validasi Camunda engine merespons33. Smoke test App FE via HTTPS34. Smoke test Studio FE, Compro FE, Simulation FE35. Smoke test API gateway36. Smoke test WebSocket notificationJ. Akses Pertama Kali37. Buka URL App FE di browser38. Login sebagai admin default39. Buat tenant pertama40. Buat user pertama dengan role Owner41. Login sebagai user baru + disable admin defaultK. TroubleshootingSkenario 1: Container restart loop (Restarting)Skenario 2: 502 Bad Gateway dari NginxSkenario 3: Image pull gagal (unauthorized / not found)L. Logbook InstalasiM. Validasi & Sign-offM.1 Acceptance criteriaM.2 Sign-off