- Milestone berikutnya fokus membuat MVP yang sekarang benar-benar operasional, bukan menambah CRUD admin atau migrasi ke Postgres dulu.
- Stack tetap SvelteKit, source of truth tetap
opspanel.config.json, log realtime tetap SSE. - Perubahan inti: status service harus jadi authoritative dari remote host melalui
statusCommand, SSH execution harus lebih aman/stabil, dan UI harus menampilkan state/error yang benar.
- Perluas schema service config dengan
statusCommandsebagai field wajib untuk milestone ini. - Definisikan kontrak
statusCommand: stdout harus bernilairunning,stopped,failed, atauunknownsecara case-insensitive; jika output tidak valid atau command non-zero exit, status dipetakan keunknowndan note error disimpan. - Pertahankan
startCommand,stopCommand,logCommand, danremoteLogFileseperti sekarang; jangan tambah service type preset di milestone ini. - Backend service layer harus memisahkan empat jalur eksekusi:
start,stop,status, danlogs, dengan shared SSH wrapper untuk timeout, stderr capture, dan error normalization. - Tambahkan timeout default yang eksplisit: SSH connect 8 detik,
statusCommand5 detik,start/stop20 detik, log stream tanpa hard timeout. - Tambahkan per-service action lock. Jika ada action kedua saat service yang sama masih
starting/stopping, backend mengembalikan409dan UI tetap disable tombol terkait. - Endpoint
GET /api/servicesdanGET /api/services/[id]harus mengembalikan status hasil remote check, bukan hanya state lokal. Gunakan cache status pendek 5 detik per service agar dashboard tidak membanjiri SSH tiap render. - Response service perlu menambah
lastCheckedAtdanstatus.noteagar UI bisa membedakan “running”, “unknown karena error SSH”, dan “belum pernah dicek”. - Action
startdanstoptetap mengubah state transisional lokal (starting/stopping), lalu setelah action selesai backend langsung menjalankanstatusCommandsekali untuk sinkronisasi authoritative state. - Bulk action tetap paralel, tetapi hasil per service harus berisi
ok,message, dan authoritative status terbaru setelah sinkronisasi. - SSE log tetap dipakai. Endpoint log harus selalu mengirim
snapshotdari buffer lebih dulu, lalu live lines; saat koneksi putus, stream remote harus ditutup bersih tanpa mengubah status service menjadi error. - UI dashboard tetap refresh otomatis tiap 10 detik, tetapi status card dan row harus menampilkan sumber state yang baru: label status,
lastCheckedAt, dan error/note singkat jika remote check gagal. - UI logs page tetap punya reconnect manual, tetapi indikator koneksi harus hanya merefleksikan state stream SSE, bukan state service.
- Mock mode harus ikut mendukung
statusCommandsecara simulatif agar seluruh flow bisa dites lokal tanpa SSH.
opspanel.config.json- Tambah
statusCommandpada setiap service.
- Tambah
GET /api/services- Tambah
lastCheckedAtdanstatus.note. status.statesekarang authoritative hasil remote check.
- Tambah
GET /api/services/[serviceId]- Bentuk response mengikuti perubahan di atas.
POST /api/services/[serviceId]/action- Jika action bentrok dengan lock service, return
409. - Success response harus memuat authoritative status sesudah sync.
- Jika action bentrok dengan lock service, return
POST /api/services/bulk- Result per service harus menyertakan authoritative status final.
- SSE logs
- Event tetap
ready,snapshot,line,end,error; tidak migrasi ke WebSocket di milestone ini.
- Event tetap
- Login flow tetap berjalan dengan kredensial saat ini.
- Mock mode:
startmengubah service kestartinglalurunning.stopmengubah service kestoppinglalustopped.statusCommandsimulatif mengembalikan state yang konsisten dengan action terakhir.- Double-click start/stop untuk service yang sama menghasilkan
409.
- SSH mode:
statusCommandvalid menghasilkanrunning/stoppedyang tampil di dashboard.statusCommandtimeout atau non-zero exit menghasilkanunknownplusstatus.note.startdiikuti sync status benar-benar memperbarui dashboard ke status remote, bukan sekadarrunninglokal.stopdiikuti sync status benar-benar memperbarui dashboard ke status remote.
- Dashboard:
- Auto-refresh 10 detik memperbarui state tanpa reload halaman.
- Error check status tidak mematikan seluruh dashboard; hanya service terkait yang menunjukkan note error.
- Logs:
- SSE reconnect tetap menampilkan
snapshotbuffer. - Menutup tab log menghentikan stream remote tanpa meninggalkan koneksi menggantung.
- SSE reconnect tetap menampilkan
- Regression:
npm run buildtetap lulus.- Routing login, dashboard, logs, dan logout tetap bekerja.
- Scope tetap single-user internal; tidak ada RBAC, multi-user, atau audit log di milestone ini.
- Remote host diasumsikan Linux-like dan command shell-compatible seperti contoh PRD sekarang.
- JSON config tetap source of truth; tidak ada UI CRUD server/service pada milestone ini.
- SSE tetap dipertahankan; migrasi ke WebSocket ditunda ke milestone berikutnya jika nanti benar-benar dibutuhkan.
- Adapter/deploy polish tidak masuk milestone ini kecuali ada bug yang langsung menghambat pengujian ops hardening.