blog.kayafirat.com

Sevgili okuyucu,

Öncelikle buralara kadar gelip dokümanımı okumaya tenezzül ettiğin için teşekkür ediyorum. Bu projeyi geliştirirken öğrendiğim birçok şeyi kullandım. Aynı zamanda öğrendiklerimi doküman haline getirerek, benden sonra gelecek kişiler için daha kolay hale getirmeye çalıştım. Bu giriş konuşmamda, sizlere olayın ilerleyişini, neler kullandığımı, hangi teknolojileri seçtiğimi anlatacağım. Buradaki yazacaklarım bu projeme genel bir bakış olacaktır. Bu kısımları isterseniz atlayabilirsiniz. Hadi başlayalım.

Nedir ?

Bir süredir farklı farklı domainler alıyor, projelendirip bırakıyordum. Fakat uzun vadede hem vaktimi harcıyor, hem de deneyim elde edemediğimi anladım. Ben de kendimi daha iyi geliştirebileceğim, domainlerle uğraşmak istemediğim bir altyapı kurmaya karar verdim. Kısaca tüm yazılım ile ilgili projelerimi tek çatı altında toplayacaktım. Kısaca burası benim oyun alanım. Yakıyor, yıkıyorum. Becerebilirsem tekrar yapıyorum. Kısaca bu bir blog projesidir. Zamanla ihtiyaçlarım artmış, bu ihtiyaçlarından eklenmesiyle genişlemiş basit bir projedir. Diğer projelerimin farklı olarak bu projede birçok detaya girmek, güvenliğinden, kullanılabilirliğine kadar olan tüm süreci ele almaya çalıştığım için benim gözbebeğim diyebilirim. Gönül isterdi ki bir Wordpress kurayım, işlerim hallolsun. Hayır bunu tercih etmedim çünkü yazılımı seviyorum. Bu nedenle kendim üretmek istedim.

Neler kullanıldı ?

Bu kısmı Front-end, Back-end ve Database olarak üç başlığa ayırmak istiyorum. Frontend(arayüz) kısmında HTML,CSS,Bootstrap,TailwindCSS ve Angular tercih ettim. Backend alanında ise gönül taşım olan Java'yı kullandım. Temelde bütün yapım, birden fazla restful servisine dayanıyordu. Bu sayede bir bölümde hata olduğu zaman sadece o tarafa yönelmem işimi kolaylaştırdı. Database olarak, MySQL tercih ettim. Aslında aklımda PostgreSQL kullanmak vardı ama ne yazık ki ortam şartlarından dolayı bunu yapamadım.

Süreç

İlk başlarda sadece basit bir blog kodlayacaktım. Fakat sonra, eğer bir blog kodluyorsam bunun bir yönetim panelinin de olması gerektiğini fark ettim. Yönetim panelini sıfırdan kodlamak yerine açık kaynak kodlu Angular projesini kullanmaya karar verdim. Eğer yolunuz düşerse sizlere şöyle süper bir ngx-admin linki veriyorum. Ngx-admin benim için fazla detaylıydı. Aynı zamanda kullanmayacağım birçok özellik barındırıyordu. İçinden kullanmayacağım yüzlerce özelliği çıkarınca ortaya oldukça basit bir yönetim paneli kaldı. Ufak bir editör, Konular,Yorumlar,Hatalar,Resimler için servislerin ortak buluştuğu bir nokta olarak birleştirdim. Kendime göre kullanışlı bir yapı oluşturdum.

Bir blogda neler olmalı ?

Bu blogda insanların kayıt olmadan yorum yapabilmesini, isterlerse kayıt olarak bir profil oluşturabilmesini ya da sosyal medya hesaplarını kullanarak giriş yapıp yorum yapabilmelerini istedim. Aynı zamanda basit bir rol mekanizması kullanabilmeliydim. İnsanların yazdığım yazılardan haberdar olabilmesi içinde ufak bir yazı bültenim de olmalıydı.

Frontend

Basitlik güzelliktir. Temel bir şekilde Bootstrap(CSS) kütüphanesini kullanarak blog.kayafirat.com'u kodlamaya başladım. Oluşturduğum ihtiyaçlarıma göre 3 parçaya böldüm. Konular, Yorumlar ve Kullanıcılar.

Konular

  1. Her konunun bir kartı bulunmalıydı. Kartlarda başlık, konu etiketi ve tek cümlelik giriş metni bulunmalıydı.
  2. Her konu'da mutlaka bulunması gereken konu'nun kendisi, sosyal medya bağlantı linkleri, kapak resmi, tarih bilgisi ve görüntülenme sayısı olmak zorundaydı.
  3. İçerikler okunurken, kullanıcı bu konuda zorlanmaması gerekliydi. İster karanlık, ister aydınlık temayı kullanabilmeliydi.
  4. Aynı şekilde masaüstü bilgisayarlarda içerik okunurken ekranı 100% bir şekilde kaplanmaması gerekiyordu. Bu bir metni okurken olumsuz bir deneyim yaşatıyor ve göz korkutuyordu.
  5. Her konu isme, etikete, tarihe, içinde geçen yazıya göre aranabilmeliydi.
  6. Her konu yalnızca tek bir etikete sahip olmalıydı.
  7. Kesinlikle karmaşık bir domain yapısı olmaması gerekliydi. Tüm yazılar tek bir yerde, kolay filtrelenebilir bir yapıya sahip olmalıydı.

Yorumlar

  1. İsteyen kayıt olmadan, isteyen direkt kayıt olarak bu yorum yapabilmeliydi.
  2. Kayıtlı kullanıcılar isterlerse kendi yorumlarını güncelleyebilir ya da silebilmeliydiler.
  3. Bir yorum, genel kurallara uymuyorsa kaldırılabilir ya da şikayet edilebilmeliydi.

Kullanıcılar

  1. Bir kullanıcı kayıt olabilmek için sadece 3 temel şeye ihtiyaç duymalıydı. Kullanıcı adı, e-posta adresi ve şifre.
  2. Kullanıcı şifresini unutursa şifre sıfırlayabilmeliydi.
  3. Kullanıcı kişisel bilgilerini, kayıtlı diğer kullanıcılara göstermemeyi tercih edebilmeliydi.
  4. Kullanıcılar gerekirse Github ve Linkedin hesaplarıyla kısa sürede giriş yapabilmeli ya da kayıt olabilmeliydi.
  5. Kullanıcılar konular favoriye ekleyebilmeliydi.
  6. Kullanıcıların kendilerine özgü profil resimleri olabilirdi.

Backend

Bu projede en keyifli vakit geçirdiğim alan diyebilirim. Javayı seven biri olarak, araştırmak, öğrenmek en mutlu olduğum dönemlerdi. Ben Spring framework'ünü kullanmaya tercih ettim. Geniş bir dokümana sahip olması, etkin bir topluluk tarafından kullanıldığını bildiğim içinde sorunla karşılaşırsam eğer problemlerimi hızlıcana çözebileceğimi biliyordum.

Temelde 6 adet servisim vardı. User, Post, Comment, Admin, Image, Download servislerim bulunuyor. Tüm servislere kullanabilmek için belli başlı kurallar bulunmaktadır. Örneğin Image servisi sadece blog.kayafirat.com'un resimlerini barındırmak için oluşturuldu. Download'da aynı şekilde kodların, pdflerin ortak bir yerde konulması için yapıldı.

Spring Frameworkün muazzam kolaylığı sayesinde birçok ayarlamaları kısa sürede yaparak kısa sürede yayınlayabildim. Daha fazla detay için sizleri Javadoc'u okumaya ya da Github üzerinden kodları incelemeye davet ediyorum.

Sunucu Tarafındaki Ayarlamalar

İlk zamanlar herhangi bir konfigürasyon yapmadan ilerleyebileceğimi düşünüyordum. Fakat zamanla bunun aşırı derecede saçma bir düşünce olduğunu gördüm. Doğru konfigürasyonları yapamadığım için yüksek miktar RAM tüketiyor, ara ara çökmeler ile karşı karşıya kalıyordum. Aynı zamanda güvenlik alanında yetersiz ayarlarım yüzünden de tehlikeli saatler geçirdiğimde oldu.

Öncelikle Java projelerimi çalıştırabilmek için bana kesinlikle Apache Tomcat lazımdı. Hosting şirketlerinin Web Hosting paketleri hiçbir şekilde Apache Tomcat'i desteklemiyor. Bunun için VPS-VDS kiralamanız gerekiyor. Eğer öğrenciyseniz, Github Education paketini kullanmanızı tavsiye ederim. Bu sayede AWS, Digital Ocean gibi benzer birçok şirketten 100 dolara kadar kredi alabiliyorsunuz. Kredilerinizi sonuna kadar kullandınız ve azda olsa sunucu ortamına alıştıysanız, o zaman ufak bir sunucu kiralama zamanınız gelmiştir. Contabo'yu araştırmanızı öneririm.

Her neyse, konumuza devam edelim. Hiçbir zaman sunucu tarafında yeterince bilen tarafta olmadım. O yüzden anlatacaklarımda hata olabilir ama ben de işe yaradığını da söylemek istiyorum. Sürekli farklı ip adreslerinden günde 1000'e yakın gereksiz istek alıyorum. Öncelikle bunun için kullanmadığım tüm portları kapattım. Ardından SSH portunu değiştirdim. Son olarak da fail2ban isimli harika bir araç kurdum. Bu bana gelen isteklerin %99'unu azalttı.

Database kısmında özellikle connection pool'da ayarlamaları doğru yapıldığında RAM tüketimim oldukça düştü.

Domain yapısı

Bir adet domain ve altı adet subdomainim bulunuyor.

  1. api.kayafirat.com tüm apilerin kök noktası. domainin yapısı şu şekilde ilerliyor https://api.kayafirat.com/projeADI/VERSİON/...

    Var olan bir projede değişiklik yaptığımda version'u artırıyorum. Böylelikle versionlar arasındaki farklılıkları gözlemlemek benim için daha kolay hale geliyor.

  2. blog.kayafirat.com ise yazılarımın bulunduğu alandır. Burada bir blogda olması gereken her şeyi eklemeye çalıştım.
  3. admin.kayafirat.com ise domain'in farklı etki alanlarını daha rahat yönetebilmek ve blog kısmında yazı girişleri yapabilmek için ele aldığım yerdir.
  4. document.kayafirat.com ise projelerimin dokümanlarının bulunduğu alandır.
  5. test.kayafirat.com ise anlık olarak test etmem gereken ortamlarda yayınladığım projelerdir.
  6. image.kayafirat.com ise tüm resimleri alt kategorilere göre ayrıldığı alandır. Bu domain yapısı sadece api.kayafirat.com'dan gelen isteklere cevap verebilir.
  7. download.kayafirat.com ise genel olarak indirilmesi gereken doküman, makale, kod, eklentilerin bulunduğu yerdir. Bu alanda bazı dosyalar şifreli bazıları ise publicdir.

Kapanış

Anlatacaklarımı bitirdiğimi düşünüyorum. Kısaca nasıl bir yapı kullandığımı, neler yaptığımı ve kullandığım teknolojileri anlattım. Aşağıya sizler için yararlı linkler bırakacağım. Zamanınız olduğunda inceleyebilirsiniz. Eğer aklınızda bir soru işareti varsa bana firat.kaya@mail.com ya da firat@kayafirat.com'dan yazabilirsiniz. Hoşca kalın.

Fırat Kaya

Yararlı Linkler


Github adresim.
Blog projesinin kaynak kodlarını görebilmek için tıklayınız.
Download servisinin kaynak kodlarını görebilmek için tıklayınız.
Admin panelini görebilmek için tıklayınız.
Github öğrenci paketini kullanmak için tıklayınız.
Contabo paketlerini incelemek isterseniz tıklayınız.