{"id":37690,"date":"2026-01-12T17:41:14","date_gmt":"2026-01-12T14:41:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37690"},"modified":"2026-01-12T17:41:14","modified_gmt":"2026-01-12T14:41:14","slug":"php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/","title":{"rendered":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde canl\u0131 ortama al\u0131nmas\u0131 kritik \u00f6neme sahiptir. Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri zaman al\u0131c\u0131d\u0131r, insan hatas\u0131na a\u00e7\u0131kt\u0131r ve genellikle tutars\u0131z sonu\u00e7lar do\u011furur. \u00d6zellikle PHP gibi dinamik dillerde geli\u015ftirilen uygulamalar i\u00e7in bu durum, geli\u015ftiricilerin verimlili\u011fini d\u00fc\u015f\u00fcren ve operasyonel riskleri art\u0131ran bir fakt\u00f6r haline gelebilir. \u0130\u015fte tam bu noktada, otomasyon ara\u00e7lar\u0131 devreye girer. Bu makalede, Ruby tabanl\u0131 g\u00fc\u00e7l\u00fc bir otomasyon arac\u0131 olan Capistrano&#8217;yu kullanarak PHP uygulamalar\u0131n\u0131z\u0131n da\u011f\u0131t\u0131m s\u00fcrecini Ubuntu 13 sunucular \u00fczerinde nas\u0131l otomatikle\u015ftirece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Her ne kadar Ubuntu 13 eski bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fc olsa da, Capistrano&#8217;nun temel prensipleri ve da\u011f\u0131t\u0131m mant\u0131\u011f\u0131 modern Ubuntu s\u00fcr\u00fcmleri ve di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131 i\u00e7in de b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ge\u00e7erlidir. Bu rehber, Capistrano&#8217;nun kurulumundan yap\u0131land\u0131rmas\u0131na, sunucu haz\u0131rl\u0131\u011f\u0131ndan ilk da\u011f\u0131t\u0131m\u0131n ger\u00e7ekle\u015ftirilmesine kadar t\u00fcm s\u00fcreci kapsayarak, PHP geli\u015ftiricilerine da\u011f\u0131t\u0131m otomasyonunun kap\u0131lar\u0131n\u0131 aralayacakt\u0131r.<\/p>\n<h3>Neden Da\u011f\u0131t\u0131m Otomasyonu?<\/h3>\n<p>Da\u011f\u0131t\u0131m otomasyonu, yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn en \u00f6nemli a\u015famalar\u0131ndan biridir. Manuel da\u011f\u0131t\u0131m\u0131n getirdi\u011fi zorluklar ve otomasyonun sundu\u011fu avantajlar a\u015fa\u011f\u0131daki gibi \u00f6zetlenebilir:<\/p>\n<ul>\n<li><strong>Hata Azaltma:<\/strong> Manuel ad\u0131mlar, unutulan bir dosya kopyalama, yanl\u0131\u015f bir komut \u00e7al\u0131\u015ft\u0131rma veya eksik bir yap\u0131land\u0131rma gibi hatalara yol a\u00e7abilir. Otomatikle\u015ftirilmi\u015f s\u00fcre\u00e7ler, bu t\u00fcr insan hatalar\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/li>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> Her da\u011f\u0131t\u0131m ayn\u0131 ad\u0131mlar\u0131, ayn\u0131 s\u0131rada ve ayn\u0131 \u015fekilde ger\u00e7ekle\u015ftirir. Bu, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k, \u00fcretim) aras\u0131nda tutarl\u0131l\u0131k sa\u011flar.<\/li>\n<li><strong>H\u0131z:<\/strong> Dakikalar hatta saniyeler i\u00e7inde da\u011f\u0131t\u0131m yapabilme yetene\u011fi, h\u0131zl\u0131 geri bildirim d\u00f6ng\u00fcleri ve daha s\u0131k yay\u0131nlar anlam\u0131na gelir.<\/li>\n<li><strong>Tekrarlanabilirlik:<\/strong> Bir da\u011f\u0131t\u0131m\u0131n herhangi bir zamanda ve herhangi bir ortamda sorunsuz bir \u015fekilde tekrarlanabilmesini sa\u011flar.<\/li>\n<li><strong>Geri Alma (Rollback) Kolayl\u0131\u011f\u0131:<\/strong> Otomatikle\u015ftirilmi\u015f sistemler, sorunlu bir da\u011f\u0131t\u0131m\u0131n h\u0131zla \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme geri al\u0131nmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r, bu da kesinti s\u00fcresini minimize eder.<\/li>\n<li><strong>Ekip Verimlili\u011fi:<\/strong> Geli\u015ftiriciler, da\u011f\u0131t\u0131m\u0131n teknik detaylar\u0131yla u\u011fra\u015fmak yerine kod yazmaya ve yeni \u00f6zellikler geli\u015ftirmeye odaklanabilirler.<\/li>\n<\/ul>\n<h3>Capistrano&#8217;ya Giri\u015f<\/h3>\n<h4>Capistrano Nedir?<\/h4>\n<p>Capistrano, Ruby ile yaz\u0131lm\u0131\u015f, uzak sunucularda otomasyon g\u00f6revlerini ger\u00e7ekle\u015ftirmek i\u00e7in tasarlanm\u0131\u015f bir a\u00e7\u0131k kaynak ara\u00e7t\u0131r. \u00d6zellikle web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131 i\u00e7in pop\u00fclerdir. SSH \u00fczerinden sunuculara ba\u011flanarak komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r, dosya transferleri yapar ve uygulama ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netir. Capistrano&#8217;nun temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Ruby Tabanl\u0131:<\/strong> Konfig\u00fcrasyon dosyalar\u0131 Ruby dilinde yaz\u0131l\u0131r, bu da esneklik ve geni\u015fletilebilirlik sa\u011flar.<\/li>\n<li><strong>SSH \u00dczerinden \u00c7al\u0131\u015fma:<\/strong> T\u00fcm i\u015flemler g\u00fcvenli bir \u015fekilde SSH protokol\u00fc \u00fczerinden ger\u00e7ekle\u015ftirilir.<\/li>\n<li><strong>Paralel \u00c7al\u0131\u015fma:<\/strong> Birden fazla sunucuya ayn\u0131 anda da\u011f\u0131t\u0131m yapabilir.<\/li>\n<li><strong>S\u00fcr\u00fcm Y\u00f6netimi:<\/strong> Uygulaman\u0131n farkl\u0131 s\u00fcr\u00fcmlerini sunucuda tutar ve kolayca geri alma imkan\u0131 sunar.<\/li>\n<li><strong>Geni\u015fletilebilir:<\/strong> Eklentiler (gem&#8217;ler) ve \u00f6zel g\u00f6revler (task&#8217;ler) arac\u0131l\u0131\u011f\u0131yla kolayca geni\u015fletilebilir.<\/li>\n<\/ul>\n<h4>Neden Capistrano PHP Uygulamalar\u0131 \u0130\u00e7in Uygun?<\/h4>\n<p>Capistrano, ba\u015flang\u0131\u00e7ta Ruby on Rails uygulamalar\u0131 i\u00e7in geli\u015ftirilmi\u015f olsa da, genel bir uzak otomasyon arac\u0131 oldu\u011fu i\u00e7in PHP uygulamalar\u0131 i\u00e7in de m\u00fckemmel bir \u015fekilde kullan\u0131labilir. PHP ekosistemindeki Composer, Symfony, Laravel gibi ara\u00e7larla entegrasyonu sa\u011flayan eklentileri (gem&#8217;ler) mevcuttur. PHP uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131nda s\u0131kl\u0131kla kar\u015f\u0131la\u015f\u0131lan Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n y\u00fcklenmesi, cache temizli\u011fi, veritaban\u0131 migrasyonlar\u0131 gibi ad\u0131mlar Capistrano ile kolayca otomatikle\u015ftirilebilir.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Capistrano ile PHP uygulama da\u011f\u0131t\u0131m\u0131n\u0131 otomatikle\u015ftirmek i\u00e7in hem geli\u015ftirme ortam\u0131n\u0131zda hem de hedef sunucunuzda belirli ara\u00e7lar\u0131n kurulu ve yap\u0131land\u0131r\u0131lm\u0131\u015f olmas\u0131 gerekir.<\/p>\n<h4>Geli\u015ftirme Ortam\u0131 (Local Makine)<\/h4>\n<ul>\n<li>\n<h5>Ruby ve Bundler<\/h5>\n<p>Capistrano bir Ruby uygulamas\u0131 oldu\u011fu i\u00e7in, makinenizde Ruby kurulu olmal\u0131d\u0131r. Ubuntu 13 \u00fczerinde Ruby kurulumu i\u00e7in <code>apt-get<\/code> kullanabilirsiniz, ancak s\u00fcr\u00fcm y\u00f6neticileri (RVM veya rbenv) kullanmak daha iyi bir yakla\u015f\u0131md\u0131r, zira farkl\u0131 projeler i\u00e7in farkl\u0131 Ruby s\u00fcr\u00fcmlerine ihtiyac\u0131n\u0131z olabilir.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get update\nsudo apt-get install ruby-full # Veya RVM\/rbenv kurulumu\nsudo gem install bundler<\/code><\/pre>\n<p>Bundler, Ruby projelerinin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<\/li>\n<li>\n<h5>Git<\/h5>\n<p>Uygulaman\u0131z\u0131n kaynak kodu bir Git deposunda olmal\u0131d\u0131r. Capistrano, kodu bu depodan \u00e7ekecektir.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install git<\/code><\/pre>\n<\/li>\n<li>\n<h5>SSH Anahtarlar\u0131<\/h5>\n<p>Capistrano&#8217;nun sunucuya g\u00fcvenli bir \u015fekilde ba\u011flanabilmesi i\u00e7in SSH anahtar \u00e7ifti (public\/private key) gereklidir. Geli\u015ftirme makinenizdeki public anahtar\u0131n\u0131z\u0131n, hedef sunucudaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na eklenmi\u015f olmas\u0131 \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"your_email@example.com\" # E\u011fer anahtar\u0131n\u0131z yoksa\nssh-copy-id deploy_user@your_server_ip # Public anahtar\u0131n\u0131z\u0131 sunucuya kopyalamak i\u00e7in<\/code><\/pre>\n<\/li>\n<\/ul>\n<h4>Sunucu Ortam\u0131 (Ubuntu 13)<\/h4>\n<ul>\n<li>\n<h5>Ubuntu 13 \u0130\u015fletim Sistemi<\/h5>\n<p>Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 sunucuda Ubuntu 13 kurulu ve SSH eri\u015fimi a\u00e7\u0131k olmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n<h5>Web Sunucusu<\/h5>\n<p>Uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Apache veya Nginx gibi bir web sunucusu kurulu ve yap\u0131land\u0131r\u0131lm\u0131\u015f olmal\u0131d\u0131r. Bu rehberde, Nginx ve PHP-FPM kombinasyonunu varsayaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install nginx php5-fpm php5-cli php5-mysql # Gerekli di\u011fer PHP eklentileri<\/code><\/pre>\n<\/li>\n<li>\n<h5>Veritaban\u0131 Sunucusu<\/h5>\n<p>Uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 veritaban\u0131 (MySQL, PostgreSQL vb.) kurulu olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install mysql-server<\/code><\/pre>\n<\/li>\n<li>\n<h5>Git<\/h5>\n<p>Capistrano, sunucu \u00fczerinde Git komutlar\u0131n\u0131 kullanarak depodan kodu \u00e7eker. Bu nedenle sunucuda Git kurulu olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install git<\/code><\/pre>\n<\/li>\n<li>\n<h5>Composer<\/h5>\n<p>PHP ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in Composer&#8217;\u0131n sunucuda kurulu olmas\u0131 gereklidir.<\/p>\n<pre><code class=\"language-bash\">curl -sS https:\/\/getcomposer.org\/installer | php\nsudo mv composer.phar \/usr\/local\/bin\/composer<\/code><\/pre>\n<\/li>\n<li>\n<h5>Dizin \u0130zinleri ve Kullan\u0131c\u0131<\/h5>\n<p>Da\u011f\u0131t\u0131m i\u015flemini ger\u00e7ekle\u015ftirecek bir <code>deploy<\/code> kullan\u0131c\u0131s\u0131 olu\u015fturulmal\u0131 ve bu kullan\u0131c\u0131n\u0131n da\u011f\u0131t\u0131m dizinlerine yazma\/okuma\/\u00e7al\u0131\u015ft\u0131rma izinleri olmal\u0131d\u0131r. Ayr\u0131ca, web sunucusunun (nginx\/apache) PHP-FPM \u00fczerinden uygulama dosyalar\u0131na eri\u015febilmesi i\u00e7in uygun izinler ayarlanmal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ul>\n<h3>Capistrano Kurulumu ve Projeye Entegrasyonu<\/h3>\n<p>\u015eimdi Capistrano&#8217;yu geli\u015ftirme ortam\u0131n\u0131za kurup PHP projenize entegre edelim.<\/p>\n<h4>1. Capistrano Gem&#8217;lerini Ekleme<\/h4>\n<p>Projenizin k\u00f6k dizininde bir <code>Gemfile<\/code> olu\u015fturun (e\u011fer yoksa) ve Capistrano ile ilgili gem&#8217;leri ekleyin:<\/p>\n<pre><code class=\"language-ruby\"># Gemfile\nsource 'https:\/\/rubygems.org'\n\ngem 'capistrano', '~> 3.11' # Ubuntu 13 i\u00e7in daha eski bir Capistrano s\u00fcr\u00fcm\u00fc gerekebilir.\ngem 'capistrano-php', '~> 1.0'\ngem 'capistrano-composer', '~> 1.0'\n<h2>\u0130ste\u011fe ba\u011fl\u0131, e\u011fer Symfony projesi ise:<\/h2>\n<h2>gem 'capistrano-symfony', '~> 1.x'<\/code><\/pre>\n<\/h2>\n<p>Daha sonra terminalde projenizin k\u00f6k dizininde <code>bundle install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak gem&#8217;leri y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">bundle install<\/code><\/pre>\n<h4>2. Capistrano Dosyalar\u0131n\u0131 Olu\u015fturma<\/h4>\n<p>Capistrano&#8217;nun temel yap\u0131land\u0131rma dosyalar\u0131n\u0131 olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap install<\/code><\/pre>\n<p>Bu komut, projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki dosyalar\u0131 olu\u015fturacakt\u0131r:<\/p>\n<ul>\n<li><code>Capfile<\/code>: Capistrano&#8217;nun ana giri\u015f noktas\u0131d\u0131r ve eklentileri y\u00fckler.<\/li>\n<li><code>config\/deploy.rb<\/code>: T\u00fcm ortamlar i\u00e7in ge\u00e7erli temel da\u011f\u0131t\u0131m yap\u0131land\u0131rmalar\u0131n\u0131 i\u00e7erir.<\/li>\n<li><code>config\/deploy\/staging.rb<\/code>: Haz\u0131rl\u0131k (staging) ortam\u0131na \u00f6zel yap\u0131land\u0131rmalar.<\/li>\n<li><code>config\/deploy\/production.rb<\/code>: \u00dcretim (production) ortam\u0131na \u00f6zel yap\u0131land\u0131rmalar.<\/li>\n<\/ul>\n<h3>Capistrano Konfig\u00fcrasyonu<\/h3>\n<p>Capistrano&#8217;nun do\u011fru \u00e7al\u0131\u015fabilmesi i\u00e7in <code>config\/deploy.rb<\/code> ve ortam dosyalar\u0131n\u0131 (<code>config\/deploy\/production.rb<\/code> gibi) dikkatlice yap\u0131land\u0131rmam\u0131z gerekir.<\/p>\n<h4>Temel Ayarlar (<code>config\/deploy.rb<\/code>)<\/h4>\n<p>Bu dosya, uygulaman\u0131z\u0131n ad\u0131, Git deposunun URL&#8217;si, da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 dizin gibi global ayarlar\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy.rb\n\n<h2>Uygulaman\u0131z\u0131n ad\u0131<\/h2>\nset :application, 'my-php-app'\n\n<h2>Git deposunun URL'si<\/h2>\nset :repo_url, 'git@github.com:your-username\/my-php-app.git'\n\n<h2>Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 sunucudaki ana dizin<\/h2>\nset :deploy_to, \"\/var\/www\/#{fetch(:application)}\"\n\n<h2>Da\u011f\u0131t\u0131lacak Git dal\u0131 (branch)<\/h2>\nset :branch, ENV['BRANCH'] || 'master'\n\n<h2>SCM (Source Code Management) tipi<\/h2>\nset :scm, :git\n\n<h2>\u00c7\u0131kt\u0131 format\u0131 ve log seviyesi<\/h2>\nset :format, :pretty\nset :log_level, :debug # Hata ay\u0131klama i\u00e7in debug, normalde info\n\n<h2>Payla\u015f\u0131lan dosyalar ve dizinler. Bu dosyalar\/dizinler her yeni s\u00fcr\u00fcmde korunur ve sembolik olarak ba\u011flan\u0131r.<\/h2>\n<h2>\u00d6rn: .env dosyas\u0131, kullan\u0131c\u0131 y\u00fcklemeleri<\/h2>\nset :linked_files, fetch(:linked_files, []).push('.env')\nset :linked_dirs, fetch(:linked_dirs, []).push('storage', 'web\/uploads') # Laravel i\u00e7in 'storage', Symfony i\u00e7in 'var\/log', 'var\/cache'\n\n<h2>Sunucuda ka\u00e7 tane eski s\u00fcr\u00fcm\u00fcn saklanaca\u011f\u0131<\/h2>\nset :keep_releases, 5\n\n<h2>SSH agent forwarding'i etkinle\u015ftir. Bu, Capistrano'nun SSH anahtarlar\u0131n\u0131z\u0131 kullanmas\u0131na izin verir.<\/h2>\nset :ssh_options, {\n  forward_agent: true,\n  auth_methods: %w[publickey],\n  keys: %w[~\/.ssh\/id_rsa] # Kendi anahtar\u0131n\u0131z\u0131n yolunu belirtin\n}\n\n<h2>PHP FPM servisini yeniden ba\u015flatma komutu (Ubuntu 13'te 'service' kullan\u0131l\u0131r)<\/h2>\nset :php_fpm_service, 'php5-fpm'\n\n<h2>Composer ile ilgili ayarlar<\/h2>\nset :composer_install_flags, '--no-dev --prefer-dist --no-interaction --optimize-autoloader'\n\n<h2>Capistrano eklentilerini y\u00fckle<\/h2>\n<h2>Capfile'da da y\u00fcklenebilirler, burada da tekrar kontrol edilebilir<\/h2>\n<h2>require 'capistrano\/php'<\/h2>\n<h2>require 'capistrano\/composer'<\/h2>\n\n<h2>Ekstra g\u00f6revler ve hook'lar<\/h2>\nnamespace :deploy do\n  desc 'Restart application services'\n  task :restart do\n    on roles(:web) do\n      execute :sudo, \"service #{fetch(:php_fpm_service)} restart\"\n    end\n  end\n\n  # Da\u011f\u0131t\u0131m tamamland\u0131ktan sonra PHP-FPM'i yeniden ba\u015flat\n  after :publishing, :restart\n\n  # Gerekirse veritaban\u0131 migrasyonlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma (Laravel \u00f6rne\u011fi)\n  desc 'Run database migrations'\n  task :migrate do\n    on roles(:db) do\n      within release_path do\n        execute :php, 'artisan migrate --force' # Laravel i\u00e7in\n      end\n    end\n  end\n  # after 'deploy:updated', 'deploy:migrate' # E\u011fer her da\u011f\u0131t\u0131mda migrate edilecekse\nend<\/code><\/pre>\n<h4>Ortam Ayarlar\u0131 (<code>config\/deploy\/production.rb<\/code>)<\/h4>\n<p>Her ortam i\u00e7in (production, staging vb.) ayr\u0131 ayr\u0131 sunucu tan\u0131mlamalar\u0131 ve ortama \u00f6zel ayarlar yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy\/production.rb\n\n<h2>Ortam ad\u0131<\/h2>\nset :stage, :production\n\n<h2>Sunucu tan\u0131mlamas\u0131: IP adresi veya hostname, kullan\u0131c\u0131 ad\u0131 ve rolleri<\/h2>\nserver 'your_production_server_ip', user: 'deploy_user', roles: %w{web app db}\n\n<h2>Ortama \u00f6zel de\u011fi\u015fkenler (\u00f6rn: APP_ENV)<\/h2>\nset :default_env, {\n  'APP_ENV' => 'production',\n  'SYMFONY_ENV' => 'prod' # Symfony i\u00e7in\n}<\/code><\/pre>\n<p>Benzer \u015fekilde, bir <code>config\/deploy\/staging.rb<\/code> dosyas\u0131 olu\u015fturarak haz\u0131rl\u0131k ortam\u0131n\u0131z i\u00e7in farkl\u0131 bir sunucu ve ayarlar tan\u0131mlayabilirsiniz.<\/p>\n<h4>Capistrano PHP Eklentileri<\/h4>\n<p><code>capistrano-php<\/code> ve <code>capistrano-composer<\/code> gibi eklentiler, PHP uygulamalar\u0131na \u00f6zel da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. <code>Capfile<\/code> i\u00e7inde bu eklentileri \u00e7a\u011f\u0131rman\u0131z gerekir:<\/p>\n<pre><code class=\"language-ruby\"># Capfile\n<h2>Load DSL and set up stages<\/h2>\nrequire 'capistrano\/setup'\n\n<h2>Include default deployment tasks<\/h2>\nrequire 'capistrano\/deploy'\n\n<h2>Load Capistrano PHP extensions<\/h2>\nrequire 'capistrano\/php'\nrequire 'capistrano\/composer'\n\n<h2>Load custom tasks from <code>lib\/capistrano\/tasks<\/code> if any<\/h2>\nDir.glob('lib\/capistrano\/tasks\/*.rake').each { |r| import r }<\/code><\/pre>\n<p>Bu eklentiler, Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n otomatik olarak kurulmas\u0131, PHP-FPM&#8217;in yeniden ba\u015flat\u0131lmas\u0131 gibi g\u00f6revleri Capistrano&#8217;nun standart da\u011f\u0131t\u0131m ak\u0131\u015f\u0131na entegre eder.<\/p>\n<h3>Sunucu Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Da\u011f\u0131t\u0131m yapmadan \u00f6nce sunucunuzun Capistrano i\u00e7in haz\u0131r olmas\u0131 gerekir.<\/p>\n<h4>1. Deploy Kullan\u0131c\u0131s\u0131 Olu\u015fturma ve SSH Anahtarlar\u0131<\/h4>\n<p>Sunucunuzda <code>deploy<\/code> ad\u0131nda bir kullan\u0131c\u0131 olu\u015fturun ve SSH anahtar\u0131n\u0131z\u0131 bu kullan\u0131c\u0131n\u0131n <code>authorized_keys<\/code> dosyas\u0131na ekleyin.<\/p>\n<pre><code class=\"language-bash\">sudo adduser deploy_user\nsudo mkdir \/home\/deploy_user\/.ssh\nsudo chmod 700 \/home\/deploy_user\/.ssh\nsudo nano \/home\/deploy_user\/.ssh\/authorized_keys # Kendi public anahtar\u0131n\u0131z\u0131 buraya yap\u0131\u015ft\u0131r\u0131n\nsudo chmod 600 \/home\/deploy_user\/.ssh\/authorized_keys\nsudo chown -R deploy_user:deploy_user \/home\/deploy_user\/.ssh<\/code><\/pre>\n<p>Bu kullan\u0131c\u0131n\u0131n gerekti\u011finde <code>sudo<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilmesi i\u00e7in <code>sudoers<\/code> dosyas\u0131na eklemek isteyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo visudo\n<h2>Dosyan\u0131n sonuna ekleyin:<\/h2>\ndeploy_user ALL=(ALL) NOPASSWD: ALL<\/code><\/pre>\n<p><code>NOPASSWD: ALL<\/code> k\u0131sm\u0131, \u015fifre sormadan sudo komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131na izin verir. G\u00fcvenlik nedeniyle, yaln\u0131zca belirli komutlara izin vermek daha iyi bir pratiktir.<\/p>\n<h4>2. Dizin Yap\u0131s\u0131 ve \u0130zinler<\/h4>\n<p>Capistrano, sunucuda belirli bir dizin yap\u0131s\u0131 kullan\u0131r. <code>deploy_to<\/code> olarak belirtti\u011finiz dizin (\u00f6rn: <code>\/var\/www\/my-php-app<\/code>) alt\u0131nda a\u015fa\u011f\u0131daki yap\u0131y\u0131 olu\u015fturur:<\/p>\n<ul>\n<li><code>releases\/<\/code>: Her yeni da\u011f\u0131t\u0131m\u0131n tutuldu\u011fu dizin. S\u00fcr\u00fcm numaras\u0131na g\u00f6re alt dizinler (\u00f6rn: <code>20230101120000\/<\/code>) i\u00e7erir.<\/li>\n<li><code>current\/<\/code>: Her zaman en son ba\u015far\u0131l\u0131 da\u011f\u0131t\u0131ma i\u015faret eden sembolik bir ba\u011f (symlink). Web sunucunuzun <code>DocumentRoot<\/code>&#8216;u bu dizine i\u015faret etmelidir.<\/li>\n<li><code>repo\/<\/code>: Git deposunun sunucudaki kopyas\u0131.<\/li>\n<li><code>shared\/<\/code>: Da\u011f\u0131t\u0131mlar aras\u0131nda kal\u0131c\u0131 olmas\u0131 gereken dosyalar\u0131n ve dizinlerin tutuldu\u011fu yer (\u00f6rn: <code>.env<\/code>, <code>storage<\/code>, <code>uploads<\/code>).<\/li>\n<\/ul>\n<p><code>deploy_to<\/code> dizinini ve alt dizinlerini <code>deploy_user<\/code> kullan\u0131c\u0131s\u0131n\u0131n sahipli\u011fine verin ve web sunucusu kullan\u0131c\u0131s\u0131n\u0131n (\u00f6rn: <code>www-data<\/code>) bu dizinlere yazma\/okuma izni oldu\u011fundan emin olun.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/my-php-app\nsudo chown -R deploy_user:deploy_user \/var\/www\/my-php-app\nsudo chmod -R 775 \/var\/www\/my-php-app # Gerekirse daha k\u0131s\u0131tl\u0131 izinler verin\n<h2>shared dizinleri i\u00e7in de izinleri ayarlay\u0131n<\/h2>\nsudo mkdir -p \/var\/www\/my-php-app\/shared\/storage\nsudo mkdir -p \/var\/www\/my-php-app\/shared\/web\/uploads\nsudo chown -R deploy_user:www-data \/var\/www\/my-php-app\/shared # www-data kullan\u0131c\u0131s\u0131na yazma izni verin\nsudo chmod -R 775 \/var\/www\/my-php-app\/shared<\/code><\/pre>\n<p><code>.env<\/code> gibi hassas dosyalar\u0131 <code>shared<\/code> dizininde manuel olarak olu\u015fturman\u0131z gerekebilir:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/var\/www\/my-php-app\/shared\/.env<\/code><\/pre>\n<h4>3. Web Sunucusu Konfig\u00fcrasyonu (Nginx \u00d6rne\u011fi)<\/h4>\n<p>Nginx yap\u0131land\u0131rma dosyan\u0131z\u0131 (\u00f6rn: <code>\/etc\/nginx\/sites-available\/my-php-app.conf<\/code>) Capistrano&#8217;nun <code>current\/public<\/code> (veya uygulaman\u0131z\u0131n public dizini) dizinine i\u015faret edecek \u015fekilde d\u00fczenleyin.<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com; # Alan ad\u0131n\u0131z\u0131 veya IP adresinizi girin\n\n    root \/var\/www\/my-php-app\/current\/public; # Capistrano'nun current symlink'ine i\u015faret eder\n\n    index index.php index.html index.htm;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        include snippets\/fastcgi-php.conf;\n        fastcgi_pass unix:\/var\/run\/php5-fpm.sock; # Ubuntu 13'te PHP-FPM soket yolu\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n\n    # Di\u011fer Nginx ayarlar\u0131 (statik dosyalar, loglar vb.)\n}<\/code><\/pre>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 etkinle\u015ftirin ve Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-php-app.conf \/etc\/nginx\/sites-enabled\/\nsudo service nginx restart<\/code><\/pre>\n<h3>Da\u011f\u0131t\u0131m S\u00fcreci<\/h3>\n<p>T\u00fcm kurulum ve yap\u0131land\u0131rma ad\u0131mlar\u0131 tamamland\u0131ktan sonra, art\u0131k ilk da\u011f\u0131t\u0131m\u0131n\u0131z\u0131 ger\u00e7ekle\u015ftirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h4>1. \u0130lk Da\u011f\u0131t\u0131m (Cold Deployment)<\/h4>\n<p>\u0130lk kez bir sunucuya da\u011f\u0131t\u0131m yaparken <code>deploy:cold<\/code> g\u00f6revini kullan\u0131r\u0131z. Bu g\u00f6rev, Capistrano&#8217;nun t\u00fcm dizin yap\u0131s\u0131n\u0131 olu\u015fturur ve uygulamay\u0131 ilk kez da\u011f\u0131t\u0131r.<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy:cold<\/code><\/pre>\n<p>Bu komut, Git deposunu sunucuya klonlar, ilk s\u00fcr\u00fcm\u00fc olu\u015fturur, Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar ve gerekli sembolik ba\u011flant\u0131lar\u0131 olu\u015fturur.<\/p>\n<h4>2. Sonraki Da\u011f\u0131t\u0131mlar<\/h4>\n<p>\u0130lk da\u011f\u0131t\u0131mdan sonra, kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikleri da\u011f\u0131tmak i\u00e7in sadece <code>deploy<\/code> g\u00f6revini kullan\u0131rs\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy<\/code><\/pre>\n<p>Capistrano, bu komutla a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 s\u0131ras\u0131yla ger\u00e7ekle\u015ftirecektir:<\/p>\n<ol>\n<li><strong><code>deploy:updating<\/code> (Kodu G\u00fcncelleme):<\/strong> Git deposundan en son kodu \u00e7eker ve <code>releases\/<\/code> dizini alt\u0131nda yeni bir zaman damgal\u0131 s\u00fcr\u00fcm dizini olu\u015fturur (\u00f6rn: <code>releases\/20231027103000<\/code>).<\/li>\n<li><strong><code>deploy:updated<\/code> (G\u00fcncelleme Sonras\u0131 \u0130\u015flemler):<\/strong>\n<ul>\n<li><code>linked_files<\/code> ve <code>linked_dirs<\/code> ayarlar\u0131n\u0131zda belirtilen payla\u015f\u0131lan dosyalar\u0131 ve dizinleri yeni s\u00fcr\u00fcm dizinine sembolik olarak ba\u011flar.<\/li>\n<li><code>composer install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak PHP ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckler.<\/li>\n<li>Di\u011fer \u00f6zel g\u00f6revler (\u00f6rn: cache temizleme, asset derleme, veritaban\u0131 migrasyonlar\u0131) bu a\u015famada \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>deploy:publishing<\/code> (Yay\u0131nlama):<\/strong>\n<ul>\n<li><code>current<\/code> sembolik ba\u011flant\u0131s\u0131n\u0131 eski s\u00fcr\u00fcmden yeni da\u011f\u0131t\u0131lan s\u00fcr\u00fcm dizinine g\u00fcnceller. Bu an, uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcme ge\u00e7i\u015f yapt\u0131\u011f\u0131 and\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>deploy:published<\/code> (Yay\u0131nlama Sonras\u0131 \u0130\u015flemler):<\/strong>\n<ul>\n<li>Web sunucunuzu veya PHP-FPM servisini yeniden ba\u015flat\u0131r (e\u011fer yap\u0131land\u0131r\u0131ld\u0131ysa).<\/li>\n<li>Di\u011fer \u00f6zel g\u00f6revler (\u00f6rn: bildirim g\u00f6nderme).<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>deploy:finishing<\/code> (Bitirme):<\/strong>\n<ul>\n<li><code>keep_releases<\/code> ayar\u0131na g\u00f6re eski s\u00fcr\u00fcmleri temizler.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>deploy:finished<\/code> (Tamamlama):<\/strong>\n<ul>\n<li>Da\u011f\u0131t\u0131m\u0131n ba\u015far\u0131yla tamamland\u0131\u011f\u0131n\u0131 bildirir.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>3. Geri Alma (Rollback)<\/h4>\n<p>E\u011fer yeni bir da\u011f\u0131t\u0131mda sorun ya\u015farsan\u0131z, Capistrano \u00f6nceki \u00e7al\u0131\u015fan s\u00fcr\u00fcme kolayca geri d\u00f6nmenizi sa\u011flar:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy:rollback<\/code><\/pre>\n<p>Bu komut, <code>current<\/code> sembolik ba\u011flant\u0131s\u0131n\u0131 bir \u00f6nceki ba\u015far\u0131l\u0131 s\u00fcr\u00fcme i\u015faret edecek \u015fekilde g\u00fcnceller ve PHP-FPM&#8217;i yeniden ba\u015flat\u0131r. Bu sayede uygulaman\u0131z h\u0131zla \u00e7al\u0131\u015f\u0131r duruma geri d\u00f6ner.<\/p>\n<h3>\u00d6zel G\u00f6revler ve \u0130pu\u00e7lar\u0131<\/h3>\n<h4>Veritaban\u0131 Migrasyonlar\u0131<\/h4>\n<p>PHP uygulamalar\u0131nda veritaban\u0131 \u015femas\u0131nda de\u011fi\u015fiklikler s\u0131k\u00e7a yap\u0131l\u0131r. Bu de\u011fi\u015fikliklerin da\u011f\u0131t\u0131m s\u0131ras\u0131nda uygulanmas\u0131 gerekir. Capistrano&#8217;da \u00f6zel bir g\u00f6rev tan\u0131mlayarak veritaban\u0131 migrasyonlar\u0131n\u0131 da\u011f\u0131t\u0131m ak\u0131\u015f\u0131na dahil edebilirsiniz.<\/p>\n<pre><code class=\"language-ruby\"># config\/deploy.rb i\u00e7inde\nnamespace :deploy do\n  # ... di\u011fer g\u00f6revler ...\n\n  desc 'Run database migrations'\n  task :migrate do\n    on roles(:db) do\n      within release_path do\n        execute :php, 'artisan migrate --force' # Laravel i\u00e7in \u00f6rnek\n        # execute :php, 'bin\/console doctrine:migrations:migrate --no-interaction' # Symfony Doctrine i\u00e7in \u00f6rnek\n      end\n    end\n  end\n\n  # Migrasyonlar\u0131 'deploy:updated' g\u00f6revinden sonra \u00e7al\u0131\u015ft\u0131r\n  # Bu, yeni kod sunucudayken ancak hen\u00fcz canl\u0131ya ge\u00e7meden \u00f6nce \u00e7al\u0131\u015f\u0131r.\n  after 'deploy:updated', 'deploy:migrate'\nend<\/code><\/pre>\n<p>Veritaban\u0131 migrasyonlar\u0131n\u0131n geri al\u0131nmas\u0131 durumunda sorun yaratabilece\u011fini unutmay\u0131n. Geri al\u0131namayacak migrasyonlar yap\u0131yorsan\u0131z, rollback stratejinizi buna g\u00f6re planlaman\u0131z \u00f6nemlidir.<\/p>\n<h4>Ortam De\u011fi\u015fkenleri ve Hassas Veriler<\/h4>\n<p><code>.env<\/code> dosyas\u0131 gibi hassas veriler i\u00e7eren dosyalar veya ortam de\u011fi\u015fkenleri, Git deposunda tutulmamal\u0131d\u0131r. Capistrano&#8217;nun <code>linked_files<\/code> \u00f6zelli\u011fi bu t\u00fcr durumlar i\u00e7in idealdir. Bu dosyalar <code>shared<\/code> dizininde saklan\u0131r ve her yeni s\u00fcr\u00fcme sembolik olarak ba\u011flan\u0131r. Bu sayede hassas veriler g\u00fcvenli bir \u015fekilde y\u00f6netilir ve her da\u011f\u0131t\u0131mda manuel olarak kopyalanmas\u0131na gerek kalmaz.<\/p>\n<h4>Hata Ay\u0131klama<\/h4>\n<p>Da\u011f\u0131t\u0131m s\u0131ras\u0131nda bir sorunla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, Capistrano&#8217;nun log seviyesini art\u0131rarak daha detayl\u0131 bilgi alabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">bundle exec cap production deploy --trace # Detayl\u0131 hata izi\n<h2>veya config\/deploy.rb i\u00e7inde:<\/h2>\n<h2>set :log_level, :debug<\/code><\/pre>\n<\/h2>\n<p>Kar\u015f\u0131la\u015f\u0131lan yayg\u0131n sorunlar aras\u0131nda SSH ba\u011flant\u0131 hatalar\u0131, dosya izinleri sorunlar\u0131, Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n y\u00fcklenememesi veya web sunucusu yap\u0131land\u0131rma hatalar\u0131 bulunur. Hata mesajlar\u0131n\u0131 dikkatlice okuyarak sorunun k\u00f6kenine inebilirsiniz.<\/p>\n<h4>Capistrano Hooks (Kancalar)<\/h4>\n<p>Capistrano, da\u011f\u0131t\u0131m ak\u0131\u015f\u0131n\u0131n farkl\u0131 a\u015famalar\u0131na \u00f6zel g\u00f6revler eklemenizi sa\u011flayan kancalar (hooks) sunar. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><code>before 'deploy:updated', 'my_custom_task'<\/code>: Kod g\u00fcncellenmeden \u00f6nce.<\/li>\n<li><code>after 'deploy:updated', 'my_custom_task'<\/code>: Kod g\u00fcncellendikten ve ba\u011f\u0131ml\u0131l\u0131klar y\u00fcklendikten sonra (migrasyonlar i\u00e7in ideal).<\/li>\n<li><code>after 'deploy:publishing', 'my_custom_task'<\/code>: Yeni s\u00fcr\u00fcm canl\u0131ya ge\u00e7tikten sonra (cache temizli\u011fi, servis restart i\u00e7in ideal).<\/li>\n<\/ul>\n<p>Bu kancalar\u0131 kullanarak uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re da\u011f\u0131t\u0131m s\u00fcrecini \u00f6zelle\u015ftirebilirsiniz.<\/p>\n<h4>S\u0131f\u0131r Kesintiyle Da\u011f\u0131t\u0131m (Zero-Downtime Deployment)<\/h4>\n<p>Capistrano&#8217;nun sembolik ba\u011flant\u0131 mekanizmas\u0131 sayesinde, uygulaman\u0131z\u0131 s\u0131f\u0131r kesintiyle da\u011f\u0131tmak m\u00fcmk\u00fcnd\u00fcr. Yeni s\u00fcr\u00fcm, eski s\u00fcr\u00fcm hala \u00e7al\u0131\u015f\u0131rken haz\u0131rlan\u0131r. T\u00fcm ba\u011f\u0131ml\u0131l\u0131klar kurulur, dosyalar ba\u011flan\u0131r ve her \u015fey haz\u0131r oldu\u011funda, <code>current<\/code> sembolik ba\u011flant\u0131s\u0131 atomik bir \u015fekilde yeni s\u00fcr\u00fcme y\u00f6nlendirilir. Bu i\u015flem genellikle milisaniyeler s\u00fcrd\u00fc\u011f\u00fc i\u00e7in kullan\u0131c\u0131lar herhangi bir kesinti hissetmez.<\/p>\n<p>Ancak, veritaban\u0131 migrasyonlar\u0131 gibi uzun s\u00fcren veya geriye d\u00f6n\u00fck uyumlu olmayan de\u011fi\u015fiklikler, bu s\u0131f\u0131r kesinti vaadini bozabilir. Bu t\u00fcr durumlarda, migrasyonlar\u0131 iki a\u015famal\u0131 da\u011f\u0131t\u0131m stratejileriyle veya blue\/green deployment gibi daha geli\u015fmi\u015f tekniklerle y\u00f6netmek gerekebilir.<\/p>\n<h3>Ubuntu 13 ve G\u00fcncel Uygulamalar \u0130\u00e7in Notlar<\/h3>\n<p>Bu rehber, \u00f6zel olarak Ubuntu 13 \u00fczerinde Capistrano kullan\u0131m\u0131na odaklanm\u0131\u015f olsa da, Ubuntu 13&#8217;\u00fcn art\u0131k g\u00fcncel olmayan bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fc oldu\u011funu belirtmek \u00f6nemlidir. G\u00fcncel Ubuntu s\u00fcr\u00fcmleri (18.04, 20.04, 22.04) ve modern PHP versiyonlar\u0131 (PHP 7.x, PHP 8.x) ile \u00e7al\u0131\u015f\u0131rken baz\u0131 farkl\u0131l\u0131klar olacakt\u0131r:<\/p>\n<ul>\n<li><strong>Servis Y\u00f6netimi:<\/strong> Ubuntu 13&#8217;te servisler genellikle <code>service <name> <command><\/code> (\u00f6rn: <code>service php5-fpm restart<\/code>) ile y\u00f6netilirken, yeni Ubuntu s\u00fcr\u00fcmlerinde <code>systemd<\/code> tabanl\u0131 <code>systemctl <command> <name><\/code> (\u00f6rn: <code>systemctl restart php7.4-fpm<\/code>) kullan\u0131l\u0131r. Capistrano yap\u0131land\u0131rman\u0131zda <code>php_fpm_service<\/code> ad\u0131n\u0131 buna g\u00f6re g\u00fcncellemeniz gerekebilir.<\/li>\n<li><strong>PHP S\u00fcr\u00fcmleri:<\/strong> Ubuntu 13 genellikle PHP 5.x s\u00fcr\u00fcmleriyle gelirken, g\u00fcncel projeler PHP 7.x veya 8.x kullan\u0131r. Paket isimleri (<code>php5-fpm<\/code> yerine <code>php7.4-fpm<\/code> veya <code>php8.1-fpm<\/code>) ve PHP-FPM soket yollar\u0131 farkl\u0131l\u0131k g\u00f6sterecektir.<\/li>\n<li><strong>Paket Y\u00f6neticisi:<\/strong> Temel <code>apt-get<\/code> komutlar\u0131 ayn\u0131 kalsa da, baz\u0131 paket isimleri veya varsay\u0131lan konfig\u00fcrasyonlar de\u011fi\u015fmi\u015f olabilir.<\/li>\n<\/ul>\n<p>Bu farkl\u0131l\u0131klara ra\u011fmen, Capistrano&#8217;nun temel da\u011f\u0131t\u0131m prensipleri, dizin yap\u0131s\u0131, hook&#8217;lar\u0131 ve otomasyon mant\u0131\u011f\u0131 g\u00fcncel sistemlerde de ayn\u0131 \u015fekilde uygulan\u0131r. Bu rehberdeki bilgileri, modern bir Ubuntu ve PHP ortam\u0131na kolayca adapte edebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>PHP uygulama da\u011f\u0131t\u0131m s\u00fcrecini Capistrano ile otomatikle\u015ftirmek, geli\u015ftirme ekiplerine \u00f6nemli avantajlar sa\u011flar. Manuel hatalar\u0131 ortadan kald\u0131r\u0131r, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r, tutarl\u0131l\u0131k sa\u011flar ve geri alma i\u015flemlerini basitle\u015ftirir. Bu rehberde, Ubuntu 13 \u00fczerinde Capistrano&#8217;yu kurmaktan, yap\u0131land\u0131rmaya ve ilk da\u011f\u0131t\u0131m\u0131 ger\u00e7ekle\u015ftirmeye kadar t\u00fcm ad\u0131mlar\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele ald\u0131k.<\/p>\n<p>Capistrano&#8217;nun sundu\u011fu esneklik ve geni\u015fletilebilirlik sayesinde, projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re da\u011f\u0131t\u0131m ak\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirebilir, veritaban\u0131 migrasyonlar\u0131, cache y\u00f6netimi, asset derleme gibi ad\u0131mlar\u0131 kolayca entegre edebilirsiniz. Da\u011f\u0131t\u0131m otomasyonuna yat\u0131r\u0131m yapmak, uzun vadede geli\u015ftirme verimlili\u011finizi art\u0131racak ve operasyonel y\u00fck\u00fcn\u00fcz\u00fc azaltacakt\u0131r. Capistrano, s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) stratejilerinin \u00f6nemli bir par\u00e7as\u0131 olarak, modern yaz\u0131l\u0131m geli\u015ftirme pratiklerinin vazge\u00e7ilmez bir arac\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber\nG\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas","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":[1468],"tags":[],"class_list":{"0":"post-37690","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber - 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\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-12T14:41:14+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\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-12T14:41:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\"},\"wordCount\":2732,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\",\"name\":\"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-12T14:41:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber - 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\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber","og_description":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas","og_url":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-12T14:41:14+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\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-12T14:41:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/"},"wordCount":2732,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/","name":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-12T14:41:14+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/php-uygulama-dagitim-surecini-capistrano-ile-otomatiklestirme-ubuntu-13-uzerinde-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP Uygulama Da\u011f\u0131t\u0131m S\u00fcrecini Capistrano ile Otomatikle\u015ftirme: Ubuntu 13 \u00dczerinde Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37690","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=37690"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37690\/revisions"}],"predecessor-version":[{"id":37691,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37690\/revisions\/37691"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}