{"id":38964,"date":"2026-02-11T16:40:59","date_gmt":"2026-02-11T13:40:59","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38964"},"modified":"2026-02-11T16:40:59","modified_gmt":"2026-02-11T13:40:59","slug":"headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/","title":{"rendered":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7"},"content":{"rendered":"<p><body><\/p>\n<h2>Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7<\/h2>\n<h3>Giri\u015f: Modern Bloglama Deneyimine Ho\u015f Geldiniz<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, i\u00e7erik y\u00f6netimi ve sunumu hi\u00e7 olmad\u0131\u011f\u0131 kadar esnek ve g\u00fc\u00e7l\u00fc hale geldi. Geleneksel i\u00e7erik y\u00f6netim sistemlerinin (CMS) sundu\u011fu k\u0131s\u0131tlamalar\u0131n \u00f6tesine ge\u00e7mek isteyen geli\u015ftiriciler ve i\u00e7erik \u00fcreticileri i\u00e7in &#8220;ba\u015fl\u0131ks\u0131z&#8221; (headless) mimariler, yepyeni bir \u00f6zg\u00fcrl\u00fck alan\u0131 sunuyor. Bu makalede, geli\u015ftirici odakl\u0131 blog platformu Hashnode&#8217;u headless bir CMS olarak kullanarak, modern bir frontend ile DigitalOcean \u00fczerinde nas\u0131l da\u011f\u0131tabilece\u011finizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>Headless CMS, i\u00e7eri\u011fi depolayan ve y\u00f6neten bir arka u\u00e7 (backend) ile i\u00e7eri\u011fi g\u00f6r\u00fcnt\u00fcleyen bir \u00f6n u\u00e7 (frontend) aras\u0131nda net bir ayr\u0131m yapar. Bu ayr\u0131m, i\u00e7eri\u011finizi web siteleri, mobil uygulamalar, IoT cihazlar\u0131 ve hatta sanal ger\u00e7eklik deneyimleri gibi birden fazla kanalda sorunsuz bir \u015fekilde kullanman\u0131za olanak tan\u0131r. Hashnode, yazarlar\u0131n i\u00e7erik olu\u015fturmas\u0131na ve y\u00f6netmesine odaklan\u0131rken, g\u00fc\u00e7l\u00fc GraphQL API&#8217;si sayesinde bu i\u00e7eri\u011fi kendi se\u00e7ti\u011finiz herhangi bir frontend teknolojisiyle \u00e7ekmenize ve \u00f6zelle\u015ftirilmi\u015f bir kullan\u0131c\u0131 deneyimi sunman\u0131za olanak tan\u0131r.<\/p>\n<p>DigitalOcean ise, bulut altyap\u0131s\u0131 sa\u011flay\u0131c\u0131lar\u0131 aras\u0131nda geli\u015ftirici dostu aray\u00fcz\u00fc, uygun fiyatland\u0131rmas\u0131 ve g\u00fc\u00e7l\u00fc sanal sunucular\u0131 (Droplets), uygulama platformu (App Platform) gibi hizmetleriyle \u00f6ne \u00e7\u0131kar. Kendi headless Hashnode blogunuzu DigitalOcean \u00fczerinde bar\u0131nd\u0131rmak, hem maliyet etkinli\u011fi hem de da\u011f\u0131t\u0131m kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan ideal bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>Bu kapsaml\u0131 rehberde, headless mimarinin temel prensiplerinden ba\u015flayarak, Hashnode API&#8217;sini nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131, Next.js gibi modern bir frontend \u00e7at\u0131s\u0131 ile nas\u0131l bir blog uygulamas\u0131 geli\u015ftirece\u011finizi ve son olarak bu uygulamay\u0131 DigitalOcean&#8217;\u0131n App Platform&#8217;u veya Droplet&#8217;leri \u00fczerinde nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Amac\u0131m\u0131z, size kendi \u00f6zelle\u015ftirilmi\u015f, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir headless blogunuzu kurmak i\u00e7in gerekli t\u00fcm bilgi ve ara\u00e7lar\u0131 sunmakt\u0131r.<\/p>\n<h3>Headless Mimariyi Anlamak: Neden ve Nas\u0131l?<\/h3>\n<p>Geleneksel CMS&#8217;ler (WordPress, Joomla vb.) genellikle bir monolitik yap\u0131ya sahiptir; yani i\u00e7erik y\u00f6netimi, veritaban\u0131, tema ve sunum katmanlar\u0131 tek bir pakette birle\u015fiktir. Bu, k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in h\u0131zl\u0131 ba\u015flang\u0131\u00e7lar sunsa da, modern web uygulamalar\u0131n\u0131n gerektirdi\u011fi esneklik, \u00f6l\u00e7eklenebilirlik ve \u00e7ok kanall\u0131 da\u011f\u0131t\u0131m ihtiya\u00e7lar\u0131nda yetersiz kalabilir.<\/p>\n<h4>Geleneksel CMS vs. Headless CMS<\/h4>\n<p>*   <strong>Geleneksel CMS:<\/strong> \u0130\u00e7erik depolama ve sunum katmanlar\u0131 s\u0131k\u0131 bir \u015fekilde ba\u011fl\u0131d\u0131r. Bir tema se\u00e7er, eklentilerle \u00f6zelle\u015ftirir ve genellikle ayn\u0131 platform \u00fczerinde yay\u0131nlars\u0131n\u0131z.<br \/>\n*   <strong>Headless CMS:<\/strong> \u0130\u00e7erik depolama (backend) ve sunum (frontend) birbirinden tamamen ba\u011f\u0131ms\u0131zd\u0131r. \u0130\u00e7eri\u011fi bir API arac\u0131l\u0131\u011f\u0131yla sunar ve bu i\u00e7eri\u011fi istedi\u011finiz herhangi bir frontend teknolojisiyle (React, Vue, Angular, Svelte, mobil uygulamalar vb.) \u00e7ekerek kendi benzersiz kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcz\u00fc olu\u015fturursunuz.<\/p>\n<h4>Headless Mimarisinin Avantajlar\u0131<\/h4>\n<p>1.  <strong>Esneklik ve Teknoloji \u00d6zg\u00fcrl\u00fc\u011f\u00fc:<\/strong> Geli\u015ftiriciler, frontend i\u00e7in en sevdikleri ve projenin ihtiya\u00e7lar\u0131na en uygun teknolojiyi se\u00e7ebilirler. Bu, daha iyi performans, geli\u015ftirme h\u0131z\u0131 ve daha iyi bir geli\u015ftirici deneyimi anlam\u0131na gelir.<br \/>\n2.  <strong>\u00c7ok Kanall\u0131 Da\u011f\u0131t\u0131m:<\/strong> \u0130\u00e7erik, tek bir kaynaktan (headless CMS) birden fazla cihaza ve platforma (web sitesi, mobil uygulama, ak\u0131ll\u0131 saat, IoT cihaz\u0131 vb.) kolayca da\u011f\u0131t\u0131labilir. \u0130\u00e7eri\u011fi bir kez olu\u015fturur, her yerde kullan\u0131rs\u0131n\u0131z.<br \/>\n3.  <strong>Performans:<\/strong> Frontend&#8217;in ayr\u0131 olmas\u0131, statik site olu\u015fturucular\u0131 (SSG) veya sunucu taraf\u0131 renderlama (SSR) gibi modern tekniklerin kullan\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Bu da daha h\u0131zl\u0131 y\u00fckleme s\u00fcreleri ve daha iyi bir kullan\u0131c\u0131 deneyimi sa\u011flar.<br \/>\n4.  <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Backend ve frontend&#8217;in ayr\u0131 ayr\u0131 \u00f6l\u00e7eklenebilmesi, yo\u011fun trafik durumlar\u0131nda sistemin daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flar.<br \/>\n5.  <strong>G\u00fcvenlik:<\/strong> Frontend ve backend&#8217;in ayr\u0131lmas\u0131, sald\u0131r\u0131 y\u00fczeyini azaltabilir. Backend genellikle bir API arac\u0131l\u0131\u011f\u0131yla eri\u015fildi\u011fi i\u00e7in daha az do\u011frudan maruz kal\u0131r.<br \/>\n6.  <strong>Gelece\u011fe Haz\u0131rl\u0131k:<\/strong> Yeni teknolojiler ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, sadece frontend katman\u0131n\u0131 g\u00fcncelleyerek i\u00e7eri\u011finizi yeni platformlara ta\u015f\u0131yabilirsiniz, backend&#8217;i de\u011fi\u015ftirmeye gerek kalmaz.<\/p>\n<h4>Headless Kullan\u0131m Senaryolar\u0131<\/h4>\n<p>*   <strong>Bloglar ve Haber Siteleri:<\/strong> Hashnode gibi platformlar, i\u00e7eri\u011fi y\u00f6netirken, frontend&#8217;i tamamen size b\u0131rak\u0131r.<br \/>\n*   <strong>E-ticaret Siteleri:<\/strong> \u00dcr\u00fcn bilgilerini bir headless CMS&#8217;te tutarak, farkl\u0131 frontend&#8217;ler \u00fczerinden sat\u0131\u015f yapabilirsiniz.<br \/>\n*   <strong>Kurumsal Web Siteleri:<\/strong> \u0130\u00e7eri\u011fi farkl\u0131 pazarlama kanallar\u0131nda tutarl\u0131 bir \u015fekilde sunmak i\u00e7in idealdir.<br \/>\n*   <strong>Mobil Uygulamalar:<\/strong> Uygulama i\u00e7i i\u00e7eri\u011fi merkezi bir headless CMS&#8217;ten y\u00f6netmek.<\/p>\n<h3>Hashnode&#8217;u Tan\u0131mak: Geli\u015ftiriciler \u0130\u00e7in Bir Bloglama Platformu<\/h3>\n<p>Hashnode, \u00f6zellikle geli\u015ftiriciler ve teknoloji merakl\u0131lar\u0131 i\u00e7in tasarlanm\u0131\u015f, g\u00fc\u00e7l\u00fc bir bloglama platformudur. Markdown deste\u011fi, kod bloklar\u0131, entegre yorum sistemi ve aktif bir geli\u015ftirici toplulu\u011fu gibi \u00f6zellikleriyle \u00f6ne \u00e7\u0131kar. Ancak Hashnode&#8217;u bu makalenin konusu yapan as\u0131l \u00f6zelli\u011fi, sundu\u011fu g\u00fc\u00e7l\u00fc GraphQL API&#8217;si ile i\u00e7eri\u011finizi headless bir \u015fekilde kullanma yetene\u011fidir.<\/p>\n<h4>Hashnode&#8217;un Ba\u015fl\u0131ca \u00d6zellikleri<\/h4>\n<p>*   <strong>Geli\u015ftirici Odakl\u0131:<\/strong> Kod bloklar\u0131, Markdown edit\u00f6r\u00fc, entegrasyonlar (GitHub, Notion vb.)<br \/>\n*   <strong>Topluluk:<\/strong> Geni\u015f ve aktif bir geli\u015ftirici toplulu\u011fu sayesinde i\u00e7eriklerinizin daha fazla ki\u015fiye ula\u015fma potansiyeli.<br \/>\n*   <strong>\u00d6zel Alan Ad\u0131 Deste\u011fi:<\/strong> Blogunuzu kendi \u00f6zel alan ad\u0131n\u0131zda yay\u0131nlayabilirsiniz.<br \/>\n*   <strong>GraphQL API:<\/strong> \u0130\u00e7eri\u011finize programatik olarak eri\u015fmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir API.<br \/>\n*   <strong>Otomatik SEO:<\/strong> Temel SEO ayarlar\u0131 otomatik olarak yap\u0131l\u0131rken, headless kullan\u0131mda tam kontrol sizde olur.<\/p>\n<h4>Neden Hashnode&#8217;u Headless CMS Olarak Kullanmal\u0131?<\/h4>\n<p>Hashnode, blog i\u00e7eri\u011finizi olu\u015fturmak ve y\u00f6netmek i\u00e7in harika bir platformdur. Yaz\u0131 yazmaya odaklanman\u0131z\u0131 sa\u011flar ve teknik detaylarla u\u011fra\u015fman\u0131za gerek kalmaz. Ancak, blogunuzun g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc, performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini tamamen kendi kontrol\u00fcn\u00fcz alt\u0131na almak istedi\u011finizde headless yakla\u015f\u0131m\u0131 devreye girer. Hashnode&#8217;un GraphQL API&#8217;si sayesinde:<\/p>\n<p>1.  <strong>Tam Tasar\u0131m Kontrol\u00fc:<\/strong> Blogunuzun her pikselini kendi markan\u0131za ve tercihlerinize g\u00f6re tasarlayabilirsiniz.<br \/>\n2.  <strong>\u00d6zelle\u015ftirilmi\u015f Performans:<\/strong> Next.js gibi modern frontend \u00e7at\u0131lar\u0131n\u0131n sundu\u011fu optimizasyon \u00f6zelliklerini kullanarak blogunuzu inan\u0131lmaz h\u0131zl\u0131 hale getirebilirsiniz.<br \/>\n3.  <strong>Benzersiz \u00d6zellikler:<\/strong> Hashnode&#8217;un kendi aray\u00fcz\u00fcnde bulunmayan \u00f6zel \u00f6zellikler veya entegrasyonlar ekleyebilirsiniz.<br \/>\n4.  <strong>Frontend Teknolojisi Se\u00e7imi:<\/strong> Kendi frontend geli\u015ftirme becerilerinize veya projenizin gereksinimlerine en uygun JavaScript \u00e7at\u0131s\u0131n\u0131 (React, Vue, Svelte vb.) kullanabilirsiniz.<\/p>\n<h4>Hashnode GraphQL API&#8217;si<\/h4>\n<p>Hashnode, blog i\u00e7eri\u011finize eri\u015fmek i\u00e7in GraphQL tabanl\u0131 bir API sunar. GraphQL, REST API&#8217;lerine g\u00f6re daha esnek ve verimli bir veri sorgulama dilidir. \u0130stedi\u011finiz veriyi tam olarak belirtmenize olanak tan\u0131r, bu da gereksiz veri transferini \u00f6nler.<\/p>\n<p>*   <strong>API U\u00e7 Noktas\u0131:<\/strong> Genellikle <code>https:\/\/api.hashnode.com\/<\/code> veya <code>https:\/\/gql.hashnode.com\/<\/code> gibi bir adreste bulunur. (Hashnode v2 API i\u00e7in <code>https:\/\/gql.hashnode.com\/<\/code>)<br \/>\n*   <strong>Kimlik Do\u011frulama:<\/strong> Genellikle bir Personal Access Token (PAT) kullan\u0131larak yap\u0131l\u0131r. Bu token, Hashnode hesab\u0131n\u0131zdan olu\u015fturulur ve API isteklerinizle birlikte g\u00f6nderilir.<\/p>\n<h3>DigitalOcean&#8217;\u0131 Tan\u0131mak: Bulut Altyap\u0131n\u0131z<\/h3>\n<p>DigitalOcean, geli\u015ftiricilere ve k\u00fc\u00e7\u00fck i\u015fletmelere y\u00f6nelik bulut altyap\u0131s\u0131 hizmetleri sunan pop\u00fcler bir platformdur. Kullan\u0131m kolayl\u0131\u011f\u0131, uygun fiyatland\u0131rmas\u0131 ve geni\u015f hizmet yelpazesi ile dikkat \u00e7eker. Kendi headless Hashnode frontend&#8217;inizi bar\u0131nd\u0131rmak i\u00e7in DigitalOcean, hem esneklik hem de maliyet etkinli\u011fi sunar.<\/p>\n<h4>DigitalOcean&#8217;\u0131n Ba\u015fl\u0131ca Hizmetleri<\/h4>\n<p>1.  <strong>Droplets (Sanal Sunucular):<\/strong> Linux tabanl\u0131 sanal makinelerdir. Tam kontrol ve \u00f6zelle\u015ftirme imkan\u0131 sunar. Kendi sunucunuzu kurup y\u00f6netmek istedi\u011finizde idealdir.<br \/>\n2.  <strong>App Platform:<\/strong> Git deposundan do\u011frudan uygulama da\u011f\u0131t\u0131m\u0131 sa\u011flayan, y\u00f6netilen bir platformdur (PaaS). Geli\u015ftiricilerin altyap\u0131 y\u00f6netimi yerine kod yazmaya odaklanmas\u0131n\u0131 sa\u011flar. Otomatik \u00f6l\u00e7ekleme, CI\/CD, SSL gibi \u00f6zellikleri vard\u0131r.<br \/>\n3.  <strong>Spaces (Nesne Depolama):<\/strong> Amazon S3 benzeri, \u00f6l\u00e7eklenebilir ve uygun maliyetli nesne depolama hizmetidir. Statik dosyalar, resimler ve videolar i\u00e7in kullan\u0131labilir.<br \/>\n4.  <strong>Managed Databases:<\/strong> Y\u00f6netilen veritaban\u0131 hizmetleri (PostgreSQL, MySQL, Redis vb.).<br \/>\n5.  <strong>Kubernetes:<\/strong> Y\u00f6netilen Kubernetes k\u00fcmeleri.<\/p>\n<h4>Neden DigitalOcean Headless Frontend Da\u011f\u0131t\u0131m\u0131 \u0130\u00e7in \u0130yi Bir Se\u00e7im?<\/h4>\n<p>*   <strong>Basitlik ve Geli\u015ftirici Dostu:<\/strong> Hem Droplets hem de App Platform, geli\u015ftiricilerin h\u0131zl\u0131ca da\u011f\u0131t\u0131m yapmas\u0131n\u0131 sa\u011flayan sezgisel aray\u00fczlere sahiptir.<br \/>\n*   <strong>Maliyet Etkinli\u011fi:<\/strong> K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in rekabet\u00e7i fiyatland\u0131rma sunar.<br \/>\n*   <strong>Performans:<\/strong> SSD tabanl\u0131 depolama ve y\u00fcksek h\u0131zl\u0131 a\u011f ba\u011flant\u0131lar\u0131 sayesinde iyi performans sunar.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e kolayca kaynaklar\u0131 art\u0131rabilirsiniz.<br \/>\n*   <strong>App Platform ile CI\/CD:<\/strong> Git entegrasyonu sayesinde kodunuzu her push etti\u011finizde otomatik da\u011f\u0131t\u0131m yapabilir, bu da geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/p>\n<p>Bu makalede, headless Hashnode frontend&#8217;inizi da\u011f\u0131tmak i\u00e7in DigitalOcean App Platform&#8217;u \u00f6neriyoruz. Daha az sunucu y\u00f6netimi gerektirir ve CI\/CD s\u00fcre\u00e7lerini otomatikle\u015ftirir. Ancak, Droplet \u00fczerinde de nas\u0131l da\u011f\u0131t\u0131m yapabilece\u011finize k\u0131saca de\u011finece\u011fiz.<\/p>\n<h3>\u00d6n Gereksinimler ve Haz\u0131rl\u0131klar<\/h3>\n<p>Headless Hashnode blogunuzu kurmaya ba\u015flamadan \u00f6nce, baz\u0131 temel gereksinimleri kar\u015f\u0131laman\u0131z ve haz\u0131rl\u0131klar\u0131 yapman\u0131z gerekmektedir.<\/p>\n<p>1.  <strong>Hashnode Hesab\u0131 ve Blogu:<\/strong><br \/>\n    *   Bir Hashnode hesab\u0131n\u0131z\u0131n olmas\u0131 ve en az bir blog olu\u015fturmu\u015f olman\u0131z gerekir.<br \/>\n    *   Hashnode blogunuzun ayarlar\u0131ndan bir <strong>Personal Access Token (PAT)<\/strong> olu\u015fturman\u0131z gerekecek. Bu token, Hashnode API&#8217;sine g\u00fcvenli bir \u015fekilde eri\u015fmek i\u00e7in kullan\u0131lacakt\u0131r. <code>Settings -> Developer -> Personal Access Tokens<\/code> yolunu izleyerek yeni bir token olu\u015fturabilirsiniz. Bu token&#8217;\u0131 g\u00fcvenli bir yerde saklay\u0131n, zira bir daha g\u00f6sterilmeyecektir.<br \/>\n2.  <strong>DigitalOcean Hesab\u0131:<\/strong><br \/>\n    *   Bir DigitalOcean hesab\u0131na sahip olman\u0131z gerekir. Hen\u00fcz yoksa, kaydolmak olduk\u00e7a basittir.<br \/>\n3.  <strong>Temel Web Geli\u015ftirme Bilgisi:<\/strong><br \/>\n    *   JavaScript, React (veya se\u00e7ti\u011finiz ba\u015fka bir frontend \u00e7at\u0131s\u0131) ve Next.js (veya Gatsby) hakk\u0131nda temel bilgiye sahip olman\u0131z faydal\u0131 olacakt\u0131r.<br \/>\n    *   Git ve komut sat\u0131r\u0131 (terminal) kullan\u0131m\u0131 hakk\u0131nda bilgi.<br \/>\n4.  <strong>Yerel Geli\u015ftirme Ortam\u0131:<\/strong><br \/>\n    *   <strong>Node.js ve npm\/yarn:<\/strong> Yerel makinenizde Node.js&#8217;in g\u00fcncel bir s\u00fcr\u00fcm\u00fcn\u00fcn (tercihen LTS) kurulu olmas\u0131 gerekir. npm (Node Package Manager) veya yarn paket y\u00f6neticisini kullanaca\u011f\u0131z.<br \/>\n    *   <strong>Git:<\/strong> Kodunuzu versiyonlamak ve DigitalOcean&#8217;a da\u011f\u0131tmak i\u00e7in Git kurulu olmal\u0131d\u0131r.<br \/>\n    *   <strong>Metin D\u00fczenleyici\/IDE:<\/strong> VS Code gibi bir kod d\u00fczenleyici.<br \/>\n5.  <strong>Alan Ad\u0131 (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir):<\/strong><br \/>\n    *   Blogunuzu kendi \u00f6zel alan ad\u0131n\u0131zda yay\u0131nlamak isterseniz, bir alan ad\u0131 kaydetmi\u015f olman\u0131z ve DigitalOcean&#8217;a y\u00f6nlendirme yapabilmeniz gerekecektir.<\/p>\n<h3>Hashnode API Eri\u015fimi ve Yap\u0131land\u0131rma<\/h3>\n<p>Hashnode i\u00e7eri\u011finize eri\u015fmek i\u00e7in GraphQL API&#8217;sini kullanaca\u011f\u0131z. \u0130lk ad\u0131m, API token&#8217;\u0131n\u0131z\u0131 almak ve basit bir sorgu ile API&#8217;nin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamakt\u0131r.<\/p>\n<h4>Personal Access Token (PAT) Olu\u015fturma<\/h4>\n<p>1.  Hashnode hesab\u0131n\u0131za giri\u015f yap\u0131n.<br \/>\n2.  Sol men\u00fcden <code>Settings<\/code> (Ayarlar) se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n3.  <code>Developer<\/code> (Geli\u015ftirici) sekmesine gidin.<br \/>\n4.  <code>Personal Access Tokens<\/code> (Ki\u015fisel Eri\u015fim Tokenlar\u0131) b\u00f6l\u00fcm\u00fcnde <code>Generate New Token<\/code> (Yeni Token Olu\u015ftur) d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n5.  Token&#8217;\u0131n\u0131za anlaml\u0131 bir isim verin (\u00f6rn. &#8220;MyHeadlessBlog&#8221;).<br \/>\n6.  Olu\u015fturulan token&#8217;\u0131 kopyalay\u0131n ve g\u00fcvenli bir yere kaydedin. Bu token&#8217;\u0131 daha sonra frontend uygulaman\u0131zda ortam de\u011fi\u015fkeni olarak kullanaca\u011f\u0131z.<\/p>\n<h4>Hashnode GraphQL API U\u00e7 Noktas\u0131<\/h4>\n<p>Hashnode&#8217;un GraphQL API&#8217;si i\u00e7in ana u\u00e7 nokta: <code>https:\/\/gql.hashnode.com\/<\/code>. T\u00fcm GraphQL sorgular\u0131m\u0131z\u0131 bu adrese g\u00f6nderece\u011fiz.<\/p>\n<h4>Basit Bir GraphQL Sorgusu<\/h4>\n<p>Hashnode API&#8217;si ile etkile\u015fim kurmak i\u00e7in bir GraphQL istemcisi kullanaca\u011f\u0131z. Next.js projemizde <code>graphql-request<\/code> k\u00fct\u00fcphanesini kullanmak pratik olacakt\u0131r. Ancak \u00f6nce, API&#8217;yi anlamak i\u00e7in bir \u00f6rnek sorguya bakal\u0131m.<\/p>\n<p>A\u015fa\u011f\u0131daki sorgu, belirli bir kullan\u0131c\u0131ya ait blog g\u00f6nderilerini (ba\u015fl\u0131k, slug ve yay\u0131n tarihi ile birlikte) listeler:<\/p>\n<pre><code class=\"language-graphql\">query GetUserArticles($username: String!) {\n  user(username: $username) {\n    publication {\n      posts(page: 0) {\n        _id\n        title\n        slug\n        publishedAt\n        brief\n        coverImage {\n          url\n        }\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Bu sorguyu Postman, Insomnia gibi ara\u00e7larla veya do\u011frudan Hashnode&#8217;un kendi API Playground&#8217;u \u00fczerinden test edebilirsiniz. Unutmay\u0131n, baz\u0131 sorgular i\u00e7in <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131 alt\u0131nda <code>Bearer YOUR_HASHNODE_PAT<\/code> \u015feklinde token&#8217;\u0131n\u0131z\u0131 g\u00f6ndermeniz gerekebilir.<\/p>\n<h3>Headless Frontend Geli\u015ftirme: Next.js ile Blog Uygulamas\u0131<\/h3>\n<p>Bu b\u00f6l\u00fcmde, Hashnode&#8217;dan veri \u00e7ekecek ve bunlar\u0131 g\u00fczel bir \u015fekilde g\u00f6sterecek bir Next.js uygulamas\u0131 geli\u015ftirece\u011fiz. Next.js, React tabanl\u0131 bir \u00e7er\u00e7evedir ve statik site olu\u015fturma (SSG) veya sunucu taraf\u0131 renderlama (SSR) gibi \u00f6zellikleriyle headless CMS projeleri i\u00e7in m\u00fckemmel bir se\u00e7imdir.<\/p>\n<h4>Next.js Projesi Olu\u015fturma<\/h4>\n<p>Yeni bir Next.js projesi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npx create-next-app@latest my-headless-hashnode-blog --typescript\ncd my-headless-hashnode-blog<\/code><\/pre>\n<p>Gerekli GraphQL k\u00fct\u00fcphanelerini kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npm install graphql graphql-request react-markdown\n<h2>veya yarn add graphql graphql-request react-markdown<\/code><\/pre>\n<\/h2>\n<p>*   <code>graphql<\/code>: GraphQL sorgular\u0131n\u0131 ve \u015femalar\u0131n\u0131 tan\u0131mlamak i\u00e7in.<br \/>\n*   <code>graphql-request<\/code>: GraphQL API&#8217;sine istek g\u00f6ndermek i\u00e7in hafif bir istemci.<br \/>\n*   <code>react-markdown<\/code>: Markdown i\u00e7eri\u011fini React bile\u015fenlerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in.<\/p>\n<h4>Ortam De\u011fi\u015fkenleri<\/h4>\n<p>Hashnode PAT&#8217;nizi ve Hashnode blogunuzun kullan\u0131c\u0131 ad\u0131n\u0131 g\u00fcvenli bir \u015fekilde saklamak i\u00e7in ortam de\u011fi\u015fkenlerini kullanaca\u011f\u0131z. Projenizin k\u00f6k dizininde <code>.env.local<\/code> adl\u0131 bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-\">NEXT_PUBLIC_HASHNODE_API_URL=https:\/\/gql.hashnode.com\/\nHASHNODE_PAT=your_hashnode_personal_access_token\nHASHNODE_USERNAME=your_hashnode_username<\/code><\/pre>\n<p>*   <code>NEXT_PUBLIC_<\/code> \u00f6neki, de\u011fi\u015fkenin istemci taraf\u0131nda da eri\u015filebilir olmas\u0131n\u0131 sa\u011flar (SSG\/SSR ba\u011flam\u0131nda). PAT&#8217;nizi do\u011frudan istemci taraf\u0131nda kullanmaktan ka\u00e7\u0131nmal\u0131s\u0131n\u0131z, ancak API URL&#8217;si genellikle kamuya a\u00e7\u0131kt\u0131r. PAT&#8217;yi sadece sunucu taraf\u0131nda (getStaticProps\/getServerSideProps) kullanaca\u011f\u0131z.<\/p>\n<h4>Hashnode API \u0130stemcisi Olu\u015fturma<\/h4>\n<p><code>lib\/hashnode.ts<\/code> (veya <code>.js<\/code>) ad\u0131nda bir dosya olu\u015ftural\u0131m ve GraphQL istemcimizi tan\u0131mlayal\u0131m:<\/p>\n<pre><code class=\"language-typescript\">\/\/ lib\/hashnode.ts\nimport { GraphQLClient, gql } from 'graphql-request';\n\nconst API_URL = process.env.NEXT_PUBLIC_HASHNODE_API_URL || 'https:\/\/gql.hashnode.com\/';\nconst HASHNODE_PAT = process.env.HASHNODE_PAT;\n\nexport const graphQLClient = new GraphQLClient(API_URL, {\n  headers: {\n    Authorization: HASHNODE_PAT ? <code>Bearer ${HASHNODE_PAT}<\/code> : '',\n  },\n});\n\nexport const GET_USER_ARTICLES = gql<code>\n  query GetUserArticles($username: String!, $page: Int = 0) {\n    user(username: $username) {\n      publication {\n        posts(page: $page) {\n          _id\n          title\n          slug\n          publishedAt\n          brief\n          coverImage {\n            url\n          }\n        }\n      }\n    }\n  }\n<\/code>;\n\nexport const GET_SINGLE_ARTICLE = gql<code>\n  query GetSingleArticle($slug: String!, $hostname: String) {\n    publication(host: $hostname) {\n      post(slug: $slug) {\n        _id\n        title\n        slug\n        content {\n          markdown\n        }\n        publishedAt\n        coverImage {\n          url\n        }\n        author {\n          name\n          profilePicture\n        }\n      }\n    }\n  }\n<\/code>;<\/code><\/pre>\n<p><em>Not: <code>GET_SINGLE_ARTICLE<\/code> sorgusunda <code>hostname<\/code> de\u011fi\u015fkeni, e\u011fer Hashnode blogunuz \u00f6zel bir alan ad\u0131nda ise gereklidir. Aksi takdirde, <code>host<\/code> yerine <code>username<\/code> ile de sorgu yapabilirsiniz, ancak <code>publication(host: $hostname)<\/code> daha esnektir.<\/em><\/p>\n<h4>Ana Sayfa (T\u00fcm G\u00f6nderileri Listeleme)<\/h4>\n<p><code>pages\/index.tsx<\/code> dosyas\u0131n\u0131 d\u00fczenleyelim:<\/p>\n<pre><code class=\"language-typescript\">\/\/ pages\/index.tsx\nimport { GetStaticProps } from 'next';\nimport Link from 'next\/link';\nimport { graphQLClient, GET_USER_ARTICLES } from '..\/lib\/hashnode';\n\ninterface Post {\n  _id: string;\n  title: string;\n  slug: string;\n  publishedAt: string;\n  brief: string;\n  coverImage?: {\n    url: string;\n  };\n}\n\ninterface HomeProps {\n  posts: Post[];\n}\n\nexport const getStaticProps: GetStaticProps<HomeProps> = async () => {\n  const username = process.env.HASHNODE_USERNAME;\n  if (!username) {\n    throw new Error('HASHNODE_USERNAME is not defined in .env.local');\n  }\n\n  const data = await graphQLClient.request(GET_USER_ARTICLES, {\n    username,\n    page: 0,\n  });\n\n  const posts = data.user.publication.posts;\n\n  return {\n    props: {\n      posts,\n    },\n    revalidate: 60, \/\/ Her 60 saniyede bir yeniden olu\u015ftur\n  };\n};\n\nconst Home: React.FC<HomeProps> = ({ posts }) => {\n  return (\n    <div className=\"container mx-auto p-4\">\n      \n      <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8\">\n        {posts.map((post) => (\n          <div key={post._id} className=\"border rounded-lg shadow-md overflow-hidden\">\n            {post.coverImage && (\n              <img src={post.coverImage.url} alt={post.title} className=\"w-full h-48 object-cover\" \/>\n            )}\n            <div className=\"p-4\">\n              <h2 className=\"text-xl font-semibold mb-2\">\n                <Link href={<code>\/post\/${post.slug}<\/code>} className=\"text-blue-600 hover:underline\">\n                  {post.title}\n                <\/Link>\n              <\/h2>\n              <p className=\"text-gray-600 text-sm mb-2\">{new Date(post.publishedAt).toLocaleDateString()}<\/p>\n              <p className=\"text-gray-700\">{post.brief}<\/p>\n            <\/div>\n          <\/div>\n        ))}\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default Home;<\/code><\/pre>\n<p>Bu \u00f6rnekte Tailwind CSS s\u0131n\u0131flar\u0131 kullan\u0131lm\u0131\u015ft\u0131r. Projenize Tailwind CSS eklemek i\u00e7in Next.js dok\u00fcmantasyonuna bakabilirsiniz.<\/p>\n<h4>Dinamik G\u00f6nderi Sayfalar\u0131 (<code>[slug].tsx<\/code>)<\/h4>\n<p>G\u00f6nderi detaylar\u0131n\u0131 g\u00f6stermek i\u00e7in dinamik bir rota olu\u015fturaca\u011f\u0131z. <code>pages\/post\/[slug].tsx<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-typescript\">\/\/ pages\/post\/[slug].tsx\nimport { GetStaticPaths, GetStaticProps } from 'next';\nimport { graphQLClient, GET_USER_ARTICLES, GET_SINGLE_ARTICLE } from '..\/..\/lib\/hashnode';\nimport ReactMarkdown from 'react-markdown';\n\ninterface PostContent {\n  _id: string;\n  title: string;\n  content: {\n    markdown: string;\n  };\n  publishedAt: string;\n  coverImage?: {\n    url: string;\n  };\n  author: {\n    name: string;\n    profilePicture: string;\n  };\n}\n\ninterface PostProps {\n  post: PostContent;\n}\n\nexport const getStaticPaths: GetStaticPaths = async () => {\n  const username = process.env.HASHNODE_USERNAME;\n  if (!username) {\n    throw new Error('HASHNODE_USERNAME is not defined in .env.local');\n  }\n\n  const data = await graphQLClient.request(GET_USER_ARTICLES, {\n    username,\n    page: 0,\n  });\n  const posts = data.user.publication.posts;\n\n  const paths = posts.map((post: any) => ({\n    params: { slug: post.slug },\n  }));\n\n  return { paths, fallback: 'blocking' }; \/\/ blocking: yeni g\u00f6nderiler i\u00e7in sayfa olu\u015fturur\n};\n\nexport const getStaticProps: GetStaticProps<PostProps, { slug: string }> = async ({ params }) => {\n  const username = process.env.HASHNODE_USERNAME; \/\/ Kendi Hashnode kullan\u0131c\u0131 ad\u0131n\u0131z\n  const hostname = process.env.NEXT_PUBLIC_HASHNODE_HOSTNAME || 'blog.yourdomain.com'; \/\/ E\u011fer \u00f6zel bir alan ad\u0131n\u0131z varsa\n  \n  if (!params || !params.slug) {\n    return { notFound: true };\n  }\n\n  const data = await graphQLClient.request(GET_SINGLE_ARTICLE, {\n    slug: params.slug,\n    hostname: username ? null : hostname, \/\/ E\u011fer username varsa hostname'e gerek yok\n  });\n\n  const post = data.publication?.post || null;\n\n  if (!post) {\n    return { notFound: true };\n  }\n\n  return {\n    props: {\n      post,\n    },\n    revalidate: 60,\n  };\n};\n\nconst PostPage: React.FC<PostProps> = ({ post }) => {\n  return (\n    <div className=\"container mx-auto p-4 max-w-3xl\">\n      \n      <p className=\"text-gray-600 text-sm mb-4\">\n        Yazar: {post.author.name} - Yay\u0131nlanma Tarihi: {new Date(post.publishedAt).toLocaleDateString()}\n      <\/p>\n      {post.coverImage && (\n        <img src={post.coverImage.url} alt={post.title} className=\"w-full h-64 object-cover mb-6 rounded-lg\" \/>\n      )}\n      <div className=\"prose prose-lg max-w-none\">\n        <ReactMarkdown>{post.content.markdown}<\/ReactMarkdown>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default PostPage;<\/code><\/pre>\n<p><code>prose<\/code> s\u0131n\u0131flar\u0131, <code>tailwindcss\/typography<\/code> eklentisinden gelmektedir. Markdown i\u00e7eri\u011fini daha iyi bi\u00e7imlendirmek i\u00e7in bu eklentiyi kurman\u0131z ve <code>tailwind.config.js<\/code> dosyan\u0131za eklemeniz \u00f6nerilir.<\/p>\n<p>Uygulaman\u0131z\u0131 yerel olarak test etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">npm run dev\n<h2>veya yarn dev<\/code><\/pre>\n<\/h2>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine giderek blogunuzu g\u00f6r\u00fcnt\u00fcleyebilirsiniz.<\/p>\n<h3>DigitalOcean&#8217;da Da\u011f\u0131t\u0131m<\/h3>\n<p>Next.js uygulaman\u0131z\u0131 DigitalOcean&#8217;da da\u011f\u0131tmak i\u00e7in iki ana se\u00e7ene\u011finiz var: DigitalOcean App Platform (\u00f6nerilen) veya bir Droplet (sanal sunucu).<\/p>\n<h4>Se\u00e7enek 1: DigitalOcean App Platform (\u00d6nerilen)<\/h4>\n<p>DigitalOcean App Platform, Git deposundan do\u011frudan uygulama da\u011f\u0131t\u0131m\u0131 sa\u011flayan y\u00f6netilen bir hizmettir. CI\/CD, otomatik SSL, \u00f6l\u00e7ekleme gibi \u00f6zellikleri otomatik olarak y\u00f6netir.<\/p>\n<p>1.  <strong>Kodunuzu Git Deposuna Y\u00fckleyin:<\/strong> Next.js projenizi GitHub, GitLab veya Bitbucket gibi bir Git sa\u011flay\u0131c\u0131s\u0131na y\u00fckleyin.<br \/>\n2.  <strong>DigitalOcean App Platform&#8217;a Giri\u015f Yap\u0131n:<\/strong> DigitalOcean kontrol panelinize gidin ve sol men\u00fcden <code>Apps<\/code> se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n3.  <strong>Uygulama Olu\u015fturun:<\/strong> <code>Create App<\/code> d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n4.  <strong>Kaynak Se\u00e7imi:<\/strong> Git sa\u011flay\u0131c\u0131n\u0131z\u0131 se\u00e7in ve projenizin bulundu\u011fu depoyu ba\u011flay\u0131n. Next.js projenizin ana dal\u0131n\u0131 (\u00f6rn. <code>main<\/code> veya <code>master<\/code>) se\u00e7in.<br \/>\n5.  <strong>Kaynaklar\u0131 Yap\u0131land\u0131r\u0131n:<\/strong> DigitalOcean, projenizin bir Next.js uygulamas\u0131 oldu\u011funu otomatik olarak alg\u0131lamal\u0131d\u0131r.<br \/>\n    *   <strong>Type:<\/strong> Web Service<br \/>\n    *   <strong>Build Command:<\/strong> <code>npm run build<\/code> (veya <code>yarn build<\/code>)<br \/>\n    *   <strong>Run Command:<\/strong> <code>npm start<\/code> (veya <code>yarn start<\/code>)<br \/>\n    *   <strong>Environment Variables:<\/strong> <code>.env.local<\/code> dosyan\u0131zdaki de\u011fi\u015fkenleri buraya ekleyin. <code>HASHNODE_PAT<\/code> ve <code>HASHNODE_USERNAME<\/code> (veya <code>NEXT_PUBLIC_HASHNODE_HOSTNAME<\/code> e\u011fer \u00f6zel alan ad\u0131 kullan\u0131yorsan\u0131z) de\u011fi\u015fkenlerini eklemeyi unutmay\u0131n. <strong>PAT&#8217;nizi <code>Encrypted<\/code> olarak i\u015faretleyin.<\/strong><br \/>\n6.  <strong>Plan Se\u00e7imi:<\/strong> Uygulaman\u0131z i\u00e7in uygun bir plan se\u00e7in (Ba\u015flang\u0131\u00e7 seviyesi i\u00e7in &#8220;Basic&#8221; planlar yeterli olabilir).<br \/>\n7.  <strong>Uygulamay\u0131 Da\u011f\u0131t\u0131n:<\/strong> <code>Launch App<\/code> d\u00fc\u011fmesine t\u0131klay\u0131n. DigitalOcean kodunuzu \u00e7ekip, derleyecek ve da\u011f\u0131tacakt\u0131r. Bu i\u015flem birka\u00e7 dakika s\u00fcrebilir.<br \/>\n8.  <strong>Alan Ad\u0131 Yap\u0131land\u0131rmas\u0131 (\u0130ste\u011fe Ba\u011fl\u0131):<\/strong> Uygulaman\u0131z da\u011f\u0131t\u0131ld\u0131ktan sonra, DigitalOcean size ge\u00e7ici bir URL sa\u011flayacakt\u0131r. Kendi alan ad\u0131n\u0131z\u0131 ba\u011flamak isterseniz, <code>Settings<\/code> sekmesinden <code>Domains<\/code> b\u00f6l\u00fcm\u00fcne gidin ve alan ad\u0131n\u0131z\u0131 ekleyin. DigitalOcean size y\u00f6nlendirme i\u00e7in gerekli DNS kay\u0131tlar\u0131n\u0131 (CNAME veya A kayd\u0131) sa\u011flayacakt\u0131r. Bu kay\u0131tlar\u0131 alan ad\u0131 sa\u011flay\u0131c\u0131n\u0131z\u0131n DNS y\u00f6netimi panelinde yap\u0131land\u0131rman\u0131z gerekir.<\/p>\n<p>Art\u0131k her Git deposuna push yapt\u0131\u011f\u0131n\u0131zda, DigitalOcean App Platform otomatik olarak uygulaman\u0131z\u0131 yeniden derleyip da\u011f\u0131tacakt\u0131r. Bu, geli\u015ftirme s\u00fcrecinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<h4>Se\u00e7enek 2: DigitalOcean Droplet \u00dczerinde Da\u011f\u0131t\u0131m (Daha Fazla Kontrol)<\/h4>\n<p>E\u011fer sunucu y\u00f6netimi konusunda daha fazla kontrol istiyorsan\u0131z veya daha karma\u015f\u0131k bir altyap\u0131n\u0131z varsa, bir Droplet \u00fczerinde da\u011f\u0131t\u0131m yapabilirsiniz.<\/p>\n<p>1.  <strong>Droplet Olu\u015fturun:<\/strong><br \/>\n    *   DigitalOcean kontrol panelinizden <code>Create -> Droplets<\/code> se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   Bir Ubuntu s\u00fcr\u00fcm\u00fc se\u00e7in (\u00f6rn. Ubuntu 22.04 LTS).<br \/>\n    *   Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na uygun bir plan se\u00e7in (en az 1GB RAM \u00f6nerilir).<br \/>\n    *   Bir veri merkezi konumu se\u00e7in.<br \/>\n    *   SSH anahtar\u0131n\u0131z\u0131 ekleyin veya yeni bir anahtar olu\u015fturun.<br \/>\n    *   Bir Droplet ad\u0131 verin ve <code>Create Droplet<\/code> d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n2.  <strong>SSH ile Droplet&#8217;e Ba\u011flan\u0131n:<\/strong><br \/>\n    *   Droplet&#8217;iniz olu\u015fturulduktan sonra IP adresini kopyalay\u0131n.<br \/>\n    *   Terminalinizden SSH ile ba\u011flan\u0131n: <code>ssh root@your_droplet_ip<\/code><br \/>\n3.  <strong>Node.js ve npm Kurulumu:<\/strong><br \/>\n    *   Droplet&#8217;e ba\u011fland\u0131ktan sonra Node.js ve npm&#8217;i kurun (e\u011fer kurulu de\u011filse):<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/deb.nodesource.com\/setup_lts.x | sudo -E bash -\n        sudo apt-get install -y nodejs<\/code><\/pre>\n<p>4.  <strong>Git Kurulumu:<\/strong><br \/>\n    *   <code>sudo apt-get install -y git<\/code><br \/>\n5.  <strong>Uygulaman\u0131z\u0131 Klonlay\u0131n:<\/strong><br \/>\n    *   Git deponuzu Droplet&#8217;inize klonlay\u0131n: <code>git clone your_repo_url \/var\/www\/my-headless-hashnode-blog<\/code><br \/>\n    *   Dizinine gidin: <code>cd \/var\/www\/my-headless-hashnode-blog<\/code><br \/>\n6.  <strong>Ortam De\u011fi\u015fkenlerini Ayarlay\u0131n:<\/strong><br \/>\n    *   <code>.env.local<\/code> dosyas\u0131n\u0131 sunucuda manuel olarak olu\u015fturun ve gerekli de\u011fi\u015fkenleri ekleyin. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">nano .env.local\n        # \u0130\u00e7ine:\n        # NEXT_PUBLIC_HASHNODE_API_URL=https:\/\/gql.hashnode.com\/\n        # HASHNODE_PAT=your_hashnode_personal_access_token\n        # HASHNODE_USERNAME=your_hashnode_username\n        # Kaydet ve \u00e7\u0131k (Ctrl+X, Y, Enter)<\/code><\/pre>\n<p>7.  <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurun ve Uygulamay\u0131 Derleyin:<\/strong><br \/>\n    *   <code>npm install<\/code> (veya <code>yarn install<\/code>)<br \/>\n    *   <code>npm run build<\/code> (veya <code>yarn build<\/code>)<br \/>\n8.  <strong>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131r\u0131n (PM2 ile):<\/strong><br \/>\n    *   Uygulaman\u0131z\u0131 s\u00fcrekli \u00e7al\u0131\u015ft\u0131rmak ve s\u00fcre\u00e7 y\u00f6netimi i\u00e7in PM2&#8217;yi kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo npm install -g pm2\n        pm2 start npm --name \"my-hashnode-blog\" -- start\n        pm2 save\n        pm2 startup<\/code><\/pre>\n<p>9.  <strong>Nginx ile Reverse Proxy ve SSL (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir):<\/strong><br \/>\n    *   Nginx&#8217;i kurun: <code>sudo apt-get install -y nginx<\/code><br \/>\n    *   Nginx yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun (<code>\/etc\/nginx\/sites-available\/my-hashnode-blog<\/code>):<\/p>\n<pre><code class=\"language-nginx\">server {\n            listen 80;\n            server_name your_domain.com www.your_domain.com; # Kendi alan ad\u0131n\u0131z\u0131 girin\n\n            location \/ {\n                proxy_pass http:\/\/localhost:3000; # Next.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n                proxy_http_version 1.1;\n                proxy_set_header Upgrade $http_upgrade;\n                proxy_set_header Connection 'upgrade';\n                proxy_set_header Host $host;\n                proxy_cache_bypass $http_upgrade;\n            }\n        }<\/code><\/pre>\n<p>    *   Yap\u0131land\u0131rma dosyas\u0131n\u0131 etkinle\u015ftirin ve Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-hashnode-blog \/etc\/nginx\/sites-enabled\/\n        sudo nginx -t\n        sudo systemctl restart nginx<\/code><\/pre>\n<p>    *   <strong>SSL (Let&#8217;s Encrypt ile Certbot):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo snap install core\n        sudo snap refresh core\n        sudo snap install --classic certbot\n        sudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot\n        sudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>        Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak g\u00fcncelleyecek ve SSL sertifikalar\u0131n\u0131 y\u00fckleyecektir.<br \/>\n10. <strong>G\u00fcvenlik Duvar\u0131 (UFW) Yap\u0131land\u0131rmas\u0131:<\/strong><br \/>\n    *   Gerekli portlar\u0131 a\u00e7\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow OpenSSH\n        sudo ufw allow 'Nginx Full'\n        sudo ufw enable<\/code><\/pre>\n<p>Bu ad\u0131mlarla, Next.js uygulaman\u0131z Droplet \u00fczerinde \u00e7al\u0131\u015facak ve Nginx arac\u0131l\u0131\u011f\u0131yla eri\u015filebilir olacakt\u0131r.<\/p>\n<h3>S\u00fcrekli Entegrasyon ve Da\u011f\u0131t\u0131m (CI\/CD)<\/h3>\n<p>DigitalOcean App Platform kullan\u0131yorsan\u0131z, CI\/CD s\u00fcreci zaten otomatiktir. Git deponuza yapt\u0131\u011f\u0131n\u0131z her push, uygulaman\u0131z\u0131n otomatik olarak yeniden da\u011f\u0131t\u0131lmas\u0131n\u0131 tetikler. Bu, geli\u015ftirme s\u00fcrecinizi basitle\u015ftirir ve h\u0131zland\u0131r\u0131r.<\/p>\n<p>E\u011fer bir Droplet \u00fczerinde da\u011f\u0131t\u0131m yap\u0131yorsan\u0131z, CI\/CD&#8217;yi manuel olarak yap\u0131land\u0131rman\u0131z gerekir. GitHub Actions, GitLab CI\/CD veya Jenkins gibi ara\u00e7lar\u0131 kullanarak, kodunuzu her push etti\u011finizde Droplet&#8217;inize otomatik olarak da\u011f\u0131t\u0131m yapacak i\u015f ak\u0131\u015flar\u0131 (workflows) olu\u015fturabilirsiniz. Bu, genellikle SSH \u00fczerinden sunucuya ba\u011flan\u0131p <code>git pull<\/code>, <code>npm install<\/code>, <code>npm run build<\/code> ve <code>pm2 restart<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmay\u0131 i\u00e7erir.<\/p>\n<h3>SEO ve Performans \u0130pu\u00e7lar\u0131<\/h3>\n<p>Headless mimari, SEO ve performans \u00fczerinde tam kontrol sahibi olman\u0131z\u0131 sa\u011flar.<\/p>\n<p>*   <strong>Statik Site \u00dcretimi (SSG):<\/strong> Next.js&#8217;in <code>getStaticProps<\/code> ve <code>getStaticPaths<\/code> gibi fonksiyonlar\u0131, blogunuzun sayfalar\u0131n\u0131 derleme zaman\u0131nda (build time) statik HTML dosyalar\u0131 olarak olu\u015fturman\u0131za olanak tan\u0131r. Bu, sayfalar\u0131n \u00e7ok h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar ve SEO i\u00e7in idealdir. \u0130\u00e7erik g\u00fcncellendi\u011finde (\u00f6rn. Hashnode&#8217;da yeni bir yaz\u0131 yay\u0131nland\u0131\u011f\u0131nda), Next.js&#8217;in <code>revalidate<\/code> se\u00e7ene\u011fi (Incremental Static Regeneration &#8211; ISR) veya bir webhook ile yeniden derleme tetikleyebilirsiniz.<br \/>\n*   <strong>Metadata ve SEO:<\/strong> Her sayfa i\u00e7in uygun <code>title<\/code> etiketleri, <code>meta description<\/code> ve Open Graph etiketleri ekleyin. Next.js&#8217;in <code>next\/head<\/code> bile\u015fenini kullanarak bunu kolayca yapabilirsiniz.<br \/>\n*   <strong>Anlamsal HTML:<\/strong> Ba\u015fl\u0131k etiketlerini (h1, h2, h3), paragraflar\u0131 (p) ve di\u011fer HTML etiketlerini do\u011fru ve anlamsal bir \u015fekilde kullan\u0131n.<br \/>\n*   <strong>Resim Optimizasyonu:<\/strong> <code>next\/image<\/code> bile\u015fenini kullanarak resimleri otomatik olarak optimize edin, lazy load (tembel y\u00fckleme) uygulay\u0131n ve uygun boyutlarda sunun.<br \/>\n*   <strong>H\u0131z Optimizasyonu:<\/strong> CSS ve JavaScript dosyalar\u0131n\u0131 k\u00fc\u00e7\u00fclt\u00fcn (minify), gereksiz kodlar\u0131 kald\u0131r\u0131n ve taray\u0131c\u0131 \u00f6nbellekleme mekanizmalar\u0131n\u0131 kullan\u0131n.<br \/>\n*   <strong>Sitemap ve Robots.txt:<\/strong> Arama motorlar\u0131n\u0131n blogunuzu daha iyi taramas\u0131 i\u00e7in bir sitemap.xml dosyas\u0131 olu\u015fturun ve robots.txt dosyan\u0131z\u0131 do\u011fru yap\u0131land\u0131r\u0131n.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Ba\u015fka bir frontend \u00e7at\u0131s\u0131 kullanabilir miyim?<\/strong><br \/>\nKesinlikle! Headless mimarinin g\u00fczelli\u011fi budur. React, Vue, Angular, Svelte veya Gatsby gibi herhangi bir frontend \u00e7at\u0131s\u0131n\u0131 kullanabilirsiniz. Veri \u00e7ekme mant\u0131\u011f\u0131 benzer olacakt\u0131r.<\/p>\n<p><strong>2. Hashnode&#8217;daki yorumlar\u0131m\u0131 nas\u0131l g\u00f6steririm?<\/strong><br \/>\nHashnode API&#8217;si \u015fu anda yorumlara do\u011frudan eri\u015fim sa\u011flamaz. Ancak, Discus, Commento veya Hyvor Talk gibi \u00fc\u00e7\u00fcnc\u00fc taraf bir yorum sistemini frontend uygulaman\u0131za entegre edebilirsiniz.<\/p>\n<p><strong>3. Hashnode API&#8217;sinde bir de\u011fi\u015fiklik olursa ne olur?<\/strong><br \/>\nHashnode, API kararl\u0131l\u0131\u011f\u0131n\u0131 korumaya \u00e7al\u0131\u015f\u0131r. Ancak b\u00fcy\u00fck bir s\u00fcr\u00fcm de\u011fi\u015fikli\u011fi (\u00f6rn. v1&#8217;den v2&#8217;ye ge\u00e7i\u015f) olursa, sorgular\u0131n\u0131z\u0131 ve veri i\u015fleme mant\u0131\u011f\u0131n\u0131z\u0131 g\u00fcncellemeniz gerekebilir. Bu t\u00fcr de\u011fi\u015fiklikler genellikle \u00f6nceden duyurulur.<\/p>\n<p><strong>4. Maliyetler ne kadar olur?<\/strong><br \/>\nDigitalOcean App Platform veya Droplet&#8217;in maliyetleri se\u00e7ti\u011finiz plana ve kullan\u0131m\u0131n\u0131za g\u00f6re de\u011fi\u015fir. K\u00fc\u00e7\u00fck bir blog i\u00e7in ayl\u0131k birka\u00e7 dolardan ba\u015flayan fiyatlarla hizmet alabilirsiniz. Hashnode&#8217;un kendisi \u00fccretsizdir.<\/p>\n<p><strong>5. Blogumdaki i\u00e7eri\u011fi nas\u0131l g\u00fcncellerim?<\/strong><br \/>\n\u0130\u00e7eri\u011fi Hashnode&#8217;un kendi platformunda yazmaya ve d\u00fczenlemeye devam edersiniz. E\u011fer frontend&#8217;iniz SSG kullan\u0131yorsa, i\u00e7eri\u011fi g\u00fcncelledi\u011finizde otomatik olarak yeniden derlenmesi i\u00e7in bir webhook kurman\u0131z veya DigitalOcean App Platform&#8217;un otomatik da\u011f\u0131t\u0131m \u00f6zelli\u011fini kullanman\u0131z gerekir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Hashnode&#8217;u headless bir CMS olarak kullanarak, Next.js ile bir blog frontend&#8217;i geli\u015ftirmeyi ve bu uygulamay\u0131 DigitalOcean \u00fczerinde da\u011f\u0131tmay\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Headless mimarinin sundu\u011fu esneklik ve performans avantajlar\u0131 sayesinde, kendi markan\u0131za ve ihtiya\u00e7lar\u0131n\u0131za tamamen uygun, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir bir blog deneyimi yaratabilirsiniz.<\/p>\n<p>DigitalOcean&#8217;\u0131n geli\u015ftirici dostu platformu, uygulama da\u011f\u0131t\u0131m\u0131n\u0131 ve y\u00f6netimini kolayla\u015ft\u0131r\u0131rken, Hashnode&#8217;un g\u00fc\u00e7l\u00fc GraphQL API&#8217;si i\u00e7eri\u011finize sorunsuz eri\u015fim sa\u011flar. Bu kombinasyon, modern web geli\u015ftirme prensiplerini benimseyen herkes i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 setidir.<\/p>\n<p>Art\u0131k kendi \u00f6zelle\u015ftirilmi\u015f headless blogunuzu kurmak i\u00e7in gerekli bilgiye sahipsiniz. Deneyler yapmaktan, farkl\u0131 frontend teknolojilerini ke\u015ffetmekten ve blogunuzu kendi benzersiz vizyonunuzla \u015fekillendirmekten \u00e7ekinmeyin. \u0130yi bloglamalar!<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7\nGiri\u015f: Modern Bloglama Deneyimine Ho\u015f Geldiniz\nG\u00fcn\u00fcm\u00fcz\u00fcn dijital","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":[136],"tags":[],"class_list":{"0":"post-38964","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 - 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\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7\" \/>\n<meta property=\"og:description\" content=\"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 Giri\u015f: Modern Bloglama Deneyimine Ho\u015f Geldiniz G\u00fcn\u00fcm\u00fcz\u00fcn dijital\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-11T13:40:59+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7\",\"datePublished\":\"2026-02-11T13:40:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\"},\"wordCount\":3680,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\",\"name\":\"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-11T13:40:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7\"}]},{\"@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":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 - 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\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/","og_locale":"tr_TR","og_type":"article","og_title":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7","og_description":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 Giri\u015f: Modern Bloglama Deneyimine Ho\u015f Geldiniz G\u00fcn\u00fcm\u00fcz\u00fcn dijital","og_url":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-11T13:40:59+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7","datePublished":"2026-02-11T13:40:59+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/"},"wordCount":3680,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/","url":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/","name":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-11T13:40:59+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/headless-hashnode-ile-digitalocean-uzerinde-blogunuzu-kurmaya-baslangic\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Headless Hashnode ile DigitalOcean \u00dczerinde Blogunuzu Kurmaya Ba\u015flang\u0131\u00e7"}]},{"@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\/38964","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=38964"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38964\/revisions"}],"predecessor-version":[{"id":38965,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38964\/revisions\/38965"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}