среда, 2 февраля 2011 г.

Заиливаем сайт на locum.ru с использованием Capistrano

1) заходим в папку проекта на локальном компьютере.

2) выполняем команду "capify ."

3) содержимое файла "проект/config/deploy.rb" меняем на, попутно не забыв поменять специфичные для проекта и аккаунта на locum.ru данные:


#========================================
#========================================

# _your_login_ - Поменять на ваш логин в панели управления
# _your_project_ - Поменять на имя вашего проекта
# _your_server_ - Поменять на имя вашего сервера (Указано на вкладке "FTP и SSH" вашей панели управления)
# set :repository - Установить расположение вашего репозитория
# У вас должна быть настроена авторизация ssh по сертификатам

set :application, "aaa"
set :repository,  "file:///home/trololo/megaproject"


set :deploy_via, :copy

dpath = "/home/hosting_your_login/projects/_your_project_"

set :user, "hosting_your_login"
set :use_sudo, false
set :deploy_to, dpath

set :scm, :git

role :web, "_your_server_.locum.ru"                          # Your HTTP server, Apache/etc
role :app, "_your_server_.locum.ru"                          # This may be the same as your `Web` server
role :db,  "_your_server_.locum.ru", :primary => true # This is where Rails migrations will run

after "deploy:update_code", :copy_database_config

task :copy_database_config, roles => :app do
  db_config = "#{shared_path}/database.yml"
  run "cp #{db_config} #{release_path}/config/database.yml"
end

set :unicorn_rails, "/var/lib/gems/1.8/bin/unicorn_rails"
set :unicorn_conf, "/etc/unicorn/_your_project_._your_login_.rb"
set :unicorn_pid, "/var/run/unicorn/_your_project_._your_login_.pid"

# - for unicorn - #
namespace :deploy do
  desc "Start application"
  task :start, :roles => :app do
    run "#{unicorn_rails} -Dc #{unicorn_conf}"
  end

  desc "Stop application"
  task :stop, :roles => :app do
    run "[ -f #{unicorn_pid} ] && kill -QUIT `cat #{unicorn_pid}`"
  end

  desc "Restart Application"
  task :restart, :roles => :app do
    run "[ -f #{unicorn_pid} ] && kill -USR2 `cat #{unicorn_pid}` || #{unicorn_rails} -Dc #{unicorn_conf}"
  end
end



#========================================
#========================================


4) выполняем команды:

git init
git add.
git commit -m "new app"

5) выполнить команду:

cap deploy:setup

данная команда только создаст на сервере необходимую структуру каталогов.

6) создать файл database.yml в папке "~/projects/megaproject/shared" на сервере и поменять на специфичную для сервера конфигурацию базы данных. Это файл будет использовать всякий раз, как вы будете обновлять свой код на сервере. Он будет автоматичеси затирать файл, используемый на вашем локальном компьютере.

7) выполняем команду:

cap deploy
или
cap deploy:update_code

данная команда зальет ваш проект на locum.ru и поменяет файл database.yml на файл, залитый на сервер на предыдущем шаге.

8) радуемся.

ЗЫ  данный файл deploy.rb отличается от файла с сайта locum.ru двумя строчками:

set :repository,  "file:///home/trololo/megaproject"
set :deploy_via, :copy

перая строчка - директория локального проекта, а не сервер.
вторая сторчка указывает стратегию обновления: проект архивируется, отправляется на сервер и обрабатывается на нем.

6 комментариев:

  1. Анатолий, подскажите, что значит "поменять на специфичную для сервера конфигурацию базы данных"?
    Это значит, что в настройках необходимо сменить имя базы данных на ту, которая была создана locum.ru?

    ОтветитьУдалить
  2. Подскажите еще пожалуйста, или приведите пример, как правильно написать set :repository, "file:///home/trololo/megaproject" в реальной ситуации?
    Имя должно начинаться именно со слова file и необходимы именно три слэша?
    Например у меня на локальном компьютере сайт хранится в папке vs/sites/rails_projects/site
    В этом случае правильно будет написать:
    set :repository, "file:///vs/sites/rails_projects/site"

    Верно?

    ОтветитьУдалить
  3. > Это значит, что в настройках необходимо сменить имя базы данных на ту, которая была создана locum.ru?

    Ну да. Там ведь когда создаешь БД в панели управления, ей назначется определенный хост, имя пользователя, имя БД и пароль (который сам задешь).
    И повторюсь, это должно быть в файле database.yml в папке shared, которая лежит на сервере.
    Но вообще если у себя на компьютере не используешь production для тестирования, можешь использовать только свой файл database.yml который находится в папке config своего проекта. Для этого надо в файле deploy.rb закомментировать строчку:

    after "deploy:update_code", :copy_database_config

    которая отвечает за копирование, после обновления кода на сервере.


    > В этом случае правильно будет написать:
    > set :repository, "file:///vs/sites/rails_projects/site"

    Надо путь до проекта указать. У меня под линуксом так работает (хотя скорее всего работает и без слова file в начале, не проверял). Если работаешь в винде, думаю, должно быть что-то типа такого:

    set :repository, "c:/vs/sites/rails_projects/site"

    ОтветитьУдалить
  4. 1. В первой же команде, шаг 2) опечатка. capify, а не capfy.
    2. Там что, только ветка рельсов 2.х обслуживается? Если да, то нет вопросов. Но если есть 3.х то надо бы добавить обслугу bundler. Причём не самолапно писаными командами, расширяющими namespace :deploy а чтобы была возможность rollback. Уже сейчас готово расширение нативное для этих целей.

    ОтветитьУдалить
  5. 2 sysadmin:

    1) опечатался

    2) это файл с сайта locum.ru. Я поменял только стратегию обновления.

    ОтветитьУдалить
  6. Не поможете разобраться с проблемой.
    При выполнении команды cap deploy происходит как бы зависание процесса

    Лог

    * executing `deploy'
    * executing `deploy:update'
    ** transaction: start
    * executing `deploy:update_code'
    executing locally: "git ls-remote /Users/anton/rails/prod HEAD"
    command finished in 28ms
    * getting (via checkout) revision 34f12b2b866792004eaf7cd59bb80d4afcfbb5a8 to /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535
    executing locally: git clone -q /Users/anton/rails/prod /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535 && cd /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535 && git checkout -q -b deploy 34f12b2b866792004eaf7cd59bb80d4afcfbb5a8
    command finished in 187ms
    compressing /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535 to /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535.tar.gz
    executing locally: tar chzf 20110712223535.tar.gz 20110712223535
    command finished in 219ms
    servers: ["lithium.locum.ru"]
    Password:
    ** sftp upload /var/folders/-D/-DfpcuSLGX8axN8uKKd3v++++TI/-Tmp-/20110712223535.tar.gz -> /tmp/20110712223535.tar.gz
    [lithium.locum.ru] /tmp/20110712223535.tar.gz
    [lithium.locum.ru] done
    * sftp upload complete
    * executing "cd /home/hosting_anton/projects/prod/releases && tar xzf /tmp/20110712223535.tar.gz && rm /tmp/20110712223535.tar.gz"
    servers: ["lithium.locum.ru"]
    [lithium.locum.ru] executing command

    На последней команде процесс останавливается и тишина

    ОтветитьУдалить