İçeriğe Atla
Mustafa Erbay
Teknoloji · 12 dk okuma · görüntülenme Read in English

Self-Hosted Uygulama Güncellemeleri: Otomasyon ve İstikrar Dengesi

Self-hosted uygulamalarda güncelleme süreçlerini otomatize etmenin ve operasyonel istikrarı korumanın zorluklarını, trade-off'larını ve pratik stratejilerini…

100%

Bir yan ürünümün back-end sunucusunda, gece yarısı planlanmış bir güncelleme sonrası API’lar yanıt vermemeye başladı; sebebi basit bir bağımlılık çakışmasıydı ama otomasyonun kör noktalarını bir kez daha bana hatırlattı. Self-hosted uygulamaların güncellenmesi, özellikle operasyonel istikrarı sağlamaya çalışırken, otomasyonun getirdiği kolaylıklar ve potansiyel riskler arasında hassas bir denge gerektiriyor. Bu yazıda, self-hosted uygulamalar için güncelleme süreçlerini otomatize etmenin karmaşıklığını, karşılaştığımız trade-off’ları ve edindiğim pratik dersleri ele alacağım.

Self-hosted ortamlar, bulut servislerinin sunduğu “managed updates” lüksünden mahrum olduğumuz için, güncelleme döngüsünü tamamen kendi kontrolümüz altında yönetmemizi gerektirir. Bu durum, hem daha fazla esneklik sunar hem de potansiyel sorunlara karşı bizi daha savunmasız bırakır. Benim deneyimimde, başarılı bir güncelleme stratejisi kurmak, sadece teknik bilgi değil, aynı zamanda risk yönetimi ve esnek bir problem çözme yaklaşımı da istiyor.

Self-Hosted Uygulama Güncellemeleri Neden Karmaşık?

Self-hosted uygulamaların güncellemeleri, genellikle birden fazla katmanı, bağımlılığı ve altyapı bileşenini içerdiği için doğası gereği karmaşıktır. Bir monolith ERP sisteminin çekirdek modüllerini güncellerken, sadece uygulamanın kendi kod tabanını değil, aynı zamanda veritabanı şemalarını, sistem bağımlılıklarını (örneğin, Python versiyonu veya belirli bir C kütüphanesi) ve hatta işletim sistemi yamalarını da dikkate almamız gerekir. Bu katmanlar arasındaki potansiyel etkileşimler, beklenmedik hatalara zemin hazırlayabilir.

Karmaşıklığın bir diğer nedeni de genellikle sınırlı kaynaklarla çalışıyor olmamızdır. Büyük kurumsal yapılarda dedicated DevOps ekipleri ve test ortamları bulunurken, kendi sunucularında uygulama çalıştıran bir geliştirici olarak bu lükse sahip olmayabiliriz. Bu durum, her güncelleme adımının daha dikkatli planlanmasını ve potansiyel etkilerinin manuel olarak analiz edilmesini zorunlu kılar. Basit bir işletim sistemi paketi güncellemesi bile, uygulamanın kullandığı bir kütüphanenin eski versiyonunu kırabilir ve sistemi çökertebilir.

Ayrıca, güncelleme süreçlerinde genellikle “downtime” (kesinti) riskini minimize etme baskısı vardır. Özellikle canlı bir üretim ortamında, her saniyenin maliyeti olabilir. Bu, güncelleme stratejilerini seçerken mavi/yeşil deployment gibi daha sofistike yöntemleri düşünmemizi gerektirir, ancak bu yöntemler de kendi karmaşıklıklarını beraberinde getirir. Örneğin, bir üretim ERP’sinde gece sevkiyat raporlama modülünü güncellerken, yanlış bir sürümün devreye alınması tüm lojistik akışını aksatabilir ve bu tür durumlar, kapsamlı bir test ve geri dönüş planı olmadan büyük risk taşır.

Tam Otomasyon Mu, Yarı Otomasyon Mu?

Self-hosted uygulama güncellemelerinde tam otomasyon cazip görünse de, benim deneyimimde genellikle yarı otomasyonun daha dengeli bir yaklaşım olduğunu gördüm. Tam otomasyon, tüm güncelleme adımlarının, testlerin ve dağıtımın insan müdahalesi olmadan otomatik olarak gerçekleştiği bir senaryodur. Bu, özellikle CI/CD pipeline’ları güçlü olan, kapsamlı entegrasyon ve birim testleri bulunan ve geri dönüş mekanizmaları iyi tanımlanmış büyük ölçekli sistemler için idealdir. Ancak küçük veya orta ölçekli self-hosted projelerde, tam otomasyonun kurulum ve bakım maliyeti, getirdiği faydaların önüne geçebilir.

Yarı otomasyon ise, kritik adımların otomatikleştirildiği ancak belirli kontrol noktalarında insan onayı veya manuel doğrulama gerektiren bir yaklaşımdır. Örneğin, bir uygulamanın yeni bir sürümü otomatik olarak build edilebilir ve test ortamına deploy edilebilir, ancak üretim ortamına geçiş için bir operatörün onayı beklenebilir. Bu yaklaşım, otomasyonun hız ve tekrarlanabilirlik avantajlarından faydalanırken, insan gözünün kritik hataları yakalama yeteneğini de korur. Benim kendi sitelerime yaptığım güncellemelerde genellikle bu yarı otomasyon modelini tercih ediyorum; build ve temel testler otomatik, ancak canlıya çıkış ve smoke testler manuel kontrolümde oluyor.

Bir üretim ERP’sinde, yeni bir faturalama modülü güncellemesini ele alalım. Otomatik testler, temel işlevselliği doğrulayabilir. Ancak, farklı ödeme yöntemleri veya özel vergi kuralları gibi edge case’ler, manuel onaydan sonra canlı verilerle yapılan ek testlerle güvence altına alınabilir. Bu, olası bir hatanın finansal süreçleri etkilemesini önlemek için kritik bir adımdır. Otomasyon, rutin ve tekrarlayan görevler için harikadır, ancak benzersiz veya yüksek riskli durumlar için insan sezgisi ve deneyimi hala vazgeçilmezdir.

Güncelleme Stratejileri ve Seçimleri Nelerdir?

Self-hosted uygulamalar için birden fazla güncelleme stratejisi mevcuttur ve her birinin kendine özgü avantajları ve dezavantajları bulunur. Doğru stratejiyi seçmek, uygulamanın kritiklik derecesine, mevcut altyapıya ve kabul edilebilir kesinti süresine bağlıdır. Yaptığım projelerde sıkça kullandığım ve karşılaştığım başlıca stratejiler şunlardır:

  1. In-Place Upgrade (Yerinde Güncelleme): Mevcut uygulama sunucusu üzerinde eski sürüm durdurulur, yeni sürüm yüklenir ve uygulama yeniden başlatılır. Bu en basit yöntemdir ve genellikle tek bir sunucuda çalışan küçük uygulamalar veya geliştirme ortamları için uygundur. En büyük dezavantajı, güncelleme süresince uygulamanın kullanılamamasıdır (downtime) ve geri dönüş (rollback) süreci genellikle manuel ve hataya açık olabilir.

    # Örnek in-place upgrade adımları (genel bir senaryo)
    sudo systemctl stop myapp.service
    cd /opt/myapp/
    git pull origin main # veya yeni paketi indir
    ./install.sh         # bağımlılıkları yükle, migrate et
    sudo systemctl start myapp.service
  2. Rolling Updates (Kademeli Güncelleme): Birden fazla sunucudan oluşan kümelerde kullanılır. Uygulamanın bir veya daha fazla örneği aynı anda güncellenir, diğerleri çalışmaya devam eder. Güncelleme başarılı olursa, bir sonraki grup güncellenir. Bu, kesinti süresini minimize eder ancak güncellemeler sırasında hem eski hem de yeni sürümlerin aynı anda çalışmasını gerektirdiğinden geriye dönük uyumluluk (backward compatibility) sağlamak önemlidir.

  3. Blue/Green Deployment: İki tamamen ayrı (ancak işlevsel olarak aynı) üretim ortamı tutulur: “mavi” (canlı) ve “yeşil” (beklemede). Yeni sürüm yeşil ortama deploy edilir, testler yapılır ve her şey yolundaysa trafik yeşil ortama yönlendirilir. Mavi ortam yedek olarak tutulur veya kapatılır. Bu yöntem, kesinti süresini neredeyse sıfıra indirir ve geri dönüşler çok hızlıdır (sadece trafiği maviye geri çevirmek). Ancak, iki katı altyapı maliyeti gerektirir ve veritabanı şema değişiklikleri gibi durumlar için özel planlama ister.

      graph TD;
          A["Kullanıcı Trafiği"] --> B["Load Balancer"];
          B --> C["Mavi Ortam (Eski Sürüm)"];
          B --> D["Yeşil Ortam (Yeni Sürüm)"];
          subgraph Güncelleme Süreci
              C -- "Trafik Aktif" --> B;
              D -- "Yeni Sürüm Deploy & Test" --> D;
              click B "Traffic Switch"
              B -- "Trafik Aktif" --> D;
              C -- "Beklemede/Kapatıldı" --> X["Eski Ortam"];
          end
    
  4. Canary Deployment: Rolling updates’a benzer ancak yeni sürüm yalnızca çok küçük bir kullanıcı yüzdesine (örneğin %1-5) sunulur. Bu “kanarya” grubu üzerinde performans ve hata metrikleri yakından izlenir. Eğer bir sorun tespit edilmezse, yavaş yavaş daha fazla kullanıcıya açılır. Bu, riski en aza indiren bir yaklaşımdır ancak daha sofistike izleme ve trafik yönlendirme mekanizmaları gerektirir.

Bir üretim ERP’sinde kritik bir modülü güncellerken, ben genellikle Blue/Green yaklaşımını tercih ettim. Özellikle finansal işlemleri etkileyen bir değişiklikte, eski sürümün hızla geri yüklenebilmesi, olası bir felaketi önlemede altın değerindedir. Ancak, bu yaklaşım maliyetli olduğu için, daha az kritik yan ürünlerim için in-place veya basit rolling update’ler kullanıyorum.

Bağımlılık Yönetimi ve Geri Dönüş Mekanizmaları

Güncelleme süreçlerinin en kritik ama çoğu zaman göz ardı edilen yönlerinden biri bağımlılık yönetimi ve sağlam geri dönüş (rollback) mekanizmalarıdır. Bir uygulamanın birden fazla kütüphaneye, servise veya işletim sistemi paketine bağımlılığı vardır. Bu bağımlılıkların doğru versiyonlarda ve uyumlu bir şekilde bir arada bulunması, stabil bir güncellemenin temelini oluşturur. Örneğin, Python tabanlı bir FastAPI uygulamasında, requirements.txt dosyasını pip freeze > requirements.txt ile tam olarak kilitlemek, geliştirme ortamındaki bağımlılıkların üretimde de aynı kalmasını sağlar. Ancak, işletim sistemi seviyesindeki bağımlılıklar (örneğin, libpq-dev paketi) genellikle manuel dikkat gerektirir.

Yanlış bağımlılıklar veya uyumsuz versiyonlar, uygulamanın hiç başlamamasına veya beklenmedik hatalar vermesine neden olabilir. Geçen ay kendi Android spam uygulamamın backend’ini güncellerken, yeni bir kütüphane eklemiştim. Geliştirme ortamında her şey yolundaydı, ancak üretim sunucusunda ldd çıktısında eksik bir paylaşımlı kütüphane hatası aldım. Sebebi, yeni kütüphanenin sistemde olmayan bir C kütüphanesine ihtiyaç duymasıydı. Bu tür durumlar, kapsamlı bir test ortamının ve hatta containerization (Docker gibi) kullanımının önemini bir kez daha ortaya koyuyor. Container’lar, bağımlılıkları uygulama ile birlikte paketleyerek bu tür sorunları büyük ölçüde azaltır.

Geri dönüş mekanizmaları ise, bir güncellemenin başarısız olması durumunda sistemin hızla önceki stabil duruma döndürülmesini sağlar. En basit haliyle, bu, uygulamanın önceki sürümünü yeniden deploy etmek olabilir. Ancak veritabanı şeması değişiklikleri işin içine girdiğinde durum karmaşıklaşır. Eğer yeni sürüm bir veritabanı migration’ı çalıştırdıysa ve bu migration geriye dönük uyumlu değilse, eski sürüme geri dönmek daha zor olacaktır. Benim tavsiyem, her zaman migration’ları “geriye dönük uyumlu” olacak şekilde tasarlamak ve kritik veritabanı değişikliklerinden önce mutlaka yedek almak. Örneğin, bir üretim ERP’sinde, büyük bir veritabanı migration’ından önce her zaman fiziksel bir pg_basebackup almayı alışkanlık edindim. Bu, felaket senaryosunda kurtarma şansımı artırıyor.

İzleme ve Alarm Mekanizmaları Neden Kritik?

Self-hosted uygulama güncellemelerinde otomasyon ve istikrar dengesini kurarken, izleme (monitoring) ve alarm (alerting) mekanizmaları vazgeçilmez bir rol oynar. Bir güncelleme sonrası sistemin beklenen şekilde çalışıp çalışmadığını anlamak, sadece uygulamanın başlatılmasını kontrol etmekle bitmez. Gerçek kullanıcı trafiği altında performansın nasıl etkilendiğini, hata oranlarının artıp artmadığını ve sistem kaynaklarının (CPU, bellek, disk I/O) anormal davranışlar sergileyip sergilemediğini sürekli olarak izlemek gerekir. Bu, bir güncellemenin başarılı olup olmadığını kesin olarak anlamamızı sağlar.

Ben, kendi sunucularımda genellikle Prometheus ve Grafana kombinasyonunu kullanıyorum. Uygulamamın API latency değerlerini, HTTP hata kodlarını (4xx, 5xx), veritabanı bağlantı sayılarını ve sorgu sürelerini izliyorum. Bir güncelleme sonrası bu metriklerde anormal bir yükseliş veya düşüş gördüğümde, bu hemen bir sorunun işareti olur. Örneğin, bir üretim ERP’sinde, yeni bir raporlama modülü deploy ettikten sonra aniden PostgreSQL connection pool’da WaitCount metriklerinin fırladığını görmüştüm. Bu, yeni modülün veritabanı bağlantılarını yanlış yönettiğini gösteriyordu ve hızlıca geri dönüş yapmamı sağladı.

Alarm mekanizmaları ise, izlenen metrikler belirli bir eşiği aştığında veya beklenmedik bir durum oluştuğunda bizi otomatik olarak bilgilendirir. Bu, sorunlara anında müdahale etmemizi sağlar ve potansiyel kesinti süresini önemli ölçüde azaltır. fail2ban gibi araçlarla SSH brute-force denemelerini otomatik olarak engellediğim gibi, Nginx’in 5xx hata oranının belirli bir yüzdenin üzerine çıkması durumunda bana email veya Telegram üzerinden bildirim göndermesini sağlıyorum. Bu, “uygulama ayakta ama kullanıcılar hata alıyor” senaryolarını yakalamak için hayati öneme sahiptir. İzleme ve alarmlar olmadan, güncelleme sonrası bir sorunun farkına varmamız çok daha uzun sürebilir ve bu da iş sürekliliği açısından ciddi riskler oluşturur.

Güvenlik Güncellemeleri ve Önemi

Self-hosted uygulamalar için güvenlik güncellemeleri, sadece uygulamanın kendi kod tabanıyla sınırlı değildir; aynı zamanda kullanılan tüm altyapı bileşenlerini, işletim sistemini ve bağımlılıkları kapsar. Siber tehditlerin sürekli evrildiği bir dünyada, güvenlik açıklarını (CVE’ler) düzenli olarak yamamak, sistemlerimizin bütünlüğünü ve kullanıcı verilerinin gizliliğini korumak için hayati önem taşır. Ben, Linux sunucularımı yönetirken bu konuya özel bir hassasiyet gösteririm.

Bir işletim sistemi çekirdek (kernel) açığı, tüm sunucuyu tehlikeye atabilirken, bir kütüphane açığı (örneğin, log4j gibi popüler bir kütüphanede çıkan bir CVE) uygulamayı doğrudan hedef alabilir. Bu tür güvenlik açıklarının takibi ve hızlı bir şekilde yamanması, saldırı yüzeyimizi küçültmenin en etkili yollarından biridir. Örneğin, kernel modüllerini blacklist’e alarak gereksiz veya riskli modüllerin yüklenmesini engellediğimi biliyorum. Ayrıca, auditd gibi sistem denetim araçlarını kullanarak önemli dosya değişikliklerini veya şüpheli aktiviteyi izlerim.

# Örnek kernel modülünü blacklist'e alma (örnek CVE-2026-31431'den bağımsızdır)
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif_aead.conf
sudo update-initramfs -u

Güvenlik güncellemelerinin zorluğu, genellikle aciliyet ile potansiyel yan etkiler arasındaki dengede yatar. Kritik bir güvenlik açığı tespit edildiğinde, mümkün olan en kısa sürede yamayı uygulamak istenir. Ancak bu yama, uygulamanın çalışmasını bozabilir veya beklenmedik bir uyumsuzluğa neden olabilir. Bu yüzden, güvenlik güncellemelerini de diğer güncellemeler gibi dikkatli bir şekilde test etmek ve bir geri dönüş planına sahip olmak önemlidir. Örneğin, büyük bir bağımlılık güncellemesi gerektiren bir güvenlik yaması geldiğinde, önce bir staging ortamında test etmeyi, ardından canlıya geçiş yapmayı tercih ediyorum.

Ayrıca, fail2ban gibi araçlarla kötü niyetli denemeleri aktif olarak engelliyor olsam da, bu sadece bir savunma katmanıdır. Temel güvenlik, yazılımın kendisinin güncel tutulmasından geçer. Kendi siteme yaptığım AI entegrasyonlarında, kullandığım tüm kütüphanelerin ve AI model API’lerinin güncel olduğundan emin olurum. Bir CVE’yi takip etmek, bazen saatler süren araştırmalar ve testler gerektirebilir, ancak bu, sistemin genel güvenliği için vazgeçilmez bir yatırımdır.

Kendi Deneyimimden Dersler: Yan Ürünümdeki Güncelleme Süreci

Yirmi yıla yaklaşan tecrübemde, self-hosted uygulama güncellemelerinde sayısız senaryo ile karşılaştım; bazıları sancılı, bazıları pürüzsüzdü. Kendi yan ürünüm için geliştirdiğim finansal hesaplayıcıların backend’inde, sürekli olarak küçük ve orta ölçekli güncellemeler yapıyorum. Bu süreçte edindiğim en önemli derslerden biri, “test et, test et, bir daha test et” kuralının altını çizmektir. Bir keresinde, bir bağımlılığı güncelledikten sonra, test ortamında her şey yolundayken, canlıya çıkışta belirli bir raporlama fonksiyonunun TypeError vermeye başladığını gördüm. Sebep, yeni bağımlılığın eski bir API çağrısını desteklememesiydi ve bu hata sadece belirli bir veri setiyle ortaya çıkıyordu. Bu durum, test senaryolarımızın ne kadar kapsamlı olması gerektiğini bana bir kez daha gösterdi.

Bir diğer önemli ders, geri dönüş (rollback) mekanizmalarının sadece teoride değil, pratikte de çalışır durumda olmasıdır. Bir keresinde, bir veritabanı şeması değişikliği içeren bir güncelleme sonrası, uygulamanın yeni versiyonu kritik bir bug içeriyordu. Hızlıca eski versiyona geri dönmek istedim ancak veritabanı şemasını geri alamadım çünkü yaptığım değişiklik geriye dönük uyumlu değildi. O gün anladım ki, bir güncelleme için deploy komutu ne kadar önemliyse, rollback komutu da o kadar önemlidir ve düzenli olarak test edilmelidir. O zamandan beri, kritik veritabanı değişikliklerinden önce her zaman mantıksal bir yedek alır ve geri dönüş senaryosunu zihnimde canlandırırım.

Son olarak, güncelleme süreçlerinde şeffaflık ve iletişim kritik. Büyük bir üretim firmasının ERP’sini geliştirirken, bir modül güncellemesi öncesinde ilgili tüm paydaşları (operatörler, finans departmanı, lojistik) bilgilendirmeyi alışkanlık edindim. Bu, olası bir kesinti durumunda panik yaşanmasını engeller ve sorunlara daha sakin bir yaklaşımla müdahale edilmesini sağlar. Kendi yan ürünlerimde bile, bir güncellemeyi yapmadan önce, kendime “Bu güncelleme neyi etkileyebilir? Hangi senaryolarda sorun çıkabilir? Nasıl geri dönerim?” sorularını sorarım. Bu basit kontrol listesi, birçok potansiyel baş ağrısından beni kurtardı.

Sonuç

Self-hosted uygulama güncellemelerinde otomasyon ve istikrar arasında doğru dengeyi bulmak, sürekli bir öğrenme ve adaptasyon sürecidir. Tam otomasyonun getirdiği hız ve tekrarlanabilirlik avantajları yadsınamazken, insan müdahalesinin ve dikkatli planlamanın önemi de hafife alınmamalıdır. Karmaşık bağımlılıklar, veritabanı şeması değişiklikleri ve güvenlik açıkları gibi zorluklar, her güncelleme sürecini benzersiz bir mücadele haline getirir.

Benim için kilit nokta, otomasyonu rutin ve tekrarlayan görevler için kullanmak, ancak kritik adımlarda insan gözünün ve deneyiminin devreye girmesine izin vermektir. Sağlam izleme ve alarm mekanizmalarıyla desteklenen, kapsamlı test edilmiş ve geri dönüşü garanti altına alınmış bir güncelleme stratejisi, operasyonel istikrarı korurken aynı zamanda sistemlerimizin güncel ve güvenli kalmasını sağlar. Unutmayın, en iyi güncelleme, sorunsuz bir şekilde tamamlanan ve ardından rahat bir uyku çekmenizi sağlayan güncellemedir.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

Self-hosted uygulamalarda güncelleme süreçlerini otomatize etmek için hangi araçları kullanmalıyım?
Ben genellikle güncelleme süreçlerini otomatize etmek için Ansible, Docker ve Kubernetes gibi araçları kullanıyorum. Bu araçlar, güncellemelerin düzenli ve tutarlı bir şekilde uygulanmasını sağlar ve hataların oluşma olasılığını azaltır. Ayrıca, bu araçları kullanarak güncelleme süreçlerini izlemek ve sorunları nhanh bir şekilde tespit etmek de mümkündür.
Self-hosted uygulamalarda güncelleme yapılırken operasyonel istikrarı nasıl sağlayabilirim?
Ben güncelleme yapılırken operasyonel istikrarı sağlamak için öncelikle bir yedekleme planı oluştururum. Bu, güncelleme sırasında oluşabilecek sorunları nhanh bir şekilde geri alınmasını sağlar. Ayrıca, güncelleme öncesi ve sonrası sistemlerin performansını izler ve gerektiğinde müdahale ederim. Bu sayede, güncelleme过程i sırasında oluşabilecek sorunları minimize edebilirim.
Güncelleme sırasında oluşabilecek hatalara karşı nasıl önlem alabilirim?
Ben güncelleme sırasında oluşabilecek hatalara karşı önlem almak için bir test ortamı oluştururum. Bu ortamda, güncellemeleri uygulayarak olası hataları tespit eder ve gerektiğinde düzeltmeler yaparım. Ayrıca, güncelleme processi sırasında oluşabilecek sorunları hızlı bir şekilde tespit etmek için izleme araçları kullanırım. Bu sayede, güncelleme sırasında oluşabilecek hataları minimize edebilirim ve sistemlerin ổn bir şekilde çalışmasını sağlayabilirim.
Self-hosted uygulamalarda güncelleme stratejisinin başarısını nasıl ölçebilirsiniz?
Ben self-hosted uygulamalarda güncelleme stratejisinin başarısını ölçmek için sistemlerin performansını ve güncelleme processinin verimliliğini izlerim. Ayrıca, kullanıcıların geri bildirimlerini toplar ve güncelleme processini sürekli olarak iyileştiririm. Bu sayede, güncelleme stratejisinin başarısını ölçebilir ve gerekli olan değişiklikleri yaparak sistemlerin稳 bir şekilde çalışmasını sağlayabilirim.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar