Penggabungan Websocket Kolaborasi ke Notification Service
Mulai versi 2026.08.1.1, websocket kolaborasi BPMN (Yjs) digabung ke dalam service notifikasi. Halaman ini menjelaskan apa yang berubah dan langkah update yang perlu dilakukan pada deployment on-premise Anda.
Ringkasan
Mulai rilis 2026.08.1.1, layanan websocket kolaborasi BPMN (Yjs) — yang memungkinkan dua orang mengedit diagram BPMN secara bersamaan — digabung ke dalam service notifikasi (onprem-notification).
Sebelumnya ada dua container terpisah yang sama-sama mengurus websocket:
[ onprem-notification ] -> notifikasi realtime (lonceng, badge)
[ websocket ] -> kolaborasi BPMN (dua orang edit bareng)Sekarang cukup satu container yang menjalankan keduanya berdampingan:
[ onprem-notification ]
├── API + websocket notifikasi (port 3005 & 3008)
└── websocket kolaborasi (Yjs) (port 1234)Analoginya: dulu dua rumah, sekarang satu rumah dengan dua kamar. Alamat (port) dan URL yang diakses tetap sama persis seperti sebelumnya.
Sisi pengguna aplikasi tidak berubah sama sekali. URL kolaborasi tetap sama, sehingga pengguna studio tidak perlu melakukan apa pun. Perubahan ini murni di sisi infrastruktur/deployment on-premise.
Kenapa digabung?
- Lebih hemat resource — satu container lebih ringan daripada dua.
- Lebih andal — kedua program dijaga oleh satu pengawas. Jika salah satu program mati sendiri, container di-restart otomatis, sehingga tidak ada kondisi "container terlihat hidup padahal separuh layanannya sudah mati".
- Lebih sederhana dirawat — satu image, satu service yang perlu diperbarui.
Detail yang berubah
Perubahan hanya terjadi pada repo deployment Anda (file konfigurasi). Kode aplikasi sudah dirilis dalam image baru dan tidak perlu Anda ubah.
| File | Perubahan |
|---|---|
docker-compose.yml | Pada service onprem-notification, ditambah satu baris environment: - COLLAB_WS_PORT=${COLLAB_WS_PORT:-1234}. |
nginx/default.conf.docker | Pada blok domain kolaborasi, alamat tujuan (upstream) diganti dari http://websocket:1234 menjadi http://onprem-notification:1234. |
.env / .env.example | (Opsional) menambah baris COLLAB_WS_PORT=1234 agar port terlihat jelas. Defaultnya memang 1234, jadi ini tidak wajib. |
docker-compose.yml | Setelah update terbukti berjalan, blok service websocket yang lama dihapus. |
Variabel COLLAB_WS_PORT bersifat opsional. Tanda :-1234 pada ${COLLAB_WS_PORT:-1234} berarti "jika variabel ini tidak ada di .env, pakai 1234". Jangan menghilangkan bagian :-1234 — banyak .env lama belum mengenal variabel ini, dan tanpa nilai default tersebut docker compose bisa gagal membaca file.
Jangan menambahkan port 1234 ke blok ports:. nginx menjangkau server kolaborasi lewat jaringan internal Docker, jadi port itu tidak perlu dibuka ke host. Membukanya justru berisiko karena server kolaborasi belum memiliki autentikasi.
Langkah yang harus dilakukan
Prinsipnya: arahkan dulu ke layanan gabungan, buktikan berjalan, baru layanan lama dibongkar. Selama Tahap 1–2 layanan lama sengaja dibiarkan hidup agar rollback mudah.
Ganti collaboration.dev.namadomain.com dan nama registry image pada contoh di bawah dengan domain serta registry milik deployment Anda.
Tahap 1 — Siapkan & arahkan
1. Tarik image onprem-notification versi baru
Gunakan image notification-service rilis 2026.08.1.1 sesuai tag yang dirujuk pada docker-compose.yml Anda, misalnya:
registry.namadomain.com/alurkerja/alurkerja-notification:latest2. Terapkan perubahan konfigurasi
Perbarui docker-compose.yml dan nginx/default.conf.docker sesuai tabel Detail yang berubah. Bila memakai git:
cd /path/ke/repo-deploy
git pull(Opsional) pastikan .env sudah memuat port kolaborasi:
grep -n "COLLAB_WS_PORT" .envJika belum ada, tambahkan COLLAB_WS_PORT=1234. Ini bukan penghalang update — tanpa baris itu pun port tetap 1234 karena sudah menjadi default.
3. Tarik image baru dan nyalakan ulang service notifikasi
docker compose pull onprem-notification
docker compose up -d onprem-notification4. Reload nginx — periksa dulu, baru reload
docker compose exec nginx nginx -t
docker compose exec nginx nginx -s reloadYang diharapkan muncul: syntax is ok dan test is successful.
nginx -t sebelum reload itu wajib. Reload terhadap config yang salah tidak memunculkan error mencolok — nginx diam saja dan tetap memakai config lama, sehingga mudah terlewat.
5. Pastikan nginx benar-benar membaca alamat baru
docker compose exec nginx grep ws_upstream /etc/nginx/conf.d/default.confYang diharapkan: http://onprem-notification:1234.
Jika yang muncul masih http://websocket:1234, buat ulang container nginx (reload berapa kali pun tidak akan menolong):
docker compose up -d --force-recreate nginx
docker compose exec nginx grep ws_upstream /etc/nginx/conf.d/default.confKenapa perlu --force-recreate? File config nginx di-mount sebagai satu file. git pull dan kebanyakan editor tidak mengedit file di tempat, melainkan membuat file baru lalu menimpa namanya. Akibatnya file di host sudah berubah, tetapi container masih memegang file lama — sehingga nginx -s reload hanya memuat ulang config lama. Membuat ulang container memaksa mount menunjuk ke file yang sekarang.
nginx adalah pintu masuk semua domain di stack ini. --force-recreate membuat nginx mati beberapa detik, sehingga seluruh domain ikut kosong sesaat. Di produksi, pilih jam yang sepi.
Tahap 2 — Buktikan layanan gabungan berjalan
Jangan lanjut ke Tahap 3 sebelum semua pemeriksaan berikut lolos.
Cek 1. Tiga port di dalam container hidup semua
docker compose exec onprem-notification netstat -ltnHarus ada baris LISTEN untuk :3005, :3008, dan :1234.
Cek 2. nginx sudah memakai alamat baru
docker compose exec nginx nginx -T 2>/dev/null | grep -n "ws_upstream"Harus muncul http://onprem-notification:1234, dan tidak boleh ada http://websocket:1234.
Cek 3. Handshake websocket dari luar
curl -i -N --max-time 5 \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Version: 13" \
-H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
https://collaboration.dev.namadomain.com/room-tes 2>&1 | head -3Baris pertama harus: HTTP/1.1 101 Switching Protocols.
Cek 4. Notifikasi masih sehat
docker compose exec onprem-notification \
node -e "require('http').get('http://127.0.0.1:3008/ws/health', r => {
console.log('status', r.statusCode); r.resume();
})"Yang diharapkan: status 200.
Cek 5. Tes manual dua browser ← paling menentukan
Buka BPMN yang sama di studio dari dua browser berbeda. Ubah di satu sisi, pastikan perubahannya muncul di sisi lain. Lalu picu satu notifikasi dan pastikan badge-nya muncul realtime. Ini satu-satunya cek yang benar-benar membuktikan kolaborasi dan notifikasi berjalan dari sisi pengguna.
Tahap 3 — Bongkar layanan lama
Hanya jalankan tahap ini bila seluruh Tahap 2 lolos.
1. Matikan dan hapus container websocket lama
docker compose stop websocket
docker compose rm -f websocketSetelah container lama mati, ulangi Cek 3 dan tes dua browser sekali lagi. Bila kolaborasi tetap jalan, artinya yang melayani memang container gabungan.
Matikan dan hapus container selagi blok websocket: masih ada di docker-compose.yml. Jika blok itu terlanjur dihapus lebih dulu, perintah docker compose stop/rm websocket akan menjawab "no such service". Bila terlanjur, pakai docker rm -f <nama_container> atau docker compose up -d --remove-orphans.
2. Hapus blok service websocket dari docker-compose.yml
websocket:
image: registry.namadomain.com/alurkerja/alurkerja-y-websocket:latest
restart: unless-stopped
ports:
- "80"
env_file:
- .env3. Pastikan tidak ada sisa rujukan & config tetap valid
grep -rn "y-websocket" docker-compose.yml nginx/ .env.example
docker compose config >/dev/null && echo "COMPOSE OK"Yang diharapkan: grep tidak menemukan apa-apa, lalu COMPOSE OK.
4. (Opsional) Hapus image lama
docker image ls | grep y-websocket
docker rmi registry.namadomain.com/alurkerja/alurkerja-y-websocket:latestJika muncul error "image is being used by stopped container", berarti container lama belum benar-benar terhapus — hapus dulu containernya.
Kalau gagal — rollback
Selama Tahap 1–2 container lama masih hidup, jadi rollback cukup mengembalikan satu baris nginx ke alamat lama:
set $ws_upstream http://websocket:1234;Lalu:
docker compose exec nginx nginx -t
docker compose exec nginx nginx -s reload
# WAJIB: pastikan rollback benar-benar masuk
docker compose exec nginx nginx -T 2>/dev/null | grep ws_upstreamHarus muncul http://websocket:1234 lagi. Jika masih http://onprem-notification:1234, buat ulang container nginx:
docker compose up -d --force-recreate nginx
docker compose exec nginx nginx -T 2>/dev/null | grep ws_upstreamJangan pernah menganggap rollback berhasil sebelum nginx -T membuktikannya. Kasus "file sudah diganti tapi container masih memegang yang lama" justru paling sering terjadi saat rollback, karena rollback hampir selalu lewat penggantian file.
Jika sudah masuk Tahap 3 (container lama sudah dihapus), rollback berarti mengembalikan blok websocket: ke docker-compose.yml lalu docker compose up -d websocket — image lama harus masih tersedia atau ditarik ulang dari registry. Karena itu, jangan buru-buru masuk Tahap 3.
Checklist ringkas
Persiapan
- Image
onprem-notificationversi 2026.08.1.1 sudah tersedia -
docker-compose.yml:COLLAB_WS_PORT=${COLLAB_WS_PORT:-1234}ada dienvironment(BUKAN diports) -
nginx/default.conf.docker: upstream sudahhttp://onprem-notification:1234
Deploy
-
docker compose pull onprem-notification -
docker compose up -d onprem-notification -
nginx -tlolos →nginx -s reload - Config di dalam container sudah yang baru (kalau belum:
docker compose up -d --force-recreate nginx)
Verifikasi
- Port 3005, 3008, 1234 semua
LISTEN -
nginx -Tmenunjukkan upstream baru, tanpahttp://websocket:1234 - Handshake
curlmembalas101 Switching Protocols -
/ws/healthmembalasstatus 200 - Tes dua browser: kolaborasi jalan, badge notifikasi jalan
Bersih-bersih (setelah semua di atas tercentang)
-
docker compose stop websocketlaludocker compose rm -f websocket - Kolaborasi masih jalan walau container lama mati
- Blok
websocket:dihapus daridocker-compose.yml - (Opsional) image lama dihapus
Database Migration
Runbook penggunaan sistem migration AlurKerja — generate migration dari selisih skema (schema-diff) lalu apply ke database tujuan dengan runner release-aware ala Laravel. Termasuk cara pengecekan dan expected result dari simulasi end-to-end.
Team
Berikut adalah langkah-langkah untuk mengundang anggota tim
