Oğuzhan KARAGÜZEL

OĞUZHAN KARAGÜZEL

Yazılım geliştirici

Açık kaynak · .NET 9 · MIT lisansı

Elevare

Sürükle-bırak sayfa editörü, onay akışları ve çok dilli içerik desteğiyle .NET 9 üzerinde yazılmış, açık kaynaklı bir içerik yönetim sistemi.

Şu an gezdiğiniz bu site de Elevare ile çalışıyor.

Elevare sayfa editörü: solda bloklar, ortada sayfa, sağda ayarlar

01 · Hikâye

Neden yazdım?

Bu siteyi kurarken içeriğin nasıl hazırlandığını, kimin onayından geçtiğini ve ziyaretçiye nasıl ulaştığını baştan sona kendim tasarlamak istedim. Hazır bir sisteme eklentiler takıp onu ihtiyacıma uydurmaya çalışmak yerine, ihtiyacın kendisinden yola çıkan bir sistem yazmaya karar verdim.

Elevare böyle başladı: önce kendi sitem için yazdığım bir yönetim paneli olarak. Zamanla sayfa editörü, onay akışları, çok dillilik, SEO araçları ve yedekleme eklendi. Sistem olgunlaştığında da herkesin kullanabilmesi, inceleyebilmesi ve geliştirebilmesi için açık kaynak olarak yayınladım.

02 · Mimari

İki uygulama, tek veritabanı

Elevare birbirinden bağımsız çalışan iki uygulamadan oluşur. Aralarında bir API yoktur; ortak bir PostgreSQL veritabanını paylaşırlar ve tek bir kurala uyarlar.

CMSBlazor ServerYönetim paneli: sayfalar, şablonlar, onaylar, ayarlar
yazar→
PostgreSQLElevareDBTabloları CMS oluşturur
okur←
SiteASP.NET Core MVCZiyaretçinin gördüğü yayındaki sayfalar

Tek yönlü veri akışı

Tabloları CMS oluşturur ve içeriği CMS yazar; site yalnızca okur. Sitenin yazdığı tek şey ziyaret istatistikleri, form yanıtları ve hata kayıtlarıdır.

Kopmayan sözleşme

Site, CMS tablolarını kendi salt okunur modelleriyle okur. Sözleşme testleri, CMS'te bir sütunun adı değişirse hatayı canlıda değil derleme sırasında yakalar.

Anında yansıyan değişiklik

Site sayfaları bir saate kadar önbellekte tutar ama CMS her başarılı kayıttan sonra önbelleği temizletir. Yaptığınız değişiklik bir sonraki sayfa açılışında görünür.

03 · Özellikler

Neler yapabiliyor?

Bir içerik ekibinin günlük işinde ihtiyaç duyduğu her şey, tek bir panelde.

01

Görsel sayfa editörü

Sayfaları GrapesJS bloklarını sürükleyip bırakarak hazırlarsınız. Sayfa yayına çıkmadan önce başkalarıyla paylaşabileceğiniz bir önizleme linki alırsınız.

02

Bağlı ve kopya şablonlar

Üst menü gibi her yerde aynı olması gereken parçalar bağlı şablondur; şablonu düzenlediğinizde bütün sayfalar güncellenir. Kopya şablon ise sayfaya kendine ait bir başlangıç verir.

03

Onay akışları

Adımları ve her adımda kimin onay vereceğini siz belirlersiniz. Değişiklik karşılaştırması HTML'e değil, okurun gördüğü metne bakar.

04

Rol tabanlı yetkiler

Yetkiler panelden değiştirilir ve her istekte sunucuda denetlenir. Bir işlemi engelleyen şey hiçbir zaman yalnızca butonun gizlenmesi değildir.

05

Çok dilli içerik

Her dilin kendi adres öneki ve iki ayrı anahtarı vardır: CMS'te yazılabilir mi, sitede yayında mı. Yarım kalmış bir çeviri dışarı sızmaz.

06

SEO araçları

Sayfa bazında meta etiketleri ve yapısal veri, panelden düzenlenen robots.txt ve llms.txt, otomatik site haritası ve editörde anlık SEO puanı.

07

Akıllı yönlendirmeler

Adresi değişen, silinen ya da arşivlenen sayfa için yönlendirme kendiliğinden yazılır. Ekran ölü hedefleri, döngüleri ve zincirleri en başta gösterir.

08

Hafif görseller

Yüklenen her görselin WebP ve küçültülmüş kopyaları üretilir; site doğru boyutu seçer. Tek bir görselden bütün favicon boyutları çıkar.

09

Formlar

Spam koruması, hazır cevap şablonları ve içeriği incelenerek kabul edilen dosya ekleri. Ekleri yalnızca yetkisi olanlar indirebilir.

10

Çöp Kutusu

Silinen her şey geri getirilebilir. Geri gelen bir site kodu ise kapalı gelir; ziyaretçilerin tarayıcısında çalışacak bir kodu yeniden yayına almak ayrı bir karardır.

11

Site kodları

Analiz kodu, çerez onay bandı ya da canlı destek balonu gibi kodlar bütün sayfalara eklenir; istenen sayfada tek tek kapatılabilir.

12

Canlı ayarlar

SMTP, CAPTCHA ve S3 anahtarları şifrelenerek saklanır ve kaydettiğiniz anda geçerli olur. Yerel diskten S3'e geçmek bile yeniden başlatma gerektirmez.

04 · Ekranlar

Panelden birkaç kare

05 · Kaputun altında

Mühendislik notları

Elevare'yi yazarken verdiğim kararların bir kısmı ekranda görünmez ama sistemin güvenilir çalışmasını sağlayan şey tam da bunlardır.

  1. Hatalar exception olarak taşınmaz

    İşleyiciler sonucu Result tipiyle döner. Her hatanın değişmeyen bir kodu vardır ve bu kod aynı zamanda çeviri anahtarıdır. Türkçe karşılığı olmayan bir hata kodu derlemeyi düşürür.

  2. Sırası belli bir istek hattı

    Her istek aynı adımlardan aynı sırayla geçer: eşzamanlılık kilidi, kayıt, yetki denetimi, doğrulama, kayıt işlemi ve önbellek temizliği. Yetki kontrolünü unutmak mümkün değildir.

  3. Önbellek çökerse site çökmez

    Redis'e ulaşılamadığında site hata vermez, önbellek yokmuş gibi çalışmaya devam eder. Önbellek yalnızca hızlandırır; hiçbir zaman tek arıza noktası olmaz.

  4. Sessizce ezilen kayıt yok

    Aynı sayfa iki yerde açıksa editör, sayfanın açıldığı andaki parmak izini kayıtla birlikte gönderir. Sayfa arada değiştiyse kayıt reddedilir ve karar kullanıcıya bırakılır.

  5. Yumuşak silme

    Silinen kayıtlar veritabanından kalkmaz. Kalıcı silme tek bir yerden yapılır ve form yanıtı ya da alt sayfası olan bir sayfayı silmeyi reddeder.

  6. Uyarı da hatadır

    Derleme TreatWarningsAsErrors ile çalışır; Sonar ve .NET analiz kuralları açıktır. Kapatılan her kural, gerekçesini anlatan bir yorumla kapatılır.

06 · Teknolojiler

Neyle yazıldı?

KatmanTeknoloji
Yönetim paneliBlazor Server (.NET 9)
SiteASP.NET Core MVC, output cache, Brotli sıkıştırma
VeritabanıPostgreSQL 15, Entity Framework Core
Sayfa editörüGrapesJS ve Elevare'ye özel bloklar
Uygulama katmanıMediatR (CQRS), FluentValidation
Kimlik ve yetkiASP.NET Core Identity, JWT, rol tabanlı yetkiler
Arka plan görevleriHangfire
ÖnbellekRedis (isteğe bağlı) ya da bellek içi önbellek
LoglamaSerilog, isteğe bağlı Seq
DağıtımDocker Compose, GitHub Actions

07 · Kurulum

Üç komutla ayağa kaldırın

Bilgisayarınızda Docker kuruluysa başka hiçbir şeye ihtiyacınız yok: ne .NET SDK ne de PostgreSQL.

  1. Depoyu indirin

    git clone https://github.com/Oguzhankaraguzel/elevare.git
    cd elevare
  2. Ayar dosyasını oluşturun

    cp .env.example .env

    .env dosyasındaki boş alanları doldurun. Biri bile boşsa sistem başlamaz; hiçbir kurulum varsayılan bir şifreyle çalışmasın diye.

  3. Başlatın

    docker compose up -d --build

    Panel http://localhost:5150, site http://localhost:5160 adresinde açılır.

Kodların hepsi GitHub'da

Projeyi incelemek, bir hata bildirmek ya da katkıda bulunmak için depoya uğrayın. Her geri bildirim Elevare'yi biraz daha ileri taşıyor.