Would you take a quick second and ⭐️ my repo?
This project is an Ansible playbook for provisioning and deploying a Rails/MySQL app to an Ubuntu server. It is intended to be added to an existing Rails application folder. Tested with: Rails 5.1.5, Ruby 2.4.3, Ubuntu 16.04 (Xenial).
-
Ansible >= 2.4.1 must be installed
-
This playbook assumes you are targeting MySQL for your production database and have
gem 'mysql2'
included in your Gemfile. -
From your Rails application folder run:
\curl -sSL https://raw.githubusercontent.com/bradymholt/ansible-rails/master/installer.sh | bash
which will:
- Add this project to a new folder in your app called "ops"
- Initialize the config file
- Add 2 new rake tasks to your Rakefile:
provision
anddeploy
.
If you would prefer, you can run the commands in this file manually.
-
Edit the
ops/config.yml
file and add your project configuration
Provisioning is used to to setup the the server and initially deploy the application.
To provision your server, run: rake provision
. This will do the following:
- Install the following:
- RVM
- Nginx
- Phusion passenger
- MySQL
- Libraries: libxslt-dev, libxml2-dev, libmysqlclient-dev, imagemagick
- Create a user with ssh access and sudo authorization
- Setup a daily backup job to backup MySQL database to S3
- Create an app directory with appropriate permissions where Nginx config is pointing to
- Configure TLS (https) via Let's Encrypt
- Define an environment variable named
SECRET_KEY_BASE
with a unique uuid value. - Deploy the application:
- Precompile assets locally with
rake assets:precompile
. - Copy app files to to remote server in the deploy directory
- Update
config/database.yml
on remote server with correct production db config - Run the following remotely:
bundle install
rake db:migrate RAILS_ENV="production"
rake tmp:clear
rake log:clear
touch tmp/restart.txt
(restart the app)
- Precompile assets locally with
If you have already provisioned your server and want to redeploy changes to your Rails app, run rake deploy
. This will only run the deploy tasks from the playbook and be much faster.