Uzun süredir yazdığım notlar dağınık dosyalarda duruyordu. Bu blog, o notları tek yerde toplamak ve düzenli olarak yayımlamak için var.
Kimseyi bir şeye ikna etmek gibi bir amacı yok. Karşılaştığım problemi, denediğim yolları ve sonucu yazıyorum. Aynı problemi altı ay sonra ben yaşarsam buraya bakacağım.
Neden Astro
Blog içeriği statik. Statik içerik için sunucuda çalışan bir uygulamaya ihtiyaç yok. Astro varsayılan olarak sıfır JavaScript üretir, içeriği build sırasında HTML’e çevirir ve sonuç doğrudan bir CDN veya nginx üzerinden servis edilir.
Öne çıkan sebepler:
- Hız: JavaScript bundle’ı olmadan sayfa açılıyor, Core Web Vitals rahat.
- Markdown: Yazı yazarken editör ile uğraşmıyorum, dosya açıp yazıyorum.
- Content collections: Frontmatter şeması tip güvenli, eksik alan build’i kırıyor.
Tema: AstroPaper
Sıfırdan tema yazmak yerine AstroPaper üzerine kurdum. Zaten hazır gelen özellikler:
- Açık/koyu tema
- Pagefind ile statik arama
- Otomatik OG görseli üretimi
- Sitemap ve RSS
- Etiket ve arşiv sayfaları
Üzerine yaptığım tek yapısal değişiklik Türkçe yerelleştirme oldu. Temayı bağımlılık olarak kurmak yerine repoya kopyaladım ve git geçmişini sildim. Karşılığı şu: yukarı akıştan gelen düzeltmeleri elle taşımam gerekiyor. Kazancı da şu: hiçbir dosya bana kapalı değil, tema API’si ile boğuşmuyorum.
Türkçeleştirme
AstroPaper’ın src/i18n/lang/ altında dil dosyaları var. tr.ts ekledim,
astro.config.ts içindeki defaultLocale değerini tr yaptım ve tarih
biçimlendirmesi için dayjs Türkçe locale’ini import ettim.
// astro.config.ts
i18n: {
locales: ["tr"],
defaultLocale: "tr",
routing: { prefixDefaultLocale: false },
}
prefixDefaultLocale: false sayesinde URL’lerde /tr/ öneki yok. Site tek dilli, gereksiz
bir segment taşımasına gerek yok.
Arayüz metinleri src/i18n/lang/tr.ts içinde tek dosyada duruyor ve tipi
src/i18n/types.ts tarafından zorlanıyor. Bileşenin içine string yazmak mümkün ama yanlış;
eksik anahtar astro check aşamasında patlıyor.
Tarih tarafında iki ayrı yol var. Yazı tarihleri dayjs ile Türkçe locale üzerinden
biçimleniyor, arşiv sayfasındaki ay adları ise Intl.DateTimeFormat("tr") ile geliyor.
Deploy: Coolify
Vercel yerine kendi sunucumdaki Coolify üzerinde tutuyorum. Sebep basit: siteyi zaten var olan bir sunucuda barındırmak ek maliyet çıkarmıyor ve build ortamını tamamen kontrol ediyorum.
Akış şöyle:
mainbranch’e push- Coolify webhook’u yakalıyor
- Depodaki
Dockerfileile multi-stage build çalışıyor dist/klasörü nginx imajına kopyalanıyor- Container ayağa kalkıyor, Coolify TLS sertifikasını hallediyor
Sonuç: statik dosyaları servis eden küçük bir nginx container’ı. Çalışan bir Node süreci yok, patlayacak bir uygulama sunucusu yok, yamalanacak bir çalışma zamanı yok.
nginx.conf dosyasını da kendim yazdım. İçerik hash’li dosyalar bir yıllık immutable
cache alıyor, HTML ise her istekte doğrulanıyor. Bu ikisini ters kurmak, deploy ettiğiniz
değişikliğin bir hafta görünmemesi demek.
Bundan sonrası
Buraya çoğunlukla e-ticaret entegrasyonları, Shopify, Laravel ve altyapı tarafında karşılaştığım problemleri yazacağım.
Varsayılan format 500-900 kelimelik teknik not olacak. Tek problem, tek çözüm. Konu gerçekten geniş olduğunda uzun yazacağım, ama kelime hedefi tutturmak için değil.