Capistrano::Rails
Rails specific tasks for Capistrano v3:
cap deploy:migrate
cap deploy:compile_assets
Installation
Add these Capistrano gems to your application's Gemfile using require: false
:
group :development do
gem "capistrano", "~> 3.10", require: false
gem "capistrano-rails", "~> 1.6", require: false
end
Run the following command to install the gems:
bundle install
Then run the generator to create a basic set of configuration files:
bundle exec cap install
Usage
Require everything (bundler
, rails/assets
and rails/migrations
):
require 'capistrano/rails'
Or require just what you need manually:
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
Please note that any require
s should be placed in Capfile
, not in config/deploy.rb
.
You can tweak some Rails-specific options in config/deploy.rb
:
set :rails_env, 'staging'
set :migration_role, :db
set :migration_servers, -> { primary(fetch(:migration_role)) }
set :migration_command, 'db:migrate'
set :conditionally_migrate, true
set :assets_roles, [:web, :app]
set :assets_prefix, 'prepackaged-assets'
set :assets_manifests, ['app/assets/config/manifest.js']
set :rails_assets_groups, :assets
set :normalize_asset_timestamps, %w{public/images public/javascripts public/stylesheets}
set :keep_assets, 2
Symlinks
You'll probably want to symlink Rails shared files and directories like log
, tmp
and public/uploads
.
Make sure you enable it by setting linked_dirs
and linked_files
options:
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads'
append :linked_files, 'config/database.yml', 'config/secrets.yml'
In capistrano < 3.5, before append
was introduced, you can use fetch
and push
to get the same result.
Recommendations
While migrations looks like a concern of the database layer, Rails migrations
are strictly related to the framework. Therefore, it's recommended to set the
role to :app
instead of :db
like:
set :migration_role, :app
The advantage is you won't need to deploy your application to your database
server, and overall a better separation of concerns.
Uploading your master.key
You can use the below configuration to upload your master.key
to the server if it isn't already present.
append :linked_files, "config/master.key"
namespace :deploy do
namespace :check do
before :linked_files, :set_master_key do
on roles(:app) do
unless test("[ -f #{shared_path}/config/master.key ]")
upload! 'config/master.key', "#{shared_path}/config/master.key"
end
end
end
end
end
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request