Panduan install, setup secrets, permission Cloudflare token, migrasi DB, dan deploy.
- Node.js 20+
- npm
- Akun Cloudflare (sudah punya zone/domain)
- D1 database
tempmail-dbsudah dibuat dan dibinding ke worker
cd "D:\Project\Server 2\Server4\Cloudflare-Mail\tempmail-worker"
npm installGunakan
npx wrangler ...(bukanwrangler ...) kalau wrangler tidak terpasang global.
npx wrangler login
npx wrangler whoamiJalankan migrasi auth table:
npx wrangler d1 execute tempmail-db --file=./schema.auth.sql --remoteKalau ingin local D1 (tanpa remote):
npx wrangler d1 execute tempmail-db --file=./schema.auth.sqlJalankan migrasi table emails (inbox pesan):
npx wrangler d1 execute tempmail-db --file=./schema.emails.sql --remoteIsinya:
- Tabel
emails(recipient, sender, subject, body_text, body_html, created_at) - Index
idx_emails_created_atuntuk sortir DESC cepat - Index
idx_emails_recipient_loweruntuk lookup per-mailbox (WHERE lower(recipient) = lower(?))
Worker punya 3 optimasi biar tidak jebol Rows read / day (limit 5M/bulan di free plan):
- Module-level memo untuk
ensureAuthSchema&ensureBootstrapAdmin— jalan sekali per isolate. - Cache
getAdminSettings10 detik (TTL di memori isolate). - Fast-path
?partial=inbox— auto-refresh inbox cuma butuh 1 D1 read (SELECT emails) tanpa schema bootstrap / admin settings / audit log. - Auto-refresh 30 detik (visibility-aware) + countdown UI. Pause saat tab tersembunyi.
Path dashboard:
- Cloudflare Dashboard
- Klik avatar kanan atas
- My Profile
- API Tokens
- Create Token
- Pilih Create Custom Token
- Zone → Zone → Read
- Zone → DNS → Edit
- Zone → Email Routing Rules → Edit
Opsional (kalau nanti butuh inspeksi worker):
- Account → Workers Scripts → Read
- Bisa pilih All zones (kalau kamu kelola banyak domain)
- Atau Include specific zone untuk keamanan lebih ketat
Selesai create, copy token (muncul sekali).
Kalau token kamu pakai All zones, CF_ZONE_ID boleh dikosongkan.
Kalau mau lock ke satu zone saja, ambil dari:
- Cloudflare Dashboard
- Pilih domain/zone
- Halaman Overview
- Copy nilai Zone ID
Path:
- https://console.cloud.google.com/
- APIs & Services → OAuth consent screen (setup dulu)
- Credentials → Create Credentials → OAuth client ID
- Type: Web application
- Redirect URI:
https://<domain-worker>/auth/callback/google
Ambil:
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URI
Path:
- GitHub → Settings
- Developer settings
- OAuth Apps
- New OAuth App
- Callback URL:
https://<domain-worker>/auth/callback/github
Ambil:
GITHUB_CLIENT_IDGITHUB_CLIENT_SECRETGITHUB_REDIRECT_URI
Path:
- https://discord.com/developers/applications
- Create application
- OAuth2
- Tambah redirect:
https://<domain-worker>/auth/callback/discord
Ambil:
DISCORD_CLIENT_IDDISCORD_CLIENT_SECRETDISCORD_REDIRECT_URI
Bikin sendiri:
BOOTSTRAP_ADMIN_EMAILBOOTSTRAP_ADMIN_USERNAMEBOOTSTRAP_ADMIN_PASSWORD
Generate random value:
[System.Convert]::ToBase64String([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32))Simpan sebagai SESSION_SECRET.
- Copy template:
copy .dev.vars.example .dev.vars- Buka file
.dev.vars, lalu isi value asli. Contoh:
BOOTSTRAP_ADMIN_EMAIL=admin@domainkamu.com
BOOTSTRAP_ADMIN_USERNAME=admin
BOOTSTRAP_ADMIN_PASSWORD=PasswordKuat123!
CF_API_TOKEN=isi_token_dari_cloudflare
SESSION_SECRET=isi_random_secretCF_ZONE_ID tidak perlu diisi kalau CF_API_TOKEN diberi akses All zones.
- Jalankan local:
npm run devJalankan command ini satu per satu. Setelah enter, CLI akan tampil prompt:
🌀 Enter a secret value:
Lalu paste valuenya, enter lagi.
npx wrangler secret put CF_API_TOKEN
npx wrangler secret put CF_ZONE_ID
npx wrangler secret put BOOTSTRAP_ADMIN_EMAIL
npx wrangler secret put BOOTSTRAP_ADMIN_USERNAME
npx wrangler secret put BOOTSTRAP_ADMIN_PASSWORD
npx wrangler secret put SESSION_SECRET
npx wrangler secret put GOOGLE_CLIENT_ID
npx wrangler secret put GOOGLE_CLIENT_SECRET
npx wrangler secret put GOOGLE_REDIRECT_URI
npx wrangler secret put GITHUB_CLIENT_ID
npx wrangler secret put GITHUB_CLIENT_SECRET
npx wrangler secret put GITHUB_REDIRECT_URI
npx wrangler secret put DISCORD_CLIENT_ID
npx wrangler secret put DISCORD_CLIENT_SECRET
npx wrangler secret put DISCORD_REDIRECT_URIOpsional:
npx wrangler secret put API_KEY
npx wrangler secret put ADMIN_PASSWORDJika API key digunakan, endpoint API dapat diauthorize dengan salah satu cara berikut:
- Header
x-api-key: API_KEY_ANDA - Header
Authorization: Bearer API_KEY_ANDA - Query string
?api_key=API_KEY_ANDA
Contoh panggilan API:
curl -H "x-api-key: API_KEY_ANDA" "http://mail.zcus.biz.id/api/messages/user@gpt.zzzza.biz.id"curl "http://mail.zcus.biz.id/api/messages/user@gpt.zzzza.biz.id?api_key=API_KEY_ANDA"// Node.js
const target = 'user@gpt.zzzza.biz.id';
const res = await fetch(`http://mail.zcus.biz.id/api/messages/${encodeURIComponent(target)}`, {
headers: { 'x-api-key': API_KEY }
});
console.log(await res.json());# Python
import requests
API_KEY = 'API_KEY_ANDA'
target = 'user@gpt.zzzza.biz.id'
res = requests.get(
f'http://mail.zcus.biz.id/api/messages/{requests.utils.requote_uri(target)}',
headers={'x-api-key': API_KEY}
)
print(res.json())// PHP
$apiKey = 'API_KEY_ANDA';
$target = 'user@gpt.zzzza.biz.id';
$ch = curl_init('http://mail.zcus.biz.id/api/messages/' . urlencode($target));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['x-api-key: ' . $apiKey]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
var_dump(json_decode($response, true));Verifikasi secret sudah masuk:
npx wrangler secret listJangan simpan token/secret di
wrangler.jsoncatau commit ke git.
npm run devnpm testTest jalan local mode (Miniflare D1 in-memory) — tidak perlu login Cloudflare.
vitest.config.jssetremoteBindings: falsesupaya tidak hit D1 remote.
npm run deployGunakan npx:
npx wrangler --version- Pastikan sudah login:
npx wrangler whoami - Pastikan di folder project yang benar
- Pastikan worker name pada
wrangler.jsoncsesuai
- Pastikan DB binding ada di
wrangler.jsonc - Pastikan nama DB di command benar:
tempmail-db - Coba jalankan ulang dengan
npx