~/saidqb cat wiki/stack/server-extra/cloudflare.md
commit by saidqb
Deploy di belakang Cloudflare
Opsional — lapisan tambahan di depan server (DNS + proxy + SSL edge). Sama persis buat Laravel, React, maupun FastAPI, karena Cloudflare kerja di level DNS/network, tidak peduli stack backend-nya apa. Langkah-langkah Nginx/PHP-FPM/systemd yang ada di deploy-laravel.md, deploy-react.md, deploy-fastapi.md tidak berubah — ini cuma nambah di depannya.
0. Prasyarat
- Akun Cloudflare (gratis) — daftar di cloudflare.com
- Akses ke panel domain registrar (buat ganti nameserver)
- Server sudah selesai setup sampai bisa diakses lewat
http://app.example.com(ikuti dokumen deploy stack yang relevan dulu)
1. Daftar domain di Cloudflare
- Dashboard Cloudflare → Add a Site → masukkan domain kamu
- Cloudflare otomatis scan DNS record yang sudah ada (biasanya kedeteksi A record ke IP server kalau memang sudah pernah disetup)
- Pilih plan Free
2. Ganti nameserver domain
Cloudflare kasih 2 nameserver (misal aria.ns.cloudflare.com, walt.ns.cloudflare.com). Masuk ke panel registrar domain kamu (Niagahoster/Namecheap/dll), ganti nameserver-nya ke situ.
Propagasi biasanya beberapa menit sampai beberapa jam — Cloudflare kirim email begitu domainnya aktif di sistem mereka.
3. Atur DNS record
Dashboard → DNS → pastikan:
Type: A
Name: app (atau @ untuk root domain)
Content: <IP server kamu>
Proxy status: Proxied (awan oranye)
Proxy status wajib "Proxied" (oranye), bukan "DNS only" (abu-abu) — kalau abu-abu, Cloudflare cuma jadi DNS server biasa, tidak ada proxy/SSL/CDN Cloudflare sama sekali, balik seperti server tanpa Cloudflare.
4. Set mode SSL/TLS
Dashboard → SSL/TLS → Overview → pilih Full (Strict).
| Mode | Cloudflare ↔ Origin | Catatan |
|---|---|---|
| Flexible | HTTP, tidak dienkripsi | Jangan pakai — celah keamanan di leg terakhir |
| Full | HTTPS, sertifikat origin tidak divalidasi | Origin boleh pakai sertifikat self-signed |
| Full (Strict) | HTTPS, sertifikat origin harus valid | Direkomendasikan — perlu salah satu dari Langkah 5 di bawah |
5. Pasang sertifikat di origin server (untuk Full Strict)
Pilih salah satu:
Opsi A — Let's Encrypt via certbot (tetap seperti dokumen deploy stack)
Tidak ada yang berubah dari langkah "Opsional: HTTPS" di deploy-laravel.md/deploy-react.md/deploy-fastapi.md — challenge HTTP-01 certbot tetap tembus lewat proxy Cloudflare ke server di port 80:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app.example.com
Auto-renewal jalan seperti biasa (systemd timer/cron bawaan package certbot).
Opsi B — Cloudflare Origin CA Certificate
Sertifikat gratis dari Cloudflare sendiri, berlaku sampai 15 tahun (bukan 90 hari), tapi cuma dipercaya Cloudflare — bukan browser publik. Cocok karena browser publik memang tidak pernah connect langsung ke origin (selalu lewat Cloudflare dulu).
Dashboard → SSL/TLS → Origin Server → Create Certificate (biarkan opsi default), lalu copy dua hal yang muncul: Origin Certificate dan Private Key.
sudo mkdir -p /etc/ssl/cloudflare
sudo nano /etc/ssl/cloudflare/cert.pem # paste "Origin Certificate"
sudo nano /etc/ssl/cloudflare/key.pem # paste "Private Key"
sudo chmod 600 /etc/ssl/cloudflare/key.pem
Beda dari Opsi A, di sini tidak ada certbot yang otomatis edit Nginx — tambahkan manual ke server block yang sudah ada:
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name app.example.com;
ssl_certificate /etc/ssl/cloudflare/cert.pem;
ssl_certificate_key /etc/ssl/cloudflare/key.pem;
# ... sisa konfigurasi (root/fastcgi_pass/proxy_pass) tetap sama seperti dokumen deploy stack
}
sudo nginx -t && sudo systemctl reload nginx
Catatan: kalau suatu saat proxy Cloudflare dimatikan (awan jadi abu-abu) sementara masih pakai Origin CA cert, browser akan tampilkan warning sertifikat tidak dikenal — karena cert ini memang cuma didesain buat dipercaya Cloudflare, bukan publik.
6. Opsional: kunci firewall cuma buat Cloudflare
Supaya IP asli server tidak bisa diakses langsung (bypass Cloudflare), ganti aturan firewall dari "buka ke semua IP" jadi "cuma dari IP Cloudflare":
sudo ufw delete allow 'Nginx Full'
for ip in $(curl -s https://www.cloudflare.com/ips-v4) $(curl -s https://www.cloudflare.com/ips-v6); do
sudo ufw allow from "$ip" to any port 80,443 proto tcp
done
IP range Cloudflare jarang berubah, tapi kalau berubah perlu dijalankan ulang — cek daftar terbaru di cloudflare.com/ips.