Blog

Ruby On Rails Uygulamasının Sıfırdan Sunucuda Yayına Alınması

Merhaba arkadaşlar,
Sizlere Ubuntu-14.04 sunucusunu sıfırdan ayağa kaldırıp, kendi rails uygulamalarınızı sunucuya hızlı bir şekilde aktarabileceğiniz Capistrano uygulamasından bahsedeceğim ve bazı kaynak kodlar paylaşacağım. Kullandığım capistrano’nun versiyonu 3.4’tür. Sunucu üzerinde kullandığım ruby versiyonu ise 2.2.3’tür. Capistrano’nun kaynak kodlarına github adresinden erişip göz atabilirsiniz.  Ben kendi uygulamalarımda sunucu olarak DigitalOcean kullanıyorum. DigitalOcean’dan alacağınız 10 $’lık bir sunucuyu aşşağıda vereceğim bash scriptleri ile 2-3 saat içinde ayağa kaldırıp Nginx, Postgresql, Unicorn ayarlarını yaparak çalışır hale getirebilirsiniz.

Şimdi izliyeceğimiz adımlar gelecek olursak, öncelikle DigitalOcean’dan yeni bir Droplet oluşturuyoruz ve dağıtım olarak Ubuntu 14.04 seçiyoruz.

DigitalOcean-ubuntu-14.04
DigitalOcean-ubuntu-14.04

 

Sunucuda ruby ortamı için temel kurulum scripti aşağıdaki gibidir. Bu script root kullanıcısı olarak bağlanıp çalıştırmalısınız.

  Sunucuda deploy kullanıcısı için kurulum scripti aşağıdaki gibidir. Bu script’ide root kullanıcısı olarak bağlanıp çalıştırmalısınız.

 

Sunucuda deploy kullanıcısı için ruby ortamını hazırlama scripti aşağıdaki gibidir. Bu script deploy kullanıcısı olarak bağlanıp çalıştırmalısınız.

 

Bu scriptler ile sunucunuzu bir rails uygulamasını çalıştıracak duruma getirmiş olursunuz.

Şimdi bir rails uygulaması oluşturup, uygulamayı bir sunucuya aktarma işlemlerini anlatacağım.
Ruby On Rails bildiğiniz ruby dili ile, MVC(Model-View-Controller) mimari deseni ile geliştirilmiş ve bünyesinde DRY(Don’t Repeat Yourself), CoC(Convetion over configuration) gibi yazılım felsefelerini barındıran açık kaynak bir uygulama çatısıdır.

Hızlı bir Ruby On Rails uygulaması çıkarmak istiyorsanız size Cybele ruby gem’ini öneririm. Bu gem bir uygulamada olması gereken kullanıcı giriş, bilgi güncelleme, yönetici tarafına giriş işlemleri gibi her projede kullanacağınız kısımlar hazır bir taslak olarak geliyor. Bu sayede önceden yazdığınız kodları tekrar yazmak zorunda kalmıyorsunuz. Cybele geminin taslak olarak getirdiği Gemfile’ı github adresinden inceleyebilirsiniz. Sunucuya kolay bir şekilde uygulamayı taşımak için kullancağımız gemler bu Gemfile’da yer almaktadır.
Eğer rails new project_name şeklinde sıfırdan bir proje oluşturursanız veya halihazırda bulunan bir projenizi sunucuya taşımak isterseniz, kullanacağım komutlar dizisinin yer aldığı recipes_matic gemini incelemenizi tavsiye ederim.

Ben cybele ile oluşturduğumuz bir proje için bu adımları anlataçağım.

  1. Proje oluştur $ cybele project_name
  2. Deploy repo bilgilerini düzenle /config/deploy.rb
     set :repo_url, 'git@github.com:your_username/your_repo_name.git'
  3. Production deploy bilgilerini düzenle /config/deploy/production.rb
     
    server "example.com", user: "#{fetch(:local_user)}", roles: %w{app db web}, primary: true, port: 22 
    set :rails_env, 'production'
    set :branch, 'master'
    set :project_domain, “example.com” 
    
  4. Staging deploy bilgilerini düzenle /config/deploy/staging.rb
     
    server "staging.example.com", user: "#{fetch(:local_user)}", roles: %w{app db web}, primary: true, port: 22
    set :rails_env, 'staging'
    set :branch, 'develop' 
    set :project_domain, “staging.example.com” 
    
  5. Hata bildirimleri için email adresini düzenle

    config/environments/production.rb
    config/environments/staging.rb

    config.middleware.use ExceptionNotification::Rack,
    :email => {
      :email_prefix => "[project_name]",
      :sender_address => %{"Notifier" <notifier@project_name.com>},
      :exception_recipients => %w{your_email@address.com}
    }
    
  6. Aşağıdaki dosyalarda SMTP ayarlarını ayarla
    config/settings/staging.yml
    config/settings/production.yml
  7. Github da bulunan private repolara lokaldeki gibi erismek icin şu komutları çalıştır

    $ eval `ssh-agent -s`
    $ ssh-add

  8. Gelelim terminalden çalıştırmamız gereken komutlar dizisine,Production sunucusunda ki deploy ortamının hazır olup olmadığını kontrol eder.
    $ bundle exec cap production deploy:check
    Production sunucusunda nginx, postgresql, unicorn, backup(veritabanı yedek alma gemi) gibi ayarları yapar.
    $ bundle exec cap production deploy:prepare
    Production sunucusuna deploy işlemini gerçekleştirir.
    $ bundle exec cap production deploy

 

Örnek dosyalarımızda şu şekilde olmalıdır.
Proje anadizininde bulunan Capfile örneği:

# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/bundler'
require 'sshkit/sudo'
require 'capistrano/maintenance'

# Include tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails
#   https://github.com/capistrano/passenger
#
# require 'capistrano/rvm'
# require 'capistrano/rbenv'
# require 'capistrano/chruby'
# require 'capistrano/bundler'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'
# require 'capistrano/passenger'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

Proje config dizininde bulunan deploy.rb örneği:

# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'appname'
set :local_user, 'deploy'
set :stages, %w(staging production)
set :default_stage, 'production'
set :repo_url, "git@github.com:username/#{fetch(:application)}.git"

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/blog2
set :deploy_to, "/home/#{fetch(:local_user)}/apps/#{fetch(:application)}"

# Default value for :scm is :git
set :scm, :git

# Default value for :format is :pretty
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
set :pty, true

# Default value for :linked_files is []
set :linked_files, fetch(:linked_files, []).push('config/database.yml')

# Default value for linked_dirs is []
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/upload', 'public/images', 'public/seat_images')

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
set :default_env, { path: '$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH' }

# Default value for keep_releases is 5
# set :keep_releases, 5

# Look our recipes
# https://github.com/lab2023/recipes_matic
load 'config/deploy/recipes/base.rb'

Umarım faydalı bir yazı olmuştur.
Kolay gelsin..


Posted

in

by

Comments

4 responses to “Ruby On Rails Uygulamasının Sıfırdan Sunucuda Yayına Alınması”

  1. enesphp Avatar

    Hocam benim bir linux hostingim var sınırsız hosting paketi o hostinge bir sub açıp o subta ruby dosyaları çalıştırma imkanım var mı ya da bana önerebileceğiniz bir yöntem var mı

    1. ismail Avatar
      ismail

      Merhaba Enes,

      Ruby dosyanda içerik olarak ne var bilmiyorum bu yüzden net bir cevap veremeyeceğim. Eğer yazdığın kod bir web uygulaması ise ve bunu bir IP adresinden yayına almak istiyorsan şu linklere göz atmanda fayda var:
      http://puma.io
      https://rack.github.io

  2. Turan TÜRK Avatar

    Hocam root yetkisi olmadan çalışmıyor mu sitenin modaretörüyüm kuramaz mıyım

    1. ismail Avatar
      ismail

      Merhaba turan, gerekli paketlerin kurulumu için root olman gerekiyor. Kullandığın sistemin alternatif yöntemleri olabilir araştırmanda fayda var.

Leave a Reply

Your email address will not be published. Required fields are marked *