NgodingSantai dimulai sebagai kumpulan halaman statis dan berkembang menjadi dua puluh artikel, data pencarian, visual studi kasus, script audit browser, serta konfigurasi Ubuntu/Nginx. Struktur foldernya tidak diubah menjadi framework hanya karena jumlah halaman bertambah. Yang diubah adalah batas tanggung jawab dan proses sinkronisasi data yang mulai berulang.

Diagram struktur repository NgodingSantai dengan artikel, aset, deploy dan scripts
Struktur aktual setelah penambahan artikel. Folder deploy dan scripts ikut repository agar terlacak, tetapi tidak disajikan ke publik oleh Nginx.

Halaman root untuk tujuan tingkat situs

index.html, blog.html, Tentang, Profil Redaksi, Kontak, dan kebijakan berada di root karena URL publiknya memang tingkat situs. robots.txt, sitemap.xml, ads.txt, manifest, dan 404 juga berada di lokasi yang diharapkan layanan atau server.

/
├─ index.html
├─ blog.html
├─ about.html
├─ redaksi.html
├─ contact.html
├─ editorial-policy.html
├─ privacy-policy.html
├─ robots.txt
├─ sitemap.xml
└─ ads.txt

Artikel mempunyai URL dan HTML sendiri

Folder articles/ memuat satu file untuk satu canonical. Konten utama tersedia tanpa JavaScript dan crawler dapat mengambil judul, paragraf, link, serta structured data langsung. Halaman tidak dibangun sebagai satu template client-side yang menunggu query parameter.

Aset dikelompokkan menurut cara dipakai

assets/css memuat style bersama, assets/js memuat theme, navigasi, data artikel, search, serta enhancement, dan assets/images memuat logo serta diagram editorial. Relative path dari artikel memakai ../assets/; halaman root memakai assets/.

data-root menjembatani kedalaman URL

Body artikel mempunyai data-root="../". JavaScript menggunakan prefix itu ketika membuat navigasi dan URL kartu terkait. Ini menghindari dua salinan logic untuk root dan subfolder, tetapi tetap perlu diuji karena relative URL pada file:// dan HTTP dapat berperilaku berbeda.

Pisahkan operasi dari konten publik

Folder deploy/ berisi konfigurasi Nginx dan panduan Ubuntu. Folder scripts/ berisi audit serta sinkronisasi editorial. Keduanya perlu version control, tetapi bukan halaman untuk pembaca. Nginx mengembalikan 404 untuk path tersebut dan dotfile.

location ^~ /deploy/ { return 404; }
location ^~ /scripts/ { return 404; }
location = /README.md { return 404; }
location ~ /.(?!well-known).* { deny all; }

Tambahkan generator hanya pada bagian berulang

Setelah dua puluh artikel, metadata yang sama muncul pada articles.js, kartu blog, JSON-LD blog, homepage, dan sitemap. Mengedit lima tempat secara manual mudah tidak sinkron. refresh-editorial-content.mjs menjadi sumber daftar artikel dan menghasilkan bagian berulang. Artikel yang ditulis ulang tetap berakhir sebagai HTML statis.

Generator tidak menyembunyikan isi dalam database atau API. Hasilnya dicommit sehingga diff dapat direview dan situs tidak membutuhkan Node pada server untuk melayani halaman.

Jangan membuat abstraction untuk satu penggunaan

Komponen visual seperti evidence grid dan figure cukup berupa kelas CSS karena digunakan lintas artikel. Kebijakan legal tetap ditulis langsung sebagai halaman. Tujuannya bukan membuat semua hal generik, melainkan mengurangi inkonsistensi yang sudah terbukti terjadi.

Naming mengikuti URL yang stabil

Slug memakai huruf kecil dan tanda hubung. Perubahan judul tidak otomatis mengganti slug lama karena URL yang sudah dibagikan sebaiknya stabil. Jika slug memang harus berubah, redirect per-path dan sitemap diperbarui bersama.

README menjadi peta, bukan sumber rahasia

README menjelaskan cara menjalankan, struktur, editorial, AdSense, SEO, pengujian, dan deployment. Ia menyebut publisher ID yang memang publik melalui ads.txt, tetapi tidak menyimpan private key, token, atau password. Nginx tetap menolak README dari web publik agar dokumentasi operasi tidak menjadi permukaan situs.

Tanda struktur perlu naik kelas

  • Perubahan layout harus disalin ke puluhan file secara manual.
  • Generator satu file menjadi terlalu besar untuk direview.
  • Konten membutuhkan preview, workflow banyak editor, atau scheduling.
  • Asset hashing serta bundling menjadi kebutuhan performa yang terukur.
  • Data yang sama terus disalin meskipun sudah ada script sinkronisasi.

Jika tanda tersebut muncul, static site generator atau CMS dapat dipertimbangkan. Migrasi alat harus menyelesaikan masalah nyata dan menjaga URL, bukan hanya mengganti teknologi.

Referensi primer

Jaga generator dapat dijalankan ulang

Script sinkronisasi harus idempotent: menjalankannya dua kali tanpa perubahan sumber tidak menghasilkan diff baru. Setelah generator dijalankan, git diff digunakan untuk memastikan hanya target yang diharapkan berubah. Jika script menulis tanggal sekarang setiap kali, sifat ini akan rusak; karena itu tanggal pembaruan ditetapkan saat perubahan editorial nyata.

Hindari dua sumber kebenaran

Metadata dua puluh artikel berada dalam daftar generator yang kemudian mengisi articles.js. Empat artikel lama tetap ditulis langsung, sedangkan enam belas studi kasus mempunyai body dalam sumber refresh. Batas ini didokumentasikan agar editor tahu file mana yang akan ditimpa ketika script dijalankan.

Path produksi ikut diuji

Struktur folder lokal tidak cukup; Nginx root harus menunjuk direktori yang sama, permission harus memungkinkan pembacaan, dan protected path harus ditolak. Deployment docs memakai /var/www/ozancicak.biz.id secara konsisten sehingga salah ketik direktori tidak menyajikan versi lama.

Artikel terkait