Takip et

Capistrano ile Otomatik Dağıtımlar: Başlangıç Rehberi

Capistrano ile Otomatik Dağıtımlar: Başlangıç Rehberi Yazılım geliştirme sürecinin en kritik ve çoğu zaman en stresli aşamalarından bir

Capistrano ile Otomatik Dağıtımlar: Başlangıç Rehberi

Yazılım geliştirme sürecinin en kritik ve çoğu zaman en stresli aşamalarından biri, geliştirilen kodu canlı sunuculara dağıtmaktır. Manuel dağıtım süreçleri, insan hatasına açık olmasının yanı sıra, zaman alıcı ve tekrarlayıcı görevler içerir. Bu durum, özellikle büyük ve karmaşık uygulamalar veya sık güncellemeler gerektiren projeler için ciddi sorunlara yol açabilir. İşte tam bu noktada, otomatik dağıtım araçları devreye girerek bu süreci kolaylaştırır, hızlandırır ve hataları minimize eder. Capistrano, bu alanda öne çıkan güçlü ve esnek bir otomasyon aracıdır.

Bu makalede, Capistrano’nun ne olduğunu, neden kullanmanız gerektiğini, kurulumunu, temel yapılandırmasını ve ilk dağıtımınızı nasıl gerçekleştireceğinizi adım adım ele alacağız. Amacımız, Capistrano’yu kullanarak dağıtım süreçlerinizi otomatikleştirme yolculuğunuza sağlam bir başlangıç yapmanızı sağlamaktır.

Capistrano Nedir ve Neden Kullanmalısınız?

Capistrano, Ruby tabanlı, SSH üzerinden uzak sunuculara kod dağıtımı ve komut çalıştırma için tasarlanmış açık kaynaklı bir otomasyon aracıdır. Başlangıçta Ruby on Rails uygulamaları için geliştirilmiş olsa da, esnek yapısı sayesinde PHP, Node.js, Python gibi farklı teknolojilerle yazılmış uygulamaların dağıtımında da kullanılabilir.

Capistrano’nun Temel Özellikleri ve Avantajları:

* Tekrarlanabilirlik ve Tutarlılık: Capistrano, dağıtım adımlarını kod olarak tanımlamanızı sağlar. Bu sayede her dağıtım, aynı adımları tutarlı bir şekilde takip eder ve manuel hataları ortadan kaldırır.
* Hız ve Verimlilik: Otomatikleştirilmiş dağıtım süreçleri, manuel işlemlere göre çok daha hızlıdır. Bu, geliştiricilerin daha sık ve güvenli bir şekilde dağıtım yapmasına olanak tanır.
* Geri Alma (Rollback) Yeteneği: Bir dağıtım sırasında veya sonrasında bir sorunla karşılaşıldığında, Capistrano tek bir komutla uygulamanızı önceki çalışan sürüme geri döndürme yeteneği sunar. Bu, olası kesintileri en aza indirir.
* Çoklu Sunucu Desteği: Capistrano, aynı anda birden fazla sunucuya (örneğin, birden fazla web sunucusu, veritabanı sunucusu) dağıtım yapabilir ve her sunucuda belirli rollere (app, web, db) göre farklı görevler çalıştırabilir.
* Esneklik ve Genişletilebilirlik: Capistrano, özel görevler (tasks) tanımlamanıza ve mevcut görevleri genişletmenize olanak tanır. Bu sayede projenizin özel ihtiyaçlarına göre dağıtım sürecini tamamen özelleştirebilirsiniz.
* Zero-Downtime Dağıtımlar: Doğru yapılandırma ile Capistrano, uygulamanızın kesintiye uğramadan yeni sürüme geçiş yapmasını sağlayabilir. Bu, kullanıcı deneyimini olumsuz etkilemez.
* Git Entegrasyonu: Kaynak kodu yönetimi için Git ile derinlemesine entegrasyon sağlar, bu da belirli bir branch’ten veya commit’ten dağıtım yapmayı kolaylaştırır.

Kısacası, Capistrano, dağıtım sürecini bir angarya olmaktan çıkarıp, güvenilir, hızlı ve yönetilebilir bir parçası haline getirir.

Ön Koşullar ve Kurulum

Capistrano’yu kullanmaya başlamadan önce geliştirme ortamınızda ve hedef sunucularınızda bazı temel gereksinimlerin karşılanması gerekmektedir.

Geliştirme Ortamı İçin Ön Koşullar:

1. Ruby: Capistrano, Ruby ile yazılmıştır, bu nedenle yerel makinenizde Ruby’nin kurulu olması gerekir. Ruby versiyon yöneticileri (RVM veya rbenv) kullanmanız şiddetle tavsiye edilir.
2. Bundler: Ruby projeleri için bağımlılık yöneticisidir. gem install bundler komutu ile kurabilirsiniz.
3. Git: Uygulamanızın kaynak kodunu yöneteceğiniz Git’in kurulu olması gerekir.
4. SSH Anahtarları: Uzak sunuculara şifresiz ve güvenli bir şekilde bağlanabilmek için SSH anahtar çifti (public/private key pair) oluşturmuş olmanız ve public anahtarınızın hedef sunuculardaki ~/.ssh/authorized_keys dosyasına eklenmiş olması gerekir. SSH agent forwarding kullanmak, dağıtım sırasında Git depolarına erişim için de faydalıdır.

Uzak Sunucular İçin Ön Koşullar:

1. SSH Erişimi: Dağıtım yapacağınız sunucuya SSH üzerinden erişiminizin olması gerekir.
2. Git: Sunucuda Git kurulu olmalıdır, çünkü Capistrano kodu Git deposundan çekecektir.
3. Uygulama Çalışma Ortamı: Uygulamanızın gerektirdiği çalışma zamanı (örneğin, Ruby, Node.js, Python, PHP), veritabanı sunucusu (PostgreSQL, MySQL), web sunucusu (Nginx, Apache) ve diğer bağımlılıklar sunucuda kurulu ve yapılandırılmış olmalıdır.
4. Kullanıcı İzinleri: Dağıtım yapacak SSH kullanıcısının, deploy_to dizinine yazma ve uygulama dosyalarını yönetme izinlerine sahip olması gerekir.

Capistrano Kurulumu:

Capistrano’yu projenize dahil etmek için genellikle Bundler kullanılır.

1. Gemfile’a Ekleme: Projenizin Gemfile dosyasına Capistrano gem’lerini ekleyin. Eğer bir Rails uygulaması dağıtıyorsanız, capistrano-rails gem’ini de eklemeniz önerilir. Bu gem, Rails’e özgü görevleri (örneğin, assets:precompile, db:migrate) otomatik olarak sağlar.

# Gemfile
    group :development do
      gem 'capistrano', '~> 3.17'
      gem 'capistrano-rvm', '~> 0.1.0' # Eğer RVM kullanıyorsanız
      gem 'capistrano-rails', '~> 1.7' # Eğer Rails uygulaması ise
      gem 'capistrano-passenger', '~> 0.2.0' # Eğer Passenger kullanıyorsanız
      # Diğer capistrano eklentileri...
    end

2. Bağımlılıkları Yükleme: Terminalde projenizin kök dizininde aşağıdaki komutu çalıştırarak gem’leri yükleyin:

bundle install

3. Capistrano Projesini Başlatma: Capistrano’nun temel yapılandırma dosyalarını oluşturmak için aşağıdaki komutu çalıştırın:

bundle exec cap install

Bu komut, projenizin kök dizininde Capfile ve config/deploy.rb, config/deploy/staging.rb, config/deploy/production.rb gibi dosyaları oluşturacaktır.

Capistrano Proje Yapısı

bundle exec cap install komutu, Capistrano’nun çalışması için gerekli temel dizin ve dosya yapısını oluşturur:

* Capfile: Bu dosya, Capistrano’nun ana yapılandırma dosyasıdır. Capistrano’nun çekirdek özelliklerini, kullanılan eklentileri (örneğin, capistrano-rails, capistrano-rvm) ve özel görevleri yükler. Genellikle bu dosyada çok fazla değişiklik yapmanız gerekmez, ancak hangi eklentilerin yüklendiğini kontrol etmek için önemlidir.

# Capfile
    # Load DSL and set up stages
    require "capistrano/setup"

    # Include default deployment tasks
    require "capistrano/deploy"

    # Load the Rails integration
    require "capistrano/rails"
    require "capistrano/passenger" # Eğer eklediyseniz
    require "capistrano/rvm"       # Eğer eklediyseniz

    # Load custom tasks from lib/capistrano/tasks
    Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

* config/deploy.rb: Bu dosya, tüm dağıtım ortamları (staging, production vb.) için geçerli olan genel Capistrano ayarlarını içerir. Uygulama adı, Git deposu URL’si, dağıtım yolu, paylaşılan dosyalar/dizinler gibi temel yapılandırmalar burada tanımlanır.

* config/deploy/.rb: Bu dizin altında, her bir dağıtım ortamı için ayrı yapılandırma dosyaları bulunur (örneğin, config/deploy/production.rb, config/deploy/staging.rb). Bu dosyalar, ortam özelinde sunucu tanımlamalarını, branch adlarını veya diğer değişkenleri içerir.

* lib/capistrano/tasks/: Bu dizin, projenize özel Capistrano görevlerini (custom tasks) tanımlayabileceğiniz yerdir. Örneğin, dağıtım sonrası bir önbelleği temizleme veya bir arka plan işçisini yeniden başlatma gibi özel adımlar için burada .rake uzantılı dosyalar oluşturabilirsiniz.

Temel Dağıtım Ayarları (config/deploy.rb)

config/deploy.rb dosyası, Capistrano dağıtımınızın kalbidir. Burada uygulamanızın temel davranışlarını ve dağıtım sürecinin nasıl işleyeceğini belirlersiniz.

# config/deploy.rb

Uygulamanızın adı (genellikle proje klasör adı)

set :application, "my_awesome_app"

Git deponuzun URL'si

set :repo_url, "git@github.com:kullanici_adi/my_awesome_app.git" # veya https://...

Uygulamanızın uzak sunucuda dağıtılacağı yol

Bu yol altında releases, current, shared dizinleri oluşur.

set :deploy_to, "/var/www/my_awesome_app"

Git'ten çekilecek varsayılan branch (ortama özel dosyalarda override edilebilir)

set :branch, "main"

Capistrano'nun log seviyesi (örneğin, :debug, :info, :warn, :error)

set :log_level, :info

SSH agent forwarding'i etkinleştir. Bu, dağıtım yapan makinedeki SSH anahtarlarının

uzak sunucuya iletilmesini sağlar, böylece uzak sunucu Git deposuna erişebilir.

set :ssh_options, { forward_agent: true, auth_methods: %w(publickey) }

Dağıtım sırasında sembolik olarak bağlanacak dosyalar.

Bu dosyalar shared/config/ dizininde bulunur ve her release'e bağlanır.

Hassas bilgileri (veritabanı şifreleri, API anahtarları) buraya koyun.

set :linked_files, %w{config/database.yml config/secrets.yml config/master.key}

Dağıtım sırasında sembolik olarak bağlanacak dizinler.

Bu dizinler shared/ dizininde bulunur ve her release'e bağlanır.

Loglar, yüklenen dosyalar, gem'ler gibi değişen verileri buraya koyun.

set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}

Kaç adet eski release'in tutulacağını belirler.

Eski sürümler, geri alma (rollback) için saklanır.

set :keep_releases, 5

Eğer RVM kullanıyorsanız:

set :rvm_type, :user # veya :system

set :rvm_ruby_version, '3.1.2' # Uygulamanızın kullandığı Ruby versiyonu

Eğer rbenv kullanıyorsanız:

set :rbenv_type, :user # veya :system

set :rbenv_ruby, '3.1.2'

Varsayılan olarak Capistrano, bundle install komutunu çalıştırır.

Eğer farklı bir bundler yolu veya versiyonu kullanıyorsanız:

set :bundle_path, nil

set :bundle_flags, '--deployment --quiet'

Önemli Ayarların Açıklaması:

* set :application, "...": Uygulamanızın adını tanımlar. Bu isim, sunucudaki dizin yapısında ve Capistrano görevlerinde kullanılır.
* set :repo_url, "...": Uygulamanızın Git deposunun URL’si. SSH formatını (örn. git@github.com:user/repo.git) kullanmanız, SSH agent forwarding ile daha güvenli ve pratik olacaktır.
* set :deploy_to, "...": Uygulamanızın uzak sunucuda dağıtılacağı ana dizin. Capistrano bu dizin altında releases, current, shared gibi alt dizinler oluşturur.
* releases/: Her başarılı dağıtım, buraya yeni bir zaman damgalı dizin olarak kaydedilir.
* current/: Her zaman en son başarılı dağıtımın releases içindeki dizinine işaret eden sembolik bir linktir. Web sunucunuz bu dizini işaret etmelidir.
* shared/: Dağıtımlar arasında kalıcı olması gereken dosyalar ve dizinler (örneğin, database.yml, log dosyaları, yüklenen resimler) burada tutulur.
* set :linked_files, %w{...}: Dağıtımlar arasında değişmeyen ancak her release’in erişmesi gereken hassas veya ortama özel dosyaları belirtir. Bu dosyalar shared/config/ altında saklanır ve her yeni release’e sembolik olarak bağlanır. Bu dosyaları Git deposuna eklemeyin!
* set :linked_dirs, %w{...}: linked_files‘a benzer şekilde, dağıtımlar arasında kalıcı olması gereken dizinleri belirtir. Örneğin, log dizini, tmp dizini veya kullanıcıların yüklediği dosyaların bulunduğu public/uploads gibi dizinler shared/ altında saklanır ve her yeni release’e bağlanır.
* set :keep_releases, 5: Sunucuda kaç adet eski başarılı dağıtımın tutulacağını belirler. Bu sayede, sorun yaşandığında kolayca geri alma (rollback) yapabilirsiniz.

Ortama Özel Ayarlar (config/deploy/production.rb ve config/deploy/staging.rb)

Farklı dağıtım ortamları (örneğin, test için staging, canlı sistem için production) için farklı sunuculara, Git branch’lerine veya diğer ayarlara sahip olabilirsiniz. Bu ayarları config/deploy dizini altındaki ortama özel dosyalarda tanımlarsınız.

#### config/deploy/staging.rb Örneği:

# config/deploy/staging.rb

Staging ortamı için kullanılacak Git branch'i

set :branch, "develop"

Dağıtım yapılacak sunucu(lar)

server 'IP_ADRESI_VEYA_HOST_ADI', user: 'SSH_KULLANICI_ADI', roles: %w{web app db}, ssh_options: { port: 22 }

server 'staging.example.com', user: 'deploy', roles: %w{app web db}, primary: true

Birden fazla sunucu varsa:

server 'staging-db.example.com', user: 'deploy', roles: %w{db}

#### config/deploy/production.rb Örneği:

# config/deploy/production.rb

Production ortamı için kullanılacak Git branch'i

set :branch, "main"

Dağıtım yapılacak sunucu(lar)

server 'production.example.com', user: 'deploy', roles: %w{app web db}, primary: true

server 'production-worker.example.com', user: 'deploy', roles: %w{app worker}

Sunucu Tanımlamaları:

* server 'host_adı', user: 'kullanıcı_adı', roles: %w{role1 role2}, primary: true:
* host_adı: Sunucunun IP adresi veya alan adı.
* user: SSH ile bağlanılacak kullanıcı adı. Bu kullanıcının deploy_to dizinine yazma izni olmalıdır.
* roles: Sunucuya atanan roller. Capistrano, belirli rollere sahip sunucularda belirli görevleri çalıştırabilir (örneğin, db rolüne sahip sunucuda db:migrate çalıştırmak). Ortak roller web, app, db, worker‘dır.
* primary: true: Bu rol için birincil sunucuyu belirtir. Örneğin, db rolü için yalnızca birincil sunucuda db:migrate çalıştırılır.

İlk Dağıtımı Gerçekleştirme

Tüm yapılandırmaları yaptıktan sonra, ilk dağıtımınızı gerçekleştirmeye hazırsınız.

Dağıtım Öncesi Hazırlıklar:

1. SSH Anahtarlarını Ayarlama: Geliştirme makinenizdeki SSH public anahtarınızın (~/.ssh/id_rsa.pub), uzak sunucudaki dağıtım kullanıcısının ~/.ssh/authorized_keys dosyasına eklendiğinden emin olun.
2. linked_files İçin Dosyaları Oluşturma: config/deploy.rb içinde linked_files olarak belirttiğiniz dosyaların (örneğin, config/database.yml, config/secrets.yml) shared/config/ dizininde veya ilk dağıtımdan önce manuel olarak oluşturulması gerekir. Capistrano, bu dosyaların varlığını kontrol eder ve eksikse hata verir.
* Uzak sunucuda deploy_to dizinine gidin.
* mkdir -p shared/config
* touch shared/config/database.yml
* touch shared/config/secrets.yml
* Bu dosyalara doğru içeriği ekleyin. Örneğin:

# /var/www/my_awesome_app/shared/config/database.yml
        production:
          adapter: postgresql
          encoding: unicode
          database: my_awesome_app_production
          pool: 5
          username: deploy
          password: your_db_password
          host: localhost

3. Uzak Sunucuda Bağımlılıkları Kurma: Uygulamanızın çalışması için gerekli tüm yazılımların (örneğin, Ruby, Node.js, veritabanı istemcileri) sunucuda kurulu ve doğru yapılandırılmış olduğundan emin olun.

Dağıtım Komutları:

Terminalde projenizin kök dizininde aşağıdaki komutları çalıştırarak dağıtım yapabilirsiniz:

1. Dağıtım Kontrolü: Dağıtıma başlamadan önce Capistrano’nun tüm gereksinimleri (SSH bağlantısı, Git deposu erişimi, dizin izinleri vb.) kontrol etmesini sağlayın.

bundle exec cap production deploy:check

Eğer bir sorun varsa, bu komut size yol gösterecektir.

2. İlk Kurulum (İsteğe Bağlı): Genellikle deploy komutu ilk kurulumu otomatik olarak yapar. Ancak isterseniz dizin yapısını manuel olarak oluşturmak için deploy:setup komutunu kullanabilirsiniz:

bundle exec cap production deploy:setup

3. Dağıtımı Başlatma: Asıl dağıtım komutu budur. Capistrano, deploy.rb ve production.rb dosyalarındaki ayarlara göre tüm adımları otomatik olarak gerçekleştirecektir.

bundle exec cap production deploy

Komut çalışırken Capistrano’nun adımlarını terminalde göreceksiniz: Git deposundan kodu çekme, bağımlılıkları yükleme, asset’leri derleme (Rails için), sembolik linkleri oluşturma, uygulama sunucusunu yeniden başlatma vb.

Dağıtım Akışı (Capistrano’nun Adımları):

Capistrano’nun deploy görevi çalıştırıldığında, arka planda bir dizi önceden tanımlanmış alt görevi belirli bir sırayla çalıştırır:

1. deploy:starting: Dağıtım başlamadan önce çalışır.
2. deploy:check: SSH bağlantısını, Git deposu erişimini, deploy_to dizinini ve linked_files varlığını kontrol eder.
3. git:check: Git deposunun erişilebilirliğini kontrol eder.
4. deploy:updating: Git deposundan kodu çeker ve releases/ dizinine yeni bir release oluşturur.
5. deploy:symlink:release: Yeni release dizinine sembolik link oluşturur.
6. deploy:publishing: linked_files ve linked_dirs‘ı yeni release’e bağlar.
7. deploy:finished: Dağıtım tamamlandıktan sonra çalışır, genellikle uygulama sunucusunu yeniden başlatma gibi adımları içerir.
8. deploy:cleanup: keep_releases ayarına göre eski release’leri temizler.

Bu adımların arasında, capistrano-rails gibi eklentiler kendi özel görevlerini (örneğin, rails:assets:precompile, rails:db:migrate) uygun yerlere enjekte eder.

Dağıtım Sonrası:

Dağıtım başarıyla tamamlandığında, web tarayıcınızdan uygulamanızın alan adını ziyaret ederek yeni sürümün doğru şekilde çalıştığını doğrulayın. Herhangi bir sorunla karşılaşırsanız, sunucudaki log dosyalarını (deploy_to/shared/log/production.log gibi) kontrol edin.

Capistrano Görevleri (Tasks) ve Özelleştirme

Capistrano, uygulamanızın yaşam döngüsünü yönetmek için bir dizi yerleşik görev sunar ve aynı zamanda kendi özel görevlerinizi tanımlamanıza olanak tanır.

Yerleşik Görevler:

* bundle exec cap production deploy:rollback: Uygulamayı bir önceki başarılı dağıtıma geri döndürür. Bu, bir sorun çıktığında hızlı bir kurtarma mekanizmasıdır.
* bundle exec cap production deploy:cleanup: keep_releases ayarına göre eski release’leri temizler.
* bundle exec cap production invoke STAGES=production TASK="rake db:seed": Uzak sunucuda belirli bir rake görevini çalıştırır. (Rails uygulamaları için)
* bundle exec cap production rails:console: Uzak sunucuda Rails konsolunu açar. (Rails uygulamaları için)
* bundle exec cap production passenger:restart: Passenger uygulama sunucusunu yeniden başlatır. (Capistrano-Passenger eklentisi ile)

Bu görevleri bundle exec cap -T komutu ile listeleyebilir ve açıklamalarını görebilirsiniz.

Özel Görevler Oluşturma:

Dağıtım sürecinize özel adımlar eklemeniz gerekebilir. Örneğin, bir önbelleği temizlemek, arka plan işçilerini yeniden başlatmak veya bir bildirim göndermek. Bu tür görevleri lib/capistrano/tasks/ dizini altında .rake uzantılı dosyalar oluşturarak tanımlayabilirsiniz.

Örnek: lib/capistrano/tasks/custom.rake

# lib/capistrano/tasks/custom.rake

namespace :my_app do
  desc "Clears the application cache"
  task :clear_cache do
    on roles(:app) do
      # Uygulamanızın kök dizininde (current/) komutu çalıştırır
      within release_path do
        execute :bundle, :exec, :rails, 'cache:clear' # Rails için örnek
        # veya execute :php, 'artisan cache:clear' # Laravel için örnek
      end
    end
  end

  desc "Restarts background workers"
  task :restart_workers do
    on roles(:worker) do # Sadece 'worker' rolüne sahip sunucularda çalışır
      execute :sudo, :systemctl, :restart, 'my_worker.service' # systemd kullanan bir örnek
    end
  end
end

Bir görevi başka bir Capistrano görevine bağlama

deploy:published görevi bittikten hemen sonra önbelleği temizle

after 'deploy:published', 'my_app:clear_cache'

deploy:reverted görevi bittikten sonra işçileri yeniden başlat

after 'deploy:reverted', 'my_app:restart_workers'

Bu örnekte:

* namespace :my_app do ... end: Görevlerinizi bir ad alanı altında gruplandırır.
* desc "...": Görev için bir açıklama sağlar.
* task :clear_cache do ... end: my_app:clear_cache adında bir görev tanımlar.
* on roles(:app) do ... end: Bu görevin sadece app rolüne sahip sunucularda çalışacağını belirtir. on roles(:all) tüm sunucularda çalıştırır.
* within release_path do ... end: Komutun o anki release dizini içinde çalıştırılmasını sağlar.
* execute :command, 'arg1', 'arg2': Uzak sunucuda bir komut çalıştırır. sudo, rake, bundle gibi komutlar genellikle execute ile kullanılır.
* after 'deploy:published', 'my_app:clear_cache': deploy:published görevi tamamlandıktan sonra my_app:clear_cache görevinin otomatik olarak çalışmasını sağlar. before da kullanabilirsiniz.

Bu sayede, dağıtım sürecinizi uygulamanızın özel gereksinimlerine göre tamamen otomatikleştirebilirsiniz.

Sıkça Karşılaşılan Sorunlar ve Çözümleri

Capistrano ile çalışırken karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:

1. SSH Bağlantı Sorunları:
* Hata: Net::SSH::AuthenticationFailed veya Permission denied (publickey).
* Çözüm: SSH anahtarlarınızın doğru şekilde oluşturulduğundan, public anahtarınızın sunucudaki ~/.ssh/authorized_keys dosyasına eklendiğinden ve doğru izinlere (chmod 600 ~/.ssh/authorized_keys) sahip olduğundan emin olun. ssh-add ile anahtarınızı SSH agent’a ekleyin ve set :ssh_options, { forward_agent: true } ayarını kontrol edin. user ve port ayarlarının doğru olduğundan emin olun.
2. Git Klonlama Hataları:
* Hata: Host key verification failed veya Repository not found.
* Çözüm: repo_url‘nin doğru olduğundan emin olun. SSH anahtarınızın Git deposuna erişim izni olduğundan emin olun (örneğin, GitHub’da SSH anahtarınızın kayıtlı olması). ssh-add ve forward_agent ayarlarını tekrar kontrol edin.
3. Bağımlılık Sorunları (Gem’ler, Node Modülleri vb.):
* Hata: bundle install veya npm install sırasında hatalar.
* Çözüm: Sunucuda gerekli çalışma zamanlarının (Ruby, Node.js) ve geliştirme araçlarının (build-essential, make) kurulu olduğundan emin olun. linked_dirs içinde vendor/bundle veya node_modules gibi dizinlerin olduğundan emin olun. Ruby versiyon yönetimi (RVM/rbenv) ayarlarını (capistrano-rvm veya capistrano-rbenv gem’leri ile) kontrol edin.
4. linked_files veya linked_dirs Hataları:
* Hata: No such file or directory veya Symlink failed.
* Çözüm: shared/config/ altında linked_files olarak belirttiğiniz dosyaların (örneğin, database.yml) ve shared/ altında linked_dirs olarak belirttiğiniz dizinlerin (örneğin, public/uploads) var olduğundan ve doğru izinlere sahip olduğundan emin olun. İlk dağıtımdan önce bu dosyaları ve dizinleri manuel olarak oluşturmanız gerekebilir.
5. Uygulama Başlatma/Durdurma Sorunları:
* Hata: Dağıtım başarılı görünüyor ancak uygulama çalışmıyor.
* Çözüm: Uygulama sunucunuzun (Nginx, Apache, Puma, Passenger) doğru şekilde yapılandırıldığından ve current dizinini işaret ettiğinden emin olun. Sunucudaki uygulama loglarını (shared/log/production.log) ve web sunucusu loglarını kontrol edin. Capistrano’nun ilgili uygulama sunucusu eklentilerini (örneğin, capistrano-passenger) kullandığınızdan emin olun.
6. İzin Sorunları:
* Hata: Permission denied mesajları.
* Çözüm: Dağıtım yapan SSH kullanıcısının deploy_to dizinine ve altındaki tüm dosyalara/dizinlere yazma ve okuma izinlerine sahip olduğundan emin olun. chown ve chmod komutlarını kullanarak gerekli izinleri ayarlayın.

Sorun giderme sürecinde, set :log_level, :debug ayarını config/deploy.rb dosyasına ekleyerek Capistrano’nun daha ayrıntılı loglar üretmesini sağlayabilirsiniz. Bu, hatanın kaynağını bulmanıza yardımcı olacaktır.

İleri Seviye Konulara Bakış

Bu makale Capistrano’ya bir başlangıç rehberi olsa da, aracın yetenekleri çok daha geniştir. İşte Capistrano ile yapabileceğiniz bazı ileri seviye konular:

* Çoklu Sunucu Dağıtımları: Birden fazla web sunucusu veya farklı rollerdeki sunuculara (örneğin, ayrı bir veritabanı sunucusu, ayrı bir worker sunucusu) aynı anda dağıtım yapmak.
* Zero-Downtime Dağıtımlar: Uygulamanızın yeni sürüme geçerken hiç kesintiye uğramamasını sağlamak için gelişmiş teknikler (örneğin, Nginx’in upstream bloklarını dinamik olarak güncelleme).
* Veritabanı Göçleri (Migrations): Veritabanı şemasında değişiklikler gerektiren dağıtımlar için capistrano-rails‘in db:migrate görevini kullanmak ve bunu güvenli bir şekilde yönetmek.
* Uygulama ve Web Sunucusu Entegrasyonları: Puma, Unicorn, Passenger gibi uygulama sunucuları ile Nginx, Apache gibi web sunucularının Capistrano ile entegrasyonu için özel görevler ve eklentiler kullanmak.
* Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) Boru Hatları: Jenkins, GitLab CI, GitHub Actions gibi CI/CD araçları ile Capistrano’yu birleştirerek, kod her push edildiğinde otomatik olarak testlerin çalıştırılması ve başarılı testler sonrası dağıtımın tetiklenmesi.
* Özel Komutlar ve Görevler: Uygulamanıza özel bakım görevleri, veri senkronizasyonları veya cron işleri için Capistrano görevleri oluşturmak.

Bu konular, Capistrano’yu dağıtım stratejinizin merkezi bir parçası haline getirmenize yardımcı olacaktır.

Sonuç

Capistrano, yazılım dağıtım süreçlerinizi otomatikleştirerek geliştiricilerin hayatını önemli ölçüde kolaylaştıran güçlü ve güvenilir bir araçtır. Bu makalede, Capistrano’nun ne olduğundan, neden kullanılması gerektiğine, kurulumundan temel yapılandırmasına ve ilk dağıtımınızı nasıl gerçekleştireceğinize kadar kapsamlı bir başlangıç rehberi sunduk.

Dağıtım otomasyonuna yatırım yapmak, sadece zaman tasarrufu sağlamakla kalmaz, aynı zamanda manuel hataları azaltır, tutarlılığı artırır ve geliştirme ekibinizin daha hızlı ve güvenli bir şekilde ürün sunmasına olanak tanır. Capistrano ile bu yolculuğa sağlam bir başlangıç yaparak, dağıtım süreçlerinizi daha verimli ve keyifli hale getirebilirsiniz. Unutmayın, pratik yapmak ve belgeleri incelemek, Capistrano’da ustalaşmanın anahtarıdır. Başarılar dileriz!

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.