{"id":32040,"date":"2025-10-17T01:41:01","date_gmt":"2025-10-16T22:41:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32040"},"modified":"2025-10-17T01:41:01","modified_gmt":"2025-10-16T22:41:01","slug":"capistrano-ile-otomatik-dagitimlar-baslangic-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/","title":{"rendered":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin en kritik ve \u00e7o\u011fu zaman en stresli a\u015famalar\u0131ndan biri, geli\u015ftirilen kodu canl\u0131 sunuculara da\u011f\u0131tmakt\u0131r. Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, insan hatas\u0131na a\u00e7\u0131k olmas\u0131n\u0131n yan\u0131 s\u0131ra, zaman al\u0131c\u0131 ve tekrarlay\u0131c\u0131 g\u00f6revler i\u00e7erir. Bu durum, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar veya s\u0131k g\u00fcncellemeler gerektiren projeler i\u00e7in ciddi sorunlara yol a\u00e7abilir. \u0130\u015fte tam bu noktada, otomatik da\u011f\u0131t\u0131m ara\u00e7lar\u0131 devreye girerek bu s\u00fcreci kolayla\u015ft\u0131r\u0131r, h\u0131zland\u0131r\u0131r ve hatalar\u0131 minimize eder. Capistrano, bu alanda \u00f6ne \u00e7\u0131kan g\u00fc\u00e7l\u00fc ve esnek bir otomasyon arac\u0131d\u0131r.<\/p>\n<p>Bu makalede, Capistrano&#8217;nun ne oldu\u011funu, neden kullanman\u0131z gerekti\u011fini, kurulumunu, temel yap\u0131land\u0131rmas\u0131n\u0131 ve ilk da\u011f\u0131t\u0131m\u0131n\u0131z\u0131 nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi ad\u0131m ad\u0131m ele alaca\u011f\u0131z. Amac\u0131m\u0131z, Capistrano&#8217;yu kullanarak da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirme yolculu\u011funuza sa\u011flam bir ba\u015flang\u0131\u00e7 yapman\u0131z\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>Capistrano Nedir ve Neden Kullanmal\u0131s\u0131n\u0131z?<\/h3>\n<p>Capistrano, Ruby tabanl\u0131, SSH \u00fczerinden uzak sunuculara kod da\u011f\u0131t\u0131m\u0131 ve komut \u00e7al\u0131\u015ft\u0131rma i\u00e7in tasarlanm\u0131\u015f a\u00e7\u0131k kaynakl\u0131 bir otomasyon arac\u0131d\u0131r. Ba\u015flang\u0131\u00e7ta Ruby on Rails uygulamalar\u0131 i\u00e7in geli\u015ftirilmi\u015f olsa da, esnek yap\u0131s\u0131 sayesinde PHP, Node.js, Python gibi farkl\u0131 teknolojilerle yaz\u0131lm\u0131\u015f uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131nda da kullan\u0131labilir.<\/p>\n<h4>Capistrano&#8217;nun Temel \u00d6zellikleri ve Avantajlar\u0131:<\/h4>\n<p>*   <strong>Tekrarlanabilirlik ve Tutarl\u0131l\u0131k:<\/strong> Capistrano, da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 kod olarak tan\u0131mlaman\u0131z\u0131 sa\u011flar. Bu sayede her da\u011f\u0131t\u0131m, ayn\u0131 ad\u0131mlar\u0131 tutarl\u0131 bir \u015fekilde takip eder ve manuel hatalar\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>H\u0131z ve Verimlilik:<\/strong> Otomatikle\u015ftirilmi\u015f da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, manuel i\u015flemlere g\u00f6re \u00e7ok daha h\u0131zl\u0131d\u0131r. Bu, geli\u015ftiricilerin daha s\u0131k ve g\u00fcvenli bir \u015fekilde da\u011f\u0131t\u0131m yapmas\u0131na olanak tan\u0131r.<br \/>\n*   <strong>Geri Alma (Rollback) Yetene\u011fi:<\/strong> Bir da\u011f\u0131t\u0131m s\u0131ras\u0131nda veya sonras\u0131nda bir sorunla kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda, Capistrano tek bir komutla uygulaman\u0131z\u0131 \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme geri d\u00f6nd\u00fcrme yetene\u011fi sunar. Bu, olas\u0131 kesintileri en aza indirir.<br \/>\n*   <strong>\u00c7oklu Sunucu Deste\u011fi:<\/strong> Capistrano, ayn\u0131 anda birden fazla sunucuya (\u00f6rne\u011fin, birden fazla web sunucusu, veritaban\u0131 sunucusu) da\u011f\u0131t\u0131m yapabilir ve her sunucuda belirli rollere (app, web, db) g\u00f6re farkl\u0131 g\u00f6revler \u00e7al\u0131\u015ft\u0131rabilir.<br \/>\n*   <strong>Esneklik ve Geni\u015fletilebilirlik:<\/strong> Capistrano, \u00f6zel g\u00f6revler (tasks) tan\u0131mlaman\u0131za ve mevcut g\u00f6revleri geni\u015fletmenize olanak tan\u0131r. Bu sayede projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re da\u011f\u0131t\u0131m s\u00fcrecini tamamen \u00f6zelle\u015ftirebilirsiniz.<br \/>\n*   <strong>Zero-Downtime Da\u011f\u0131t\u0131mlar:<\/strong> Do\u011fru yap\u0131land\u0131rma ile Capistrano, uygulaman\u0131z\u0131n kesintiye u\u011framadan yeni s\u00fcr\u00fcme ge\u00e7i\u015f yapmas\u0131n\u0131 sa\u011flayabilir. Bu, kullan\u0131c\u0131 deneyimini olumsuz etkilemez.<br \/>\n*   <strong>Git Entegrasyonu:<\/strong> Kaynak kodu y\u00f6netimi i\u00e7in Git ile derinlemesine entegrasyon sa\u011flar, bu da belirli bir branch&#8217;ten veya commit&#8217;ten da\u011f\u0131t\u0131m yapmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>K\u0131sacas\u0131, Capistrano, da\u011f\u0131t\u0131m s\u00fcrecini bir angarya olmaktan \u00e7\u0131kar\u0131p, g\u00fcvenilir, h\u0131zl\u0131 ve y\u00f6netilebilir bir par\u00e7as\u0131 haline getirir.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Kurulum<\/h3>\n<p>Capistrano&#8217;yu kullanmaya ba\u015flamadan \u00f6nce geli\u015ftirme ortam\u0131n\u0131zda ve hedef sunucular\u0131n\u0131zda baz\u0131 temel gereksinimlerin kar\u015f\u0131lanmas\u0131 gerekmektedir.<\/p>\n<h4>Geli\u015ftirme Ortam\u0131 \u0130\u00e7in \u00d6n Ko\u015fullar:<\/h4>\n<p>1.  <strong>Ruby:<\/strong> Capistrano, Ruby ile yaz\u0131lm\u0131\u015ft\u0131r, bu nedenle yerel makinenizde Ruby&#8217;nin kurulu olmas\u0131 gerekir. Ruby versiyon y\u00f6neticileri (RVM veya rbenv) kullanman\u0131z \u015fiddetle tavsiye edilir.<br \/>\n2.  <strong>Bundler:<\/strong> Ruby projeleri i\u00e7in ba\u011f\u0131ml\u0131l\u0131k y\u00f6neticisidir. <code>gem install bundler<\/code> komutu ile kurabilirsiniz.<br \/>\n3.  <strong>Git:<\/strong> Uygulaman\u0131z\u0131n kaynak kodunu y\u00f6netece\u011finiz Git&#8217;in kurulu olmas\u0131 gerekir.<br \/>\n4.  <strong>SSH Anahtarlar\u0131:<\/strong> Uzak sunuculara \u015fifresiz ve g\u00fcvenli bir \u015fekilde ba\u011flanabilmek i\u00e7in SSH anahtar \u00e7ifti (public\/private key pair) olu\u015fturmu\u015f olman\u0131z ve public anahtar\u0131n\u0131z\u0131n hedef sunuculardaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na eklenmi\u015f olmas\u0131 gerekir. SSH agent forwarding kullanmak, da\u011f\u0131t\u0131m s\u0131ras\u0131nda Git depolar\u0131na eri\u015fim i\u00e7in de faydal\u0131d\u0131r.<\/p>\n<h4>Uzak Sunucular \u0130\u00e7in \u00d6n Ko\u015fullar:<\/h4>\n<p>1.  <strong>SSH Eri\u015fimi:<\/strong> Da\u011f\u0131t\u0131m yapaca\u011f\u0131n\u0131z sunucuya SSH \u00fczerinden eri\u015fiminizin olmas\u0131 gerekir.<br \/>\n2.  <strong>Git:<\/strong> Sunucuda Git kurulu olmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc Capistrano kodu Git deposundan \u00e7ekecektir.<br \/>\n3.  <strong>Uygulama \u00c7al\u0131\u015fma Ortam\u0131:<\/strong> Uygulaman\u0131z\u0131n gerektirdi\u011fi \u00e7al\u0131\u015fma zaman\u0131 (\u00f6rne\u011fin, Ruby, Node.js, Python, PHP), veritaban\u0131 sunucusu (PostgreSQL, MySQL), web sunucusu (Nginx, Apache) ve di\u011fer ba\u011f\u0131ml\u0131l\u0131klar sunucuda kurulu ve yap\u0131land\u0131r\u0131lm\u0131\u015f olmal\u0131d\u0131r.<br \/>\n4.  <strong>Kullan\u0131c\u0131 \u0130zinleri:<\/strong> Da\u011f\u0131t\u0131m yapacak SSH kullan\u0131c\u0131s\u0131n\u0131n, <code>deploy_to<\/code> dizinine yazma ve uygulama dosyalar\u0131n\u0131 y\u00f6netme izinlerine sahip olmas\u0131 gerekir.<\/p>\n<h4>Capistrano Kurulumu:<\/h4>\n<p>Capistrano&#8217;yu projenize dahil etmek i\u00e7in genellikle Bundler kullan\u0131l\u0131r.<\/p>\n<p>1.  <strong>Gemfile&#8217;a Ekleme:<\/strong> Projenizin <code>Gemfile<\/code> dosyas\u0131na Capistrano gem&#8217;lerini ekleyin. E\u011fer bir Rails uygulamas\u0131 da\u011f\u0131t\u0131yorsan\u0131z, <code>capistrano-rails<\/code> gem&#8217;ini de eklemeniz \u00f6nerilir. Bu gem, Rails&#8217;e \u00f6zg\u00fc g\u00f6revleri (\u00f6rne\u011fin, <code>assets:precompile<\/code>, <code>db:migrate<\/code>) otomatik olarak sa\u011flar.<\/p>\n<pre><code class=\"language-ruby\"># Gemfile\n    group :development do\n      gem 'capistrano', '~> 3.17'\n      gem 'capistrano-rvm', '~> 0.1.0' # E\u011fer RVM kullan\u0131yorsan\u0131z\n      gem 'capistrano-rails', '~> 1.7' # E\u011fer Rails uygulamas\u0131 ise\n      gem 'capistrano-passenger', '~> 0.2.0' # E\u011fer Passenger kullan\u0131yorsan\u0131z\n      # Di\u011fer capistrano eklentileri...\n    end<\/code><\/pre>\n<p>2.  <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme:<\/strong> Terminalde projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak gem&#8217;leri y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">bundle install<\/code><\/pre>\n<p>3.  <strong>Capistrano Projesini Ba\u015flatma:<\/strong> Capistrano&#8217;nun temel yap\u0131land\u0131rma dosyalar\u0131n\u0131 olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap install<\/code><\/pre>\n<p>    Bu komut, projenizin k\u00f6k dizininde <code>Capfile<\/code> ve <code>config\/deploy.rb<\/code>, <code>config\/deploy\/staging.rb<\/code>, <code>config\/deploy\/production.rb<\/code> gibi dosyalar\u0131 olu\u015fturacakt\u0131r.<\/p>\n<h3>Capistrano Proje Yap\u0131s\u0131<\/h3>\n<p><code>bundle exec cap install<\/code> komutu, Capistrano&#8217;nun \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli temel dizin ve dosya yap\u0131s\u0131n\u0131 olu\u015fturur:<\/p>\n<p>*   <strong><code>Capfile<\/code>:<\/strong> Bu dosya, Capistrano&#8217;nun ana yap\u0131land\u0131rma dosyas\u0131d\u0131r. Capistrano&#8217;nun \u00e7ekirdek \u00f6zelliklerini, kullan\u0131lan eklentileri (\u00f6rne\u011fin, <code>capistrano-rails<\/code>, <code>capistrano-rvm<\/code>) ve \u00f6zel g\u00f6revleri y\u00fckler. Genellikle bu dosyada \u00e7ok fazla de\u011fi\u015fiklik yapman\u0131z gerekmez, ancak hangi eklentilerin y\u00fcklendi\u011fini kontrol etmek i\u00e7in \u00f6nemlidir.<\/p>\n<pre><code class=\"language-ruby\"># Capfile\n    # Load DSL and set up stages\n    require \"capistrano\/setup\"\n\n    # Include default deployment tasks\n    require \"capistrano\/deploy\"\n\n    # Load the Rails integration\n    require \"capistrano\/rails\"\n    require \"capistrano\/passenger\" # E\u011fer eklediyseniz\n    require \"capistrano\/rvm\"       # E\u011fer eklediyseniz\n\n    # Load custom tasks from <code>lib\/capistrano\/tasks<\/code>\n    Dir.glob(\"lib\/capistrano\/tasks\/*.rake\").each { |r| import r }<\/code><\/pre>\n<p>*   <strong><code>config\/deploy.rb<\/code>:<\/strong> Bu dosya, t\u00fcm da\u011f\u0131t\u0131m ortamlar\u0131 (staging, production vb.) i\u00e7in ge\u00e7erli olan genel Capistrano ayarlar\u0131n\u0131 i\u00e7erir. Uygulama ad\u0131, Git deposu URL&#8217;si, da\u011f\u0131t\u0131m yolu, payla\u015f\u0131lan dosyalar\/dizinler gibi temel yap\u0131land\u0131rmalar burada tan\u0131mlan\u0131r.<\/p>\n<p>*   <strong><code>config\/deploy\/<environment>.rb<\/code>:<\/strong> Bu dizin alt\u0131nda, her bir da\u011f\u0131t\u0131m ortam\u0131 i\u00e7in ayr\u0131 yap\u0131land\u0131rma dosyalar\u0131 bulunur (\u00f6rne\u011fin, <code>config\/deploy\/production.rb<\/code>, <code>config\/deploy\/staging.rb<\/code>). Bu dosyalar, ortam \u00f6zelinde sunucu tan\u0131mlamalar\u0131n\u0131, branch adlar\u0131n\u0131 veya di\u011fer de\u011fi\u015fkenleri i\u00e7erir.<\/p>\n<p>*   <strong><code>lib\/capistrano\/tasks\/<\/code>:<\/strong> Bu dizin, projenize \u00f6zel Capistrano g\u00f6revlerini (custom tasks) tan\u0131mlayabilece\u011finiz yerdir. \u00d6rne\u011fin, da\u011f\u0131t\u0131m sonras\u0131 bir \u00f6nbelle\u011fi temizleme veya bir arka plan i\u015f\u00e7isini yeniden ba\u015flatma gibi \u00f6zel ad\u0131mlar i\u00e7in burada <code>.rake<\/code> uzant\u0131l\u0131 dosyalar olu\u015fturabilirsiniz.<\/p>\n<h3>Temel Da\u011f\u0131t\u0131m Ayarlar\u0131 (<code>config\/deploy.rb<\/code>)<\/h3>\n<p><code>config\/deploy.rb<\/code> dosyas\u0131, Capistrano da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n kalbidir. Burada uygulaman\u0131z\u0131n temel davran\u0131\u015flar\u0131n\u0131 ve da\u011f\u0131t\u0131m s\u00fcrecinin nas\u0131l i\u015fleyece\u011fini belirlersiniz.<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy.rb\n\n<h2>Uygulaman\u0131z\u0131n ad\u0131 (genellikle proje klas\u00f6r ad\u0131)<\/h2>\nset :application, \"my_awesome_app\"\n\n<h2>Git deponuzun URL'si<\/h2>\nset :repo_url, \"git@github.com:kullanici_adi\/my_awesome_app.git\" # veya https:\/\/...\n\n<h2>Uygulaman\u0131z\u0131n uzak sunucuda da\u011f\u0131t\u0131laca\u011f\u0131 yol<\/h2>\n<h2>Bu yol alt\u0131nda releases, current, shared dizinleri olu\u015fur.<\/h2>\nset :deploy_to, \"\/var\/www\/my_awesome_app\"\n\n<h2>Git'ten \u00e7ekilecek varsay\u0131lan branch (ortama \u00f6zel dosyalarda override edilebilir)<\/h2>\nset :branch, \"main\"\n\n<h2>Capistrano'nun log seviyesi (\u00f6rne\u011fin, :debug, :info, :warn, :error)<\/h2>\nset :log_level, :info\n\n<h2>SSH agent forwarding'i etkinle\u015ftir. Bu, da\u011f\u0131t\u0131m yapan makinedeki SSH anahtarlar\u0131n\u0131n<\/h2>\n<h2>uzak sunucuya iletilmesini sa\u011flar, b\u00f6ylece uzak sunucu Git deposuna eri\u015febilir.<\/h2>\nset :ssh_options, { forward_agent: true, auth_methods: %w(publickey) }\n\n<h2>Da\u011f\u0131t\u0131m s\u0131ras\u0131nda sembolik olarak ba\u011flanacak dosyalar.<\/h2>\n<h2>Bu dosyalar shared\/config\/ dizininde bulunur ve her release'e ba\u011flan\u0131r.<\/h2>\n<h2>Hassas bilgileri (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) buraya koyun.<\/h2>\nset :linked_files, %w{config\/database.yml config\/secrets.yml config\/master.key}\n\n<h2>Da\u011f\u0131t\u0131m s\u0131ras\u0131nda sembolik olarak ba\u011flanacak dizinler.<\/h2>\n<h2>Bu dizinler shared\/ dizininde bulunur ve her release'e ba\u011flan\u0131r.<\/h2>\n<h2>Loglar, y\u00fcklenen dosyalar, gem'ler gibi de\u011fi\u015fen verileri buraya koyun.<\/h2>\nset :linked_dirs, %w{log tmp\/pids tmp\/cache tmp\/sockets vendor\/bundle public\/system public\/uploads}\n\n<h2>Ka\u00e7 adet eski release'in tutulaca\u011f\u0131n\u0131 belirler.<\/h2>\n<h2>Eski s\u00fcr\u00fcmler, geri alma (rollback) i\u00e7in saklan\u0131r.<\/h2>\nset :keep_releases, 5\n\n<h2>E\u011fer RVM kullan\u0131yorsan\u0131z:<\/h2>\n<h2>set :rvm_type, :user # veya :system<\/h2>\n<h2>set :rvm_ruby_version, '3.1.2' # Uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 Ruby versiyonu<\/h2>\n\n<h2>E\u011fer rbenv kullan\u0131yorsan\u0131z:<\/h2>\n<h2>set :rbenv_type, :user # veya :system<\/h2>\n<h2>set :rbenv_ruby, '3.1.2'<\/h2>\n\n<h2>Varsay\u0131lan olarak Capistrano, <code>bundle install<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/h2>\n<h2>E\u011fer farkl\u0131 bir bundler yolu veya versiyonu kullan\u0131yorsan\u0131z:<\/h2>\n<h2>set :bundle_path, nil<\/h2>\n<h2>set :bundle_flags, '--deployment --quiet'<\/code><\/pre>\n<\/h2>\n<p><strong>\u00d6nemli Ayarlar\u0131n A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <strong><code>set :application, \"...\"<\/code><\/strong>: Uygulaman\u0131z\u0131n ad\u0131n\u0131 tan\u0131mlar. Bu isim, sunucudaki dizin yap\u0131s\u0131nda ve Capistrano g\u00f6revlerinde kullan\u0131l\u0131r.<br \/>\n*   <strong><code>set :repo_url, \"...\"<\/code><\/strong>: Uygulaman\u0131z\u0131n Git deposunun URL&#8217;si. SSH format\u0131n\u0131 (\u00f6rn. <code>git@github.com:user\/repo.git<\/code>) kullanman\u0131z, SSH agent forwarding ile daha g\u00fcvenli ve pratik olacakt\u0131r.<br \/>\n*   <strong><code>set :deploy_to, \"...\"<\/code><\/strong>: Uygulaman\u0131z\u0131n uzak sunucuda da\u011f\u0131t\u0131laca\u011f\u0131 ana dizin. Capistrano bu dizin alt\u0131nda <code>releases<\/code>, <code>current<\/code>, <code>shared<\/code> gibi alt dizinler olu\u015fturur.<br \/>\n    *   <code>releases\/<\/code>: Her ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131m, buraya yeni bir zaman damgal\u0131 dizin olarak kaydedilir.<br \/>\n    *   <code>current\/<\/code>: Her zaman en son ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131m\u0131n <code>releases<\/code> i\u00e7indeki dizinine i\u015faret eden sembolik bir linktir. Web sunucunuz bu dizini i\u015faret etmelidir.<br \/>\n    *   <code>shared\/<\/code>: Da\u011f\u0131t\u0131mlar aras\u0131nda kal\u0131c\u0131 olmas\u0131 gereken dosyalar ve dizinler (\u00f6rne\u011fin, <code>database.yml<\/code>, log dosyalar\u0131, y\u00fcklenen resimler) burada tutulur.<br \/>\n*   <strong><code>set :linked_files, %w{...}<\/code><\/strong>: Da\u011f\u0131t\u0131mlar aras\u0131nda de\u011fi\u015fmeyen ancak her release&#8217;in eri\u015fmesi gereken hassas veya ortama \u00f6zel dosyalar\u0131 belirtir. Bu dosyalar <code>shared\/config\/<\/code> alt\u0131nda saklan\u0131r ve her yeni release&#8217;e sembolik olarak ba\u011flan\u0131r. <strong>Bu dosyalar\u0131 Git deposuna eklemeyin!<\/strong><br \/>\n*   <strong><code>set :linked_dirs, %w{...}<\/code><\/strong>: <code>linked_files<\/code>&#8216;a benzer \u015fekilde, da\u011f\u0131t\u0131mlar aras\u0131nda kal\u0131c\u0131 olmas\u0131 gereken dizinleri belirtir. \u00d6rne\u011fin, <code>log<\/code> dizini, <code>tmp<\/code> dizini veya kullan\u0131c\u0131lar\u0131n y\u00fckledi\u011fi dosyalar\u0131n bulundu\u011fu <code>public\/uploads<\/code> gibi dizinler <code>shared\/<\/code> alt\u0131nda saklan\u0131r ve her yeni release&#8217;e ba\u011flan\u0131r.<br \/>\n*   <strong><code>set :keep_releases, 5<\/code><\/strong>: Sunucuda ka\u00e7 adet eski ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131m\u0131n tutulaca\u011f\u0131n\u0131 belirler. Bu sayede, sorun ya\u015fand\u0131\u011f\u0131nda kolayca geri alma (rollback) yapabilirsiniz.<\/p>\n<h3>Ortama \u00d6zel Ayarlar (<code>config\/deploy\/production.rb<\/code> ve <code>config\/deploy\/staging.rb<\/code>)<\/h3>\n<p>Farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131 (\u00f6rne\u011fin, test i\u00e7in <code>staging<\/code>, canl\u0131 sistem i\u00e7in <code>production<\/code>) i\u00e7in farkl\u0131 sunuculara, Git branch&#8217;lerine veya di\u011fer ayarlara sahip olabilirsiniz. Bu ayarlar\u0131 <code>config\/deploy<\/code> dizini alt\u0131ndaki ortama \u00f6zel dosyalarda tan\u0131mlars\u0131n\u0131z.<\/p>\n<p>#### <code>config\/deploy\/staging.rb<\/code> \u00d6rne\u011fi:<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy\/staging.rb\n\n<h2>Staging ortam\u0131 i\u00e7in kullan\u0131lacak Git branch'i<\/h2>\nset :branch, \"develop\"\n\n<h2>Da\u011f\u0131t\u0131m yap\u0131lacak sunucu(lar)<\/h2>\n<h2>server 'IP_ADRESI_VEYA_HOST_ADI', user: 'SSH_KULLANICI_ADI', roles: %w{web app db}, ssh_options: { port: 22 }<\/h2>\nserver 'staging.example.com', user: 'deploy', roles: %w{app web db}, primary: true\n<h2>Birden fazla sunucu varsa:<\/h2>\n<h2>server 'staging-db.example.com', user: 'deploy', roles: %w{db}<\/code><\/pre>\n<\/h2>\n<p>#### <code>config\/deploy\/production.rb<\/code> \u00d6rne\u011fi:<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy\/production.rb\n\n<h2>Production ortam\u0131 i\u00e7in kullan\u0131lacak Git branch'i<\/h2>\nset :branch, \"main\"\n\n<h2>Da\u011f\u0131t\u0131m yap\u0131lacak sunucu(lar)<\/h2>\nserver 'production.example.com', user: 'deploy', roles: %w{app web db}, primary: true\n<h2>server 'production-worker.example.com', user: 'deploy', roles: %w{app worker}<\/code><\/pre>\n<\/h2>\n<p><strong>Sunucu Tan\u0131mlamalar\u0131:<\/strong><\/p>\n<p>*   <code>server 'host_ad\u0131', user: 'kullan\u0131c\u0131_ad\u0131', roles: %w{role1 role2}, primary: true<\/code>:<br \/>\n    *   <code>host_ad\u0131<\/code>: Sunucunun IP adresi veya alan ad\u0131.<br \/>\n    *   <code>user<\/code>: SSH ile ba\u011flan\u0131lacak kullan\u0131c\u0131 ad\u0131. Bu kullan\u0131c\u0131n\u0131n <code>deploy_to<\/code> dizinine yazma izni olmal\u0131d\u0131r.<br \/>\n    *   <code>roles<\/code>: Sunucuya atanan roller. Capistrano, belirli rollere sahip sunucularda belirli g\u00f6revleri \u00e7al\u0131\u015ft\u0131rabilir (\u00f6rne\u011fin, <code>db<\/code> rol\u00fcne sahip sunucuda <code>db:migrate<\/code> \u00e7al\u0131\u015ft\u0131rmak). Ortak roller <code>web<\/code>, <code>app<\/code>, <code>db<\/code>, <code>worker<\/code>&#8216;d\u0131r.<br \/>\n    *   <code>primary: true<\/code>: Bu rol i\u00e7in birincil sunucuyu belirtir. \u00d6rne\u011fin, <code>db<\/code> rol\u00fc i\u00e7in yaln\u0131zca birincil sunucuda <code>db:migrate<\/code> \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/p>\n<h3>\u0130lk Da\u011f\u0131t\u0131m\u0131 Ger\u00e7ekle\u015ftirme<\/h3>\n<p>T\u00fcm yap\u0131land\u0131rmalar\u0131 yapt\u0131ktan sonra, ilk da\u011f\u0131t\u0131m\u0131n\u0131z\u0131 ger\u00e7ekle\u015ftirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h4>Da\u011f\u0131t\u0131m \u00d6ncesi Haz\u0131rl\u0131klar:<\/h4>\n<p>1.  <strong>SSH Anahtarlar\u0131n\u0131 Ayarlama:<\/strong> Geli\u015ftirme makinenizdeki SSH public anahtar\u0131n\u0131z\u0131n (<code>~\/.ssh\/id_rsa.pub<\/code>), uzak sunucudaki da\u011f\u0131t\u0131m kullan\u0131c\u0131s\u0131n\u0131n <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na eklendi\u011finden emin olun.<br \/>\n2.  <strong><code>linked_files<\/code> \u0130\u00e7in Dosyalar\u0131 Olu\u015fturma:<\/strong> <code>config\/deploy.rb<\/code> i\u00e7inde <code>linked_files<\/code> olarak belirtti\u011finiz dosyalar\u0131n (\u00f6rne\u011fin, <code>config\/database.yml<\/code>, <code>config\/secrets.yml<\/code>) <code>shared\/config\/<\/code> dizininde veya ilk da\u011f\u0131t\u0131mdan \u00f6nce manuel olarak olu\u015fturulmas\u0131 gerekir. Capistrano, bu dosyalar\u0131n varl\u0131\u011f\u0131n\u0131 kontrol eder ve eksikse hata verir.<br \/>\n    *   Uzak sunucuda <code>deploy_to<\/code> dizinine gidin.<br \/>\n    *   <code>mkdir -p shared\/config<\/code><br \/>\n    *   <code>touch shared\/config\/database.yml<\/code><br \/>\n    *   <code>touch shared\/config\/secrets.yml<\/code><br \/>\n    *   Bu dosyalara do\u011fru i\u00e7eri\u011fi ekleyin. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-yaml\"># \/var\/www\/my_awesome_app\/shared\/config\/database.yml\n        production:\n          adapter: postgresql\n          encoding: unicode\n          database: my_awesome_app_production\n          pool: 5\n          username: deploy\n          password: your_db_password\n          host: localhost<\/code><\/pre>\n<p>3.  <strong>Uzak Sunucuda Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurma:<\/strong> Uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli t\u00fcm yaz\u0131l\u0131mlar\u0131n (\u00f6rne\u011fin, Ruby, Node.js, veritaban\u0131 istemcileri) sunucuda kurulu ve do\u011fru yap\u0131land\u0131r\u0131lm\u0131\u015f oldu\u011fundan emin olun.<\/p>\n<h4>Da\u011f\u0131t\u0131m Komutlar\u0131:<\/h4>\n<p>Terminalde projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak da\u011f\u0131t\u0131m yapabilirsiniz:<\/p>\n<p>1.  <strong>Da\u011f\u0131t\u0131m Kontrol\u00fc:<\/strong> Da\u011f\u0131t\u0131ma ba\u015flamadan \u00f6nce Capistrano&#8217;nun t\u00fcm gereksinimleri (SSH ba\u011flant\u0131s\u0131, Git deposu eri\u015fimi, dizin izinleri vb.) kontrol etmesini sa\u011flay\u0131n.<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy:check<\/code><\/pre>\n<p>    E\u011fer bir sorun varsa, bu komut size yol g\u00f6sterecektir.<\/p>\n<p>2.  <strong>\u0130lk Kurulum (\u0130ste\u011fe Ba\u011fl\u0131):<\/strong> Genellikle <code>deploy<\/code> komutu ilk kurulumu otomatik olarak yapar. Ancak isterseniz dizin yap\u0131s\u0131n\u0131 manuel olarak olu\u015fturmak i\u00e7in <code>deploy:setup<\/code> komutunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy:setup<\/code><\/pre>\n<p>3.  <strong>Da\u011f\u0131t\u0131m\u0131 Ba\u015flatma:<\/strong> As\u0131l da\u011f\u0131t\u0131m komutu budur. Capistrano, <code>deploy.rb<\/code> ve <code>production.rb<\/code> dosyalar\u0131ndaki ayarlara g\u00f6re t\u00fcm ad\u0131mlar\u0131 otomatik olarak ger\u00e7ekle\u015ftirecektir.<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy<\/code><\/pre>\n<p>    Komut \u00e7al\u0131\u015f\u0131rken Capistrano&#8217;nun ad\u0131mlar\u0131n\u0131 terminalde g\u00f6receksiniz: Git deposundan kodu \u00e7ekme, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleme, asset&#8217;leri derleme (Rails i\u00e7in), sembolik linkleri olu\u015fturma, uygulama sunucusunu yeniden ba\u015flatma vb.<\/p>\n<h4>Da\u011f\u0131t\u0131m Ak\u0131\u015f\u0131 (Capistrano&#8217;nun Ad\u0131mlar\u0131):<\/h4>\n<p>Capistrano&#8217;nun <code>deploy<\/code> g\u00f6revi \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, arka planda bir dizi \u00f6nceden tan\u0131mlanm\u0131\u015f alt g\u00f6revi belirli bir s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131r:<\/p>\n<p>1.  <strong><code>deploy:starting<\/code><\/strong>: Da\u011f\u0131t\u0131m ba\u015flamadan \u00f6nce \u00e7al\u0131\u015f\u0131r.<br \/>\n2.  <strong><code>deploy:check<\/code><\/strong>: SSH ba\u011flant\u0131s\u0131n\u0131, Git deposu eri\u015fimini, <code>deploy_to<\/code> dizinini ve <code>linked_files<\/code> varl\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n3.  <strong><code>git:check<\/code><\/strong>: Git deposunun eri\u015filebilirli\u011fini kontrol eder.<br \/>\n4.  <strong><code>deploy:updating<\/code><\/strong>: Git deposundan kodu \u00e7eker ve <code>releases\/<\/code> dizinine yeni bir release olu\u015fturur.<br \/>\n5.  <strong><code>deploy:symlink:release<\/code><\/strong>: Yeni release dizinine sembolik link olu\u015fturur.<br \/>\n6.  <strong><code>deploy:publishing<\/code><\/strong>: <code>linked_files<\/code> ve <code>linked_dirs<\/code>&#8216;\u0131 yeni release&#8217;e ba\u011flar.<br \/>\n7.  <strong><code>deploy:finished<\/code><\/strong>: Da\u011f\u0131t\u0131m tamamland\u0131ktan sonra \u00e7al\u0131\u015f\u0131r, genellikle uygulama sunucusunu yeniden ba\u015flatma gibi ad\u0131mlar\u0131 i\u00e7erir.<br \/>\n8.  <strong><code>deploy:cleanup<\/code><\/strong>: <code>keep_releases<\/code> ayar\u0131na g\u00f6re eski release&#8217;leri temizler.<\/p>\n<p>Bu ad\u0131mlar\u0131n aras\u0131nda, <code>capistrano-rails<\/code> gibi eklentiler kendi \u00f6zel g\u00f6revlerini (\u00f6rne\u011fin, <code>rails:assets:precompile<\/code>, <code>rails:db:migrate<\/code>) uygun yerlere enjekte eder.<\/p>\n<h4>Da\u011f\u0131t\u0131m Sonras\u0131:<\/h4>\n<p>Da\u011f\u0131t\u0131m ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, web taray\u0131c\u0131n\u0131zdan uygulaman\u0131z\u0131n alan ad\u0131n\u0131 ziyaret ederek yeni s\u00fcr\u00fcm\u00fcn do\u011fru \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. Herhangi bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, sunucudaki log dosyalar\u0131n\u0131 (<code>deploy_to\/shared\/log\/production.log<\/code> gibi) kontrol edin.<\/p>\n<h3>Capistrano G\u00f6revleri (Tasks) ve \u00d6zelle\u015ftirme<\/h3>\n<p>Capistrano, uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek i\u00e7in bir dizi yerle\u015fik g\u00f6rev sunar ve ayn\u0131 zamanda kendi \u00f6zel g\u00f6revlerinizi tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h4>Yerle\u015fik G\u00f6revler:<\/h4>\n<p>*   <strong><code>bundle exec cap production deploy:rollback<\/code><\/strong>: Uygulamay\u0131 bir \u00f6nceki ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131ma geri d\u00f6nd\u00fcr\u00fcr. Bu, bir sorun \u00e7\u0131kt\u0131\u011f\u0131nda h\u0131zl\u0131 bir kurtarma mekanizmas\u0131d\u0131r.<br \/>\n*   <strong><code>bundle exec cap production deploy:cleanup<\/code><\/strong>: <code>keep_releases<\/code> ayar\u0131na g\u00f6re eski release&#8217;leri temizler.<br \/>\n*   <strong><code>bundle exec cap production invoke STAGES=production TASK=\"rake db:seed\"<\/code><\/strong>: Uzak sunucuda belirli bir rake g\u00f6revini \u00e7al\u0131\u015ft\u0131r\u0131r. (Rails uygulamalar\u0131 i\u00e7in)<br \/>\n*   <strong><code>bundle exec cap production rails:console<\/code><\/strong>: Uzak sunucuda Rails konsolunu a\u00e7ar. (Rails uygulamalar\u0131 i\u00e7in)<br \/>\n*   <strong><code>bundle exec cap production passenger:restart<\/code><\/strong>: Passenger uygulama sunucusunu yeniden ba\u015flat\u0131r. (Capistrano-Passenger eklentisi ile)<\/p>\n<p>Bu g\u00f6revleri <code>bundle exec cap -T<\/code> komutu ile listeleyebilir ve a\u00e7\u0131klamalar\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<h4>\u00d6zel G\u00f6revler Olu\u015fturma:<\/h4>\n<p>Da\u011f\u0131t\u0131m s\u00fcrecinize \u00f6zel ad\u0131mlar eklemeniz gerekebilir. \u00d6rne\u011fin, bir \u00f6nbelle\u011fi temizlemek, arka plan i\u015f\u00e7ilerini yeniden ba\u015flatmak veya bir bildirim g\u00f6ndermek. Bu t\u00fcr g\u00f6revleri <code>lib\/capistrano\/tasks\/<\/code> dizini alt\u0131nda <code>.rake<\/code> uzant\u0131l\u0131 dosyalar olu\u015fturarak tan\u0131mlayabilirsiniz.<\/p>\n<p><strong>\u00d6rnek: <code>lib\/capistrano\/tasks\/custom.rake<\/code><\/strong><\/p>\n<pre><code class=\"language-ruby\"># lib\/capistrano\/tasks\/custom.rake\n\nnamespace :my_app do\n  desc \"Clears the application cache\"\n  task :clear_cache do\n    on roles(:app) do\n      # Uygulaman\u0131z\u0131n k\u00f6k dizininde (current\/) komutu \u00e7al\u0131\u015ft\u0131r\u0131r\n      within release_path do\n        execute :bundle, :exec, :rails, 'cache:clear' # Rails i\u00e7in \u00f6rnek\n        # veya execute :php, 'artisan cache:clear' # Laravel i\u00e7in \u00f6rnek\n      end\n    end\n  end\n\n  desc \"Restarts background workers\"\n  task :restart_workers do\n    on roles(:worker) do # Sadece 'worker' rol\u00fcne sahip sunucularda \u00e7al\u0131\u015f\u0131r\n      execute :sudo, :systemctl, :restart, 'my_worker.service' # systemd kullanan bir \u00f6rnek\n    end\n  end\nend\n\n<h2>Bir g\u00f6revi ba\u015fka bir Capistrano g\u00f6revine ba\u011flama<\/h2>\n<h2>deploy:published g\u00f6revi bittikten hemen sonra \u00f6nbelle\u011fi temizle<\/h2>\nafter 'deploy:published', 'my_app:clear_cache'\n\n<h2>deploy:reverted g\u00f6revi bittikten sonra i\u015f\u00e7ileri yeniden ba\u015flat<\/h2>\nafter 'deploy:reverted', 'my_app:restart_workers'<\/code><\/pre>\n<p>Bu \u00f6rnekte:<\/p>\n<p>*   <code>namespace :my_app do ... end<\/code>: G\u00f6revlerinizi bir ad alan\u0131 alt\u0131nda grupland\u0131r\u0131r.<br \/>\n*   <code>desc \"...\"<\/code>: G\u00f6rev i\u00e7in bir a\u00e7\u0131klama sa\u011flar.<br \/>\n*   <code>task :clear_cache do ... end<\/code>: <code>my_app:clear_cache<\/code> ad\u0131nda bir g\u00f6rev tan\u0131mlar.<br \/>\n*   <code>on roles(:app) do ... end<\/code>: Bu g\u00f6revin sadece <code>app<\/code> rol\u00fcne sahip sunucularda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. <code>on roles(:all)<\/code> t\u00fcm sunucularda \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <code>within release_path do ... end<\/code>: Komutun o anki release dizini i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>execute :command, 'arg1', 'arg2'<\/code>: Uzak sunucuda bir komut \u00e7al\u0131\u015ft\u0131r\u0131r. <code>sudo<\/code>, <code>rake<\/code>, <code>bundle<\/code> gibi komutlar genellikle <code>execute<\/code> ile kullan\u0131l\u0131r.<br \/>\n*   <code>after 'deploy:published', 'my_app:clear_cache'<\/code>: <code>deploy:published<\/code> g\u00f6revi tamamland\u0131ktan sonra <code>my_app:clear_cache<\/code> g\u00f6revinin otomatik olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. <code>before<\/code> da kullanabilirsiniz.<\/p>\n<p>Bu sayede, da\u011f\u0131t\u0131m s\u00fcrecinizi uygulaman\u0131z\u0131n \u00f6zel gereksinimlerine g\u00f6re tamamen otomatikle\u015ftirebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Capistrano ile \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>1.  <strong>SSH Ba\u011flant\u0131 Sorunlar\u0131:<\/strong><br \/>\n    *   <strong>Hata:<\/strong> <code>Net::SSH::AuthenticationFailed<\/code> veya <code>Permission denied (publickey)<\/code>.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> SSH anahtarlar\u0131n\u0131z\u0131n do\u011fru \u015fekilde olu\u015fturuldu\u011fundan, public anahtar\u0131n\u0131z\u0131n sunucudaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na eklendi\u011finden ve do\u011fru izinlere (<code>chmod 600 ~\/.ssh\/authorized_keys<\/code>) sahip oldu\u011fundan emin olun. <code>ssh-add<\/code> ile anahtar\u0131n\u0131z\u0131 SSH agent&#8217;a ekleyin ve <code>set :ssh_options, { forward_agent: true }<\/code> ayar\u0131n\u0131 kontrol edin. <code>user<\/code> ve <code>port<\/code> ayarlar\u0131n\u0131n do\u011fru oldu\u011fundan emin olun.<br \/>\n2.  <strong>Git Klonlama Hatalar\u0131:<\/strong><br \/>\n    *   <strong>Hata:<\/strong> <code>Host key verification failed<\/code> veya <code>Repository not found<\/code>.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>repo_url<\/code>&#8216;nin do\u011fru oldu\u011fundan emin olun. SSH anahtar\u0131n\u0131z\u0131n Git deposuna eri\u015fim izni oldu\u011fundan emin olun (\u00f6rne\u011fin, GitHub&#8217;da SSH anahtar\u0131n\u0131z\u0131n kay\u0131tl\u0131 olmas\u0131). <code>ssh-add<\/code> ve <code>forward_agent<\/code> ayarlar\u0131n\u0131 tekrar kontrol edin.<br \/>\n3.  <strong>Ba\u011f\u0131ml\u0131l\u0131k Sorunlar\u0131 (Gem&#8217;ler, Node Mod\u00fclleri vb.):<\/strong><br \/>\n    *   <strong>Hata:<\/strong> <code>bundle install<\/code> veya <code>npm install<\/code> s\u0131ras\u0131nda hatalar.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Sunucuda gerekli \u00e7al\u0131\u015fma zamanlar\u0131n\u0131n (Ruby, Node.js) ve geli\u015ftirme ara\u00e7lar\u0131n\u0131n (build-essential, make) kurulu oldu\u011fundan emin olun. <code>linked_dirs<\/code> i\u00e7inde <code>vendor\/bundle<\/code> veya <code>node_modules<\/code> gibi dizinlerin oldu\u011fundan emin olun. Ruby versiyon y\u00f6netimi (RVM\/rbenv) ayarlar\u0131n\u0131 (<code>capistrano-rvm<\/code> veya <code>capistrano-rbenv<\/code> gem&#8217;leri ile) kontrol edin.<br \/>\n4.  <strong><code>linked_files<\/code> veya <code>linked_dirs<\/code> Hatalar\u0131:<\/strong><br \/>\n    *   <strong>Hata:<\/strong> <code>No such file or directory<\/code> veya <code>Symlink failed<\/code>.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>shared\/config\/<\/code> alt\u0131nda <code>linked_files<\/code> olarak belirtti\u011finiz dosyalar\u0131n (\u00f6rne\u011fin, <code>database.yml<\/code>) ve <code>shared\/<\/code> alt\u0131nda <code>linked_dirs<\/code> olarak belirtti\u011finiz dizinlerin (\u00f6rne\u011fin, <code>public\/uploads<\/code>) var oldu\u011fundan ve do\u011fru izinlere sahip oldu\u011fundan emin olun. \u0130lk da\u011f\u0131t\u0131mdan \u00f6nce bu dosyalar\u0131 ve dizinleri manuel olarak olu\u015fturman\u0131z gerekebilir.<br \/>\n5.  <strong>Uygulama Ba\u015flatma\/Durdurma Sorunlar\u0131:<\/strong><br \/>\n    *   <strong>Hata:<\/strong> Da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131 g\u00f6r\u00fcn\u00fcyor ancak uygulama \u00e7al\u0131\u015fm\u0131yor.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Uygulama sunucunuzun (Nginx, Apache, Puma, Passenger) do\u011fru \u015fekilde yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan ve <code>current<\/code> dizinini i\u015faret etti\u011finden emin olun. Sunucudaki uygulama loglar\u0131n\u0131 (<code>shared\/log\/production.log<\/code>) ve web sunucusu loglar\u0131n\u0131 kontrol edin. Capistrano&#8217;nun ilgili uygulama sunucusu eklentilerini (\u00f6rne\u011fin, <code>capistrano-passenger<\/code>) kulland\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n6.  <strong>\u0130zin Sorunlar\u0131:<\/strong><br \/>\n    *   <strong>Hata:<\/strong> <code>Permission denied<\/code> mesajlar\u0131.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Da\u011f\u0131t\u0131m yapan SSH kullan\u0131c\u0131s\u0131n\u0131n <code>deploy_to<\/code> dizinine ve alt\u0131ndaki t\u00fcm dosyalara\/dizinlere yazma ve okuma izinlerine sahip oldu\u011fundan emin olun. <code>chown<\/code> ve <code>chmod<\/code> komutlar\u0131n\u0131 kullanarak gerekli izinleri ayarlay\u0131n.<\/p>\n<p>Sorun giderme s\u00fcrecinde, <code>set :log_level, :debug<\/code> ayar\u0131n\u0131 <code>config\/deploy.rb<\/code> dosyas\u0131na ekleyerek Capistrano&#8217;nun daha ayr\u0131nt\u0131l\u0131 loglar \u00fcretmesini sa\u011flayabilirsiniz. Bu, hatan\u0131n kayna\u011f\u0131n\u0131 bulman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>\u0130leri Seviye Konulara Bak\u0131\u015f<\/h3>\n<p>Bu makale Capistrano&#8217;ya bir ba\u015flang\u0131\u00e7 rehberi olsa da, arac\u0131n yetenekleri \u00e7ok daha geni\u015ftir. \u0130\u015fte Capistrano ile yapabilece\u011finiz baz\u0131 ileri seviye konular:<\/p>\n<p>*   <strong>\u00c7oklu Sunucu Da\u011f\u0131t\u0131mlar\u0131:<\/strong> Birden fazla web sunucusu veya farkl\u0131 rollerdeki sunuculara (\u00f6rne\u011fin, ayr\u0131 bir veritaban\u0131 sunucusu, ayr\u0131 bir worker sunucusu) ayn\u0131 anda da\u011f\u0131t\u0131m yapmak.<br \/>\n*   <strong>Zero-Downtime Da\u011f\u0131t\u0131mlar:<\/strong> Uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcme ge\u00e7erken hi\u00e7 kesintiye u\u011framamas\u0131n\u0131 sa\u011flamak i\u00e7in geli\u015fmi\u015f teknikler (\u00f6rne\u011fin, Nginx&#8217;in <code>upstream<\/code> bloklar\u0131n\u0131 dinamik olarak g\u00fcncelleme).<br \/>\n*   <strong>Veritaban\u0131 G\u00f6\u00e7leri (Migrations):<\/strong> Veritaban\u0131 \u015femas\u0131nda de\u011fi\u015fiklikler gerektiren da\u011f\u0131t\u0131mlar i\u00e7in <code>capistrano-rails<\/code>&#8216;in <code>db:migrate<\/code> g\u00f6revini kullanmak ve bunu g\u00fcvenli bir \u015fekilde y\u00f6netmek.<br \/>\n*   <strong>Uygulama ve Web Sunucusu Entegrasyonlar\u0131:<\/strong> Puma, Unicorn, Passenger gibi uygulama sunucular\u0131 ile Nginx, Apache gibi web sunucular\u0131n\u0131n Capistrano ile entegrasyonu i\u00e7in \u00f6zel g\u00f6revler ve eklentiler kullanmak.<br \/>\n*   <strong>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) Boru Hatlar\u0131:<\/strong> Jenkins, GitLab CI, GitHub Actions gibi CI\/CD ara\u00e7lar\u0131 ile Capistrano&#8217;yu birle\u015ftirerek, kod her push edildi\u011finde otomatik olarak testlerin \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 ve ba\u015far\u0131l\u0131 testler sonras\u0131 da\u011f\u0131t\u0131m\u0131n tetiklenmesi.<br \/>\n*   <strong>\u00d6zel Komutlar ve G\u00f6revler:<\/strong> Uygulaman\u0131za \u00f6zel bak\u0131m g\u00f6revleri, veri senkronizasyonlar\u0131 veya cron i\u015fleri i\u00e7in Capistrano g\u00f6revleri olu\u015fturmak.<\/p>\n<p>Bu konular, Capistrano&#8217;yu da\u011f\u0131t\u0131m stratejinizin merkezi bir par\u00e7as\u0131 haline getirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Capistrano, yaz\u0131l\u0131m da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirerek geli\u015ftiricilerin hayat\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc ve g\u00fcvenilir bir ara\u00e7t\u0131r. Bu makalede, Capistrano&#8217;nun ne oldu\u011fundan, neden kullan\u0131lmas\u0131 gerekti\u011fine, kurulumundan temel yap\u0131land\u0131rmas\u0131na ve ilk da\u011f\u0131t\u0131m\u0131n\u0131z\u0131 nas\u0131l ger\u00e7ekle\u015ftirece\u011finize kadar kapsaml\u0131 bir ba\u015flang\u0131\u00e7 rehberi sunduk.<\/p>\n<p>Da\u011f\u0131t\u0131m otomasyonuna yat\u0131r\u0131m yapmak, sadece zaman tasarrufu sa\u011flamakla kalmaz, ayn\u0131 zamanda manuel hatalar\u0131 azalt\u0131r, tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve geli\u015ftirme ekibinizin daha h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde \u00fcr\u00fcn sunmas\u0131na olanak tan\u0131r. Capistrano ile bu yolculu\u011fa sa\u011flam bir ba\u015flang\u0131\u00e7 yaparak, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha verimli ve keyifli hale getirebilirsiniz. Unutmay\u0131n, pratik yapmak ve belgeleri incelemek, Capistrano&#8217;da ustala\u015fman\u0131n anahtar\u0131d\u0131r. Ba\u015far\u0131lar dileriz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi\nYaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin en kritik ve \u00e7o\u011fu zaman en stresli a\u015famalar\u0131ndan bir","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-32040","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>Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi - 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\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi\" \/>\n<meta property=\"og:description\" content=\"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin en kritik ve \u00e7o\u011fu zaman en stresli a\u015famalar\u0131ndan bir\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T22:41:01+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi\",\"datePublished\":\"2025-10-16T22:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\"},\"wordCount\":3103,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\",\"name\":\"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-16T22:41:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi\"}]},{\"@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":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi - 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\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi","og_description":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin en kritik ve \u00e7o\u011fu zaman en stresli a\u015famalar\u0131ndan bir","og_url":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-16T22:41:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi","datePublished":"2025-10-16T22:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/"},"wordCount":3103,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/","name":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-16T22:41:01+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/capistrano-ile-otomatik-dagitimlar-baslangic-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Capistrano ile Otomatik Da\u011f\u0131t\u0131mlar: Ba\u015flang\u0131\u00e7 Rehberi"}]},{"@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\/32040","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=32040"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32040\/revisions"}],"predecessor-version":[{"id":32041,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32040\/revisions\/32041"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32040"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32040"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}