Kelola Worker
Host worker tempat instance Odoo customer dijalankan.
Belum ada worker terdaftar.
Semua project & instance lintas customer. Project read-only (kelola lewat akun pemiliknya). Instance bisa di-start/stop/restart/destroy langsung dari sini untuk keperluan dukungan teknis.
Belum ada project.
Semua user terdaftar di platform.
Belum ada user terdaftar.
Log/compose email keluar dari platform. Murni data untuk sekarang — status diisi manual, belum ada pengiriman SMTP sungguhan.
Belum ada outgoing email.
Template email per jenis notifikasi. Murni data untuk sekarang — belum ada trigger yang mengirim email pakai template ini.
Belum ada template email.
Outgoing mail server untuk pengiriman email dari platform (notifikasi, bukan email dari instance Odoo customer). Bisa lebih dari satu — prioritas ditentukan urutan sequence.
Belum ada outgoing mail server terdaftar.
Daftar harga platform per product. Belum terhubung ke billing/project — murni data harga untuk sekarang.
Belum ada pricelist terdaftar.
Daftar harga kompetitor per product — dipakai untuk fitur price comparison di web frontend.
Belum ada competitor terdaftar.
Annual Discount
Persentase potongan kalau bayar tahunan — satu nilai berlaku untuk semua pricelist, murni data untuk sekarang.
Kode Promo
Kode diskon — potongan bisa nominal (Rupiah) atau persentase.
Belum ada kode promo terdaftar.
Invoice dibuat manual — belum otomatis dari billing cycle recurring.
Belum ada invoice terdaftar.
Master data Product — dipakai sebagai referensi line item invoice.
Belum ada product terdaftar.
Numbering Invoice
Format nomor invoice: PREFIX/YYYY/MM/0001, counter reset tiap bulan.
Nama & logo customer yang ditampilkan di section "Trusted By" landing page (hrdoo.cloud).
Belum ada trusted customer terdaftar.
Pertanyaan & jawaban yang ditampilkan di halaman FAQ landing page (hrdoo.cloud/faq).
Belum ada FAQ terdaftar.
Cara worker agent (host worker/agent/agent.py) berkomunikasi dengan panel
(control plane FastAPI ini) — digambar langsung dari kode, bukan dari desain awal.
Worker selalu yang menghubungi panel lewat HTTP polling; panel tidak
pernah mendorong perintah ke worker.
Figur 1
Satu siklus poll (dicontohkan lewat stop_instance)
Tiap tick loop (≈15 detik), worker menembak 6 endpoint poll yang independen satu
sama lain (beda sumber antrian), lalu tiap ≈300 detik mengirim satu telemetry
proaktif. Alur lengkap poll → job → eksekusi lokal → report digambar
penuh untuk /worker/poll; 5 channel lain mengikuti pola yang persis sama,
cuma beda sumber antrian.
Yang berubah antar channel cuma sumber antriannya
(kolom status vs baris Backup) — mekanismenya identik: worker tanya, panel
jawab dari data yang sudah ada, worker kerja secara lokal, worker lapor balik.
Figur 2
/worker/poll — tangga prioritas
Channel yang paling relevan untuk create/stop/restart/destroy instance. Satu panggilan cuma pulang dengan satu job — panel mengecek 7 kondisi berurutan dari atas, berhenti di kecocokan pertama.
Garis putus-putus di kiri (spine) = "tidak cocok, lanjut cek kondisi berikutnya"; panah solid ke kanan = "cocok, job ini yang dikirim" — dua pola itu berulang di ketujuh baris. Merah menandai satu-satunya operasi yang menghapus data host secara permanen.
Figur 3
Build & Deploy — dari git push sampai container baru live
Isi penuh process_build (dipicu row Build.status == "queued"
di figur 2). Tiga titik bisa gagal — ketiganya jatuh ke prosedur
rollback yang sama persis, digambar sekali di kanan.
Beberapa detail di sini beda dari deskripsi awal di CLAUDE.md (sudah dicek langsung ke
agent.py): image cuma FROM base + COPY seluruh repo (tidak ada
step requirements.txt/pip-install terpisah), flag migrasinya -i
{modul} bukan -u all, dan tidak ada panggilan eksplisit "switch
Traefik" — lihat catatan di step 7.
Instance lama tidak pernah dihapus sampai instance baru terbukti sehat (step 9) — kalau
gagal di titik mana pun setelah step 4, yang lama tinggal di-start lagi.
Satu-satunya penghapusan permanen di alur ini adalah rm -rf folder host,
dan itu tidak pernah terjadi di sini — cuma lewat
destroy_instance (figur 2).