---
type: tutorial
title: Siapkan gerbang proxy dengan nginx
summary: Aktifkan gerbang pada sebuah kunci situs, sambungkan reverse proxy nginx ujung ke ujung, dan amati dalam mode pratinjau sebelum ia memblokir satu pun pengunjung nyata.
---

Di akhir tutorial ini gerbang akan berjalan di depan sebuah situs di balik nginx: pengunjung yang belum diloloskan dikirim ke sebuah game, game yang terpecahkan men-set cookie, dan permintaan berikutnya lewat langsung. Kamu akan mengamati keseluruhannya dulu dalam **mode pratinjau**, jadi tak ada yang diblokir sampai kamu memastikan penyambungan. Di sini dipakai nginx; [resep Traefik, Caddy, dan Authelia](/docs/proxy-page-gate/reverse-proxy-recipes) mengikuti bentuk yang sama.

<Callout type="tip">
Kerjakan langkah 1 sebelum menyentuh proxy-mu. Mode pratinjau membiarkan gerbang berjalan hanya-memantau: dasbor mencatat apa yang *akan* dilakukannya, tapi tiap permintaan tetap lewat, jadi kesalahan penyambungan tak pernah mengunci siapa pun di luar.
</Callout>

## 1. Nyalakan mode pratinjau

Di dasbor, buka tim dan nyalakan **mode pratinjau**. Selagi ia menyala, otorisator gerbang mencatat keputusan tantangan lawan lolos langsung ke [halaman statistik](/docs/proxy-page-gate/statistics) tapi tak pernah memblokir. Kamu akan mematikannya di akhir.

## 2. Aktifkan gerbang pada kunci situsmu

Buka kunci situsmu dan pergi ke halaman **Gerbang proxy**. Nyalakan **Status → Aktif**, lalu atur:

- **TTL izin lewat**: berapa lama satu penyelesaian meloloskan seorang pengunjung (default 30 menit). Lebih pendek berarti lebih banyak pemeriksaan ulang tapi jendela lebih kecil jika sebuah cookie dicuri.
- **Mode gagal**: apa yang proxy-mu lakukan saat tak bisa menjangkau otorisator Caputchin. **Fail-closed** memblokir (lebih aman untuk portal login); **fail-open** meloloskan permintaan (menghindari waktu henti pada situs publik).

Halaman itu juga menampilkan cuplikan nginx siap-salin dengan kunci situsmu sudah terisi.

## 3. Izinkan origin yang kamu gerbangi

Tantangan hanya mengalihkan balik ke sebuah **origin yang diizinkan**, daftar origin yang diizinkan yang sama dengan yang widget pakai. Pastikan ia menyertakan origin yang kamu gerbangi, misalnya `https://auth.example.com`. Setel pada konfigurasi Cap kunci situs jika belum ada di sana.

## 4. Sambungkan otorisator dan pengalihan ke tantangan

Dua blok `location`: sebuah sub-permintaan **otorisator** internal, dan sebuah pengalihan **tantangan** yang proxy loncati saat `401`. Ganti `YOUR_SITE_KEY` dengan kunci publikmu.

```nginx
# Gate the protected paths.
location / {
  auth_request /_cpt_authz;             # 204 = allow, 401 = challenge
  error_page 401 = @cpt_challenge;
  # ...proxy_pass to your app...
}

location = /_cpt_authz {
  internal;
  proxy_pass https://verify.caputchin.com/v1/gate/authz?site=YOUR_SITE_KEY;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header Cookie $http_cookie;  # forward the cpt_gate cookie
}

location @cpt_challenge {
  return 302 https://verify.caputchin.com/v1/gate/challenge?site=YOUR_SITE_KEY&return=$scheme://$host$request_uri;
}
```

Gerbangi jalur masuk (HTML portal dan POST login). **Jangan** gerbangi sub-permintaan otorisator, health check, atau callback di bawah.

## 5. Tambahkan callback yang men-set cookie

Halaman tantangan menyelesaikan dengan auto-mengirim sebuah `POST` kecil ke `/__cpt/callback` pada origin-mu, dengan `cpt_gate` (pass) dan `to` (ke mana mengirim pengunjung) di **body**. Sebuah handler mungil men-set cookie dan mengalihkan. Kontrak penuh, termasuk mengapa tiap atribut cookie penting, ada di [resep reverse proxy](/docs/proxy-page-gate/reverse-proxy-recipes#the-callback). Minimalnya:

```js
app.post("/__cpt/callback", express.urlencoded({ extended: false }), (req, res) => {
  const pass = String(req.body.cpt_gate || "");
  const to = String(req.body.to || "/");
  const target = new URL(to, `https://${req.headers.host}`);
  if (target.host !== req.headers.host) return res.status(400).end(); // same-origin only
  res.setHeader(
    "Set-Cookie",
    `cpt_gate=${pass}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=1800`
  );
  res.redirect(303, target.pathname + target.search);
});
```

## 6. Amati dalam pratinjau

Muat URL bergerbang. Karena pratinjau menyala, kamu lewat langsung, tapi [halaman statistik](/docs/proxy-page-gate/statistics) mencatat sebuah `challenge_served` (kamu tak punya cookie) dan, begitu kamu menyelesaikan dan callback berjalan, sebuah `pass_issued`. Muat ulang dan kamu mestinya melihat `passthrough` menanjak. Jika tantangan tak pernah muncul, blok otorisator tak terkena; jika callback memberi 400, periksa origin `to`.

## 7. Terjunkan langsung

Saat angka-angka terlihat benar, matikan **mode pratinjau**. Gerbang kini menegakkan: pengunjung yang belum diloloskan dikirim ke game, pengunjung yang menyelesaikan menjelajah sampai pass mereka kedaluwarsa.

## Ke mana selanjutnya

- [Resep reverse proxy](/docs/proxy-page-gate/reverse-proxy-recipes): Traefik, Caddy, dan penelusuran lengkap Authelia.
- [Statistik gerbang proxy](/docs/proxy-page-gate/statistics): apa arti tiap angka begitu kamu langsung.
- [Ikhtisar](/docs/proxy-page-gate/overview): konsepnya dan apa yang sengaja tak dilakukan gerbang.
