# 📘 Panduan Operasional — Menyiapkan Mesin Hermes Baru
### Untuk staf non-teknis (tanpa perlu paham kode / terminal)

---

## Ringkasan

Setiap **user berbayar** (member) mendapatkan **1 mesin pribadi** yang menjalankan
agen pencari kerja otomatis. Tugas kamu di sini: menyiapkan mesin itu agar aktif
dan terhubung ke aplikasi. **Kabar baiknya — agen di mesin baru yang mengerjakan
bagian teknisnya.** Kamu hanya perlu: menyalin pesan, menempelkannya, menunggu,
lalu mencatat 2 kode rahasia.

⏱️ Total waktu: **±30–45 menit** per mesin (sebagian besar menunggu otomatis).

---

## Bagian 1 — Siapkan bahan (5 menit)

Kumpulkan 3 data ini dulu:

| # | Data | Contoh | Dari mana |
|---|------|--------|-----------|
| 1 | **Nama unik mesin** | `joko-jobseeker` | Kamu buat sendiri (lihat aturan di bawah) |
| 2 | **Alamat backend aplikasi** | `https://api.platformmu.com` | Admin platform |
| 3 | **Token internal** | `abc123...` (huruf-angka panjang) | Admin platform |

**Aturan nama unik:** huruf kecil, tanpa spasi, pakai tanda `-`. Contoh yang
benar: `joko-jobseeker`, `siti-freelance`. Contoh yang salah: `Joko Jobseeker`
(ada spasi & huruf besar), `joko!job` (ada simbol).

---

## Bagian 2 — Jalankan di mesin baru (±20 menit)

### Langkah 2.1 — Buka chat Hermes di mesin baru
Buka aplikasi chat Hermes di mesin tersebut (jendela terminal interaktif TUI).
Ini sama seperti membuka aplikasi chat biasa.

### Langkah 2.2 — Salin & tempel "Paket Perintah" ini

> ⚠️ Ganti dulu 3 bagian yang dicetak **TEBAL** dengan data dari Bagian 1,
> lalu kirim SEMUA teks di bawah ini sebagai SATU pesan:

```
TUGAS: Siapkan mesin ini agar identik dengan mesin utama (noVNC + API server + tooling jobseeker + skill). Kerjakan SEMUA dengan tool TERMINAL.

LANGKAH 1 — Unduh 2 skrip:
  curl -fsSL https://s3-autoapply-public.s3.ap-southeast-1.amazonaws.com/provision/bootstrap-mesin.sh -o /tmp/bootstrap-mesin.sh
  curl -fsSL https://s3-autoapply-public.s3.ap-southeast-1.amazonaws.com/provision/jobseeker-platform.sh -o /tmp/jobseeker-platform.sh
  chmod +x /tmp/bootstrap-mesin.sh /tmp/jobseeker-platform.sh

LANGKAH 2 — Jalankan bootstrap dasar:
  bash /tmp/bootstrap-mesin.sh

LANGKAH 3 — Jalankan platform jobseeker:
  bash /tmp/jobseeker-platform.sh

LANGKAH 4 — Isi data koneksi (nilai dari operator, ganti bagian TEBAL):
  Tulis file /opt/data/jobseeker/agent-config.env dengan:
  BE_API_URL=[ALAMAT-BACKEND] · BE_INTERNAL_TOKEN=[TOKEN-INTERNAL] · USER_ID=[ID-USER]

LANGKAH 5 — Verifikasi semua, lalu LAPORKAN: (a) hasil tiap item verifikasi (OK/gagal), (b) alamat noVNC publik, (c) isi file /opt/data/home/vncsetup/run/vnc-jwt-secret, (d) baris `API_SERVER_KEY=...` dari /opt/data/.env (default = hasil generate). Catatan: untuk (c) dan (d), jangan tempel di chat publik — cukup tampilkan di layar untuk dicatat operator.

LANGKAH 6 — Restart gateway (wajib, di akhir semua langkah):
  /opt/hermes/bin/hermes gateway restart
  lalu cek: curl -s http://localhost:8642/health  → {"status":"ok",...}
```

### Langkah 2.3 — Kirim & tunggu
Agen akan bekerja otomatis 15–20 menit (mengunduh perangkat lunak, memasang,
memeriksa). **Jangan menutup jendela chat** dan jangan kirim pesan lain selama
proses berjalan.

**Yang wajar terjadi:** di tengah proses, chat mungkin "terputus" sekitar
1–2 menit lalu kembali normal (mesin sedang memulai ulang dirinya sendiri).
Ini NORMAL — tidak perlu tindakan.

### Langkah 2.4 — Baca laporan agen
Setelah selesai, agen akan menampilkan laporan. Cek semuanya:
- [ ] Semua item verifikasi **OK** (kalau ada yang "gagal", lihat Bagian 6)
- [ ] Ada **alamat noVNC publik** (pola: `https://...-6080...`)
- [ ] Ada **2 kode rahasia**: (d) kode rahasia VNC dan (e) kunci API

✍️ **Catat 2 kode rahasia itu di tempat aman** (mis. aplikasi catatan yang
dikunci). Kamu akan memakainya di Bagian 3. **Jangan pernah** membagikannya ke
chat umum/publik atau orang lain.

> 🛠️ **Kunci API (d) sebaiknya juga di-set di "Environment variables" container**
> (panel SumoPod) dengan nama `API_SERVER_KEY` — itulah **sumber utama**-nya.
> Kalau tidak ada, sistem memakai cadangan dari file `.env` mesin (nilai sama).

> 💡 **Status portal** (JobStreet, LinkedIn, dll.) dipantau **otomatis oleh mesin**
> (`portal-check.py`, tiap 10 menit): saat user login/logout di browser, status
> langsung ter-update ke database — tidak perlu tindakan manual. Daftar portal
> dikelola admin di **tabel `portals`** (database BE), bukan di mesin.

### Langkah 2.5 — Sambil menunggu: buat tunnel (jika panel tersedia)

Di panel penyedia mesin (SumoPod), buat **2 terowongan** untuk mesin baru ini.
"Terowongan" = alamat publik yang menghubungkan ke mesin. Cara umum:

1. Buka panel → menu **Tunnels / Port Forwarding**
2. Buat 2 entri baru (isi nama = nama mesin kamu, port = angka di bawah):

| Nama terowongan (contoh) | Port mesin | Dipakai untuk |
|---|---|---|
| `joko-jobseeker-6080` | 6080 | Layar browser (noVNC) |
| `joko-jobseeker-8642` | 8642 | Percakapan aplikasi (API) |

3. Simpan. Alamat publik akan terbentuk otomatis, pola:
   `https://joko-jobseeker-6080.jkt3.sumopod.my.id` (sesuaikan).

> Kalau panelnya tidak bisa kamu akses, minta bantuan admin — tunnel adalah
> satu-satunya bagian yang tidak bisa dikerjakan agen.

---

## Bagian 3 — Daftarkan mesin di database (±10 menit)

### Langkah 3.1 — Buka halaman data user (database)
Buka aplikasi admin/platform → menu **User** → cari user yang mesinnya sedang
kamu siapkan → buka bagian **Layanan/Koneksi Mesin** (tabel `user_services`).

### Langkah 3.2 — Isi 6 kolom berikut

| Kolom | Isi dengan | Contoh |
|---|---|---|
| `base_url` | Alamat API mesin (dari tunnel 8642) + awalan `https://` | `https://joko-jobseeker-8642.jkt3.sumopod.my.id` |
| `api_key` | Kode rahasia (e) dari laporan agen | `4f8a...` |
| `vnc_url` | Alamat layar mesin (dari tunnel 6080) + `/websockify` | `wss://joko-jobseeker-6080.jkt3.sumopod.my.id/websockify` |
| `vnc_jwt_secret` | Kode rahasia (d) dari laporan agen | `1b2c...` |
| `daily_quota` | Target lamaran per hari (tanya admin; standar: 5) | `5` |
| `max_quota` | Batas total masa berlaku (standar: 150 = 5 × 30 hari) | `150` |

### Langkah 3.3 — Simpan
Klik simpan. Periksa sekali lagi: semua kolom terisi, tidak ada yang kosong.

---

## Bagian 4 — Jadwal harian (otomatis dari sistem, tanpa tindakan)

**Tidak perlu tindakan apa pun di mesin.** Jadwal harian dikelola otomatis oleh
sistem backend (BE): setiap hari memilih jam acak 08:00–16:00 WIB untuk
menjalankan agen melamar kerja. Saat berjalan, **prosesnya tampil langsung di
chat aplikasi user** (kartu "Daily Report" muncul setelah selesai).

> Kalau user ingin menjalankan manual: cukup chat "jalankan daily run" — agen
> langsung bekerja dan prosesnya terlihat di chat.

---

## Bagian 5 — Tes & serah terima (5 menit)

1. Buka aplikasi (situs/web) sebagai user tersebut.
2. Kirim pesan chat: **"Cek kuota lamaran saya hari ini"**.
3. Harapan: agen menjawab dengan jelas (mis. "Kuota hari ini 0 dari 5").
4. Kirim: **"Buka halaman login JobStreet di browser"** → viewer layar muncul
   di aplikasi, menampilkan browser.

### 💬 Trigger manual status portal (untuk user)

User tidak perlu tahu istilah teknis — cukup chat dengan bahasa biasa:

| User bilang | Yang terjadi |
|---|---|
| "**aku sudah login jobstreet**" | Agent verifikasi sesi → status jadi "Terhubung ✓" + sync ke sistem SEKARANG |
| "**sudah masuk**" / "**cek status portal saya**" | Sama — agent cek semua portal & perbarui |
| "**perbarui status login**" | Sama (bisa lewat tombol "🔄 Perbarui status login" di aplikasi) |

> Status juga ter-update otomatis tiap 10 menit (watchdog) — trigger manual ini
> hanya mempercepat kalau user tidak mau menunggu.

✅ **Checklist selesai** — semua terisi:
- [ ] Mesin terpasang (laporan agen OK)
- [ ] 2 tunnel dibuat
- [ ] 6 kolom di database terisi
- [ ] Jadwal harian aktif
- [ ] Tes chat & layar berhasil

Selesai! User siap dipakai. 🎉

---

## Bagian 6 — Kalau ada masalah

| Gejala | Penyebab kemungkinan | Solusi |
|---|---|---|
| Chat terputus sebentar | Mesin sedang restart (normal) | Tunggu 2–3 menit, jangan kirim ulang |
| Ada item verifikasi "gagal" | Unduhan internet gagal | Kirim ulang Paket Perintah (Bagian 2.2) — proses aman diulang |
| noVNC/tampilan tidak terbuka | Tunnel 6080 belum dibuat | Cek Bagian 2.5 |
| Aplikasi tidak bisa chat (404) | Tunnel 8642 belum dibuat / `base_url` salah | Cek Bagian 2.5 & 3.2 |
| Agen bilang "config belum diisi" | `agent-config.env` belum diisi | Kirim ke chat mesin: `Isi /opt/data/jobseeker/agent-config.env dengan BE_API_URL=<alamat backend>, BE_INTERNAL_TOKEN=<token internal>, USER_ID=<id user>` |
| Viewer menolak koneksi / langsung putus | `vnc_jwt_secret` di database salah | Salin ulang kode rahasia (d) ke kolom `vnc_jwt_secret` |
| Tidak ada lamaran harian | Jadwal belum aktif / kuota 0 | Cek Bagian 4; tanya user apakah kuota habis |

---

## Bagian 7 — Aturan keamanan singkat

1. **2 kode rahasia** (kunci API & kode rahasia VNC) = seperti PIN ATM mesin.
   Catat di tempat aman, jangan pernah di chat publik, email, atau screenshot
   yang disebar.
2. Setiap mesin punya **kode rahasianya sendiri** — jangan salin antar mesin.
3. Kalau mencurigai kode rahasia bocor → minta admin membuatkan mesin baru
   (proses sama seperti panduan ini).

---
