Other Pages

Expand All

Deploy A Rails App

Step 1: Commit to git

If your prompt doesn't already show that you are (still) in the test_app folder

Type this in the shell:
cd test_app
Type this in the shell:
git add -A

With Git, there are usually many ways to do very similar things.

  • git add foo.txt adds a file named foo.txt
  • git add . ("git add dot") adds all new files and changed files, but keeps files that you've deleted
  • git add -A adds everything, including deletions

"Adding deletions" may sound weird, but if you think of a version control system as keeping track of changes, it might make more sense.

Type this in the shell:
git commit -m "initial commit"
Expected result:
a lot of lines like create mode 100644 Gemfile
Type this in the shell:
git log
Expected result:
(Your git name and "initial commit" message.)

Step 2: Create a Heroku application

The very first time you use heroku you must enter your Heroku email address and password. Your password may not be shown as you type it, but don't worry, it's being entered! If you have already provided your credentials before, you won't be prompted for them again.

Type this in the shell:
heroku create
Expected result:
Enter your Heroku credentials.
Email: myemail@example.com
Password:
Uploading ssh public key /Users/smei/.ssh/id_rsa.pub
Creating app... done, ⬢ true-poppy-74911
https://true-poppy-74911.herokuapp.com/ | https://git.heroku.com/true-poppy-74911.git

Heroku apps are automatically given lyrical names that look like '[adjective]-[noun]-[number]' like true-poppy-74911 in this example. Each name is different, so your app will have a differnt name.

Type this in the shell:
git remote show
Expected result:
heroku

If you get messages here complaining about public keys it's probably due to some confusion with SSH key usage by another app on your computer. Call a volunteer over to help you figure it out. Luckily this only needs to be done the first time you create a Heroku app.

Step 3: Configure the PostgreSQL database for heroku

Launch your text editor and open the "Gemfile" file located inside of your test_app folder. (On Windows, this should be in C:\Sites\railsbridge\test_app and on Linux/OS X, it should be under ~/railsbridge/test_app.)

Inside this file, change the line:

# Use sqlite3 as the database for Active Record
gem "sqlite3", "~> 1.4"

To this:

# Use sqlite3 as the database in development and PostgreSQL in production
group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end

Save the file.

When you saved the file, your text editor may have added colors to the code, much like the example above. It recognizes the file contains Ruby, and will mark up different kinds of words with different colors. This is called "syntax highlighting", which makes it easier to read code.

Launch your text editor and open the "database.yml" file located inside the config folder.

Inside this file, find the last part after "production" and change it:

production:
  <<: *default
  database: db/production.sqlite3

To this:

production:
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  url: <%= ENV["DATABASE_URL"] %>

Save the file.

Why Sqlite (sqlite3) and PostgreSQL (pg)?

SQLite and PostgreSQL are different kinds of databases. We're using SQLite for our development and test environments because it's simple to install. We're using PostgreSQL in our production environment because Heroku has done the hard work of installing it for us and it's more powerful than SQLite. We have separate test, development and production databases by default in Rails.

Step 4: Prepare the Gemfile for deploying to a UNIX Server

Type this in the shell:
bundle install --without production
Approximate expected result:
...
Bundle complete! 6 Gemfile dependencies, 54 gems now installed.
Gems in the group 'production' were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
The greyed-out text may differ and is not important.
Type this in the shell:
bundle lock --add-platform x86_64-linux --add-platform ruby
Approximate expected result:
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Writing lockfile to ...railsbridge/test_app/Gemfile.lock
The greyed-out text may differ and is not important.

Again, wait for the console prompt, and look for the 'Bundle complete!' message just above.

Step 5: Set the root route

Use your editor to open the file routes.rb (C:\sites\railsbridge\test_app\config\routes.rb or ~/railsbridge/test_app/config/routes.rb) and find the line containing:

Rails.application.routes.draw do

After this line, add a new line with the following:

root 'drinks#index'

Save the file.

Step 6: Add the changes to git

Before running the following command (to add to your local git repository), make sure that you are in the test_app directory.

Type this in the shell:
git add .
Type this in the shell:
git commit -m "Updates for heroku deployment"

Step 7: Deploy (push) to heroku

Type this in the shell:
git push heroku main

It may ask: "The authenticity of host 'heroku.com (75.101.145.87)' can't be established. RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad. Are you sure you want to continue connecting (yes/no)?" Type yes and hit enter.

Approximate expected result:
remote: -----> Discovering process types
remote:        Procfile declares types     -> (none)
remote:        Default types for buildpack -> console, rake, web
remote:
remote: -----> Compressing...
remote:        Done: 37.3M
remote: -----> Launching...
remote:        Released v6
remote:        https://true-poppy-74911.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/true-poppy-74911.git
* [new branch]      main -> main
The greyed-out text may differ and is not important.

Be sure to find and learn your Heroku application name in the output. you can find it on the 6th line from the end in the example above: URL deployed to Heroku

This process will probably take about twice as long as your 'bundle install' and then will return you to your console prompt. If it takes longer than that, talk to a TA.

Type this in the shell:
heroku run rails db:migrate
Approximate expected result:
Running rails db:migrate on ⬢ {/UZZY}true-poppy-74911{/FUZZY}... up, run.7760 (Free)
I, [2022-07-01T10:52:50.899913 #4]  INFO -- : Migrating to CreateDrinks (20220701102418)
== 20220701102418 CreateDrinks: migrating =====================================
-- create_table(:drinks)
  -> 0.0174s
== 20220701102418 CreateDrinks: migrated (0.0175s) ============================
The greyed-out text may differ and is not important.

The long number before CreateDrinks is a timestamp. Yours will be different!

Step 8: Visit your new application

Now that the app is deployed, you can visit it in a browser.

To quickly open your heroku application in a browser

Type this in the shell:
heroku open

The URL for your app is application-name.heroku.com -- in the example above it is true-poppy-74911.herokuapp.com.

Verify you see the welcome page. Leave this browser window open.

Create and save a new drink to verify you can write to the database on Heroku.

If you want to see a little more info about your app, you can run heroku info.

Approximate expected result:
=== true-poppy-74911
Addons:         heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/true-poppy-74911.git
Owner:          ....your email...
Region:         us
Repo Size:      34 KB
Slug Size:      37 MB
Stack:          heroku-20
Web URL:        https://true-poppy-74911.herokuapp.com/
The greyed-out text may differ and is not important.

Next Step: