{"id":43758,"date":"2026-08-01T09:12:46","date_gmt":"2026-08-01T06:12:46","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/"},"modified":"2026-08-01T09:12:46","modified_gmt":"2026-08-01T06:12:46","slug":"kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/","title":{"rendered":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc"},"content":{"rendered":"<h2>Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc<\/h2>\n<p>Dijital d\u00fcnyada ki\u015fisel veya kurumsal bir varl\u0131k olu\u015fturman\u0131n en etkili yollar\u0131ndan biri blog yazmakt\u0131r. Ancak i\u00e7erik \u00fcretmek kadar, bu i\u00e7eri\u011fi h\u0131zl\u0131, g\u00fcvenli ve verimli bir \u015fekilde yay\u0131nlamak da b\u00fcy\u00fck bir zorluk te\u015fkil edebilir. Manuel yay\u0131nlama s\u00fcre\u00e7leri, hem zaman al\u0131c\u0131 hem de hata yapmaya a\u00e7\u0131k oldu\u011fundan, otomasyon ihtiyac\u0131 ka\u00e7\u0131n\u0131lmaz hale gelir. \u0130\u015fte bu noktada, kendi \u00f6zel i\u00e7erik yay\u0131nlama sunucumu (My Custom Publisher &#8211; MCP) geli\u015ftirme ser\u00fcvenim ba\u015flad\u0131. Bu makalede, bir Git deposundaki Markdown dosyalar\u0131n\u0131 al\u0131p, statik bir site jenerat\u00f6r\u00fc arac\u0131l\u0131\u011f\u0131yla HTML&#8217;e d\u00f6n\u00fc\u015ft\u00fcrerek otomatik olarak bir web sunucusuna da\u011f\u0131tan bir sistemi nas\u0131l kurdu\u011fumu, bu s\u00fcre\u00e7te kar\u015f\u0131la\u015ft\u0131\u011f\u0131m zorluklar\u0131 ve onlarla nas\u0131l ba\u015fa \u00e7\u0131kt\u0131\u011f\u0131m\u0131 ad\u0131m ad\u0131m anlataca\u011f\u0131m. Amac\u0131m, hem kendi yay\u0131nlama s\u00fcre\u00e7lerimi optimize etmek hem de benzer bir ihtiyac\u0131 olan geli\u015ftiricilere yol g\u00f6stermekti.<\/p>\n<h3>Neden Kendi Blog Yay\u0131nlama Sunucuma \u0130htiya\u00e7 Duydum?<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde bir\u00e7ok pop\u00fcler blog platformu (WordPress, Medium, Blogger vb.) mevcut. Bunlar, h\u0131zl\u0131 ba\u015flang\u0131\u00e7 yapma ve teknik bilgi gerektirmeden i\u00e7erik yay\u0131nlama konusunda b\u00fcy\u00fck kolayl\u0131klar sunar. Ancak, bu platformlar\u0131n getirdi\u011fi baz\u0131 k\u0131s\u0131tlamalar, \u00f6zellikle benim gibi tam kontrol ve esneklik arayan geli\u015ftiriciler i\u00e7in yetersiz kalabilir. Mevcut platformlar genellikle belirli bir tasar\u0131ma, eklenti ekleme s\u0131n\u0131rlamalar\u0131na ve veri sahipli\u011fi konusunda soru i\u015faretlerine sahiptir. Kendi i\u00e7erik stratejimi, performans beklentilerimi ve g\u00fcvenlik standartlar\u0131m\u0131 tam olarak kar\u015f\u0131layacak bir \u00e7\u00f6z\u00fcme ihtiyac\u0131m vard\u0131.<\/p>\n<p>Statik site jenerat\u00f6rleri (Jekyll, Hugo, Gatsby gibi), bu k\u0131s\u0131tlamalar\u0131n \u00e7o\u011funu ortadan kald\u0131r\u0131yor. Markdown gibi basit metin formatlar\u0131nda i\u00e7erik yazma imkan\u0131 sunarken, bu i\u00e7erikleri h\u0131zl\u0131 ve g\u00fcvenli statik HTML dosyalar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcyorlar. Bu sayede, sunucu taraf\u0131nda veritaban\u0131 veya karma\u015f\u0131k bir uygulama katman\u0131 olmad\u0131\u011f\u0131 i\u00e7in g\u00fcvenlik a\u00e7\u0131klar\u0131 azal\u0131yor ve sayfa y\u00fckleme h\u0131zlar\u0131 inan\u0131lmaz derecede art\u0131yor. Ancak statik site jenerat\u00f6rlerini kullanman\u0131n da kendine g\u00f6re bir zahmeti var: Her i\u00e7erik g\u00fcncellemesinde, jenerat\u00f6r\u00fc \u00e7al\u0131\u015ft\u0131rman\u0131z, dosyalar\u0131 derlemeniz ve ard\u0131ndan bunlar\u0131 bir web sunucusuna (genellikle SSH veya FTP arac\u0131l\u0131\u011f\u0131yla) manuel olarak y\u00fcklemeniz gerekiyor. Birka\u00e7 blog yaz\u0131s\u0131 i\u00e7in bu kabul edilebilir olsa da, d\u00fczenli olarak i\u00e7erik yay\u0131nlad\u0131\u011f\u0131n\u0131zda bu tekrarlayan ve zaman al\u0131c\u0131 bir g\u00f6reve d\u00f6n\u00fc\u015f\u00fcyor. \u0130\u015fte tam da bu noktada, bir otomasyon \u00e7\u00f6z\u00fcm\u00fc geli\u015ftirmek ka\u00e7\u0131n\u0131lmaz hale geldi. Amac\u0131m, sadece bir <span class=\"code-inline\">git push<\/span> komutuyla, yeni blog yaz\u0131lar\u0131m\u0131n veya g\u00fcncellemelerimin saniyeler i\u00e7inde yay\u0131nda olmas\u0131n\u0131 sa\u011flamakt\u0131. Bu vizyon, beni kendi \u00f6zel yay\u0131nlama sunucumu, yani MCP sunucumu in\u015fa etmeye itti.<\/p>\n<p>Bu otomasyon, sadece zaman tasarrufu sa\u011flamakla kalmayacak, ayn\u0131 zamanda insan hatas\u0131 riskini de minimize edecekti. Manuel dosya transferlerinde yanl\u0131\u015f dizine kopyalama, eski dosyalar\u0131 unutma veya izin hatalar\u0131 gibi sorunlar s\u0131k\u00e7a ya\u015fanabilir. Otomatik bir sistemle, bu t\u00fcr hatalar\u0131n \u00f6n\u00fcne ge\u00e7mek ve yay\u0131nlama s\u00fcrecini standartla\u015ft\u0131rmak m\u00fcmk\u00fcnd\u00fc. Ayr\u0131ca, kendi sunucumu kurmak, hangi programlama dillerini ve ara\u00e7lar\u0131n\u0131 kullanaca\u011f\u0131m konusunda bana tam bir \u00f6zg\u00fcrl\u00fck tan\u0131yordu. B\u00f6ylece, en iyi bildi\u011fim ve en verimli \u00e7al\u0131\u015ft\u0131\u011f\u0131m teknolojileri kullanarak, tamamen kendi ihtiya\u00e7lar\u0131ma g\u00f6re \u015fekillendirilmi\u015f bir \u00e7\u00f6z\u00fcm ortaya \u00e7\u0131karabilirdim. Bu, sadece bir blog yay\u0131nlama arac\u0131 de\u011fil, ayn\u0131 zamanda bir \u00f6\u011frenme ve geli\u015ftirme projesi olacakt\u0131.<\/p>\n<h3>MCP Sunucusu Nedir ve Temel Mimari Tasar\u0131m\u0131 Nas\u0131l Yap\u0131ld\u0131?<\/h3>\n<p>MCP, bu makale \u00f6zelinde geli\u015ftirdi\u011fim &#8220;My Custom Publisher&#8221; (Kendi \u00d6zel Yay\u0131nlay\u0131c\u0131m) sunucusunun k\u0131saltmas\u0131d\u0131r. Temel amac\u0131, bir Git deposundaki (\u00f6rne\u011fin GitHub veya GitLab) de\u011fi\u015fiklikleri otomatik olarak alg\u0131lamak, bu de\u011fi\u015fiklikleri kullanarak statik bir web sitesi olu\u015fturmak ve son olarak bu siteyi bir web sunucusuna da\u011f\u0131tmakt\u0131r. Bu sistem, bir nevi ki\u015fisel ve hafif bir s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) hatt\u0131 g\u00f6revi g\u00f6r\u00fcr. Projenin kalbinde, Git entegrasyonu, bir webhook dinleyicisi ve statik site jenerat\u00f6r\u00fc ile sorunsuz bir etkile\u015fim yatar.<\/p>\n<p>MCP sunucusunun mimarisini tasarlarken, esneklik, g\u00fcvenilirlik ve d\u00fc\u015f\u00fck bak\u0131m maliyeti \u00f6nceliklerim aras\u0131ndayd\u0131. Bu hedefler do\u011frultusunda, a\u015fa\u011f\u0131daki ana bile\u015fenlerden olu\u015fan bir yap\u0131 olu\u015fturmaya karar verdim:<\/p>\n<ul>\n<li><strong>Git Deposu:<\/strong> Blog yaz\u0131lar\u0131m\u0131n ve web sitesi kaynak kodunun bulundu\u011fu merkezi bir depo. GitHub veya GitLab gibi platformlar bu ama\u00e7 i\u00e7in idealdir, \u00e7\u00fcnk\u00fc webhook (web kancas\u0131) \u00f6zelli\u011fini desteklerler.<\/li>\n<li><strong>Webhook Dinleyicisi (MCP Sunucusu):<\/strong> Bu, Node.js ve Express.js (veya Python ve Flask) ile yaz\u0131lm\u0131\u015f k\u00fc\u00e7\u00fck bir web uygulamas\u0131d\u0131r. Git deposunda bir de\u011fi\u015fiklik (\u00f6rne\u011fin bir <span class=\"code-inline\">git push<\/span>) oldu\u011funda, Git platformu bu sunucuya \u00f6nceden tan\u0131mlanm\u0131\u015f bir URL \u00fczerinden bir HTTP POST iste\u011fi (webhook) g\u00f6nderir. MCP sunucusu bu iste\u011fi dinler ve gerekli aksiyonlar\u0131 tetikler.<\/li>\n<li><strong>Statik Site Jenerat\u00f6r\u00fc:<\/strong> Markdown format\u0131ndaki blog yaz\u0131lar\u0131n\u0131 ve \u015fablon dosyalar\u0131n\u0131 alarak nihai statik HTML, CSS ve JavaScript dosyalar\u0131n\u0131 \u00fcreten ara\u00e7. Ben Hugo&#8217;yu tercih ettim \u00e7\u00fcnk\u00fc h\u0131z\u0131, esnekli\u011fi ve geni\u015f topluluk deste\u011fi beni etkiledi.<\/li>\n<li><strong>Hedef Web Sunucusu:<\/strong> Olu\u015fturulan statik dosyalar\u0131n bar\u0131nd\u0131r\u0131laca\u011f\u0131 ve son kullan\u0131c\u0131lara sunulaca\u011f\u0131 Nginx veya Apache gibi bir web sunucusu.<\/li>\n<li><strong>Dosya Senkronizasyon Mekanizmas\u0131:<\/strong> Statik site jenerat\u00f6r\u00fc taraf\u0131ndan \u00fcretilen dosyalar\u0131, hedef web sunucusunun servis etti\u011fi dizine kopyalamak i\u00e7in kullan\u0131lan bir ara\u00e7 (\u00f6rne\u011fin <span class=\"code-inline\">rsync<\/span> veya basit <span class=\"code-inline\">cp<\/span> komutlar\u0131).<\/li>\n<\/ul>\n<p>Bu bile\u015fenler aras\u0131ndaki ileti\u015fim ak\u0131\u015f\u0131 \u015fu \u015fekilde i\u015fler:<\/p>\n<ol>\n<li>Blog yazar\u0131, yeni bir blog yaz\u0131s\u0131n\u0131 Markdown format\u0131nda yazar veya mevcut bir yaz\u0131y\u0131 g\u00fcnceller.<\/li>\n<li>De\u011fi\u015fiklikler Git deposuna <span class=\"code-inline\">git push<\/span> ile g\u00f6nderilir.<\/li>\n<li>Git platformu (GitHub\/GitLab), \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f MCP sunucusunun webhook URL&#8217;ine bir POST iste\u011fi g\u00f6nderir.<\/li>\n<li>MCP sunucusu bu iste\u011fi al\u0131r, iste\u011fin ge\u00e7erlili\u011fini kontrol eder (g\u00fcvenlik i\u00e7in) ve bir dizi komut \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li>Bu komutlar s\u0131ras\u0131yla: Git deposundaki en son de\u011fi\u015fiklikleri sunucuya \u00e7eker (<span class=\"code-inline\">git pull<\/span>), statik site jenerat\u00f6r\u00fcn\u00fc (Hugo) \u00e7al\u0131\u015ft\u0131rarak web sitesini yeniden derler, ve son olarak derlenen dosyalar\u0131 hedef web sunucusunun dizinine kopyalar.<\/li>\n<li>Kullan\u0131c\u0131lar, web sunucusu \u00fczerinden g\u00fcncellenmi\u015f blog i\u00e7eri\u011fine an\u0131nda eri\u015febilir.<\/li>\n<\/ol>\n<p>Bu mimari, manuel m\u00fcdahaleyi minimuma indirerek, i\u00e7erik yay\u0131nlama s\u00fcrecini son derece verimli ve hatas\u0131z hale getirmeyi ama\u00e7lar. Node.js&#8217;i tercih etmemin nedeni, asenkron yap\u0131s\u0131yla e\u015f zamanl\u0131 i\u015flemleri kolayca y\u00f6netebilmesi ve geni\u015f bir paket ekosistemine sahip olmas\u0131yd\u0131. Bu sayede, webhook i\u015fleme, komut \u00e7al\u0131\u015ft\u0131rma ve hata y\u00f6netimi gibi g\u00f6revleri etkili bir \u015fekilde yerine getirebildim. Ayr\u0131ca, bu yakla\u015f\u0131m, sistemin \u00f6l\u00e7eklenebilirli\u011fini de art\u0131r\u0131r; gelecekte daha fazla blog veya statik site eklemek istedi\u011fimde, mevcut altyap\u0131y\u0131 kolayca geni\u015fletebilirim.<\/p>\n<h3>Ad\u0131m Ad\u0131m Kurulum ve \u0130lk Geli\u015ftirme S\u00fcreci<\/h3>\n<p>MCP sunucusunu hayata ge\u00e7irmek i\u00e7in ilk ad\u0131m, uygun bir sunucu ortam\u0131 haz\u0131rlamakt\u0131. Genellikle sanal bir \u00f6zel sunucu (VPS) veya kendi yerel makinenizde bir Linux da\u011f\u0131t\u0131m\u0131 (Ubuntu, Debian) bu i\u015f i\u00e7in yeterli olacakt\u0131r. Benim tercihim, maliyet etkinli\u011fi ve esnekli\u011fi nedeniyle bir bulut tabanl\u0131 VPS oldu. Kurulum s\u00fcreci a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7eriyordu:<\/p>\n<ol>\n<li><strong>Sunucu Ortam\u0131 Haz\u0131rl\u0131\u011f\u0131:<\/strong>\n<ul>\n<li>\u0130\u015fletim sistemi olarak Ubuntu 20.04 LTS kurdum.<\/li>\n<li>Gerekli temel paketleri g\u00fcncelledim: <span class=\"code-inline\">sudo apt update &#038;&#038; sudo apt upgrade<\/span>.<\/li>\n<li>Node.js ve npm&#8217;i kurdum. Bu, webhook dinleyicisini geli\u015ftirmek i\u00e7in gerekliydi. <span class=\"code-inline\">curl -fsSL https:\/\/deb.nodesource.com\/setup_18.x | sudo -E bash &#8211; &#038;&#038; sudo apt install -y nodejs<\/span>.<\/li>\n<li>Git&#8217;i kurdum: <span class=\"code-inline\">sudo apt install git<\/span>.<\/li>\n<li>Statik site jenerat\u00f6r\u00fc olarak Hugo&#8217;yu kurdum. Hugo&#8217;nun son s\u00fcr\u00fcm\u00fcn\u00fc GitHub \u00fczerinden indirip <span class=\"code-inline\">\/usr\/local\/bin<\/span> dizinine kopyalad\u0131m.<\/li>\n<li>Nginx web sunucusunu kurdum ve temel bir yap\u0131land\u0131rma yapt\u0131m: <span class=\"code-inline\">sudo apt install nginx<\/span>. Blog dosyalar\u0131n\u0131n servis edilece\u011fi dizini (<span class=\"code-inline\">\/var\/www\/blog<\/span> gibi) olu\u015fturdum ve Nginx&#8217;in bu dizini g\u00f6stermesini sa\u011flad\u0131m.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Temel Sunucu \u0130skeleti (Node.js ile):<\/strong>\n<p>Bir Node.js projesi ba\u015flatt\u0131m ve <span class=\"code-inline\">express<\/span> ile <span class=\"code-inline\">body-parser<\/span> paketlerini kurdum. Bu paketler, gelen HTTP isteklerini y\u00f6netmek ve JSON g\u00f6vdelerini ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lacakt\u0131.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        \/\/ server.js\n        const express = require('express');\n        const bodyParser = require('body-parser');\n        const { exec } = require('child_process'); \/\/ Harici komutlar\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in\n        const app = express();\n        const port = 3000; \/\/ MCP sunucusu bu portta dinleyecek\n\n        \/\/ Gelen JSON isteklerini ayr\u0131\u015ft\u0131rmak i\u00e7in\n        app.use(bodyParser.json());\n\n        \/\/ Ana dizine basit bir GET iste\u011fi ile sunucunun \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol edelim\n        app.get('\/', (req, res) => {\n          res.send('MCP Sunucusu aktif ve bekliyor...');\n        });\n\n        \/\/ Webhook endpoint'i\n        app.post('\/webhook', (req, res) => {\n          console.log('Webhook tetiklendi!');\n          \/\/ Burada Git platformundan gelen iste\u011fi do\u011frulamak i\u00e7in g\u00fcvenlik kontrolleri yap\u0131labilir.\n          \/\/ \u00d6rne\u011fin, req.headers['x-github-event'] veya req.headers['x-gitlab-event'] kontrol edilebilir.\n\n          \/\/ Blog deposunun bulundu\u011fu dizine ge\u00e7i\u015f yapal\u0131m\n          const blogRepoPath = '\/home\/user\/my-blog-repo'; \/\/ Kendi Git deponuzun yolu\n          const publishPath = '\/var\/www\/blog'; \/\/ Nginx'in blogu servis etti\u011fi yol\n\n          exec(<code>cd ${blogRepoPath} &amp;&amp; git pull origin main &amp;&amp; hugo --minify -d ${publishPath}<\/code>, (error, stdout, stderr) => {\n            if (error) {\n              console.error(<code>Yay\u0131nlama hatas\u0131: ${error.message}<\/code>);\n              return res.status(500).send('Yay\u0131nlama ba\u015far\u0131s\u0131z. Detaylar i\u00e7in sunucu loglar\u0131na bak\u0131n.');\n            }\n            if (stderr) {\n              console.error(<code>Stderr: ${stderr}<\/code>);\n            }\n            console.log(<code>Stdout: ${stdout}<\/code>);\n            res.status(200).send('Blog ba\u015far\u0131yla yay\u0131nland\u0131!');\n          });\n        });\n\n        app.listen(port, () => {\n          console.log(<code>MCP Sunucusu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor<\/code>);\n        });\n              <\/code><\/pre>\n<\/p><\/div>\n<p>Yukar\u0131daki kod, basit bir webhook dinleyicisi olu\u015fturur. <span class=\"code-inline\">\/webhook<\/span> adresine POST iste\u011fi geldi\u011finde, <span class=\"code-inline\">git pull<\/span> ile depoyu g\u00fcnceller ve <span class=\"code-inline\">hugo &#8211;minify -d ${publishPath}<\/span> komutuyla Hugo&#8217;yu \u00e7al\u0131\u015ft\u0131rarak statik dosyalar\u0131 do\u011frudan Nginx&#8217;in servis etti\u011fi <span class=\"code-inline\">\/var\/www\/blog<\/span> dizinine derler. Bu, <span class=\"code-inline\">rsync<\/span> kullanmaktan daha do\u011frudan bir yakla\u015f\u0131md\u0131r, ancak Hugo&#8217;nun \u00e7\u0131k\u0131\u015f dizinini do\u011frudan hedef olarak ayarlaman\u0131z\u0131 gerektirir.<\/p>\n<\/li>\n<li><strong>Git Deposu ve Webhook Kurulumu:<\/strong>\n<p>Blog kaynak kodumun bulundu\u011fu Git deposunu sunucuya klonlad\u0131m: <span class=\"code-inline\">git clone https:\/\/github.com\/myuser\/my-blog-repo.git \/home\/user\/my-blog-repo<\/span>. Daha sonra, GitHub veya GitLab aray\u00fcz\u00fcnden, projenin &#8220;Settings&#8221; (Ayarlar) b\u00f6l\u00fcm\u00fcndeki &#8220;Webhooks&#8221; k\u0131sm\u0131na giderek yeni bir webhook ekledim. Payload URL olarak <span class=\"code-inline\">http:\/\/your_server_ip:3000\/webhook<\/span> adresini girdim ve tetikleyici olarak sadece &#8220;Push events&#8221; (G\u00f6nderme olaylar\u0131) se\u00e7ene\u011fini i\u015faretledim. G\u00fcvenlik i\u00e7in bir &#8220;Secret&#8221; (Gizli anahtar) belirlemeyi de unutmad\u0131m, bu konuya daha sonra de\u011finece\u011fim.<\/p>\n<\/li>\n<li><strong>MCP Sunucusunu Arka Planda \u00c7al\u0131\u015ft\u0131rma:<\/strong>\n<p>MCP sunucusunun s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda kalmas\u0131 i\u00e7in <span class=\"code-inline\">pm2<\/span> gibi bir s\u00fcre\u00e7 y\u00f6neticisi kulland\u0131m: <span class=\"code-inline\">npm install -g pm2<\/span> ve ard\u0131ndan <span class=\"code-inline\">pm2 start server.js<\/span>. Bu, sunucunun \u00e7\u00f6kmesi durumunda otomatik olarak yeniden ba\u015flamas\u0131n\u0131 da sa\u011flar.<\/p>\n<\/li>\n<\/ol>\n<p>Bu ad\u0131mlarla, temel bir otomasyon ak\u0131\u015f\u0131 kurulmu\u015f oldu. Art\u0131k, Git deposuna yeni bir blog yaz\u0131s\u0131 g\u00f6nderdi\u011fimde, webhook tetiklenecek ve sunucum otomatik olarak blogumu g\u00fcncelleyecekti. Ancak, her projede oldu\u011fu gibi, bu ilk kurulum s\u00fcrecinde de \u00e7e\u015fitli zorluklarla kar\u015f\u0131la\u015ft\u0131m ve hata ay\u0131klama s\u00fcre\u00e7leri ka\u00e7\u0131n\u0131lmaz oldu.<\/p>\n<h3>Kar\u015f\u0131la\u015f\u0131lan \u0130lk Zorluklar ve Hata Ay\u0131klama Stratejileri<\/h3>\n<p>Her geli\u015ftirme projesi gibi, MCP sunucusu kurulumu da beklenmedik sorunlarla doluydu. \u0130lk ba\u015far\u0131l\u0131 <span class=\"code-inline\">git push<\/span> denememde blogumun otomatik olarak g\u00fcncellenmemesi, beni bir hata ay\u0131klama maratonuna s\u00fcr\u00fckledi. \u0130\u015fte kar\u015f\u0131la\u015ft\u0131\u011f\u0131m ba\u015fl\u0131ca zorluklar ve bunlar\u0131 a\u015fmak i\u00e7in kulland\u0131\u011f\u0131m stratejiler:<\/p>\n<ul>\n<li>\n<h4>Webhook Tetikleme Sorunlar\u0131 ve G\u00fcvenlik Do\u011frulamas\u0131<\/h4>\n<p>\u0130lk ba\u015fta, Git platformundan gelen webhook&#8217;lar\u0131n sunucuma ula\u015f\u0131p ula\u015fmad\u0131\u011f\u0131ndan emin olamad\u0131m. Bazen, webhook&#8217;lar hi\u00e7 tetiklenmiyor ya da sunucuya ula\u015ft\u0131\u011f\u0131nda do\u011fru \u015fekilde i\u015flenmiyordu. Bu sorunu \u00e7\u00f6zmek i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izledim:<\/p>\n<ul>\n<li><strong>Loglama:<\/strong> \u0130lk olarak, MCP sunucuma gelen her iste\u011fi ve \u00f6zellikle <span class=\"code-inline\">\/webhook<\/span> endpoint&#8217;ine gelen isteklerin ba\u015fl\u0131klar\u0131n\u0131 ve g\u00f6vdesini loglad\u0131m. Bu sayede, iste\u011fin gelip gelmedi\u011fini ve i\u00e7eri\u011fini g\u00f6rebildim.<\/li>\n<li><strong>G\u00fcvenlik Anahtar\u0131 (Secret):<\/strong> Git platformlar\u0131, webhook isteklerinin ger\u00e7ekten kendilerinden geldi\u011fini do\u011frulamak i\u00e7in bir &#8220;secret&#8221; (gizli anahtar) kullan\u0131r. Bu anahtar ile istek g\u00f6vdesinden bir hash (karma) hesaplan\u0131r ve iste\u011fin ba\u015fl\u0131\u011f\u0131ndaki imza ile kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r. \u0130lk kodumda bu kontrol eksikti. Bu nedenle, rastgele gelen veya k\u00f6t\u00fc niyetli istekler de sunucumu tetikleyebilirdi. Bu kontrol\u00fc eklemek, hem g\u00fcvenli\u011fi art\u0131rd\u0131 hem de sadece yetkili webhook&#8217;lar\u0131n i\u015flenmesini sa\u011flad\u0131.\n<div class=\"code-container\">\n<pre><code>\n        const crypto = require('crypto');\n        \/\/ ... di\u011fer kodlar ...\n\n        app.post('\/webhook', (req, res) => {\n          const signature = req.headers['x-hub-signature-256'] || req.headers['x-gitlab-token'];\n          const secret = process.env.WEBHOOK_SECRET; \/\/ Ortam de\u011fi\u015fkeninden al\u0131nmal\u0131\n\n          if (!signature || !secret) {\n            console.warn('Webhook g\u00fcvenlik anahtar\u0131 veya imza eksik.');\n            return res.status(403).send('Yetkilendirme ba\u015far\u0131s\u0131z.');\n          }\n\n          const hmac = crypto.createHmac('sha256', secret);\n          const digest = 'sha256=' + hmac.update(JSON.stringify(req.body)).digest('hex');\n\n          if (digest !== signature) {\n            console.warn('Webhook imza do\u011frulama hatas\u0131.');\n            return res.status(403).send('Webhook imza do\u011frulamas\u0131 ba\u015far\u0131s\u0131z.');\n          }\n\n          console.log('Webhook ba\u015far\u0131yla do\u011fruland\u0131.');\n          \/\/ ... yay\u0131nlama komutlar\u0131 ...\n        });\n                      <\/code><\/pre>\n<\/p><\/div>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4>Dosya \u0130zinleri ve Kullan\u0131c\u0131 Yetkilendirmesi<\/h4>\n<p>En s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlardan biri, sunucunun Git deposunu \u00e7ekmek ve hedef dizine dosya yazmak i\u00e7in yeterli yetkiye sahip olmamas\u0131yd\u0131. <span class=\"code-inline\">exec<\/span> komutlar\u0131 genellikle sunucuyu \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015f\u0131r. E\u011fer MCP sunucusunu <span class=\"code-inline\">root<\/span> olmayan bir kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131yorsan\u0131z (ki bu en iyi g\u00fcvenlik uygulamas\u0131d\u0131r), o kullan\u0131c\u0131n\u0131n Git deposu dizinine okuma\/yazma ve hedef yay\u0131nlama dizinine yazma izinleri olmal\u0131d\u0131r.<\/p>\n<ul>\n<li><strong>Kullan\u0131c\u0131 ve Grup Ayarlar\u0131:<\/strong> MCP sunucusunu \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131ya (<span class=\"code-inline\">www-data<\/span> veya \u00f6zel bir kullan\u0131c\u0131) Git deposu dizini ve <span class=\"code-inline\">\/var\/www\/blog<\/span> dizini \u00fczerinde gerekli yetkileri verdim. \u00d6rne\u011fin: <span class=\"code-inline\">sudo chown -R www-data:www-data \/var\/www\/blog<\/span> ve <span class=\"code-inline\">sudo chmod -R 775 \/var\/www\/blog<\/span>.<\/li>\n<li><strong>SSH Anahtarlar\u0131:<\/strong> Git deposunu <span class=\"code-inline\">https<\/span> yerine <span class=\"code-inline\">ssh<\/span> \u00fczerinden \u00e7ekmek daha g\u00fcvenli ve pratik olabilir. Bu durumda, sunucuyu \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131n\u0131n bir SSH anahtar\u0131 olmal\u0131 ve bu anahtar Git platformunda (GitHub\/GitLab) depoya eri\u015fim izni olan bir da\u011f\u0131t\u0131m anahtar\u0131 (deploy key) olarak eklenmelidir.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4>Statik Site Jenerat\u00f6r\u00fc Entegrasyon Hatalar\u0131 ve Ortam De\u011fi\u015fkenleri<\/h4>\n<p>Hugo&#8217;nun <span class=\"code-inline\">exec<\/span> komutu arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 bazen beklenen \u015fekilde sonu\u00e7 vermiyordu. En yayg\u0131n sorun, <span class=\"code-inline\">hugo<\/span> komutunun sistemin <span class=\"code-inline\">PATH<\/span> de\u011fi\u015fkeninde bulunamamas\u0131yd\u0131. Bu durumda <span class=\"code-inline\">exec<\/span> komutu <span class=\"code-inline\">command not found<\/span> (komut bulunamad\u0131) hatas\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<ul>\n<li><strong>Tam Yol Belirtme:<\/strong> <span class=\"code-inline\">hugo<\/span> komutu yerine <span class=\"code-inline\">\/usr\/local\/bin\/hugo<\/span> gibi tam yolu belirterek bu sorunu a\u015ft\u0131m.<\/li>\n<li><strong>Hata \u00c7\u0131kt\u0131lar\u0131n\u0131 Yakalama:<\/strong> <span class=\"code-inline\">exec<\/span> fonksiyonunun <span class=\"code-inline\">stderr<\/span> \u00e7\u0131kt\u0131s\u0131n\u0131 yakalamak, Hugo&#8217;nun neden ba\u015far\u0131s\u0131z oldu\u011funu anlamak i\u00e7in kritikti. Genellikle yap\u0131land\u0131rma hatalar\u0131 veya eksik dosyalar bu \u00e7\u0131kt\u0131larda g\u00f6r\u00fcn\u00fcrd\u00fc.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h4>Zaman A\u015f\u0131m\u0131 Sorunlar\u0131<\/h4>\n<p>B\u00fcy\u00fck blog siteleri i\u00e7in Hugo&#8217;nun derleme s\u00fcreci birka\u00e7 saniye s\u00fcrebilir. E\u011fer webhook iste\u011fi bu s\u00fcreden daha uzun s\u00fcrerse, Git platformu bir zaman a\u015f\u0131m\u0131 hatas\u0131 bildirebilir ve iste\u011fi ba\u015far\u0131s\u0131z olarak i\u015faretleyebilir. Bu, asl\u0131nda yay\u0131nlama ba\u015far\u0131l\u0131 olsa bile, Git platformunun aray\u00fcz\u00fcnde hatal\u0131 bir durum g\u00f6rmenize neden olurdu.<\/p>\n<ul>\n<li><strong>Arka Plan G\u00f6revleri:<\/strong> Bu sorunu \u00e7\u00f6zmek i\u00e7in, webhook iste\u011fi geldi\u011finde yay\u0131nlama i\u015flemini hemen bir arka plan g\u00f6revine (<span class=\"code-inline\">child_process.spawn<\/span> veya bir i\u015f kuyru\u011fu) devretmek ve webhook iste\u011fine h\u0131zl\u0131ca 200 OK yan\u0131t\u0131 d\u00f6nmek en iyi yakla\u015f\u0131md\u0131r. B\u00f6ylece, Git platformu iste\u011fi ba\u015far\u0131l\u0131 olarak g\u00f6r\u00fcrken, yay\u0131nlama i\u015flemi arka planda devam eder.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: &#8220;Bir Gece Yay\u0131nlanmayan Blog Postu&#8221;<\/strong><\/p>\n<p>Bir keresinde, yeni bir blog yaz\u0131s\u0131 yay\u0131mlamak i\u00e7in <span class=\"code-inline\">git push<\/span> yapt\u0131m, ancak sabah uyand\u0131\u011f\u0131mda blogumda g\u00f6r\u00fcnmedi\u011fini fark ettim. GitHub&#8217;\u0131n webhook ge\u00e7mi\u015fine bakt\u0131\u011f\u0131mda, iste\u011fin &#8220;ba\u015far\u0131s\u0131z&#8221; olarak i\u015faretlendi\u011fini g\u00f6rd\u00fcm. Sunucu loglar\u0131n\u0131 kontrol etti\u011fimde, <span class=\"code-inline\">git pull<\/span> komutunun &#8220;Permission denied (publickey)&#8221; (\u0130zin reddedildi (genel anahtar)) hatas\u0131 verdi\u011fini fark ettim. Sorun, sunucuyu \u00e7al\u0131\u015ft\u0131ran kullan\u0131c\u0131n\u0131n SSH anahtar\u0131n\u0131n GitHub&#8217;da da\u011f\u0131t\u0131m anahtar\u0131 olarak do\u011fru \u015fekilde eklenmemi\u015f olmas\u0131yd\u0131. Anahtar\u0131 ekledikten ve do\u011fru izinleri ayarlad\u0131ktan sonra sorun \u00e7\u00f6z\u00fcld\u00fc. Bu olay, loglama ve hata \u00e7\u0131kt\u0131lar\u0131n\u0131 dikkatle incelemenin ne kadar \u00f6nemli oldu\u011funu bir kez daha g\u00f6sterdi.<\/p>\n<h3>Performans Optimizasyonu ve G\u00fcvenlik \u00d6nlemleri<\/h3>\n<p>Bir i\u00e7erik yay\u0131nlama sunucusu kurarken, sadece i\u015flevsellik de\u011fil, ayn\u0131 zamanda performans ve g\u00fcvenlik de kritik \u00f6neme sahiptir. Blogumun h\u0131zl\u0131 y\u00fcklenmesini sa\u011flamak ve olas\u0131 sald\u0131r\u0131lara kar\u015f\u0131 korumak i\u00e7in bir dizi optimizasyon ve g\u00fcvenlik \u00f6nlemi ald\u0131m.<\/p>\n<h4>Performans Optimizasyonu:<\/h4>\n<ol>\n<li><strong>Statik Site Jenerat\u00f6r\u00fc Optimizasyonu:<\/strong>\n<ul>\n<li><strong>Minify (K\u00fc\u00e7\u00fcltme):<\/strong> Hugo gibi jenerat\u00f6rler, HTML, CSS ve JavaScript dosyalar\u0131n\u0131 k\u00fc\u00e7\u00fcltme (minify) yetene\u011fine sahiptir. Bu, dosya boyutlar\u0131n\u0131 azaltarak y\u00fckleme s\u00fcrelerini k\u0131salt\u0131r. Hugo i\u00e7in <span class=\"code-inline\">config.toml<\/span> dosyas\u0131nda <span class=\"code-inline\">minify = true<\/span> ayar\u0131n\u0131 veya <span class=\"code-inline\">hugo &#8211;minify<\/span> komutunu kulland\u0131m.<\/li>\n<li><strong>Resim Optimizasyonu:<\/strong> Blog yaz\u0131lar\u0131ndaki resimlerin optimize edilmi\u015f boyutlarda ve modern formatlarda (WebP gibi) servis edilmesi, sayfa y\u00fckleme h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Hugo&#8217;nun resim i\u015fleme yeteneklerini veya harici ara\u00e7lar\u0131 kulland\u0131m.<\/li>\n<li><strong>\u00d6nbellekleme (Caching):<\/strong> Taray\u0131c\u0131lar\u0131n statik dosyalar\u0131 (CSS, JS, resimler) \u00f6nbelle\u011fe almas\u0131n\u0131 sa\u011flamak i\u00e7in uygun HTTP \u00f6nbellekleme ba\u015fl\u0131klar\u0131 (Cache-Control, Expires) ayarlad\u0131m. Bu, tekrarlayan ziyaretlerde sayfan\u0131n \u00e7ok daha h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Web Sunucusu Yap\u0131land\u0131rmas\u0131 (Nginx):<\/strong>\n<ul>\n<li><strong>Gzip S\u0131k\u0131\u015ft\u0131rma:<\/strong> Nginx&#8217;i, metin tabanl\u0131 dosyalar\u0131 (HTML, CSS, JS) istemciye g\u00f6ndermeden \u00f6nce gzip ile s\u0131k\u0131\u015ft\u0131rmak \u00fczere yap\u0131land\u0131rd\u0131m. Bu, bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 azalt\u0131r ve y\u00fckleme s\u00fcrelerini h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>Taray\u0131c\u0131 \u00d6nbellekleme:<\/strong> Nginx yap\u0131land\u0131rmas\u0131na, belirli dosya t\u00fcrleri i\u00e7in uzun s\u00fcreli \u00f6nbellekleme ba\u015fl\u0131klar\u0131 ekledim. \u00d6rne\u011fin, <span class=\"code-inline\">location ~* \\.(js|css|png|jpg|jpeg|gif|ico)$<\/span> blo\u011funda <span class=\"code-inline\">expires 30d;<\/span> gibi ayarlar kulland\u0131m.<\/li>\n<\/ul>\n<\/li>\n<li><strong>CDN (\u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131) Entegrasyonu:<\/strong>\n<p>E\u011fer blogunuz k\u00fcresel bir kitleye hitap ediyorsa, bir CDN kullanmak performans\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r. CDN&#8217;ler, i\u00e7eri\u011finizi co\u011frafi olarak da\u011f\u0131t\u0131lm\u0131\u015f sunucularda \u00f6nbelle\u011fe alarak, kullan\u0131c\u0131lara en yak\u0131n sunucudan servis edilmesini sa\u011flar. Cloudflare gibi \u00fccretsiz veya uygun fiyatl\u0131 CDN hizmetleri bu i\u015f i\u00e7in idealdir. Bu, \u00f6zellikle resimler ve di\u011fer b\u00fcy\u00fck statik varl\u0131klar i\u00e7in faydal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ol>\n<h4>G\u00fcvenlik \u00d6nlemleri:<\/h4>\n<ol>\n<li><strong>Webhook Gizli Anahtar\u0131 (Secret) Kullan\u0131m\u0131:<\/strong>\n<p>Daha \u00f6nce de bahsetti\u011fim gibi, webhook isteklerinin ge\u00e7erlili\u011fini do\u011frulamak i\u00e7in bir gizli anahtar kullanmak zorunludur. Bu, sadece yetkili Git deposundan gelen isteklerin i\u015flenmesini sa\u011flar ve sunucunuzun rastgele POST istekleriyle k\u00f6t\u00fcye kullan\u0131lmas\u0131n\u0131 engeller.<\/p>\n<\/li>\n<li><strong>Gelen IP Adreslerini K\u0131s\u0131tlama:<\/strong>\n<p>E\u011fer Git platformunuzun webhook isteklerini g\u00f6nderdi\u011fi IP adres aral\u0131klar\u0131 biliniyorsa (GitHub ve GitLab bu bilgiyi sa\u011flar), sunucunuzun g\u00fcvenlik duvar\u0131n\u0131 (UFW veya <span class=\"code-inline\">firewalld<\/span>) sadece bu IP adreslerinden gelen isteklere izin verecek \u015fekilde yap\u0131land\u0131rabilirsiniz. Bu, ek bir g\u00fcvenlik katman\u0131 sa\u011flar.<\/p>\n<\/li>\n<li><strong>Sunucu G\u00fcvenlik Duvar\u0131 (UFW\/Firewalld):<\/strong>\n<p>Sunucuda gereksiz t\u00fcm portlar\u0131 kapatt\u0131m ve sadece SSH (22), HTTP (80) ve HTTPS (443) portlar\u0131na izin verdim. MCP sunucumun \u00e7al\u0131\u015ft\u0131\u011f\u0131 3000 numaral\u0131 portu ise sadece yerel a\u011fdan veya belirli IP&#8217;lerden eri\u015filebilir hale getirdim. <span class=\"code-inline\">sudo ufw allow 22\/tcp<\/span>, <span class=\"code-inline\">sudo ufw allow 80\/tcp<\/span>, <span class=\"code-inline\">sudo ufw allow 443\/tcp<\/span> gibi komutlarla.<\/p>\n<\/li>\n<li><strong>En Az Yetki Prensibi:<\/strong>\n<p>MCP sunucusu uygulamas\u0131n\u0131, m\u00fcmk\u00fcn olan en d\u00fc\u015f\u00fck yetkilere sahip bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rd\u0131m. <span class=\"code-inline\">root<\/span> kullan\u0131c\u0131s\u0131 veya <span class=\"code-inline\">sudo<\/span> yetkileriyle \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131nd\u0131m. Bu, olas\u0131 bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131 durumunda sistem \u00fczerindeki zarar\u0131 s\u0131n\u0131rlar.<\/p>\n<\/li>\n<li><strong>SSH Anahtar Tabanl\u0131 Kimlik Do\u011frulama:<\/strong>\n<p>Sunucuma SSH ile ba\u011flan\u0131rken parola yerine anahtar tabanl\u0131 kimlik do\u011frulama kulland\u0131m. Bu, parolan\u0131n tahmin edilmesi veya kaba kuvvet sald\u0131r\u0131lar\u0131na kar\u015f\u0131 \u00e7ok daha g\u00fcvenlidir.<\/p>\n<\/li>\n<li><strong>HTTPS Kullan\u0131m\u0131 (Let&#8217;s Encrypt):<\/strong>\n<p>Blogumun ve MCP sunucumun g\u00fcvenli\u011fini art\u0131rmak i\u00e7in t\u00fcm trafi\u011fi HTTPS \u00fczerinden \u015fifreledim. Let&#8217;s Encrypt ve Certbot, \u00fccretsiz SSL\/TLS sertifikalar\u0131 almak ve bunlar\u0131 otomatik olarak yenilemek i\u00e7in harika ara\u00e7lard\u0131r. Bu, hem veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flar hem de SEO a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<\/li>\n<li><strong>Loglama ve \u0130zleme:<\/strong>\n<p>Sunucu loglar\u0131n\u0131 d\u00fczenli olarak izlemek ve anormallikleri tespit etmek i\u00e7in log y\u00f6netim ara\u00e7lar\u0131 kulland\u0131m. Ayr\u0131ca, MCP sunucusunun kendi loglar\u0131n\u0131 da detayl\u0131 tutarak, herhangi bir yay\u0131nlama hatas\u0131 durumunda h\u0131zl\u0131ca m\u00fcdahale edebildim.<\/p>\n<\/li>\n<\/ol>\n<p>Bu performans ve g\u00fcvenlik \u00f6nlemleri, MCP sunucumu sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam ve g\u00fcvenilir bir i\u00e7erik yay\u0131nlama platformu haline getirdi. Her bir ad\u0131m, hem kullan\u0131c\u0131 deneyimini iyile\u015ftirmeye hem de potansiyel riskleri minimize etmeye y\u00f6nelikti.<\/p>\n<h3>\u0130leri D\u00fczey Otomasyon ve S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) Entegrasyonu<\/h3>\n<p>MCP sunucusunun temel i\u015flevselli\u011fini kurduktan ve performans\/g\u00fcvenlik \u00f6nlemlerini ald\u0131ktan sonra, sistemi daha da g\u00fc\u00e7lendirmek ve bir ad\u0131m \u00f6teye ta\u015f\u0131mak i\u00e7in ileri d\u00fczey otomasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) entegrasyonlar\u0131na y\u00f6neldim. Bu, sadece bir <span class=\"code-inline\">git push<\/span> ile blogu yay\u0131nlaman\u0131n \u00f6tesine ge\u00e7erek, daha karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 ve daha g\u00fcvenilir da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini m\u00fcmk\u00fcn k\u0131ld\u0131.<\/p>\n<h4>Test Ortamlar\u0131 ve Otomatik Testler:<\/h4>\n<p>\u00dcretim ortam\u0131na do\u011frudan yay\u0131nlama yapmak riskli olabilir. Bu nedenle, geli\u015ftirme, test ve \u00fcretim olmak \u00fczere farkl\u0131 ortamlar tan\u0131mlad\u0131m. \u00d6rne\u011fin, <span class=\"code-inline\">develop<\/span> dal\u0131na yap\u0131lan push&#8217;lar bir test sunucusuna, <span class=\"code-inline\">main<\/span> dal\u0131na yap\u0131lan push&#8217;lar ise canl\u0131 \u00fcretim sunucusuna yay\u0131nlanacak \u015fekilde MCP sunucumu yap\u0131land\u0131rd\u0131m. Bu, yeni \u00f6zelliklerin veya blog yaz\u0131lar\u0131n\u0131n canl\u0131ya \u00e7\u0131kmadan \u00f6nce test edilmesine olanak tan\u0131r.<\/p>\n<ul>\n<li><strong>Otomatik Testler:<\/strong> Her yay\u0131nlamadan \u00f6nce, statik site jenerat\u00f6r\u00fcn\u00fcn \u00e7\u0131kt\u0131s\u0131n\u0131 kontrol eden basit testler ekledim. \u00d6rne\u011fin, <span class=\"code-inline\">link-checker<\/span> gibi ara\u00e7larla bozuk ba\u011flant\u0131lar\u0131 (broken links) kontrol edebilir veya <span class=\"code-inline\">HTMLProofer<\/span> ile HTML ge\u00e7erlili\u011fini test edebilirim. Bu testler, yay\u0131nlama komutlar\u0131ndan \u00f6nce \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ve herhangi bir hata durumunda da\u011f\u0131t\u0131m\u0131 durdurur.<\/li>\n<li><strong>Linting:<\/strong> Markdown dosyalar\u0131m\u0131 veya HTML\/CSS\/JS dosyalar\u0131m\u0131 belirli stil kurallar\u0131na g\u00f6re kontrol eden linting ara\u00e7lar\u0131n\u0131 (\u00f6rne\u011fin <span class=\"code-inline\">markdownlint<\/span>) entegre ettim. Bu, kod kalitesini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<\/ul>\n<h4>Dockerizasyon:<\/h4>\n<p>MCP sunucusunu ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 bir Docker konteynerine ta\u015f\u0131mak, projenin ta\u015f\u0131nabilirli\u011fini, izole edilmesini ve da\u011f\u0131t\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131rd\u0131. Docker kullanarak, sunucumun farkl\u0131 ortamlarda (yerel geli\u015ftirme, test sunucusu, \u00fcretim sunucusu) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabildim. Ayr\u0131ca, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nledi ve kurulum s\u00fcrecini basitle\u015ftirdi.<\/p>\n<div class=\"code-container\">\n<pre><code>\n        # Dockerfile \u00f6rne\u011fi\n        # Node.js 18 Alpine tabanl\u0131 bir imaj kullan\u0131yoruz, hafif ve verimli\n        FROM node:18-alpine\n\n        # \u00c7al\u0131\u015fma dizinini belirliyoruz\n        WORKDIR \/app\n\n        # package.json ve package-lock.json dosyalar\u0131n\u0131 kopyal\u0131yoruz\n        # Bu sayede ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fmedi\u011finde Docker katman\u0131 \u00f6nbellekten kullan\u0131l\u0131r\n        COPY package*.json .\/\n\n        # Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckl\u00fcyoruz\n        RUN npm install\n\n        # Geri kalan uygulama kodunu kopyal\u0131yoruz\n        COPY . .\n\n        # MCP sunucusunun dinleyece\u011fi portu belirtiyoruz\n        EXPOSE 3000\n\n        # Sunucuyu ba\u015flatma komutunu tan\u0131ml\u0131yoruz\n        CMD [\"node\", \"server.js\"]\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu Dockerfile ile, <span class=\"code-inline\">docker build -t mcp-server .<\/span> komutuyla bir Docker imaj\u0131 olu\u015fturabilir ve <span class=\"code-inline\">docker run -p 3000:3000 -e WEBHOOK_SECRET=your_secret mcp-server<\/span> komutuyla \u00e7al\u0131\u015ft\u0131rabilirim. Bu yakla\u015f\u0131m, sunucu ortam\u0131n\u0131 haz\u0131rlama karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ortadan kald\u0131r\u0131r ve da\u011f\u0131t\u0131m s\u00fcrecini standartla\u015ft\u0131r\u0131r.<\/p>\n<h4>Geli\u015fmi\u015f \u0130\u015f Ak\u0131\u015flar\u0131:<\/h4>\n<p>Daha sofistike i\u015f ak\u0131\u015flar\u0131 olu\u015fturmak i\u00e7in, webhook payload&#8217;undaki bilgilere dayanarak farkl\u0131 eylemleri tetikleyebilirim. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>Dal Bazl\u0131 Da\u011f\u0131t\u0131m:<\/strong> <span class=\"code-inline\">req.body.ref<\/span> alan\u0131n\u0131 kontrol ederek, hangi dalla ilgili bir push geldi\u011fini tespit edip, ona g\u00f6re farkl\u0131 komut setleri \u00e7al\u0131\u015ft\u0131rabilirim. \u00d6rne\u011fin, <span class=\"code-inline\">refs\/heads\/main<\/span> dal\u0131na push geldi\u011finde \u00fcretim ortam\u0131na, <span class=\"code-inline\">refs\/heads\/dev<\/span> dal\u0131na geldi\u011finde ise geli\u015ftirme ortam\u0131na yay\u0131n yapabilirim.<\/li>\n<li><strong>Yazar Bazl\u0131 Yetkilendirme:<\/strong> Daha ileri senaryolarda, webhook payload&#8217;\u0131ndaki yazar bilgilerine bakarak belirli ki\u015filerin belirli dallara veya ortamlara yay\u0131n yapmas\u0131na izin verebilirim.<\/li>\n<li><strong>Geri Alma Mekanizmalar\u0131:<\/strong> Bir yay\u0131nlama hatas\u0131 durumunda, \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme otomatik olarak geri d\u00f6nme (rollback) mekanizmalar\u0131 tasarlayabilirim. Bu, genellikle da\u011f\u0131t\u0131m dizinlerinin versiyonlanmas\u0131 veya Docker imajlar\u0131n\u0131n etiketlenmesiyle m\u00fcmk\u00fcn olur.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey otomasyon ve CI\/CD entegrasyonlar\u0131, MCP sunucumu sadece basit bir yay\u0131nlama arac\u0131ndan, tam te\u015fekk\u00fcll\u00fc, g\u00fcvenilir ve esnek bir i\u00e7erik da\u011f\u0131t\u0131m sistemine d\u00f6n\u00fc\u015ft\u00fcrd\u00fc. Bu sayede, i\u00e7erik \u00fcretimine daha fazla odaklanabilir ve teknik detaylarla daha az u\u011fra\u015fabilirim.<\/p>\n<h3>Sonu\u00e7: Kendi Yay\u0131nlama Sunucunuzla Elde Edilenler<\/h3>\n<p>Kendi \u00f6zel i\u00e7erik yay\u0131nlama sunucumu (MCP) in\u015fa etme ser\u00fcvenim, sadece teknik bir proje olman\u0131n \u00f6tesinde, bana paha bi\u00e7ilmez deneyimler kazand\u0131rd\u0131. Bu s\u00fcre\u00e7te, Node.js ile web sunucusu geli\u015ftirme, Git ile otomasyon entegrasyonu, Linux sunucu y\u00f6netimi, g\u00fcvenlik pratikleri ve hata ay\u0131klama stratejileri gibi bir\u00e7ok alanda bilgi ve becerilerimi derinle\u015ftirme f\u0131rsat\u0131 buldum. En \u00f6nemlisi, i\u00e7erik yay\u0131nlama s\u00fcrecim \u00fczerinde tam kontrol sa\u011flad\u0131m ve manuel i\u015f y\u00fck\u00fcn\u00fc s\u0131f\u0131ra indirerek verimlili\u011fimi art\u0131rd\u0131m.<\/p>\n<p>MCP sunucusu sayesinde, art\u0131k yeni bir blog yaz\u0131s\u0131n\u0131 yazd\u0131ktan veya mevcut bir yaz\u0131y\u0131 g\u00fcncelledikten sonra tek yapmam gereken, de\u011fi\u015fiklikleri Git depoma g\u00f6ndermek. Geri kalan t\u00fcm ad\u0131mlar \u2013 depoyu \u00e7ekmek, statik siteyi derlemek ve web sunucusuna da\u011f\u0131tmak \u2013 tam otomatik olarak ger\u00e7ekle\u015fiyor. Bu otomasyon, bana yarat\u0131c\u0131 s\u00fcre\u00e7lere daha fazla odaklanma \u00f6zg\u00fcrl\u00fc\u011f\u00fc tan\u0131rken, ayn\u0131 zamanda blogumun her zaman g\u00fcncel ve hatas\u0131z kalmas\u0131n\u0131 sa\u011fl\u0131yor. Kendi altyap\u0131n\u0131z\u0131 kurman\u0131n getirdi\u011fi \u00f6\u011frenme e\u011frisi zorlay\u0131c\u0131 olsa da, elde edilen \u00f6zg\u00fcrl\u00fck, esneklik ve verimlilik bu \u00e7abaya kesinlikle de\u011fiyor.<\/p>\n<p>Gelecekteki geli\u015ftirmeler aras\u0131nda, MCP sunucusuna bir y\u00f6netim paneli ekleyerek yay\u0131nlama ge\u00e7mi\u015fini g\u00f6rselle\u015ftirmek, farkl\u0131 bloglar veya projeler i\u00e7in \u00e7oklu depo deste\u011fi sunmak ve belki de i\u00e7erik y\u00f6netimini daha da kolayla\u015ft\u0131rmak i\u00e7in basit bir web tabanl\u0131 edit\u00f6r entegrasyonu yer al\u0131yor. Bu proje, kendi ihtiya\u00e7lar\u0131n\u0131za \u00f6zel \u00e7\u00f6z\u00fcmler geli\u015ftirmenin ve teknolojiyi kendi lehinize kullanman\u0131n g\u00fcc\u00fcn\u00fc bir kez daha g\u00f6sterdi.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>S1: Bu t\u00fcr bir sunucuyu kurmak i\u00e7in hangi teknik bilgilere sahip olmal\u0131y\u0131m?<\/dt>\n<dd><strong>C1:<\/strong> Temel Linux komutlar\u0131 (terminal kullan\u0131m\u0131, dosya izinleri), Git versiyon kontrol sistemi, bir programlama dili (Node.js veya Python gibi), basit bir web sunucusu (Nginx veya Apache) yap\u0131land\u0131rmas\u0131 ve se\u00e7ti\u011finiz statik site jenerat\u00f6r\u00fcn\u00fcn (Hugo, Jekyll) kullan\u0131m\u0131 hakk\u0131nda bilgi sahibi olmak faydal\u0131d\u0131r. Ancak, bu makaledeki gibi ad\u0131m ad\u0131m rehberlerle \u00f6\u011frenerek de ilerleyebilirsiniz.<\/dd>\n<dt>S2: Kendi yay\u0131nlama sunucumu kurman\u0131n g\u00fcvenlik riskleri nelerdir?<\/dt>\n<dd><strong>C2:<\/strong> Ba\u015fl\u0131ca riskler aras\u0131nda yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f webhook&#8217;lar (yetkisiz ki\u015filerin sunucunuzu tetiklemesi), dosya izinleri sorunlar\u0131 (uygulaman\u0131n hassas dosyalara eri\u015fimi), zay\u0131f kimlik do\u011frulama\/yetkilendirme ve sunucu g\u00fcvenlik a\u00e7\u0131klar\u0131 bulunur. Bu riskleri azaltmak i\u00e7in webhook gizli anahtarlar\u0131, g\u00fcvenlik duvar\u0131, en az yetki prensibi ve d\u00fczenli g\u00fcncellemeler hayati \u00f6neme sahiptir.<\/dd>\n<dt>S3: Mevcut bir blog platformu (WordPress gibi) yerine neden bu yolu se\u00e7meliyim?<\/dt>\n<dd><strong>C3:<\/strong> Kendi sunucunuzu kurmak, i\u00e7erik \u00fczerinde tam kontrol, s\u0131n\u0131rs\u0131z \u00f6zelle\u015ftirme esnekli\u011fi, daha y\u00fcksek performans (statik siteler sayesinde), daha iyi g\u00fcvenlik (daha az hareketli par\u00e7a) ve uzun vadede maliyet tasarrufu gibi avantajlar sunar. Ayr\u0131ca, otomasyon yetenekleri sayesinde yay\u0131nlama s\u00fcreciniz \u00e7ok daha verimli hale gelir. Ancak, ilk kurulum ve bak\u0131m i\u00e7in daha fazla teknik bilgi gerektirir.<\/dd>\n<dt>S4: Bu sistem sadece bloglar i\u00e7in mi kullan\u0131labilir?<\/dt>\n<dd><strong>C4:<\/strong> Hay\u0131r, kesinlikle de\u011fil. Bu t\u00fcr bir otomatik yay\u0131nlama sistemi, statik web siteleri, dok\u00fcmantasyon siteleri, portf\u00f6y siteleri veya d\u00fczenli olarak g\u00fcncellenen ve statik olarak sunulabilecek herhangi bir i\u00e7erik i\u00e7in uyarlanabilir. Prensip, Git deposundaki kaynak koddan nihai \u00e7\u0131kt\u0131y\u0131 otomatik olarak olu\u015fturup da\u011f\u0131tmakt\u0131r.<\/dd>\n<dt>S5: Daha k\u00fc\u00e7\u00fck projeler veya ki\u015fisel web siteleri i\u00e7in de mant\u0131kl\u0131 m\u0131?<\/dt>\n<dd><strong>C5:<\/strong> Ba\u015flang\u0131\u00e7ta \u00f6\u011frenme e\u011frisi ve kurulum i\u00e7in harcanan zaman g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, \u00e7ok k\u00fc\u00e7\u00fck ve nadiren g\u00fcncellenen projeler i\u00e7in a\u015f\u0131r\u0131ya ka\u00e7abilir. Ancak, d\u00fczenli olarak i\u00e7erik yay\u0131nl\u0131yorsan\u0131z veya gelecekte \u00f6l\u00e7eklenmeyi planl\u0131yorsan\u0131z, uzun vadede i\u00e7erik yay\u0131nlama s\u00fcrecini basitle\u015ftirerek ve verimlilik sa\u011flayarak kesinlikle mant\u0131kl\u0131 hale gelir. \u00d6zellikle geli\u015ftiriciler i\u00e7in, bu ayn\u0131 zamanda de\u011ferli bir \u00f6\u011frenme deneyimidir.<\/dd>\n<\/dl>\n<p>#Teknoloji #WebGeli\u015ftirme #Otomasyon #CI\/CD #BlogYay\u0131nlama #DevOps<\/p>\n","protected":false},"excerpt":{"rendered":"Dijital d\u00fcnyada ki\u015fisel veya kurumsal bir varl\u0131k olu\u015fturman\u0131n en etkili yollar\u0131ndan biri blog yazmakt\u0131r.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-43758","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc\" \/>\n<meta property=\"og:description\" content=\"Dijital d\u00fcnyada ki\u015fisel veya kurumsal bir varl\u0131k olu\u015fturman\u0131n en etkili yollar\u0131ndan biri blog yazmakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-01T06:12:46+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc\",\"datePublished\":\"2026-08-01T06:12:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\"},\"wordCount\":4606,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\",\"name\":\"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-08-01T06:12:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/","og_locale":"tr_TR","og_type":"article","og_title":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc","og_description":"Dijital d\u00fcnyada ki\u015fisel veya kurumsal bir varl\u0131k olu\u015fturman\u0131n en etkili yollar\u0131ndan biri blog yazmakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-08-01T06:12:46+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc","datePublished":"2026-08-01T06:12:46+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/"},"wordCount":4606,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/","url":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/","name":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-08-01T06:12:46+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kendi-blog-yayinlama-sunucunuzu-kurmak-bir-hata-ayiklama-gunlugu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kendi Blog Yay\u0131nlama Sunucunuzu Kurmak: Bir Hata Ay\u0131klama G\u00fcnl\u00fc\u011f\u00fc"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43758"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43758\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}