To deploy your Rails application on a remote server, you require a deployment tool like Capistrano.
To use Capistrano, add the following gems to your Gemfile
. This will enable you to use Bundler and the Rails Asset Pipeline in conjunction with Capistrano.
gem 'capistrano' gem 'capistrano-bundler' gem 'capistrano-rails'
Afterwards, install the gems using bundler:
$ bundle install
The following instructions assume that you have installed the Rails Connector to your Rails application. Note that Capistrano will only deploy applications from a git repository. Therefore, make sure that you have placed your application into a Git repository that can be accessed by the targeted server.
Configure Capistrano for your Rails application:
$ cap install mkdir -p config/deploy create config/deploy.rb create config/deploy/staging.rb create config/deploy/production.rb mkdir -p lib/capistrano/tasks Capified
To prepare Capistrano to use Bundler and the Asset Pipeline, the corresponding modules need to be activated in the Capfile
. For this, comment the following lines in:
require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations'
Afterwards, please edit the my-project/config/deploy.rb
file containing the general configuration:
… set :application, '<em>my-project</em>' set :repo_url, '<em>git-repository-url</em>' … set :deploy_to, '<em>target-directory</em>' … set :scm, :git … set :linked_files, %w{config/database.yml} … set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/syst em} … namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do execute :touch, release_path.join('tmp/restart.txt') end end after :publishing, :restart after :restart, :clear_cache end … SSHKit.config.command_map[:rake] = "bundle exec rake"
Configure the specific servers and their credentials in the environment to be deployed. The following instructions illustrate this for the production
environment, and are therefore applied to config/deploy/production.rb
. Other environments can be configured analogously.
role :app, %w{remote-login@production-app-server} role :web, %w{remote-login@production-web-server} role :db, %w{remote-login@production-db-server} … server 'production-app-server', user: 'remote-login', roles: %w{app} server 'production-web-server', user: 'remote-login', roles: %w{web} … set :ssh_options, { user: 'remote-login', auth_methods: %w(publickey) }
Adjust the configuration according to your needs:
my-project
is the folder name of your Rails application.git-repository-URL
is the Git repository address (git checkout
) of your Rails application.target-path
is the target directory path on the remote host.remote-login
is the user name under which your Rails application will be deployed on the target host.production-app-server
is the name of the server on which the Rails app is hosted.production-web-server
is the name of the server on which the Rails app is hosted for delivery. When using the Rails Connector, this corresponds to your application server.production-db-server
is the name of the server that makes the application database available.Once a variable is set, it can be used as part of another variable. If, for example, you have used the application name as part of the repository address, you can refer to it like this: https://github.com/account/#{application}
.
Note that your Git repository must have been provided with a Deploy Key for the remote login to grant the target server access to the repository.
An environment needs to be set up before the Rails app can be deployed to it. This can be achieved by means of the following command:
$ cap production deploy:check … DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/bin' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/log' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/tmp' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/tmp/pids' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/tmp/cache' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/tmp/sockets' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/vendor' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/vendor/bundle' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/public' DEBUG[bc509946] mkdir: created directory 'target-path/my-project/shared/public/system'
Once all the requirements are met, you can deploy the application using the following command:
$ cap production deploy
If your database schema changes in the course of an update, use cap production deploy:migrations
to level up the database.
Capistrano also provides commands for performing further administrative tasks along with the tasks described above. You can list the available commands using:
$ cap -T … cap deploy # Deploy a new release cap deploy:check # Check required files and directories exist … cap deploy:updated # Updated cap deploy:updating # Update server(s) by setting up a new release cap install # Install Capistrano, cap install STAGES=staging,production