{"id":32024,"date":"2025-10-16T21:41:09","date_gmt":"2025-10-16T18:41:09","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32024"},"modified":"2025-10-16T21:41:09","modified_gmt":"2025-10-16T18:41:09","slug":"ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/","title":{"rendered":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)"},"content":{"rendered":"<p><body><\/p>\n<h2>Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)<\/h2>\n<p>Ruby on Rails uygulamalar\u0131, geli\u015ftirme kolayl\u0131\u011f\u0131 ve h\u0131z\u0131yla bilinse de, b\u00fcy\u00fcyen kullan\u0131c\u0131 tabanlar\u0131 ve veri hacimleriyle birlikte performans darbo\u011fazlar\u0131yla kar\u015f\u0131la\u015fabilir. Bu darbo\u011fazlar\u0131n ba\u015f\u0131nda genellikle veritaban\u0131 gelir. Uygulama sunucusu ile veritaban\u0131 sunucusunun ayn\u0131 makinede \u00e7al\u0131\u015fmas\u0131, ba\u015flang\u0131\u00e7ta maliyet etkin bir \u00e7\u00f6z\u00fcm gibi g\u00f6r\u00fcnse de, \u00f6l\u00e7eklenme ihtiyac\u0131 do\u011fdu\u011funda ciddi performans sorunlar\u0131na yol a\u00e7abilir. Bu makale serisinin \u00fc\u00e7\u00fcnc\u00fc b\u00f6l\u00fcm\u00fcnde, Ruby on Rails uygulaman\u0131z i\u00e7in ayr\u0131lm\u0131\u015f (dedicated) bir PostgreSQL sunucusunun kurulumunu, optimizasyonunu ve y\u00f6netimini derinlemesine inceleyece\u011fiz. Bu ad\u0131mlar, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rman\u0131n yan\u0131 s\u0131ra, gelecekteki \u00f6l\u00e7eklendirme stratejileri i\u00e7in sa\u011flam bir temel olu\u015fturacakt\u0131r.<\/p>\n<h3>Neden Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu?<\/h3>\n<p>Ruby on Rails uygulaman\u0131z\u0131n veritaban\u0131n\u0131 ayr\u0131 bir sunucuya ta\u015f\u0131man\u0131n ard\u0131nda yatan temel nedenleri anlamak, bu karar\u0131n \u00f6nemini kavramak i\u00e7in kritiktir. \u0130\u015fte ba\u015fl\u0131ca avantajlar:<\/p>\n<h4>Kaynak \u0130zolasyonu (Resource Isolation)<\/h4>\n<p>Uygulama sunucusu ve veritaban\u0131 sunucusu ayn\u0131 makinede \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, CPU, RAM ve disk G\/\u00c7 (I\/O) gibi kaynaklar i\u00e7in s\u00fcrekli bir \u00e7eki\u015fme ya\u015fan\u0131r. Rails uygulamalar\u0131, web sunucular\u0131 (Puma, Unicorn), Sidekiq gibi arka plan i\u015fleyicileri ve di\u011fer servislerle birlikte \u00f6nemli miktarda kaynak t\u00fcketebilir. PostgreSQL gibi yo\u011fun G\/\u00c7 ve bellek kullanan bir veritaban\u0131 da kendi ba\u015f\u0131na y\u00fcksek kaynak gereksinimlerine sahiptir. Bu kaynaklar\u0131n ayr\u0131lmas\u0131, her iki bile\u015fenin de kendi ihtiya\u00e7 duydu\u011fu kaynaklara kesintisiz eri\u015fimini sa\u011flar, b\u00f6ylece performans dalgalanmalar\u0131 ve darbo\u011fazlar azal\u0131r. \u00d6rne\u011fin, yo\u011fun bir raporlama i\u015flemi veya toplu veri y\u00fckleme, uygulama sunucusunun yan\u0131t s\u00fcresini etkilemeden veritaban\u0131 sunucusunda \u00e7al\u0131\u015fabilir.<\/p>\n<h4>Geli\u015ftirilmi\u015f Performans<\/h4>\n<p>Ayr\u0131lm\u0131\u015f bir sunucu, PostgreSQL&#8217;in diske eri\u015fimini, bellek kullan\u0131m\u0131n\u0131 ve CPU d\u00f6ng\u00fclerini optimize etmesine olanak tan\u0131r. \u00d6zellikle <code>shared_buffers<\/code> ve <code>work_mem<\/code> gibi kritik PostgreSQL yap\u0131land\u0131rma parametreleri, ayr\u0131lm\u0131\u015f bir sunucuda daha c\u00f6mert\u00e7e ayarlanabilir. Bu, veritaban\u0131n\u0131n daha fazla veriyi bellekte tutarak disk G\/\u00c7&#8217;sini azaltmas\u0131n\u0131 ve sorgu performans\u0131n\u0131 art\u0131rmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, disk G\/\u00c7&#8217;sinin yaln\u0131zca veritaban\u0131 i\u015flemleri i\u00e7in kullan\u0131lmas\u0131, \u00f6zellikle SSD veya NVMe s\u00fcr\u00fcc\u00fclerle birlikte, \u00e7ok daha h\u0131zl\u0131 veri eri\u015fimi anlam\u0131na gelir.<\/p>\n<h4>Ba\u011f\u0131ms\u0131z \u00d6l\u00e7eklenebilirlik (Independent Scalability)<\/h4>\n<p>Uygulama sunucusu ve veritaban\u0131 sunucusunun ayr\u0131lmas\u0131, her bir bile\u015feni ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklendirme esnekli\u011fi sunar. Uygulaman\u0131z\u0131n i\u015flem g\u00fcc\u00fcne ihtiyac\u0131 varsa, daha fazla uygulama sunucusu ekleyebilirsiniz. Veritaban\u0131n\u0131z\u0131n daha fazla sorguyu i\u015fleme veya daha fazla veri depolama kapasitesine ihtiyac\u0131 varsa, veritaban\u0131 sunucusunu dikey (daha g\u00fc\u00e7l\u00fc donan\u0131m) veya yatay (okuma replikalar\u0131, sharding) olarak b\u00fcy\u00fctebilirsiniz. Bu ba\u011f\u0131ms\u0131zl\u0131k, kaynaklar\u0131 en verimli \u015fekilde kullanman\u0131z\u0131 ve maliyetleri optimize etmenizi sa\u011flar.<\/p>\n<h4>Art\u0131r\u0131lm\u0131\u015f G\u00fcvenlik<\/h4>\n<p>Ayr\u0131 sunucular, g\u00fcvenlik a\u00e7\u0131s\u0131ndan da \u00f6nemli avantajlar sunar. Veritaban\u0131 sunucusunu yaln\u0131zca uygulama sunucular\u0131n\u0131zdan gelen ba\u011flant\u0131lara izin verecek \u015fekilde yap\u0131land\u0131rabilir, genel internet eri\u015fimini k\u0131s\u0131tlayabilirsiniz. Bu, potansiyel sald\u0131r\u0131 y\u00fczeyini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Ayr\u0131ca, uygulama sunucusunda bir g\u00fcvenlik ihlali ya\u015fanmas\u0131 durumunda, veritaban\u0131 sunucusunun do\u011frudan etkilenme riski azal\u0131r. G\u00fcvenlik duvarlar\u0131, VPN&#8217;ler ve di\u011fer a\u011f g\u00fcvenlik \u00f6nlemleri, ayr\u0131lm\u0131\u015f bir veritaban\u0131 sunucusu ile daha etkin bir \u015fekilde uygulanabilir.<\/p>\n<h4>Daha Kolay Bak\u0131m ve Y\u00f6netim<\/h4>\n<p>Ayr\u0131lm\u0131\u015f bir veritaban\u0131 sunucusu, yedekleme, kurtarma, y\u00fckseltme ve izleme gibi bak\u0131m g\u00f6revlerini basitle\u015ftirir. Uygulama sunucusunu etkilemeden veritaban\u0131 yedeklerini alabilir, veritaban\u0131 yaz\u0131l\u0131m\u0131n\u0131 g\u00fcncelleyebilir veya performans ayarlar\u0131n\u0131 de\u011fi\u015ftirebilirsiniz. Bu, planl\u0131 kesintileri minimize eder ve operasyonel verimlili\u011fi art\u0131r\u0131r.<\/p>\n<h3>Ayr\u0131lm\u0131\u015f Sunucuyu Planlama<\/h3>\n<p>Ayr\u0131lm\u0131\u015f bir PostgreSQL sunucusu kurmaya ba\u015flamadan \u00f6nce dikkatli bir planlama yapmak, ba\u015far\u0131l\u0131 bir ge\u00e7i\u015f i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h4>Donan\u0131m\/Sanal Makine Boyutland\u0131rmas\u0131<\/h4>\n<p>*   <strong>CPU:<\/strong> Genellikle 4-8 \u00e7ekirdek \u00e7o\u011fu orta \u00f6l\u00e7ekli uygulama i\u00e7in yeterli olacakt\u0131r. Yo\u011fun sorgu y\u00fck\u00fc veya karma\u015f\u0131k analitik i\u015flemler varsa daha fazlas\u0131 gerekebilir. PostgreSQL, sorgular\u0131 paralel olarak \u00e7al\u0131\u015ft\u0131rabilir, bu nedenle \u00e7ekirdek say\u0131s\u0131 \u00f6nemlidir.<br \/>\n*   <strong>RAM:<\/strong> PostgreSQL performans\u0131 i\u00e7in en kritik fakt\u00f6rlerden biridir. Veritaban\u0131 \u00f6nbelleklemesi (shared_buffers) ve sorgu \u00e7al\u0131\u015fma alan\u0131 (work_mem) i\u00e7in bol miktarda RAM gereklidir. Genel bir kural olarak, veritaban\u0131 boyutu artt\u0131k\u00e7a veya sorgu yo\u011funlu\u011fu y\u00fckseldik\u00e7e RAM ihtiyac\u0131 artar. Genellikle 16 GB&#8217;dan ba\u015flay\u0131p, 32 GB, 64 GB veya daha fazlas\u0131na \u00e7\u0131k\u0131labilir. Sunucunun toplam RAM&#8217;inin %25&#8217;i ila %40&#8217;\u0131 <code>shared_buffers<\/code> i\u00e7in ayr\u0131labilir.<br \/>\n*   <strong>Depolama:<\/strong> Disk G\/\u00c7 performans\u0131, veritaban\u0131 i\u00e7in en b\u00fcy\u00fck darbo\u011fazlardan biri olabilir.<br \/>\n    *   <strong>SSD\/NVMe:<\/strong> Kesinlikle SSD veya NVMe s\u00fcr\u00fcc\u00fcler kullan\u0131lmal\u0131d\u0131r. Geleneksel HDD&#8217;ler, modern veritaban\u0131 ihtiya\u00e7lar\u0131 i\u00e7in yeterli performans\u0131 sa\u011flayamaz.<br \/>\n    *   <strong>RAID:<\/strong> Veri yedeklili\u011fi ve performans i\u00e7in RAID yap\u0131land\u0131rmalar\u0131 d\u00fc\u015f\u00fcn\u00fclmelidir (\u00f6rn. RAID 10). Bulut ortamlar\u0131nda, y\u00f6netilen disk hizmetleri (\u00f6rn. AWS EBS Provisioned IOPS) bu ihtiyac\u0131 kar\u015f\u0131lar.<br \/>\n    *   <strong>Disk Boyutu:<\/strong> Veritaban\u0131n\u0131n mevcut boyutu, beklenen b\u00fcy\u00fcme oran\u0131 ve yedeklemeler i\u00e7in gerekli alan g\u00f6z \u00f6n\u00fcnde bulundurularak belirlenmelidir.<\/p>\n<h4>\u0130\u015fletim Sistemi Se\u00e7imi<\/h4>\n<p>Linux, PostgreSQL i\u00e7in en yayg\u0131n ve \u00f6nerilen i\u015fletim sistemidir.<br \/>\n*   <strong>Ubuntu\/Debian:<\/strong> Kullan\u0131m kolayl\u0131\u011f\u0131, geni\u015f topluluk deste\u011fi ve g\u00fcncel paketler sunar. <code>apt<\/code> paket y\u00f6neticisi ile PostgreSQL kurulumu olduk\u00e7a basittir.<br \/>\n*   <strong>RHEL\/CentOS:<\/strong> Kurumsal ortamlarda yayg\u0131n olarak kullan\u0131l\u0131r, kararl\u0131l\u0131\u011f\u0131 ve uzun s\u00fcreli deste\u011fi ile bilinir. <code>yum<\/code> veya <code>dnf<\/code> paket y\u00f6neticisi kullan\u0131l\u0131r.<br \/>\nHer iki durumda da, i\u015fletim sisteminin g\u00fcncel ve g\u00fcvenlik yamalar\u0131n\u0131n uygulanm\u0131\u015f oldu\u011fundan emin olunmal\u0131d\u0131r.<\/p>\n<h4>A\u011f Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>*   <strong>\u00d6zel IP&#8217;ler:<\/strong> Veritaban\u0131 sunucusunun uygulama sunucular\u0131n\u0131zla \u00f6zel bir a\u011f \u00fczerinden ileti\u015fim kurmas\u0131 idealdir. Bu, genel internet \u00fczerinden eri\u015fimi k\u0131s\u0131tlar ve gecikmeyi azalt\u0131r.<br \/>\n*   <strong>G\u00fcvenlik Gruplar\u0131\/G\u00fcvenlik Duvarlar\u0131:<\/strong> Yaln\u0131zca uygulama sunucular\u0131n\u0131z\u0131n IP adreslerinden (veya IP aral\u0131klar\u0131ndan) PostgreSQL portuna (varsay\u0131lan 5432) gelen ba\u011flant\u0131lara izin verecek \u015fekilde g\u00fcvenlik duvar\u0131 kurallar\u0131 tan\u0131mlanmal\u0131d\u0131r. <code>ufw<\/code> (Ubuntu) veya <code>firewalld<\/code> (CentOS) gibi ara\u00e7lar bu konuda yard\u0131mc\u0131 olur.<\/p>\n<h4>Yedekleme Stratejisi<\/h4>\n<p>*   <strong>Mant\u0131ksal Yedekleme (<code>pg_dump<\/code>):<\/strong> Belirli tablolar\u0131 veya t\u00fcm veritaban\u0131n\u0131 SQL format\u0131nda yedeklemek i\u00e7in kullan\u0131l\u0131r. Kolayca geri y\u00fcklenebilir ancak b\u00fcy\u00fck veritabanlar\u0131 i\u00e7in yava\u015f olabilir.<br \/>\n*   <strong>Fiziksel Yedekleme (<code>pg_basebackup<\/code>, WAL ar\u015fivleme):<\/strong> T\u00fcm veri dizinini yedekler. Point-in-Time Recovery (PITR) i\u00e7in WAL (Write-Ahead Log) ar\u015fivleme ile birlikte kullan\u0131l\u0131r. Bu, belirli bir ana kadar veritaban\u0131n\u0131 geri y\u00fcklemenizi sa\u011flar ve b\u00fcy\u00fck veritabanlar\u0131 i\u00e7in daha h\u0131zl\u0131d\u0131r.<br \/>\n*   <strong>Yedekleme S\u0131kl\u0131\u011f\u0131 ve Saklama:<\/strong> \u0130\u015fletmenizin kurtarma noktas\u0131 hedefi (RPO) ve kurtarma s\u00fcresi hedefi (RTO) do\u011frultusunda yedekleme s\u0131kl\u0131\u011f\u0131 ve yedeklerin ne kadar s\u00fcreyle saklanaca\u011f\u0131 belirlenmelidir.<\/p>\n<h4>\u0130zleme (Monitoring)<\/h4>\n<p>Veritaban\u0131 sunucusunun sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 s\u00fcrekli izlemek, potansiyel sorunlar\u0131 erkenden tespit etmek i\u00e7in hayati \u00f6neme sahiptir. \u0130zlenecek temel metrikler \u015funlard\u0131r: CPU kullan\u0131m\u0131, RAM kullan\u0131m\u0131, disk G\/\u00c7, disk alan\u0131, a\u011f trafi\u011fi, aktif ba\u011flant\u0131 say\u0131s\u0131, sorgu gecikmeleri, \u00f6nbellek isabet oran\u0131 ve WAL etkinli\u011fi.<\/p>\n<h3>Ayr\u0131lm\u0131\u015f PostgreSQL Sunucusunu Kurma<\/h3>\n<p>Bu b\u00f6l\u00fcmde, Ubuntu \u00fczerinde PostgreSQL kurulumu ve temel yap\u0131land\u0131rma ad\u0131mlar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h4>\u0130\u015fletim Sistemi Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>Sunucunuzu g\u00fcncelleyerek ba\u015flay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<p>G\u00fcvenlik duvar\u0131n\u0131 yap\u0131land\u0131r\u0131n. Yaln\u0131zca SSH (22) ve PostgreSQL (5432) portlar\u0131na uygulama sunucular\u0131n\u0131z\u0131n IP adreslerinden eri\u015fime izin verin:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow OpenSSH\nsudo ufw allow from <Uygulama_Sunucusu_IP_Adresi> to any port 5432\nsudo ufw enable\nsudo ufw status<\/code><\/pre>\n<h4>PostgreSQL Kurulumu<\/h4>\n<p>PostgreSQL&#8217;in en g\u00fcncel ve kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc kullanmak i\u00e7in resmi PostgreSQL APT deposunu eklemek en iyi y\u00f6ntemdir:<\/p>\n<pre><code class=\"language-bash\">sudo sh -c 'echo \"deb http:\/\/apt.postgresql.org\/pub\/repos\/apt $(lsb_release -cs)-pgdg main\" > \/etc\/apt\/sources.list.d\/pgdg.list'\nwget --quiet -O - https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc | sudo apt-key add -\nsudo apt update\nsudo apt install postgresql postgresql-contrib -y<\/code><\/pre>\n<p>Bu komutlar, PostgreSQL&#8217;in en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin PostgreSQL 16) ve <code>postgresql-contrib<\/code> paketini (ek mod\u00fcller ve ara\u00e7lar i\u00e7erir) kuracakt\u0131r. Kurulumdan sonra PostgreSQL servisi otomatik olarak ba\u015flayacakt\u0131r.<\/p>\n<h4>Ba\u015flang\u0131\u00e7 G\u00fcvenli\u011fi ve Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>1.  <strong>PostgreSQL Kullan\u0131c\u0131s\u0131 \u015eifresi:<\/strong> Varsay\u0131lan <code>postgres<\/code> kullan\u0131c\u0131s\u0131 i\u00e7in bir \u015fifre belirleyin:<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres\n    psql\n    ALTER USER postgres WITH PASSWORD 'guclu_sifreniz';\n    \\q\n    exit<\/code><\/pre>\n<p>2.  <strong>Uygulama \u0130\u00e7in Yeni Kullan\u0131c\u0131 ve Veritaban\u0131:<\/strong> Uygulaman\u0131z i\u00e7in ayr\u0131 bir kullan\u0131c\u0131 ve veritaban\u0131 olu\u015fturmak iyi bir g\u00fcvenlik uygulamas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres\n    createuser -P rails_user # \u015eifre sorulacak\n    createdb -O rails_user rails_app_production\n    psql -c \"GRANT ALL PRIVILEGES ON DATABASE rails_app_production TO rails_user;\"\n    \\q\n    exit<\/code><\/pre>\n<p>3.  <strong>A\u011f Ba\u011flant\u0131lar\u0131n\u0131 Yap\u0131land\u0131rma (<code>postgresql.conf<\/code> ve <code>pg_hba.conf<\/code>):<\/strong><br \/>\n    PostgreSQL&#8217;in d\u0131\u015far\u0131dan gelen ba\u011flant\u0131lar\u0131 kabul etmesi i\u00e7in <code>postgresql.conf<\/code> dosyas\u0131n\u0131 d\u00fczenlemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/postgresql\/<versiyon>\/main\/postgresql.conf<\/code><\/pre>\n<p>    <code>listen_addresses<\/code> sat\u0131r\u0131n\u0131 bulun ve yorumunu kald\u0131r\u0131n (veya ekleyin):<\/p>\n<pre><code class=\"language-\">listen_addresses = '*' # T\u00fcm aray\u00fczlerden gelen ba\u011flant\u0131lara izin verir\n    # Veya belirli IP adresleri i\u00e7in:\n    # listen_addresses = 'localhost,192.168.1.100'<\/code><\/pre>\n<p>    Ard\u0131ndan, kimlik do\u011frulama kurallar\u0131n\u0131 tan\u0131mlayan <code>pg_hba.conf<\/code> dosyas\u0131n\u0131 d\u00fczenleyin:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/postgresql\/<versiyon>\/main\/pg_hba.conf<\/code><\/pre>\n<p>    Dosyan\u0131n sonuna, uygulama sunucunuzun IP adresinden <code>rails_app_production<\/code> veritaban\u0131na <code>rails_user<\/code> kullan\u0131c\u0131s\u0131 ile <code>md5<\/code> (\u015fifre tabanl\u0131) kimlik do\u011frulamas\u0131na izin veren bir sat\u0131r ekleyin:<\/p>\n<pre><code class=\"language-\"># TYPE  DATABASE        USER            ADDRESS                 METHOD\n    host    rails_app_production  rails_user      <Uygulama_Sunucusu_IP_Adresi>\/32   md5\n    # E\u011fer birden fazla uygulama sunucusu varsa, her biri i\u00e7in ayr\u0131 bir sat\u0131r ekleyin veya bir IP aral\u0131\u011f\u0131 belirtin.\n    # \u00d6rne\u011fin: host    all             all             192.168.1.0\/24          md5<\/code><\/pre>\n<p>    De\u011fi\u015fiklikleri kaydettikten sonra PostgreSQL servisini yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart postgresql<\/code><\/pre>\n<h3>Rails \u0130\u00e7in PostgreSQL Optimizasyonu<\/h3>\n<p>PostgreSQL&#8217;in varsay\u0131lan yap\u0131land\u0131rmas\u0131 genellikle genel ama\u00e7l\u0131d\u0131r. Rails uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re optimize etmek, performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Optimizasyonlar <code>postgresql.conf<\/code> dosyas\u0131nda yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/postgresql\/<versiyon>\/main\/postgresql.conf<\/code><\/pre>\n<p>\u0130\u015fte dikkat etmeniz gereken baz\u0131 \u00f6nemli parametreler:<\/p>\n<p>*   <strong><code>shared_buffers<\/code>:<\/strong> PostgreSQL&#8217;in veri sayfalar\u0131n\u0131 \u00f6nbelleklemek i\u00e7in kulland\u0131\u011f\u0131 bellek miktar\u0131. En \u00f6nemli performans parametrelerinden biridir. Sunucunun toplam RAM&#8217;inin %25&#8217;i ila %40&#8217;\u0131 aras\u0131nda bir de\u011fer atay\u0131n. \u00d6rne\u011fin, 32 GB RAM&#8217;li bir sunucu i\u00e7in 8GB (8192MB) veya 12GB (12288MB) gibi.<\/p>\n<pre><code class=\"language-\">shared_buffers = 8GB<\/code><\/pre>\n<p>*   <strong><code>work_mem<\/code>:<\/strong> Her bir sorgu i\u015flemi (s\u0131ralama, karma i\u015flemler vb.) i\u00e7in kullan\u0131lacak bellek miktar\u0131. \u00c7ok say\u0131da karma\u015f\u0131k sorgu \u00e7al\u0131\u015ft\u0131ran uygulamalar i\u00e7in \u00f6nemlidir. Varsay\u0131lan de\u011fer genellikle d\u00fc\u015f\u00fckt\u00fcr. 16MB-64MB gibi bir de\u011ferle ba\u015flay\u0131p izlemeye g\u00f6re ayarlay\u0131n. \u00c7ok y\u00fcksek bir de\u011fer, \u00e7ok fazla e\u015fzamanl\u0131 sorgu durumunda bellek t\u00fcketimini art\u0131rabilir.<\/p>\n<pre><code class=\"language-\">work_mem = 32MB<\/code><\/pre>\n<p>*   <strong><code>maintenance_work_mem<\/code>:<\/strong> <code>VACUUM<\/code>, <code>CREATE INDEX<\/code>, <code>ALTER TABLE<\/code> gibi bak\u0131m i\u015flemleri i\u00e7in ayr\u0131lan bellek. Bu i\u015flemler genellikle tek seferlik ve daha az s\u0131kl\u0131kta \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in daha y\u00fcksek bir de\u011fer atanabilir (\u00f6rn. 256MB-1GB).<\/p>\n<pre><code class=\"language-\">maintenance_work_mem = 512MB<\/code><\/pre>\n<p>*   <strong><code>wal_buffers<\/code>:<\/strong> WAL (Write-Ahead Log) verilerini diske yazmadan \u00f6nce bellekte tutmak i\u00e7in kullan\u0131lan alan. Genellikle 16MB veya daha fazlas\u0131 yeterlidir.<\/p>\n<pre><code class=\"language-\">wal_buffers = 16MB<\/code><\/pre>\n<p>*   <strong><code>effective_cache_size<\/code>:<\/strong> PostgreSQL&#8217;in i\u015fletim sistemi sayfa \u00f6nbelle\u011fi ve kendi <code>shared_buffers<\/code> ile birlikte ne kadar belle\u011fi sorgular\u0131 h\u0131zland\u0131rmak i\u00e7in kullanabilece\u011fine dair bir tahmin. Bu, sorgu planlay\u0131c\u0131s\u0131na yard\u0131mc\u0131 olur. Genellikle toplam RAM&#8217;in %50&#8217;si ila %75&#8217;i aras\u0131nda bir de\u011fer atay\u0131n.<\/p>\n<pre><code class=\"language-\">effective_cache_size = 24GB # 32GB RAM i\u00e7in<\/code><\/pre>\n<p>*   <strong><code>max_connections<\/code>:<\/strong> Veritaban\u0131na izin verilen e\u015fzamanl\u0131 ba\u011flant\u0131 say\u0131s\u0131. Rails uygulamas\u0131, web sunucusu i\u015f par\u00e7ac\u0131\u011f\u0131 say\u0131s\u0131 ve Sidekiq i\u015f\u00e7i say\u0131s\u0131 kadar ba\u011flant\u0131 a\u00e7abilir. Ayr\u0131ca PgBouncer gibi bir ba\u011flant\u0131 havuzu kullan\u0131l\u0131yorsa, PgBouncer&#8217;\u0131n a\u00e7t\u0131\u011f\u0131 ba\u011flant\u0131 say\u0131s\u0131na g\u00f6re ayarlanmal\u0131d\u0131r. Ba\u015flang\u0131\u00e7ta 100-200 gibi bir de\u011ferle ba\u015flay\u0131n.<\/p>\n<pre><code class=\"language-\">max_connections = 150<\/code><\/pre>\n<p>*   <strong><code>random_page_cost<\/code> ve <code>seq_page_cost<\/code>:<\/strong> Sorgu planlay\u0131c\u0131s\u0131n\u0131n disk G\/\u00c7 maliyetini tahmin etmesine yard\u0131mc\u0131 olan parametreler. SSD&#8217;ler i\u00e7in <code>random_page_cost<\/code> daha d\u00fc\u015f\u00fck bir de\u011fere (\u00f6rn. 1.1 &#8211; 2.0) ayarlanabilir. <code>seq_page_cost<\/code> genellikle 1.0 olarak kal\u0131r.<\/p>\n<pre><code class=\"language-\">random_page_cost = 1.5\n    seq_page_cost = 1.0<\/code><\/pre>\n<p>*   <strong><code>log_min_duration_statement<\/code>:<\/strong> Belirli bir s\u00fcreden daha uzun s\u00fcren sorgular\u0131 loglamay\u0131 sa\u011flar. Yava\u015f sorgular\u0131 tespit etmek i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, 500ms&#8217;den uzun s\u00fcren sorgular\u0131 loglamak i\u00e7in <code>500ms<\/code> olarak ayarlay\u0131n.<\/p>\n<pre><code class=\"language-\">log_min_duration_statement = 500ms<\/code><\/pre>\n<p>*   <strong><code>autovacuum<\/code> Ayarlar\u0131:<\/strong> PostgreSQL&#8217;in otomatik olarak tablolar\u0131 temizlemesini ve analiz etmesini sa\u011flayan kritik bir \u00f6zelliktir. Tablo \u015fi\u015fmesini (bloat) \u00f6nler ve sorgu performans\u0131n\u0131 art\u0131r\u0131r. Varsay\u0131lan olarak etkindir ancak ayarlar\u0131 uygulaman\u0131z\u0131n i\u015f y\u00fck\u00fcne g\u00f6re ince ayar yap\u0131labilir.<\/p>\n<pre><code class=\"language-\">autovacuum = on\n    # Di\u011fer autovacuum parametreleri (\u00f6rn. autovacuum_vacuum_scale_factor, autovacuum_vacuum_threshold)\n    # uygulaman\u0131z\u0131n veri de\u011fi\u015fim h\u0131z\u0131na g\u00f6re ayarlanabilir.<\/code><\/pre>\n<p>De\u011fi\u015fiklikleri uygulad\u0131ktan sonra PostgreSQL servisini yeniden ba\u015flatmay\u0131 unutmay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart postgresql<\/code><\/pre>\n<h4>\u0130ndeksleme Stratejisi<\/h4>\n<p>Rails uygulamalar\u0131nda do\u011fru indeksleme, sorgu performans\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde etkiler.<br \/>\n*   <strong><code>add_index<\/code> Kullan\u0131m\u0131:<\/strong> <code>db\/migrate<\/code> dosyalar\u0131n\u0131zda s\u0131k\u00e7a arama yap\u0131lan s\u00fctunlara, JOIN i\u015flemlerinde kullan\u0131lan yabanc\u0131 anahtarlara ve <code>ORDER BY<\/code> veya <code>GROUP BY<\/code> kullan\u0131lan s\u00fctunlara indeks ekledi\u011finizden emin olun.<br \/>\n*   <strong>Kompozit \u0130ndeksler:<\/strong> Birden fazla s\u00fctun \u00fczerinde ko\u015ful i\u00e7eren sorgular i\u00e7in kompozit indeksler (<code>add_index :table, [:col1, :col2]<\/code>) kullanmak performans\u0131 art\u0131rabilir.<br \/>\n*   <strong><code>EXPLAIN ANALYZE<\/code>:<\/strong> Yava\u015f \u00e7al\u0131\u015fan sorgular\u0131 analiz etmek i\u00e7in <code>EXPLAIN ANALYZE<\/code> komutunu kullanarak sorgu planlar\u0131n\u0131 inceleyin ve indeks eksikliklerini veya verimsiz sorgular\u0131 tespit edin.<\/p>\n<h4>Sorgu Optimizasyonu<\/h4>\n<p>Rails&#8217;in ActiveRecord&#8217;u bazen verimsiz sorgulara yol a\u00e7abilir:<br \/>\n*   <strong>N+1 Sorgu Sorunu:<\/strong> \u0130li\u015fkili verileri \u00e7ekerken her ili\u015fkili \u00f6\u011fe i\u00e7in ayr\u0131 bir sorgu yap\u0131lmas\u0131. <code>includes<\/code> veya <code>eager_load<\/code> kullanarak bu sorunu \u00e7\u00f6z\u00fcn: <code>User.includes(:posts)<\/code>.<br \/>\n*   <strong>Gereksiz Veri \u00c7ekme:<\/strong> Yaln\u0131zca belirli s\u00fctunlara ihtiyac\u0131n\u0131z varsa <code>select<\/code> kullanarak gereksiz veri \u00e7ekmekten ka\u00e7\u0131n\u0131n: <code>User.select(:id, :name)<\/code>.<br \/>\n*   <strong>Toplu \u0130\u015flemler:<\/strong> \u00c7ok say\u0131da kay\u0131t \u00fczerinde i\u015flem yaparken, tek tek <code>save<\/code> veya <code>update<\/code> yerine toplu i\u015flemler (<code>update_all<\/code>, <code>insert_all<\/code>) kullan\u0131n.<\/p>\n<h4>Ba\u011flant\u0131 Havuzu (Connection Pooling)<\/h4>\n<p>Ruby on Rails uygulamalar\u0131 her bir web sunucusu i\u015f par\u00e7ac\u0131\u011f\u0131 veya Sidekiq i\u015f\u00e7isi i\u00e7in veritaban\u0131na ayr\u0131 bir ba\u011flant\u0131 a\u00e7ma e\u011filimindedir. Y\u00fcksek trafikli uygulamalarda bu, veritaban\u0131 sunucusunda \u00e7ok say\u0131da a\u00e7\u0131k ba\u011flant\u0131ya yol a\u00e7abilir ve performans\u0131 olumsuz etkileyebilir. <strong>PgBouncer<\/strong> veya <strong>Odyssey<\/strong> gibi harici bir ba\u011flant\u0131 havuzu arac\u0131 kullanmak, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 daha verimli y\u00f6netmenizi sa\u011flar. Bu ara\u00e7lar, uygulama ba\u011flant\u0131lar\u0131n\u0131 kabul eder ve veritaban\u0131na daha az say\u0131da kal\u0131c\u0131 ba\u011flant\u0131 kurar. Bu, veritaban\u0131 \u00fczerindeki y\u00fck\u00fc azalt\u0131r ve ba\u011flant\u0131 kurma maliyetini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<h3>Veri Ta\u015f\u0131ma (Migration)<\/h3>\n<p>Mevcut veritaban\u0131n\u0131z\u0131 eski sunucudan yeni, ayr\u0131lm\u0131\u015f PostgreSQL sunucusuna ta\u015f\u0131mak kritik bir ad\u0131md\u0131r.<\/p>\n<h4>Kesinti S\u00fcreli Yakla\u015f\u0131m (Downtime Approach)<\/h4>\n<p>En basit ve en g\u00fcvenli y\u00f6ntem, uygulaman\u0131z\u0131n k\u0131sa bir s\u00fcreli\u011fine kapal\u0131 kalmas\u0131n\u0131 gerektiren bu yakla\u015f\u0131md\u0131r.<\/p>\n<p>1.  <strong>Rails Uygulamas\u0131n\u0131 Durdurun:<\/strong> Yeni veri yaz\u0131lmas\u0131n\u0131 \u00f6nlemek i\u00e7in t\u00fcm Rails uygulama sunucular\u0131n\u0131 ve arka plan i\u015fleyicilerini durdurun.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl stop puma # veya unicorn, passenger\n    sudo systemctl stop sidekiq<\/code><\/pre>\n<p>2.  <strong>Mevcut Veritaban\u0131n\u0131 Yedekleyin:<\/strong> Eski sunucunuzda, <code>pg_dump<\/code> kullanarak \u00fcretim veritaban\u0131n\u0131z\u0131n mant\u0131ksal bir yede\u011fini al\u0131n.<\/p>\n<pre><code class=\"language-bash\">pg_dump -Fc -v -d rails_app_production -U postgres -f rails_app_production_backup.dump<\/code><\/pre>\n<p>    *   <code>-Fc<\/code>: \u00d6zel format (custom format), <code>pg_restore<\/code> ile esnek geri y\u00fckleme sa\u011flar.<br \/>\n    *   <code>-v<\/code>: Ayr\u0131nt\u0131l\u0131 \u00e7\u0131kt\u0131.<br \/>\n    *   <code>-d<\/code>: Veritaban\u0131 ad\u0131.<br \/>\n    *   <code>-U<\/code>: Kullan\u0131c\u0131 ad\u0131.<br \/>\n    *   <code>-f<\/code>: \u00c7\u0131kt\u0131 dosyas\u0131.<\/p>\n<p>3.  <strong>Yedek Dosyas\u0131n\u0131 Yeni Sunucuya Aktar\u0131n:<\/strong> <code>scp<\/code> veya ba\u015fka bir g\u00fcvenli dosya aktar\u0131m y\u00f6ntemiyle yedek dosyas\u0131n\u0131 yeni PostgreSQL sunucusuna kopyalay\u0131n.<\/p>\n<pre><code class=\"language-bash\">scp rails_app_production_backup.dump rails_user@<Yeni_PostgreSQL_Sunucusu_IP>:\/tmp\/<\/code><\/pre>\n<p>4.  <strong>Veritaban\u0131n\u0131 Yeni Sunucuya Geri Y\u00fckleyin:<\/strong> Yeni PostgreSQL sunucusunda, daha \u00f6nce olu\u015fturdu\u011funuz <code>rails_app_production<\/code> veritaban\u0131na yede\u011fi geri y\u00fckleyin.<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres\n    pg_restore -v -d rails_app_production -U rails_user \/tmp\/rails_app_production_backup.dump\n    \\q\n    exit<\/code><\/pre>\n<p>    Bu i\u015flem, veritaban\u0131 \u015femas\u0131n\u0131 ve t\u00fcm verileri geri y\u00fckleyecektir.<\/p>\n<h4>Minimum Kesinti S\u00fcreli Yakla\u015f\u0131m (Brief Mention)<\/h4>\n<p>S\u0131f\u0131ra yak\u0131n kesinti s\u00fcresi gerektiren durumlar i\u00e7in mant\u0131ksal replikasyon (\u00f6rn. <code>pglogical<\/code> veya PostgreSQL&#8217;in yerle\u015fik mant\u0131ksal replikasyonu) kullan\u0131labilir. Bu, eski veritaban\u0131ndan yeniye s\u00fcrekli veri ak\u0131\u015f\u0131 sa\u011flayarak, ge\u00e7i\u015f an\u0131nda sadece \u00e7ok k\u0131sa bir kesinti s\u00fcresiyle uygulamay\u0131 y\u00f6nlendirmeye olanak tan\u0131r. Ancak bu y\u00f6ntem daha karma\u015f\u0131kt\u0131r ve dikkatli planlama gerektirir. \u00c7o\u011fu orta \u00f6l\u00e7ekli Rails uygulamas\u0131 i\u00e7in kesinti s\u00fcreli yakla\u015f\u0131m yeterlidir.<\/p>\n<h3>Rails Uygulamas\u0131n\u0131 Ba\u011flama<\/h3>\n<p>Veritaban\u0131 yeni sunucuya ta\u015f\u0131nd\u0131ktan sonra, Rails uygulaman\u0131z\u0131n bu yeni sunucuya ba\u011flanmas\u0131 i\u00e7in <code>config\/database.yml<\/code> dosyas\u0131n\u0131 g\u00fcncellemeniz gerekir.<\/p>\n<pre><code class=\"language-yaml\"># config\/database.yml\nproduction:\n  adapter: postgresql\n  encoding: unicode\n  pool: <%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>\n  host: <%= ENV.fetch(\"DATABASE_HOST\") %>\n  port: <%= ENV.fetch(\"DATABASE_PORT\") { 5432 } %>\n  database: <%= ENV.fetch(\"DATABASE_NAME\") %>\n  username: <%= ENV.fetch(\"DATABASE_USER\") %>\n  password: <%= ENV.fetch(\"DATABASE_PASSWORD\") %><\/code><\/pre>\n<p>Hassas bilgileri (host, username, password) do\u011frudan dosyaya yazmak yerine ortam de\u011fi\u015fkenleri (environment variables) kullanmak en iyi g\u00fcvenlik uygulamas\u0131d\u0131r. \u00d6rne\u011fin, uygulama sunucunuzda:<\/p>\n<pre><code class=\"language-bash\">export DATABASE_HOST=\"<Yeni_PostgreSQL_Sunucusu_IP>\"\nexport DATABASE_NAME=\"rails_app_production\"\nexport DATABASE_USER=\"rails_user\"\nexport DATABASE_PASSWORD=\"guclu_sifreniz\"<\/code><\/pre>\n<p>Uygulama sunucunuzu yeniden ba\u015flatmadan \u00f6nce bu ortam de\u011fi\u015fkenlerinin do\u011fru \u015fekilde ayarland\u0131\u011f\u0131ndan emin olun. Ard\u0131ndan Rails uygulaman\u0131z\u0131 ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start puma # veya unicorn, passenger\nsudo systemctl start sidekiq<\/code><\/pre>\n<p>Uygulaman\u0131n sorunsuz \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n ba\u015far\u0131l\u0131 oldu\u011fundan emin olmak i\u00e7in loglar\u0131 kontrol edin.<\/p>\n<h3>\u0130zleme ve Bak\u0131m<\/h3>\n<p>Ayr\u0131lm\u0131\u015f bir PostgreSQL sunucusu kurmak sadece ba\u015flang\u0131\u00e7t\u0131r. S\u00fcrekli izleme ve d\u00fczenli bak\u0131m, uzun vadeli performans ve kararl\u0131l\u0131k i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h4>Anahtar Metrikler<\/h4>\n<p>*   <strong>Sistem Metrikleri:<\/strong> CPU kullan\u0131m\u0131, RAM kullan\u0131m\u0131, Disk G\/\u00c7 (IOPS, throughput), disk alan\u0131, a\u011f trafi\u011fi.<br \/>\n*   <strong>PostgreSQL Metrikleri:<\/strong><br \/>\n    *   <strong>Ba\u011flant\u0131lar:<\/strong> Aktif ba\u011flant\u0131 say\u0131s\u0131, beklemedeki ba\u011flant\u0131lar.<br \/>\n    *   <strong>\u00d6nbellek:<\/strong> \u00d6nbellek isabet oran\u0131 (<code>shared_buffers<\/code> ve i\u015fletim sistemi \u00f6nbelle\u011fi).<br \/>\n    *   <strong>Sorgular:<\/strong> Sorgu gecikmeleri, yava\u015f sorgular, sorgu say\u0131s\u0131.<br \/>\n    *   <strong>Tablo\/\u0130ndeks \u0130statistikleri:<\/strong> Okunan\/yaz\u0131lan sat\u0131r say\u0131s\u0131, indeks tarama say\u0131s\u0131, tablo \u015fi\u015fmesi.<br \/>\n    *   <strong>WAL Etkinli\u011fi:<\/strong> WAL yazma\/ar\u015fivleme h\u0131z\u0131.<br \/>\n    *   <strong>Autovacuum Etkinli\u011fi:<\/strong> Ne s\u0131kl\u0131kla \u00e7al\u0131\u015ft\u0131\u011f\u0131, ne kadar i\u015f yapt\u0131\u011f\u0131.<\/p>\n<h4>\u0130zleme Ara\u00e7lar\u0131<\/h4>\n<p>*   <strong>Yerel Ara\u00e7lar:<\/strong><br \/>\n    *   <code>pg_stat_activity<\/code>: Aktif sorgular\u0131 ve ba\u011flant\u0131lar\u0131 g\u00f6rmek i\u00e7in.<br \/>\n    *   <code>pg_stat_statements<\/code>: Yava\u015f sorgular\u0131 ve en \u00e7ok kaynak t\u00fcketen sorgular\u0131 bulmak i\u00e7in (PostgreSQL uzant\u0131s\u0131d\u0131r, etkinle\u015ftirilmesi gerekir).<br \/>\n    *   <code>top<\/code>, <code>htop<\/code>, <code>iotop<\/code>, <code>netdata<\/code>: Sistem kaynaklar\u0131n\u0131 izlemek i\u00e7in.<br \/>\n*   <strong>Harici Ara\u00e7lar:<\/strong><br \/>\n    *   <strong>Prometheus &#038; Grafana:<\/strong> A\u00e7\u0131k kaynakl\u0131, g\u00fc\u00e7l\u00fc bir metrik toplama ve g\u00f6rselle\u015ftirme y\u0131\u011f\u0131n\u0131. <code>node_exporter<\/code> (sistem metrikleri) ve <code>postgres_exporter<\/code> (PostgreSQL metrikleri) ile kullan\u0131labilir.<br \/>\n    *   <strong>Datadog, New Relic, AppDynamics:<\/strong> Ticari APM (Uygulama Performans Y\u00f6netimi) ve altyap\u0131 izleme \u00e7\u00f6z\u00fcmleri.<br \/>\n    *   <strong>PMM (Percona Monitoring and Management):<\/strong> PostgreSQL i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f a\u00e7\u0131k kaynakl\u0131 bir izleme \u00e7\u00f6z\u00fcm\u00fc.<\/p>\n<h4>D\u00fczenli Bak\u0131m<\/h4>\n<p>*   <strong><code>VACUUM ANALYZE<\/code>:<\/strong> <code>autovacuum<\/code> genellikle yeterli olsa da, baz\u0131 durumlarda manuel olarak <code>VACUUM ANALYZE<\/code> \u00e7al\u0131\u015ft\u0131rmak faydal\u0131 olabilir, \u00f6zellikle b\u00fcy\u00fck veri y\u00fcklemelerinden veya silme i\u015flemlerinden sonra.<br \/>\n*   <strong>\u0130ndeks Yeniden Olu\u015fturma:<\/strong> Nadiren de olsa, a\u015f\u0131r\u0131 g\u00fcncellemelerden sonra indeksler \u015fi\u015febilir ve yeniden olu\u015fturulmalar\u0131 (<code>REINDEX<\/code>) gerekebilir. Ancak bu genellikle <code>VACUUM FULL<\/code> kadar s\u0131k yap\u0131lmaz.<br \/>\n*   <strong>OS ve PostgreSQL G\u00fcncellemeleri:<\/strong> \u0130\u015fletim sistemini ve PostgreSQL yaz\u0131l\u0131m\u0131n\u0131 g\u00fcvenlik yamalar\u0131 ve performans iyile\u015ftirmeleri i\u00e7in d\u00fczenli olarak g\u00fcncelleyin.<br \/>\n*   <strong>Yedekleme ve Kurtarma Testleri:<\/strong> Yedekleme stratejinizin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in yedekleri d\u00fczenli olarak test edin. Bir felaket durumunda veritaban\u0131n\u0131 ba\u015far\u0131yla geri y\u00fckleyebildi\u011finizden emin olun.<\/p>\n<h3>\u0130leri D\u00fczey Konular (K\u0131sa Bak\u0131\u015f)<\/h3>\n<p>Bu makale ayr\u0131lm\u0131\u015f bir sunucu kurulumuna odaklan\u0131rken, uygulaman\u0131z daha da b\u00fcy\u00fcd\u00fc\u011f\u00fcnde kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 ileri d\u00fczey konulara k\u0131saca de\u011finmek faydal\u0131 olacakt\u0131r:<\/p>\n<p>*   <strong>Replikasyon (Replication):<\/strong> Okuma yo\u011funluklu uygulamalar i\u00e7in, birincil (primary) veritaban\u0131ndan okuma replikalar\u0131 (standby servers) olu\u015fturarak okuma y\u00fck\u00fcn\u00fc da\u011f\u0131tabilirsiniz. Streaming replication, y\u00fcksek kullan\u0131labilirlik (High Availability) ve felaket kurtarma (Disaster Recovery) i\u00e7in de temel olu\u015fturur.<br \/>\n*   <strong>Y\u00fck Dengeleme (Load Balancing):<\/strong> Birden fazla okuma replikas\u0131 kullan\u0131l\u0131yorsa, gelen okuma sorgular\u0131n\u0131 bu replikalar aras\u0131nda da\u011f\u0131tmak i\u00e7in bir y\u00fck dengeleyici (\u00f6rn. HAProxy) kullan\u0131labilir.<br \/>\n*   <strong>Sharding:<\/strong> Veritaban\u0131n\u0131z\u0131n boyutu tek bir sunucunun kapasitesini a\u015ft\u0131\u011f\u0131nda, verileri farkl\u0131 sunuculara b\u00f6lmek (sharding) gerekebilir. Bu, \u00e7ok karma\u015f\u0131k bir \u00e7\u00f6z\u00fcmd\u00fcr ve genellikle son \u00e7are olarak d\u00fc\u015f\u00fcn\u00fcl\u00fcr.<br \/>\n*   <strong>Bulut Tabanl\u0131 Y\u00f6netilen Veritaban\u0131 Hizmetleri:<\/strong> AWS RDS for PostgreSQL, Azure Database for PostgreSQL, Google Cloud SQL gibi hizmetler, veritaban\u0131 y\u00f6netiminin bir\u00e7ok operasyonel y\u00fck\u00fcn\u00fc (yedekleme, patching, replikasyon) \u00fczerinizden alarak \u00f6l\u00e7eklendirme ve y\u00fcksek kullan\u0131labilirlik sa\u011flar. B\u00fcy\u00fck \u00f6l\u00e7ekli ve h\u0131zl\u0131 b\u00fcy\u00fcyen uygulamalar i\u00e7in m\u00fckemmel bir alternatiftirler.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Ruby on Rails uygulaman\u0131z\u0131 \u00f6l\u00e7eklendirmenin kritik ad\u0131mlar\u0131ndan biri, PostgreSQL veritaban\u0131n\u0131z\u0131 ayr\u0131lm\u0131\u015f bir sunucuya ta\u015f\u0131makt\u0131r. Bu makalede ele ald\u0131\u011f\u0131m\u0131z gibi, do\u011fru planlama, kurulum, optimizasyon ve s\u00fcrekli izleme ile uygulaman\u0131z\u0131n performans\u0131n\u0131 ve kararl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz. Kaynak izolasyonu, geli\u015ftirilmi\u015f performans, ba\u011f\u0131ms\u0131z \u00f6l\u00e7eklenebilirlik ve art\u0131r\u0131lm\u0131\u015f g\u00fcvenlik gibi avantajlar, bu ge\u00e7i\u015fin getirdi\u011fi operasyonel karma\u015f\u0131kl\u0131\u011fa de\u011fer.<\/p>\n<p>Unutmay\u0131n ki veritaban\u0131 optimizasyonu ve y\u00f6netimi s\u00fcrekli bir s\u00fcre\u00e7tir. Uygulaman\u0131z\u0131n evrimiyle birlikte veritaban\u0131 ihtiya\u00e7lar\u0131 da de\u011fi\u015fecektir. D\u00fczenli izleme, performans analizleri ve gerekti\u011finde yap\u0131land\u0131rma ayarlar\u0131nda ince ayarlar yapmak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 g\u00f6stermesini sa\u011flayacakt\u0131r. Bu sa\u011flam temeli att\u0131ktan sonra, gelecekteki b\u00fcy\u00fcme ve daha ileri d\u00fczey \u00f6l\u00e7eklendirme stratejileri i\u00e7in haz\u0131r olacaks\u0131n\u0131z.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)\nRuby on Rails uygulamalar\u0131, geli\u015ftirme kol","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":[644],"tags":[],"class_list":{"0":"post-32024","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-postgresql","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>Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) - 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\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)\" \/>\n<meta property=\"og:description\" content=\"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) Ruby on Rails uygulamalar\u0131, geli\u015ftirme kol\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T18:41:09+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)\",\"datePublished\":\"2025-10-16T18:41:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\"},\"wordCount\":3339,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\",\"name\":\"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-16T18:41:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)\"}]},{\"@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":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) - 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\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/","og_locale":"tr_TR","og_type":"article","og_title":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)","og_description":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) Ruby on Rails uygulamalar\u0131, geli\u015ftirme kol","og_url":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-16T18:41:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)","datePublished":"2025-10-16T18:41:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/"},"wordCount":3339,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PostgreSQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/","url":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/","name":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-16T18:41:09+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamalarini-olceklendirme-ayrilmis-bir-postgresql-sunucusu-kurulumu-bolum-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby on Rails Uygulamalar\u0131n\u0131 \u00d6l\u00e7eklendirme: Ayr\u0131lm\u0131\u015f Bir PostgreSQL Sunucusu Kurulumu (B\u00f6l\u00fcm 3)"}]},{"@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\/32024","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=32024"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32024\/revisions"}],"predecessor-version":[{"id":32025,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32024\/revisions\/32025"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}