<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-08T12:05:41+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Algoritma Yarışmalarının Perde Arkası: DOMjudge, DMOJ ve CMS</title><link href="https://program.sonsuz.us/posts/algoritma-yarismalarinin-perde-arkasi-domjudge-dmoj-ve-cms/" rel="alternate" type="text/html" title="Algoritma Yarışmalarının Perde Arkası: DOMjudge, DMOJ ve CMS" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/algoritma-yarismalarinin-perde-arkasi-domjudge-dmoj-ve-cms</id><content type="html" xml:base="https://program.sonsuz.us/posts/algoritma-yarismalarinin-perde-arkasi-domjudge-dmoj-ve-cms/"><![CDATA[<p>Bir algoritma yarışmasında çözümünüzü gönderip birkaç saniye sonra “Accepted” sonucunu gördüğünüzde arka planda küçük bir yazılım orkestrası çalışır. Kaynak kod derlenir, izole bir ortamda test edilir, süre ve bellek tüketimi ölçülür, çıktı karşılaştırılır ve puan hesaplanır. DOMjudge, DMOJ ve CMS, bu orkestrayı yöneten en popüler açık kaynak yarışma sistemleri arasındadır.
``</p>

<h2 id="online-judge-nasıl-çalışır">Online judge nasıl çalışır?</h2>

<p>Bir değerlendirme sisteminin temel girdileri kaynak kod, programlama dili ve problem kimliğidir. Sistem önce kodu derler, ardından her test için programı çalıştırır. En basit toplam değerlendirme süresi şöyle düşünülebilir:</p>

\[T_{toplam} = T_{derleme} + \sum_{i=1}^{n} T_{test_i}\]

<p>Programın herhangi bir testte süre sınırını aşması <strong>TLE</strong>, fazla bellek kullanması <strong>MLE</strong>, hatalı çıktı üretmesi ise <strong>WA</strong> sonucuna yol açar. Doğru sonuç yalnızca çıktının doğru olması değildir; programın belirlenen kaynak sınırları içinde çalışması da gerekir.</p>

<p>Gönderilen kod güvenilir kabul edilmez. Sonsuz döngüye girebilir, süreç oluşturmaya çalışabilir veya dosya sistemine erişmek isteyebilir. Bu nedenle judge sunucuları Linux kullanıcıları, cgroups, chroot, container veya benzeri izolasyon mekanizmalarından yararlanır. Kısacası değerlendirme sunucusu, yarışmacının koduna “Seni çalıştırırım ama evin anahtarını vermem” der.</p>

<h2 id="üç-platformun-karşılaştırması">Üç platformun karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>DOMjudge</th>
      <th>DMOJ</th>
      <th>CMS</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana kullanım</td>
      <td>ICPC tarzı yarışmalar</td>
      <td>Eğitim ve çevrim içi arşiv</td>
      <td>IOI tarzı olimpiyatlar</td>
    </tr>
    <tr>
      <td>Puanlama</td>
      <td>Genellikle problem bazlı</td>
      <td>Esnek, kısmi puan destekli</td>
      <td>Alt görev odaklı</td>
    </tr>
    <tr>
      <td>Teknoloji</td>
      <td>PHP, Symfony, MariaDB</td>
      <td>Python, Django, C++ judge</td>
      <td>Python tabanlı servisler</td>
    </tr>
    <tr>
      <td>Kurulum</td>
      <td>Orta</td>
      <td>Orta-zor</td>
      <td>Zor</td>
    </tr>
    <tr>
      <td>Kullanıcı arayüzü</td>
      <td>Yarışma odaklı</td>
      <td>Topluluk ve arşiv odaklı</td>
      <td>Yönetim odaklı</td>
    </tr>
    <tr>
      <td>Güçlü yanı</td>
      <td>Kararlı takım yarışmaları</td>
      <td>Dil ve problem çeşitliliği</td>
      <td>Gelişmiş olimpiyat değerlendirmesi</td>
    </tr>
  </tbody>
</table>

<h2 id="domjudge-icpc-ruhunun-temsilcisi">DOMjudge: ICPC ruhunun temsilcisi</h2>

<p>DOMjudge, takım yarışmaları ve klasik ICPC kuralları için oldukça uygundur. Yanlış gönderimler ceza süresine eklenir; problem çözüldüğünde süre hesabı kesinleşir. Basitleştirilmiş ceza modeli şöyledir:</p>

\[P = T_{kabul} + 20 \times W\]

<p>Burada $T_{kabul}$ kabul dakikası, $W$ ise kabulden önceki yanlış gönderim sayısıdır. DOMjudge; yarışma yönetimi, canlı sıralama, hakem işlemleri ve ayrı judgehost makineleriyle ölçeklendirme konusunda güçlüdür. Üniversite kulübünde gerçekçi bir ICPC provası düzenlemek istiyorsanız genellikle ilk adaydır.</p>

<h2 id="dmoj-esnek-ve-geliştirici-dostu">DMOJ: Esnek ve geliştirici dostu</h2>

<p>DMOJ, sürekli açık problem arşivleri ve eğitim platformları için öne çıkar. Çok sayıda dili destekler; özel checker, interaktif problem ve kısmi puanlama gibi özellikler sunar. Django tabanlı web uygulaması ile değerlendirme düğümleri birbirinden ayrılabilir.</p>

<p>Bir problemin basit yapılandırması kavramsal olarak şöyle görünebilir:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">archive</span><span class="pi">:</span> <span class="s">data.zip</span>
<span class="na">time</span><span class="pi">:</span> <span class="m">2</span>
<span class="na">memory</span><span class="pi">:</span> <span class="m">256</span>
<span class="na">test_cases</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">points</span><span class="pi">:</span> <span class="m">20</span>
    <span class="na">input</span><span class="pi">:</span> <span class="s">sample.in</span>
    <span class="na">output</span><span class="pi">:</span> <span class="s">sample.out</span>
  <span class="pi">-</span> <span class="na">points</span><span class="pi">:</span> <span class="m">80</span>
    <span class="na">batched</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">input</span><span class="pi">:</span> <span class="s">secret.in</span>
        <span class="na">output</span><span class="pi">:</span> <span class="s">secret.out</span>
</code></pre></div></div>

<p>Bu yapı süreyi, bellek sınırını ve testlerin puan ağırlığını tanımlar. Gerçek sözdizimi sürüme ve problem paketine göre değişebilse de temel fikir aynıdır: değerlendirme davranışı kod yerine yapılandırmayla açıklanır.</p>

<h2 id="cms-olimpiyat-seviyesinde-kontrol">CMS: Olimpiyat seviyesinde kontrol</h2>

<p>Contest Management System, özellikle IOI biçimindeki yarışmalara yöneliktir. Alt görevler, geri bildirim düzeyleri, token sistemi ve ayrıntılı puanlama senaryolarında çok başarılıdır. Örneğin çözüm ilk alt görevden 20, ikinci alt görevden 30 puan alabilir; en zor grup başarısız olsa bile toplam puan korunur.</p>

<p>CMS güçlüdür ancak kurulumu ve işletimi diğer seçeneklere göre daha fazla sistem yönetimi bilgisi ister. Servislerin dağıtılması, worker makinelerinin hazırlanması ve yarışma verilerinin doğru modellenmesi dikkat gerektirir.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Tek günlük ICPC benzeri bir etkinlik için <strong>DOMjudge</strong>, okul veya topluluk tabanlı sürekli bir soru platformu için <strong>DMOJ</strong>, ulusal olimpiyat düzeyinde alt görevli yarışmalar için <strong>CMS</strong> daha doğal seçimdir. Platformdan bağımsız olarak yedekleme, HTTPS, kaynak izolasyonu ve yarışma öncesi yük testi ihmal edilmemelidir. Çünkü en zor algoritma sorusu bile çözülebilir; yarışma ortasında çöken judge sunucusu ise herkese aynı anda sistem tasarımı dersi verir.</p>

<p><img src="/img/algoritma-yarismalarinin-perde-38.svg" alt="algoritma-yarismalarinin-perde-38" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritma" /><category term="online-judge" /><category term="domjudge" /><category term="dmoj" /><category term="cms" /><category term="programlama-yarışmaları" /><summary type="html"><![CDATA[Bir algoritma yarışmasında çözümünüzü gönderip birkaç saniye sonra “Accepted” sonucunu gördüğünüzde arka planda küçük bir yazılım orkestrası çalışır. Kaynak kod derlenir, izole bir ortamda test edilir, süre ve bellek tüketimi ölçülür, çıktı karşılaştırılır ve puan hesaplanır. DOMjudge, DMOJ ve CMS, bu orkestrayı yöneten en popüler açık kaynak yarışma sistemleri arasındadır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/algoritma-yarismalarinin-perde-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/algoritma-yarismalarinin-perde-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">API Dokümantasyon Sistemi Kurmak: Swagger UI, Redoc ve Docusaurus</title><link href="https://program.sonsuz.us/posts/api-dokumantasyon-sistemi-kurmak-swagger-ui-redoc-ve-docusaurus/" rel="alternate" type="text/html" title="API Dokümantasyon Sistemi Kurmak: Swagger UI, Redoc ve Docusaurus" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/api-dokumantasyon-sistemi-kurmak-swagger-ui-redoc-ve-docusaurus</id><content type="html" xml:base="https://program.sonsuz.us/posts/api-dokumantasyon-sistemi-kurmak-swagger-ui-redoc-ve-docusaurus/"><![CDATA[<p>Bir API geliştirmek yalnızca çalışan endpoint’ler yazmak değildir; diğer geliştiricilerin bu endpoint’leri keşfedebilmesini, deneyebilmesini ve doğru kullanabilmesini sağlamak da işin parçasıdır. Swagger UI, Redoc ve Docusaurus aynı dokümantasyon evreninde yaşasa da farklı sorunları çözer. Gelin bu araçları yarıştırmak yerine birlikte çalıştırabileceğimiz sürdürülebilir bir sistem tasarlayalım.
``</p>
<h2 id="önce-temel-openapi-nedir">Önce temel: OpenAPI nedir?</h2>

<p>OpenAPI, REST tabanlı bir API’nin insanlar ve makineler tarafından okunabilen sözleşmesidir. Endpoint yolları, HTTP metotları, parametreler, veri modelleri, kimlik doğrulama yöntemleri ve olası yanıtlar YAML veya JSON biçiminde tanımlanır.</p>

<p>Bir API sözleşmesini kabaca şu fonksiyonla düşünebiliriz:</p>

\[S = P + R + M + A + E\]

<p>Burada $P$ yolları, $R$ istekleri, $M$ veri modellerini, $A$ kimlik doğrulamayı ve $E$ hata yanıtlarını temsil eder. Sözleşme ne kadar eksiksizse istemci üretimi, test otomasyonu ve geliştirici deneyimi o kadar başarılı olur.</p>

<p>Swagger UI ve Redoc bu sözleşmeyi görselleştirir. Docusaurus ise rehberler, eğitimler, sürüm notları ve kavramsal açıklamalar için genel bir dokümantasyon sitesi sunar.</p>

<h2 id="araçların-karşılaştırması">Araçların karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Swagger UI</th>
      <th>Redoc</th>
      <th>Docusaurus</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana amaç</td>
      <td>API’yi etkileşimli denemek</td>
      <td>Okunabilir API referansı</td>
      <td>Tam dokümantasyon portalı</td>
    </tr>
    <tr>
      <td>OpenAPI desteği</td>
      <td>Doğrudan</td>
      <td>Doğrudan</td>
      <td>Eklentiyle</td>
    </tr>
    <tr>
      <td>İstek gönderme</td>
      <td>Güçlü</td>
      <td>Sınırlı veya sürüme bağlı</td>
      <td>Yerleşik değil</td>
    </tr>
    <tr>
      <td>Özelleştirme</td>
      <td>Orta</td>
      <td>Güçlü tema seçenekleri</td>
      <td>React ile çok güçlü</td>
    </tr>
    <tr>
      <td>En uygun kullanım</td>
      <td>Test ve keşif</td>
      <td>Referans dokümanı</td>
      <td>Rehber ve içerik yönetimi</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/api-dokumantasyon-sistemi-62.svg" alt="api-dokumantasyon-sistemi-62" /></p>

<p>Kısacası Swagger UI laboratuvar, Redoc düzenli bir ansiklopedi, Docusaurus ise bütün kampüstür.</p>

<h2 id="küçük-bir-openapi-sözleşmesi">Küçük bir OpenAPI sözleşmesi</h2>

<p>Aşağıdaki dosya, kullanıcı bilgisini kimliğe göre döndüren bir endpoint tanımlar:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">openapi</span><span class="pi">:</span> <span class="s">3.0.3</span>
<span class="na">info</span><span class="pi">:</span>
  <span class="na">title</span><span class="pi">:</span> <span class="s">Kullanıcı API</span>
  <span class="na">version</span><span class="pi">:</span> <span class="s">1.0.0</span>
<span class="na">paths</span><span class="pi">:</span>
  <span class="s">/users/{id}</span><span class="err">:</span>
    <span class="na">get</span><span class="pi">:</span>
      <span class="na">summary</span><span class="pi">:</span> <span class="s">Kimliğe göre kullanıcı getirir</span>
      <span class="na">parameters</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">id</span>
          <span class="na">in</span><span class="pi">:</span> <span class="s">path</span>
          <span class="na">required</span><span class="pi">:</span> <span class="kc">true</span>
          <span class="na">schema</span><span class="pi">:</span>
            <span class="na">type</span><span class="pi">:</span> <span class="s">integer</span>
      <span class="na">responses</span><span class="pi">:</span>
        <span class="s1">'</span><span class="s">200'</span><span class="err">:</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s">Kullanıcı bulundu</span>
          <span class="na">content</span><span class="pi">:</span>
            <span class="na">application/json</span><span class="pi">:</span>
              <span class="na">schema</span><span class="pi">:</span>
                <span class="na">$ref</span><span class="pi">:</span> <span class="s1">'</span><span class="s">#/components/schemas/User'</span>
      <span class="err">  </span><span class="s1">'</span><span class="s">404'</span><span class="err">:</span>
          <span class="na">description</span><span class="pi">:</span> <span class="s">Kullanıcı bulunamadı</span>
<span class="na">components</span><span class="pi">:</span>
  <span class="na">schemas</span><span class="pi">:</span>
    <span class="na">User</span><span class="pi">:</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">object</span>
      <span class="na">required</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">id</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">]</span>
      <span class="na">properties</span><span class="pi">:</span>
        <span class="na">id</span><span class="pi">:</span>
          <span class="na">type</span><span class="pi">:</span> <span class="s">integer</span>
        <span class="na">name</span><span class="pi">:</span>
          <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
</code></pre></div></div>

<p>Bu tanım tek bir doğruluk kaynağıdır. Aynı dosya arayüz oluşturmak, sözleşme testi yapmak veya istemci SDK’sı üretmek için kullanılabilir.</p>

<h2 id="swagger-ui-ve-redocu-çalıştırmak">Swagger UI ve Redoc’u çalıştırmak</h2>

<p>En hızlı yöntem Docker kullanmaktır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Etkileşimli Swagger UI</span>

docker run <span class="nt">--rm</span> <span class="nt">-p</span> 8080:8080 <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">SWAGGER_JSON</span><span class="o">=</span>/spec/openapi.yaml <span class="se">\</span>
  <span class="nt">-v</span> <span class="s2">"</span><span class="nv">$PWD</span><span class="s2">:/spec"</span> swaggerapi/swagger-ui

<span class="c"># Okuma odaklı Redoc</span>

docker run <span class="nt">--rm</span> <span class="nt">-p</span> 8081:80 <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">SPEC_URL</span><span class="o">=</span>openapi.yaml redocly/redoc
</code></pre></div></div>

<p>İlk komut API’yi <code class="language-plaintext highlighter-rouge">localhost:8080</code> üzerinde deneyebilmenizi sağlar. İkinci komut aynı sözleşmeyi daha sade ve referans odaklı bir görünümle sunar. Gerçek projede dosyayı Redoc sunucusunun erişebileceği dizine kopyalamak veya bir URL üzerinden yayımlamak gerekir.</p>

<h2 id="docusaurus-ile-merkezi-portal">Docusaurus ile merkezi portal</h2>

<p>Docusaurus projesinde kavramsal rehberleri Markdown ile tutabilir, API referansına menüden bağlantı verebilirsiniz:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// docusaurus.config.js</span>
<span class="k">export</span> <span class="k">default</span> <span class="p">{</span>
  <span class="na">themeConfig</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">navbar</span><span class="p">:</span> <span class="p">{</span>
      <span class="na">items</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span> <span class="na">to</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/docs/intro</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Rehberler</span><span class="dl">'</span> <span class="p">},</span>
        <span class="p">{</span> <span class="na">href</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/api/redoc.html</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">'</span><span class="s1">API Referansı</span><span class="dl">'</span> <span class="p">},</span>
        <span class="p">{</span> <span class="na">href</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/swagger/</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">'</span><span class="s1">API’yi Dene</span><span class="dl">'</span> <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu yapı kullanıcıya üç katman sunar: “Neden kullanmalıyım?” sorusunu rehberler, “Hangi alanlar var?” sorusunu Redoc, “Bu istek gerçekten çalışıyor mu?” sorusunu Swagger UI cevaplar.</p>

<h2 id="sürdürülebilir-iş-akışı">Sürdürülebilir iş akışı</h2>

<p>OpenAPI dosyasını uygulama koduyla aynı depoda saklayın. CI sürecinde sözdizimini doğrulayın, kırıcı değişiklikleri karşılaştırın ve başarılı derlemeden sonra üç aracı da yayımlayın. Sürüm numarasını URL’ye eklemek, eski istemcilerin dokümantasyona erişmesini kolaylaştırır.</p>

<p>Ayrıca örneklerde gerçek erişim anahtarları kullanmayın. Swagger UI üzerindeki yetkilendirme alanlarını yalnızca güvenli test ortamlarına bağlayın. Böylece güzel görünen değil; güncel, test edilebilir ve güvenilir bir API dokümantasyon sistemi elde edersiniz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="api" /><category term="swagger-ui" /><category term="redoc" /><category term="docusaurus" /><category term="openapi" /><category term="dokümantasyon" /><summary type="html"><![CDATA[Bir API geliştirmek yalnızca çalışan endpoint’ler yazmak değildir; diğer geliştiricilerin bu endpoint’leri keşfedebilmesini, deneyebilmesini ve doğru kullanabilmesini sağlamak da işin parçasıdır. Swagger UI, Redoc ve Docusaurus aynı dokümantasyon evreninde yaşasa da farklı sorunları çözer. Gelin bu araçları yarıştırmak yerine birlikte çalıştırabileceğimiz sürdürülebilir bir sistem tasarlayalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/api-dokumantasyon-sistemi-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/api-dokumantasyon-sistemi-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">API Test Arenası: Hoppscotch, Bruno ve Insomnia Karşılaştırması</title><link href="https://program.sonsuz.us/posts/api-test-arenasi-hoppscotch-bruno-ve-insomnia-karsilastirmasi/" rel="alternate" type="text/html" title="API Test Arenası: Hoppscotch, Bruno ve Insomnia Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/api-test-arenasi-hoppscotch-bruno-ve-insomnia-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/api-test-arenasi-hoppscotch-bruno-ve-insomnia-karsilastirmasi/"><![CDATA[<p>Bir API geliştirirken yalnızca endpoint’in çalışması yetmez; doğru durum kodunu, beklenen veriyi ve kabul edilebilir sürede yanıt verdiğini de doğrulamak gerekir. Postman dışında bir araç arıyorsanız Hoppscotch, Bruno ve Insomnia oldukça güçlü üç adaydır. Üstelik her biri API testine farklı bir pencereden bakar: biri hızlı ve web tabanlı, biri Git dostu, diğeri ise kapsamlı bir masaüstü çalışma alanıdır.</p>

<p><img src="/img/api-test-arenasi-95.svg" alt="api-test-arenasi-95" /></p>

<p>``</p>

<h2 id="api-testi-aslında-neyi-doğrular">API testi aslında neyi doğrular?</h2>

<p>Bir istemci API’ye HTTP isteği gönderir; sunucu ise durum kodu, başlıklar ve gövde içeren bir yanıt üretir. Test aracının temel görevi bu alışverişi görünür ve tekrar edilebilir hâle getirmektir.</p>

<p>Örneğin bir kullanıcı endpoint’i için yalnızca <code class="language-plaintext highlighter-rouge">200 OK</code> almak yeterli değildir. Yanıt gövdesindeki <code class="language-plaintext highlighter-rouge">id</code> alanının bulunması, içerik türünün JSON olması ve sürenin belirlenen sınırı aşmaması da kontrol edilmelidir.</p>

<p>Performansı basitçe şöyle değerlendirebiliriz:</p>

\[T_{toplam} = T_{ağ} + T_{sunucu} + T_{aktarım}\]

<p>Bir test 400 ms sürüyorsa bunun tamamı sunucunun işlem süresi değildir. Ağ gecikmesi ve yanıt boyutu da sonucu etkiler. Çoklu isteklerde ortalama süre ise</p>

\[\bar{T} = \frac{\sum_{i=1}^{n} T_i}{n}\]

<p>formülüyle hesaplanabilir. Bu nedenle tek bir hızlı yanıt görüp zafer dansına başlamak yerine testi birkaç kez çalıştırmak daha sağlıklıdır.</p>

<h2 id="üç-aracın-karakteri">Üç aracın karakteri</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Hoppscotch</th>
      <th>Bruno</th>
      <th>Insomnia</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Çalışma biçimi</td>
      <td>Web ve masaüstü</td>
      <td>Masaüstü ve CLI</td>
      <td>Masaüstü</td>
    </tr>
    <tr>
      <td>Başlangıç hızı</td>
      <td>Çok yüksek</td>
      <td>Yüksek</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Git uyumu</td>
      <td>Sınırlı</td>
      <td>Çok güçlü</td>
      <td>Projeye göre değişir</td>
    </tr>
    <tr>
      <td>Yerel dosya yaklaşımı</td>
      <td>İkincil</td>
      <td>Temel özellik</td>
      <td>Kısmen</td>
    </tr>
    <tr>
      <td>Otomasyon</td>
      <td>Temel/orta</td>
      <td>CLI ile güçlü</td>
      <td>Eklenti ve CLI seçenekleri</td>
    </tr>
    <tr>
      <td>İdeal kullanıcı</td>
      <td>Hızlı deneme yapanlar</td>
      <td>Kod odaklı ekipler</td>
      <td>Geniş çalışma alanı isteyenler</td>
    </tr>
  </tbody>
</table>

<h3 id="hoppscotch-tarayıcıyı-aç-ve-isteği-gönder">Hoppscotch: Tarayıcıyı aç ve isteği gönder</h3>

<p>Hoppscotch, kurulumla uğraşmadan REST, GraphQL ve WebSocket istekleri denemek isteyenler için idealdir. Arayüzü hafiftir; URL’yi, metodu ve gerekli başlıkları girerek saniyeler içinde sonuç alabilirsiniz. Özellikle eğitimlerde, hata ayıklamada ve geçici kontrollerde parıldar.</p>

<p>Ancak hassas token’larla çalışırken ekip politikalarını ve verinin nerede saklandığını incelemek gerekir. Tarayıcı kolaylığı, güvenlik değerlendirmesini ortadan kaldırmaz.</p>

<h3 id="bruno-koleksiyonlar-da-kod-gibi-yaşasın">Bruno: Koleksiyonlar da kod gibi yaşasın</h3>

<p>Bruno, koleksiyonları düz metin dosyalarında saklayarak Git üzerinden sürümlemeyi kolaylaştırır. Böylece API değişiklikleri pull request içinde görülebilir; “Bu header’ı kim değiştirdi?” sorusu polisiye romana dönüşmez.</p>

<p>Örnek bir Bruno isteği şöyle görünebilir:</p>

<pre><code class="language-bru">meta {
  name: Kullanıcı Getir
  type: http
  seq: 1
}

get {
  url: {{baseUrl}}/users/42
  body: none
  auth: bearer
}

assert {
  res.status: eq 200
  res.body.id: eq 42
}
</code></pre>

<p>Bu dosya isteğin adresini tanımlar ve yanıtın durum koduyla kullanıcı kimliğini doğrular. CLI desteği sayesinde aynı koleksiyon CI/CD hattında da çalıştırılabilir.</p>

<h3 id="insomnia-düzenli-ve-kapsamlı-çalışma-masası">Insomnia: Düzenli ve kapsamlı çalışma masası</h3>

<p>Insomnia; ortam değişkenleri, kimlik doğrulama yöntemleri, GraphQL desteği ve koleksiyon organizasyonuyla kapsamlı projelerde rahat bir deneyim sunar. Çok sayıda servisi olan ekipler için klasörlü yapı ve yeniden kullanılabilir değişkenler önemlidir.</p>

<p>Örneğin geliştirme ve üretim adreslerini ayrı ayrı yazmak yerine şu mantık kullanılabilir:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"base_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://api.example.com"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"token"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{{ secret_token }}"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Böylece isteklerde `` kullanılır ve ortam değiştirirken her endpoint’i elle düzenlemek gerekmez. Token değerlerini repoya eklememek ise temel güvenlik kuralıdır.</p>

<h2 id="hangisini-seçmelisiniz">Hangisini seçmelisiniz?</h2>

<p>Hızlı, kurulumsuz denemeler için <strong>Hoppscotch</strong>; koleksiyonları Git ile yönetmek ve testleri pipeline’a taşımak için <strong>Bruno</strong>; kapsamlı masaüstü deneyimi ve düzenli proje yönetimi için <strong>Insomnia</strong> öne çıkar. En iyi araç, en fazla düğmeye sahip olan değil, ekibinizin testleri düzenli çalıştırmasını sağlayandır. Küçük bir örnek API’yi üçünde de deneyin; ardından hız, paylaşım, güvenlik ve otomasyon ihtiyaçlarınıza göre karar verin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="api" /><category term="hoppscotch" /><category term="bruno" /><category term="insomnia" /><category term="rest" /><category term="yazılım-testi" /><summary type="html"><![CDATA[Bir API geliştirirken yalnızca endpoint’in çalışması yetmez; doğru durum kodunu, beklenen veriyi ve kabul edilebilir sürede yanıt verdiğini de doğrulamak gerekir. Postman dışında bir araç arıyorsanız Hoppscotch, Bruno ve Insomnia oldukça güçlü üç adaydır. Üstelik her biri API testine farklı bir pencereden bakar: biri hızlı ve web tabanlı, biri Git dostu, diğeri ise kapsamlı bir masaüstü çalışma alanıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/api-test-arenasi-95.png" /><media:content medium="image" url="https://program.sonsuz.us/img/api-test-arenasi-95.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Hatalar Kaçmadan Yakalayın: Sentry, GlitchTip ve Bugsink Karşılaştırması</title><link href="https://program.sonsuz.us/posts/hatalar-kacmadan-yakalayin-sentry-glitchtip-ve-bugsink-karsilastirmasi/" rel="alternate" type="text/html" title="Hatalar Kaçmadan Yakalayın: Sentry, GlitchTip ve Bugsink Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/hatalar-kacmadan-yakalayin-sentry-glitchtip-ve-bugsink-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/hatalar-kacmadan-yakalayin-sentry-glitchtip-ve-bugsink-karsilastirmasi/"><![CDATA[<p>Uygulamanız geliştirme ortamında kusursuz çalışırken üretimde beklenmedik bir hata verebilir. Kullanıcının yalnızca “sayfa açılmadı” diye tarif ettiği bu olayın nedenini bulmak ise samanlıkta istisna aramaya benzer. Hata takip sistemleri; istisnaları, çağrı yığınlarını, kullanıcı etkileşimlerini ve ortam bilgilerini merkezi bir yerde toplayarak bu süreci hızlandırır. Bu alandaki popüler seçeneklerden Sentry, GlitchTip ve Bugsink aynı probleme farklı ölçek ve sadelik seviyeleriyle yaklaşır.</p>

<p><img src="/img/hatalar-kacmadan-yakalayin-56.svg" alt="hatalar-kacmadan-yakalayin-56" /></p>

<p>``</p>

<h2 id="hata-takip-sistemi-nasıl-çalışır">Hata takip sistemi nasıl çalışır?</h2>

<p>Uygulamaya eklenen SDK, yakalanmamış bir istisna oluştuğunda bir <strong>hata olayı</strong> üretir. Bu olay genellikle hata mesajını, stack trace bilgisini, sürümü, çalışma ortamını ve isteğe bağlı kullanıcı bağlamını içerir. Veriler bir DSN adresi üzerinden sunucuya gönderilir.</p>

<p>Sistem, benzer olayları tek bir sorun altında gruplandırmaya çalışır. Böylece aynı <code class="language-plaintext highlighter-rouge">NullReferenceException</code> hatası bin kez oluştuğunda panelde bin bağımsız kayıt yerine, gerçekleşme sayacı yükselen tek bir sorun görürüz.</p>

<p>Belirli sürede oluşan olay sayısını $E$, süreyi dakika cinsinden $t$ kabul edersek hata yoğunluğu şöyle ifade edilebilir:</p>

\[R = \frac{E}{t}\]

<p>Örneğin 10 dakikada 500 olay alınması, $R = 50$ olay/dakika anlamına gelir. Ancak yüksek sayı her zaman daha kritik hata demek değildir. Etkilenen kullanıcı sayısı, hata oranı ve işlemin önemi birlikte değerlendirilmelidir.</p>

<h2 id="üç-aracın-kısa-karşılaştırması">Üç aracın kısa karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Sentry</th>
      <th>GlitchTip</th>
      <th>Bugsink</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>Kapsamlı gözlemlenebilirlik platformu</td>
      <td>Açık kaynaklı, Sentry uyumlu alternatif</td>
      <td>Hafif ve sade hata takibi</td>
    </tr>
    <tr>
      <td>Barındırma</td>
      <td>Bulut veya self-hosted</td>
      <td>Bulut veya self-hosted</td>
      <td>Özellikle self-hosted kullanım</td>
    </tr>
    <tr>
      <td>Kurulum yükü</td>
      <td>Self-hosted sürümde daha yüksek</td>
      <td>Orta düzey</td>
      <td>Görece düşük</td>
    </tr>
    <tr>
      <td>Performans izleme</td>
      <td>Gelişmiş</td>
      <td>Temel ve orta seviye ihtiyaçlara uygun</td>
      <td>Hata takibine odaklı</td>
    </tr>
    <tr>
      <td>İdeal kullanım</td>
      <td>Büyük ekipler ve ayrıntılı analiz</td>
      <td>Açık kaynak ve maliyet dengesi</td>
      <td>Küçük ekipler, kişisel sunucular</td>
    </tr>
  </tbody>
</table>

<p><strong>Sentry</strong>, hata takibinin yanında performans izleme, dağıtık tracing, sürüm takibi ve oturum tekrarı gibi geniş özellikler sunar. Yönetilen bulut hizmeti operasyon yükünü azaltır; fakat yoğun trafik, veri kotası ve gizlilik gereksinimleri dikkatle değerlendirilmelidir.</p>

<p><strong>GlitchTip</strong>, Sentry SDK’larıyla uyumlu açık kaynaklı bir deneyim sağlamayı amaçlar. Arayüzü daha sade, self-hosted kurulumu ise genellikle daha ulaşılabilirdir. Sentry’nin bütün ileri analiz özelliklerini beklemeyen ekipler için güçlü bir dengedir.</p>

<p><strong>Bugsink</strong>, “önce hatayı yakalayalım” yaklaşımına yakındır. Daha az bileşenle çalışması, küçük sunucularda yönetimi kolaylaştırabilir. Kapsamlı observability platformu yerine anlaşılır bir hata kutusu isteyen projelere uygundur.</p>

<h2 id="python-uygulamasına-sdk-eklemek">Python uygulamasına SDK eklemek</h2>

<p>Üç ürün de Sentry protokolüyle uyumlu kurulum senaryoları sunabildiğinden Python tarafında çoğunlukla resmi SDK kullanılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">sentry_sdk</span>

<span class="n">sentry_sdk</span><span class="p">.</span><span class="nf">init</span><span class="p">(</span>
    <span class="n">dsn</span><span class="o">=</span><span class="sh">"</span><span class="s">https://anahtar@hata-sunucusu.example/1</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">environment</span><span class="o">=</span><span class="sh">"</span><span class="s">production</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">release</span><span class="o">=</span><span class="sh">"</span><span class="s">magaza-api@2.4.0</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">traces_sample_rate</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span>
<span class="p">)</span>

<span class="k">def</span> <span class="nf">fiyat_hesapla</span><span class="p">(</span><span class="n">toplam</span><span class="p">,</span> <span class="n">adet</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">toplam</span> <span class="o">/</span> <span class="n">adet</span>

<span class="nf">fiyat_hesapla</span><span class="p">(</span><span class="mi">250</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kodda DSN, olayların gideceği projeyi belirtir. <code class="language-plaintext highlighter-rouge">environment</code> üretim ve test kayıtlarını ayırır; <code class="language-plaintext highlighter-rouge">release</code> ise hatanın hangi sürümde başladığını bulmayı kolaylaştırır. <code class="language-plaintext highlighter-rouge">traces_sample_rate=0.1</code>, performans işlemlerinin yaklaşık yüzde 10’unu örnekler. Ürün ve sürüme göre desteklenen SDK özellikleri değişebileceğinden uyumluluk belgeleri kontrol edilmelidir.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Hazır servis, gelişmiş analiz ve minimum bakım istiyorsanız Sentry mantıklı başlangıçtır. Veriyi kendi altyapınızda tutmak, açık kaynak kullanmak ve daha ölçülü kaynak tüketmek istiyorsanız GlitchTip değerlendirilebilir. Yalnızca temel hata toplama, gruplama ve bildirim özelliklerine ihtiyacınız varsa Bugsink sadeliğiyle öne çıkar.</p>

<p>Seçimden önce günlük olay hacmini, saklama süresini ve örnekleme oranını hesaplayın. Ayrıca parola, erişim belirteci ve kişisel veri gibi hassas bilgileri SDK filtreleriyle temizleyin. Çünkü iyi bir hata takip sistemi yalnızca çok veri toplayan değil, doğru veriyi güvenli biçimde anlamlı hale getiren sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sentry" /><category term="glitchtip" /><category term="bugsink" /><category term="hata-takibi" /><category term="observability" /><category term="python" /><summary type="html"><![CDATA[Uygulamanız geliştirme ortamında kusursuz çalışırken üretimde beklenmedik bir hata verebilir. Kullanıcının yalnızca “sayfa açılmadı” diye tarif ettiği bu olayın nedenini bulmak ise samanlıkta istisna aramaya benzer. Hata takip sistemleri; istisnaları, çağrı yığınlarını, kullanıcı etkileşimlerini ve ortam bilgilerini merkezi bir yerde toplayarak bu süreci hızlandırır. Bu alandaki popüler seçeneklerden Sentry, GlitchTip ve Bugsink aynı probleme farklı ölçek ve sadelik seviyeleriyle yaklaşır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/hatalar-kacmadan-yakalayin-56.png" /><media:content medium="image" url="https://program.sonsuz.us/img/hatalar-kacmadan-yakalayin-56.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kendi Bug Bounty ve Güvenli Hata Bildirim Sistemini Tasarlamak</title><link href="https://program.sonsuz.us/posts/kendi-bug-bounty-ve-guvenli-hata-bildirim-sistemini-tasarlamak/" rel="alternate" type="text/html" title="Kendi Bug Bounty ve Güvenli Hata Bildirim Sistemini Tasarlamak" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kendi-bug-bounty-ve-guvenli-hata-bildirim-sistemini-tasarlamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/kendi-bug-bounty-ve-guvenli-hata-bildirim-sistemini-tasarlamak/"><![CDATA[<p><img src="/img/kendi-bug-bounty-46.svg" alt="kendi-bug-bounty-46" /></p>

<p>Bir güvenlik araştırmacısı kritik bir açık bulduğunda kime, nasıl ve hangi kanıtlarla ulaşacağını bilmelidir. Open Bug Bounty veya HackerOne benzeri özel bir sistem; araştırmacıları, güvenlik ekiplerini ve ürün sahiplerini aynı iş akışında buluşturur. Fakat bu proje, sıradan bir destek talebi uygulamasından daha fazlasıdır: hassas verileri korumalı, mükerrer raporları yakalamalı ve kontrollü açıklama sürecini yönetmelidir.
``</p>

<h2 id="temel-iş-akışı">Temel iş akışı</h2>

<p>Bir raporun yaşam döngüsü durum makinesi olarak modellenebilir:</p>

<p><code class="language-plaintext highlighter-rouge">Taslak → Gönderildi → İnceleniyor → Doğrulandı → Çözüldü → Açıklandı</code></p>

<p>Rapor geçersizse <strong>Reddedildi</strong>, daha önce bildirilmişse <strong>Mükerrer</strong> durumuna taşınır. Durum makinesi kullanmak, örneğin çözülmüş bir raporun yanlışlıkla yeniden “gönderildi” yapılmasını engeller.</p>

<table>
  <thead>
    <tr>
      <th>Rol</th>
      <th>Yetki</th>
      <th>Görememesi gerekenler</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Araştırmacı</td>
      <td>Rapor oluşturma, kanıt ekleme</td>
      <td>Diğer özel raporlar</td>
    </tr>
    <tr>
      <td>Triyaj uzmanı</td>
      <td>Doğrulama, sınıflandırma</td>
      <td>Finansal yönetim ayarları</td>
    </tr>
    <tr>
      <td>Program sahibi</td>
      <td>Kapsam ve ödül yönetimi</td>
      <td>Gereksiz kişisel veriler</td>
    </tr>
    <tr>
      <td>Yönetici</td>
      <td>Rol ve sistem yönetimi</td>
      <td>Şifresiz gizli içerik</td>
    </tr>
  </tbody>
</table>

<p>Bu ayrım, <strong>en az ayrıcalık ilkesi</strong> üzerine kurulmalıdır. Yalnızca giriş yapmış olmak yeterli değildir; her API isteğinde rol, kaynak sahipliği ve program üyeliği ayrıca denetlenmelidir.</p>

<h2 id="önem-derecesi-ve-ödül-hesabı">Önem derecesi ve ödül hesabı</h2>

<p>Açıkların önceliği CVSS gibi standartlarla belirlenebilir. Daha sade bir özel puanlama için şu model kullanılabilir:</p>

\[Risk = Etki \times İstismarOlasılığı \times VarlıkKatsayısı\]

<p>Her değişken 1 ile 5 arasında seçilirse en yüksek risk puanı $5^3 = 125$ olur. Ödül ise taban tutar ve risk oranıyla hesaplanabilir:</p>

\[Ödül = TabanÖdül \times (Risk / 125)\]

<p>Ancak otomatik sonuç yalnızca öneri olmalıdır. Kaliteli açıklama, çalışan kavram kanıtı ve daha önce raporlanmış olma durumu nihai kararı değiştirebilir.</p>

<h2 id="veri-modeli-ve-güvenlik">Veri modeli ve güvenlik</h2>

<p>Temel tablolar <code class="language-plaintext highlighter-rouge">users</code>, <code class="language-plaintext highlighter-rouge">programs</code>, <code class="language-plaintext highlighter-rouge">assets</code>, <code class="language-plaintext highlighter-rouge">reports</code>, <code class="language-plaintext highlighter-rouge">comments</code>, <code class="language-plaintext highlighter-rouge">attachments</code>, <code class="language-plaintext highlighter-rouge">rewards</code> ve <code class="language-plaintext highlighter-rouge">audit_logs</code> olabilir. Rapor; başlık, etkilenen varlık, açıklık türü, tekrar üretme adımları, etki açıklaması ve çözüm önerisi içermelidir.</p>

<p>Kanıt dosyaları doğrudan herkese açık klasörlere konulmamalıdır. Nesne depolamada şifrelenmeli, kısa ömürlü imzalı bağlantılarla sunulmalı ve zararlı dosya taramasından geçirilmelidir. Parolalar Argon2id ile özetlenmeli; oturumlarda çok faktörlü kimlik doğrulama desteklenmelidir. Audit log kayıtları da “kim, neyi, ne zaman değiştirdi?” sorusunu yanıtlamalıdır.</p>

<h2 id="güvenli-durum-geçişi-örneği">Güvenli durum geçişi örneği</h2>

<p>Aşağıdaki FastAPI kodu, istemcinin istediği her duruma serbestçe geçmesini engeller:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
<span class="kn">from</span> <span class="n">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span><span class="p">,</span> <span class="n">HTTPException</span>

<span class="n">app</span> <span class="o">=</span> <span class="nc">FastAPI</span><span class="p">()</span>

<span class="k">class</span> <span class="nc">Status</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
    <span class="n">submitted</span> <span class="o">=</span> <span class="sh">"</span><span class="s">submitted</span><span class="sh">"</span>
    <span class="n">triage</span> <span class="o">=</span> <span class="sh">"</span><span class="s">triage</span><span class="sh">"</span>
    <span class="n">confirmed</span> <span class="o">=</span> <span class="sh">"</span><span class="s">confirmed</span><span class="sh">"</span>
    <span class="n">resolved</span> <span class="o">=</span> <span class="sh">"</span><span class="s">resolved</span><span class="sh">"</span>
    <span class="n">rejected</span> <span class="o">=</span> <span class="sh">"</span><span class="s">rejected</span><span class="sh">"</span>

<span class="n">ALLOWED</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">Status</span><span class="p">.</span><span class="n">submitted</span><span class="p">:</span> <span class="p">{</span><span class="n">Status</span><span class="p">.</span><span class="n">triage</span><span class="p">,</span> <span class="n">Status</span><span class="p">.</span><span class="n">rejected</span><span class="p">},</span>
    <span class="n">Status</span><span class="p">.</span><span class="n">triage</span><span class="p">:</span> <span class="p">{</span><span class="n">Status</span><span class="p">.</span><span class="n">confirmed</span><span class="p">,</span> <span class="n">Status</span><span class="p">.</span><span class="n">rejected</span><span class="p">},</span>
    <span class="n">Status</span><span class="p">.</span><span class="n">confirmed</span><span class="p">:</span> <span class="p">{</span><span class="n">Status</span><span class="p">.</span><span class="n">resolved</span><span class="p">},</span>
    <span class="n">Status</span><span class="p">.</span><span class="n">resolved</span><span class="p">:</span> <span class="nf">set</span><span class="p">(),</span>
    <span class="n">Status</span><span class="p">.</span><span class="n">rejected</span><span class="p">:</span> <span class="nf">set</span><span class="p">()</span>
<span class="p">}</span>

<span class="nd">@app.post</span><span class="p">(</span><span class="sh">"</span><span class="s">/reports/{report_id}/transition</span><span class="sh">"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">transition</span><span class="p">(</span><span class="n">report_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">current</span><span class="p">:</span> <span class="n">Status</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">Status</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">target</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ALLOWED</span><span class="p">[</span><span class="n">current</span><span class="p">]:</span>
        <span class="k">raise</span> <span class="nc">HTTPException</span><span class="p">(</span><span class="mi">409</span><span class="p">,</span> <span class="sh">"</span><span class="s">Geçersiz durum geçişi</span><span class="sh">"</span><span class="p">)</span>

    <span class="c1"># Burada rol kontrolü ve veritabanı güncellemesi yapılır.
</span>    <span class="k">return</span> <span class="p">{</span><span class="sh">"</span><span class="s">report_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">report_id</span><span class="p">,</span> <span class="sh">"</span><span class="s">status</span><span class="sh">"</span><span class="p">:</span> <span class="n">target</span><span class="p">}</span>
</code></pre></div></div>

<p>Gerçek uygulamada <code class="language-plaintext highlighter-rouge">current</code> değeri kullanıcıdan alınmamalı, veritabanından okunmalıdır. Güncelleme atomik bir işlem içinde yapılmalı ve audit log kaydı aynı işlemde oluşturulmalıdır.</p>

<h2 id="sistemi-olgunlaştıran-özellikler">Sistemi olgunlaştıran özellikler</h2>

<p>Mükerrer rapor tespiti için başlık benzerliği, açıklık türü ve etkilenen varlık birlikte değerlendirilebilir; ancak gizlilik nedeniyle araştırmacıya başka raporun ayrıntıları gösterilmemelidir. Bildirimler e-posta ve uygulama içi kanallardan iletilebilir. Oran sınırlama, CAPTCHA ve kötüye kullanım tespiti de spam saldırılarını azaltır.</p>

<p>Son olarak açık bir kapsam politikası hazırlayın: test edilebilen alan adları, yasak yöntemler, hizmet kesintisi kuralları, yanıt süreleri ve güvenli liman şartları net olsun. İyi bir bug bounty platformunun asıl süper gücü yalnızca kodu değil, araştırmacıyla kurulan güveni de korumasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="bug bounty" /><category term="siber güvenlik" /><category term="hata bildirimi" /><category term="güvenli yazılım" /><category term="api" /><category term="web geliştirme" /><summary type="html"><![CDATA[Bir güvenlik araştırmacısı kritik bir açık bulduğunda kime, nasıl ve hangi kanıtlarla ulaşacağını bilmelidir. Open Bug Bounty veya HackerOne benzeri özel bir sistem; araştırmacıları, güvenlik ekiplerini ve ürün sahiplerini aynı iş akışında buluşturur. Fakat bu proje, sıradan bir destek talebi uygulamasından daha fazlasıdır: hassas verileri korumalı, mükerrer raporları yakalamalı ve kontrollü açıklama sürecini yönetmelidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kendi-bug-bounty-46.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kendi-bug-bounty-46.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kimlik Doğrulama Arenası: Keycloak, Authentik ve Authelia</title><link href="https://program.sonsuz.us/posts/kimlik-dogrulama-arenasi-keycloak-authentik-ve-authelia/" rel="alternate" type="text/html" title="Kimlik Doğrulama Arenası: Keycloak, Authentik ve Authelia" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kimlik-dogrulama-arenasi-keycloak-authentik-ve-authelia</id><content type="html" xml:base="https://program.sonsuz.us/posts/kimlik-dogrulama-arenasi-keycloak-authentik-ve-authelia/"><![CDATA[<p>Birden fazla uygulama kullanan ekiplerde her servis için ayrı kullanıcı adı ve parola yönetmek kısa sürede dijital bir anahtarlık kâbusuna dönüşür. Keycloak, Authentik ve Authelia bu sorunu merkezi kimlik doğrulama, tek oturum açma ve erişim politikalarıyla çözer. Ancak üçü de aynı kapıyı korusa da farklı anahtarlar ve farklı güvenlik yaklaşımları kullanır.</p>

<p><img src="/img/kimlik-dogrulama-arenasi-17.svg" alt="kimlik-dogrulama-arenasi-17" /></p>

<p>``</p>
<h2 id="önce-temel-kavramlar">Önce temel kavramlar</h2>

<p><strong>Kimlik doğrulama</strong> (authentication), kullanıcının kim olduğunu kanıtlamasıdır. <strong>Yetkilendirme</strong> (authorization) ise doğrulanan kullanıcının hangi kaynaklara erişebileceğini belirler. Kısaca ilk soru “Sen kimsin?”, ikinci soru “Burada ne yapabilirsin?” şeklindedir.</p>

<p>Modern sistemlerde parola her uygulamaya gönderilmez. Kullanıcı bir <strong>Kimlik Sağlayıcıya</strong> (Identity Provider veya IdP) yönlendirilir. Başarılı girişten sonra uygulamaya imzalı bir token verilir. Basitleştirilmiş güven modeli şöyle ifade edilebilir:</p>

\[Güven = Kimlik\ Doğrulama + Token\ Bütünlüğü + Erişim\ Politikası\]

<p>Token içinde kullanıcı kimliği, roller ve geçerlilik süresi gibi talepler bulunur. Bir tokenın kullanılabilirliği kabaca şu koşula bağlıdır:</p>

\[Geçerli = İmzaDoğru \land (şimdi &lt; sonKullanma) \land doğruHedef\]

<p>OpenID Connect (OIDC) kimlik bilgisini OAuth 2.0 üzerine ekler. SAML daha çok kurumsal ve eski sistemlerde görülürken LDAP merkezi kullanıcı dizini görevi üstlenir.</p>

<h2 id="üç-adayın-karşılaştırması">Üç adayın karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Keycloak</th>
      <th>Authentik</th>
      <th>Authelia</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel rol</td>
      <td>Tam kapsamlı IdP</td>
      <td>Modern ve görsel IdP</td>
      <td>Ters proxy odaklı erişim katmanı</td>
    </tr>
    <tr>
      <td>OIDC / OAuth 2.0</td>
      <td>Çok güçlü</td>
      <td>Güçlü</td>
      <td>Destekliyor</td>
    </tr>
    <tr>
      <td>SAML</td>
      <td>Gelişmiş</td>
      <td>Destekliyor</td>
      <td>Sınırlı senaryolar</td>
    </tr>
    <tr>
      <td>Yönetim arayüzü</td>
      <td>Ayrıntılı fakat yoğun</td>
      <td>Kullanıcı dostu</td>
      <td>Yapılandırma dosyası ağırlıklı</td>
    </tr>
    <tr>
      <td>Kaynak ihtiyacı</td>
      <td>Görece yüksek</td>
      <td>Orta</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>İdeal kullanım</td>
      <td>Kurumsal sistemler</td>
      <td>Self-hosted ve orta ölçek</td>
      <td>Mevcut web servislerini koruma</td>
    </tr>
  </tbody>
</table>

<p><strong>Keycloak</strong>, realm, client, rol, grup ve identity brokering özellikleriyle adeta kimlik yönetiminin İsviçre çakısıdır. Büyük organizasyonlar ve karmaşık rol modelleri için güçlüdür; buna karşılık kurulumu ve işletimi daha fazla dikkat ister.</p>

<p><strong>Authentik</strong>, akış tabanlı yaklaşımı ve modern arayüzüyle daha yumuşak bir öğrenme eğrisi sunar. OIDC, SAML, LDAP ve proxy provider seçeneklerini aynı merkezde toplar. Ev laboratuvarları ile büyüyen ekipler arasında güzel bir köprü kurar.</p>

<p><strong>Authelia</strong> ise özellikle Nginx, Traefik veya Caddy arkasındaki uygulamalara giriş ekranı ve çok faktörlü doğrulama eklemek için hafif bir çözümdür. Tam teşekküllü kurumsal IdP yerine güvenlik kapısı gibi düşünülmelidir.</p>

<h2 id="basit-bir-oidc-istemcisi">Basit bir OIDC istemcisi</h2>

<p>Bir uygulamanın sağlayıcıyı keşfetmesi çoğunlukla standart bir adres üzerinden gerçekleşir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">issuer</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://kimlik.example.com/realms/ekip</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">oidcConfig</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">authority</span><span class="p">:</span> <span class="nx">issuer</span><span class="p">,</span>
  <span class="na">client_id</span><span class="p">:</span> <span class="dl">"</span><span class="s2">blog-paneli</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">redirect_uri</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://panel.example.com/callback</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">response_type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">code</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">scope</span><span class="p">:</span> <span class="dl">"</span><span class="s2">openid profile email</span><span class="dl">"</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu yapılandırma uygulamanın hangi IdP’ye bağlanacağını, dönüş adresini ve talep ettiği kullanıcı bilgilerini belirtir. <code class="language-plaintext highlighter-rouge">authorization code</code> akışı kullanılmalı; tarayıcı tabanlı istemcilerde ayrıca <strong>PKCE</strong> etkinleştirilmelidir. Böylece ele geçirilen yetkilendirme kodunun başka bir istemci tarafından kullanılması zorlaşır.</p>

<h2 id="güvenli-kurulum-kontrol-listesi">Güvenli kurulum kontrol listesi</h2>

<ul>
  <li>Yönetici hesabında çok faktörlü doğrulamayı etkinleştirin.</li>
  <li>Yalnızca HTTPS kullanın ve yönlendirme adreslerini kesin tanımlayın.</li>
  <li>Token ömrünü gereksiz yere uzun tutmayın.</li>
  <li>Servis hesaplarına en az ayrıcalık ilkesini uygulayın.</li>
  <li>Veritabanı, anahtarlar ve yapılandırmalar için düzenli yedek alın.</li>
  <li>Giriş denemelerini ve yönetici işlemlerini merkezi olarak kaydedin.</li>
</ul>

<p>Sonuç olarak karmaşık kurumsal federasyon için <strong>Keycloak</strong>, modern arayüz ve esnek self-hosted deneyim için <strong>Authentik</strong>, ters proxy arkasındaki servisleri hızlıca korumak için <strong>Authelia</strong> öne çıkar. En iyi ürün, en uzun özellik listesine sahip olan değil; ekibinizin güvenle işletebildiği ve düzenli güncelleyebildiği üründür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kimlik doğrulama" /><category term="keycloak" /><category term="authentik" /><category term="authelia" /><category term="openid connect" /><category term="siber güvenlik" /><summary type="html"><![CDATA[Birden fazla uygulama kullanan ekiplerde her servis için ayrı kullanıcı adı ve parola yönetmek kısa sürede dijital bir anahtarlık kâbusuna dönüşür. Keycloak, Authentik ve Authelia bu sorunu merkezi kimlik doğrulama, tek oturum açma ve erişim politikalarıyla çözer. Ancak üçü de aynı kapıyı korusa da farklı anahtarlar ve farklı güvenlik yaklaşımları kullanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kimlik-dogrulama-arenasi-17.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kimlik-dogrulama-arenasi-17.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Online Derleyici Motorları: Judge0, Piston ve Wandbox Karşılaştırması</title><link href="https://program.sonsuz.us/posts/online-derleyici-motorlari-judge0-piston-ve-wandbox-karsilastirmasi/" rel="alternate" type="text/html" title="Online Derleyici Motorları: Judge0, Piston ve Wandbox Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/online-derleyici-motorlari-judge0-piston-ve-wandbox-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/online-derleyici-motorlari-judge0-piston-ve-wandbox-karsilastirmasi/"><![CDATA[<p>Tarayıcıya birkaç satır kod yazıp saniyeler içinde sonucu görmek basit bir sihir numarası gibi görünür. Oysa perdenin arkasında derleyiciler, işlem kuyrukları, güvenlik katmanları ve kaynak sınırlamaları çalışır. Judge0, Piston ve Wandbox bu işi farklı önceliklerle çözen üç popüler sistemdir. Gelin kodlarımızın sunucuda çıktığı bu kısa ama maceralı yolculuğu inceleyelim.</p>

<p>``</p>

<h2 id="online-derleyici-nasıl-çalışır">Online derleyici nasıl çalışır?</h2>

<p>Bir online derleyici temel olarak kaynak kodunu ve kullanıcı girdisini alır, uygun çalışma ortamını seçer ve işlemi yalıtılmış bir alanda yürütür. Derlenen dillerde süreç genellikle şu şekildedir:</p>

\[T_{toplam} = T_{kuyruk} + T_{derleme} + T_{çalıştırma} + T_{iletişim}\]

<p>Python gibi yorumlanan dillerde derleme adımı görünür olmayabilir; ancak ortam hazırlama ve süreç başlatma maliyeti devam eder. Sistem, çalıştırma sonunda standart çıktıyı, standart hatayı, durum kodunu, süreyi ve bellek tüketimini döndürür.</p>

<p>Yalıtım kritik önemdedir. Kullanıcının gönderdiği kod sonsuz döngüye girebilir, dosya sistemini kurcalayabilir veya bir fork bombası başlatmayı deneyebilir. Bu nedenle container, namespace, cgroup, seccomp ve ayrıcalıksız kullanıcı gibi mekanizmalar kullanılır. Basitleştirilmiş bir kaynak koşulu şöyledir:</p>

\[CPU \leq C_{maks}, \quad RAM \leq M_{maks}, \quad T \leq T_{maks}\]

<p>Bu sınırlardan biri aşılırsa çalıştırma sonlandırılır. Kısacası sistem yalnızca kodu çalıştırmaz; ona güvenli bir oyun alanı da çizer.</p>

<h2 id="üç-sistemin-karakteri">Üç sistemin karakteri</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Judge0</th>
      <th>Piston</th>
      <th>Wandbox</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana yaklaşım</td>
      <td>Kod değerlendirme API’si</td>
      <td>Hafif çalıştırma motoru</td>
      <td>Çok sürümlü derleyici servisi</td>
    </tr>
    <tr>
      <td>Uygun kullanım</td>
      <td>Yarışma, ödev, test platformu</td>
      <td>Editör, bot, küçük servis</td>
      <td>Derleyici ve sürüm denemeleri</td>
    </tr>
    <tr>
      <td>Kendi sunucuna kurulum</td>
      <td>Güçlü ve yaygın seçenek</td>
      <td>Görece sade</td>
      <td>Mümkün, ancak daha özel amaçlı</td>
    </tr>
    <tr>
      <td>Sonuç modeli</td>
      <td>Durum ve kaynak ölçümleri ayrıntılı</td>
      <td>Basit çalıştırma sonucu</td>
      <td>Derleyici seçenekleri ayrıntılı</td>
    </tr>
    <tr>
      <td>Öne çıkan yön</td>
      <td>Kuyruk ve değerlendirme mantığı</td>
      <td>Temiz API ve pratiklik</td>
      <td>Derleyici sürümü çeşitliliği</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/online-derleyici-motorlari-70.svg" alt="online-derleyici-motorlari-70" /></p>

<h3 id="judge0">Judge0</h3>

<p>Judge0, özellikle otomatik değerlendirme sistemlerine yakışır. Bir gönderim oluşturur, dil kimliğini, kaynak kodunu ve girdiyi iletirsiniz. Sonucu eşzamanlı alabilir veya daha ölçeklenebilir biçimde bir token üzerinden sorgulayabilirsiniz. Zaman ve bellek sınırları, derleme çıktısı ve çalışma durumu gibi alanlar eğitim platformları için oldukça değerlidir.</p>

<h3 id="piston">Piston</h3>

<p>Piston, farklı dillerde kod çalıştırmayı anlaşılır bir HTTP API arkasında toplar. Dil paketleri ve sürümleri yönetilebilir; bu da onu web tabanlı editörler, Discord botları veya hızlı prototipler için çekici yapar. Judge0 kadar yarışma odaklı bir değerlendirme modeli sunmak yerine, “kodu ver, çıktıyı al” deneyimine yaklaşır.</p>

<p>Aşağıdaki JavaScript örneği, Piston uyumlu bir uç noktaya Python kodu gönderir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://example.com/api/v2/execute</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">POST</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">headers</span><span class="p">:</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span> <span class="p">},</span>
  <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">({</span>
    <span class="na">language</span><span class="p">:</span> <span class="dl">"</span><span class="s2">python</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">version</span><span class="p">:</span> <span class="dl">"</span><span class="s2">3.x</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">files</span><span class="p">:</span> <span class="p">[{</span> <span class="na">content</span><span class="p">:</span> <span class="dl">"</span><span class="s2">print(sum([4, 8, 15, 16, 23, 42]))</span><span class="dl">"</span> <span class="p">}]</span>
  <span class="p">})</span>
<span class="p">});</span>

<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">run</span><span class="p">.</span><span class="nx">stdout</span><span class="p">);</span>
</code></pre></div></div>

<p>Kod, çalıştırılacak dosyayı JSON gövdesine yerleştirir ve dönen standart çıktıyı gösterir. Gerçek sürüm değeri ile uç nokta, kullandığınız Piston kurulumundan sorgulanmalıdır.</p>

<h3 id="wandbox">Wandbox</h3>

<p>Wandbox özellikle C++ dünyasında farklı derleyicileri, sürümleri ve bayrakları karşılaştırırken parlar. Aynı kodu GCC ve Clang ile deneyip standart sürümünü değiştirmek, taşınabilirlik sorunlarını yakalamayı kolaylaştırır. Bu nedenle klasik bir sınav motorundan çok etkileşimli bir derleyici laboratuvarına benzer.</p>

<h2 id="hangisini-seçmelisiniz">Hangisini seçmelisiniz?</h2>

<p>Otomatik puanlama, test senaryoları ve ayrıntılı durum yönetimi istiyorsanız Judge0 güçlü adaydır. Küçük ve anlaşılır bir kod çalıştırma servisi arıyorsanız Piston daha rahat hissettirebilir. Derleyici sürümleri ve bayraklarla deney yapacaksanız Wandbox öne çıkar.</p>

<p>Hangi sistemi seçerseniz seçin API’yi doğrudan sınırsız biçimde internete açmayın. Kimlik doğrulama, istek kotası, çıktı boyutu sınırı, zaman aşımı ve düzenli imaj güncellemeleri ekleyin. Çünkü online derleyicide en zor soru “Kod çalıştı mı?” değil, “Kod çalışırken sunucu hâlâ güvende mi?” sorusudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="online derleyici" /><category term="judge0" /><category term="piston" /><category term="wandbox" /><category term="api" /><category term="sandbox" /><category term="programlama" /><summary type="html"><![CDATA[Tarayıcıya birkaç satır kod yazıp saniyeler içinde sonucu görmek basit bir sihir numarası gibi görünür. Oysa perdenin arkasında derleyiciler, işlem kuyrukları, güvenlik katmanları ve kaynak sınırlamaları çalışır. Judge0, Piston ve Wandbox bu işi farklı önceliklerle çözen üç popüler sistemdir. Gelin kodlarımızın sunucuda çıktığı bu kısa ama maceralı yolculuğu inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/online-derleyici-motorlari-70.png" /><media:content medium="image" url="https://program.sonsuz.us/img/online-derleyici-motorlari-70.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Şifre Kasası Seçimi: Bitwarden, Vaultwarden ve Passbolt Karşılaştırması</title><link href="https://program.sonsuz.us/posts/sifre-kasasi-secimi-bitwarden-vaultwarden-ve-passbolt-karsilastirmasi/" rel="alternate" type="text/html" title="Şifre Kasası Seçimi: Bitwarden, Vaultwarden ve Passbolt Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sifre-kasasi-secimi-bitwarden-vaultwarden-ve-passbolt-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/sifre-kasasi-secimi-bitwarden-vaultwarden-ve-passbolt-karsilastirmasi/"><![CDATA[<p><img src="/img/sifre-kasasi-secimi-59.svg" alt="sifre-kasasi-secimi-59" /></p>

<p>Her hesapta aynı parolayı kullanmak, bütün kapıları tek anahtarla kilitlemeye benzer: Anahtar ele geçirilirse mahallede açık kapı bırakmazsınız. Şifre yöneticileri; güçlü parolalar üretir, bunları şifreli bir kasada saklar ve cihazlar arasında eşitler. Peki popüler Bitwarden, hafifliğiyle öne çıkan Vaultwarden ve ekip odaklı Passbolt arasında nasıl seçim yapılır? Gelin dijital anahtarlığımızı masaya yatıralım.</p>

<p>``</p>

<h2 id="şifre-yöneticisinin-temel-mantığı">Şifre yöneticisinin temel mantığı</h2>

<p>Bir şifre yöneticisi, kayıtlarınızı ana paroladan türetilen bir anahtarla şifreler. Güvenilir sistemlerde sunucu kasanın açık hâlini veya ana parolayı bilmez; şifre çözme işlemi istemci cihazda gerçekleşir. Bu yaklaşım genellikle <strong>sıfır bilgi mimarisi</strong> olarak adlandırılır.</p>

<p>Rastgele üretilmiş bir parolanın teorik entropisi yaklaşık olarak şöyle hesaplanır:</p>

\[H = L \times \log_2(N)\]

<p>Burada $L$ parola uzunluğu, $N$ ise kullanılabilecek karakter sayısıdır. Örneğin 94 karakterlik bir kümeden üretilen 20 karakterli parola yaklaşık $20 \times \log_2(94) \approx 131$ bit entropiye sahiptir. İnsan zihninin ürettiği <code class="language-plaintext highlighter-rouge">Kedim123</code> benzeri parolalarda ise tahmin edilebilir kalıplar nedeniyle gerçek güvenlik çok daha düşüktür.</p>

<p>Ana parola güçlü ve benzersiz olmalı; ayrıca kasada <strong>iki faktörlü kimlik doğrulama</strong> etkinleştirilmelidir. Kasayı kendi sunucunuza kurmak kontrol sağlar, fakat bakım sorumluluğunu ortadan kaldırmaz.</p>

<h2 id="üç-çözümün-karşılaştırması">Üç çözümün karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Bitwarden</th>
      <th>Vaultwarden</th>
      <th>Passbolt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel hedef</td>
      <td>Bireysel ve kurumsal kullanım</td>
      <td>Hafif self-hosted kullanım</td>
      <td>Ekip içi parola paylaşımı</td>
    </tr>
    <tr>
      <td>Barındırma</td>
      <td>Resmî bulut veya self-hosted</td>
      <td>Self-hosted</td>
      <td>Bulut veya self-hosted</td>
    </tr>
    <tr>
      <td>Kaynak tüketimi</td>
      <td>Görece yüksek</td>
      <td>Genellikle düşük</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>İstemci ekosistemi</td>
      <td>Geniş</td>
      <td>Bitwarden istemcileriyle uyumlu</td>
      <td>Web ve tarayıcı ağırlıklı</td>
    </tr>
    <tr>
      <td>Paylaşım modeli</td>
      <td>Organizasyon ve koleksiyon</td>
      <td>Bitwarden modeline benzer</td>
      <td>Kullanıcı ve grup merkezli</td>
    </tr>
    <tr>
      <td>Öne çıkan yön</td>
      <td>Dengeli, kullanımı kolay</td>
      <td>Küçük sunucular için ekonomik</td>
      <td>Ayrıntılı ekip paylaşımı</td>
    </tr>
  </tbody>
</table>

<h3 id="bitwarden-güvenli-varsayılan-seçenek">Bitwarden: Güvenli varsayılan seçenek</h3>

<p>Bitwarden; mobil uygulamaları, tarayıcı eklentileri, masaüstü istemcileri ve komut satırı aracıyla eksiksiz bir ekosistem sunar. Teknik bakım yapmak istemeyen kullanıcılar resmî bulutu seçebilir. Kurumlar ise organizasyonlar, koleksiyonlar ve erişim politikalarıyla kayıtları yönetebilir.</p>

<p>Self-hosted kurulumu mümkündür; ancak resmî sunucu bileşenleri küçük bir ev sunucusu için ağır gelebilir. Buna karşılık resmî destek ve belgeler, kurumsal kullanımda önemli avantajdır.</p>

<h3 id="vaultwarden-küçük-sunucunun-çalışkan-cücesi">Vaultwarden: Küçük sunucunun çalışkan cücesi</h3>

<p>Vaultwarden, Bitwarden sunucu API’sinin topluluk tarafından geliştirilen ve Rust ile yazılan uyumlu bir uygulamasıdır. Resmî Bitwarden istemcileriyle çalışır ve düşük kaynak tüketimi sayesinde Raspberry Pi, mini PC veya uygun bir VPS üzerinde sıkça tercih edilir.</p>

<p>Basitleştirilmiş bir Docker Compose servisi şöyle tanımlanabilir:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">services</span><span class="pi">:</span>
  <span class="na">vaultwarden</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">vaultwarden/server:latest</span>
    <span class="na">restart</span><span class="pi">:</span> <span class="s">unless-stopped</span>
    <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">./vw-data:/data</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">127.0.0.1:8080:80</span>
</code></pre></div></div>

<p>Bu yapı verileri kalıcı dizinde tutar ve servisi yalnızca yerel arayüzde açar. Dış erişim için HTTPS sağlayan bir ters vekil, düzenli güncelleme ve şifreli yedekleme gerekir. Vaultwarden resmî Bitwarden sunucusu değildir; özellik uyumluluğu ve destek beklentisi buna göre değerlendirilmelidir.</p>

<h3 id="passbolt-takım-paylaşımının-uzmanı">Passbolt: Takım paylaşımının uzmanı</h3>

<p>Passbolt özellikle sistem yöneticileri, ajanslar ve geliştirici ekipleri için tasarlanmıştır. Kayıtların kullanıcı veya gruplarla kontrollü paylaşılması, erişimlerin kaldırılması ve değişikliklerin izlenmesi temel senaryolardır. OpenPGP tabanlı yaklaşımı nedeniyle anahtar yönetimi önemli bir rol oynar.</p>

<p>Kişisel otomatik doldurma deneyimi önceliğinizse Bitwarden ailesi daha doğal gelebilir. Çok sayıda çalışanın ortak altyapı parolalarına farklı yetkilerle erişmesi gerekiyorsa Passbolt daha anlamlıdır.</p>

<h2 id="hangisini-seçmelisiniz">Hangisini seçmelisiniz?</h2>

<p>Bakım istemeyen bireyler için <strong>Bitwarden bulutu</strong>, düşük kaynaklı kendi sunucusunu yönetecek meraklılar için <strong>Vaultwarden</strong>, ekip paylaşımını merkeze alan kuruluşlar için <strong>Passbolt</strong> güçlü adaylardır. Hangi aracı seçerseniz seçin; güçlü ana parola, MFA, HTTPS, güncelleme ve test edilmiş yedekler vazgeçilmezdir. Unutmayın: Self-hosted sistem otomatik olarak daha güvenli değil, yalnızca güvenlik sorumluluğunun adresi farklıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="şifre yöneticisi" /><category term="bitwarden" /><category term="vaultwarden" /><category term="passbolt" /><category term="siber güvenlik" /><category term="self-hosted" /><summary type="html"><![CDATA[Her hesapta aynı parolayı kullanmak, bütün kapıları tek anahtarla kilitlemeye benzer: Anahtar ele geçirilirse mahallede açık kapı bırakmazsınız. Şifre yöneticileri; güçlü parolalar üretir, bunları şifreli bir kasada saklar ve cihazlar arasında eşitler. Peki popüler Bitwarden, hafifliğiyle öne çıkan Vaultwarden ve ekip odaklı Passbolt arasında nasıl seçim yapılır? Gelin dijital anahtarlığımızı masaya yatıralım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sifre-kasasi-secimi-59.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sifre-kasasi-secimi-59.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Sunucuların Nabzını Tutmak: Zabbix, Nagios ve Checkmk Karşılaştırması</title><link href="https://program.sonsuz.us/posts/sunucularin-nabzini-tutmak-zabbix-nagios-ve-checkmk-karsilastirmasi/" rel="alternate" type="text/html" title="Sunucuların Nabzını Tutmak: Zabbix, Nagios ve Checkmk Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sunucularin-nabzini-tutmak-zabbix-nagios-ve-checkmk-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/sunucularin-nabzini-tutmak-zabbix-nagios-ve-checkmk-karsilastirmasi/"><![CDATA[<p><img src="/img/sunucularin-nabzini-tutmak-61.svg" alt="sunucularin-nabzini-tutmak-61" /></p>

<p>Bir sunucunun çalışıyor görünmesi, sağlıklı olduğu anlamına gelmez. İşlemci tavana vurmuş, disk dolmak üzere veya ağ gecikmesi kullanıcıları çileden çıkarıyor olabilir. Sunucu izleme sistemleri; altyapının nabzını ölçer, sorunları görünür hâle getirir ve gece telefonunuz çalmadan önce sizi uyarır. Bu alandaki üç güçlü seçenek Zabbix, Nagios ve Checkmk’tir.
``</p>
<h2 id="i̇zleme-sistemlerinin-temel-mantığı">İzleme sistemlerinin temel mantığı</h2>

<p>Bir izleme platformu belirli aralıklarla <strong>metrik</strong> toplar. CPU kullanımı, boş disk alanı, bellek tüketimi ve HTTP yanıt süresi bu metriklere örnektir. Toplanan değerler önceden belirlenmiş eşiklerle karşılaştırılır; şart sağlandığında olay oluşturulur ve bildirim gönderilir.</p>

<p>Basit bir CPU kullanım oranı şöyle hesaplanabilir:</p>

\[CPU\ Kullanımı\ (\%) = \frac{T_{toplam} - T_{boşta}}{T_{toplam}} \times 100\]

<p>Ancak tek bir yüksek ölçüm her zaman sorun değildir. Kısa süreli sıçramaları filtrelemek için hareketli ortalama kullanılabilir:</p>

\[\bar{x}_n = \frac{1}{n}\sum_{i=1}^{n}x_i\]

<p>Örneğin son beş ölçümün ortalaması yüzde 90’ı geçerse alarm üretmek, anlık bir yükselişte gereksiz bildirim almaktan daha mantıklıdır. Aksi hâlde izleme sistemi yardımcı olmak yerine dijital bir yangın alarmına dönüşür.</p>

<h2 id="üç-aracın-hızlı-karşılaştırması">Üç aracın hızlı karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Zabbix</th>
      <th>Nagios</th>
      <th>Checkmk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kurulum yaklaşımı</td>
      <td>Bütünleşik platform</td>
      <td>Çekirdek ve eklentiler</td>
      <td>Otomasyon odaklı platform</td>
    </tr>
    <tr>
      <td>Arayüz</td>
      <td>Modern ve kapsamlı</td>
      <td>Core sürümünde sınırlı</td>
      <td>Kullanıcı dostu</td>
    </tr>
    <tr>
      <td>Otomatik keşif</td>
      <td>Güçlü</td>
      <td>Ek yapılandırma gerekir</td>
      <td>Çok güçlü</td>
    </tr>
    <tr>
      <td>Ölçeklenebilirlik</td>
      <td>Yüksek</td>
      <td>Doğru mimariyle yüksek</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Öğrenme eğrisi</td>
      <td>Orta</td>
      <td>Orta-yüksek</td>
      <td>Düşük-orta</td>
    </tr>
    <tr>
      <td>En uygun kullanım</td>
      <td>Büyük ve karma altyapılar</td>
      <td>Özelleştirilmiş kontroller</td>
      <td>Hızlı devreye alma</td>
    </tr>
  </tbody>
</table>

<h2 id="zabbix-her-şey-tek-çatı-altında">Zabbix: Her şey tek çatı altında</h2>

<p>Zabbix; metrik toplama, grafik çizme, alarm üretme, otomatik keşif ve raporlama özelliklerini birlikte sunar. Agent kullanarak işletim sisteminden ayrıntılı veri alabilir; SNMP, IPMI, JMX ve HTTP kontrolleriyle farklı cihazları izleyebilir.</p>

<p>Linux sunucuya kurulan agent’ın temel durumunu şu komutlarla kontrol edebilirsiniz:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl <span class="nb">enable</span> <span class="nt">--now</span> zabbix-agent2
<span class="nb">sudo </span>systemctl status zabbix-agent2
</code></pre></div></div>

<p>İlk komut servisi başlatıp sistem açılışına ekler; ikincisi agent’ın düzgün çalışıp çalışmadığını gösterir. Zabbix özellikle merkezi gösterge panelleri ve geçmiş veriler üzerinden kapasite planlaması isteyen ekipler için başarılıdır.</p>

<h2 id="nagios-eklentilerle-büyüyen-klasik">Nagios: Eklentilerle büyüyen klasik</h2>

<p>Nagios, izleme dünyasının deneyimli ustasıdır. Temel felsefesi basittir: Bir eklenti kontrol gerçekleştirir ve durum kodu döndürür. <code class="language-plaintext highlighter-rouge">0</code> başarılı, <code class="language-plaintext highlighter-rouge">1</code> uyarı, <code class="language-plaintext highlighter-rouge">2</code> kritik, <code class="language-plaintext highlighter-rouge">3</code> ise bilinmeyen durum anlamına gelir.</p>

<p>Örneğin disk kullanımını denetleyen bir eklenti şöyle çağrılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/usr/lib/nagios/plugins/check_disk <span class="nt">-w</span> 20% <span class="nt">-c</span> 10% <span class="nt">-p</span> /
</code></pre></div></div>

<p>Bu kontrol, kök bölümde boş alan yüzde 20’nin altına inince uyarı, yüzde 10’un altına inince kritik durum üretir. Nagios son derece esnektir; ancak eklenti ve yapılandırma yönetimi büyüyen ortamlarda ciddi emek isteyebilir.</p>

<h2 id="checkmk-otomasyon-sevenlerin-seçeneği">Checkmk: Otomasyon sevenlerin seçeneği</h2>

<p>Checkmk, Nagios ekosisteminin kontrol mantığından yararlanırken keşif, yapılandırma ve görselleştirme süreçlerini kolaylaştırır. Tek bir agent çıktısından yüzlerce servisi otomatik keşfedebilir. Bu özellik, çok sayıda benzer sunucuyu yöneten ekiplerin tekrar eden işlerini azaltır.</p>

<p>Kural tabanlı yapılandırma sayesinde aynı disk eşiğini her sunucu için ayrı ayrı yazmak yerine sunucu gruplarına uygulayabilirsiniz. Raw Edition açık kaynak odaklıdır; Enterprise Edition ise daha gelişmiş performans ve kurumsal özellikler sunar.</p>

<h2 id="hangisini-seçmelisiniz">Hangisini seçmelisiniz?</h2>

<p>Hazır grafikler, geniş protokol desteği ve bütünleşik deneyim istiyorsanız <strong>Zabbix</strong> güçlü bir tercihtir. Kontrolleri tamamen özelleştirmek ve geniş eklenti ekosisteminden yararlanmak istiyorsanız <strong>Nagios</strong> uygundur. Hızlı keşif, kolay yönetim ve düşük operasyon yükü önceliğinizse <strong>Checkmk</strong> öne çıkar.</p>

<p>Son kararı özellik listesinden önce ekibinizin deneyimi, izlenecek cihaz sayısı ve alarm yönetimi ihtiyacı belirlemelidir. Çünkü en iyi izleme sistemi, en fazla grafiği çizen değil; doğru sorunu, doğru kişiye, doğru zamanda bildiren sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sunucu izleme" /><category term="zabbix" /><category term="nagios" /><category term="checkmk" /><category term="devops" /><category term="sistem yönetimi" /><summary type="html"><![CDATA[Bir sunucunun çalışıyor görünmesi, sağlıklı olduğu anlamına gelmez. İşlemci tavana vurmuş, disk dolmak üzere veya ağ gecikmesi kullanıcıları çileden çıkarıyor olabilir. Sunucu izleme sistemleri; altyapının nabzını ölçer, sorunları görünür hâle getirir ve gece telefonunuz çalmadan önce sizi uyarır. Bu alandaki üç güçlü seçenek Zabbix, Nagios ve Checkmk’tir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sunucularin-nabzini-tutmak-61.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sunucularin-nabzini-tutmak-61.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Uptime Takip Sistemi Kurmak: Uptime Kuma, Statping-ng ve Gatus Karşılaştırması</title><link href="https://program.sonsuz.us/posts/uptime-takip-sistemi-kurmak-uptime-kuma-statping-ng-ve-gatus-karsilastirmasi/" rel="alternate" type="text/html" title="Uptime Takip Sistemi Kurmak: Uptime Kuma, Statping-ng ve Gatus Karşılaştırması" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/uptime-takip-sistemi-kurmak-uptime-kuma-statping-ng-ve-gatus-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/uptime-takip-sistemi-kurmak-uptime-kuma-statping-ng-ve-gatus-karsilastirmasi/"><![CDATA[<p>Bir web sitesinin çalışıyor görünmesi, gerçekten sağlıklı olduğu anlamına gelmez. Ana sayfa açılırken ödeme API’si hata veriyor, DNS yanıtları gecikiyor veya TLS sertifikası sessizce sona yaklaşıyor olabilir. Uptime takip sistemleri; servisleri düzenli aralıklarla kontrol eder, sonuçları kaydeder ve sorun oluştuğunda ekibe bildirim gönderir. Bu yazıda popüler üç açık kaynak seçeneği, Uptime Kuma, Statping-ng ve Gatus üzerinden kendi gözetleme kulenizi kuracağız.</p>

<p><img src="/img/uptime-takip-sistemi-98.svg" alt="uptime-takip-sistemi-98" /></p>

<p>``</p>

<h2 id="uptime-ölçümü-nasıl-çalışır">Uptime ölçümü nasıl çalışır?</h2>

<p>Bir monitör, hedef servise belirli aralıklarla istek gönderir. HTTP kontrolünde durum kodu, yanıt süresi ve içerik doğrulanabilir. TCP kontrolü portun erişilebilirliğini, ICMP kontrolü ise sunucunun ağa yanıt verip vermediğini ölçer.</p>

<p>Belirli bir dönemde uptime oranı şu şekilde hesaplanır:</p>

\[Uptime\,(\%) = \frac{Toplam\ Süre - Kesinti\ Süresi}{Toplam\ Süre} \times 100\]

<p>Örneğin 30 günlük bir ayda 43 dakika kesinti yaşayan servisin erişilebilirliği yaklaşık $99{,}9\%$ olur. Kontrol aralığı da önemlidir: Beş dakikada bir yapılan kontrol, iki dakikalık kesintiyi hiç yakalamayabilir. Kısa aralıklar daha hassastır ancak daha fazla ağ trafiği ve kayıt üretir.</p>

<p>Sistemin yanlış alarm vermemesi için genellikle art arda birkaç başarısız kontrol beklenir. Üç denemeden sonra alarm üretmek, geçici paket kayıplarının gece yarısı telefonunuzu çaldırmasını önler.</p>

<h2 id="üç-aracın-kısa-karşılaştırması">Üç aracın kısa karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Uptime Kuma</th>
      <th>Statping-ng</th>
      <th>Gatus</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yapılandırma</td>
      <td>Web arayüzü</td>
      <td>Web arayüzü ve API</td>
      <td>YAML dosyası</td>
    </tr>
    <tr>
      <td>Kullanım kolaylığı</td>
      <td>Çok yüksek</td>
      <td>Yüksek</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Git ile yönetim</td>
      <td>Sınırlı</td>
      <td>Sınırlı</td>
      <td>Çok güçlü</td>
    </tr>
    <tr>
      <td>Durum sayfası</td>
      <td>Var</td>
      <td>Var</td>
      <td>Var</td>
    </tr>
    <tr>
      <td>İdeal kullanıcı</td>
      <td>Küçük ve orta ekip</td>
      <td>Durum sayfası isteyen ekip</td>
      <td>DevOps ve GitOps ekipleri</td>
    </tr>
  </tbody>
</table>

<p><strong>Uptime Kuma</strong>, şık paneli ve kolay kurulumu sayesinde hızlı başlangıç şampiyonudur. HTTP, TCP, DNS, ping ve Docker container kontrollerini destekler. Telegram, Slack, Discord ve e-posta gibi pek çok bildirim kanalı sunar.</p>

<p><strong>Statping-ng</strong>, servis takibiyle herkese açık durum sayfasını bir arada isteyenler için uygundur. Kullanıcılar planlı bakımları ve geçmiş olayları görebilir. Ancak proje sürümünü seçerken güncel bakım durumunu ve açık sorunları incelemek akıllıca olur.</p>

<p><strong>Gatus</strong>, arayüzde tıklamak yerine yapılandırmayı kod olarak saklar. Pull request ile kontrol eklemek, değişiklik geçmişini görmek ve aynı ayarı farklı ortamlara taşımak isteyen ekiplerin gözdesidir.</p>

<h2 id="uptime-kuma-kurulumu">Uptime Kuma kurulumu</h2>

<p>Docker ile birkaç dakikada çalışan bir sistem oluşturabiliriz:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">services</span><span class="pi">:</span>
  <span class="na">uptime-kuma</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">louislam/uptime-kuma:1</span>
    <span class="na">container_name</span><span class="pi">:</span> <span class="s">uptime-kuma</span>
    <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">./kuma-data:/app/data</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">3001:3001"</span>
    <span class="na">restart</span><span class="pi">:</span> <span class="s">unless-stopped</span>
</code></pre></div></div>

<p>Bu dosya verileri <code class="language-plaintext highlighter-rouge">kuma-data</code> dizininde kalıcı tutar ve paneli 3001 numaralı porttan yayımlar. <code class="language-plaintext highlighter-rouge">docker compose up -d</code> komutundan sonra paneli açıp yönetici hesabı oluşturabilir, ardından “Add New Monitor” üzerinden hedeflerinizi ekleyebilirsiniz. İnternete açarken ters proxy, HTTPS ve güçlü kimlik doğrulama kullanmayı unutmayın.</p>

<h2 id="gatus-ile-yapılandırma-tabanlı-takip">Gatus ile yapılandırma tabanlı takip</h2>

<p>Aşağıdaki örnek, API’nin hem başarılı durum kodu döndürmesini hem de 500 milisaniyeden hızlı yanıt vermesini bekler:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">endpoints</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">production-api</span>
    <span class="na">group</span><span class="pi">:</span> <span class="s">backend</span>
    <span class="na">url</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://api.example.com/health"</span>
    <span class="na">interval</span><span class="pi">:</span> <span class="s">30s</span>
    <span class="na">conditions</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">[STATUS]</span><span class="nv"> </span><span class="s">==</span><span class="nv"> </span><span class="s">200"</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">[RESPONSE_TIME]</span><span class="nv"> </span><span class="s">&lt;</span><span class="nv"> </span><span class="s">500"</span>
</code></pre></div></div>

<p>Bu yaklaşımda sağlık şartları açıkça belgelenir. Dosyayı Git deposuna koyarak yapılan her eşik değişikliğini inceleyebilirsiniz. Gatus ayrıca yanıt gövdesi, sertifika süresi ve DNS gibi kontrolleri de koşullara bağlayabilir.</p>

<h2 id="hangisini-seçmelisiniz">Hangisini seçmelisiniz?</h2>

<p>Ev laboratuvarı, kişisel projeler veya hızlı kurulum için <strong>Uptime Kuma</strong> en pratik seçimdir. Markalı ve ziyaretçilere yönelik bir durum sayfası öncelikliyse <strong>Statping-ng</strong> değerlendirilebilir. Altyapınız GitOps mantığıyla yönetiliyor ve kontrollerin kod incelemesinden geçmesini istiyorsanız <strong>Gatus</strong> daha doğal hissettirir.</p>

<p>Hangi aracı seçerseniz seçin, takip sistemini izlediği sunucudan farklı bir makinede çalıştırın. Aksi hâlde sunucu çöktüğünde hem uygulama hem de alarm mekanizması ortadan kaybolur; dijital bekçi de bina ile birlikte uykuya dalar!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="uptime" /><category term="monitoring" /><category term="devops" /><category term="uptime-kuma" /><category term="statping-ng" /><category term="gatus" /><summary type="html"><![CDATA[Bir web sitesinin çalışıyor görünmesi, gerçekten sağlıklı olduğu anlamına gelmez. Ana sayfa açılırken ödeme API’si hata veriyor, DNS yanıtları gecikiyor veya TLS sertifikası sessizce sona yaklaşıyor olabilir. Uptime takip sistemleri; servisleri düzenli aralıklarla kontrol eder, sonuçları kaydeder ve sorun oluştuğunda ekibe bildirim gönderir. Bu yazıda popüler üç açık kaynak seçeneği, Uptime Kuma, Statping-ng ve Gatus üzerinden kendi gözetleme kulenizi kuracağız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/uptime-takip-sistemi-98.png" /><media:content medium="image" url="https://program.sonsuz.us/img/uptime-takip-sistemi-98.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>