Skip to main content

Di Balik Layar

Bagaimana Situs Ini Dibangun

Portfolio ini tidak pakai hosting autopilot. Saya kemas, kirim, dan jalankan sendiri di satu server kecil — dan tetap cepat diakses dari mana saja. Ini keseluruhan sistemnya dalam satu gambar.

Kamubrowser kamu
Cloudflaresalinan cepat dekat kamu
nginxgerbang aman (HTTPS)
Server sayaNext.js di container

Hampir tiap kunjungan dijawab di edge, dekat pengunjung. Server saya baru disentuh kalau edge belum punya halamannya.

Self-hosted
tanpa platform terkelola
1 vCPU · 512 MB
seluruh server
1,000+
halaman, prebuilt
~106 kB
JavaScript per kunjungan

Saya jalankan sendiri

Tanpa hosting terkelola. Situs berjalan di container pada server kecil yang saya kontrol dari atas ke bawah — satu biaya yang pasti, tidak ada yang disembunyikan platform.

Self-host di VPS

Tiap update terkirim sendiri

Saat saya push perubahan, pipeline otomatis mengetesnya, mengemasnya, dan men-deploy-nya. Kalau ada yang gagal cek, itu tak pernah sampai ke situs live.

CI/CD otomatis

Cepat by design

Halaman dibangun lebih dulu dan dilayani dari server dekat tiap pengunjung, jadi situs tetap gesit bahkan di mesin satu-CPU.

Prebuilt + di-cache edge

Untuk engineer

Sistem Secara Mendalam

Tiap bagian dari build, lengkap dengan angka dan trade-off di baliknya. Pilih topik.

Stack, per Lapisan

Setiap lapisan adalah sesuatu yang saya jalankan dan pahami dari ujung ke ujung — bukan black box yang disembunyikan platform.

Framework

Next.js 15 App Router

React Server Components dan metadata per route, di-prerender jadi HTML statis saat build.

i18n

next-intl (en / id)

Routing dwibahasa penuh dengan hreflang alternates yang benar; setRequestLocale menjaga tiap route tetap statis.

Styling

Tailwind + CSS variables

Kelas utility-first di atas token kecil yang menggerakkan dark theme dan aksen oranye.

Motion

framer-motion

Dipakai secukupnya — scroll reveal hanya di tempat yang berguna; fade CSS murni di tempat lain agar JS tidak masuk route.

Packaging

Docker + GHCR

Image standalone yang di-build di CI dan di-push ke container registry GitHub, diversikan per commit SHA.

CI/CD

GitHub Actions

Typecheck, lint, build, push, dan deploy via SSH — pipeline yang merah tidak pernah sampai produksi.

Edge

Cloudflare + nginx

Cloudflare meng-cache di edge; nginx terminasi TLS dan reverse-proxy ke container di 127.0.0.1.

Observability

Grafana · Prometheus · Loki

Metrics, log, dan alerting untuk box ini dan server klien di sebelahnya — satu pane of glass self-hosted.

Layanan

Groq + Resend

AI chat assistant berjalan di Groq; form kontak dikirim server-side lewat Resend.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan tentang cara situs ini berjalan.

Apakah situs ini di-hosting di Vercel?

Tidak. Dulu di Vercel, sekarang self-hosted: image Docker Next.js standalone berjalan di container 1 vCPU / 512 MB di VPS kecil, di depan Cloudflare, dengan nginx yang menerminasi TLS. Pindah ke sini memberi satu biaya bulanan yang pasti dan kontrol penuh atas runtime.

Bagaimana situs ini di-deploy?

Tiap push ke main menjalankan pipeline GitHub Actions: typecheck dan lint, lalu build image Docker, push ke GHCR dengan tag commit SHA, dan deploy via SSH dengan docker compose. Container diganti di tempat hanya setelah healthcheck-nya lolos.

Kenapa situs pakai WebP alih-alih AVIF untuk gambar?

Di box 1 vCPU, encode satu cover ke AVIF terukur 4–9 detik dibanding sekitar 0,6 detik untuk WebP — penalti 7–16x — dan Cloudflare belum meng-cache image optimiser, jadi origin membayar biaya itu berulang. WebP menang sampai edge meng-cache varian teroptimasi.

Bagaimana situs tetap cepat di satu VPS kecil?

Tiap halaman di-prerender statis saat build, Cloudflare menyerap traffic berulang di edge, payload i18n client dipangkas dari 1,6 MB jadi 76 KB, dan footer animasinya sekitar 4 kB WebGL tulis tangan alih-alih library 3D.

Bagaimana situs ini dipantau?

Melapor ke stack Grafana, Prometheus, dan Loki self-hosted bersama server klien di sebelahnya, dengan alert rule yang bereskalasi sampai panggilan telepon. Healthcheck Docker menyondir container tiap 30 detik dan uptime-kuma memeriksa URL publik dari luar.

Kalau situs saya sendiri diperlakukan seperti ini, bayangkan proyek kamu.