# CARA KITA DEPLOY "MAYA DEF" — Template `IMBA.html`, Brand IMBASLOT

> Dokumen kerja internal · versi **09 November 2026** · basis: sesi DS242 / DS243 / DS243-B / DS243-P (24 domain · 333 LP) + DS245.
> Semua angka di dokumen ini diambil dari deploy nyata, bukan perkiraan.
> Template **tidak boleh diubah** (read-only). Yang berubah tiap deploy hanya isi variabel + payload.

---

## 0. Ringkasan 1 menit

**Maya Def** = 1 domain (biasanya domain expired milik sendiri) dipakai untuk menaikkan **banyak LP brand** di path/slug yang dulu benar-benar ada di domain itu.

Hasil akhirnya, untuk setiap URL slot:

| Yang datang | Yang dilayani |
|---|---|
| Bot (Googlebot, InspectionTool, AdsBot, Bingbot, Yandex, Twitter, Facebook) | **LP penuh — HTTP 200** |
| Manusia (HP **dan** desktop) | **302 → funnel brand** (`https://cutt.ink/imbaslot`) |
| Root domain `/` | **homepage asli** (kecuali root sengaja dijadikan slot LP) |
| Path yang tidak terdaftar | **404** (bukan homepage, bukan LP) |

**Yang TIDAK dipakai di Maya Def:** AMP / `amphtml`, redirect berbasis geo/IP/JS di dalam LP, `nosnippet`, hidden mesh berisi nama brand sendiri, artikel rich (cukup thin 1 paragraf).

**Sidik template:** `Template/IMBA.html` · **484.693 byte** · md5 `3fe3c6b8d0cc9a730bffc79e9e4dce48`.
Kalau md5 berubah: **STOP**, jangan deploy — template tersentuh.

---

## 1. Isi paket ini

| File | Isi |
|---|---|
| `CARA-DEPLOY-MAYA-DEF-IMBASLOT.md` | dokumen ini (alur lengkap + gotcha) |
| `preview-maya-def-imbaslot.html` | contoh LP jadi, brand IMBASLOT (versi rapi untuk dilihat) |
| `preview-maya-def-imbaslot-slot2.html` · `-slot3.html` | 2 contoh lain (judul/desc beda) |
| `preview-maya-def-imbaslot-mentah.html` | **HTML apa adanya** — persis yang dikirim ke bot saat live (516 `{{...}}`, 10 CSS samsung, 36 `data-src`) |
| `slots-demo.json` | contoh slotsfile (3 slot) yang dipakai build |
| `_gen.js` · `_build` (perintah di §6) · `_qa.js` · `_preview.js` | skrip kecil untuk reproduksi contoh |

> **Soal file `-mentah`:** LP live memang "mentah". Placeholder `{{...}}` dan CSS `www.samsung.com` yang 403 (kalau ada Referer) itu **normal** — manusia di-302 ke funnel, bot cuma baca judul + teks. Jangan panik, jangan "dibersihkan" (lihat §9 larangan).

---

## 2. Prasyarat

1. **Domain** yang mau dipakai (umumnya expired domain milik sendiri) + akses DNS (`nc set-a` Namecheap).
2. **VPS BUYVM** dengan docroot `/var/www/<domain>` dan vhost aktif.
   - DEFEND → origin `209.141.39.208` (`.208`, anti-DDoS)
   - BRUTAL → origin `209.141.38.79` (`.79`) via Cloudflare
3. **Homepage asli domain** (dari Wayback) — file `index.html` yang ditaruh di root docroot.
4. **SSL** — wajib **sebelum** `go` (engine fetch root lewat HTTPS). Untuk 1–4 domain `certbot --apache` cukup; untuk banyak domain pakai `certonly --webroot` + conf :443 manual (lebih cepat, tidak hang).
5. **GSC 5 file** (`googlefb127c1561b04abd` + `google88aa4c4e343ea86d` + `google94c61f34e8d9b3e4` + `google01e81fdf819ac8c4` + `google0f3f0337d75fda4a`) ditaruh di root docroot.
6. Node.js di mesin kerja (RDP), akses SSH server `BUYVM` lewat `scripts/ssh-run.js`.
7. Kredit indexer (IndexPro) — atau RUI kalau IndexPro sedang kosong/maintenance.

---

## 3. Perilaku & istilah (biar tidak salah paham)

- **Slot** = 1 URL di domain yang dilayani LP. Contoh: `/jadwal-turnamen/`.
- **`ha:1` (human_all)** = semua non-bot (HP + desktop) di-302 ke funnel **brand slot itu**. Ini setting standar sejak 23-10-2026; `decoy:1` (desktop → google) **tidak dipakai lagi** untuk DEFEND.
- **Root bukan slot** (default): `/` selalu homepage asli untuk semua UA.
- **Root jadi slot** (opsi, dipakai DS243-B/DS243-P): `/` ikut aturan LP — bot 200 LP, manusia 302 funnel. Homepage asli tetap disimpan sebagai `indexx.html`.
- **`notfound404`** = path asing balas 404 asli. Tanpa ini engine menyajikan homepage di semua path (soft-404 massal — jangan).
- **`homewl`** = daftar path yang tetap boleh tampil homepage (`/`, `/index`, `/index.html`).

---

## 4. Template: 21 variabel, sekali isi, tidak pernah diedit

`maya.js build` mengisi semua ini dari `slots-demo.json` (`{%[NAMA]%}` → nilai):

| Variabel | Titik | Isi |
|---|---:|---|
| `META TITLE` | 19 | judul (50–80 char, brand di depan) |
| `META DESKRIPSI` | 8 | deskripsi 140–170 char |
| `BRAND` | 110 | `IMBASLOT` |
| `URL` | 80 | URL kanonik slot itu sendiri |
| `GAMBAR-POPUP` | 53 | URL banner (josjis `/i/<slug>`) |
| `ICON-GAMBAR` | 3 | ikon brand |
| `LOGO-GAMBAR` | 3 | logo brand |
| `FUNNEL` | 4 | `https://cutt.ink/imbaslot` |
| `WARNA-HEX3` | 44 | warna utama `#f54242` |
| `WARNA-HEX1` / `HEX2` / `RGB1` / `RGB2` | 7 / 8 / 11 / 4 | palet turunan (gradient, border, glow) |
| `CARD-CLASS` · `CTA-CLASS` · `POPUP-CLASS` · `LP-CLASS` | 2 · 11 · 2 · 1 | class anti-footprint (`--prefix`) |
| `LIST-KW` | 1 | mesh hidden 2.000 anchor |
| `INFO-SITUS` | 1 | 4 kartu info |
| `PARAGRAF-1` | 1 | artikel thin 3 kalimat |
| `REVIEW` | 1 | 6 kartu review |

Catatan teknis di dalam file (semua sudah bawaan, jangan diutak-atik):
- mesh ada di `<div data-lp-listkw="1" style="display:none">` — 2.000 anchor, 150 di antaranya ber-brand (50 `IMBASLOT`, 50 `IMBAJP`, 50 `IMBAGACOR`);
- schema JSON-LD: rating **4,9**, `ratingCount` **1234** (dipatch saat build), kategori `BusinessApplication` (badge "Gratis · Bisnis/Produktivitas");
- **tidak ada** JS geo / `data-lp-id-redirect` / `ipapi` — LP murni filter UA di server;
- `rel="amphtml"` = 0 (Maya Def tanpa AMP);
- `nosnippet` dibuang otomatis saat build.

---

## 5. Alur 9 langkah (yang kita jalankan tiap sesi)

### L1 — Domain, pointing, SSL
```
node scripts/domain-run.js nc set-a <domain> 209.141.39.208 --name "@,www"
node scripts/maya-def.js restore --domain <domain> --html <home.html>     # vhost + docroot
bash scripts/vps-certbot.sh <domain>                                      # atau certonly --webroot
```
Cek propagasi pakai **DoH** (`scripts/doh-check.js`), jangan `nslookup` dari RDP (sering timeout karena split-tunnel).

### L2 — Homepage asli
Ambil capture Wayback terbaru yang **bukan** parkir/takeover judi. Jalur cepat: fetch dari BUYVM dengan rotasi 3 IP (`curl --interface`), lalu `meta-fix`: `robots index,follow`, canonical self, `http→https`, charset UTF-8. Simpan juga sebagai `indexx.html` kalau root mau dijadikan slot.

### L3 — Recon slug
```
node scripts/slug-hunt.js --domain <domain> --via BUYVM
```
Sumber: sitemap arsip + link homepage + CDX. Buang hanya aset teknis (`.css/.js/gambar`, `/feed`, `/page/N`). **About-us/contact/privacy bukan sampah** — tetap dipakai kalau itu halaman nyata.
**Jangan mapping sebelum recon tuntas** (file `slugs-all.txt` final), ini pernah bikin 3 domain dianggap "0 slug" padahal ada 18–990.

### L4 — Mapping slot + brand
- **Cap 30 slot/domain** (Maya Def). Domain dengan 7 slug asli ya 7 LP — **jangan** tambal slug sintetis kalau sudah > 5 slug asli. Sintetis maksimal 10 dan hanya untuk domain yang slug aslinya 0–5.
- Alokasi brand: `IMBASLOT` dulu, lalu `IMBAJP`, lalu `IMBAGACOR` (`base = floor(n/3)`, sisa ke urutan depan).
- Sesi **IMBASLOT-only** (seperti contoh paket ini): semua slot `brand=IMBASLOT`, tapi mesh tetap membawa 150 anchor trio.

### L5 — Copywriting + gate lokal
Pola judul **CP Mix Game Slug** (standar DEFEND):
```
BRAND | <head game online> <Topik slug> [modifier]
IMBASLOT | Game Online Ringan Panduan Main Harian Terbaru      (57 char)
```
- 50–80 char · tanpa koma · Title Case (kata fungsi kecil) · brand ALL CAPS di depan · tanpa nominal/tahun.
- Deskripsi 140–170 char, brand di awal, pemisah titik — **tanpa koma & tanpa titik-koma**.
- Gate: `node scripts/title-dup-check.js --file titles.txt` → target `DUP 0 · NEAR 0`. Untuk pola ini **tidak perlu** Bing/Google (topik slug unik per URL).

### L6 — Banner
- 1 banner per **brand per domain**, wajib beda tiap domain (jangan reuse antar domain).
- Nama file/slug **tanpa** ID sesi: `imbaslot-<5 digit acak>` → `https://josjis.io/i/imbaslot-66348`.
- Style anime v12 + `(figur bernama <Nama> from <Origin>, be creative)`, 1024×1024, wajib `papan/adegan` beda tiap banner, tanpa nominal/persentase.
- Cek cepat sebelum dipakai: `curl -o NUL -w "%{http_code} %{content_type}" https://josjis.io/i/<slug>` → harus `200 image/webp`.

### L7 — Build payload
```bash
node scripts/maya.js build \
  --wdir "DEPLOY SESSION <N>/_runner/work-<domain>" \
  --base https://<host-kanonik> \
  --slotsfile "DEPLOY SESSION <N>/_runner/slots-<domain>.json" --n <jumlah-slot> \
  --server BUYVM --dir /var/www/<domain> \
  --meshsize 2000 --meshprefix 50 --meshmandated IMBASLOT,IMBAJP,IMBAGACOR \
  --ratingcount 1234 --notfound404 1 --homewl /,/index,/index.html \
  --funnel https://cutt.ink/imbaslot --interlink 3 \
  --banner https://josjis.io/i/imbaslot-66348 \
  --icon   https://josjis.io/i/imbaslot-favicon \
  --logo   https://josjis.io/i/imbaslot-logo-flat \
  --prefix <4-6 char unik per domain>
```
Output: `lp/*.gz`, `payload-<hash>.tgz`, `m-<hash>.php` (engine), `state.json`.
**Setelah build: JANGAN di-"clean", JANGAN di-rewrite CSS.** Langsung QA.

QA gate (versi sederhana, sesuai rule #46):
```
leftover {%[ = 0 · canonical = self · title = judul slot · desc = desc slot
mesh 2.000 anchor · branded 150 (50/50/50) · ratingCount 1234
tanpa data-lp-id-redirect / ipapi · nosnippet 0 · amphtml 0 · interlink = n-1
```
Contoh hasil sesi ini: 3 LP · 2000 anchor · branded 50/50/50 · QA PASS 3/3.

### L8 — Stage + GO
Stage **di luar docroot** supaya belum tayang:
```
/root/prep-<sesi>/<domain>/
  payload-<hash>.tgz · m-<hash>.php · state.json · INSTALL.sh · README.txt
```
- File ≥1 MB **wajib** `stage-cf.js` (RDP → Cloudflare → VPS + md5). File kecil boleh `ssh-run --file`.
- `INSTALL.sh` melakukan: `mkdir -p $D/_m` → copy payload ke **`<docroot>/_m/`** → copy engine ke docroot → copy state → `php -l`.
  **Payload HARUS di `_m/`** — spec engine menunjuk ke situ; kalau ditaruh di root docroot, GO balas 404.
- Sebelum GO: pastikan `.htaccess` front-controller sudah ada (`RewriteRule . /index.php [L]`) dan DNS resolver VPS sudah menunjuk origin (kalau tidak, engine fetch root = timeout).
- GO **satu domain per satu domain** (paralel 5 domain = deadlock php-fpm `max_children=5`):
```bash
bash /root/prep-<sesi>/<domain>/INSTALL.sh
node scripts/maya.js go \
  --wdir "DEPLOY SESSION <N>/_runner/work-<domain>" \
  --base https://<host-kanonik> --host <domain> \
  --server BUYVM --dir /var/www/<domain>
```
Durasi normal: **5–15 detik/domain** (DS242: 5,3–15,1 dtk · DS243-P: 6,9–7,6 dtk).
GO kadang balas `504` **tapi install tetap sukses** — cek ulang lewat curl, jangan langsung ulang GO.

### L9 — Verify + indexer + catatan
```bash
# bot
curl -s -o /dev/null -w "%{http_code}" -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://<domain>/<slug>/
# manusia (HP & desktop harus 302 ke funnel brand)
curl -s -o /dev/null -w "%{http_code} %{redirect_url}" -A "<UA Chrome mobile>" https://<domain>/<slug>/
# root + path asing
curl -s -o /dev/null -w "%{http_code}" https://<domain>/
curl -s -o /dev/null -w "%{http_code}" https://<domain>/tidak-ada-xyz/
```
Target: **BOT 200 (judul persis) · HP 302 funnel · desktop 302 funnel · root 200 · unknown 404 · GSC 200**.

Submit indexer **per domain** (jangan tunggu batch selesai):
```bash
node scripts/indexpro.js instant --file urls-<domain>.txt --name "Ryhas <domain> LP"
```
Nama project **selalu** `Ryhas <domain> LP` (atau `Ryhas <domain> Restore` untuk homepage).
Kalau kredit IndexPro habis → RUI apex (`node scripts/rapidurl.js submit --file urls.txt --apex`).

Terakhir: jurnal (`node scripts/jurnal-laporan.js add --type "PUBLISH-LP" ...`), `status` sesi, dan `title-history.md`.

---

## 6. Config brand IMBASLOT (pakai apa adanya)

| Item | Nilai |
|---|---|
| Funnel | `https://cutt.ink/imbaslot` |
| Logo | `https://josjis.io/i/imbaslot-logo-flat` (700×200, webp) |
| Icon | `https://josjis.io/i/imbaslot-favicon` (png) — **cek dulu**: `imbaslot-resmi` di registry sudah balas HTML (file hilang) |
| Banner | `https://josjis.io/i/imbaslot-<5 digit>` (webp 1:1, beda tiap domain) |
| Warna | primary `#f54242` · secondary `#ff6666` (merah terang, ACC user 26-09) |
| Anchor brand di mesh | 50 `IMBASLOT <kw>` + 50 `IMBAJP <kw>` + 50 `IMBAGACOR <kw>` (posisi acak) |

---

## 7. Contoh isi `slots-demo.json` (yang dipakai untuk preview di paket ini)

```json
{
  "brand": "IMBASLOT",
  "host": "contoh-maya-def.com",
  "base": "https://contoh-maya-def.com",
  "slots": [
    {
      "k": "demo01-f93570",
      "p": "/panduan-game-online/",
      "u": "https://contoh-maya-def.com/panduan-game-online/",
      "m": "f",
      "fu": "https://cutt.ink/imbaslot",
      "bn": "https://josjis.io/i/imbaslot-66348",
      "ic": "https://josjis.io/i/imbaslot-favicon",
      "lg": "https://josjis.io/i/imbaslot-logo-flat",
      "brand": "IMBASLOT",
      "ha": 1,
      "root": 0,
      "ti": "IMBASLOT | Game Online Ringan Panduan Main Harian Terbaru",
      "de": "IMBASLOT merangkum panduan main harian dengan alur ringkas. ... (140-170 char)"
    }
  ]
}
```
Field penting: `p` path (folder → **wajib** trailing slash) · `u` URL kanonik · `ha:1` (HP+desktop → funnel) · `root:1` hanya kalau root dijadikan LP · `ti`/`de` wajib (jangan biarkan generator mengarang).

---

## 8. Angka nyata (buat kalibrasi)

| Item | Angka |
|---|---|
| Build 1 payload | ±10–20 dtk untuk 3–30 slot (payload 0,24–2,4 MB) |
| GO / install | 5,3–15,1 dtk per domain (1 domain per proses) |
| Verify penuh (bot+HP+desktop+root+404) | ±1–2 dtk per URL |
| DS243-P | 14 domain · 219 LP staged → 24/24 domain · **333 LP** dalam satu hari |
| QA gate | 219/219 PASS (canonical, leftover 0, mesh, rating 1234) |

---

## 9. Larangan (yang bikin hasil "aneh" kalau dilanggar)

1. **Jangan edit `Template/IMBA.html`.** Cek md5 tiap mulai.
2. **Jangan jalankan `lp-clean.js` / `lp-selfhost.js` / `lp-cdn-variant.js` untuk deploy Maya Def.** Itu aturan lama (29-10) yang **dibatalkan** 30-10: LP yang dipatch hasilnya aneh (konversi/rank terganggu). Template dipakai **mentah**.
3. **Jangan tambah JS geo / redirect klien** di LP. Filter UA hanya di server.
4. **Jangan pasang AMP / `amphtml`.**
5. **Jangan pakai judul tanpa brand** (itu gaya Maya Slug, bukan Maya Def/trio).
6. **Jangan bikin slug sintetis** kalau domain sudah punya >5 slug asli.
7. **Jangan GO paralel** banyak domain (php-fpm deadlock).
8. **Jangan taruh payload di root docroot** — harus `<docroot>/_m/`.
9. **Jangan pakai base non-kanonik** (www vs non-www) saat GO — Apache balas 301 dan GO gagal.
10. **Jangan pakai path berbau "casino"/"judi"** di slug — indexer menolak (blocked policy). Ganti path netral lalu submit ulang.

---

## 10. Gotcha lapangan (semua sudah pernah kejadian)

| # | Gejala | Sebab | Fix |
|---|---|---|---|
| 1 | Bot dapat 301, bukan LP | slot folder tanpa trailing slash | normalisasi `p` → `/slug/`, rebuild |
| 2 | Root jadi LP / root 404 | slot `/index.html/` ikut ke mapping, atau `/` tidak ada di `homewl` | buang slot root dari mapping / isi `homewl /,/index,/index.html` |
| 3 | Manusia dapat homepage 200 di URL slot | folder **shim lama** dari install sebelumnya | hapus folder shim lama, reinstall |
| 4 | GO `payload md5 mismatch` | payload di-repack setelah build (engine menyimpan md5 di dalam `$MM_SPEC`) | `node scripts/lp-sync-engine-md5.js "<work-dir>"` |
| 5 | GO `{"errors":["?... not found"]}` / 404 | payload tidak ada di `<docroot>/_m/` | copy ulang sesuai `INSTALL.sh` |
| 6 | GO sukses tapi slot lama tetap | `.cache/status.json` lama | hapus `.cache` sebelum GO |
| 7 | GO gagal 404 semua | vhost `:443` belum ada / cert belum terbit | certbot dulu, baru GO |
| 8 | GO lambat / `polling timeout` | GO paralel >2 domain | GO sequential, `systemctl restart php8.3-fpm` kalau sudah nyangkut |
| 9 | Slug non-ASCII 404 | `%C3%A9` dll | transliterasi ke ASCII, rebuild |
| 10 | DNS VPS masih IP parkir | resolver cache | `getent hosts <domain>` dulu; tambah `/etc/hosts` saat perlu |
| 11 | Indexer menolak sebagian URL | path mengandung kata terlarang | rename slug netral, redeploy 1 slot, resubmit |
| 12 | certbot gabung banyak vhost jadi 1 conf (docroot ketuker) | `certbot --apache` untuk banyak domain sekaligus | pecah per domain / pakai `certonly --webroot` |

---

## 11. Checklist pre-flight & pasca-deploy

**Sebelum build**
- [ ] md5 template `3fe3c6b8d0cc9a730bffc79e9e4dce48`
- [ ] slug recon tuntas (baca `slugs-all.txt` final, bukan snapshot)
- [ ] jumlah slot ≤ 30/domain · brand mulai IMBASLOT
- [ ] judul/desc lolos gate lokal (DUP 0 · NEAR 0 · 50–80 / 140–170)
- [ ] banner `/i/` HTTP 200 `image/webp`, beda tiap domain
- [ ] homepage + SSL + GSC 5 file siap

**Setelah GO**
- [ ] BOT 200 + judul persis (bukan judul homepage)
- [ ] HP 302 funnel brand · desktop 302 funnel brand (brand sesuai slot)
- [ ] root 200 (homepage asli) atau LP kalau root dijadikan slot
- [ ] path asing 404
- [ ] GSC 200
- [ ] IndexPro per domain `Ryhas <domain> LP`
- [ ] jurnal + title-history + status sesi

---

## 12. Contoh live (untuk pembanding)

- `https://taphco.com/` (DS243) — 25 LP IMBASLOT, root = homepage
- `https://almasbakery.com/` (DS243-P) — 11 LP trio, root = LP
- `https://gamedaygearco.com/` (DS243-P) — 30 LP
- `https://lacaradelmal.com/` (DS245) — homepage restore, belum ada LP

Bandingkan: buka pakai browser biasa → harus **302 ke funnel**; pakai UA Googlebot (`scripts/Chrome UA Bot.bat`) → **LP penuh 200**.

---

*Dokumen ini living — kalau ada perubahan aturan (template, mesh, indexer), update di sini dulu sebelum dipakai di sesi deploy.*
