Logo

~/saidqb cat wiki/stack/server-extra/cloudflare.md

MDcloudflare.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).

ModeCloudflare ↔ OriginCatatan
FlexibleHTTP, tidak dienkripsiJangan pakai — celah keamanan di leg terakhir
FullHTTPS, sertifikat origin tidak divalidasiOrigin boleh pakai sertifikat self-signed
Full (Strict)HTTPS, sertifikat origin harus validDirekomendasikan — 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.