Rails + Git + Capistrano + Zenon = хороший deploy
Быстый деплой и возможность отката это всегда очень удобно и поэтому, как ни странно, capistrano)) Итак, как задеплоить rails приложение на хостинг(здесь в часности zenon) используя capistrano.
Предполагается, что локально у нас есть первоприложение. Так как на zenon используется fastcgi приложение нужно создавать с ключем -D. Ключ сгенерирует файлы dispatch.*(нужно помнить, что пути до ruby в файлах будут те, которые есть на машине, на которой вы содавали приложение => нужно их поменять на хостинговые, в случае с zenon “#!/usr/local/bin/ruby18”)
update: .htaccess в папке public должен иметь вид:
AddHandler fastcgi-script .fcgi
Options +FollowSymLinks +ExecCGI
RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
Шаг ноль - готовим хостинг
Устанавливаем git. Git будет нужен для хранения репозитария на хостинге. Если над проектом будут работать несколько человек, то все же рекомендую построить иерархию доверия.
Шаг первый - git, сервер и приложение
а) На сервере хостинга создаем папочку где будем хранить репозитарий:
> mkdir repo
б) Загружаем в эту папку первоприложение
в) Создаем в папке с приложением файл .gitignore:
> vi .gitignore
c таким содержанием(ну или на любой другой вкус, у меня например в папке с проектом есть файлик error_log, который я тоже включил в .gitignore):
.DS_Store
log/*.log
tmp/**/*
db/*.sqlite3
г) Добавляем первоприложение в git:
> git init
> git add .
> git commit -am "Первый коммит."
Пол дела сделано
Шаг второй - git, машина, capistrano
а) Клонируем репозитарий:
> git clone ssh://user@home.domain/path/to/repo/project
б) заходим в папку с проектом и “закапистраниваем” его.
> cd project
> capify .
в) Последняя команда создала два файла, нам нужно отредактировать config/deploy.rb
set :application, "projectname"
set :repository, "#{user}@home.domain:/path/to/repo/"
set :scm, :git
set :user, "ssh_user"
set :scm_username, user
set :use_sudo, false
set :branch, "master"
set :deploy_via, :checkout
set :git_shallow_clone, 1
set :deploy_to, "~/apps/#{application}"
default_run_options[:pty] = true
role :web, "home.domain"
role :app, "home.domain"
role :db, "home.domain", :primary => true
namespace :deploy do
task :after_symlink, :roles => :web do
run "ln -s #{release_path}/public #{release_path}/www"
run "ln -s #{release_path} ~/domain"
run "aprestart soft"
end
end
г) Ну и финальные штрихи.
>git add .
>git commit -am "deploy commit"
>git push
> cap deploy:setup
>cap deploy:cold
Повседневная работа
>git commit -am "commit changes"
>git push
>cap deploy