{"id":31491,"date":"2025-10-10T14:01:56","date_gmt":"2025-10-10T11:01:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/"},"modified":"2025-10-10T14:01:56","modified_gmt":"2025-10-10T11:01:56","slug":"sanityden-strapiye-gecis-adim-adim-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/","title":{"rendered":"Sanity&#8217;den Strapi&#8217;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>\nModern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi&#8217;ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi&#8217;ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.\n<\/p>\n<p>\nG\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, h\u0131zla de\u011fi\u015fen ihtiya\u00e7lar ve artan beklentiler, \u015firketleri ve geli\u015ftiricileri esnek i\u00e7erik y\u00f6netim sistemleri (CMS) kullanmaya itmektedir. Headless CMS \u00e7\u00f6z\u00fcmleri, i\u00e7erik \u00fcretimi ile sunumunu ay\u0131rarak bu esnekli\u011fi sunar. Sanity.io, kullan\u0131c\u0131 dostu aray\u00fcz\u00fc, g\u00fc\u00e7l\u00fc GROQ\/GraphQL API&#8217;leri ve ger\u00e7ek zamanl\u0131 i\u015fbirli\u011fi yetenekleriyle \u00f6ne \u00e7\u0131kan pop\u00fcler bir SaaS (Hizmet Olarak Yaz\u0131l\u0131m) tabanl\u0131 headless CMS&#8217;tir. Ancak, her SaaS \u00e7\u00f6z\u00fcm\u00fcnde oldu\u011fu gibi, Sanity&#8217;nin de kendine \u00f6zg\u00fc limitasyonlar\u0131 bulunur. Projeniz b\u00fcy\u00fcd\u00fck\u00e7e, maliyetler, veri egemenli\u011fi, \u00f6zelle\u015ftirme derinli\u011fi veya altyap\u0131 \u00fczerindeki tam kontrol arzusu gibi fakt\u00f6rler, sizi farkl\u0131 bir y\u00f6ne bakmaya itebilir.\n<\/p>\n<p>\nStrapi ise, Node.js tabanl\u0131, a\u00e7\u0131k kaynakl\u0131 ve kendini bar\u0131nd\u0131r\u0131labilen (self-hostable) bir headless CMS olarak, bu noktada g\u00fc\u00e7l\u00fc bir alternatif sunar. Strapi&#8217;ye ge\u00e7i\u015f karar\u0131, genellikle uzun vadeli stratejik bir ad\u0131m olarak de\u011ferlendirilir ve a\u015fa\u011f\u0131daki nedenlere dayanabilir:\n<\/p>\n<ul>\n<li>\n        <strong>Maliyet Kontrol\u00fc:<\/strong> Sanity&#8217;nin kullan\u0131m tabanl\u0131 fiyatland\u0131rma modeli, b\u00fcy\u00fck veri setleri veya y\u00fcksek trafikli projeler i\u00e7in zamanla maliyetli hale gelebilir. Strapi, a\u00e7\u0131k kaynak olmas\u0131 sayesinde lisans maliyeti olmaks\u0131z\u0131n kendi sunucunuzda \u00e7al\u0131\u015ft\u0131r\u0131labilir, bu da uzun vadede i\u015fletme maliyetlerini d\u00fc\u015f\u00fcrebilir.\n    <\/li>\n<li>\n        <strong>Veri Egemenli\u011fi ve G\u00fcvenlik:<\/strong> Hassas verilerle \u00e7al\u0131\u015fan projeler i\u00e7in, verilerin kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131r\u0131lmas\u0131 ve tam kontrol sahibi olmak b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Strapi, verilerinizi istedi\u011finiz veritaban\u0131nda (PostgreSQL, MySQL, MongoDB vb.) ve istedi\u011finiz altyap\u0131da (AWS, Azure, Google Cloud, \u00f6zel sunucular) saklama imkan\u0131 sunar.\n    <\/li>\n<li>\n        <strong>Tam \u00d6zelle\u015ftirme ve Esneklik:<\/strong> Sanity g\u00fc\u00e7l\u00fc bir platform olsa da, baz\u0131 \u00f6zel i\u015flevsellikler veya karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 i\u00e7in s\u0131n\u0131rlamalara sahip olabilir. Strapi, tamamen a\u00e7\u0131k kaynak kodlu oldu\u011fu i\u00e7in, \u00e7ekirdek kodunu ve eklentilerini diledi\u011finiz gibi \u00f6zelle\u015ftirebilir, i\u015f s\u00fcre\u00e7lerinize birebir uyacak \u015fekilde geli\u015ftirebilirsiniz.\n    <\/li>\n<li>\n        <strong>Geli\u015ftirici Deneyimi:<\/strong> Node.js ekosistemine a\u015fina olan geli\u015ftiriciler i\u00e7in Strapi, tan\u0131d\u0131k bir ortam sunar ve mevcut ara\u00e7larla kolayca entegre edilebilir. Geli\u015ftirici toplulu\u011fu ve geni\u015f eklenti ekosistemi de \u00f6nemli bir avantajd\u0131r.\n    <\/li>\n<\/ul>\n<p>\nBu rehber, Sanity&#8217;den Strapi&#8217;ye ge\u00e7i\u015fin nedenlerini detayl\u0131 bir \u015fekilde anlaman\u0131z\u0131n yan\u0131 s\u0131ra, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m nas\u0131l y\u00f6netece\u011finizi pratik \u00f6rneklerle g\u00f6sterecektir. Ge\u00e7i\u015f s\u00fcreci, dikkatli planlama ve teknik bilgi gerektirir, ancak do\u011fru yakla\u015f\u0131mla projelerinize yeni bir soluk getirebilir ve gelecekteki b\u00fcy\u00fcme i\u00e7in sa\u011flam bir temel olu\u015fturabilir.\n<\/p>\n<h2>Temel Kavramlar: Sanity ve Strapi&#8217;yi Tan\u0131yal\u0131m m\u0131?<\/h2>\n<p>\nSanity&#8217;den Strapi&#8217;ye ge\u00e7i\u015f yapmadan \u00f6nce, her iki headless CMS&#8217;in temel \u00f6zelliklerini, g\u00fc\u00e7l\u00fc ve zay\u0131f y\u00f6nlerini anlamak, ge\u00e7i\u015f stratejinizi belirlemede size yard\u0131mc\u0131 olacakt\u0131r. Bu b\u00f6l\u00fcm, her iki platforma genel bir bak\u0131\u015f sunarak, aralar\u0131ndaki temel farklar\u0131 ve ge\u00e7i\u015f karar\u0131n\u0131n hangi durumlarda mant\u0131kl\u0131 oldu\u011funu a\u00e7\u0131klayacakt\u0131r.\n<\/p>\n<h3>Sanity.io Nedir ve Neden Tercih Edilir?<\/h3>\n<p>\nSanity.io, &#8220;i\u00e7erik bir veridir&#8221; felsefesi \u00fczerine kurulu, ger\u00e7ek zamanl\u0131 i\u015fbirli\u011fi yeteneklerine sahip, bulut tabanl\u0131 bir headless CMS&#8217;tir. Geli\u015ftiricilerin ve i\u00e7erik \u00fcreticilerinin yap\u0131land\u0131r\u0131lm\u0131\u015f i\u00e7eri\u011fi kolayca olu\u015fturmas\u0131n\u0131, y\u00f6netmesini ve da\u011f\u0131tmas\u0131n\u0131 sa\u011flar. Sanity&#8217;nin en belirgin \u00f6zellikleri \u015funlard\u0131r:\n<\/p>\n<ul>\n<li>\n        <strong>Portable Text:<\/strong> Zengin metin i\u00e7eri\u011fini JSON tabanl\u0131, ta\u015f\u0131nabilir bir formatta depolayan g\u00fc\u00e7l\u00fc bir edit\u00f6r. Bu, i\u00e7eri\u011fin herhangi bir frontend&#8217;e uyarlanabilir olmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<li>\n        <strong>GROQ ve GraphQL API&#8217;leri:<\/strong> \u0130\u00e7eri\u011fe eri\u015fmek i\u00e7in hem kendi g\u00fc\u00e7l\u00fc sorgu dili GROQ&#8217;u hem de end\u00fcstri standard\u0131 GraphQL&#8217;i destekler. Bu, geli\u015ftiricilere esnek ve verimli veri \u00e7ekme yetenekleri sunar.\n    <\/li>\n<li>\n        <strong>Sanity Studio:<\/strong> React tabanl\u0131, a\u00e7\u0131k kaynakl\u0131 bir i\u00e7erik y\u00f6netim paneli olup, projeye \u00f6zel olarak kolayca \u00f6zelle\u015ftirilebilir.\n    <\/li>\n<li>\n        <strong>Ger\u00e7ek Zamanl\u0131 \u0130\u015fbirli\u011fi:<\/strong> Birden fazla kullan\u0131c\u0131n\u0131n ayn\u0131 anda i\u00e7erik \u00fczerinde \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r, bu da ekip verimlili\u011fini art\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>Varl\u0131k Y\u00f6netimi:<\/strong> Medya varl\u0131klar\u0131n\u0131 (g\u00f6rseller, videolar vb.) y\u00f6netmek ve optimize etmek i\u00e7in yerle\u015fik bir sistem sunar.\n    <\/li>\n<\/ul>\n<p>\nSanity&#8217;nin tercih edilme nedenleri aras\u0131nda h\u0131zl\u0131 kurulum, bak\u0131m y\u00fck\u00fcn\u00fcn olmamas\u0131 (SaaS oldu\u011fu i\u00e7in), g\u00fc\u00e7l\u00fc API&#8217;leri ve geli\u015ftirici dostu yap\u0131s\u0131 say\u0131labilir. Ancak, SaaS tabanl\u0131 olmas\u0131 nedeniyle platforma ba\u011f\u0131ml\u0131l\u0131k, kullan\u0131m artt\u0131k\u00e7a artan maliyetler ve baz\u0131 derin \u00f6zelle\u015ftirme k\u0131s\u0131tlamalar\u0131 dezavantajlar\u0131 aras\u0131ndad\u0131r.\n<\/p>\n<h3>Strapi Nedir ve Neden Pop\u00fclerdir?<\/h3>\n<p>\nStrapi, geli\u015ftiricilere kendi altyap\u0131lar\u0131 \u00fczerinde tam kontrol sa\u011flayan, a\u00e7\u0131k kaynakl\u0131, Node.js tabanl\u0131, API odakl\u0131 bir headless CMS&#8217;tir. &#8220;Ba\u015fka bir Node.js projesi olu\u015fturmaktan daha h\u0131zl\u0131&#8221; slogan\u0131yla yola \u00e7\u0131kan Strapi, i\u00e7erik modelleme, API olu\u015fturma ve medya y\u00f6netimi gibi temel headless CMS i\u015flevlerini sunar. Temel \u00f6zellikleri:\n<\/p>\n<ul>\n<li>\n        <strong>Self-Host \u0130mkan\u0131:<\/strong> Projeyi kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma yetene\u011fi, tam veri egemenli\u011fi ve g\u00fcvenlik kontrol\u00fc sa\u011flar.\n    <\/li>\n<li>\n        <strong>Esnek Veritaban\u0131 Deste\u011fi:<\/strong> PostgreSQL, MySQL, SQLite, MongoDB gibi \u00e7e\u015fitli veritabanlar\u0131n\u0131 destekler, bu da mevcut altyap\u0131n\u0131za uyum sa\u011flaman\u0131za olanak tan\u0131r.\n    <\/li>\n<li>\n        <strong>A\u00e7\u0131k Kaynak ve Geni\u015fletilebilirlik:<\/strong> Tamamen a\u00e7\u0131k kaynakl\u0131d\u0131r, bu da topluluk deste\u011fi, s\u00fcrekli geli\u015fim ve kod seviyesinde derin \u00f6zelle\u015ftirme imkan\u0131 sunar. Plugin sistemi sayesinde ek fonksiyonellikler kolayca entegre edilebilir.\n    <\/li>\n<li>\n        <strong>Geni\u015f API Deste\u011fi:<\/strong> REST ve GraphQL API&#8217;lerini otomatik olarak olu\u015fturur, geli\u015ftiricilerin farkl\u0131 frontend teknolojileriyle kolayca entegrasyon yapmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<li>\n        <strong>Kullan\u0131c\u0131 Dostu Admin Paneli:<\/strong> \u0130\u00e7erik y\u00f6neticileri i\u00e7in sezgisel bir aray\u00fcz sunar, i\u00e7erik olu\u015fturma ve d\u00fczenleme s\u00fcre\u00e7lerini kolayla\u015ft\u0131r\u0131r.\n    <\/li>\n<\/ul>\n<p>\nStrapi&#8217;nin pop\u00fclaritesi, sundu\u011fu kontrol, esneklik ve a\u00e7\u0131k kaynak felsefesinden gelir. Ba\u015flang\u0131\u00e7taki kurulum ve altyap\u0131 y\u00f6netimi ek bir \u00e7aba gerektirse de, uzun vadede maliyet avantaj\u0131 ve \u00f6zelle\u015ftirme yetenekleri sayesinde bir\u00e7ok proje i\u00e7in tercih sebebi olur. \u00d6zellikle GDPR veya di\u011fer veri koruma d\u00fczenlemeleri gibi belirli uyumluluk gereksinimleri olan kurumlar i\u00e7in Strapi ideal bir \u00e7\u00f6z\u00fcm olabilir.\n<\/p>\n<p>\n\u00d6zetle, Sanity h\u0131zl\u0131 ba\u015flang\u0131\u00e7lar ve bak\u0131m gerektirmeyen bir SaaS deneyimi sunarken, Strapi maksimum kontrol, \u00f6zelle\u015ftirme ve maliyet verimlili\u011fi arayanlar i\u00e7in g\u00fc\u00e7l\u00fc bir platformdur. Ge\u00e7i\u015f karar\u0131, projenizin mevcut ve gelecekteki ihtiya\u00e7lar\u0131na, b\u00fct\u00e7esine ve teknik ekibinizin yeteneklerine g\u00f6re dikkatlice de\u011ferlendirilmelidir.\n<\/p>\n<h2>Sanity&#8217;den Strapi&#8217;ye Veri Ta\u015f\u0131ma S\u00fcreci: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber<\/h2>\n<p>\nSanity&#8217;den Strapi&#8217;ye ge\u00e7i\u015fin en kritik ve teknik k\u0131sm\u0131, mevcut verilerinizi g\u00fcvenli ve do\u011fru bir \u015fekilde yeni platforma ta\u015f\u0131makt\u0131r. Bu b\u00f6l\u00fcm, ad\u0131m ad\u0131m bir rehber sunarak, bu s\u00fcreci sorunsuz bir \u015fekilde tamamlaman\u0131za yard\u0131mc\u0131 olacak ve olas\u0131 zorluklara kar\u015f\u0131 \u00e7\u00f6z\u00fcmler \u00f6nerecektir.\n<\/p>\n<h3>Ad\u0131m 1: Sanity Verilerinizi D\u0131\u015fa Aktarma<\/h3>\n<p>\nGe\u00e7i\u015f s\u00fcrecinin ilk ad\u0131m\u0131, Sanity&#8217;deki mevcut t\u00fcm verilerinizi d\u0131\u015fa aktarmakt\u0131r. Sanity CLI (Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc) bu i\u015flemi olduk\u00e7a basit hale getirir.\n<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: D\u0131\u015fa aktarma i\u015flemine ba\u015flamadan \u00f6nce Sanity projenizin yede\u011fini ald\u0131\u011f\u0131n\u0131zdan emin olun. Bu, herhangi bir beklenmedik durumda verilerinizi koruman\u0131z\u0131 sa\u011flar.<\/div>\n<p>\nSanity CLI&#8217;yi zaten y\u00fckl\u00fc de\u011filse, a\u015fa\u011f\u0131daki komutla y\u00fckleyebilirsiniz:\n<\/p>\n<pre><code class=\"language-bash\">\nnpm install -g @sanity\/cli\n<\/pre>\n<p><\/code><\/p>\n<p>\nArd\u0131ndan, projenizin k\u00f6k dizininde veya herhangi bir yerden a\u015fa\u011f\u0131daki komutu kullanarak verilerinizi d\u0131\u015fa aktarabilirsiniz. Bu komut, belirtilen dataset'teki t\u00fcm d\u00f6k\u00fcmanlar\u0131 NDJSON (New-line Delimited JSON) format\u0131nda s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f bir tar.gz dosyas\u0131na kaydeder.\n<\/p>\n<pre><code class=\"language-bash\">\nsanity dataset export production sanity-export.tar.gz --raw\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu komuttaki <code>production<\/code> varsay\u0131lan dataset ad\u0131d\u0131r. Farkl\u0131 bir dataset kullan\u0131yorsan\u0131z, o dataset ad\u0131n\u0131 belirtmeniz gerekir. <code>--raw<\/code> bayra\u011f\u0131, meta verileri de dahil olmak \u00fczere t\u00fcm ham verinin d\u0131\u015fa aktar\u0131lmas\u0131n\u0131 sa\u011flar. D\u0131\u015fa aktarma tamamland\u0131\u011f\u0131nda, <code>sanity-export.tar.gz<\/code> adl\u0131 bir dosya olu\u015fturulacakt\u0131r. Bu dosyay\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda, her sat\u0131r\u0131n bir Sanity d\u00f6k\u00fcman\u0131 oldu\u011fu <code>.ndjson<\/code> uzant\u0131l\u0131 bir dosya bulacaks\u0131n\u0131z. Bu dosya, Strapi'ye aktaraca\u011f\u0131m\u0131z ana veri kayna\u011f\u0131m\u0131z olacak.\n<\/p>\n<h3>Ad\u0131m 2: Yeni Bir Strapi Projesi Kurma<\/h3>\n<p>\nVerileriniz haz\u0131r oldu\u011funda, bir sonraki ad\u0131m yeni bir Strapi projesi kurmakt\u0131r. Strapi, Node.js tabanl\u0131 oldu\u011fu i\u00e7in bilgisayar\u0131n\u0131zda Node.js ve npm (veya Yarn) kurulu olmal\u0131d\u0131r.\n<\/p>\n<p>\nA\u015fa\u011f\u0131daki komutla h\u0131zl\u0131ca yeni bir Strapi projesi olu\u015fturabilirsiniz:\n<\/p>\n<pre><code class=\"language-bash\">\nnpx create-strapi-app@latest my-strapi-project --quickstart\n<\/pre>\n<p><\/code><\/p>\n<p>\n<code>my-strapi-project<\/code> yerine projenizin ad\u0131n\u0131 yazabilirsiniz. <code>--quickstart<\/code> bayra\u011f\u0131, varsay\u0131lan olarak SQLite veritaban\u0131 ile h\u0131zl\u0131 bir kurulum yapar. E\u011fer PostgreSQL, MySQL veya MongoDB gibi farkl\u0131 bir veritaban\u0131 kullanmak istiyorsan\u0131z, <code>--quickstart<\/code> bayra\u011f\u0131n\u0131 kald\u0131rabilir ve kurulum s\u0131ras\u0131nda veritaban\u0131 se\u00e7iminizi yapabilirsiniz. Kurulum tamamland\u0131\u011f\u0131nda, Strapi otomatik olarak taray\u0131c\u0131n\u0131zda y\u00f6netici panelini a\u00e7acak ve ilk y\u00f6netici hesab\u0131n\u0131z\u0131 olu\u015fturman\u0131z\u0131 isteyecektir. Bu ad\u0131mlar\u0131 tamamlayarak Strapi'yi kullan\u0131ma haz\u0131r hale getirin.\n<\/p>\n<h3>Ad\u0131m 3: Strapi \u0130\u00e7erik T\u00fcrlerini (Content Types) Olu\u015fturma<\/h3>\n<p>\nSanity'deki her <code>_type<\/code> (\u00f6rne\u011fin, \"post\", \"author\", \"category\") Strapi'de bir \u0130\u00e7erik T\u00fcr\u00fc'ne (Content Type) kar\u015f\u0131l\u0131k gelir. Verilerinizi aktarmadan \u00f6nce, bu i\u00e7erik t\u00fcrlerini Strapi'de olu\u015fturman\u0131z gerekmektedir. Strapi'nin y\u00f6netici paneli \u00fczerinden \"Content-Type Builder\" kullanarak bu i\u015flemi g\u00f6rsel olarak yapabilirsiniz.\n<\/p>\n<p>\nSanity schemas\u0131n\u0131 dikkatlice inceleyin ve her bir alan\u0131n (field) t\u00fcr\u00fcn\u00fc (string, boolean, number, image, reference, array, portable text vb.) Strapi'deki kar\u015f\u0131l\u0131\u011f\u0131na e\u015fle\u015ftirin.\n<\/p>\n<ul>\n<li>\n        <strong>Metin Alanlar\u0131:<\/strong> Sanity'deki <code>string<\/code>, <code>text<\/code> alanlar\u0131 Strapi'de <code>Text<\/code> veya <code>Rich Text<\/code> (Markdown\/Lexical) olarak e\u015fle\u015ftirilir.\n    <\/li>\n<li>\n        <strong>Say\u0131sal Alanlar:<\/strong> Sanity'deki <code>number<\/code> alanlar\u0131 Strapi'de <code>Number<\/code> olarak e\u015fle\u015ftirilir.\n    <\/li>\n<li>\n        <strong>Boolean Alanlar:<\/strong> Sanity'deki <code>boolean<\/code> alanlar\u0131 Strapi'de <code>Boolean<\/code> olarak e\u015fle\u015ftirilir.\n    <\/li>\n<li>\n        <strong>Tarih Alanlar\u0131:<\/strong> Sanity'deki <code>datetime<\/code> veya <code>date<\/code> alanlar\u0131 Strapi'de <code>Date<\/code> veya <code>DateTime<\/code> olarak e\u015fle\u015ftirilir.\n    <\/li>\n<li>\n        <strong>G\u00f6rsel ve Medya Varl\u0131klar\u0131:<\/strong> Sanity'deki <code>image<\/code> t\u00fcrleri Strapi'de <code>Media<\/code> t\u00fcr\u00fcne kar\u015f\u0131l\u0131k gelir.\n    <\/li>\n<li>\n        <strong>\u0130li\u015fkiler (References):<\/strong> Sanity'deki <code>reference<\/code> alanlar\u0131, Strapi'de <code>Relation<\/code> (\u0130li\u015fki) alanlar\u0131na kar\u015f\u0131l\u0131k gelir. \u00d6rne\u011fin, bir \"Post\"un bir \"Author\"a referans\u0131, Strapi'de \"Post\" i\u00e7erik t\u00fcr\u00fcnde \"Author\" ile tek-\u00e7ok ili\u015fki (many-to-one) olarak tan\u0131mlanabilir.\n    <\/li>\n<li>\n        <strong>Portable Text:<\/strong> Sanity'nin Portable Text yap\u0131s\u0131 Strapi'de do\u011frudan bir kar\u015f\u0131l\u0131\u011fa sahip de\u011fildir. Genellikle Strapi'nin <code>Rich Text<\/code> alan\u0131 (Markdown veya Lexical edit\u00f6r) kullan\u0131l\u0131r. Bu, Sanity Portable Text verilerini Markdown veya HTML format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeniz gerekti\u011fi anlam\u0131na gelir. Bu d\u00f6n\u00fc\u015f\u00fcm i\u00e7in \u00f6zel bir script yazman\u0131z gerekecektir.\n    <\/li>\n<\/ul>\n<p>\nHer i\u00e7erik t\u00fcr\u00fcn\u00fc ve alan\u0131n\u0131 dikkatlice tan\u0131mlad\u0131ktan sonra, Strapi, veritaban\u0131n\u0131zda ilgili tablolar\u0131 ve API u\u00e7 noktalar\u0131n\u0131 otomatik olarak olu\u015fturacakt\u0131r.\n<\/p>\n<h3>Ad\u0131m 4: Verileri Strapi'ye Aktarma Script'i Geli\u015ftirme<\/h3>\n<p>\nBu ad\u0131m, ge\u00e7i\u015fin en karma\u015f\u0131k k\u0131sm\u0131d\u0131r. Sanity'den d\u0131\u015fa aktard\u0131\u011f\u0131n\u0131z NDJSON dosyas\u0131n\u0131 okuyacak ve her bir d\u00f6k\u00fcman\u0131 Strapi API'sine g\u00f6ndererek yeni i\u00e7erikler olu\u015fturacak bir Node.js scripti yazman\u0131z gerekecek.\n<\/p>\n<p>\n\u00d6ncelikle, Strapi'nizin API'sine eri\u015fmek i\u00e7in bir API Token olu\u015fturman\u0131z gerekecektir. Strapi Admin panelinde \"Settings\" -> \"API Tokens\" b\u00f6l\u00fcm\u00fcne giderek tam eri\u015fim (Full Access) iznine sahip bir token olu\u015fturun.\n<\/p>\n<p>\nA\u015fa\u011f\u0131daki \u00f6rnek, Sanity verilerini okuyup temel metin alanlar\u0131n\u0131 Strapi'ye nas\u0131l aktaraca\u011f\u0131n\u0131 g\u00f6steren basit bir Node.js scriptidir. Bu script'i projenizin ihtiya\u00e7lar\u0131na g\u00f6re uyarlaman\u0131z gerekmektedir.\n<\/p>\n<pre><code class=\"language-javascript\">\nconst fs = require('fs');\nconst path = require('path');\nconst axios = require('axios');\nconst readline = require('readline');\nconst tar = require('tar'); \/\/ Tar dosyas\u0131n\u0131 a\u00e7mak i\u00e7in\n\nconst strapiApiUrl = 'http:\/\/localhost:1337\/api'; \/\/ Kendi Strapi API URL'nizi girin\nconst sanityExportFilePath = 'sanity-export.tar.gz'; \/\/ Sanity export dosyan\u0131z\u0131n yolu\nconst ndjsonExtractedPath = 'sanity-export.ndjson'; \/\/ \u00c7\u0131kar\u0131lacak NDJSON dosyas\u0131n\u0131n ad\u0131\n\nasync function extractTarGz() {\n    console.log('Sanity export dosyas\u0131n\u0131 \u00e7\u0131kar\u0131l\u0131yor...');\n    await tar.x({\n        file: sanityExportFilePath,\n        C: path.dirname(ndjsonExtractedPath) \/\/ Ayn\u0131 dizine \u00e7\u0131kar\n    });\n    console.log('Sanity export dosyas\u0131 ba\u015far\u0131yla \u00e7\u0131kar\u0131ld\u0131.');\n    \/\/ Tar dosyas\u0131ndan \u00e7\u0131kar\u0131lan .ndjson dosyas\u0131n\u0131n ger\u00e7ek ad\u0131n\u0131 bulmam\u0131z gerekebilir\n    \/\/ Genellikle 'export.ndjson' veya benzeri bir isimle \u00e7\u0131kar.\n    \/\/ Varsay\u0131lan olarak export.ndjson ad\u0131yla \u00e7\u0131kt\u0131\u011f\u0131n\u0131 varsayal\u0131m\n    return path.join(path.dirname(ndjsonExtractedPath), 'export.ndjson'); \n}\n\nasync function importData() {\n    const finalNdjsonPath = await extractTarGz();\n\n    const strapiAuthToken = 'YOUR_STRAPI_ADMIN_API_TOKEN'; \/\/ Strapi admin panelinden alaca\u011f\u0131n\u0131z API Token\n    const headers = {\n        'Content-Type': 'application\/json',\n        'Authorization': <code>Bearer ${strapiAuthToken}<\/code>\n    };\n\n    const fileStream = fs.createReadStream(finalNdjsonPath);\n    const rl = readline.createInterface({\n        input: fileStream,\n        crlfDelay: Infinity\n    });\n\n    console.log('Veri i\u00e7e aktarma s\u00fcreci ba\u015flat\u0131l\u0131yor...');\n\n    for await (const line of rl) {\n        if (!line.trim()) continue; \/\/ Bo\u015f sat\u0131rlar\u0131 atla\n        try {\n            const sanityDoc = JSON.parse(line);\n\n            \/\/ Sanity \"_type\" alan\u0131n\u0131 Strapi i\u00e7erik t\u00fcr\u00fc ad\u0131yla e\u015fle\u015ftirin\n            let strapiContentType = '';\n            let isDraft = sanityDoc._id.startsWith('drafts.');\n\n            if (sanityDoc._type === 'post') {\n                strapiContentType = 'posts';\n            } else if (sanityDoc._type === 'author') {\n                strapiContentType = 'authors';\n            } else if (sanityDoc._type === 'category') {\n                strapiContentType = 'categories';\n            }\n            \/\/ Di\u011fer i\u00e7erik t\u00fcrleri i\u00e7in else if bloklar\u0131 ekleyin\n            \/\/ \u00d6rne\u011fin: else if (sanityDoc._type === 'product') { strapiContentType = 'products'; }\n\n            \/\/ Taslaklar\u0131 atla veya farkl\u0131 ele al\n            if (isDraft) {\n                console.log(<code>Skipping draft document: ${sanityDoc._id}<\/code>);\n                continue;\n            }\n\n            if (strapiContentType) {\n                const strapiData = {\n                    data: {\n                        \/\/ Sanity alanlar\u0131n\u0131 Strapi alanlar\u0131na e\u015fle\u015ftirin\n                        \/\/ Portable Text d\u00f6n\u00fc\u015f\u00fcm\u00fc i\u00e7in \u00f6rnek:\n                        \/\/ body: convertPortableTextToMarkdown(sanityDoc.body),\n                        title: sanityDoc.title,\n                        slug: sanityDoc.slug?.current,\n                        \/\/ Di\u011fer alanlar\u0131 buraya ekleyin. \u0130li\u015fkiler ve medya varl\u0131klar\u0131 sonraki ad\u0131mlarda ele al\u0131nacak.\n                        \/\/ \u00d6rnek: description: sanityDoc.description,\n                        \/\/       publishedAt: sanityDoc.publishedAt,\n                        \/\/ Sanity'deki \"_createdAt\" ve \"_updatedAt\" alanlar\u0131n\u0131 Strapi'ye ta\u015f\u0131yabiliriz.\n                        publishedAt: sanityDoc._createdAt || new Date().toISOString(), \/\/ Varsay\u0131lan olarak olu\u015fturulma tarihi\n                        createdAt: sanityDoc._createdAt,\n                        updatedAt: sanityDoc._updatedAt,\n                        sanityId: sanityDoc._id \/\/ Orjinal Sanity ID'sini saklamak faydal\u0131 olabilir\n                    }\n                };\n\n                console.log(<code>Importing ${sanityDoc._id} (${sanityDoc._type}) to ${strapiContentType}...<\/code>);\n                await axios.post(<code>${strapiApiUrl}\/${strapiContentType}<\/code>, strapiData, { headers });\n                console.log(<code>Successfully imported ${sanityDoc._id}<\/code>);\n            } else {\n                console.warn(<code>No mapping found for Sanity type: ${sanityDoc._type}. Skipping.<\/code>);\n            }\n        } catch (error) {\n            console.error(<code>Error processing line: ${line}<\/code>, error.response ? error.response.data : error.message);\n        }\n    }\n    console.log('Veri i\u00e7e aktarma s\u00fcreci tamamland\u0131.');\n}\n\n\/\/ Portable Text'i Markdown'a d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in basit bir \u00f6rnek (ger\u00e7ek bir k\u00fct\u00fcphane kullan\u0131n)\nfunction convertPortableTextToMarkdown(portableText) {\n    if (!portableText) return '';\n    \/\/ Bu k\u0131s\u0131m karma\u015f\u0131k olabilir ve kapsaml\u0131 bir k\u00fct\u00fcphane gerektirir.\n    \/\/ \u00d6rnek olarak sadece paragraflar\u0131 birle\u015ftiriyoruz.\n    return portableText.map(block => {\n        if (block._type === 'block' && block.children) {\n            return block.children.map(span => span.text).join('');\n        }\n        return '';\n    }).join('\\n\\n');\n}\n\nimportData().catch(console.error);\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Sanity'nin Portable Text yap\u0131s\u0131n\u0131 Strapi'nin Rich Text (Markdown\/Lexical) alan\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in \u00f6zel bir parser yazman\u0131z veya <code>@sanity\/block-content-to-markdown<\/code> gibi k\u00fct\u00fcphaneleri kullanman\u0131z gerekebilir. Bu, i\u00e7eri\u011fin do\u011fru formatta aktar\u0131lmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/div>\n<h3>Ad\u0131m 5: G\u00f6r\u00fcnt\u00fc ve Di\u011fer Medya Varl\u0131klar\u0131n\u0131 Ta\u015f\u0131ma<\/h3>\n<p>\nG\u00f6r\u00fcnt\u00fc ve di\u011fer medya varl\u0131klar\u0131n\u0131n ta\u015f\u0131nmas\u0131, genellikle iki a\u015famal\u0131 bir s\u00fcre\u00e7tir:\n<\/p>\n<ol>\n<li>\n        <strong>Sanity CDN'inden Varl\u0131klar\u0131 \u0130ndirme:<\/strong> Sanity'den d\u0131\u015fa aktar\u0131lan verilerdeki g\u00f6rsel referanslar\u0131n\u0131 kullanarak (genellikle bir asset ID i\u00e7erirler), bu g\u00f6rselleri Sanity'nin CDN'inden programatik olarak indirmeniz gerekir.\n    <\/li>\n<li>\n        <strong>Strapi'ye Y\u00fckleme:<\/strong> \u0130ndirilen g\u00f6rselleri Strapi'nin medya k\u00fct\u00fcphanesine y\u00fcklemek i\u00e7in Strapi'nin upload API'sini kullan\u0131n. Bu s\u0131rada, g\u00f6rsellerin orijinal dosya adlar\u0131n\u0131 ve meta verilerini korumaya \u00e7al\u0131\u015f\u0131n.\n    <\/li>\n<\/ol>\n<p>\nBu i\u015flem i\u00e7in ayr\u0131 bir script yazman\u0131z veya ana aktarma scriptinize entegre etmeniz gerekebilir. Strapi'nin <code>\/api\/upload<\/code> u\u00e7 noktas\u0131na <code>multipart\/form-data<\/code> iste\u011fi g\u00f6ndererek dosyalar\u0131 y\u00fckleyebilirsiniz. Y\u00fckleme sonras\u0131 Strapi, size bir dosya nesnesi d\u00f6nd\u00fcrecektir. Bu nesnedeki ID'yi, i\u00e7eriklerinizdeki g\u00f6rsel referanslar\u0131n\u0131 g\u00fcncellemek i\u00e7in kullanacaks\u0131n\u0131z.\n<\/p>\n<h3>Ad\u0131m 6: \u0130li\u015fkileri ve Referanslar\u0131 G\u00fcncelleme<\/h3>\n<p>\nSanity ve Strapi, d\u00f6k\u00fcmanlar aras\u0131ndaki ili\u015fkileri farkl\u0131 \u015fekillerde y\u00f6netir. Sanity, referanslar\u0131 <code>_ref<\/code> alanlar\u0131 arac\u0131l\u0131\u011f\u0131yla d\u00f6k\u00fcman ID'leri \u00fczerinden kurarken, Strapi kendi i\u00e7 ID'lerini kullan\u0131r. Bu nedenle, verileri aktar\u0131rken eski Sanity ID'leri ile yeni Strapi ID'leri aras\u0131nda bir e\u015fle\u015fme (mapping) olu\u015fturman\u0131z gerekmektedir.\n<\/p>\n<ol>\n<li>\n        <strong>\u0130lk Ge\u00e7i\u015f (Basit Veriler):<\/strong> \u0130lk olarak, ili\u015fki i\u00e7ermeyen temel metin ve say\u0131sal verileri Strapi'ye aktar\u0131n. Bu s\u0131rada, her bir aktar\u0131lan Sanity d\u00f6k\u00fcman\u0131n\u0131n orijinal Sanity <code>_id<\/code>'sini ve Strapi taraf\u0131ndan atanan yeni <code>id<\/code>'sini bir e\u015fleme tablosunda (\u00f6rne\u011fin, bir JavaScript objesi veya Map yap\u0131s\u0131) saklay\u0131n. Bu e\u015fle\u015fmeyi, olu\u015fturdu\u011funuz i\u00e7erik t\u00fcr\u00fcne <code>sanityId<\/code> gibi \u00f6zel bir alan ekleyerek de kal\u0131c\u0131 hale getirebilirsiniz.\n    <\/li>\n<li>\n        <strong>\u0130kinci Ge\u00e7i\u015f (\u0130li\u015fkiler):<\/strong> T\u00fcm temel veriler aktar\u0131ld\u0131ktan sonra, ikinci bir script \u00e7al\u0131\u015ft\u0131r\u0131n. Bu script, daha \u00f6nce kaydedilen e\u015fleme tablosunu kullanarak Sanity d\u00f6k\u00fcmanlar\u0131ndaki <code>_ref<\/code> alanlar\u0131n\u0131 bulacak ve bunlar\u0131 ilgili Strapi i\u00e7erik t\u00fcr\u00fcn\u00fcn yeni ID'leriyle g\u00fcncelleyecektir. \u00d6rne\u011fin, bir \"Post\"un \"Author\" referans\u0131n\u0131 g\u00fcncellemek i\u00e7in, \"Post\" i\u00e7eri\u011fini Strapi API'si \u00fczerinden GET ile \u00e7ekip, \"author\" alan\u0131ndaki eski Sanity ID'sini yeni Strapi Author ID'si ile de\u011fi\u015ftirip, ard\u0131ndan PUT iste\u011fi ile g\u00fcncellemeyi yapmal\u0131s\u0131n\u0131z.\n    <\/li>\n<\/ol>\n<p>\nBu ad\u0131m, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in \u00e7ok \u00f6nemlidir ve genellikle en \u00e7ok dikkat gerektiren k\u0131s\u0131md\u0131r. \u0130li\u015fkilerin karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131 olarak, bu script'i iteratif olarak geli\u015ftirmeniz gerekebilir.\n<\/p>\n<h2>Geli\u015fmi\u015f Ge\u00e7i\u015f Stratejileri ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>\nGe\u00e7i\u015f s\u00fcreci yaln\u0131zca temel veri aktar\u0131m\u0131ndan ibaret de\u011fildir. B\u00fcy\u00fck projeler ve \u00f6zel gereksinimler i\u00e7in a\u015fa\u011f\u0131daki geli\u015fmi\u015f stratejileri ve ipu\u00e7lar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z, s\u00fcreci daha verimli ve sorunsuz hale getirecektir.\n<\/p>\n<h3>B\u00fcy\u00fck Veri Setleri \u0130\u00e7in Optimizasyon<\/h3>\n<p>\nOn binlerce veya y\u00fcz binlerce d\u00f6k\u00fcman\u0131n bulundu\u011fu projelerde, veri aktar\u0131m\u0131n\u0131 tek seferde yapmak hem performans sorunlar\u0131na yol a\u00e7abilir hem de hatalar\u0131n tespitini zorla\u015ft\u0131rabilir.\n<\/p>\n<ul>\n<li>\n        <strong>Toplu \u0130\u015fleme (Batch Processing):<\/strong> Verileri k\u00fc\u00e7\u00fck partiler halinde (\u00f6rne\u011fin, 100 veya 500 d\u00f6k\u00fcmanl\u0131k gruplar halinde) i\u015fleyin. Bu, bellek t\u00fcketimini azalt\u0131r ve API rate limitlerine tak\u0131lma olas\u0131l\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr. Her toplu i\u015fleme sonras\u0131 bir mola vermek veya ilerlemeyi kaydetmek faydal\u0131 olabilir.\n    <\/li>\n<li>\n        <strong>API Rate Limiting:<\/strong> Strapi veya kulland\u0131\u011f\u0131n\u0131z bulut sa\u011flay\u0131c\u0131s\u0131n\u0131n (g\u00f6r\u00fcnt\u00fc y\u00fcklemeleri i\u00e7in) API \u00e7a\u011fr\u0131 limitleri olabilir. Script'inize bir gecikme (delay) mekanizmas\u0131 ekleyerek API \u00e7a\u011fr\u0131lar\u0131n\u0131 yava\u015flat\u0131n ve limitlerin a\u015f\u0131lmas\u0131n\u0131 \u00f6nleyin.\n    <\/li>\n<li>\n        <strong>Do\u011frudan Veritaban\u0131 Ge\u00e7i\u015fleri:<\/strong> E\u011fer teknik ekibiniz veritaban\u0131 y\u00f6netimi konusunda deneyimliyse, Strapi'nin kulland\u0131\u011f\u0131 veritaban\u0131na (PostgreSQL, MySQL vb.) do\u011frudan SQL sorgular\u0131 veya NoSQL komutlar\u0131 arac\u0131l\u0131\u011f\u0131yla veri aktarmak daha h\u0131zl\u0131 olabilir. Ancak bu y\u00f6ntem, Strapi'nin ORM (Object-Relational Mapping) yap\u0131s\u0131n\u0131 ve i\u00e7 ili\u015fkilerini do\u011fru bir \u015fekilde taklit etmeyi gerektirir, bu da daha riskli olabilir. Bu yolu se\u00e7erseniz, Strapi'nin i\u00e7erik modelleme mant\u0131\u011f\u0131n\u0131 ve veritaban\u0131 \u015femas\u0131n\u0131 derinlemesine anlaman\u0131z gerekir.\n    <\/li>\n<li>\n        <strong>Hata Y\u00f6netimi ve Yeniden Deneme Mekanizmalar\u0131:<\/strong> B\u00fcy\u00fck aktar\u0131mlarda hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. Script'inizin ba\u015far\u0131s\u0131z olan kay\u0131tlar\u0131 loglamas\u0131n\u0131 ve belirli bir strateji dahilinde (\u00f6rne\u011fin, belirli bir s\u00fcre sonra tekrar deneme) yeniden i\u015flemeye \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flay\u0131n.\n    <\/li>\n<\/ul>\n<h3>\u00d6zel Alanlar ve Plugin Entegrasyonu<\/h3>\n<p>\nSanity'deki baz\u0131 \u00f6zel alanlar veya pluginler, Strapi'de do\u011frudan bir kar\u015f\u0131l\u0131\u011fa sahip olmayabilir. Bu gibi durumlarda:\n<\/p>\n<ul>\n<li>\n        <strong>\u00d6zel Alanlar Geli\u015ftirme:<\/strong> Strapi, \u00f6zel alanlar (Custom Fields) olu\u015fturman\u0131za olanak tan\u0131r. Sanity'deki karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 veya benzersiz alan t\u00fcrlerini taklit etmek i\u00e7in kendi \u00f6zel alanlar\u0131n\u0131z\u0131 geli\u015ftirerek Strapi y\u00f6netici panelini geni\u015fletebilirsiniz.\n    <\/li>\n<li>\n        <strong>Plugin Geli\u015ftirme\/Kullanma:<\/strong> Sanity'deki bir \u00f6zelli\u011fin (\u00f6rne\u011fin, bir \u00f6zel entegrasyon veya i\u00e7erik d\u00fczenleme arac\u0131) Strapi'de kar\u015f\u0131l\u0131\u011f\u0131 yoksa, mevcut bir Strapi plugin'ini kullanabilir veya kendi plugin'inizi geli\u015ftirebilirsiniz. Strapi'nin plugin sistemi olduk\u00e7a esnektir.\n    <\/li>\n<li>\n        <strong>Frontend Taraf\u0131nda \u00c7\u00f6z\u00fcmler:<\/strong> Baz\u0131 durumlarda, Sanity'deki bir \u00f6zellik (\u00f6rne\u011fin, bir sunum format\u0131), Strapi'ye ham veri olarak aktar\u0131labilir ve bu verinin i\u015flenmesi veya g\u00f6r\u00fcnt\u00fclenmesi frontend uygulamas\u0131na b\u0131rak\u0131labilir.\n    <\/li>\n<\/ul>\n<h3>Ge\u00e7i\u015f Sonras\u0131 Do\u011frulama ve Test<\/h3>\n<p>\nVeri aktar\u0131m\u0131 tamamland\u0131ktan sonra, yeni Strapi kurulumunuzun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve t\u00fcm verilerin eksiksiz ve do\u011fru bir \u015fekilde aktar\u0131ld\u0131\u011f\u0131ndan emin olmak i\u00e7in kapsaml\u0131 bir do\u011frulama ve test s\u00fcreci \u015fartt\u0131r.\n<\/p>\n<ul>\n<li>\n        <strong>Veri Tutarl\u0131l\u0131\u011f\u0131 Kontrolleri:<\/strong> Rastgele se\u00e7ilmi\u015f i\u00e7erik \u00f6rneklerini hem Sanity'de hem de Strapi'de kar\u015f\u0131la\u015ft\u0131r\u0131n. \u00d6zellikle ili\u015fkilerin, g\u00f6rsellerin ve zengin metin alanlar\u0131n\u0131n do\u011fru aktar\u0131ld\u0131\u011f\u0131ndan emin olun. Sanity'deki toplam d\u00f6k\u00fcman say\u0131s\u0131 ile Strapi'deki toplam giri\u015f say\u0131s\u0131n\u0131n e\u015fle\u015fip e\u015fle\u015fmedi\u011fini kontrol edin.\n    <\/li>\n<li>\n        <strong>API Testleri:<\/strong> Strapi'nin REST ve\/veya GraphQL API'leri \u00fczerinden i\u00e7eriklere eri\u015fmeyi deneyin. Sorgular\u0131n beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve do\u011fru verileri d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnden emin olun.\n    <\/li>\n<li>\n        <strong>Frontend Entegrasyon Testleri:<\/strong> Frontend uygulaman\u0131z\u0131 yeni Strapi API'sine ba\u011flayarak t\u00fcm sayfalar\u0131n, bile\u015fenlerin ve i\u015flevlerin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test edin. \u00d6zellikle dinamik olarak y\u00fcklenen i\u00e7eriklerin (blog yaz\u0131lar\u0131, \u00fcr\u00fcn listeleri, kullan\u0131c\u0131 profilleri vb.) sorunsuz bir \u015fekilde g\u00f6r\u00fcnt\u00fclendi\u011finden emin olun.\n    <\/li>\n<li>\n        <strong>Performans Testleri:<\/strong> Strapi'nin y\u00fck alt\u0131nda nas\u0131l performans g\u00f6sterdi\u011fini de\u011ferlendirin. Veritaban\u0131 sorgular\u0131n\u0131 optimize etmek veya \u00f6nbellekleme mekanizmalar\u0131 kurmak gerekebilir.\n    <\/li>\n<\/ul>\n<h3>Mobil Uyumlu Tasar\u0131m ve API Eri\u015fimi<\/h3>\n<p>\nStrapi, API odakl\u0131 bir CMS oldu\u011fu i\u00e7in, frontend uygulaman\u0131z\u0131n mobil uyumlulu\u011fu Strapi'den ba\u011f\u0131ms\u0131z olarak geli\u015ftirilir. Ancak Strapi'nin sundu\u011fu esnek API'ler, farkl\u0131 cihazlar ve ekran boyutlar\u0131 i\u00e7in optimize edilmi\u015f i\u00e7erik sunman\u0131za olanak tan\u0131r.\n<\/p>\n<ul>\n<li>\n        <strong>Duyarl\u0131 \u0130\u00e7erik:<\/strong> Strapi'nin medya k\u00fct\u00fcphanesi, g\u00f6rsellerin farkl\u0131 boyutlarda optimize edilmi\u015f versiyonlar\u0131n\u0131 sunabilir. Frontend uygulaman\u0131zda <code><picture><\/code> etiketi veya CSS <code>media query<\/code>'leri kullanarak, cihaz\u0131n \u00f6zelliklerine g\u00f6re en uygun g\u00f6rselleri y\u00fckleyebilirsiniz.\n    <\/li>\n<li>\n        <strong>API S\u00fcr\u00fcmleme:<\/strong> Frontend'lerinizin farkl\u0131 mobil ve web platformlar\u0131nda farkl\u0131 ihtiya\u00e7lar\u0131 varsa, Strapi'nin API'sini s\u00fcr\u00fcmleyerek (\u00f6rne\u011fin, <code>\/api\/v1<\/code>, <code>\/api\/v2<\/code>) uyumlulu\u011fu s\u00fcrd\u00fcrebilirsiniz.\n    <\/li>\n<\/ul>\n<p>\nMobil uyumlu HTML \u00fcretmek do\u011frudan Strapi'nin g\u00f6revi olmasa da, Strapi'den gelen veriyi kullanarak frontend taraf\u0131nda duyarl\u0131 tasar\u0131m prensiplerini uygulaman\u0131z \u00f6nemlidir. A\u015fa\u011f\u0131daki CSS \u00f6rne\u011fi, web sitenizde duyarl\u0131 g\u00f6rseller ve i\u00e7erik b\u00f6l\u00fcmleri olu\u015fturmak i\u00e7in tipik bir yakla\u015f\u0131m\u0131 g\u00f6stermektedir:\n<\/p>\n<pre><code class=\"language-html\">\n<style>\n  \/* T\u00fcm g\u00f6rsellerin kapsay\u0131c\u0131s\u0131n\u0131n geni\u015fli\u011fine uyum sa\u011flamas\u0131 *\/\n  .responsive-image {\n    max-width: 100%;\n    height: auto; \/* Oran\u0131n\u0131 koru *\/\n  }\n\n  \/* Belirli ekran geni\u015flikleri i\u00e7in stil de\u011fi\u015fiklikleri *\/\n  @media (max-width: 768px) {\n    .content-section {\n      padding: 15px; \/* Daha k\u00fc\u00e7\u00fck ekranlarda daha az bo\u015fluk *\/\n      font-size: 14px; \/* Metin boyutunu k\u00fc\u00e7\u00fclt *\/\n    }\n    .hero-banner {\n      height: 200px; \/* Mobil i\u00e7in daha k\u0131sa banner *\/\n    }\n  }\n\n  @media (max-width: 480px) {\n    .navigation-menu {\n      flex-direction: column; \/* Mobil men\u00fcy\u00fc dikey yap *\/\n    }\n  }\n<\/style>\n<\/pre>\n<p><\/code><\/p>\n<p>\nBu \u00f6rnek, Strapi'den \u00e7ekilen i\u00e7eriklerin frontend'de nas\u0131l duyarl\u0131 bir \u015fekilde g\u00f6r\u00fcnt\u00fclenebilece\u011fine dair bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunar. Strapi, i\u00e7eri\u011fi sa\u011flar; frontend bu i\u00e7eri\u011fi en iyi kullan\u0131c\u0131 deneyimi i\u00e7in \u015fekillendirir.\n<\/p>\n<h2>Vaka Analizi: Bir E-ticaret Sitesinin Sanity'den Strapi'ye Ge\u00e7i\u015fi<\/h2>\n<p>\nTeorik bilgilerin yan\u0131 s\u0131ra, ger\u00e7ek d\u00fcnya senaryolar\u0131, ge\u00e7i\u015f s\u00fcrecinin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve potansiyel faydalar\u0131n\u0131 daha iyi anlamam\u0131z\u0131 sa\u011flar. \u0130\u015fte k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli bir e-ticaret sitesinin Sanity'den Strapi'ye ge\u00e7i\u015f hikayesi:\n<\/p>\n<h3>Senaryo: B\u00fcy\u00fcyen Bir E-ticaret \u0130\u015fletmesinin \u0130htiya\u00e7lar\u0131<\/h3>\n<p>\n\"TrendButik\" ad\u0131nda, el yap\u0131m\u0131 tak\u0131lar satan k\u00fc\u00e7\u00fck bir e-ticaret i\u015fletmesi, ba\u015flang\u0131\u00e7ta i\u00e7erik y\u00f6netimi i\u00e7in Sanity.io kullan\u0131yordu. Sanity, \u00fcr\u00fcn a\u00e7\u0131klamalar\u0131, blog yaz\u0131lar\u0131 ve kategori sayfalar\u0131 i\u00e7in h\u0131zl\u0131 ve kolay bir \u00e7\u00f6z\u00fcm sunmu\u015ftu. Ancak i\u015fletme b\u00fcy\u00fcd\u00fck\u00e7e ve ayl\u0131k sat\u0131\u015f hacmi artt\u0131k\u00e7a, a\u015fa\u011f\u0131daki sorunlarla kar\u015f\u0131la\u015fmaya ba\u015flad\u0131lar:\n<\/p>\n<ul>\n<li>\n        <strong>Artan Maliyetler:<\/strong> \u00dcr\u00fcn ve blog i\u00e7eri\u011fi artt\u0131k\u00e7a Sanity'nin kullan\u0131m tabanl\u0131 fiyatland\u0131rmas\u0131 daha pahal\u0131 hale gelmeye ba\u015flad\u0131. \u00d6zellikle g\u00f6rsel varl\u0131klar\u0131n depolama ve bant geni\u015fli\u011fi maliyetleri b\u00fct\u00e7elerini zorluyordu.\n    <\/li>\n<li>\n        <strong>\u00d6zelle\u015ftirme K\u0131s\u0131tlamalar\u0131:<\/strong> \u0130\u015fletme, karma\u015f\u0131k \u00fcr\u00fcn varyantlar\u0131 (renk, boyut, malzeme kombinasyonlar\u0131), \u00f6zel indirim kurallar\u0131 ve geli\u015fmi\u015f SEO alanlar\u0131 gibi ihtiya\u00e7lar i\u00e7in Sanity'nin admin panelini daha derinlemesine \u00f6zelle\u015ftirmek istedi. Ancak Sanity Studio \u00f6zelle\u015ftirmeleri belli bir noktadan sonra karma\u015f\u0131k ve zaman al\u0131c\u0131 olabiliyordu.\n    <\/li>\n<li>\n        <strong>Veri Egemenli\u011fi:<\/strong> \u00d6deme bilgileri ve m\u00fc\u015fteri verileri gibi hassas bilgilerin kendi sunucular\u0131nda bar\u0131nd\u0131r\u0131lmas\u0131 konusunda endi\u015feler art\u0131yordu. Verilerin tamamen kendilerine ait bir altyap\u0131da olmas\u0131n\u0131 istiyorlard\u0131.\n    <\/li>\n<\/ul>\n<p>\nBu nedenlerle, TrendButik'in teknik ekibi, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir headless CMS olan Strapi'ye ge\u00e7i\u015f yapma karar\u0131 ald\u0131.\n<\/p>\n<h3>Uygulanan Ad\u0131mlar ve \u00c7\u00f6z\u00fcmler<\/h3>\n<p>\nTrendButik ekibi, Sanity'den Strapi'ye ge\u00e7i\u015f i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izledi:\n<\/p>\n<ol>\n<li>\n        <strong>Veri D\u0131\u015fa Aktar\u0131m\u0131:<\/strong> Sanity CLI kullanarak t\u00fcm \u00fcr\u00fcn, kategori, blog yaz\u0131s\u0131, m\u00fc\u015fteri yorumlar\u0131 ve yazar i\u00e7eriklerini NDJSON format\u0131nda d\u0131\u015fa aktard\u0131lar.\n    <\/li>\n<li>\n        <strong>Strapi Kurulumu ve \u0130\u00e7erik Modelleri:<\/strong> Kendi bulut sunucular\u0131 \u00fczerinde (AWS EC2) PostgreSQL veritaban\u0131 ile yeni bir Strapi projesi kurdular. Sanity'deki her <code>_type<\/code> i\u00e7in Strapi'de kar\u015f\u0131l\u0131k gelen i\u00e7erik t\u00fcrlerini (<code>Product<\/code>, <code>Category<\/code>, <code>BlogPost<\/code>, <code>Review<\/code>, <code>Author<\/code>) \"Content-Type Builder\" arac\u0131l\u0131\u011f\u0131yla olu\u015fturdular. \u00d6zellikle <code>Product<\/code> i\u00e7eri\u011fi i\u00e7in, renk ve boyut gibi varyantlar\u0131 ele almak \u00fczere dinamik b\u00f6lgeler (Dynamic Zones) ve ili\u015fkiler kulland\u0131lar.\n    <\/li>\n<li>\n        <strong>Veri Ta\u015f\u0131ma Script'i:<\/strong> Node.js tabanl\u0131 \u00f6zel bir script geli\u015ftirdiler. Bu script, d\u0131\u015fa aktar\u0131lan NDJSON dosyas\u0131n\u0131 sat\u0131r sat\u0131r okudu.<\/p>\n<ul>\n<li>\n                <strong>Portable Text D\u00f6n\u00fc\u015f\u00fcm\u00fc:<\/strong> Sanity'deki \u00fcr\u00fcn a\u00e7\u0131klamalar\u0131 ve blog yaz\u0131lar\u0131ndaki Portable Text i\u00e7eri\u011fini, <code>@sanity\/block-content-to-markdown<\/code> benzeri bir k\u00fct\u00fcphane kullanarak Markdown format\u0131na d\u00f6n\u00fc\u015ft\u00fcrd\u00fcler ve Strapi'nin Rich Text alan\u0131na kaydettiler.\n            <\/li>\n<li>\n                <strong>ID E\u015fle\u015ftirme:<\/strong> Her Sanity d\u00f6k\u00fcman\u0131n\u0131n <code>_id<\/code>'sini, Strapi'ye aktar\u0131ld\u0131ktan sonra olu\u015fan yeni Strapi <code>id<\/code>'si ile e\u015fle\u015ftiren bir Map objesi olu\u015fturdular. Bu e\u015fle\u015fmeyi ayn\u0131 zamanda her Strapi i\u00e7eri\u011fine ekledikleri <code>sanityId<\/code> \u00f6zel alan\u0131nda da saklad\u0131lar.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Medya Varl\u0131klar\u0131n\u0131n Ta\u015f\u0131nmas\u0131:<\/strong> Sanity'den d\u0131\u015fa aktar\u0131lan verilerdeki g\u00f6rsel referanslar\u0131n\u0131 (<code>_id<\/code> veya URL) kullanarak, \u00f6zel bir script arac\u0131l\u0131\u011f\u0131yla t\u00fcm \u00fcr\u00fcn g\u00f6rsellerini ve blog g\u00f6rsellerini Sanity CDN'inden indirdiler. Daha sonra, Strapi'nin <code>\/api\/upload<\/code> u\u00e7 noktas\u0131na POST istekleri g\u00f6ndererek bu g\u00f6rselleri Strapi'nin medya k\u00fct\u00fcphanesine y\u00fcklediler ve ilgili i\u00e7erik t\u00fcrlerindeki g\u00f6rsel referanslar\u0131n\u0131 g\u00fcncellediler. G\u00f6rsel depolama i\u00e7in AWS S3'\u00fc Strapi'ye entegre ettiler.\n    <\/li>\n<li>\n        <strong>\u0130li\u015fkilerin G\u00fcncellenmesi:<\/strong> \u0130lk aktar\u0131m tamamland\u0131ktan sonra, ikinci bir script \u00e7al\u0131\u015ft\u0131rd\u0131lar. Bu script, \u00fcr\u00fcnlerin kategorilere, blog yaz\u0131lar\u0131n\u0131n yazarlara ve m\u00fc\u015fteri yorumlar\u0131n\u0131n \u00fcr\u00fcnlere olan Sanity referanslar\u0131n\u0131, daha \u00f6nce olu\u015fturulan ID e\u015fle\u015fme tablosunu kullanarak Strapi'deki do\u011fru ili\u015fkilerle g\u00fcncelledi.\n    <\/li>\n<li>\n        <strong>Test ve Do\u011frulama:<\/strong> Ge\u00e7i\u015f sonras\u0131 t\u00fcm i\u00e7erik t\u00fcrlerini, \u00fcr\u00fcn g\u00f6rsellerini, fiyatlar\u0131, varyantlar\u0131 ve ili\u015fkileri manuel olarak ve otomasyon testleriyle do\u011frulad\u0131lar. Frontend uygulamalar\u0131n\u0131 Strapi API'sine ba\u011flayarak t\u00fcm web sitesinin sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin oldular.\n    <\/li>\n<\/ol>\n<h3>Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve Elde Edilen Faydalar<\/h3>\n<p>\n<strong>Kar\u015f\u0131la\u015f\u0131lan Zorluklar:<\/strong>\n<\/p>\n<ul>\n<li>\n        <strong>Portable Text D\u00f6n\u00fc\u015f\u00fcm\u00fc:<\/strong> Sanity'nin Portable Text yap\u0131s\u0131 karma\u015f\u0131k oldu\u011fu i\u00e7in, bu veriyi Strapi'nin Rich Text alan\u0131na uygun Markdown format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek en \u00e7ok zaman alan k\u0131s\u0131md\u0131.\n    <\/li>\n<li>\n        <strong>Karma\u015f\u0131k \u0130li\u015fkiler:<\/strong> \u00dcr\u00fcn varyantlar\u0131 ve bunlar\u0131n envanterle olan ili\u015fkileri gibi \u00e7ok katmanl\u0131 referans yap\u0131lar\u0131n\u0131 do\u011fru bir \u015fekilde Strapi'ye ta\u015f\u0131mak detayl\u0131 \u00e7al\u0131\u015fma gerektirdi.\n    <\/li>\n<li>\n        <strong>API Rate Limitleri:<\/strong> \u00c7ok say\u0131da g\u00f6rseli indirip y\u00fcklerken Sanity CDN ve Strapi upload API'sinin rate limitlerine tak\u0131lmamak i\u00e7in scriptlerine gecikme mekanizmalar\u0131 eklemek zorunda kald\u0131lar.\n    <\/li>\n<\/ul>\n<p>\n<strong>Elde Edilen Faydalar:<\/strong>\n<\/p>\n<ul>\n<li>\n        <strong>Maliyet Tasarrufu:<\/strong> Uzun vadede Sanity'nin SaaS maliyetlerinden kurtularak \u00f6nemli \u00f6l\u00e7\u00fcde tasarruf ettiler.\n    <\/li>\n<li>\n        <strong>Tam Kontrol:<\/strong> T\u00fcm veriler kendi sunucular\u0131nda oldu\u011fu i\u00e7in tam veri egemenli\u011fine sahip oldular ve GDPR uyumlulu\u011funu daha kolay y\u00f6nettiler.\n    <\/li>\n<li>\n        <strong>Esneklik ve \u00d6zelle\u015ftirme:<\/strong> Strapi'nin a\u00e7\u0131k kaynak yap\u0131s\u0131 sayesinde, admin panelini ve i\u00e7erik modellerini i\u015fletmelerinin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re \u00e7ok daha derinlemesine \u00f6zelle\u015ftirebildiler. Yeni pazar yerleri entegrasyonlar\u0131 veya \u00f6zel pazarlama kampanyalar\u0131 i\u00e7in API'yi kolayca geni\u015flettiler.\n    <\/li>\n<li>\n        <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Kendi altyap\u0131lar\u0131 \u00fczerinde Strapi'yi \u00f6l\u00e7eklendirmek, i\u015fletmelerinin gelecekteki b\u00fcy\u00fcme ihtiya\u00e7lar\u0131na daha iyi yan\u0131t vermelerini sa\u011flad\u0131.\n    <\/li>\n<\/ul>\n<p>\nBu vaka analizi, Sanity'den Strapi'ye ge\u00e7i\u015fin planlama, teknik uygulama ve do\u011frulama gerektiren kapsaml\u0131 bir s\u00fcre\u00e7 oldu\u011funu, ancak do\u011fru yakla\u015f\u0131mla \u00f6nemli faydalar sa\u011flayabilece\u011fini g\u00f6stermektedir.\n<\/p>\n<h2>Sonu\u00e7: Ge\u00e7i\u015f S\u00fcrecini Ba\u015far\u0131yla Tamamlamak<\/h2>\n<p>\nSanity'den Strapi'ye ge\u00e7i\u015f, projenizin b\u00fcy\u00fcme ve evrim yolculu\u011funda \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131 olabilir. Bu rehber boyunca, neden bu ge\u00e7i\u015fi yapmay\u0131 d\u00fc\u015f\u00fcnmeniz gerekti\u011finden, her iki platformun temel \u00f6zelliklerine, ad\u0131m ad\u0131m veri ta\u015f\u0131ma s\u00fcre\u00e7lerine ve geli\u015fmi\u015f stratejilere kadar bir\u00e7ok konuyu ele ald\u0131k. Unutmay\u0131n ki, her ge\u00e7i\u015f projesi benzersizdir ve projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re uyarlamalar gerektirecektir. Ancak, do\u011fru planlama, detayl\u0131 ad\u0131mlar ve dikkatli test s\u00fcre\u00e7leriyle, bu karma\u015f\u0131k g\u00f6r\u00fcnen yolculu\u011fu ba\u015far\u0131yla tamamlayabilir ve projelerinize yeni bir g\u00fc\u00e7 katabilirsiniz.\n<\/p>\n<p>\nStrapi'ye ge\u00e7i\u015fin temel faydalar\u0131 aras\u0131nda maliyet kontrol\u00fc, veri egemenli\u011fi, esnek \u00f6zelle\u015ftirme imkanlar\u0131 ve geni\u015f bir geli\u015ftirici toplulu\u011funa eri\u015fim bulunmaktad\u0131r. Bu avantajlar, \u00f6zellikle \u00f6l\u00e7eklenebilirlik ve s\u00fcrd\u00fcr\u00fclebilirlik aray\u0131\u015f\u0131nda olan i\u015fletmeler ve geli\u015ftiriciler i\u00e7in kritik \u00f6neme sahiptir. Ge\u00e7i\u015f s\u00fcreci ba\u015flang\u0131\u00e7ta biraz zaman ve \u00e7aba gerektirse de, uzun vadede projenize daha fazla kontrol ve gelecekteki yenilikler i\u00e7in sa\u011flam bir zemin sa\u011flayacakt\u0131r.\n<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>Sanity Portable Text'i Strapi'ye nas\u0131l aktar\u0131r\u0131m?<\/strong><\/p>\n<p>\n            Sanity'nin Portable Text yap\u0131s\u0131, Strapi'nin Rich Text (zengin metin) alan\u0131 i\u00e7in do\u011frudan bir format de\u011fildir. Bu nedenle, \u00f6zel bir d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc script yazman\u0131z gereklidir. Portable Text i\u00e7eri\u011fini Markdown veya HTML format\u0131na \u00e7evirerek Strapi'nin Rich Text alan\u0131na kaydedebilirsiniz. <code>@sanity\/block-content-to-markdown<\/code> gibi npm paketleri, bu d\u00f6n\u00fc\u015f\u00fcm s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in kullan\u0131labilir. Bu, genellikle script'inizin en karma\u015f\u0131k par\u00e7alar\u0131ndan biri olacakt\u0131r.\n        <\/p>\n<\/li>\n<li>\n        <strong>G\u00f6r\u00fcnt\u00fclerimi Sanity'den Strapi'ye ta\u015f\u0131rken nelere dikkat etmeliyim?<\/strong><\/p>\n<p>\n            G\u00f6r\u00fcnt\u00fcleri Sanity CDN'inden programatik olarak indirmeniz ve ard\u0131ndan Strapi'nin medya k\u00fct\u00fcphanesine (veya yap\u0131land\u0131r\u0131lm\u0131\u015f bir bulut depolama sa\u011flay\u0131c\u0131s\u0131na, \u00f6rne\u011fin AWS S3) y\u00fcklemeniz gerekir. Bu s\u00fcre\u00e7te, g\u00f6rsellerin orijinal dosya adlar\u0131n\u0131 ve meta verilerini korumaya \u00e7al\u0131\u015f\u0131n. Ayr\u0131ca, i\u00e7eri\u011finizdeki eski g\u00f6rsel URL referanslar\u0131n\u0131 Strapi'ye y\u00fcklendikten sonra elde edece\u011finiz yeni URL'lerle veya Strapi'nin medya ID'leriyle g\u00fcncellemek kritik \u00f6neme sahiptir.\n        <\/p>\n<\/li>\n<li>\n        <strong>Ge\u00e7i\u015f s\u00fcreci ne kadar s\u00fcrer?<\/strong><\/p>\n<p>\n            Ge\u00e7i\u015f s\u00fcresi, veri miktar\u0131na, Sanity i\u00e7erik t\u00fcrlerinin ve \u015femalar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na, \u00f6zel entegrasyonlara, ta\u015f\u0131nacak medya varl\u0131\u011f\u0131 say\u0131s\u0131na ve ekibinizin deneyimine ba\u011fl\u0131 olarak b\u00fcy\u00fck \u00f6l\u00e7\u00fcde de\u011fi\u015fir. K\u00fc\u00e7\u00fck ve basit projeler birka\u00e7 g\u00fcn i\u00e7inde tamamlanabilirken, b\u00fcy\u00fck ve karma\u015f\u0131k veri setlerine sahip projeler haftalar veya hatta aylar s\u00fcrebilir. Detayl\u0131 bir planlama ve ad\u0131m ad\u0131m ilerleme, s\u00fcreci h\u0131zland\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r.\n        <\/p>\n<\/li>\n<li>\n        <strong>Strapi'ye ge\u00e7i\u015fin maliyetleri nelerdir?<\/strong><\/p>\n<p>\n            Strapi a\u00e7\u0131k kaynakl\u0131 oldu\u011fu i\u00e7in lisans maliyeti yoktur. Ancak, projenizi bar\u0131nd\u0131rmak i\u00e7in sunucu (hosting), bir veritaban\u0131, bak\u0131m ve operasyonel giderler olacakt\u0131r. Bu maliyetler, se\u00e7ti\u011finiz bulut sa\u011flay\u0131c\u0131s\u0131na (AWS, Azure, Google Cloud vb.) ve altyap\u0131 b\u00fcy\u00fckl\u00fc\u011f\u00fcne g\u00f6re de\u011fi\u015fir. Genellikle, bu self-hosting maliyetleri, b\u00fcy\u00fck veya y\u00fcksek trafikli projeler i\u00e7in Sanity'nin SaaS abonelik modellerine k\u0131yasla uzun vadede daha uygun maliyetli olabilir. Ayr\u0131ca, ge\u00e7i\u015fi ger\u00e7ekle\u015ftirecek geli\u015ftirici ekibinin zaman maliyetini de hesaba katmal\u0131s\u0131n\u0131z.\n        <\/p>\n<\/li>\n<li>\n        <strong>Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc nas\u0131l sa\u011flar\u0131m?<\/strong><\/p>\n<p>\n            Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in ge\u00e7i\u015f \u00f6ncesi ve sonras\u0131 detayl\u0131 bir do\u011frulama ve test s\u00fcreci \u015fartt\u0131r. K\u00fc\u00e7\u00fck bir alt k\u00fcme \u00fczerinde pilot ge\u00e7i\u015fler yapmak, potansiyel sorunlar\u0131 erkenden tespit etmenizi sa\u011flar. T\u00fcm i\u00e7erik t\u00fcrlerinin, alanlar\u0131n, ili\u015fkilerin ve medya varl\u0131klar\u0131n\u0131n do\u011fru bir \u015fekilde aktar\u0131ld\u0131\u011f\u0131ndan emin olun. Sanity'deki orijinal d\u00f6k\u00fcman say\u0131s\u0131n\u0131 Strapi'deki giri\u015f say\u0131s\u0131yla kar\u015f\u0131la\u015ft\u0131r\u0131n ve rastgele \u00f6rnekleme ile i\u00e7eri\u011fin do\u011frulu\u011funu kontrol edin. Otomatik testler ve manuel incelemeler bu s\u00fcre\u00e7te \u00e7ok yard\u0131mc\u0131 olacakt\u0131r.\n        <\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS&hellip;","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-31491","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>Sanity&#039;den Strapi&#039;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi&#039;ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi&#039;ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.\" \/>\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\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sanity&#039;den Strapi&#039;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi&#039;ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi&#039;ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T11:01:56+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Sanity&#8217;den Strapi&#8217;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber\",\"datePublished\":\"2025-10-10T11:01:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\"},\"wordCount\":5079,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\",\"name\":\"Sanity'den Strapi'ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T11:01:56+00:00\",\"description\":\"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi'ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi'ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sanity&#8217;den Strapi&#8217;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber\"}]},{\"@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":"Sanity'den Strapi'ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber","description":"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi'ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi'ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.","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\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Sanity'den Strapi'ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber","og_description":"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi'ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi'ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T11:01:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Sanity&#8217;den Strapi&#8217;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber","datePublished":"2025-10-10T11:01:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/"},"wordCount":5079,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/","name":"Sanity'den Strapi'ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T11:01:56+00:00","description":"Modern web projelerinde i\u00e7erik y\u00f6netimi, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir rol oynar. Sanity gibi servis tabanl\u0131 headless CMS \u00e7\u00f6z\u00fcmleri ba\u015flang\u0131\u00e7ta b\u00fcy\u00fck kolayl\u0131k sa\u011flarken, baz\u0131 durumlarda daha fazla kontrol, \u00f6zelle\u015ftirme veya kendi sunucular\u0131n\u0131zda bar\u0131nd\u0131rma ihtiyac\u0131 do\u011fabilir. \u0130\u015fte bu noktada, a\u00e7\u0131k kaynakl\u0131 ve self-host edilebilir bir alternatif olan Strapi'ye ge\u00e7i\u015f yapmak cazip bir se\u00e7enek haline gelebilir. Bu kapsaml\u0131 rehber, mevcut Sanity projenizi Strapi'ye nas\u0131l ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacak, veri ta\u015f\u0131ma, i\u00e7erik modelleme ve ba\u015far\u0131l\u0131 entegrasyon i\u00e7in size detayl\u0131 bir yol haritas\u0131 sunacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/sanityden-strapiye-gecis-adim-adim-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Sanity&#8217;den Strapi&#8217;ye Ge\u00e7i\u015f: Ad\u0131m Ad\u0131m Kapsaml\u0131 Rehber"}]},{"@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\/31491","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=31491"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31491\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}